https://www.mikrocontroller.net/api.php?action=feedcontributions&user=Schweigstill&feedformat=atomMikrocontroller.net - Benutzerbeiträge [de]2024-03-28T17:15:12ZBenutzerbeiträgeMediaWiki 1.38.5https://www.mikrocontroller.net/index.php?title=Xilinx_Microblaze_MCS_Workflow&diff=102260Xilinx Microblaze MCS Workflow2020-07-14T15:34:17Z<p>Schweigstill: /* Benötigte Software */</p>
<hr />
<div>''Gestartet von [[Benutzer:Fpgakuechle]] (Volker Urban)''<br />
<br />
Status: 2015-Feb-27 -> Material,Tips zur Fehlersuch und Screenshots sammeln<br />
<br />
Der Artikel beschreibt wie der 32bit Softcore "microblaze MCS" in FPGA verwendet wird.<br />
Verwendet wird dabei die kostenfrei verfügbare "leichtgewichtige" MicroBlaze-mcs (µB-MCS) Variante aus dem coregenerator (ab ISE 13.4 (ab 01/2013) und Vivado) und nicht die kostenpflichtige MicroBlaze (ohne -MCS) Variante.<br />
<br />
=MicroBlaze und MicroBlaze MCS=<br />
<br />
<br />
=Ablauf=<br />
Die Implementierung eines FPGA-Systems mit Softcore verläuft in folgenden Phasen:<br />
*Erstellung des FPGA-drumherum (Top-level design, pinassigments) und FPGA ohne microblaze-Core implementieren<br />
*Generierung des Softcore im CoreGenerator<br />
*Instanziierung Core, Script für bm referenz ausführen und FPGA mit microblaze-Core implementieren<br />
*Erstellung der compilerumgebung (board support package, libraries, linkerscript)<br />
*Erstellung und Kompilierung des Programms<br />
*Zusammenfügen programm-binarie mit FPGA-bitstream file<br />
<br />
=Benötigte Software=<br />
Es wird von Xilinx die FPGA Implementierungssoftware (ISE) und das Software Development Kit (SDK) benötigt. Nutzer der FPGA vor der 7. Generation (z.B. Spartan-3-Großfamilie, Spartan-6, Virtex-5/-6) müssen installieren:<br />
*ISE Design Suite: WebPack edition ODER<br />
*ISE Design Suite: Embedded edition<br />
(Siehe http://www.xilinx.com/products/design-tools/ise-design-suite.html )<br />
<br />
Nutzer der neueren 7er Reihe dagegen benötigen:<br />
*Vivado Design Suite Webpack edition (oder größer)<br />
(Siehe http://www.xilinx.com/products/design-tools/vivado.html)<br />
<br />
=Beispiel=<br />
Es wird ein einfacher Core mit 3 Ausgangsport a 8,4 und 6 bit, einem Eingangsport zu 8bit sowie einem Festwert- (FIT) und ein programmierbarer Zähler (PIT) generiert.<br />
[[Datei:Mcs block.png|thumb|center|400px|Blockdiagramm Beispiel]]<br />
<br />
Neben dem Core ist ein weitere Zähler -''heartbeat''- im Design. Die drei Ausgangsporst sind für das verwendete S3AN Starterkit verbunden mit dem Datenbus und den Steuerleitung des alphanumerischen Displays und den 6 LED rechts. Die LED Nr 8 wird von dem FPGA-Logiccounter zum blinken gebracht, LED nummero 7 vom toggle-signal des Festwertcounter. Damit lassen sich 3 Implementierungsziele detektieren.<br />
*Nix blinkt -> Totalversagen<br />
*LED Nr. 8 blinkt -> FPGA erfolgreich geladen und gestartet<br />
*LED 8 und 7 blinken: -> microblaze ist erfolgreich im FPGA implementiert, aber das Programm läuft nicht.<br />
*Aktivität auf allen 8 LED's -> Perfekt<br />
<br />
=FPGA-Implementierung und SoftCore-Generierung=<br />
==FPGA-Gerüst==<br />
Es ist Empfehlenswert zuerst ein "Basis-FPGA" ohne µB fertigzustellen und zu testen. Hier wurde das zum Starterkit gehörige Demo adaptiert und somit war schon mal die Pinzuordnung und das Taktsystem fehlerfrei. Eine heartbeat-LED die im Sekundentakt blinkt grenzt den Fehler deutlich ein.<br />
<br />
<br />
==CoreGen==<br />
CoreGen starten (beispw. Programme -> Xilinx -> ISE 14.7 -> ISE Design tools -> 64bit tools -> coregen). Project für den benutzen FPGA aufsetzen (hier im Beispiel S3AN-700; package: FGG484; speedgrade 4; Verilog)<br />
<br />
Im IP Catalog findet sich der MCE unter embedded Processing -> processors -> microblaze MCE :<br />
[[Datei:Ss coregen main.png|thumb|center|400px|CoreGen Auswahl microblaze MCS Core]]<br />
<br />
Im Unterschied zum Screenshot sollte man den Speicher auf mindestens 8 kByte setzen. Die Angabe der Taktfrequenz ist nur für die Berechnung des Baudraten-Teilers für die UART wichtig. Benutzt man die UART nicht, ist dieser Wert (theoretisch?) für den Core bedeutungslos. Das Place&Route für den FPGA richtet sich nach der Taktvorgabe aus dem ucf-file.<br />
Die in den Karteikarten gezeigten Kürzel stehen für die einzigen "Peripherie-controllern" die für dem µB-MCS generiert<br />
werden können. Mit dem weiterhin kostenpflichten Platform Studio sind weitere Cores einfach hinzufügbar. Aber beim MCS muß man nicht komplett darauf verzichten da an dem IO-Bus selbtgeschriebene Komponenten angeschlossen werden können.<br />
<br />
*UART: feste Baudrate, Interrupt für RX<br />
*FIT: Fixed length timer -4 möglich<br />
*PIT: programmable Timer - 4 möglich<br />
*GPO: Generalpurpose Output-Port - 4 Ports mit jeweils 1-32 bit Breite Konfigurierbar<br />
*GPI: Generalpurpose Input-Port - 4 Ports mit jeweils 1-32 bit Breite Konfigurierbar<br />
*INT: External Interrupt Sources<br />
<br />
Für die Treiber kann auch ein toggle output signal generiert werden das immer beim Erreichen der '0' invertiert wird.<br />
<br />
[[Datei:Ss coregen generalsettings.png|thumb|center|400px|CoreGen Settings für microblaze MCS Teil 1]]<br />
[[Datei:Ss coregen fitsettings.png|thumb|center|400px|CoreGen Settings für Fixed Timer]]<br />
[[Datei:Ss coregen generated files.png|thumb|center|400px|Liste Generierter Dateien]]<br />
Mit<br />
[[Datei:Ss coregen info sdk.png|thumb|center|400px|Coregen Hinweis nächste Schritte]]<br />
[[Datei:Ss coregen info tcl.png|thumb|center|400px|Coregen Hinweis Tcl-script]]<br />
[[Datei:Ss tcl console.png|thumb|center|400px|Tcl-Console]]<br />
<br />
==Vorbereitung Synthese mit MCS core==<br />
<br />
==Top-Level==<br />
<syntaxhighlight lang="verilog"><br />
wire heartbeat_s;<br />
<br />
wire [7:0] GPO1_s; //display data<br />
wire [3:0] GPO2_s; //display control<br />
wire [6:0] GPO3_s; // led's<br />
wire [7:0] GPI1_s; //switches<br />
<br />
wire FIT1_Toggle_s;<br />
<br />
MikroBlaze_mcs microblaze_s3an_disp (<br />
.Clk(clk), // input Clk<br />
.Reset(rst), // input Reset<br />
.FIT1_Toggle(FIT1_Toggle_s), // output fixed timer toggler (every 25M ticks)<br />
.FIT2_Interrupt(/*FIT2_Interrupt*/), // UNUSED - output FIT2_Interrupt<br />
.FIT2_Toggle(/*FIT2_Toggle*/), // UNUSED - output FIT2_Toggle<br />
.PIT1_Interrupt(/*PIT1_Interrupt*/), // UNUSED - output PIT1_Interrupt<br />
.PIT1_Toggle(/*PIT1_Toggle*/), // UNUSED - output PIT1_Toggle<br />
.GPO1(GPO1_s), // output [7 : 0] GPO1<br />
.GPO2(GPO2_s), // output [3 : 0] GPO2<br />
.GPO3(GPO3_s), // output [6 : 0] GPO3 <br />
.GPI1(GPI1_s), // input [7 : 0] GPI1<br />
.GPI1_Interrupt(/*GPI1_Interrupt*/), // UNUSED - output GPI1_Interrupt<br />
.INTC_IRQ(/*INTC_IRQ*/) // UNUSED - output INTC_IRQ<br />
);<br />
<br />
always @(posedge clk)<br />
begin<br />
<br />
assign LCD_DB = GPO1_s[7:0];<br />
assign LCD_RW = GPO2_s[0];<br />
assign LCD_RS = GPO2_s[1];<br />
assign LCD_E = GPO2_s[2];<br />
end<br />
<br />
heartbeat heartbeat(<br />
.clk(clk),<br />
.rst(rst),<br />
.heartbeat_o(heartbeat_s)<br />
);<br />
<br />
assign LED[7] = heartbeat_s; <br />
assign LED[6] = FIT1_Toggle_s; <br />
assign LED[5:0] = GPO3_s[5:0];<br />
</syntaxhighlight><br />
<br />
<br />
==FPGA Implementierung ==<br />
Am besten den FPGA mit den µB-MCS '''vor''' der Vorbereitung des SDK komplett implementieren und auf das Board laden. Es müßen die LED's 7 und 8 mit jeweils eigene Frequenz blinken. Wenn nicht, dann ist bei der Generierung und Instanziierung des Cores ein Fehler unterlaufen.<br />
<br />
Jetzt, falls noch nicht geöffnet, ein Tcl Fenster öffnen (''ISE:View->Panels->Tcl Console'') dann erscheint unten eine schmale Zeile in der Tcl Kommandos eingegeben werden können, die Ausgabe erscheint in dem Fenster darüber.<br />
<br />
Jetzt das vom ''coregen'' erzeugte tcl Script starten: ''source ../core/microblaze_mcs_setup.tcl'' . Dieses script fügt eine Option für das tool ''ngdbuild'' (Process "''Translate''") bei der Implementierung<br />
hinzu. Zur Überprüfung die Optionen anzeigen lassen mit Mausklick rechts auf "''Translate''" im Process-Fenster und "process properties" auswählen. Es findet sich jetzt in der Zeile "Other ... options" ein Eintrag beginnend mit "-bm" der auf eine ebenfalls von coregen erzeugtes *.bmm Datei zeigt.<br />
<br />
[[Datei:Ss after setup tcl.png|thumb|center|400px|Tcl-Console]]<br />
<br />
Diese Datei am besten in einem Texteditor öffnen. wichtig ist hier der Pfad zu den RAM-Blöcken die das binary für den Softcore speichern werden.<br />
Der Teil ganz links ist der in ersten ''CoreGen''-Fenster angegebene Instanz-name. Der muss auch mit dem Instanznamen im Top-file übereinstimmen, sonst<br />
bricht Translate ab. Entfernt man die grad erwähnte -bm Option wieder aus den "Process Properties" läuft zwar der Schritt Translate und alle Folgenden<br />
durch, aber es wird Probleme bei "Vereinigung von Programm-binarie und FPGA bitfile" geben -> die FPGA logic wird zwar funktionieren, aber es wird kein Programm <br />
auf dem Softcore laufen.<br />
<br />
=Generierung Compilerumgebung und microblaze-programm=<br />
Für die folgenden Schritte ist das Software development Kit (SDK) zu starten, <br />
das findet sich im Ordner EDK (Embedded Development Kit):<br />
<br />
[[Datei:Ss programmmenu sdk.png|thumb|center|400px|Startmenu mit Xilinx-tools]]<br />
<br />
Das SDK fragt beim Start nach einem Verzeichniss für den workspace.<br />
<br />
Dannach erscheint beim ersten Start ein Welcome-Screen. Diesen an besten wegklicken da er <br />
das fenster "project explorer" überdeckt. Jetzt müßen wir nacheinander 3 verschieden "typen" von "projekten" anlegen:<br />
*Hardware Platform spezification - eine beschreibung des systems aus microblaze, Programmspeicher und Peripherie.<br />
Diese benötigt die Infos aus dem Coregenlauf<br />
*board support package - Header-dateien, linkerskripte mit kosntanten/ addressbereichen etc. passend zum mikrocontrollersystem<br />
*C/C++projekt die leere C-datei für das eigentliche Programm<br />
<br />
[[Datei:Sdk project wizards.png|thumb|center|400px|New -> Projects]]<br />
<br />
==Hardware Platform Specification==<br />
File -> new -> project -> Xilinx -> Hardware Platform Specification<br />
<br />
Der Projectname erscheint dann im project explorer. Der Autor wählte zur besseren Unterscheidbarkeit<br />
zu den anderen Projekttypen den suffix _hwp. in der Spalte hardwareproject-file ist das file aus den Coregen-lauf<br />
anzugeben, es findet sich daher in dem Verzeichniss Core.<br />
<br />
==Erstellung Hardware project==<br />
[[Datei:Ss hardware palltform settings.png|400px|thumb|center]]<br />
==Erstellung Board support package==<br />
Nachdem die Infodateien für die Hardware des µB-MCE System generiert worden, werden nun dazu passende Header Dateien und Bibliotheken<br />
generiert. Die erstellten Dateien werden auch als "Board support package" bezeichnet. Dazu wird das Menü File -> New -> "Board Support package" audgewählt, dem Namen des support packages sollte man eine Endung wie _BSP anhängen. Im Feld "Target Hardware" trägt man die gerade erstellte Plattform ein, als Betriebssystem "OS" ist standalone eingetragen.<br />
[[Datei:Ss sdk file new board support package.png|thumb|400px|center|Aufsetzen board support package]]<br />
<br />
==Erstellung Programm==<br />
[[Datei:Ss sdk cproject settings.png|400px|thumb|center]]<br />
<syntaxhighlight lang="C"><br />
#include <xparameters.h><br />
#include <xiomodule.h><br />
#include <stdbool.h><br />
<br />
#define LED_DELAY 100000<br />
<br />
int main()<br />
{<br />
//instantiate IOs<br />
XIOModule GPIO;<br />
<br />
volatile u32 i = 0;<br />
<br />
//initialize IOs<br />
XIOModule_Initialize(&GPIO, XPAR_IOMODULE_0_DEVICE_ID);<br />
XIOModule_Start(&GPIO);<br />
<br />
//LED<br />
bool led_on = false;<br />
int run = 1;<br />
<br />
for (;;)<br />
{<br />
if (led_on) {XIOModule_DiscreteWrite(&GPIO, 3,run);<br />
if (run == 0x20) run = 1; else run *= 2;}<br />
led_on = !led_on;<br />
for(i=0;i < LED_DELAY; ++i);<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
==Zusammenfügen FPGA bitstream und Executable zur downladbaren Datei==<br />
Im Menu "Xilinx Tools" den Punkt "Programm FPGA" auswählen und <br />
[[Datei:Program FPGA.png|thumb|400px|center|Menu SDK program FPGA]]<br />
<br />
anschließend das (beim CoreGen) angelegte *.bmm file, das compilierte Programm (*.elf) und das *.bit File des in der ISE generierten FPGA's auswählen und den Button "Program" drücken.<br />
[[Datei:Program FPGA files.png|thumb|400px|center|Auswahl *.bmm *.bit *.elf for programming]]<br />
<br />
Jetzt wird mittels der Information über die genutztem BRAM-Blöcke aus der *.bmm-Datei im *.bit-File die Bereiche die die Initdaten für die BRAM-Speicherblöcke enthält mit dem Binary des Programms ausgetauscht und anschließend das FPGA programmiert.<br />
<br />
=Fehlersuche=<br />
Wenn möglich auch die beiden Zwischenergebnisse ("Gesamtdesign ohne MCS-Core instanziierung" und "Mit Core aber ohne Programm" am Board testen. Nur so lassen sich Fehler auf die Schritte im workflow zurückführen. <br />
<br />
Bei Änderungen am Core versagt gelegentlich das automatische Update von BPS etc.. Deshalb bei Coreänderungen die obsoleten Projekte (Hardware project, BSP und C-projekt) löschen und den workflow ab Schritt "tcl.script" wiederholen.<br />
<br />
Fehlermeldungen in die Eingabemaske von google kopieren und nach Antworten bei Xilinx oder Internetforen suchen. Das führt bei den<br />
oft verwirrenden Fehlermeldungen schnell zum Erfolg. So weist diese Meldung über Memory leaks:<br />
[[Datei:Ss more ngdbuilt error.png|400px|thumb|center|ngdbuil error]]<br />
eigentlich darauf hin, das der Instanzname des MCS-cores nicht stimmt. Der "Answer record" bei Xilinx http://www.xilinx.com/support/answers/51538.html erklärt wie man den korrekten Namen findet und in das BMM-file einträgt.<br />
<br />
<br />
= Literatur =<br />
* http://ece.wpi.edu/~rjduck/Microblaze%20MCS%20Tutorial%20v5.pdf - Eine in Englisch verfasste Anleitung zum Durchklicken. <br />
Als Beispiel wird eine microblaze basierte UART-Verbindung zwischen PC und Nexsys2/3 board implementiert, verwendet wird die ISE 14.5.<br />
* http://jimselectronicsblog.blogspot.de/2014/03/implementing-microblaze-mcs-on-papilio.html<br />
Eine Englischsprachige Klickanleitung für das papilio-One board. Hier wird auch gezeigt wie UCF und top entity<br />
mit dem PlanAHead tool angelegt wird. Die Screenshost sind recht gut kommentiert.<br />
* http://www.xilinx.com/support/documentation/sw_manuals/xilinx13_4/ds865_microblaze_mcs.pdf - XILINX DS865, die offizielle Beschreibung des Cores<br />
* http://www.xilinx.com/support/documentation/sw_manuals/xilinx2013_3/pg116-microblaze-mcs.pdf - XILINX PG116, die offizielle Anleitung für Vivado<br />
*http://www.xilinx.com/support/documentation/sw_manuals_j/xilinx14_5/pg048-microblaze-mcs.pdf - Xilinx PG048, die offizielle Anleitung für Vivado</div>Schweigstillhttps://www.mikrocontroller.net/index.php?title=Benutzer:Schweigstill&diff=100864Benutzer:Schweigstill2019-09-06T05:24:38Z<p>Schweigstill: </p>
<hr />
<div>Mein Name ist Andreas Schweigstill und ich bin der Eigentümer des folgenden Unternehmens:<br />
<br />
<pre><br />
Schweigstill IT | Embedded Systems<br />
Schauenburgerstraße 116<br />
24118 Kiel<br />
Web: http://www.schweigstill.de/<br />
</pre><br />
<br />
Zu erreichen bin ich wie folgt:<br />
<pre><br />
Telefon: 0431/530354-0<br />
Mobil: 0171/6921973<br />
E-Mail: andreas@schweigstill.de<br />
</pre></div>Schweigstillhttps://www.mikrocontroller.net/index.php?title=Schaltplaneditoren&diff=89334Schaltplaneditoren2015-07-19T11:47:23Z<p>Schweigstill: Korrektur Versionsstand Altium Designer (15.1 statt 13.2)</p>
<hr />
<div>== Grundüberlegungen zum Auswahl eines Layoutprogrammes ==<br />
<br />
Sehr häufig wird die Frage gestellt, welches Platinenlayoutprogramm man sich denn nun am besten kaufen soll. Diese Frage ist leider nicht einfach zu beantworten, weil sie von vielen Umständen abhängt, und für jeden individuell beantwortet werden muss.<br />
<br />
Daher hier ein paar grundsätzliche Überlegungen, welche in die eigenen Entscheidungen einfliessen könnten.<br />
<br />
Grundsätzlich ist der Übergang vom Hobbyanwender über den Studenten oder professionellen Kleingewerbetreibenden in Handwerk und Ingenieurbüro bis zum Vollzeit Platinenentwickler in der Industrie, der nur Großprojekte bearbeitet, stufenlos. Letztere haben im allgemeinen aber schon genaue Vorstellungen über das, was sie benötigen. So sind diese Überlegungen in erster Linie für Hobbyanwender, Studenten und Kleingewerbe betreibende Ingenieurbüros gedacht.<br />
<br />
=== Freeware vs. Open Source ===<br />
"Freeware" im Sinne von nur "kostenlos" kann gerade für Hobbyanwender, Studenten und Kleingewerbetreibende problematisch sein, weil bei den kostenlosen Versionen kommerzieller Programme je nach Lizensierung Probleme bestehen, damit erstellte Projekte zu veröffentlichen. Selbst wenn die Veröffentlichung nichtkommerziell ist, und jemand anders greift die Unterlagen auf und verwertet sie kommerziell, kann der ursprüngliche Lizenznehmer wegen der Verletzung von Lizenzbestimmungen zur Rechenschaft gezogen werden. Hier ist also sehr intensiv das Kleingedruckte der Lizensierung zu beachten. Gleiches gilt für zwar nicht kostenlose, aber stark verbilligte Studenten- oder Hobbyversionen kommerzieller Programme. Oft beinhalten diese kostenlosen oder stark verbilligten Versionen auch recht lästige Beschränkungen in Bezug auf Schaltplangröße, Platinengröße, Anzahl der Verbindungen/Pads und Layer. Testversionen haben oft eine beschränkte Gültigkeitsdauer über wenige Wochen. Sie sind zum Testen vor einer Kaufentscheidung gedacht. Daher sollte man mit solchen zeitbeschränkten Testversionen ausser kleinen Testprojekten auch keine Projekte machen. Läuft die Lizenz aus, und man entscheidet sich, das Programm nicht zu kaufen oder zu mieten, kann man die Daten und somit die investierte Arbeit meist nicht weiter nutzen. Tatsächlich ist es daher oft sinnvoller, sich eine Vollversion eines einfachen Programmes zu kaufen, oder man nimmt "echte" Open Source Software.<br />
<br />
Bei diesen echten "open source" Programmen unter der [http://de.wikipedia.org/wiki/GNU_General_Public_License GNU-GPL-Lizenz] bestehen keine Probleme in der Verwertung und Veröffentlichung, sogar für kommerzielle Projekte dürfen sie kostenlos verwendet werden. Diese Programme sind wirklich frei im Sinne von "freier Rede" und nicht nur im Sinne von "Freibier". Leider gibt es davon nur wenige, z.B. <br />
[http://www.mikrocontroller.net/articles/Schaltplaneditoren#gEDA gEDA], [http://www.mikrocontroller.net/articles/Schaltplaneditoren#Kicad KiCad] und [http://www.mikrocontroller.net/articles/Schaltplaneditoren#FreePCB FreePCB] . [http://www.mikrocontroller.net/articles/Schaltplaneditoren#Fritzing Fritzing] gehört zwar ebenfalls in diesen Kreis, doch unterscheiden sich die Zielgruppe und demzufolge einige Aspekte der Handhabung extrem von denen gewöhnlicher Layoutprogramme.<br />
<br />
=== Einarbeitung ===<br />
Grundsätzlich gibt es kein Layoutprogramm, in das man sich nicht einarbeiten müsste. Platinenentwicklung ist eine komplexe Angelegenheit, egal mit welcher Philosophie man sie angeht. Daher kommt man ohne Einarbeitung nie davon. Auf der anderen Seite werden jemandem, der mit einem Leiterplattenprogramm umgehen kann, vermutlich zwei Drittel eines anderen Layoutprogrammes irgendwie bekannt vorkommen. Der Grund ist der, dass es dabei um Leiterplatten, ihre Eigenschaften und Herstellung geht. Dieses ist aber als Kontext, aus dem sich dann vieles ergibt, bei allen gleich. Unterschiede gibt es darum nur in Details der Handhabung.<br />
<br />
=== Handlichkeit ===<br />
Schaltungen und Boards kann man mit allen dieser Layoutprogramme entwickeln. Es hängt an den speziellen Bedürfnissen und dem speziellem Geschmack des konkreten speziellen Anwenders, womit er am besten umgehen kannst. Die Thematik ist zu komplex, um von einer allgemeingültigen "intuitivität" ausgehen zu können. Diese sehr vom kulturellen Hintergrund des Anwenders abhängigen Eigenschaften machen, das hier keine Empfehlungen abgegeben werden können.<br />
<br />
Es kann dem Anwender daher lediglich der Rat gegeben werden, sich einige der Programme anzusehen und damit zu experimentieren. Das ist leider der einzige Weg, um sich selber ein Bild zu machen. Dazu können auch durchaus die "kostenlosen" Versionen kommerzieller Programme verwendet werden. Aber Vorsicht: Erst einmal keine größeren Projekte mit Testversionen. Denn wenn die Erprobungsfrist abgelaufen ist, oder wenn man vor eine andere Beschränkung läuft, und dann das Programm doch nicht kaufen will, kann die darin eingebrachte Arbeit nicht mehr in ein anderes Programm übertragen werden.<br />
<br />
== AACircuit ==<br />
<br />
'''AACircuit''' ist ein Schaltplaneditor mit einer Ausgabe als ASCII-Grafik. Das Programm wurde dafür entwickelt, um mal eben eine Frage oder eine Antwort in ''newsgroups'', Chats oder Foren zu veranschaulichen, wenn keine Upload-Möglichkeit von Bilddateien da ist. AACircuit gibt es bei http://www.tech-chat.de/ ([http://9r1.org/AACircuit1_28_6.zip Download-Mirror])<br />
<br />
Beispiel:<br />
<pre><br />
.---o----o------o---o---------------o---o----o------------o 12-15V<br />
| | | 22µF| + | | | |<br />
.-. | .-. ### | .-. | | .-------o<br />
| |<-' | | --- | | | | | | .---o<br />
| |5k | |5k6 | | | | | | | |<br />
'-' '-' | o--. '-' | _|_ o /o<br />
| | === | | | | |_/_|- /<br />
.-. | GND | ---100n LED V - | /<br />
| | | | --- - ^ | o<br />
| |6k2 | | | | | | |<br />
'-' | | GND '---o----o '-------o<br />
| | 2|\|7 |<br />
o-----------------|-\ LM741 ___ |/<br />
| | | >-------o--|___|--o---|<br />
| o---o----|+/ 6 | 22k | |> BC547<br />
| | | 3|/|4 | | |<br />
.-. | | === o---. .-. |<br />
| | | o---. GND | | | |5k6 |<br />
| |2k7 .-. | | ___ _V_ | | | |<br />
'-' KTY10 | + '--|___|--|___|-' '-' |<br />
| | | ### 47k 220k | |<br />
| '-' --- | |<br />
| | | | |<br />
| | | | |<br />
'--------o---o-------------------------o-----o------------o GND<br />
</pre><br />
<br />
== Altium Designer ==<br />
<br />
Altium (aus Protel hervor gekommen) ist eine kommerzielle EDA Suite die verschiedenste Funktionen beinhaltet.<br />
Neben den Klassikern wie Schaltplan und Layouterzeugung werden auch elektronische Simulationen, FPGA Entwicklungstools, und diverse andere Features per PlugIn vom Hersteller angeboten.<br />
Leider ist der Produktzyklus momentan sehr kurz, so das fast Jährlich neue Hauptrelease erscheinen (aktuell 15.1) und in Abständen von 2-6 Monaten "Zwischenupdates" veröffentlicht werden.<br />
<br />
*Diverse Formate können importiert und exportiert werden, so das man u.A. "fast" nahtlos mit MCAD Systemen kooperieren [https://docs.google.com/viewer?url=http://www.altium.com/files/training/Module%2020%20-%203D%20Mechanical%20CAD.pdf LINK]<br />
*Diverse Funktionen für HighSpeed Designs [http://fplreflib.findlay.co.uk/articles/37941%5CHiSpeedDesignTutorialforAltiumDesigner_long.pdf LINK]<br />
<br />
Leider wurde der Preis in der jüngsten Vergangenheit des öfteren nach oben korrigiert.<BR><br />
2014-04-11: Achtung Altium erhöht zum 31.6.2014 schon wieder die Preise und dieses Mal um satte 34% (4000€ auf 5400€!). Das entspricht einer Erhöhung um +68% in 5 Jahren.<br />
<br />
== BAE ==<br />
<br />
'''B'''artels '''A'''uto '''E'''ngineer unterstützt die Erstellung von Schaltplänen, Leiterplatten und integrierten Schaltungen und läuft unter Windows, Linux und verschiedenen X11-/Unix-Systemen. Der Schaltplaneditor kann Pläne auf beliebig vielen Blättern erstellen, wobei auch hierarchische Strukturen möglich sind. Der Autorouter erzeugt recht brauchbare Ergebnisse, wobei beliebige Teile mit der Hand vorab geroutet werden können. Ein Autoplacer ist ebenfalls vorhanden.<br />
<br />
Eine auf Schaltplaneingabe beschränkte Version und eine kastrierte Evaluierungsversion sind auf der [http://www.bartels.de/bae/bae_de.htm BAE Homepage] downloadbar.<br />
<br />
Die [http://www.bartels.de/bae/baeprice_de.htm preiswerteste] kostenpflichtige Version ist das <b><i>BAE Light</i></b>. Diese Version ist auf Leiterplatten der Groesse 180x120 mm² und auf 2 Lagen beschränkt, eine Beschränkung auf eine bestimmte Pinanzahl gibt es aber nicht.<br />
<br />
Ansonsten wird eine Economy-, Professional- und Highendversion angeboten, die jeweiligen Eigenschaften sind im Abschnitt [http://www.bartels.de/baedoc/inst_de.htm Bartels AutoEngineer Softwarekonfigurationen] erklärt. Interessant ist z.&nbsp;B. der Bauteilhöhencheck.<br />
<br />
Mit dem <b><i>BAE IC Design</i></b> dringt man bis in den Bereich der IC-Entwicklung vor.<br />
<br />
[[BAE-Tutorial]]<br />
<br />
== Basic Schematic == <br />
<br />
[[Bild:Base schematic example.png|right|thumb|Screenshot Base Schematic]]<br />
<br />
Basic Schematic ('''BSch3V''') ist ein freier Schaltplaneditor für Windows (98/Me/2000/XP). IN der aktuellen Version läuft es auch unter Windows7. Es enthält einen Component Library Editor, einen Parts List Generator und einen Netlist Generator, sowie eine Automatic Numbering Funktion.<br />
<br />
Ein ZIP-Archiv mit engl. Programm, Handbuch und Sourcecode gibt es bei http://www.suigyodo.com/online/e/index.htm.<br />
<br />
Ebenso ist dort eine Cross-Plattform Version '''Qt-BSch3V''' auf der Basis von Qt-Grafiklibraries erhältlich.<br />
<br />
Das Programm ermöglicht den Export der Schaltungsdaten im KIDAD-Format.<br />
<br />
Das Programm ist bis dato (Mai 2014) gut gepflegt.<br />
<br />
== BlackBoard Breadboard Designer == <br />
<br />
[[Bild:BlackBoard.png|right|thumb|Screenshot]]<br />
<br />
<b><i>BlackBoard Breadboard Designer</i></b> ist ein freier Editor für Lochrasterplatinen Layouts, der das Planen der Bauteilplazierung sowie der beidseitigen Verdrahtung deutlich vereinfacht und sich u.a. auch für die Dokumenation solcher Prototypenaufbauten eignet.<br />
<br />
Er läuft auf allen Plattformen für die eine Java Runtime zur Verfügung steht.<br />
<br />
Blackboard steht unter der GPL V2.<br />
<br />
Die Entwicklung wurde inzwischen eingestellt. Der Sourcecode steht unter https://github.com/mpue/blackboard zur Verfügung.<br />
<br />
Die Installer stehen unter http://pueski.de/?page_id=1207 zum Download.<br />
<br />
== DesignSpark PCB ==<br />
<br />
Integrierter Schaltplan-Editor mit Autorouter und Leiterplatten-Designer - mittlerweile schon in der Version 7.<br /><br />
Freeware für kommerzielle und nichtkommerzielle Nutzung. <br /><br />
Bedienung ist etwas gewöhnungsbedürftig - leider z.Zt. nur als englische (u. chinesische) Version verfügbar. <br /><br />
Weitere Features: z.B. professionelle 3D-Designsoftware.<br /><br />
Import von EAGLE-Datein möglich. <br /><br />
Unbegrenzte Leiterplattengrösse, im Prinzip auch unbegrenzte Layer-Anzahl.<br /><br />
Kostenloser Download: http://www.rs-online.com/designspark/electronics/deu/page/designspark-pcb-home-page <br />
bzw. http://www.rs-online.com/designspark/electronics/deu/. <br /><br />
Erfahrungsbericht: http://www.ps-blnkd.de/Erfahrungsbericht_Schaltung&Leiterplatte.pdf.<br /><br />
Verschiedene Tutorials "DesignSpark Tipps & Tricks" in deutscher Sprache im "Elektor" 2014/2015.<br /><br />
<br />
== DipTrace ==<br />
<br />
Design-Editor für PCB-Leiterplatten für Windows NT, 2000, XP, Server 2003<br />
- verschiedene kostenpflichtige Versionen erlauben den Export in DXF, Gerber und N/C Drill sowie Leiterplattenlayouts mit mehr als 300 Pins und mehr als 2 Lagen. Die für nicht-kommerzielle Anwendungen gedachte Freeware "DipTrace Lite" ist auf 500 Pins und 2 Lagen beschränkt.<br />
<br />
Auf den ersten Blick etwas gewöhnungsbedürftig - auf den zweiten Blick extrem effizient.<br />
<br />
[http://www.diptrace.com/ DipTrace Homepage]<br />
<br />
[http://www.mikrocontroller.net/topic/319636#new Forumsbeitrag über Diptrace]<br />
<br />
[http://www.mikrocontroller.net/topic/320897/ Geeignete Schaltplan und Layoutsoftware für Hobbyprojekte]<br />
<br />
== Eagle ==<br />
<br />
[[Bild:Eagle.png|right|thumb|Screenshot]]<br />
<br />
<b><i>Eagle</i></b> von Cadsoft ist nicht nur ein <b>Schaltplaneditor</b>, sondern ein komplettes Paket mit <b>Layoutprogramm</b> und <b>Autorouter</b>. Das hat den Vorteil, dass man einen erstellten Schaltplan gleich zur Platine weiterverarbeiten kann.<br />
<br />
Mitgeliefert werden umfangreiche Symbol- bzw. Bauteilbibliotheken, von Widerständen in allen Bauformen über Taster bis hin zu [[AVR]]s. Eine Library für viele aktuelle AVRs findet sich im Download-Bereich <br />
von [http://www.embedit.de http://www.embedit.de].<br />
<br />
Eagle läuft unter Linux, Windows (2000/XP/Vista/7) und Mac OS X. Ausgabedateien können direkt an die einschlägigen Hersteller geliefert werden.<br />
<br />
Eine für nichtkommerzielle Anwendungen kostenlose Version ist von [http://www.cadsoft.de/ CadSoft] erhältlich. Diese ist auf zweilagige Platinen im halben Euro-Format (80x100mm) sowie Schaltpläne mit nur einer Seite beschränkt.<br />
<br />
=== Autorouter ===<br />
<br />
Der Autorouter funktioniert nicht in der nichtkommerziellen Version. Man kann aber in diesem kostenlosen Autorouter eagle-brd Dateien importieren und als Eagle-session-script (.scr) wieder in Eagle importieren: [http://www.freerouting.net/ http://www.freerouting.net/]<br />
<br />
Auf die richtige Version des Eagle-ULP achten.<br />
<br />
=== 3D-Ansicht===<br />
[[Bild:Stereobild-elektronik-3d.jpg|right|thumb|Rot-Grün-Stereo-Bild]]<br />
Zum Betrachten des fertigen, bestückten Platinenentwurfs in Form eines 3D-Bilds bietet sich das Paket [http://sourceforge.net/projects/eagle3d.berlios/files/?source=navbar eagle3D] an. Mit Hilfe eines ULP wird eine Beschreibungsdatei für den open source Renderer <i>POVray</i> erzeugt, welche dann anschließend halbautomatisch generiert werden kann. Auch Bewegungsanimation und Kameraflug sind möglich. Es wird bereits ein große Zahl an Bauteilen unterstützt.<br />
<br />
Anwendungshinweise:<br />
* [[Eagle im Hobbybereich]]<br />
* [http://gaussmarkov.net/wordpress/category/tools/software/eagle/ Eagle CAD Tutorial] im Blog von gaussmarkov: diy fx (englisch)<br />
* [[Stereobilder mit EAGLE 3D]]<br />
<br />
{{Absatz}}<br />
<br />
== FreePCB ==<br />
<br />
FreePCB ist ein freier, open-source PCB editor für Microsoft Windows, der unter der GNU General Public License veröffentlicht wurde. Er wurde entwickelt, um ihn einfach erlernen und nutzen zu können und dennoch für professionelles Arbeiten geeignet. Er besitzt keinen eingebauten Auto Router, kann jedoch den web-basierten auto router auf www.freerouting.net verwenden.<br />
<br />
*http://en.wikipedia.org/wiki/FreePCB Englischer Wikipedia Eintrag.<br />
*http://www.freepcb.com/ Offizielle Homepage<br />
*http://www.freepcb.com/freepcb_user_guide.pdf Users Guide<br />
<br />
== Electric ==<br />
<br />
Das [http://www.staticfreesoft.com/index.html Electric(TM)] VLSI Design System ist ein Open Source Electronic Design Automation (EDA) System.<br />
<br />
== ExpressPCB ==<br />
<br />
Die Firma <b>ExpressPCB</b> bietet den kostenlosen Schaltplaneditor <b><i>ExpressSCH</i></b> an. Zusätzlich gibt es das kostenlose Layoutprogramm <b><i>ExpressPCB</i></b> zum Erstellen von zwei- und vierlagigen Leiterplatten. Die beiden Programme sind auf Windows (NT, 2000, XP, Vista) beschränkt. Die Firma bietet auf der [http://www.expresspcb.com/ ExpressPCB Homepage] ausserdem einen kommerziellen Service für die Herstellung von zwei- und vierlagigen Leiterplatten an. Auf der Seite finden sich [http://www.expresspcb.com/ExpressPCBHtm/Tips.htm hier] einige Hinweise zum Entwurf von Leiterplatten.<br />
<br />
== FidoCadJ ==<br />
<br />
[http://davbucci.chez-alice.fr/index.php?argument=elettronica/fidocadj/fidocadj.inc&language=English FidoCadJ] is a very easy to use editor, with a library of electrical symbols and footprints (through hole and SMD). Albeit its ease of use, it is a very immediate and effective EDA tool for the hobbyst. FidoCadJ stores its drawings in a compact text format. This choice is well suited for the copy and paste in newsgroups and forums. This explains the success of FidoCadJ in Usenet groups and in several portals. FidoCadJ is multi-platform Java program and runs on MacOSX, Linux and Windows. FidoCadJ and its manuals are in english, french and italian. Lizenz: Creative Commons 3.0 BY-NC-ND<br />
<br />
== Fritzing ==<br />
<br />
[[Datei:Fritzing bildschirmfoto.png|miniatur|rechts|Bildschirmfoto]]<br />
'''Fritzing''' verwendet die Metapher eines Breadboards (Steckbretts), auf dem die Benutzer virtuell Bauteile einstecken. Fritzings Zielgruppe sind Künstler, Designer und Hobbyisten aber nicht unbedingt Profielektroniker, und die Software soll speziell auf die Zielgruppe zugeschnitten werden. Dabei wird auf eine niedrige Zugangsschwelle wert gelegt. Versionen für Mac OS X, Linux und Windows (XP/Vista) sind bei http://www.fritzing.org/ erhältlich.<br />
Nichtsdestotrotz besitzt das Programm 3 Ansichten, von denen die erste am häufigsten gezeigt wird – das o.a. Breadboard oder auch eine Streifenrasterplatte. Weiters wird aus dem Steckbrett in einer zweiten Ansicht ein Schaltplan erstellt und in einer dritten Ansicht lässt sich sogar eine ätzbare Leiterplatte mittels Autorouting entwerfen. Die Bauteilliste enthält bereits fertige Komponenten der [[Arduino]]-Gemeinschaft und ähnlicher Produkte wie die von Sparkfun, Parallaxe oder Picaxe. Ein paar Standardbauteile wie eine rote LED oder ein 220Ohm-Widerstand sind schnell zu finden. Die Bauteilbibliothek lässt sich erweitern.<br />
Die Bedienung ist einfach zu erlernen und es gibt zwar Tastaturkürzel für die wichtigsten Funktionen, aber der erste Schaltplan ist schnell allein mit der Maus erstellt. Eine Umschaltung zwischen Platzierung der Bauteile und Routing ist nicht notwendig. Einfaches Klicken und Ziehen erstellt eine Kabelbrücke als Luftlinie. Auf Ebenen muss der Nutzer auch nicht verzichten. So lassen sich Bauteile, Kabel und Beschriftungen ein- und ausblenden. Auch wenn die Version noch nicht die 1.0 erreicht hat kann Sie bei bei Schaltungen bis ca. 30 Teilen mit professionellen Programmen mithalten was den Zeitaufwand und die Übersichtlichkeit betrifft.<br />
<br />
== gEDA ==<br />
<br />
[http://www.mikrocontroller.net/articles/GEDA gEDA] ist eine unter anderem aus [http://www.mikrocontroller.net/articles/Schaltplaneditoren#Gschem Gschem] und [http://www.mikrocontroller.net/articles/Schaltplaneditoren#PCB PCB] bestehende Open Source Programm Suite zur Entwicklung von Schaltplänen und Platinen. <br />
<br />
== Gschem ==<br />
<br />
[[Bild:Gschem.png|right|thumb|Screenshot]]<br />
<br />
<b><i>gschem</i></b> ist der Schaltplaneditor aus dem Open Source Projekt gEDA. <i>gschem</i> wird hauptsächlich auf Linux Rechnern entwickelt, läuft aber auch auf anderen Unix-Betriebssystemen und unter Windows. <i>gschem</i> ist für die Linuxdistributionen RedHat und Debian als Paket verfügbar, für Windows ist nur eine ältere Version erhältlich und für alle anderen ist selber kompilieren angesagt.<br />
<br />
Die Bedienung ist nicht sonderlich anfängerfreundlich. Hat man sich aber mal daran gewöhnt, dass jeder Menupunkt mit 1 oder 2 Tasten erreichbar ist, läßt sich's mit <i>gschem</i> prima arbeiten. <br />
<br />
In der Symbolbibliothek (die auch online betrachtet werden kann) sind etwas mehr als 1000 Symbole; das Selbsterzeugen von Symbolen ist jedoch problemlos möglich. Insbesondere ist es aufgrund des gut dokumentierten und einfachen Datei-Formates möglich, mit einfachen Perl-Programmen z.&nbsp;B. aus Reports von Xilinx ISE Symbole zu erzeugen und automatisch zu aktualisieren, wenn sich die Pinzuordnung ändert. Das fehlerhafte Eingeben der Pinbelegung von CPLDs und FPGAs von Hand und die Änderung derselben ist damit für <i>gschem</i> User Geschichte.<br />
<br />
Die Schaltpläne lassen sich als png und als Postscript exportieren. <br />
<br />
Netzlisten (insgesamt über 20 Formate für PCB, Protel, Eagle, BAE, spice, pads, ... ) lassen sich mit dem Programm <i>gnetlist</i> generieren. Aus diesem Grund ist man (bis auf die Namen der Footprints) unabhängig von der verwendeten Layout-Software und kann diese auch sehr leicht wechseln.<br />
<br />
Gschem bildet zusammen mit PCB und anderen Programmen das [http://www.mikrocontroller.net/articles/GEDA gEDA] Programmpacket.<br />
<br />
Ein großer Vorteil der gEDA-Suite sind die Dateiformate, welche alle reiner ASCII-Text sind. Dies macht die Entwicklung von Helper-Tools zur Lösung von speziellen Aufgaben sehr leicht. Außerdem können die Dateien deswegen sehr einfach in Versionsverwaltungssystemen wie CVS verwaltet werden, was insbesondere die Entwickler größerer Projekte zu schätzen wissen.<br />
<br />
Nähere Informationen über <i>gschem</i> (gEDA) gibt es unter [[http://www.geda.seul.org/ http://www.geda.seul.org/]].<br />
Hier auf der Mikrocontroller.net Seite finden sich Informationen zu Gschem [http://www.mikrocontroller.net/articles/GEDA unter gEDA].<br />
<br />
== Inkscape ==<br />
<br />
Etwas bekannter noch als Jfig ist [http://inkscape.org/ '''Inkscape'''], ebenfalls ein reines Vektorzeichenprogramm, das vor allem (aber nicht nur) SVG-Dateien erstellt, die mit der Wikipedia eine große Verbreitung gefunden haben. Es ist in fast jeder gängigen Linux Distribution enthalten, eine Windowsversion sowie eine [http://portableapps.com/apps/graphics_pictures/inkscape_portable '''portable Windowsversion'''] existiert auch. In der Wikipedia findet sich eine Sammlung von Elektroniksymbolen im [http://commons.wikimedia.org/wiki/Category:SVG_electrical_symbols SVG-Format] und [http://commons.wikimedia.org/wiki/File:Electrical_symbols_library.svg hier]. Als Beispiele damit gezeichneter Schaltpläne sei diese [http://commons.wikimedia.org/wiki/Category:Created_with_electrical_symbols_library] genannt.<br />
<br />
== Kicad ==<br />
[[Bild:kicad1.gif|right|thumb|Screenshot]]<br />
[[Bild:kicad2.gif|right|thumb|Screenshot]]<br />
<br />
[[KiCAD]] ([http://www.kicad-pcb.org/display/KICAD/KiCad+EDA+Software+Suite/ Homepage]) und ([http://iut-tice.ujf-grenoble.fr/kicad/ "klassische" Homepage]) ist ein Paket aus Design / Layout / Routing Programmen. Es basiert auf wxWidgets und ist damit plattformübergreifend. Die Progamme sind unter der GPL veröffentlicht und damit Open Source. KiCad darf frei benutzt werden, und die Nutzer haben volle Rechte an ihren damit erstellten Schaltplänen und Layouts, auch für kommerzielle Nutzung. Im deutschsprachigen Raum existiert noch ein Zeichenprogramm für Elektrotechnik, welches auch kicad heißt, aber ein kommerzielles Projekt ist, und mit dem hier behandelten lediglich den Namen gemeinsam hat.<br />
<br />
Das KiCAD Projekt wurde von Jean Pierre Charras gestartet und enthält eine Gruppe recht aktiver Entwickler. Es ist auf [http://de.wikipedia.org/wiki/Launchpad Launchpad] angesiedelt. Auch eine Nutzergruppe des [http://de.wikipedia.org/wiki/CERN CERN] beteiligt sich mit einem [https://code.launchpad.net/~cern-kicad/kicad/kicad-gal-orson branch] an der Weiterentwicklung von KiCAD: [http://www.ohwr.org/projects/cern-kicad/wiki/WorkPackages Über die geplante Weiterentwicklung von KiCad (englisch)] und [http://home.web.cern.ch/about/updates/2015/02/kicad-software-gets-cern-treatment warum das CERN KiCad unterstützt (englisch)] . <br />
<br />
Eine Kicad User-Group findet sich unter http://groups.yahoo.com/group/kicad-users/. Die Anmeldung erfolgt erst, nachdem man vom Besitzer der User-Group freigeschaltet wurde (wie üblich für die meisten Yahoo-Groups).<br />
<br />
Neben der mitgelieferten, bereits umfangreichen Bibliothek, die auch hier extern zugänglich ist (https://github.com/KiCad) gibt es auf vielen anderen Seiten (z.&nbsp;B. http://www.kicadlib.org/) weitere Bibliotheken zum Download, die einfach integriert werden können.<br />
<br />
Für Umsteiger von anderen Programmen sollten sich nach wenigen Stunden bereits die gleichen Ergebnisse erzielen lassen. Beim Erlernen kann das Tutorial von http://www.curiousinventor.com/guides/kicad helfen. Ebenso findet sich hier unter http://www.mikrocontroller.net/articles/KiCAD eine unfangreiche FAQ (und Bibliothekssammlung)<br />
<br />
Der Schaltplaneditor von Kicad verfügt über Möglichkeiten hierarchische Schaltpläne anzulegen. Etwas, das man nicht mehr missen möchte, nachdem man einmal damit gearbeitet hat. Obwohl ursprünglich nicht dafür gedacht, lässt sich dieses System nutzen, um aus vorgefertigten Teilschaltplänen einen Hauptschaltplan modular zusammenzusetzten. Eine Anleitung dazu findet sich hier: [[Media:HierarchischeSchaltplaeneAlsBausteineInKicad_RevC_23Dec2013.pdf]]<br />
<br />
Kicad liefert eine schöne 3D-Ansicht des fertigen Layouts einschließlich der bestückten Bauteile, so dass man an dieser Stelle schon einmal einen Überblick bekommt, ob vielleicht nicht doch etwas vergessen wurde. Es gibt zwar nicht für alle Bauformen ein 3D-Modell, allerdings lassen sich diese selbst erstellen.<br />
<br />
Kicad ist mittlerweile soweit verbreitet, das viele Leiterplattenhersteller die Kicad-Board Daten direkt verarbeiten können.<br />
<br />
Kicad enthält eine Autoplacement und eine Autorouterfunktion, die aber leider nicht sehr effizient sind. Ausserdem sind sie schlecht dokumentiert. Es lassen sich aber Netzlisten zum Export in mehrere verschiedene externe Autorouter erzeugen. Desweiteren lässt sich der bekannte Freeroute Autorouter im Netz direkt verwenden. Desweiteren können Netzlisten zum Export in Spice erzeugt werden. Ein weiterer Kritikpunkt wäre, dass die offizielle Symbolbibliothek nur amerikanische, aber keine europäischen Schaltplansymbole enthält. Aber eine aktuelle Version einer europäischen Symbolbibliothek findet sich hier in Mikrocontroller.de unter http://www.mikrocontroller.net/articles/KiCAD#Bibliotheken<br />
unter SymbolsSimilarEN60617+oldDIN617-RevE8.lib<br />
Diese enthält aber nicht nur EN60617 Symbole, sondern auch einige andere Symbole wie Logos für Gefahr, Hochspannung, ESD-Schutz und Dummy Symbole für Platinenumrisse, Fiducials, Messpunkte ec. Eine [http://www.mikrocontroller.net/wikifiles/7/77/Symbols_EN60617_13Mar2013.lib "gereinigte" EN60617 Bibliothek] findet sich am gleichen Ort unter Symbols_EN60617_13Mar2013.lib, zusammen mit einem <br />
[http://www.mikrocontroller.net/wikifiles/e/e6/Symbols_EN60617_13Mar2013.pdf PDF-Katalog der enthaltenen Symbole].<br />
Neuere KiCad Versionen enthalten allerdings einen sehr effizienten interaktiven Router. Dieser kann allerdings nur verwendet werden, wenn die Hardware und das Betriebssystem des Rechners aktuelle openGL Versionen unterstützt. Hier ein Video zur benutzung des interaktiven Routers: https://www.youtube.com/watch?v=CCG4daPvuVI<br />
Ebenso existiert ein Tool für "Different Pair matching" um Leiterbahnen gleicher Länge (Laufzeit) zu erzeugen.<br />
Siehe dazu dieses Video: https://www.youtube.com/watch?v=chejn7dqpfQ<br />
<br />
Eagle 6 Boarddateien können in Kicad eingelesen werden. Ebenso können Eagle "Packages" als Footprintbibliotheken in KiCAD eingebunden werden. Auch gEDA Footprints können direkt als KiCAD Footprint Bibliothek in PCBnew eingebunden werden. Diese Funktionen sind aber noch als experimentell zu bezeichnen.<br />
<br />
Desweiteren existieren eine Reihe von Konvertern, mit denen Daten anderer Platinenlayoutprogramme nach KiCad exportiert werden können. Eine Liste findet sich hier: http://www.mikrocontroller.net/articles/KiCAD#Konverter <br />
<br />
Das Kicad Packet enthält ausserdem einen Gerberdatenviewer, der auch eingelesene Gerberdaten als Layout reimportieren kann. Ausserdem zählt zum KiCad Packet ein "Leiterplattenrechner" mit dem z.B. Wellenwiderstände, Leiterbahnbreiten und Isolationsabstände bestimmt werden können.<br />
<br />
Kicad kann z.Z. Boards mit 16 Kupferlagen und die dazugehörigen Löttstop., Umriss-, Lötpasten-, Kleber-, Silkscreen- ec. Lagen verarbeiten. Die mögliche Leiterpalttengröße liegt über 1x1m. Damit ist eine deutlich größere Fläche als die von Einheitstafeln abgedeckt. Wer Platinen im oder über dem Einheitstafelnformat benötigt, wird Mühe aufwenden müssen, einen Hersteller dafür zu finden.<br />
<br />
Die Einarbeitung in Kicad ist vergleichbar mit Eagle. Es hängt vermutlich von den individuellen Denkstrukturen ab, welches Programm man handlicher findet. Ein großer Vorteil sind die Dateiformate, welche alle reiner ASCII-Text sind. Dies macht die Entwicklung von externen Skripten zur Lösung von speziellen Aufgaben sehr leicht. Außerdem können die Dateien deswegen sehr einfach in Versionsverwaltungssystemen wie CVS verwaltet werden, was insbesondere die Entwickler größerer Projekte zu schätzen wissen.<br />
Ein internes Skripting unter Python für KiCad ist in der Entwicklung. z.Z. kann es aber nur unter PCBnew verwendet werden.<br />
<br />
[http://www.bigmessowires.com/2014/12/09/eagle-vs-kicad-revisited/ Und hier ein Link auf eine Kritik/Meinung (englisch)]<br />
<br />
== Lochmaster ==<br />
<br />
[http://www.abacom-online.de/html/lochmaster.html Lochmaster] ist ein Programm zur Erstellung von Layouts speziell auf [[Lochrasterplatine]]n. Schaltplan und Layout sind ein und das selbe.<br />
<br />
== PCB ==<br />
<br />
[http://pcb.sourceforge.net/index.html PCB] ist ein freies (open source) Layoutprogramm inklusive Autorouter. Zum Zeichnen der Schaltpläne kann [[Schaltplaneditoren#Gschem|Gschem]] verwendet werden.<br />
<br />
<i>PCB</i> wurde ursprünglich für den Atari ST entwickelt und später nach <br />
Unix portiert. <i>PCB</i> läuft meist unter Linux, kann allerdings mit [http://www.cygwin.com/ Cygwin] auch unter Windows betrieben werden.<br />
<br />
Als Ausgabeformate stehen [http://de.wikipedia.org/wiki/Postscript Postscript] und Gerber RS-274-X zur Verfügung.<br />
<br />
Ein großer Vorteil von <i>PCB</i> ist, dass alle Funktionen auch über <br />
Hotkeys gesteuert werden können, was insbesondere nach längerer Einarbeitungszeit ein großer Gewinn gegenüber manchen Windows-Programmen ist.<br />
<br />
Zur Einarbeitung ist es meines Erachtens sehr wichtig, sich das [http://www.geda.seul.org/wiki/geda:gsch2pcb_tutorial Tutorial] durchzulesen. <i>PCB</i> und <i>Gschem</i> sind nicht besonders einfach zu benutzen. Gerade am Anfang, wenn man sich versucht damit einzuarbeiten. Aber wenn man einmal mit dem Werkzeug arbeiten kann, wird man es nicht mehr missen wollen.<br />
<br />
PCB bildet zusammen mit Gschem und anderen Programmen das [http://www.mikrocontroller.net/articles/GEDA gEDA] Programmpacket. Hier auf der Mikrocontroller.net Seite finden sich Informationen zu PCB [http://www.mikrocontroller.net/articles/GEDA unter gEDA].<br />
<br />
== ProtoCAD ==<br />
<br />
[http://sourceforge.net/projects/protocad/ ProtoCAD] ist ein Werkzeug, um schnell Schaltpläne zu entwerfen. Es ist für [[Lochrasterplatine]]n entwickelt worden, kann aber auch für andere Methoden genutzt werden. (Java 1.5 kompatibel, Swing GUI, Open Source)<br />
<br />
== Pulsonix ==<br />
[http://www.pulsonix.com PULSONIX] ist ein professionelles Schaltplan- und Layout-Werkzeug mit [http://www.pulsonix.com/downloads/datasheets/Pulsonix%20FPGA.pdf integriertem FPGA-Interface] sowie [http://www.pulsonix.com/downloads/datasheets/Pulsonix%20Spice%20V2.0%20UK.pdf integriertem Schaltungsimulator] auf PSpice-Basis.<br />
<br />
== QCAD ==<br />
<br />
[http://www.ribbonsoft.de/qcad.html QCAD] gibt es in einer lizenzpflichigen und in einer Open Source Community Version. QCAD ist kein ausschliesslicher Schaltungseditor, sondern kann auch für andere 2D Zeichnungen (Konstruktionen etc.) eingesetzt werden.<br />
<br />
== Razen PCB ==<br />
<br />
[[Datei:Razenpcb.png|miniatur|rechts|Screenshot]]<br />
<br />
[http://razencad.com/ Razen CAD] ist zwar noch in der Beta Phase, aber sieht momentan schon recht vielversprechend aus. <br />
Es setzt auf Mercurial auf und ermöglicht dadurch kolaboratives arbeiten an einem Layout.<br />
<br />
== sPlan ==<br />
<br />
'''sPlan''' ist ein relativ preiswerter Schaltplaneditor für Windows (95,98,ME,NT,2000,XP)<br />
Infos und eine Demoversion von sPlan gibt es u.a. bei http://www.abacom-online.de/html/splan.html<br />
<br />
== TARGET 3001! == <br />
<br />
[[Bild:target3001.png|right|thumb|Screenshot]]<br />
<br />
<b><i>TARGET 3001!</i></b> für Windows (ME/NT4/2000/XP/Vista/Win7) bietet folgende Funktionen<br />
<br />
* Schaltplan<br />
* Bauteilerstellung <br />
* Schaltungssimulation (PSPICE-Syntax)<br />
* Platinen-Layout mit Autoplatzierer<br />
* Autorouter <br />
* Anzeige der Platine in 3D<br />
* Frontplattenentwurf direkt an oder über der Platine<br />
<br />
Die Platinen-Layout-Software ist in deutscher, englischer oder französischer Sprache. Es gibt eine für nicht kommerzielle Anwendungen kostenlose Version: <b>TARGET 3001! discover</b> ist beschränkt auf 250 Pins/Pads, 2 Kupferlagen<br />
und 30 Signale sind simulierbar, die Fläche ist unbeschränkt (1,2m x 1,2m).<br />
<br />
Auf der c't 11/07 CD ist eine <b>SE Version</b> von TARGET 3001! verfügbar welche 400 Pins/Pads verarbeiten kann. <br />
<br />
Die <b>PCB-Pool Edition</b> hat keine Beschränkungen, speichert aber die Layouts in einem von normalen Target Versionen nicht lesbaren Format. Diese Layouts können dann allerdings nur zum selbst Ätzen ausgedruckt werden oder vom PCB-POOL® produziert werden.<br />
<br />
Links:<br />
* [http://server.ibfriedrich.com/wiki/ibfwikide Target3001 Homepage]<br />
* [http://www.pcb-pool.com/ppde/service_downloads.html Target3001 PCB-Pool-Edition]<br />
<br />
<i>TARGET 3001!</i> bietet ein typisches Windows Look-And-Feel. Eine einfache Einführung findet sich '''[http://server.ibfriedrich.com/wiki/ibfwikide/index.php?title=Kurzeinführung2 hier]'''. Wer sich schon mit Eagle auskennt, kann auch '''[http://server.ibfriedrich.com/wiki/ibfwikide/index.php?title=Eagle hier]''' schauen. Es gibt kostenlosen direkten Service durch den Hersteller telefonisch oder per E-Mail auch für Einsteiger oder Demo-User.<br />
<br />
== TinyCAD ==<br />
<br />
'''TinyCAD''' ist ein weiterer ''Open Source'' Schaltplaneditor für Windows. Mehr Infos gibt es auf der [http://tinycad.sourceforge.net Projektseite]. TinyCAD kann z.&nbsp;B. mit VeeCAD (s.u.) kombiniert werden.<br />
<br />
== VeeCAD ==<br />
<br />
[http://veecad.com/ VeeCAD] Stripboard Layout Editor ist ein Werkzeug, um [[Lochrasterplatine]]n zu entwerfen. VeeCAD ist als kommerzielle Version und als eingeschränkte Freiversion erhältlich.<br />
<br />
== ZenitPCB Suite ==<br />
<br />
[http://www.zenitpcb.com/eng/IndexEng.html ZenitPCB Suite] is directed to all those people who want to make printed circuit board for hobby, or to student and academics from universities or high schools, who want to create their own pcb with a professional approach and particularly without having to pay for expensive licenses. ZenitPCB Layout (part of the ZenitPCB Suite) is completely freeware for personal or semi-professional use, limited to [http://www.zenitpcb.com/images/MainBoard_01_01.gif 800 pins]. (Windows XP, Vista)<br />
<br />
Übersetzung: ZenitPCB richtet sich an all diejenigen, welche fürs Hobby, Schule, Studium etc professionelle PCBs erstellen möchten, ohne viel Geld für Lizenzen ausgeben zu müssen. ZenitPCb ist in der eingeschränkten Version mit 800 Pins für den semi-professionellen und privaten Gebrauch kostenfrei benutzbar.<br />
<br />
== Siehe auch ==<br />
<br />
* [[Schaltungssimulation]]<br />
* [[Dos and don'ts - Platinenlayout]]<br />
* [[Lochrasterplatine]]<br />
<br />
[[Kategorie:Schaltplaneditoren| ]]<br />
[[Kategorie:Listen]]</div>Schweigstillhttps://www.mikrocontroller.net/index.php?title=FAQ&diff=79905FAQ2013-12-07T15:09:25Z<p>Schweigstill: /* Was hat es mit volatile auf sich */ "?" ergänzt</p>
<hr />
<div>Ein Verzeichnis von im Forum oft gestellten und immer wieder beantworteten Fragen und den zugehörigen Antworten:<br />
<br />
=Wie kann ich Zahlen auf [[LCD]]/[[UART]] ausgeben?=<br />
<br />
Aber die Bibliothek, die du benutzt, stellt nur eine Funktion zur Verfügung, mit der man einen String ausgeben kann... Was tun? <br />
<br />
In den folgenden Beispielen wird eine selbstgeschriebene Funktion zur Stringausgabe auf LCD - die Funktion lcd_string() - aus dem [[AVR-GCC-Tutorial/LCD-Ansteuerung|LCD-Teil des AVR-GCC-Tutorials]] verwendet:<br />
<br />
<syntaxhighlight lang="c"><br />
lcd_string( "Hallo Welt" ); // ggf. auch lcd_out() o.ä. in anderen Libraries<br />
</syntaxhighlight><br />
<br />
Um also eine Zahl (numerische Konstante oder Variableninhalt) auszugeben, muss von dieser Zahl zunächst ihre String-Repräsentation ermittelt werden. Hier geht es aber nur darum, zu zeigen wie man diese String Repräsenation erzeugen kann. Was man dann mit diesem String weiter macht, ob das dann eine LCD-Ausgabe oder eine UART-Übertragung oder das Abspeichern auf SD-Karte oder ... ist, spielt eine untergeordnete Rolle.<br />
<br />
Es gibt mehrere Möglichkeiten, sich die Stringrepräsentation zu erzeugen:<br />
<br />
===itoa() (utoa(), ltoa(), ultoa(), ftoa() )===<br />
<br />
<b>itoa()</b> ist keine C-Standardfunktion (wohl aber ihre Umkehrung <b>atoi()</b> ). Auf manchen Compilern heisst diese Funktion dann folgerichtig <b>_itoa()</b>, wobei der führende _ eben anzeigt, dass es sich um eine Erweiterung des C-Standards handelt. Bei [[WinAVR]] ist itoa() Bestandteil der mitgelieferten Library avr-libc, in der Libary [http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html''stdlib.h''].<br />
<br />
<syntaxhighlight lang="c"><br />
#include <stdlib.h><br />
char Buffer[20];<br />
int i = 25;<br />
<br />
itoa( i, Buffer, 10 );<br />
lcd_string( Buffer ); // ggf. auch lcd_out() o.ä. in anderen Libraries<br />
</syntaxhighlight><br />
<br />
<b>itoa( i, Buffer, 10 );</b> - Die Zahl i wird nach ASCII gewandelt und die String Repräsentierung davon wird in Buffer abgelegt. Die Basis, in der diese Wandlung erfolgt, ist das 10-er System. Wird das dritte Argument von 10 in zb. 2 oder auch 16 abgewandelt, erhält man die binäre oder eben eine hexadezimale Repräsentierung des Wertes. Auch wenn 10, 2 und 16 die häufigsten Angaben an dieser Stelle sind, kann itoa aber grundsätzlich in jedes beliebige Zahlensystem wandlen.<br />
<br />
Wichtig ist, darauf zu achten, dass das Array <i>Buffer</i> groß genug dimensioniert wird, um alle Zeichen der Textrepräsentation der Zahl aufzunehmen - inklusive der 0, die den String abschließt, sowie ein mögliches Vorzeichen.<br />
<br />
Anzumerken bleibt weiter, dass es normalerweise für alle Datentypen entsprechende Umwandlungsfunktionen gibt, wenn es sie für einen Datentyp gibt. Die Namensgebung lehnt sich an das Schema an: ''Kürzel_für_den_Datentyp to a''. Eine Funktion die einen unsigned int wandelt, heißt dann utoa (oder _utoa), Floating Point heißt dann ftoa (oder _ftoa), etc.<br />
<br />
===sprintf()===<br />
<br />
<syntaxhighlight lang="c"><br />
char Buffer[20];<br />
int i = 25;<br />
<br />
sprintf( Buffer, "%d", i );<br />
lcd_string( Buffer ); // ggf. auch lcd_out() o.ä. in anderen Libraries<br />
</syntaxhighlight><br />
<br />
Diese Methode funktioniert auch bei long oder float Werten. Unbedingt beachtet werden muss allerdings, dass die Typkennzeichnungen im sog. Format-String (hier "%d") mit den tatsächlichen Typen der auszugebenden Werten übereinstimmt. Und dass der Buffer, der den Text aufnimmt, auch groß genug dimensioniert wird. Dabei sollte die 0, die den String terminiert, nicht vergessen werden.<br />
<br />
Mit sprintf() hat man dieselben Möglichkeiten zur Formatierung wie bei <b>printf()</b> (siehe unten). Insbesondere gibt es natürlich die Möglichkeit die Zahl gleich in einen umgebenden Text einzubetten bzw. Formatierungen anzugeben:<br />
<br />
<syntaxhighlight lang="c"><br />
char Buffer[20];<br />
int i = 25;<br />
<br />
sprintf( Buffer, "Anzahl: %d Stueck", i );<br />
lcd_out( Buffer );<br />
</syntaxhighlight><br />
<br />
Der "Haken" an der mächtigen Funktion sprintf() ist, daß sie auch bei minimalisierter Konfiguration verhältnismäßig viel Programmspeicher (Flash-ROM) belegt und relativ viel Prozesszeit benötigt. Daher sollte man sprintf() nur verwenden, wenn kein Speicher- und Prozesszeitmangel besteht. Sonst sollte itoa() oder eine eigene, auf die Bedürfnisse optimierte Implementierung auf jeden Fall vorgezogen werden. Der große Vorteil von sprintf liegt darin, dass man über sehr mächtige Formatiermöglichkeiten verfügt, mit der man die Ausgabe einfach steuern und an seine Bedürfnisse anpassen kann. Dinge die man mit einer Funktion wie itoa alle selbst 'händisch' erledigen muss.<br />
<br />
====Formatierungen mit printf====<br />
<br />
Für jedes auszugebende Argument muss es im Formatstring einen entsprechenden Formatbezeichner geben. Der Aufbau eines Formatbezeichners ist immer<br />
<br />
%[Modifizierer][Feldbreite][.Präzision]Typ<br />
<br />
(Die in eckigen Klammern [ ] angegebenen Elemente können auch weggelassen werden, wenn man sie nicht benötigt. Im einfachsten Fall benötigt man also nur das % und den Buchstaben zur Typ-Kennung.)<br />
<br />
<b>Typ</b> ist dabei eine Kennung, der mit dem Datentyp des jeweiligen auszugebenden Argumentes übereinstimmen muss. Einige oft benutzte Kennungen, ohne Anspruch auf Vollständigkeit, sind:<br />
<b>c</b> char<br />
<b>d</b> int<br />
<b>f</b> float, double<br />
<b>ld</b> long<br />
<b>u</b> unsigned int<br />
<b>lu</b> unsigned long<br />
<b>p</b> pointer<br />
<b>s</b> string<br />
<b>x</b> ein int wird ausgegeben, die Ausgabe erfolgt<br />
aber als Hexadezimalzahl<br />
<b>X</b> ein int wird ausgegeben, die Ausgabe erfolgt<br />
aber als Hexadezimalzahl, wobei Grossbuchstaben verwendet werden<br />
<br />
Der''Modifizierer'' bestimmt, wie und womit nicht benutzte Felder des Ausgabefeldes gefüllt werden sollen, wie die Ausrichtung innerhalb des Feldes erfolgen soll und ob ein Vorzeichen auch dann ausgegeben werden soll wenn die auszugebende Zahl positiv ist. Wird kein Modifizierer angegeben, so werden nicht benutzte Felder mit einem Leerzeichen gefüllt, positive Vorzeichen unterdrückt und die Ausgabe im Feld rechts ausgerichtet.<br />
<br />
<b>+</b> Vorzeichen wird immer ausgegeben<br />
<b>-</b> Die Ausgabe wird im Ausgabefeld linksbündig ausgerichtet<br />
<b>0</b> anstelle von Leerzeichen werden führende 0-en ausgegeben<br />
<br />
Die ''Feldbreite'' gibt die Breite des Ausgabefeldes an, in die die Ausgabe durchgeführt werden soll. Reicht die angegebene Feldbreite nicht aus, so vergrößert printf diese Breite eigenmächtig. Die Feldbreite muß nicht angegeben werden. In diesem Fall bestimmt printf selbst die Feldbreite, so dass die Ausgabe darin Platz findet. Mit der Feldbreite hat man eine simple Möglichkeit dafür zu sorgen, dass der erzeugte String immer eine konstante Länge hat, selbst wenn die auszugebende Zahl diese Länge gar nicht benötigen würde (wichtig zb. bei Tabellen, damit die Einerstellen der Tabelleneinträge auch sauber untereinander stehen, auch dann wenn die Zahlen sich in unterschiedlichen Wertebereichen bewegen).<br />
<br />
Die ''Präzision'' kommt nur bei float oder double Zahlen zum Einsatz. Sie legt fest, wieviele Positionen der kompletten Feldbreite für die Ausgabe von Nachkommastellen reserviert werden sollen. Auch sie muss wiederrum nicht angegeben werden und printf benutzt in so einem Fall Standardvorgaben.<br />
<br />
===== Beispiele =====<br />
;<tt>"%d"</tt>: Ausgabe eines Integer<br />
;<tt>"%5d"</tt>: Ausgabe eines Integer in einem Feld mit 5 Zeichen Breite<br />
;<tt>"%05d"</tt>: Ausgabe eines Integer in einem Feld mit 5 Zeichen Breite, wobei das Feld links mit führenden Nullen auf 5 Zeichen aufgefüllt wird<br />
;<tt>"%-5d"</tt>: Ausgabe eines Integer in einem Feld mit 5 Zeichen Breite. Die Zahl wird linksbündig in das Feld gestellt.<br />
;<tt>"%6.3f"</tt>: Ausgabe eines float (oder double). Die Ausgabe erfolgt in einem Feld mit 6 Zeichen Breite, wobei 3 Nachkommastellen ausgegeben werden. Achtung: In der Feldbreite ist auch ein eventuelles Vorzeichen sowie der Dezimalpunkt enthalten. Bei einer Feldbreite von 6 Zeichen und 3 Nachkommastellen, bleiben bei einer positiven Zahl daher nur 2 Positionen für den Vorkommaanteil, bei negativen sogar nur 1 Stelle (6 - 3 Nachkommastellen - 1 Dezimalpunkt - 1 Vorzeichen = 1)<br />
<br />
===Eigene Umwandlungsfunktionen===<br />
<br />
Möchte man <b>itoa()</b> nicht benutzen oder hat es gar auf seinem System nicht zur Verfügung, dann ist es auch nicht schwer, sich selbst eine Funktion dafür zu schreiben:<br />
<br />
<syntaxhighlight lang="c"><br />
void ItoA( int z, char* Buffer )<br />
{<br />
int i = 0;<br />
int j;<br />
char tmp;<br />
unsigned u; // In u bearbeiten wir den Absolutbetrag von z.<br />
<br />
// ist die Zahl negativ?<br />
// gleich mal ein - hinterlassen und die Zahl positiv machen<br />
if( z < 0 ) {<br />
Buffer[0] = '-';<br />
Buffer++;<br />
// -INT_MIN ist idR. größer als INT_MAX und nicht mehr <br />
// als int darstellbar! Man muss daher bei der Bildung <br />
// des Absolutbetrages aufpassen.<br />
u = ( (unsigned)-(z+1) ) + 1; <br />
}<br />
else { <br />
u = (unsigned)z;<br />
}<br />
// die einzelnen Stellen der Zahl berechnen<br />
do {<br />
Buffer[i++] = '0' + u % 10;<br />
u /= 10;<br />
} while( u > 0 );<br />
<br />
// den String in sich spiegeln<br />
for( j = 0; j < i / 2; ++j ) {<br />
tmp = Buffer[j];<br />
Buffer[j] = Buffer[i-j-1];<br />
Buffer[i-j-1] = tmp;<br />
}<br />
Buffer[i] = '\0';<br />
}<br />
</syntaxhighlight><br />
<br />
Das Grundprinzip ist einfach:<br><br />
Die Ermittlung der einzelnen Stellen erfolgt in der zentralen Schleife<br />
<br />
<syntaxhighlight lang="c"><br />
do {<br />
Buffer[i++] = '0' + u % 10;<br />
u /= 10;<br />
} while( u > 0 );<br />
</syntaxhighlight><br />
<br />
durch fortgesetzte Division durch 10 und Restbildung.<br />
<br />
8392<br />
<br />
8392 % 10 -> <b>2</b><br />
8392 / 10 -> 839<br />
<br />
839 % 10 -> <b>9</b><br />
839 / 10 -> 83<br />
<br />
83 % 10 -> <b>3</b><br />
83 / 10 -> 8<br />
<br />
8 % 10 -> <b>8</b><br />
8 / 10 -> 0<br />
<br />
<br />
Nur leider erhält man dadurch die einzelnen Ziffern der Zahl in umgekehrter Reihenfolge im String ('2' '9' '3' '8' anstelle von '8' '3' '9' '2'). Dies ist aber kein Problem, die nachfolgende Schleife<br />
<br />
<syntaxhighlight lang="c"><br />
for( j = 0; j < i / 2; ++j ) {<br />
tmp = Buffer[j];<br />
Buffer[j] = Buffer[i-j-1];<br />
Buffer[i-j-1] = tmp;<br />
}<br />
</syntaxhighlight><br />
<br />
spiegelt den String in sich, sodass danach der String eine korrekte Repräsentation der ursprünglichen Zahl darstellt. Der Funktionsteil vor der 'Zerlegeschleife' behandelt den Sonderfall daß die Zahl negativ ist. Negative Zahlen werden behandelt indem im Endergebnis ein '-' vermerkt wird und danach die Zahl positiv gemacht wird.<br />
<br />
<br />
Siehe auch:<br />
* Forenbeitrag [http://www.mikrocontroller.net/topic/67405#541885 Integer-Zahl in String mit bestimmter Zeichenlänge]<br />
* Forenbeitrag [http://www.mikrocontroller.net/topic/84005#704736 (Resourcenschonend) Wert einer Variable am LCD ausgeben] von Niels Hüsken <br />
* Forenbeitrag [http://www.mikrocontroller.net/topic/121526?goto=new#new Formatierte Zahlenausgabe in C] von Peter Dannegger<br />
* [[Festkommaarithmetik]]<br />
<br />
=Datentypen in Operationen=<br />
Ein häufiges Problem betrifft die Auswertung von Ausdrücken. Konkret die Frage nach den beteiligten Datentypen.<br />
zb<br />
<syntaxhighlight lang="c"><br />
double i;<br />
int j, k;<br />
<br />
i = j / k;<br />
</syntaxhighlight><br />
Die Frage lautet dann: Warum erhalte ich keine Kommastellen, ich weise doch das Ergebnis einem double zu?<br />
<br />
Dazu ist zu sagen, dass C nicht so funktioniert. Die Tatsache dass i eine double Variable ist, ist für die Auswahl der Operation, welche die Division durchführt, völlig irrelevant. C orientiert sich ausschliesslich an den <br />
Datentypen der beteiligten Operanden, um zu entscheiden ob die Division als Integer- oder als Gleitkommadivision durchzuführen ist. Und da sowohl j als auch k ein Integer sind, wird die Division als Integerdivision durchgeführt<br />
unabhängig davon, was mit dem Ergebnis weiter passiert. Erst nach der Division wird das Ergebnis in einen double überführt, um es an i zuweisen zu können. Zu diesem Zeitpunkt gibt es aber keine Kommastellen mehr, eine Integerdivision erzeugt keine. Und damit tauchen klarerweise auch im Ergebnis keine auf.<br />
<br />
Aus genau diesem Grund ist zb das Ergebnis von<br />
<syntaxhighlight lang="c"><br />
double i;<br />
i = 5 / 8;<br />
</syntaxhighlight><br />
eine glatte 0 und nicht 0.625. Die Division 5 / 8 wird als Integer Division gemacht und liefert als solche keine Nachkommastellen. Wird das Ergebnis der Division in einen double umgewandelt, um es an i zuweisen zu können, ist das Kind schon in den Brunnen gefallen: Die Nachkommastellen sind schon längst weg bzw. waren nie vorhanden.<br />
<br />
Will man den Compiler dazu zwingen, die Division als Gleitkommadivision durchzuführen, so muss man daher dafür sorgen, dass mindestens einer der beteiligten Operanden ein double Wert ist. Dann bleibt dem Compiler nichts anderes übrig, als auch den zweiten Operanden ebenfalls zu einem double zu machen und die Operation als Gleitkommaoperation durchzuführen.<br />
<br />
<syntaxhighlight lang="c"><br />
double i;<br />
i = 5.0 / 8.0;<br />
<br />
i = (double)j / k;<br />
</syntaxhighlight><br />
<br />
Generell implementiert der Compiler eine Operation immer im 'höchsten' Datentyp, der in dieser Operation vorkommenden Operanden. Operanden in einem 'niedrigeren' Datentyp werden automatisch immer in diesen 'höchsten' Datentyp umgewandelt, zumindest aber int. Die Reihung orientiert sich dabei an der Regel: Ein 'höherer' Datentyp kann alle Werte eines 'niedrigeren' Datentyps aufnehmen.<br />
<br />
int<br />
unsigned int<br />
long<br />
unsigned long<br />
long long<br />
unsigned long long<br />
double<br />
<br />
float kommt in dieser Tabelle gar nicht vor, da Gleitkommaoperationen grundsätzlich immer als double-Operationen durchgeführt werden. Wohl kann es aber sein, dass double und float dieselbe Anzahl an Bits benutzen. Damit reduziert sich eine double Operation effektiv auf eine float Operation. (Anmerkung: mit dem C99-Standard hat sich dieses geändert. Dort gibt es dann auch echte float Operationen)<br />
<br />
Hat man also in einer Operation 2 Operanden der Datentypen int und long, so wird der int implizit zu einem long gemacht und die Operation als long Operation durchgeführt. Das Ergebnis hat dann den Datentyp long.<br />
<br />
==Welche Datentypen haben Konstanten==<br />
<br />
Auch Zahlenkonstante besitzen einen Datentyp, der selbstverständlich vom Compiler bei der Auswahl der Operation berücksichtigt wird. Hier gilt die Regel: Benutzt wird der Datentyp, der die Zahl gerade noch aufnehmen kann. Eine Zahlenkonstante 5 hat daher den Datentyp int. Die Zahl 32767 passt gerade noch in einen int, und hat daher den Datentyp int. 32768 ist für einen int bereits zu groß und hat daher den Datentyp long. 5.0 ist hingegem immer eine double-Konstante. Der Dezimalpunkt erzwingt dieses.<br />
<br />
Eine kleine Feinheit gibt es noch zu beachten. Konstanten in dezimaler Schreibweise haben immer einen signed Datentyp, während Konstanten in hexadezimaler bzw. oktaler Schreibweise je nach Wert einen signed oder einen unsigned Datentyp haben können.<br />
<br />
Möchte man einer Konstanten einen bestimmten Datentyp aufzwingen, so gibt es dazu 2 (ein halb) Möglichkeiten:<br />
* Entweder man castet die Konstante in den gewünschten Datentyp<br />
<syntaxhighlight lang="c"><br />
(long)5<br />
</syntaxhighlight><br />
* oder man benutzt die in C dafür vorgesehene Schreibweise, indem man der Konstanten einen Suffix anhängt, der den gewünschten Datentyp beschreibt<br />
<syntaxhighlight lang="c"><br />
5L<br />
</syntaxhighlight><br />
Beides ergibt eine dezimale 5, die vom Datentyp long ist.<br />
<br />
* eine Zahl in mit einem Dezimalkomma<br />
<syntaxhighlight lang="c"><br />
5.0<br />
</syntaxhighlight><br />
ist immer eine double Zahl. Es sei denn sie hat explizit einen Suffix<br />
<syntaxhighlight lang="c"><br />
5.0F<br />
</syntaxhighlight><br />
dann hat man es mit einer float Zahl zu tun.<br />
<br />
Die gültigen Suffixe für Zahlen sind U, L, UL und F:<br />
<br />
* U wie unsigned; dabei wird zuerst int angenommen. Es erfolgt eine automatische Ausweitung auf long, wenn die Zahl den Wertebereich eines unsigned int überschreitet. <br />
* L wie long; die Zahl selbst kann int oder double sein.<br />
* UL wie unsigned long. Eigentlich eine Zusammensetzung aus U und L<br />
* F wie float.<br />
<br />
Präprozessordefinitionen besitzen keine eigene Datentypen, da sie eine reine Textersetzungen durchführen. Deren Inhalte können aber ggf. zu Werten aufgelöst werden, die datentypbehaftet sind.<br />
<br />
=Aktivieren der Floating Point Version von sprintf bei WinAVR bzw AVR-Studio=<br />
[[Bild:AVR_Studio_float1.gif|thumb|right|300px|Project → Configuration Options → Libraries → Available Link Objects]]<br />
[[Bild:AVR_Studio_float2.gif|thumb|right|300px|Custom Options → Custom Compilation Options → Linker Options]]<br />
Beim WinAVR/AVR-Studio wird standardmässig eine Version der printf-Bibliothek verwendet, die keine Floatingpoint-Verarbeitung unterstützt. Die meisten Programme benötigen keine Floatingpoint-Unterstützung, so dass dadurch wertvoller Programmspeicherplatz gespart werden kann.<br />
<br />
Benutzt man allerdings eine printf-Variante für die Ausgabe von Floatingpoint-Zahlen, so erscheint an Stelle der korrekt formatierten Zahl lediglich ein '?'. Dies ist ein Indiz dafür, dass die Floatingpoint-Verarbeitung im Projekt aktiviert werden muss.<br />
<br />
Um die Floatingpoint-Verarbeitung zu aktivieren, geht man im '''AVR Studio 4''' wie folgt vor: <br />
* Menüpunkt: ''Project → Configuration Options''<br />
* Im sich öffnenden Dialog wird in der linken Navigationsleiste der Eintrag ''Libraries'' ausgewählt.<br />
* Unter ''Available Link Objects'' werden Bibliotheken angeboten. Für die Aktivierung der Floatingpoint-Unterstützung sind 2 interessant<ref><tt>libc.a</tt> sollte nicht zu den Bibliotheken hinzugefügt werden, da sie automatisch eingebunden wird. Etwas Hintergrundinformationen gibt es in [http://www.mikrocontroller.net/topic/173630 diesem Thread.]<br />
</ref>:<br />
** <tt>libprintf_flt.a</tt><br />
** <tt>libm.a</tt><br />
* Beide Bibliotheken werden durch Aktivieren und einen Druck auf ''Add Library → '' in die rechte Spalte übernommen.<br />
* Danach wählt man in der Navigationsleiste den Eintrag ''Custom Options''.<br />
* Unter ''Custom Compilation Options'' wird ''Linker Options'' ausgewählt und in das Textfeld rechts/unten folgender Text eingetragen:<br />
-Wl,-u,vfprintf<br />
* Ein Druck auf ''Add'' befördert die Zeile in das Listenfeld darüber, welches Optionen für den Linker enthält.<br />
* Mit ''OK'' wird die Konfiguration abgeschlossen.<br />
<br />
Bei '''AVR Studio 5''' trägt man die Optionen an anderen Stellen ein ([http://www.mikrocontroller.net/topic/221583#2219612 Beitrag von Hal Smith]): <br />
*''Project Properties → Toolchain → AVR/GNU C-Linker → Libraries''<br/>In ''Libraries'' <tt>(-WI, -I), libprintf_flt.a libm.a</tt> eintragen.<br />
* ''Project Properties → Toolchain → AVR/GNU C-Linker → Miscellaneous''<br/>In ''Other Linker Flags'' <tt>-Wl,-u,vfprintf</tt> eintragen.<br />
{{Absatz}}<br />
<br />
= Wie funktioniert String-Verarbeitung in C? =<br />
: → Siehe: ''[[String-Verarbeitung in C]]''<br />
<br />
= struct Strukturen =<br />
<br />
: → Siehe: ''[[Strukturen in C]]'' <br />
<br />
= Funktionszeiger =<br />
<br />
: → Siehe: ''[[Funktionszeiger in C]]''<br />
<br />
= Header File - wie geht das =<br />
<br />
Ein Header File ist im Grunde nichts anderes als eine Sammlung aller Informationen, die ein 'Aussenstehender' benötigt, um die in einem C-File gesammlten Funktionen benutzen zu können.<br />
<br />
Trotzdem gibt es immer wieder Schwierigkeiten, wie sich die Sache mit Header Files und/oder #include verhält und wie man eine derartige Lösung aufbauen kann.<br />
<br />
Gegeben sei ein System bestehend aus 3 Funktionen<br />
* main()<br />
* functionA()<br />
* functionB()<br />
und einigen globalen Variablen. Für dieses System soll eine Aufteilung erfolgen, so dass funtionA samt seinen zugehörigen globalen Variablen in einer eigenen C-Datei residiert (FileA.c), functionB in einem eigenen File residiert (FileB.c) und main() als Hautpfunktion seine eigens C-File (Main.c) darstellt und jeweils die entsprechenden Header Files existieren.<br />
<br />
Kochrezeptartig kann man in vielen Fällen einfach so vorgehen:<br />
Man schreibt erst mal den C-Code der Funktion, die man implementieren möchte. Zb fängt man an mit FileA.c<br />
<syntaxhighlight lang="c"><br />
// FileA.c<br />
<br />
int VarExtA;<br />
int VarIntA;<br />
<br />
#define PortpinX PortA.1<br />
<br />
int functionIntA( void )<br />
{<br />
VarIntA = VarExtB;<br />
functionB();<br />
PortpinX = 1;<br />
};<br />
</syntaxhighlight><br />
<br />
Jetzt geht man das File, so wie es auch der Compiler macht, von oben nach unten durch schaut den Code durch. Damit functionB aufgerufen werden kann, ist ein Prototyp dafür notwendig. Der kommt aus einem Header File, welches noch nicht existiert, aber im Laufe des Prozesses entstehen und FileB.h heissen wird. FileB.h deshalb, weil die Funktion in FileB.c enthalten ist und man zur Vermeidung von Konfusion die Header Files immer gleich benennt wie die C-Files, nur eben mit einer anderen Dateiendung. FileB.h wird noch geschrieben werden, das hindert uns jetzt aber nicht daran, so zu tun als ob es dieses schon geben würde und ein entsprechender #include ergänzt. (Solange nicht compiliert wird ist das ja auch kein Problem. Irgendwo muss man ja schliesslich mal anfangen die Ergänzungen zu machen.)<br />
<br />
<syntaxhighlight lang="c"><br />
// FileA.c<br />
<br />
#include "FileB.h"<br />
<br />
int VarExtA;<br />
int VarIntA;<br />
<br />
#define PortpinX PortA.1<br />
<br />
int functionA( void )<br />
{<br />
VarIntA = VarExtB;<br />
functionB();<br />
PortpinX = 1;<br />
};<br />
</syntaxhighlight><br />
<br />
Gut. Die Variable VarExtB wird ebenfalls über den include hereingezogen<br />
werden. Damit ist FileA.c erst mal vollständig. Da fehlt jetzt erst mal nichts mehr. Alles was in FileA.c vorkommt sind entweder C-Schlüsselwörter, durch FileA.c selbst definiert oder kommt über den #include herein.<br />
<br />
Der nächste Schritt ist die Überlegung: Was von dem Zeugs in FileA.C soll von anderer Stelle (von anderen C-Files aus) benutzt und verwendet werden können.<br />
Welche Dinge muss FileA von sich preis geben.<br />
<br />
Da sind zu erst mal die beiden Variablen. Was soll mit denen geschehen?<br />
VarExtA soll von aussen zugreifbar sein, VarIntA nicht. Und dann<br />
natürlich die Funktion, die aufrufbar sein soll.<br />
<br />
Also beginnt man ein Header File für FileA.c zu schreiben, in das all das<br />
reinkommt, was FileA.c nach aussen sichtbar machen will.<br />
<br />
<syntaxhighlight lang="c"><br />
// FileA.h<br />
<br />
extern int VarExtA;<br />
<br />
int functionA( void );<br />
</syntaxhighlight><br />
<br />
Die Variable kriegt ein extern davor (und wird damit zu einer Deklaration), bei der Funktion wird einfach die Implementierung weggenommen und die somit zu einer Deklaration veränderte Zeile mit einem ; abgeschlossen. Wenn man möchte kann man den so geschaffenen Prototypen auch mit einem extern einleiten. Notwendig ist es aber nicht.<br />
<br />
Erneuter Blick aufs Header File. Kommt da irgendwas vor, was nicht<br />
Standard C Schlüsselwort ist? Nein. Nichts.<br />
Also ist dieses Header File somit ebenfalls in sich vollständig.<br />
<br />
Zur Sicherheit wird in FileA.c noch einen Include auf das<br />
eigene Header File hinzugefügt, denn dann kann der Compiler überprüfen ob die<br />
Angaben im Header File mit der tatsächlichen Implementierung<br />
übereinstimmen. Und da VarIntA von aussen nicht sichtbar sein soll (auch<br />
nicht durch Tricks), wird sie static gemacht.<br />
<br />
<syntaxhighlight lang="c"><br />
// FileA.c<br />
<br />
#include "FileA.h"<br />
#include "FileB.h"<br />
<br />
int VarExtA;<br />
static int VarIntA;<br />
<br />
#define PortpinX PortA.1<br />
<br />
int functionA( void )<br />
{<br />
VarIntA = VarExtB;<br />
functionB();<br />
PortpinX = 1;<br />
}<br />
</syntaxhighlight><br />
<br />
Dasselbe für FileB.c. Erst mal einfach runterschreiben<br />
<syntaxhighlight lang="c"><br />
// FileB.c<br />
<br />
int VarExtB;<br />
int VarIntB;<br />
<br />
#define SettingB 0x01<br />
<br />
int functionB( void )<br />
{<br />
VarExtA = 1;<br />
functionA();<br />
VarIntB = SettingB;<br />
<br />
MeinePrivateFunktion();<br />
}<br />
<br />
void MeinePrivateFunktion()<br />
{<br />
VarIntB = 8;<br />
}<br />
</syntaxhighlight><br />
<br />
damit functionA aufgerufen werden kann, braucht es wieder einen Prototypen. Den<br />
kriegt man über von FileA.h, welches daher includiert wird.<br />
<br />
<syntaxhighlight lang="c"><br />
// FileB.c<br />
<br />
#include "FileA.h"<br />
<br />
int VarExtB;<br />
int VarIntB;<br />
<br />
#define SettingB 0x01<br />
<br />
int functionB( void )<br />
{<br />
VarExtA = 1;<br />
functionA();<br />
VarIntB = SettingB;<br />
MeinePrivateFunktion();<br />
}<br />
<br />
void MeinePrivateFunktion()<br />
{<br />
VarIntB = 8;<br />
}<br />
</syntaxhighlight><br />
<br />
Was noch? VarExtA. Diese Variable wird aber ebenfalls durch den #include als extern Deklaration ins FileB.c hereingezogen und ist somit bei der Übersetzung von FileB.c bekannt. Kommt sonst noch etwas vor? MeinePrivateFunktion. Diese Funktion soll nur in FileB.c benutzt werden und ist für jemanden ausserhalb FileB.c völlig uninteressant. Nichts destotrotz gilt die Regel: compiliert wird von oben nach unten und verwendet werden kann nur etwas, was auch bekannt ist. D.h. bevor der Aufruf der Funktion in functionB gemacht werden kann, muss es einen Protoypen der Funktion geben. Da diese Funktion aber nicht nach 'aussen' exportiert wird, macht man den Protoypen gleich in das C-File mit hinein.<br />
<br />
<syntaxhighlight lang="c"><br />
// FileB.c<br />
<br />
#include "FileA.h"<br />
<br />
int VarExtB;<br />
int VarIntB;<br />
<br />
#define SettingB 0x01<br />
<br />
void MeinePrivateFunktion();<br />
<br />
int functionB( void )<br />
{<br />
VarExtA = 1;<br />
functionA();<br />
VarIntB = SettingB;<br />
MeinePrivateFunktion();<br />
}<br />
<br />
void MeinePrivateFunktion()<br />
{<br />
VarIntB = 8;<br />
}<br />
</syntaxhighlight><br />
<br />
Würde man die Funktion vorziehen, so dass der Funktionskörper vor der ersten Verwendung steht, dann würde man auch keinen Protoypen benötigen. Eine Funktionsdefinition fungiert als ihr eigener Protoyp.<br />
<br />
Kommt sonst noch etwas vor? Nix mehr. In FileB.c wird sonst nix mehr verwendet was nicht entweder C Schlüsselwort oder im File selber oder durch einen #include reinkommt.<br />
<br />
Dann wieder: das Header File für B schreiben. Dabei einfach nur überlegen: was soll von FileB.c nach aussen getragen werden?<br />
<br />
<syntaxhighlight lang="c"><br />
// FileB.h<br />
<br />
extern int VarExtB;<br />
<br />
int functionB( void );<br />
</syntaxhighlight><br />
<br />
und zur Sicherheit wieder ins eigene C-File includen und alle Variablen<br />
(oder auch Funktionen), die von aussen nicht sichtbar sein sollen, als<br />
static markieren.<br />
<br />
<syntaxhighlight lang="c"><br />
// FileB.c<br />
<br />
#include "FileB.h"<br />
#include "FileA.h"<br />
<br />
int VarExtB;<br />
static int VarIntB;<br />
<br />
#define SettingB 0x01<br />
<br />
static void MeinePrivateFunktion();<br />
<br />
int functionB( void )<br />
{<br />
VarExtA = 1;<br />
functionA();<br />
VarIntB = SettingB;<br />
MeinePrivateFunktion();<br />
}<br />
<br />
void MeinePrivateFunktion()<br />
{<br />
VarIntB = 8;<br />
}<br />
</syntaxhighlight><br />
<br />
damit bleibt nur noch main.c. Auch dieses wird erst mal einfach runtergeschrieben.<br />
<br />
<syntaxhighlight lang="c"><br />
int c;<br />
<br />
int main()<br />
{<br />
functionA();<br />
functionB();<br />
VarExtA = 1;<br />
VarExtB = c;<br />
}<br />
</syntaxhighlight><br />
<br />
Damit functionA aufgerufen werden kann, braucht es einen Prototypen. Woher kommt er? Aus FileA.h. Also gleich mal includen<br />
<syntaxhighlight lang="c"><br />
#include "FileA.h"<br />
<br />
int c;<br />
<br />
int main()<br />
{<br />
functionA();<br />
functionB();<br />
VarExtA = 1;<br />
VarExtB = c;<br />
}<br />
</syntaxhighlight><br />
<br />
Damit functionB aufgerufen werden kann, braucht es einen Prototypen. Wo<br />
kommt der her? Aus FileB.h. Also noch ein #include<br />
<syntaxhighlight lang="c"><br />
#include "FileA.h"<br />
#include "FileB.h"<br />
<br />
int c;<br />
<br />
int main()<br />
{<br />
functionA();<br />
functionB();<br />
VarExtA = 1;<br />
VarExtB = c;<br />
}<br />
</syntaxhighlight><br />
<br />
Fehlt noch was? VarExtA ist durch den #include von FileA.h bereits<br />
abgedeckt und VarExtB ist durch den #include von FileB.h bereits<br />
abgedeckt. Also fehlt nix mehr. Auch in main.c sind damit alle Sachen<br />
abgedeckt und es ist in sich vollständig.<br />
<br />
Das ist der Standardmechanismus:<br />
* Implementierung der Funktionen im C File schreiben<br />
* Überlegen, was von dieser Implementierung von aussen sichtbar sein soll.<br />
* Dasjenige kommt als Deklaration ins Header File, alles andere am besten static machen.<br />
* Für alles im C-File, das seinerseits woanders herkommt, gibt es einen #include, der das jeweils notwendige Header File einbindet.<br />
* Werden im Header File Dinge von woanders benutzt, dann enthält das Header File einen entsprechenden #include<br />
* Jedes File, sowohl Header-File als auch C-File ist in sich vollständig. Werden dort Dinge benutzt, dann müssen diese vor der Verwendung deklariert worden sein. Wie und wo diese Deklaration herkommt, ist dabei zweitrangig. Es kann sein, dass die Deklaration vor der Verwendung steht, es kann aber auch sein, dass die Deklaration über einen weiteren Include mit aufgenommen wird.<br />
<br />
= Ich hab da mehrere *.c und *.h Dateien. Was mache ich damit? =<br />
<br />
[[Bild:c-flow.svg|right|thumb|260px|C-Programmierung: Workflow]]<br />
Zunächst ist es wichtig, sich zu vergegenwärtigen, wie C-Compiler und Linker zusammenarbeiten. Ein komplettes Programmier-Projekt kann und wird im Normalfall aus mehreren Quelldateien bestehen, die alle zusammengenommen das komplette Programm bilden.<br />
<br />
Der Prozess des Erstellens des Programmes geschieht in mehrerern Schritten:<br />
;Compilieren: zunächst werden alle Einzelteile (jede *.c Datei) für sich ''compiliert''. Dabei ensteht aus jeder c-Datei eine sogenannte Object-Datei, in der bereits der Maschinencode für die im c-File programmierten Funktionen enthalten ist<br />
;Linken: die einzelnen Object-Dateien werden mit zusätzlichen Bibliotheken und dem Startup-Code zum fertigen Programm ''gelinkt''.<br />
{{Absatz}}<br />
Angenommen, das komplette Projekt besteht aus 2 Dateien:<br />
<br />
;main.c:<br />
<syntaxhighlight lang="c"><br />
int twice (int);<br />
<br />
int main()<br />
{<br />
twice (5);<br />
}<br />
</syntaxhighlight><br />
<br />
;func.c:<br />
<syntaxhighlight lang="c"><br />
int twice (int number)<br />
{<br />
return 2 * number;<br />
}<br />
</syntaxhighlight><br />
<br />
Dann werden <tt>main.c</tt> und <tt>func.c</tt> ''unabhängig'' voneinander compiliert. Als Ergebnis erhält man die Dateien <tt>main.o</tt> und <tt>func.o</tt>, die den besagten Object-Code enthalten.<br />
Diese beiden Zwischenergebnisse werden dann zusammen mit Bibliotheken zum fertigen Programm gebunden (gelinkt), das dann ausgeführt werden kann.<br />
<br />
Bekommt man also von irgendwo bereits fertige *.c (und zugehörige *.h) Dateien, so genügt es, die *.c Dateien in das Projekt mit aufzunehmen. Dadurch wird das entsprechende C-File compiliert und das Ergebnis davon, das Object-file, wird dann in das fertige Programm mit eingelinkt.<br />
<br />
;Achtung: Da jede der C-Dateien unabhängig von allen anderen compiliert wird, bedeutet das auch, dass jede der C-Dateien in sich vollständig sein muss!<br />
<br />
Wie eine C-Datei in das Projekt mit aufgenommen wird, hängt im wesentlichen von der benutzten Entwicklungsumgebung ab.<br />
<br />
== Makefile ==<br />
<br />
Die zusätzliche *.c Datei wird in die SRC Zeile im makefile eingetragen.<br />
<br />
== AVR-Studio ==<br />
<br />
Hier ist es besonders einfach, eine Datei in das Projekt mit aufzunehmen. Dazu wird im Projektbaum der Knoten "Source Files" aktiviert und mit der rechten Maustaste das Kontextmenü geöffnet. Im Menü wird der Punkt "Add existing Source File(s)" ausgewählt, und anschliessend zeigt man AVR-Studio das zusätzliche C-File. AVR-Studio berücksicht dann diese Datei bei der Projekterzeugung, compiliert es und sorgt dafür, dass es zum fertigen Programm dazugelinkt wird.<br />
<br />
=Globale Variablen über mehrere Dateien=<br />
Ein häufiger Problemkreis in der C Programmierung sind auch globale Variablen, die von mehreren *.c Dateien aus benutzt werden sollen. Was hat es damit auf sich?<br />
<br />
Zunächst mal muß man bei der Vereinbarung von Variablen zwischen ''Definition'' und ''Deklaration'' unterscheiden:<br />
;Definition: Mit einer Definition wird der Compiler angewiesen, eine Variable tatsächlich zu erzeugen. Damit er das kann, muß ihm selbstverständlich der exakte Datentyp und auch der Name der Variablen zur Verfügung stehen. Eine Definition sorgt also dafür, dass im späteren Programm Speicherplatz für diese Variable reserviert wird<br />
;Deklaration: Mit einer Deklaration teilt man dem Compiler lediglich mit, dass eine Variable existiert. An dieser Stelle soll der Compiler also keinen Speicherplatz reservieren, sondern der Compiler soll einfach nur zur Kenntniss nehmen, daß es eine Variable mit einem bestimmten Namen gibt und von welchem Datentyp sie ist.<br />
<br />
Aus obigem folgt sofort, dass eine Definition auch immer eine Deklaration ist. Denn dadurch, daß der Compiler angewiesen wird eine Variable auch tatsächlich zu erzeugen, folgt, dass er dazu auch dieselben Informationen benötigt, die auch in einer Deklaration angegeben werden müssen. Der einzige Unterschied: Bei einer Deklaration trägt der Compiler nur in seinen internen Tabellen ein, dass es diese Variable tatsächlich gibt, während er bei einer Definition zusätzlich auch noch dafür sorgt, dass im fertigen Programm auch Speicher für diese Variable bereitgestellt wird.<br />
<br />
Warum ist diese Unterscheidung wichtig?<br />
<br />
Weil es in C die sog. ''One Definition Rule'' (ODR). Sie besagt, dass in einem vollständigen Programm, also über alle *.c Dateien gesehen, es für eine Variable nur <b>eine</b> Definition geben darf. Es darf allerdings beliebig viele Deklarationen geben, solange diese Deklarationen alle im Datentyp übereinstimmen. Kurz gesagt: Man darf den Compiler nur einmal auffordern, eine Variable zu erzeugen (Definition), kann sich aber beliebig oft auf diese eine Variable beziehen (Deklarationen). Aber Vorsicht! Da der Compiler jede einzelne *.c Datei für sich alleine übersetzt und dabei kein Wissen von ausserhalb benutzt, obliegt es der Verantwortung des Programmierers dafür zu sorgen, dass alle Deklarationen im Datentyp übereinstimmen. Der Compiler kann diese Einhaltung prinzipbedingt nicht überwachen!<br />
<br />
Woran erkennt man eine Definition bzw. Deklaration?<br />
<br />
Eine Definition einer globalen Variable steht immer ausserhalb eines Funktionsblocks. Zb.<br />
<syntaxhighlight lang="c"><br />
int MyData; // Globale Variable namens MyData. Sie ist vom Typ int<br />
char Name[30]; // Globales Array<br />
long NrElements = 5; // Globale Variable, die auch noch initialisiert wird<br />
</syntaxhighlight><br />
<br />
Eine Deklaration unterscheidet sich von einer Definition in 2 Punkten<br />
* Es wird das Schlüsselwort <tt>extern</tt> vorangestellt.<br />
* Es kann keine Initialisierung geben. Sobald eine Initialisierung vorhanden ist, wird das Schlüsselwort <tt>extern</tt> ignoriert und aus der Deklaration wird eine Definition.<br />
<br />
Beispiele für Deklarationen<br />
<syntaxhighlight lang="c"><br />
extern int MyData;<br />
extern char Name[30];<br />
extern long NrElements;<br />
extern long NrElements = 5; // Achtung: Dies ist eine Definition!<br />
</syntaxhighlight><br />
<br />
Besitzt man also 2 *.c Dateien, main.c und helpers.c, und sollen sich diese beiden Dateien eine globale Variable teilen, so muss in eine Datei eine Definition hinein, während in die andere Datei eine Deklaration derselben Variablen erfolgen muß. Traditionell werden die Definitionen in der *.c-Datei gemacht, die als Hauptdatei des Moduls fungiert, zu der diese Variable konzeptionell gehört. Im Zweifel ist das die *.c Datei, in der main() enthalten ist. Das muss nicht so sein, ist aber eine Konvention, die oft Sinn macht. Alternativ wird auch gerne oft eine eigene *.c Datei (zb. globals.c) gemacht, die einzig und alleine die Defintionen der globalen Variablen enthält.<br />
<br />
main.c<br />
<syntaxhighlight lang="c"><br />
int AnzahlElemente; // Dies ist die Definition. Hier wird die globale<br />
// Variable AnzahlElemente tatsächlich erzeugt.<br />
<br />
int main()<br />
{<br />
AnzahlElemente = 8;<br />
...<br />
}<br />
</syntaxhighlight><br />
<br />
helpers.c<br />
<syntaxhighlight lang="c"><br />
extern int AnzahlElemente; // Dies ist die Deklaration die auf die globale<br />
// Variable AnzahlElemente in main.c verweist.<br />
// Wichtig: Der Datentyp muss mit dem in main.c<br />
// angegebenen übereinstimmen<br />
<br />
void foo()<br />
{<br />
...<br />
j = AnzahlElemente;<br />
AnzahlElemente = 9;<br />
}<br />
</syntaxhighlight><br />
<br />
==Praktische Durchführung==<br />
Besteht ein vollständiges Programm aus mehreren *.c Dateien, dann kann man sich vorstellen, daß es mühsam ist, alle Deklarationen immer auf gleich zu halten. Hier bietet sich der Einsatz eines Header Files an, in der die Deklarationen stehen und welches in die jeweiligen *.c Dateien inkludiert wird<br />
<br />
Bsp:<br />
<br />
Global.h<br />
<syntaxhighlight lang="c"><br />
extern int Anzahl;<br />
</syntaxhighlight><br />
<br />
main.c<br />
<syntaxhighlight lang="c"><br />
#include "Global.h"<br />
<br />
int Anzahl; // auch wenn Global.h inkludiert wurde, so muss es eine<br />
// Definition der Variablen geben. In Global.h sind ja nur<br />
// Deklarationen.<br />
<br />
int main()<br />
{<br />
...<br />
Anzahl = 5;<br />
}<br />
</syntaxhighlight><br />
<br />
foo.c<br />
<syntaxhighlight lang="c"><br />
#include "Global.h"<br />
<br />
void foo()<br />
{<br />
...<br />
Anzahl = 8;<br />
...<br />
}<br />
</syntaxhighlight><br />
<br />
bar.c<br />
<syntaxhighlight lang="c"><br />
#include "Global.h"<br />
<br />
void bar()<br />
{<br />
...<br />
j = Anzahl;<br />
}<br />
</syntaxhighlight><br />
<br />
Auf diese Art kann man erreichen, dass zumindest alle Deklarationen ein und derselben Variablen in einem Programm übereinstimmen. Die Datei Global.h wird auch in main.c inkludiert, obwohl man das eigentlich nicht müsste, denn dort wird die Variable ja definiert. Durch die Inclusion ermöglicht man aber dem Compiler die Überprüfung ob die Deklaration auch tatsächlich mit der Definition übereinstimmt.<br />
<br />
Solange kein Initialisierungen der globalen Variablen notwendig sind, gibt es noch einen weiteren Trick, um sich selbst das Leben und die Verwaltung der globalen Variablen zu erleichtern.<br />
Worin besteht das Problem?<br />
Das Problem besteht darin, dass man bei Einführung einer neuen globalen Variablen an 2 Stellen erweitern muss: Zum einen in der Header-Datei, die die 'extern'-Deklaration der Variablen enthält, zum anderen muss in einer C-Datei die Definition der Variablen erfolgen. Das kann man sich mit etwas Präprozessorarbeit auch einfacher machen:<br />
<br />
Global.h<br />
<syntaxhighlight lang="c"><br />
#ifndef EXTERN<br />
#define EXTERN extern<br />
#endif<br />
<br />
EXTERN int Anzahl;<br />
</syntaxhighlight><br />
<br />
main.c<br />
<syntaxhighlight lang="c"><br />
#define EXTERN<br />
#include "Global.h"<br />
<br />
int main()<br />
{<br />
...<br />
Anzahl = 5;<br />
}<br />
</syntaxhighlight><br />
<br />
foo.c<br />
<syntaxhighlight lang="c"><br />
#include "Global.h"<br />
<br />
void foo()<br />
{<br />
...<br />
Anzahl = 8;<br />
...<br />
}<br />
</syntaxhighlight><br />
<br />
Wie funktioniert das Ganze? Im Grunde muss man nur dafür sorgen, dass der Compiler an ''einer'' Stelle das Schlüsselwort '''extern''' ignoriert (hier in main.c) und bei allen anderen Inclusionen beibehält. Dadurch das ein Präprozessor-ifndef benutzt wird, kann dieses erreicht werden. Wird das Header File includiert und ist zu diesem Zeitpunkt das Makro '''EXTERN''' noch nicht definiert, so wird innerhalb des Header Files '''EXTERN''' zu '''extern''' definiert und damit in weiterer Folge im Quelltext '''EXTERN''' durch '''extern''' ersetzt. Wenn daher foo.c das Header File inkludiert, wird die Zeile<br />
<syntaxhighlight lang="c"><br />
EXTERN int Anzahl;<br />
</syntaxhighlight><br />
vom Präprozessor zu<br />
<syntaxhighlight lang="c"><br />
extern int Anzahl;<br />
</syntaxhighlight><br />
umgewandelt.<br />
<br />
In main.c hingegen sieht die Include-Sequenz so aus<br />
<syntaxhighlight lang="c"><br />
#define EXTERN<br />
#include "Global.h"<br />
</syntaxhighlight><br />
Wenn Global.h bearbeitet wird, existiert bereits ein Makro '''EXTERN''', das auf einen leeren Text expandiert. Dadurch wird verhindert, dass innerhalb von Global.h das Makro '''EXTERN''' mit dem Text '''extern''' belegt wird und<br />
<syntaxhighlight lang="c"><br />
EXTERN int Anzahl;<br />
</syntaxhighlight><br />
wird daher vom Präprozessor zu<br />
<syntaxhighlight lang="c"><br />
int Anzahl;<br />
</syntaxhighlight><br />
erweitert, genau wie es benötigt wird.<br />
<br />
= Was hat es mit volatile auf sich? =<br />
Immer wieder hört man im Forum die pauschale Aussage "Variablen die in einer ISR verwendet werden, müssen volatile sein". Nun, das ist so nicht ganz richtig.<br />
Welches Problem löst denn eigentlich volatile? Was ist denn das eigentliche Problem, das einer Lösung bedarf?<br />
<br />
Das Problem findet sich diesmal im Optimierer eines C Compilers. C Compiler übersetzen, wenn sie optimieren dürfen, den C Code nicht direkt so, wie ihn der Programmierer geschrieben hat, sondern sie versuchen Ressourcen einzusparen. Das kann sowohl Programmspeicher als auch Laufzeit, häufig auch beides gemeinsam sein. Zu diesem Zweck untersuchen sie das Programm und versuchen in der funktional gleichwertigen, in Maschinensprache übersetzen Version, Anweisungen einzusparen. Das dürfen sie auch. Der C-Standard erlaubt Optimierungen, solange die 'As-If'-Regel eingehalten wird. Das bedeutet: Der Compiler darf das Programm umstellen und verändern, solange die Programmergebnisse dieselben bleiben. Eben "As-if" die Optimierung nie stattgefunden hätte.<br />
<br />
Nehmen wir ein Beispiel<br />
<syntaxhighlight lang="c"><br />
i = 2;<br />
<br />
if( i == 5 )<br />
j = 8;<br />
else<br />
j = 6;<br />
</syntaxhighlight><br />
In diesem Programmausschnitt darf der Compiler seine Kenntnisse ausnutzen. Er weiß an dieser Stelle, dass i den Wert 2 hat. Damit ist aber auch klar, dass die Bedingung niemals wahr sein kann, denn 2 kann niemals gleich 5 sein. Wenn die Bedingung aber niemals wahr sein kann, dann kann auch die Zuweisung von 8 an j niemals ausgeführt werden. Der Compiler kann also diesen Programmtext zu diesem hier kürzen<br />
<syntaxhighlight lang="c"><br />
i = 2;<br />
j = 6;<br />
</syntaxhighlight><br />
ohne das sich an den Programmergebnissen etwas ändert. Die zweite Version ist aber kürzer und wird, wegen des Wegfalles des Vergleiches, auch schneller ausgeführt.<br />
<br />
Eine andere Form der Optimierung betrifft die Verwaltung von µC-Ressourcen und da wieder ganz speziell die Register. Variablen werden ja erst mal im SRAM-Speicher des µC angelegt. Um mit den Werten von Variablen arbeiten zu können, müssen diese Wert aber vom SRAM-Speicher in µC-Register überführt werden (Register kann man sich wie Speicherstellen in der eigentlichen CPU vorstellen). Nur dort können diese Werte mittels Maschinenbefehlen manipuliert werden.<br />
Jetzt haben aber µC nicht beliebig viele Register. Das bedeutet aber auch, der Compiler muss darüber Buch führen, welche Werte (welche Variablen) gerade in welchen Registern liegen und wenn alle Register belegt sind, muss ein anderes Register freigeräumt werden, in dem der Wert aus dem Register wieder ins SRAM zurück übertragen wird.<br />
Allerdings kostet das auch Zeit. Der Compiler wird daher versuchen, Variablen, die in einem Programmstück oft benötigt werden, für längere Zeit in den Registern zu halten, um das Registerladen bzw. -zurückschreiben einzusparen. Die Grundannahme lautet dabei immer: In Anweisungen, in denen eine Variable nicht vorkommt, kann diese Variable auch nicht verändert werden. Im Programmstück<br />
<br />
<syntaxhighlight lang="c"><br />
while( 1 ) {<br />
if( i == 5 )<br />
j = 8;<br />
}<br />
</syntaxhighlight><br />
gibt es für i keine Möglichkeit, verändert zu werden. Der Compiler kann daher entscheiden, dass er diese Variable, *an dieser Stelle*, gar nicht aus dem SRAM laden muss, sondern sich den entsprechenden Wert in einem Register vorhält und dieses Register ausschließlich dafür reserviert. (Er könnte auch entscheiden, dass der Code nie ausgeführt werden kann, aber das ist eine andere Geschichte)<br />
<br />
Der springende Punkt ist nun, dass der Compiler hier eine zu kleine Sicht der Dinge hat. Betrachtet man nur dieses Code Stück, dann gibt es tatsächlich für i keine Möglichkeit, seinen Wert zu verändern. Aber die Dinge ändern sich, wenn Interrupts ins Spiel kommen.<br />
<br />
<syntaxhighlight lang="c"><br />
uint8_t i;<br />
<br />
ISR( irgendein_Interrupt )<br />
{<br />
i = 5;<br />
}<br />
<br />
int main()<br />
{<br />
...<br />
<br />
while( 1 ) {<br />
if( i == 5 )<br />
j = 8;<br />
}<br />
}<br />
</syntaxhighlight><br />
Jetzt gibt es plötzlich eine Möglichkeit, wie i seinen Wert ändern kann: Wenn der entsprechende Interrupt ausgelöst wird, dann wird i auf den Wert 5 gesetzt. i, das ist aber nichts anderes als ein bestimmter Speicherbereich im SRAM. D.h. im SRAM wird die Variable tatsächlich korrekt auf den Wert 5 gesetzt. Nur: Als der Compiler die while-Schleife übersetzt hat, wusste er nichts davon, dass diese Möglichkeit existiert. Er hat entschieden, dass er an dieser Stelle den Wert der Variablen in einem CPU-Register halten wird, um Zugriffe einzusparen. Nur wird diese Kopie des Wertes im Register natürlich nicht verändert, wenn in der ISR das Original von i im SRAM verändert wird.<br />
Fazit: Obwohl die ISR die Variable tatsächlich verändert, kriegt das der Code im while nicht mit, weil der Compiler es mit der Optimierung an dieser Stelle übertrieben hat. In der while-Schleife wird mit einer Kopie des Wertes von i in einem Register gearbeitet und nicht mit dem originalen Wert von i im SRAM.<br />
<br />
Und an dieser Stelle kommt jetzt volatile ins Spiel.<br />
<br />
volatile teilt dem Compiler mit, dass ausnahmslos alle Zugriffe auf eine Variable auch tatsächlich auszuführen sind und keine Optimierungen gemacht werden dürfen, weil eine Variable auf Wegen benutzt werden kann, die für den Compiler prinzipiell nicht einsichtig sind. Im obigen Beispiel könnte man argumentieren, dass der Compiler ja wohl die ISR bemerken könne und daher feststellen könnte, dass i tatsächlich verändert wird. Aber das stimmt so in der allgemeinen Form nicht. Niemand sagt, dass der Compiler die ISR überhaupt zu Gesicht bekommen muss, die könnte ja auch in einem ganz anderen C File stecken.<br />
<br />
<syntaxhighlight lang="c"><br />
volatile uint8_t i;<br />
<br />
ISR( irgendein_Interrupt )<br />
{<br />
i = 5;<br />
}<br />
<br />
int main()<br />
{<br />
...<br />
<br />
while( 1 ) {<br />
if( i == 5 )<br />
j = 8;<br />
}<br />
}<br />
</syntaxhighlight><br />
wird i volatile gemacht, so verbietet man damit dem Compiler explizit, Annahmen über den Datenfluss von i zu treffen. Innerhalb der Schleife muss also tatsächlich jedes Mal wieder erneut i aus dem SRAM geholt werden und mit 5 verglichen werden. Abkürzungen durch Mehrfachverwendung von Registern oder sonstigen Optimierungstricks sind nicht erlaubt. Und damit ist das Problem gelöst. Wird i in der ISR verändert, so bekommt das auch die Abfrage mit, weil ja jetzt auf jeden Fall auf das Original im SRAM zurückgegriffen wird.<br />
<br />
Das Gleiche gilt auch ebenso "in die andere Richtung", wenn also i in der Schleife geändert und in der ISR nur gelesen wird. Auch hier könnte die Optimierung negativ zuschlagen und den Schreibzugriff nur auf eine lokale Kopie der Variable in einem Register durchführen (oder gar ganz wegfallen) lassen, weil der Lesezugriff außerhalb des direkten Programmflusses (in der ISR) für den Compiler nicht ersichtlich ist.<br />
<br />
Ein anderes Problem (das ebenfalls mittels volatile gelöst wird) sind Variablen, die tatsächlich im Code überhaupt nie aktiv verändert werden, sondern es sich um Zusatzhardware handelt, die so verschaltet ist, dass sie im Programm in Form einer Variablen auftaucht, z.B. ein Uhren-IC (oder auch ganz banal: Portpins). In diesem Fall wird z.B. die Variable für Sekunden vom Programm gar nicht vom Programm selber verändert, ändert aber trotzdem ihren Inhalt. Die Zusatzhardware selbst macht das. Aus Programmsicht handelt es sich um Speicherzellen, die magisch selbsttätig ihren Wert ändern. Und damit dürfen selbstverständlich auch hier keinerlei Annahmen über den Inhalt der Variablen getroffen werden. Eine derart angebundene externe Hardware nennt man übrigens "memory-mapped", weil sie ihre Werte ins Memory (=Hauptspeicher) mapped (=einblendet).<br />
<br />
Allerdings kann volatile nur bei den Variablen sinnvoll genutzt werden, die "von außen" auch änderbar sind. Bei lokalen Variablen, auch statischen, einer Funktion kann das nur passieren, wenn ihre Adresse einer ISR z.B. durch einen globalen Pointer bekannt gemacht wird.<br />
<syntaxhighlight lang="c"><br />
uint8_t *v;<br />
ISR( irgendein_Interrupt )<br />
{<br />
i = 5;<br />
*v = 42;<br />
}<br />
<br />
int main()<br />
{<br />
uint8_t i; // kann sich nie unerwartet ändern -> volatile nutzlos, behindert nur Optimizer<br />
<br />
volatile uint8_t j; // kann sich unerwartet ändern (über globalen *v)<br />
v = &j;<br />
...<br />
while( 1 ) {<br />
if( i == 5 )<br />
j = 8;<br />
if( j == 5 )<br />
i = 3;<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
= Konstanten an fester Flash-Adresse =<br />
<br />
Wie kann man eine Konstante an entsprechender Adresse im Flash ablegen?<br />
<br />
Mehmet Kendi hat eine Lösung für [[AVR Studio]] & [[WinAVR]] in <br />
[http://www.mikrocontroller.net/topic/142704#1453079] angegeben.<br />
<br />
= Timer =<br />
== Was macht ein Timer? ==<br />
Oft hört man im Forum die Aussage: Timer sind so kompliziert!<br />
<br />
Aber eigentlich stimmt das nicht. Ganz im Gegenteil, Timer sind eigentlich eine sehr einfache Sache. Was genau macht eigentlich ein Timer? Die Antwort lautet: er zählt unabhängig vom restlichen Programmfluss vor sich hin. Und? Was macht er noch? Nichts. Das wars schon. Im Kern ist genau das auch schon alles was ein Timer macht.<br />
[[Bild:Timer_Basis.gif|framed|center|ein 8-Bit Timer bei der Arbeit]]<br />
<br />
== Wie schnell macht er es? ==<br />
Aber so einfach ist die Sache dann doch wieder nicht. Da erhebt sich zunächst mal die Frage: wie schnell zählt denn eigentlich so ein Timer? Normalerweise ist der Timer mit der Taktfrequenz des Prozessors gekoppelt, so dass zb bei einer Taktfrequnz von 1Mhz der Timer auch genau so schnell zählt. In 1 Sekunde zählt ein Timer also von 0 bis 1000000, also 1 Mio Zählschritte. Nun kann aber ein beispielsweise 8-Bit Timer nicht bis 1000000 zählen, dazu ist er nicht groß genug. Mit 8 Bit kann man bis 255 zählen. Zählt man da dann noch 1 dazu, dann läuft der Timer über und beginnt wieder bei 0. Man kann daher ruhigen Gewissens sagen: In 1 Sekunde zählt dieser Timer 3906 mal den Bereich von 0 bis 255 (und weiter auf 0) durch (das sind 256 Zählschritte) und zuätzlich schafft er es danach noch bis 64 zu zählen. Denn 3906 * 256 + 64 = 1000000 und wir haben wieder die 1 Mio Zählschritte, die der Timer in 1 Sekunde erledigt.<br />
<br />
Das ist ganz schön schnell. Und weil das oft zu schnell ist, hat jeder Timer noch die Möglichkeit sogenannte Vorteiler (Prescaler) vor den Zähltakt zu schalten. Zb einen Vorteiler von 8. Anstelle von 1Mhz bekommt der Timer dann eine Frequenz von 1Mhz / 8 (= 125kHz) präsentiert. Und dementsprechend würde er in 1 Sekunde dann nur noch von 0 bis 125000 (= 1.000.000 / 8) zählen. Als 8 Bit Timer bedeutet das, dass er in 1 Sekunde jetzt nur noch 488 komplette Zyklen 0 bis 255 schafft und dann noch bis 72 zählen kann. Denn 488 * 256 + 72 = 125000<br />
<br />
== Das kann aber nicht alles gewesen sein? ==<br />
Bis jetzt ist das alles noch unspektakulär und man fragt sich: Was hab ich jetzt davon, wenn der Timer vor sich hinzählt? Nun, die Situation ändert sich, wenn man weiß, dass man bei bestimmten Ereignissen und/oder Zählerständen etwas auslösen lassen kann. So ist zb. dieser Überlauf von 255 auf 0 so ein Ereignis. Mittels eines Interrupts kann man auf dieses Ereignis reagieren lassen und als Folge davon wird eine Funktion vollautomatisch aufgerufen. Und zwar unabhängig davon, was der µC gerade sonst so tut. Und das ist schon recht cool, denn es bedeutet, dass man regelmäßig zu erfolgende Dinge in so eine ISR (Interrupt Service Routine, die Funktion die aufgerufen wird) stecken kann und der Timer sorgt ganz von alleine dafür, dass diese Funktionalität auch tatsächlich regelmäßig ausgeführt wird. Regelmäßig bedeutet in diesem Fall dann auch wirklich regelmäßig. Denn der Timer zählt ja losgelöst von den restlichen Arbeiten, die der µC sonst so erledigt, vor sich hin. Es spielt keine Rolle, ob der µC gerade mitten in einer komplizierten Berechnung steckt oder nicht. Der Timer zählt vor sich hin, und wenn das entsprechende Ereignis eintritt, wird der Interrupt ausgelöst. Und wenn der entsprechende Interrupt mit einer ISR-Funktion gekoppelt ist, dann wird der normale Programmfluss unterbrochen und der µC arbeitet genau diese eine Funktion ab. Und zwar in regelmässigen Zeitabständen, weil ja auch der Interrupt regelmässig auftritt.<br />
[[Bild:Timer_ISR.gif|framed|center|ein 8-Bit Timer löst durch seinen Overflow regelmäßige ISR Aufrufe aus]]<br />
Gut, beispielsweise 488 mal in der Sekunde mag für so manchen Zweck zu oft sein, aber es gibt ja auch noch andere Vorteiler (welche steht im Datenblatt) und dann kann man ja auch innerhalb der ISR in einer lokalen Variablen mitzählen und zb nur bei jedem 2.ten Aufruf eine Aktion machen, die dann nur noch 244 mal in der Sekunde ausgeführt wird. Hier gibt es also mehrere Möglichkeiten, wie man die Aufrufhäufigkeit weiter herunterteilen kann, so dass man sich der Zahl annähert, die man benötigt.<br />
<br />
<syntaxhighlight lang="c"><br />
// Für einen Mega16.<br />
// Andere Prozessoren: siehe Datenblatt wie die Timerkonfiguration einzustellen ist<br />
<br />
#define F_CPU 1000000UL<br />
#include <avr/io.h><br />
#include <avr/interrupt.h><br />
<br />
//<br />
// der Timer wird mit 1Mhz getaktet. Vorteiler ist 8<br />
// d.h. der Timer läuft mit 125kHz und würde daher in 1 Sekunde<br />
// von 0 bis 124999 zaehlen.<br />
// Aber nach jeweils 256 Zaehlungen erfolgt ein Overflow.<br />
// Daher werden in 1 Sekunde 125000 / 256 = 488.28125 Overflows erzeugt<br />
// Oder anders ausgedrückt: 1 / 488.2815 = 0.002048<br />
// alle 0.002048 Sekunden erfolgt ein Overflow<br />
//<br />
ISR( TIMER0_OVF_vect ) // Overflow Interrupt Vector<br />
{<br />
static uint8_t swTeiler = 0;<br />
<br />
swTeiler++;<br />
if( swTeiler == 200 ) { // nur bei jedem 200.ten Aufruf. Effektiv teilt dieses die<br />
// die Aufruffrequenz des nachfolgenden Codes nochmal um<br />
swTeiler = 0; // einen Faktor 200. Der nachfolgende Code wird daher nicht<br />
// alle 0.002 Sekunden sondern alle 0.4096 Sekunden ausgeführt.<br />
// Das reicht, dass man eine LED am Port schon blinken sieht.<br />
PORTD = PORTD ^ 0xFF; // alle Bits am Port umdrehen, einfach damit sich was tut<br />
}<br />
}<br />
<br />
int main()<br />
{<br />
DDRD = 0xFF; // irgendein Port, damit wir auch was sehen<br />
<br />
TIMSK |= (1<<TOIE0); // den Overflow Interrupt des Timers freigeben<br />
TCCR0 = (1<<CS01); // Vorteiler 8, jetzt zählt der Timer bereits<br />
<br />
<br />
sei(); // und Interrupts generell freigeben<br />
<br />
<br />
while( 1 )<br />
{ // hier braucht nichts mehr gemacht werden.<br />
} // der Timer selbst sorgt dafür, dass die ISR Funktion<br />
} // regelmäßig aufgerufen wird<br />
</syntaxhighlight><br />
<br />
== CTC Modus ==<br />
Manchmal reicht das aber nicht. Benötigt man zb nicht 488 sondern möglichst genau 500 ISR Aufrufe in der Sekunde, so wird man weder mit Vorteiler noch durch Softwaremässiges Weiterteilen in der ISR zum Ziel kommen. Man kann natürlich die Taktfrequenz des kompletten Systems soweit umstellen, dass sich das alles ausgeht, aber oft ist das einfach nicht möglich. Was tun?<br />
<br />
Die Sache wäre einfacher, wenn man dem Timer vorschreiben könnte, nicht einfach nur von 0 bis 255 zu zählen, sondern wenn man ihm eine Obergrenze vorgeben könnte. Denn dann könnte man sich eine Obergrenze so bestimmen, dass dieser neue Zählbereich in 1 Sekunde ganz genau so oft durchlaufen werden kann, wie man es benötigt. Und hier kommt der sog. <b>CTC</b> Modus ins Spiel. Denn genau darin besteht sein Wesen: Man gibt dem Timer eine Obergrenze vor. Erreicht seine Zählung diesen Wert, so wird der Timer auf 0 zurückgesetzt und beginnt wieder von vorne. Genau das was wir benötigen. Wollen wir exakt 500 ISR Ausfrufe in der Sekunde haben (bei 1 Mhz Systemtakt), dann wählen wir einen Vorteiler von 8 und setzen die Obergrenze auf 250-1 (nicht vergessen: wir brauchen 250 Zählschritte, das bedeutet der Timer muss von 0 bis 249 zählen, denn auch der Überlauf von 249 zurück auf 0 ist ein Zählschritt). Der Timer taktet dann mit 1Mhz / 8 = 125kHz und da nach jeweils 250 Zählschritten die Obergrenze erreicht ist, wird diese Obergrenze in 1 Sekunde 125000 / 250 = 500 mal erreicht. Genau so wie wir das wollten.<br />
Wie wird dem Timer nun mitgeteilt, dass er eine spezielle Obergrenze benutzen soll? Nun, jeder Timer hat verschiedene Modi. Welche das bei einem konkreten µC und bei einem konkreten Timer genau sind, findet sich im Datenblatt im Abschnitt über die Timer. Normalerweise ist immer eines der letzteren Abschnitte eines jeden Kapitels im Datenblatt das interessantere: "Register Summary" oder "Register Description" genannt (die Datenblätter sind da nicht ganz einheitlich). So auch hier.<br />
[[Bild:FAQ_Datenblatt_Timer_Mega16.png|framed|center|Auszug aus dem Atmel Datenblatt für den Mega16 - Suche im Datenblatt]]<br />
In jedem Atmel Datenblatt findet sich bei jedem Timer immer auch besagter Abschnitt (im Inhaltsverzeichnis beim Kapitel über den jeweiligen Timer suchen. Im Datenblatt-PDF daher immer das Inhaltsverzeichnis anzeigen lassen!), und in diesem Abschnitt gibt es eine Tabelle, aus der hervorgeht, welche Modi es gibt, welche Bits dazu in den Konfigurationsregistern gesetzt werden müssen, wie sich dann die Obergrenze des Timer-Zählbereichs zusammensetzt und noch ein paar Angaben mehr. Beim Mega16 findet sich diese Tabelle für den Timer 0 zb auf Seite 83 und dort ist es die Tabelle 14.2. Diese Tabelle sieht im Datenblatt so aus<br />
<br />
<center><br />
{| {{Tabelle}} <br />
|- style="background-color:#ffddcc"<br />
! Mode || WGM01 || WGM00 || Timer/Counter || TOP || Update of || TOV0 Flag<br />
|- style="background-color:#ffddcc"<br />
! || (CTC0) || (PWM0) || Mode of Operation || || OCR0 || Set-on<br />
|-<br />
| 0 || 0 || 0 || Normal || 0xFF || Immediate || MAX<br />
|-<br />
| 1 || 0 || 1 || PWM, Phase Correct || 0xFF || TOP|| BOTTOM<br />
|-<br />
| 2 || 1 || 0 || CTC || OCR0 || Immediate || MAX<br />
|-<br />
| 3 || 1 || 1 || Fast PWM || 0xFF || BOTTOM || MAX<br />
|}<br />
</center><br />
<br />
Dort beginnt man mit der Recherche und sucht sich die Bits für den gewünschten Modus raus. Mit diesen Bits sieht man dann in den Konfigurationsregistern nach, welches Bit zu welchem Register gehört und setzt es ganz einfach. In unserem Fall möchten wir den CTC Modus, also den Modus 2. Dazu muss das Bit WGM01 gesetzt werden und WGM00 muss auf 0 bleiben. Im Datenblatt ein wenig zurückscrollen bringt ans Licht, dass das Bit WGM01 im Konfigurationsregister TCCR0 angesiedelt ist. Weiters entnehmen wir der Tabelle, dass der Timer bis zum Wert in OCR0 zählen wird (die Spalte <b>TOP</b>). Dort hinein müssen also die 250-1 als Obergrenze geschrieben werden.<br />
<br />
Wichtig ist auch noch: Dieser Spezialmodus CTC löst keinen Overflow Interrupt aus, sondern einen sog. Compare Match Interrupt. Dies deshalb, weil die gewünschte Obergrenze ja laut Datenblatt in eines der sog. Compare Match Register geschrieben werden muss (OCR0). Das sind Spezialregister, die nach jedem Zählvorgang mit dem Zählregister verglichen werden. Stimmt ihr Inhalt mit dem des Zählregisters überein, so hat man einen Compare-Match und kann daran wieder eine Aktion (ISR) knüpfen. In diesem speziellen Fall des CTC Modus beinhaltet dieser Compare Match dann auch noch das automatische Rücksetzen des Timers auf 0.<br />
<br />
Und natürlich können auch mehrere Techniken kombiniert werden. Z. B. CTC Modus und zusätzliches weiteres softwaremässiges Herunterteilen in der ISR sieht dann so aus:<br />
<br />
<syntaxhighlight lang="c"><br />
// Für einen Mega16.<br />
// Andere Prozessoren: siehe Datenblatt wie die Timerkonfiguration einzustellen ist<br />
<br />
#define F_CPU 1000000UL<br />
#include <avr/io.h><br />
#include <avr/interrupt.h><br />
<br />
ISR( TIMER0_COMP_vect ) // Compare Match Interrupt Vector<br />
{<br />
static uint8_t swTeiler = 0;<br />
<br />
swTeiler++;<br />
if( swTeiler == 200 ) {<br />
swTeiler = 0;<br />
PORTD = PORTD ^ 0xFF;<br />
}<br />
}<br />
<br />
int main()<br />
{<br />
DDRD = 0xFF; // irgendein Port, damit wir auch was sehen<br />
<br />
TIMSK = (1<<OCIE0); // den Output Compare Interrupt des Timers freigeben<br />
OCR0 = 250 - 1; // nach 250 Zaehlschritten -> Interrupt und Timer auf 0<br />
TCCR0 = (1<<WGM01) | (1<<CS01); // Vorteiler 8, CTC Modus<br />
<br />
<br />
sei(); // und Interrupts generell freigeben<br />
<br />
<br />
while( 1 )<br />
{ // hier braucht nichts mehr gemacht werden.<br />
} // der Timer selbst sorgt dafür, dass die ISR Funktion<br />
} // regelmässig aufgerufen wird <br />
</syntaxhighlight><br />
<br />
== Fast PWM ==<br />
<br />
Aber der Timer kann noch mehr. Wenn der Timer so vor sich hinzählt, dann kann man bestimmte Output-Pins des µC an diesen Timer koppeln. Der Timer kann dann diesen Pin bei erreichen von bestimmten Zählerständen ganz von alleine wahlweise auf 0 schalten, auf 1 schalten oder umdrehen.<br />
<br />
Was passiert da genau? Im folgenden sei von der einfachsten Form der PWM auf einem Mega16 ausgegangen: Wenn der Timer in seiner Zählerei bei 0 ist, dann schaltet er den Pin auf 1, bei einem bestimmten Zählerstand soll er den Pin wieder auf 0 zurücksetzen und ansonsten soll der Timer wie gewohnt laufend von 0 bis 255 durchzählen.<br />
Es ist die Rede vom Timer-Modus 3, siehe die vorhergehende Tabelle aus dem Datenblatt.<br />
<br />
Der Tabelle entnehmen wir wieder: Die Bits WGM01 und WGM00 müssen auf 1 gestellt werden. Der TOP Wert (also der Wert, bis zu dem der Timer zählt) ist 0xFF (also 255) und das OCR0 Register steuert, bei welchem Zählerstand die Timerhardware den Pin wieder auf 0 zurück schaltet. Das Einschalten auf 1 ist vorgegeben (auch das kann man ändern, dazu später mehr).<br />
<br />
Stellt man also genau diese Konfiguration her und schreibt in das Register OCR0 beispielsweise den Wert 253, dann beginnt der Timer bei 0 zu zählen, wobei der den Ausgangspin auf 1 schaltet. Wird der Zählerstand 253 erreicht, dann schaltet der Timer den Pin wieder auf 0 zurück und zählt weiter bis 255 um dann wieder erneut bei 0 zu beginnen (und den Ausgansg-Pin wieder auf 1 zu schalten). Der Ausgangspin ist in diesem Fall also die meiste Zeit auf 1 und nur ganz kurz (während der Timer von 253 bis 255 zählt) auf 0.<br />
<br />
Schreibt am auf der anderen Seite in das Register OCR0 den Wert 3, dann passiert konzeptionell genau dasselbe nur mit anderen Zahlenwerten. Der Timer beginnt bei 0 zu zählen und schaltet den Ausgansgpin auf 1. Aber diesmal ist es bereits beim Zählerstand 3 so weit: Der Zählerstand stimmt mit dem Wert in OCR0 überein und als Folge davon wird der Ausgangspin wieder auf 0 gestellt. Der Timer zählt natürlich wie immer weiter bis 255 ehe dann das ganze Spiel wieder von vorne beginnt. In diesem Fall war also der Ausgangspin nur ganz kurze Zeit auf 1 (nämich in der Zeit, die der Timer benötigt um von 0 bis 3 zu zählen) und dann die meiste Zeit auf 0. Und genau darum geht es bei PWM: Mit dem Register OCR0 lässt sich daher der zeitliche Anteil steuern, in dem der Pin auf 1 liegt.<br />
<br />
<br />
<syntaxhighlight lang="c"><br />
// Für einen Mega16.<br />
// Andere Prozessoren: siehe Datenblatt wie die Timerkonfiguration einzustellen ist<br />
<br />
#define F_CPU 1000000UL<br />
#include <avr/io.h><br />
#include <util/delay.h><br />
<br />
int main()<br />
{<br />
uint8_t i;<br />
<br />
DDRB |= (1<<PB3); // PB3 auf Ausgang stellen. Dieser Pin<br />
// trägt auch die Bezeichnung OC0 und ist der Pin<br />
// an dem der Timer 0 seine PWM ausgibt<br />
<br />
OCR0 = 250;<br />
TCCR0 = (1<<WGM01) | (1<<WGM00) | (1<<CS01); // Vorteiler 8, Fast PWM 8 Bit<br />
TCCR0 = (1<<COM01); <br />
<br />
while( 1 )<br />
{ // hier braucht nichts mehr gemacht werden.<br />
// der Timer selbst sorgt dafür, dass die PWM läuft<br />
// wir wollen aber ein wenig Action haben.<br />
// Also setzen wir das OCR0 Register auf verschiedene<br />
// Werte, damit eine angeschlossene LED unterschiedliche<br />
// Helligkeiten zeigt<br />
OCR0 = 30;<br />
_delay_ms( 1000 );<br />
OCR0 = 200;<br />
_delay_ms( 1000 );<br />
<br />
for( i = 0; i < 255; ++i ) {<br />
OCR0 = i;<br />
_delay_ms( 10 );<br />
}<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
Bleibt noch das gesetzte Bit COM01. Was hat es damit auf sich? Bisher war immer die Rede davon, das der Ausganspin bei einem Zählerstand von 0 auf 1 geschaltet wird usw. Das regelt genau dieses Bit. Im Datenblatt findet sich die Tabelle 14.4 auf der Seite 83, die genau regelt welche Bedeutung die Bits COM01 bzw COM00 haben, wenn der Timer Modus auf Fast-PWM eingestellt ist. Achtung: Je nach Timer-Modus haben diese Bits andere Bedeutungen! Man muss sich also immer die zum jeweiligen Timer-Modus gehörende Tabelle im Datenblatt suchen.<br />
<br />
<br />
<references /><br />
<br />
<br />
<br />
[[Kategorie:C]]<br />
[[Kategorie:avr-gcc]]</div>Schweigstillhttps://www.mikrocontroller.net/index.php?title=FAQ&diff=79904FAQ2013-12-07T15:07:33Z<p>Schweigstill: /* Welche Datentypen haben Konstanten */ Tippfehler korrigiert, Abgrenzung zu Präprozessordefinitionen</p>
<hr />
<div>Ein Verzeichnis von im Forum oft gestellten und immer wieder beantworteten Fragen und den zugehörigen Antworten:<br />
<br />
=Wie kann ich Zahlen auf [[LCD]]/[[UART]] ausgeben?=<br />
<br />
Aber die Bibliothek, die du benutzt, stellt nur eine Funktion zur Verfügung, mit der man einen String ausgeben kann... Was tun? <br />
<br />
In den folgenden Beispielen wird eine selbstgeschriebene Funktion zur Stringausgabe auf LCD - die Funktion lcd_string() - aus dem [[AVR-GCC-Tutorial/LCD-Ansteuerung|LCD-Teil des AVR-GCC-Tutorials]] verwendet:<br />
<br />
<syntaxhighlight lang="c"><br />
lcd_string( "Hallo Welt" ); // ggf. auch lcd_out() o.ä. in anderen Libraries<br />
</syntaxhighlight><br />
<br />
Um also eine Zahl (numerische Konstante oder Variableninhalt) auszugeben, muss von dieser Zahl zunächst ihre String-Repräsentation ermittelt werden. Hier geht es aber nur darum, zu zeigen wie man diese String Repräsenation erzeugen kann. Was man dann mit diesem String weiter macht, ob das dann eine LCD-Ausgabe oder eine UART-Übertragung oder das Abspeichern auf SD-Karte oder ... ist, spielt eine untergeordnete Rolle.<br />
<br />
Es gibt mehrere Möglichkeiten, sich die Stringrepräsentation zu erzeugen:<br />
<br />
===itoa() (utoa(), ltoa(), ultoa(), ftoa() )===<br />
<br />
<b>itoa()</b> ist keine C-Standardfunktion (wohl aber ihre Umkehrung <b>atoi()</b> ). Auf manchen Compilern heisst diese Funktion dann folgerichtig <b>_itoa()</b>, wobei der führende _ eben anzeigt, dass es sich um eine Erweiterung des C-Standards handelt. Bei [[WinAVR]] ist itoa() Bestandteil der mitgelieferten Library avr-libc, in der Libary [http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html''stdlib.h''].<br />
<br />
<syntaxhighlight lang="c"><br />
#include <stdlib.h><br />
char Buffer[20];<br />
int i = 25;<br />
<br />
itoa( i, Buffer, 10 );<br />
lcd_string( Buffer ); // ggf. auch lcd_out() o.ä. in anderen Libraries<br />
</syntaxhighlight><br />
<br />
<b>itoa( i, Buffer, 10 );</b> - Die Zahl i wird nach ASCII gewandelt und die String Repräsentierung davon wird in Buffer abgelegt. Die Basis, in der diese Wandlung erfolgt, ist das 10-er System. Wird das dritte Argument von 10 in zb. 2 oder auch 16 abgewandelt, erhält man die binäre oder eben eine hexadezimale Repräsentierung des Wertes. Auch wenn 10, 2 und 16 die häufigsten Angaben an dieser Stelle sind, kann itoa aber grundsätzlich in jedes beliebige Zahlensystem wandlen.<br />
<br />
Wichtig ist, darauf zu achten, dass das Array <i>Buffer</i> groß genug dimensioniert wird, um alle Zeichen der Textrepräsentation der Zahl aufzunehmen - inklusive der 0, die den String abschließt, sowie ein mögliches Vorzeichen.<br />
<br />
Anzumerken bleibt weiter, dass es normalerweise für alle Datentypen entsprechende Umwandlungsfunktionen gibt, wenn es sie für einen Datentyp gibt. Die Namensgebung lehnt sich an das Schema an: ''Kürzel_für_den_Datentyp to a''. Eine Funktion die einen unsigned int wandelt, heißt dann utoa (oder _utoa), Floating Point heißt dann ftoa (oder _ftoa), etc.<br />
<br />
===sprintf()===<br />
<br />
<syntaxhighlight lang="c"><br />
char Buffer[20];<br />
int i = 25;<br />
<br />
sprintf( Buffer, "%d", i );<br />
lcd_string( Buffer ); // ggf. auch lcd_out() o.ä. in anderen Libraries<br />
</syntaxhighlight><br />
<br />
Diese Methode funktioniert auch bei long oder float Werten. Unbedingt beachtet werden muss allerdings, dass die Typkennzeichnungen im sog. Format-String (hier "%d") mit den tatsächlichen Typen der auszugebenden Werten übereinstimmt. Und dass der Buffer, der den Text aufnimmt, auch groß genug dimensioniert wird. Dabei sollte die 0, die den String terminiert, nicht vergessen werden.<br />
<br />
Mit sprintf() hat man dieselben Möglichkeiten zur Formatierung wie bei <b>printf()</b> (siehe unten). Insbesondere gibt es natürlich die Möglichkeit die Zahl gleich in einen umgebenden Text einzubetten bzw. Formatierungen anzugeben:<br />
<br />
<syntaxhighlight lang="c"><br />
char Buffer[20];<br />
int i = 25;<br />
<br />
sprintf( Buffer, "Anzahl: %d Stueck", i );<br />
lcd_out( Buffer );<br />
</syntaxhighlight><br />
<br />
Der "Haken" an der mächtigen Funktion sprintf() ist, daß sie auch bei minimalisierter Konfiguration verhältnismäßig viel Programmspeicher (Flash-ROM) belegt und relativ viel Prozesszeit benötigt. Daher sollte man sprintf() nur verwenden, wenn kein Speicher- und Prozesszeitmangel besteht. Sonst sollte itoa() oder eine eigene, auf die Bedürfnisse optimierte Implementierung auf jeden Fall vorgezogen werden. Der große Vorteil von sprintf liegt darin, dass man über sehr mächtige Formatiermöglichkeiten verfügt, mit der man die Ausgabe einfach steuern und an seine Bedürfnisse anpassen kann. Dinge die man mit einer Funktion wie itoa alle selbst 'händisch' erledigen muss.<br />
<br />
====Formatierungen mit printf====<br />
<br />
Für jedes auszugebende Argument muss es im Formatstring einen entsprechenden Formatbezeichner geben. Der Aufbau eines Formatbezeichners ist immer<br />
<br />
%[Modifizierer][Feldbreite][.Präzision]Typ<br />
<br />
(Die in eckigen Klammern [ ] angegebenen Elemente können auch weggelassen werden, wenn man sie nicht benötigt. Im einfachsten Fall benötigt man also nur das % und den Buchstaben zur Typ-Kennung.)<br />
<br />
<b>Typ</b> ist dabei eine Kennung, der mit dem Datentyp des jeweiligen auszugebenden Argumentes übereinstimmen muss. Einige oft benutzte Kennungen, ohne Anspruch auf Vollständigkeit, sind:<br />
<b>c</b> char<br />
<b>d</b> int<br />
<b>f</b> float, double<br />
<b>ld</b> long<br />
<b>u</b> unsigned int<br />
<b>lu</b> unsigned long<br />
<b>p</b> pointer<br />
<b>s</b> string<br />
<b>x</b> ein int wird ausgegeben, die Ausgabe erfolgt<br />
aber als Hexadezimalzahl<br />
<b>X</b> ein int wird ausgegeben, die Ausgabe erfolgt<br />
aber als Hexadezimalzahl, wobei Grossbuchstaben verwendet werden<br />
<br />
Der''Modifizierer'' bestimmt, wie und womit nicht benutzte Felder des Ausgabefeldes gefüllt werden sollen, wie die Ausrichtung innerhalb des Feldes erfolgen soll und ob ein Vorzeichen auch dann ausgegeben werden soll wenn die auszugebende Zahl positiv ist. Wird kein Modifizierer angegeben, so werden nicht benutzte Felder mit einem Leerzeichen gefüllt, positive Vorzeichen unterdrückt und die Ausgabe im Feld rechts ausgerichtet.<br />
<br />
<b>+</b> Vorzeichen wird immer ausgegeben<br />
<b>-</b> Die Ausgabe wird im Ausgabefeld linksbündig ausgerichtet<br />
<b>0</b> anstelle von Leerzeichen werden führende 0-en ausgegeben<br />
<br />
Die ''Feldbreite'' gibt die Breite des Ausgabefeldes an, in die die Ausgabe durchgeführt werden soll. Reicht die angegebene Feldbreite nicht aus, so vergrößert printf diese Breite eigenmächtig. Die Feldbreite muß nicht angegeben werden. In diesem Fall bestimmt printf selbst die Feldbreite, so dass die Ausgabe darin Platz findet. Mit der Feldbreite hat man eine simple Möglichkeit dafür zu sorgen, dass der erzeugte String immer eine konstante Länge hat, selbst wenn die auszugebende Zahl diese Länge gar nicht benötigen würde (wichtig zb. bei Tabellen, damit die Einerstellen der Tabelleneinträge auch sauber untereinander stehen, auch dann wenn die Zahlen sich in unterschiedlichen Wertebereichen bewegen).<br />
<br />
Die ''Präzision'' kommt nur bei float oder double Zahlen zum Einsatz. Sie legt fest, wieviele Positionen der kompletten Feldbreite für die Ausgabe von Nachkommastellen reserviert werden sollen. Auch sie muss wiederrum nicht angegeben werden und printf benutzt in so einem Fall Standardvorgaben.<br />
<br />
===== Beispiele =====<br />
;<tt>"%d"</tt>: Ausgabe eines Integer<br />
;<tt>"%5d"</tt>: Ausgabe eines Integer in einem Feld mit 5 Zeichen Breite<br />
;<tt>"%05d"</tt>: Ausgabe eines Integer in einem Feld mit 5 Zeichen Breite, wobei das Feld links mit führenden Nullen auf 5 Zeichen aufgefüllt wird<br />
;<tt>"%-5d"</tt>: Ausgabe eines Integer in einem Feld mit 5 Zeichen Breite. Die Zahl wird linksbündig in das Feld gestellt.<br />
;<tt>"%6.3f"</tt>: Ausgabe eines float (oder double). Die Ausgabe erfolgt in einem Feld mit 6 Zeichen Breite, wobei 3 Nachkommastellen ausgegeben werden. Achtung: In der Feldbreite ist auch ein eventuelles Vorzeichen sowie der Dezimalpunkt enthalten. Bei einer Feldbreite von 6 Zeichen und 3 Nachkommastellen, bleiben bei einer positiven Zahl daher nur 2 Positionen für den Vorkommaanteil, bei negativen sogar nur 1 Stelle (6 - 3 Nachkommastellen - 1 Dezimalpunkt - 1 Vorzeichen = 1)<br />
<br />
===Eigene Umwandlungsfunktionen===<br />
<br />
Möchte man <b>itoa()</b> nicht benutzen oder hat es gar auf seinem System nicht zur Verfügung, dann ist es auch nicht schwer, sich selbst eine Funktion dafür zu schreiben:<br />
<br />
<syntaxhighlight lang="c"><br />
void ItoA( int z, char* Buffer )<br />
{<br />
int i = 0;<br />
int j;<br />
char tmp;<br />
unsigned u; // In u bearbeiten wir den Absolutbetrag von z.<br />
<br />
// ist die Zahl negativ?<br />
// gleich mal ein - hinterlassen und die Zahl positiv machen<br />
if( z < 0 ) {<br />
Buffer[0] = '-';<br />
Buffer++;<br />
// -INT_MIN ist idR. größer als INT_MAX und nicht mehr <br />
// als int darstellbar! Man muss daher bei der Bildung <br />
// des Absolutbetrages aufpassen.<br />
u = ( (unsigned)-(z+1) ) + 1; <br />
}<br />
else { <br />
u = (unsigned)z;<br />
}<br />
// die einzelnen Stellen der Zahl berechnen<br />
do {<br />
Buffer[i++] = '0' + u % 10;<br />
u /= 10;<br />
} while( u > 0 );<br />
<br />
// den String in sich spiegeln<br />
for( j = 0; j < i / 2; ++j ) {<br />
tmp = Buffer[j];<br />
Buffer[j] = Buffer[i-j-1];<br />
Buffer[i-j-1] = tmp;<br />
}<br />
Buffer[i] = '\0';<br />
}<br />
</syntaxhighlight><br />
<br />
Das Grundprinzip ist einfach:<br><br />
Die Ermittlung der einzelnen Stellen erfolgt in der zentralen Schleife<br />
<br />
<syntaxhighlight lang="c"><br />
do {<br />
Buffer[i++] = '0' + u % 10;<br />
u /= 10;<br />
} while( u > 0 );<br />
</syntaxhighlight><br />
<br />
durch fortgesetzte Division durch 10 und Restbildung.<br />
<br />
8392<br />
<br />
8392 % 10 -> <b>2</b><br />
8392 / 10 -> 839<br />
<br />
839 % 10 -> <b>9</b><br />
839 / 10 -> 83<br />
<br />
83 % 10 -> <b>3</b><br />
83 / 10 -> 8<br />
<br />
8 % 10 -> <b>8</b><br />
8 / 10 -> 0<br />
<br />
<br />
Nur leider erhält man dadurch die einzelnen Ziffern der Zahl in umgekehrter Reihenfolge im String ('2' '9' '3' '8' anstelle von '8' '3' '9' '2'). Dies ist aber kein Problem, die nachfolgende Schleife<br />
<br />
<syntaxhighlight lang="c"><br />
for( j = 0; j < i / 2; ++j ) {<br />
tmp = Buffer[j];<br />
Buffer[j] = Buffer[i-j-1];<br />
Buffer[i-j-1] = tmp;<br />
}<br />
</syntaxhighlight><br />
<br />
spiegelt den String in sich, sodass danach der String eine korrekte Repräsentation der ursprünglichen Zahl darstellt. Der Funktionsteil vor der 'Zerlegeschleife' behandelt den Sonderfall daß die Zahl negativ ist. Negative Zahlen werden behandelt indem im Endergebnis ein '-' vermerkt wird und danach die Zahl positiv gemacht wird.<br />
<br />
<br />
Siehe auch:<br />
* Forenbeitrag [http://www.mikrocontroller.net/topic/67405#541885 Integer-Zahl in String mit bestimmter Zeichenlänge]<br />
* Forenbeitrag [http://www.mikrocontroller.net/topic/84005#704736 (Resourcenschonend) Wert einer Variable am LCD ausgeben] von Niels Hüsken <br />
* Forenbeitrag [http://www.mikrocontroller.net/topic/121526?goto=new#new Formatierte Zahlenausgabe in C] von Peter Dannegger<br />
* [[Festkommaarithmetik]]<br />
<br />
=Datentypen in Operationen=<br />
Ein häufiges Problem betrifft die Auswertung von Ausdrücken. Konkret die Frage nach den beteiligten Datentypen.<br />
zb<br />
<syntaxhighlight lang="c"><br />
double i;<br />
int j, k;<br />
<br />
i = j / k;<br />
</syntaxhighlight><br />
Die Frage lautet dann: Warum erhalte ich keine Kommastellen, ich weise doch das Ergebnis einem double zu?<br />
<br />
Dazu ist zu sagen, dass C nicht so funktioniert. Die Tatsache dass i eine double Variable ist, ist für die Auswahl der Operation, welche die Division durchführt, völlig irrelevant. C orientiert sich ausschliesslich an den <br />
Datentypen der beteiligten Operanden, um zu entscheiden ob die Division als Integer- oder als Gleitkommadivision durchzuführen ist. Und da sowohl j als auch k ein Integer sind, wird die Division als Integerdivision durchgeführt<br />
unabhängig davon, was mit dem Ergebnis weiter passiert. Erst nach der Division wird das Ergebnis in einen double überführt, um es an i zuweisen zu können. Zu diesem Zeitpunkt gibt es aber keine Kommastellen mehr, eine Integerdivision erzeugt keine. Und damit tauchen klarerweise auch im Ergebnis keine auf.<br />
<br />
Aus genau diesem Grund ist zb das Ergebnis von<br />
<syntaxhighlight lang="c"><br />
double i;<br />
i = 5 / 8;<br />
</syntaxhighlight><br />
eine glatte 0 und nicht 0.625. Die Division 5 / 8 wird als Integer Division gemacht und liefert als solche keine Nachkommastellen. Wird das Ergebnis der Division in einen double umgewandelt, um es an i zuweisen zu können, ist das Kind schon in den Brunnen gefallen: Die Nachkommastellen sind schon längst weg bzw. waren nie vorhanden.<br />
<br />
Will man den Compiler dazu zwingen, die Division als Gleitkommadivision durchzuführen, so muss man daher dafür sorgen, dass mindestens einer der beteiligten Operanden ein double Wert ist. Dann bleibt dem Compiler nichts anderes übrig, als auch den zweiten Operanden ebenfalls zu einem double zu machen und die Operation als Gleitkommaoperation durchzuführen.<br />
<br />
<syntaxhighlight lang="c"><br />
double i;<br />
i = 5.0 / 8.0;<br />
<br />
i = (double)j / k;<br />
</syntaxhighlight><br />
<br />
Generell implementiert der Compiler eine Operation immer im 'höchsten' Datentyp, der in dieser Operation vorkommenden Operanden. Operanden in einem 'niedrigeren' Datentyp werden automatisch immer in diesen 'höchsten' Datentyp umgewandelt, zumindest aber int. Die Reihung orientiert sich dabei an der Regel: Ein 'höherer' Datentyp kann alle Werte eines 'niedrigeren' Datentyps aufnehmen.<br />
<br />
int<br />
unsigned int<br />
long<br />
unsigned long<br />
long long<br />
unsigned long long<br />
double<br />
<br />
float kommt in dieser Tabelle gar nicht vor, da Gleitkommaoperationen grundsätzlich immer als double-Operationen durchgeführt werden. Wohl kann es aber sein, dass double und float dieselbe Anzahl an Bits benutzen. Damit reduziert sich eine double Operation effektiv auf eine float Operation. (Anmerkung: mit dem C99-Standard hat sich dieses geändert. Dort gibt es dann auch echte float Operationen)<br />
<br />
Hat man also in einer Operation 2 Operanden der Datentypen int und long, so wird der int implizit zu einem long gemacht und die Operation als long Operation durchgeführt. Das Ergebnis hat dann den Datentyp long.<br />
<br />
==Welche Datentypen haben Konstanten==<br />
<br />
Auch Zahlenkonstante besitzen einen Datentyp, der selbstverständlich vom Compiler bei der Auswahl der Operation berücksichtigt wird. Hier gilt die Regel: Benutzt wird der Datentyp, der die Zahl gerade noch aufnehmen kann. Eine Zahlenkonstante 5 hat daher den Datentyp int. Die Zahl 32767 passt gerade noch in einen int, und hat daher den Datentyp int. 32768 ist für einen int bereits zu groß und hat daher den Datentyp long. 5.0 ist hingegem immer eine double-Konstante. Der Dezimalpunkt erzwingt dieses.<br />
<br />
Eine kleine Feinheit gibt es noch zu beachten. Konstanten in dezimaler Schreibweise haben immer einen signed Datentyp, während Konstanten in hexadezimaler bzw. oktaler Schreibweise je nach Wert einen signed oder einen unsigned Datentyp haben können.<br />
<br />
Möchte man einer Konstanten einen bestimmten Datentyp aufzwingen, so gibt es dazu 2 (ein halb) Möglichkeiten:<br />
* Entweder man castet die Konstante in den gewünschten Datentyp<br />
<syntaxhighlight lang="c"><br />
(long)5<br />
</syntaxhighlight><br />
* oder man benutzt die in C dafür vorgesehene Schreibweise, indem man der Konstanten einen Suffix anhängt, der den gewünschten Datentyp beschreibt<br />
<syntaxhighlight lang="c"><br />
5L<br />
</syntaxhighlight><br />
Beides ergibt eine dezimale 5, die vom Datentyp long ist.<br />
<br />
* eine Zahl in mit einem Dezimalkomma<br />
<syntaxhighlight lang="c"><br />
5.0<br />
</syntaxhighlight><br />
ist immer eine double Zahl. Es sei denn sie hat explizit einen Suffix<br />
<syntaxhighlight lang="c"><br />
5.0F<br />
</syntaxhighlight><br />
dann hat man es mit einer float Zahl zu tun.<br />
<br />
Die gültigen Suffixe für Zahlen sind U, L, UL und F:<br />
<br />
* U wie unsigned; dabei wird zuerst int angenommen. Es erfolgt eine automatische Ausweitung auf long, wenn die Zahl den Wertebereich eines unsigned int überschreitet. <br />
* L wie long; die Zahl selbst kann int oder double sein.<br />
* UL wie unsigned long. Eigentlich eine Zusammensetzung aus U und L<br />
* F wie float.<br />
<br />
Präprozessordefinitionen besitzen keine eigene Datentypen, da sie eine reine Textersetzungen durchführen. Deren Inhalte können aber ggf. zu Werten aufgelöst werden, die datentypbehaftet sind.<br />
<br />
=Aktivieren der Floating Point Version von sprintf bei WinAVR bzw AVR-Studio=<br />
[[Bild:AVR_Studio_float1.gif|thumb|right|300px|Project → Configuration Options → Libraries → Available Link Objects]]<br />
[[Bild:AVR_Studio_float2.gif|thumb|right|300px|Custom Options → Custom Compilation Options → Linker Options]]<br />
Beim WinAVR/AVR-Studio wird standardmässig eine Version der printf-Bibliothek verwendet, die keine Floatingpoint-Verarbeitung unterstützt. Die meisten Programme benötigen keine Floatingpoint-Unterstützung, so dass dadurch wertvoller Programmspeicherplatz gespart werden kann.<br />
<br />
Benutzt man allerdings eine printf-Variante für die Ausgabe von Floatingpoint-Zahlen, so erscheint an Stelle der korrekt formatierten Zahl lediglich ein '?'. Dies ist ein Indiz dafür, dass die Floatingpoint-Verarbeitung im Projekt aktiviert werden muss.<br />
<br />
Um die Floatingpoint-Verarbeitung zu aktivieren, geht man im '''AVR Studio 4''' wie folgt vor: <br />
* Menüpunkt: ''Project → Configuration Options''<br />
* Im sich öffnenden Dialog wird in der linken Navigationsleiste der Eintrag ''Libraries'' ausgewählt.<br />
* Unter ''Available Link Objects'' werden Bibliotheken angeboten. Für die Aktivierung der Floatingpoint-Unterstützung sind 2 interessant<ref><tt>libc.a</tt> sollte nicht zu den Bibliotheken hinzugefügt werden, da sie automatisch eingebunden wird. Etwas Hintergrundinformationen gibt es in [http://www.mikrocontroller.net/topic/173630 diesem Thread.]<br />
</ref>:<br />
** <tt>libprintf_flt.a</tt><br />
** <tt>libm.a</tt><br />
* Beide Bibliotheken werden durch Aktivieren und einen Druck auf ''Add Library → '' in die rechte Spalte übernommen.<br />
* Danach wählt man in der Navigationsleiste den Eintrag ''Custom Options''.<br />
* Unter ''Custom Compilation Options'' wird ''Linker Options'' ausgewählt und in das Textfeld rechts/unten folgender Text eingetragen:<br />
-Wl,-u,vfprintf<br />
* Ein Druck auf ''Add'' befördert die Zeile in das Listenfeld darüber, welches Optionen für den Linker enthält.<br />
* Mit ''OK'' wird die Konfiguration abgeschlossen.<br />
<br />
Bei '''AVR Studio 5''' trägt man die Optionen an anderen Stellen ein ([http://www.mikrocontroller.net/topic/221583#2219612 Beitrag von Hal Smith]): <br />
*''Project Properties → Toolchain → AVR/GNU C-Linker → Libraries''<br/>In ''Libraries'' <tt>(-WI, -I), libprintf_flt.a libm.a</tt> eintragen.<br />
* ''Project Properties → Toolchain → AVR/GNU C-Linker → Miscellaneous''<br/>In ''Other Linker Flags'' <tt>-Wl,-u,vfprintf</tt> eintragen.<br />
{{Absatz}}<br />
<br />
= Wie funktioniert String-Verarbeitung in C? =<br />
: → Siehe: ''[[String-Verarbeitung in C]]''<br />
<br />
= struct Strukturen =<br />
<br />
: → Siehe: ''[[Strukturen in C]]'' <br />
<br />
= Funktionszeiger =<br />
<br />
: → Siehe: ''[[Funktionszeiger in C]]''<br />
<br />
= Header File - wie geht das =<br />
<br />
Ein Header File ist im Grunde nichts anderes als eine Sammlung aller Informationen, die ein 'Aussenstehender' benötigt, um die in einem C-File gesammlten Funktionen benutzen zu können.<br />
<br />
Trotzdem gibt es immer wieder Schwierigkeiten, wie sich die Sache mit Header Files und/oder #include verhält und wie man eine derartige Lösung aufbauen kann.<br />
<br />
Gegeben sei ein System bestehend aus 3 Funktionen<br />
* main()<br />
* functionA()<br />
* functionB()<br />
und einigen globalen Variablen. Für dieses System soll eine Aufteilung erfolgen, so dass funtionA samt seinen zugehörigen globalen Variablen in einer eigenen C-Datei residiert (FileA.c), functionB in einem eigenen File residiert (FileB.c) und main() als Hautpfunktion seine eigens C-File (Main.c) darstellt und jeweils die entsprechenden Header Files existieren.<br />
<br />
Kochrezeptartig kann man in vielen Fällen einfach so vorgehen:<br />
Man schreibt erst mal den C-Code der Funktion, die man implementieren möchte. Zb fängt man an mit FileA.c<br />
<syntaxhighlight lang="c"><br />
// FileA.c<br />
<br />
int VarExtA;<br />
int VarIntA;<br />
<br />
#define PortpinX PortA.1<br />
<br />
int functionIntA( void )<br />
{<br />
VarIntA = VarExtB;<br />
functionB();<br />
PortpinX = 1;<br />
};<br />
</syntaxhighlight><br />
<br />
Jetzt geht man das File, so wie es auch der Compiler macht, von oben nach unten durch schaut den Code durch. Damit functionB aufgerufen werden kann, ist ein Prototyp dafür notwendig. Der kommt aus einem Header File, welches noch nicht existiert, aber im Laufe des Prozesses entstehen und FileB.h heissen wird. FileB.h deshalb, weil die Funktion in FileB.c enthalten ist und man zur Vermeidung von Konfusion die Header Files immer gleich benennt wie die C-Files, nur eben mit einer anderen Dateiendung. FileB.h wird noch geschrieben werden, das hindert uns jetzt aber nicht daran, so zu tun als ob es dieses schon geben würde und ein entsprechender #include ergänzt. (Solange nicht compiliert wird ist das ja auch kein Problem. Irgendwo muss man ja schliesslich mal anfangen die Ergänzungen zu machen.)<br />
<br />
<syntaxhighlight lang="c"><br />
// FileA.c<br />
<br />
#include "FileB.h"<br />
<br />
int VarExtA;<br />
int VarIntA;<br />
<br />
#define PortpinX PortA.1<br />
<br />
int functionA( void )<br />
{<br />
VarIntA = VarExtB;<br />
functionB();<br />
PortpinX = 1;<br />
};<br />
</syntaxhighlight><br />
<br />
Gut. Die Variable VarExtB wird ebenfalls über den include hereingezogen<br />
werden. Damit ist FileA.c erst mal vollständig. Da fehlt jetzt erst mal nichts mehr. Alles was in FileA.c vorkommt sind entweder C-Schlüsselwörter, durch FileA.c selbst definiert oder kommt über den #include herein.<br />
<br />
Der nächste Schritt ist die Überlegung: Was von dem Zeugs in FileA.C soll von anderer Stelle (von anderen C-Files aus) benutzt und verwendet werden können.<br />
Welche Dinge muss FileA von sich preis geben.<br />
<br />
Da sind zu erst mal die beiden Variablen. Was soll mit denen geschehen?<br />
VarExtA soll von aussen zugreifbar sein, VarIntA nicht. Und dann<br />
natürlich die Funktion, die aufrufbar sein soll.<br />
<br />
Also beginnt man ein Header File für FileA.c zu schreiben, in das all das<br />
reinkommt, was FileA.c nach aussen sichtbar machen will.<br />
<br />
<syntaxhighlight lang="c"><br />
// FileA.h<br />
<br />
extern int VarExtA;<br />
<br />
int functionA( void );<br />
</syntaxhighlight><br />
<br />
Die Variable kriegt ein extern davor (und wird damit zu einer Deklaration), bei der Funktion wird einfach die Implementierung weggenommen und die somit zu einer Deklaration veränderte Zeile mit einem ; abgeschlossen. Wenn man möchte kann man den so geschaffenen Prototypen auch mit einem extern einleiten. Notwendig ist es aber nicht.<br />
<br />
Erneuter Blick aufs Header File. Kommt da irgendwas vor, was nicht<br />
Standard C Schlüsselwort ist? Nein. Nichts.<br />
Also ist dieses Header File somit ebenfalls in sich vollständig.<br />
<br />
Zur Sicherheit wird in FileA.c noch einen Include auf das<br />
eigene Header File hinzugefügt, denn dann kann der Compiler überprüfen ob die<br />
Angaben im Header File mit der tatsächlichen Implementierung<br />
übereinstimmen. Und da VarIntA von aussen nicht sichtbar sein soll (auch<br />
nicht durch Tricks), wird sie static gemacht.<br />
<br />
<syntaxhighlight lang="c"><br />
// FileA.c<br />
<br />
#include "FileA.h"<br />
#include "FileB.h"<br />
<br />
int VarExtA;<br />
static int VarIntA;<br />
<br />
#define PortpinX PortA.1<br />
<br />
int functionA( void )<br />
{<br />
VarIntA = VarExtB;<br />
functionB();<br />
PortpinX = 1;<br />
}<br />
</syntaxhighlight><br />
<br />
Dasselbe für FileB.c. Erst mal einfach runterschreiben<br />
<syntaxhighlight lang="c"><br />
// FileB.c<br />
<br />
int VarExtB;<br />
int VarIntB;<br />
<br />
#define SettingB 0x01<br />
<br />
int functionB( void )<br />
{<br />
VarExtA = 1;<br />
functionA();<br />
VarIntB = SettingB;<br />
<br />
MeinePrivateFunktion();<br />
}<br />
<br />
void MeinePrivateFunktion()<br />
{<br />
VarIntB = 8;<br />
}<br />
</syntaxhighlight><br />
<br />
damit functionA aufgerufen werden kann, braucht es wieder einen Prototypen. Den<br />
kriegt man über von FileA.h, welches daher includiert wird.<br />
<br />
<syntaxhighlight lang="c"><br />
// FileB.c<br />
<br />
#include "FileA.h"<br />
<br />
int VarExtB;<br />
int VarIntB;<br />
<br />
#define SettingB 0x01<br />
<br />
int functionB( void )<br />
{<br />
VarExtA = 1;<br />
functionA();<br />
VarIntB = SettingB;<br />
MeinePrivateFunktion();<br />
}<br />
<br />
void MeinePrivateFunktion()<br />
{<br />
VarIntB = 8;<br />
}<br />
</syntaxhighlight><br />
<br />
Was noch? VarExtA. Diese Variable wird aber ebenfalls durch den #include als extern Deklaration ins FileB.c hereingezogen und ist somit bei der Übersetzung von FileB.c bekannt. Kommt sonst noch etwas vor? MeinePrivateFunktion. Diese Funktion soll nur in FileB.c benutzt werden und ist für jemanden ausserhalb FileB.c völlig uninteressant. Nichts destotrotz gilt die Regel: compiliert wird von oben nach unten und verwendet werden kann nur etwas, was auch bekannt ist. D.h. bevor der Aufruf der Funktion in functionB gemacht werden kann, muss es einen Protoypen der Funktion geben. Da diese Funktion aber nicht nach 'aussen' exportiert wird, macht man den Protoypen gleich in das C-File mit hinein.<br />
<br />
<syntaxhighlight lang="c"><br />
// FileB.c<br />
<br />
#include "FileA.h"<br />
<br />
int VarExtB;<br />
int VarIntB;<br />
<br />
#define SettingB 0x01<br />
<br />
void MeinePrivateFunktion();<br />
<br />
int functionB( void )<br />
{<br />
VarExtA = 1;<br />
functionA();<br />
VarIntB = SettingB;<br />
MeinePrivateFunktion();<br />
}<br />
<br />
void MeinePrivateFunktion()<br />
{<br />
VarIntB = 8;<br />
}<br />
</syntaxhighlight><br />
<br />
Würde man die Funktion vorziehen, so dass der Funktionskörper vor der ersten Verwendung steht, dann würde man auch keinen Protoypen benötigen. Eine Funktionsdefinition fungiert als ihr eigener Protoyp.<br />
<br />
Kommt sonst noch etwas vor? Nix mehr. In FileB.c wird sonst nix mehr verwendet was nicht entweder C Schlüsselwort oder im File selber oder durch einen #include reinkommt.<br />
<br />
Dann wieder: das Header File für B schreiben. Dabei einfach nur überlegen: was soll von FileB.c nach aussen getragen werden?<br />
<br />
<syntaxhighlight lang="c"><br />
// FileB.h<br />
<br />
extern int VarExtB;<br />
<br />
int functionB( void );<br />
</syntaxhighlight><br />
<br />
und zur Sicherheit wieder ins eigene C-File includen und alle Variablen<br />
(oder auch Funktionen), die von aussen nicht sichtbar sein sollen, als<br />
static markieren.<br />
<br />
<syntaxhighlight lang="c"><br />
// FileB.c<br />
<br />
#include "FileB.h"<br />
#include "FileA.h"<br />
<br />
int VarExtB;<br />
static int VarIntB;<br />
<br />
#define SettingB 0x01<br />
<br />
static void MeinePrivateFunktion();<br />
<br />
int functionB( void )<br />
{<br />
VarExtA = 1;<br />
functionA();<br />
VarIntB = SettingB;<br />
MeinePrivateFunktion();<br />
}<br />
<br />
void MeinePrivateFunktion()<br />
{<br />
VarIntB = 8;<br />
}<br />
</syntaxhighlight><br />
<br />
damit bleibt nur noch main.c. Auch dieses wird erst mal einfach runtergeschrieben.<br />
<br />
<syntaxhighlight lang="c"><br />
int c;<br />
<br />
int main()<br />
{<br />
functionA();<br />
functionB();<br />
VarExtA = 1;<br />
VarExtB = c;<br />
}<br />
</syntaxhighlight><br />
<br />
Damit functionA aufgerufen werden kann, braucht es einen Prototypen. Woher kommt er? Aus FileA.h. Also gleich mal includen<br />
<syntaxhighlight lang="c"><br />
#include "FileA.h"<br />
<br />
int c;<br />
<br />
int main()<br />
{<br />
functionA();<br />
functionB();<br />
VarExtA = 1;<br />
VarExtB = c;<br />
}<br />
</syntaxhighlight><br />
<br />
Damit functionB aufgerufen werden kann, braucht es einen Prototypen. Wo<br />
kommt der her? Aus FileB.h. Also noch ein #include<br />
<syntaxhighlight lang="c"><br />
#include "FileA.h"<br />
#include "FileB.h"<br />
<br />
int c;<br />
<br />
int main()<br />
{<br />
functionA();<br />
functionB();<br />
VarExtA = 1;<br />
VarExtB = c;<br />
}<br />
</syntaxhighlight><br />
<br />
Fehlt noch was? VarExtA ist durch den #include von FileA.h bereits<br />
abgedeckt und VarExtB ist durch den #include von FileB.h bereits<br />
abgedeckt. Also fehlt nix mehr. Auch in main.c sind damit alle Sachen<br />
abgedeckt und es ist in sich vollständig.<br />
<br />
Das ist der Standardmechanismus:<br />
* Implementierung der Funktionen im C File schreiben<br />
* Überlegen, was von dieser Implementierung von aussen sichtbar sein soll.<br />
* Dasjenige kommt als Deklaration ins Header File, alles andere am besten static machen.<br />
* Für alles im C-File, das seinerseits woanders herkommt, gibt es einen #include, der das jeweils notwendige Header File einbindet.<br />
* Werden im Header File Dinge von woanders benutzt, dann enthält das Header File einen entsprechenden #include<br />
* Jedes File, sowohl Header-File als auch C-File ist in sich vollständig. Werden dort Dinge benutzt, dann müssen diese vor der Verwendung deklariert worden sein. Wie und wo diese Deklaration herkommt, ist dabei zweitrangig. Es kann sein, dass die Deklaration vor der Verwendung steht, es kann aber auch sein, dass die Deklaration über einen weiteren Include mit aufgenommen wird.<br />
<br />
= Ich hab da mehrere *.c und *.h Dateien. Was mache ich damit? =<br />
<br />
[[Bild:c-flow.svg|right|thumb|260px|C-Programmierung: Workflow]]<br />
Zunächst ist es wichtig, sich zu vergegenwärtigen, wie C-Compiler und Linker zusammenarbeiten. Ein komplettes Programmier-Projekt kann und wird im Normalfall aus mehreren Quelldateien bestehen, die alle zusammengenommen das komplette Programm bilden.<br />
<br />
Der Prozess des Erstellens des Programmes geschieht in mehrerern Schritten:<br />
;Compilieren: zunächst werden alle Einzelteile (jede *.c Datei) für sich ''compiliert''. Dabei ensteht aus jeder c-Datei eine sogenannte Object-Datei, in der bereits der Maschinencode für die im c-File programmierten Funktionen enthalten ist<br />
;Linken: die einzelnen Object-Dateien werden mit zusätzlichen Bibliotheken und dem Startup-Code zum fertigen Programm ''gelinkt''.<br />
{{Absatz}}<br />
Angenommen, das komplette Projekt besteht aus 2 Dateien:<br />
<br />
;main.c:<br />
<syntaxhighlight lang="c"><br />
int twice (int);<br />
<br />
int main()<br />
{<br />
twice (5);<br />
}<br />
</syntaxhighlight><br />
<br />
;func.c:<br />
<syntaxhighlight lang="c"><br />
int twice (int number)<br />
{<br />
return 2 * number;<br />
}<br />
</syntaxhighlight><br />
<br />
Dann werden <tt>main.c</tt> und <tt>func.c</tt> ''unabhängig'' voneinander compiliert. Als Ergebnis erhält man die Dateien <tt>main.o</tt> und <tt>func.o</tt>, die den besagten Object-Code enthalten.<br />
Diese beiden Zwischenergebnisse werden dann zusammen mit Bibliotheken zum fertigen Programm gebunden (gelinkt), das dann ausgeführt werden kann.<br />
<br />
Bekommt man also von irgendwo bereits fertige *.c (und zugehörige *.h) Dateien, so genügt es, die *.c Dateien in das Projekt mit aufzunehmen. Dadurch wird das entsprechende C-File compiliert und das Ergebnis davon, das Object-file, wird dann in das fertige Programm mit eingelinkt.<br />
<br />
;Achtung: Da jede der C-Dateien unabhängig von allen anderen compiliert wird, bedeutet das auch, dass jede der C-Dateien in sich vollständig sein muss!<br />
<br />
Wie eine C-Datei in das Projekt mit aufgenommen wird, hängt im wesentlichen von der benutzten Entwicklungsumgebung ab.<br />
<br />
== Makefile ==<br />
<br />
Die zusätzliche *.c Datei wird in die SRC Zeile im makefile eingetragen.<br />
<br />
== AVR-Studio ==<br />
<br />
Hier ist es besonders einfach, eine Datei in das Projekt mit aufzunehmen. Dazu wird im Projektbaum der Knoten "Source Files" aktiviert und mit der rechten Maustaste das Kontextmenü geöffnet. Im Menü wird der Punkt "Add existing Source File(s)" ausgewählt, und anschliessend zeigt man AVR-Studio das zusätzliche C-File. AVR-Studio berücksicht dann diese Datei bei der Projekterzeugung, compiliert es und sorgt dafür, dass es zum fertigen Programm dazugelinkt wird.<br />
<br />
=Globale Variablen über mehrere Dateien=<br />
Ein häufiger Problemkreis in der C Programmierung sind auch globale Variablen, die von mehreren *.c Dateien aus benutzt werden sollen. Was hat es damit auf sich?<br />
<br />
Zunächst mal muß man bei der Vereinbarung von Variablen zwischen ''Definition'' und ''Deklaration'' unterscheiden:<br />
;Definition: Mit einer Definition wird der Compiler angewiesen, eine Variable tatsächlich zu erzeugen. Damit er das kann, muß ihm selbstverständlich der exakte Datentyp und auch der Name der Variablen zur Verfügung stehen. Eine Definition sorgt also dafür, dass im späteren Programm Speicherplatz für diese Variable reserviert wird<br />
;Deklaration: Mit einer Deklaration teilt man dem Compiler lediglich mit, dass eine Variable existiert. An dieser Stelle soll der Compiler also keinen Speicherplatz reservieren, sondern der Compiler soll einfach nur zur Kenntniss nehmen, daß es eine Variable mit einem bestimmten Namen gibt und von welchem Datentyp sie ist.<br />
<br />
Aus obigem folgt sofort, dass eine Definition auch immer eine Deklaration ist. Denn dadurch, daß der Compiler angewiesen wird eine Variable auch tatsächlich zu erzeugen, folgt, dass er dazu auch dieselben Informationen benötigt, die auch in einer Deklaration angegeben werden müssen. Der einzige Unterschied: Bei einer Deklaration trägt der Compiler nur in seinen internen Tabellen ein, dass es diese Variable tatsächlich gibt, während er bei einer Definition zusätzlich auch noch dafür sorgt, dass im fertigen Programm auch Speicher für diese Variable bereitgestellt wird.<br />
<br />
Warum ist diese Unterscheidung wichtig?<br />
<br />
Weil es in C die sog. ''One Definition Rule'' (ODR). Sie besagt, dass in einem vollständigen Programm, also über alle *.c Dateien gesehen, es für eine Variable nur <b>eine</b> Definition geben darf. Es darf allerdings beliebig viele Deklarationen geben, solange diese Deklarationen alle im Datentyp übereinstimmen. Kurz gesagt: Man darf den Compiler nur einmal auffordern, eine Variable zu erzeugen (Definition), kann sich aber beliebig oft auf diese eine Variable beziehen (Deklarationen). Aber Vorsicht! Da der Compiler jede einzelne *.c Datei für sich alleine übersetzt und dabei kein Wissen von ausserhalb benutzt, obliegt es der Verantwortung des Programmierers dafür zu sorgen, dass alle Deklarationen im Datentyp übereinstimmen. Der Compiler kann diese Einhaltung prinzipbedingt nicht überwachen!<br />
<br />
Woran erkennt man eine Definition bzw. Deklaration?<br />
<br />
Eine Definition einer globalen Variable steht immer ausserhalb eines Funktionsblocks. Zb.<br />
<syntaxhighlight lang="c"><br />
int MyData; // Globale Variable namens MyData. Sie ist vom Typ int<br />
char Name[30]; // Globales Array<br />
long NrElements = 5; // Globale Variable, die auch noch initialisiert wird<br />
</syntaxhighlight><br />
<br />
Eine Deklaration unterscheidet sich von einer Definition in 2 Punkten<br />
* Es wird das Schlüsselwort <tt>extern</tt> vorangestellt.<br />
* Es kann keine Initialisierung geben. Sobald eine Initialisierung vorhanden ist, wird das Schlüsselwort <tt>extern</tt> ignoriert und aus der Deklaration wird eine Definition.<br />
<br />
Beispiele für Deklarationen<br />
<syntaxhighlight lang="c"><br />
extern int MyData;<br />
extern char Name[30];<br />
extern long NrElements;<br />
extern long NrElements = 5; // Achtung: Dies ist eine Definition!<br />
</syntaxhighlight><br />
<br />
Besitzt man also 2 *.c Dateien, main.c und helpers.c, und sollen sich diese beiden Dateien eine globale Variable teilen, so muss in eine Datei eine Definition hinein, während in die andere Datei eine Deklaration derselben Variablen erfolgen muß. Traditionell werden die Definitionen in der *.c-Datei gemacht, die als Hauptdatei des Moduls fungiert, zu der diese Variable konzeptionell gehört. Im Zweifel ist das die *.c Datei, in der main() enthalten ist. Das muss nicht so sein, ist aber eine Konvention, die oft Sinn macht. Alternativ wird auch gerne oft eine eigene *.c Datei (zb. globals.c) gemacht, die einzig und alleine die Defintionen der globalen Variablen enthält.<br />
<br />
main.c<br />
<syntaxhighlight lang="c"><br />
int AnzahlElemente; // Dies ist die Definition. Hier wird die globale<br />
// Variable AnzahlElemente tatsächlich erzeugt.<br />
<br />
int main()<br />
{<br />
AnzahlElemente = 8;<br />
...<br />
}<br />
</syntaxhighlight><br />
<br />
helpers.c<br />
<syntaxhighlight lang="c"><br />
extern int AnzahlElemente; // Dies ist die Deklaration die auf die globale<br />
// Variable AnzahlElemente in main.c verweist.<br />
// Wichtig: Der Datentyp muss mit dem in main.c<br />
// angegebenen übereinstimmen<br />
<br />
void foo()<br />
{<br />
...<br />
j = AnzahlElemente;<br />
AnzahlElemente = 9;<br />
}<br />
</syntaxhighlight><br />
<br />
==Praktische Durchführung==<br />
Besteht ein vollständiges Programm aus mehreren *.c Dateien, dann kann man sich vorstellen, daß es mühsam ist, alle Deklarationen immer auf gleich zu halten. Hier bietet sich der Einsatz eines Header Files an, in der die Deklarationen stehen und welches in die jeweiligen *.c Dateien inkludiert wird<br />
<br />
Bsp:<br />
<br />
Global.h<br />
<syntaxhighlight lang="c"><br />
extern int Anzahl;<br />
</syntaxhighlight><br />
<br />
main.c<br />
<syntaxhighlight lang="c"><br />
#include "Global.h"<br />
<br />
int Anzahl; // auch wenn Global.h inkludiert wurde, so muss es eine<br />
// Definition der Variablen geben. In Global.h sind ja nur<br />
// Deklarationen.<br />
<br />
int main()<br />
{<br />
...<br />
Anzahl = 5;<br />
}<br />
</syntaxhighlight><br />
<br />
foo.c<br />
<syntaxhighlight lang="c"><br />
#include "Global.h"<br />
<br />
void foo()<br />
{<br />
...<br />
Anzahl = 8;<br />
...<br />
}<br />
</syntaxhighlight><br />
<br />
bar.c<br />
<syntaxhighlight lang="c"><br />
#include "Global.h"<br />
<br />
void bar()<br />
{<br />
...<br />
j = Anzahl;<br />
}<br />
</syntaxhighlight><br />
<br />
Auf diese Art kann man erreichen, dass zumindest alle Deklarationen ein und derselben Variablen in einem Programm übereinstimmen. Die Datei Global.h wird auch in main.c inkludiert, obwohl man das eigentlich nicht müsste, denn dort wird die Variable ja definiert. Durch die Inclusion ermöglicht man aber dem Compiler die Überprüfung ob die Deklaration auch tatsächlich mit der Definition übereinstimmt.<br />
<br />
Solange kein Initialisierungen der globalen Variablen notwendig sind, gibt es noch einen weiteren Trick, um sich selbst das Leben und die Verwaltung der globalen Variablen zu erleichtern.<br />
Worin besteht das Problem?<br />
Das Problem besteht darin, dass man bei Einführung einer neuen globalen Variablen an 2 Stellen erweitern muss: Zum einen in der Header-Datei, die die 'extern'-Deklaration der Variablen enthält, zum anderen muss in einer C-Datei die Definition der Variablen erfolgen. Das kann man sich mit etwas Präprozessorarbeit auch einfacher machen:<br />
<br />
Global.h<br />
<syntaxhighlight lang="c"><br />
#ifndef EXTERN<br />
#define EXTERN extern<br />
#endif<br />
<br />
EXTERN int Anzahl;<br />
</syntaxhighlight><br />
<br />
main.c<br />
<syntaxhighlight lang="c"><br />
#define EXTERN<br />
#include "Global.h"<br />
<br />
int main()<br />
{<br />
...<br />
Anzahl = 5;<br />
}<br />
</syntaxhighlight><br />
<br />
foo.c<br />
<syntaxhighlight lang="c"><br />
#include "Global.h"<br />
<br />
void foo()<br />
{<br />
...<br />
Anzahl = 8;<br />
...<br />
}<br />
</syntaxhighlight><br />
<br />
Wie funktioniert das Ganze? Im Grunde muss man nur dafür sorgen, dass der Compiler an ''einer'' Stelle das Schlüsselwort '''extern''' ignoriert (hier in main.c) und bei allen anderen Inclusionen beibehält. Dadurch das ein Präprozessor-ifndef benutzt wird, kann dieses erreicht werden. Wird das Header File includiert und ist zu diesem Zeitpunkt das Makro '''EXTERN''' noch nicht definiert, so wird innerhalb des Header Files '''EXTERN''' zu '''extern''' definiert und damit in weiterer Folge im Quelltext '''EXTERN''' durch '''extern''' ersetzt. Wenn daher foo.c das Header File inkludiert, wird die Zeile<br />
<syntaxhighlight lang="c"><br />
EXTERN int Anzahl;<br />
</syntaxhighlight><br />
vom Präprozessor zu<br />
<syntaxhighlight lang="c"><br />
extern int Anzahl;<br />
</syntaxhighlight><br />
umgewandelt.<br />
<br />
In main.c hingegen sieht die Include-Sequenz so aus<br />
<syntaxhighlight lang="c"><br />
#define EXTERN<br />
#include "Global.h"<br />
</syntaxhighlight><br />
Wenn Global.h bearbeitet wird, existiert bereits ein Makro '''EXTERN''', das auf einen leeren Text expandiert. Dadurch wird verhindert, dass innerhalb von Global.h das Makro '''EXTERN''' mit dem Text '''extern''' belegt wird und<br />
<syntaxhighlight lang="c"><br />
EXTERN int Anzahl;<br />
</syntaxhighlight><br />
wird daher vom Präprozessor zu<br />
<syntaxhighlight lang="c"><br />
int Anzahl;<br />
</syntaxhighlight><br />
erweitert, genau wie es benötigt wird.<br />
<br />
= Was hat es mit volatile auf sich =<br />
Immer wieder hört man im Forum die pauschale Aussage "Variablen die in einer ISR verwendet werden, müssen volatile sein". Nun, das ist so nicht ganz richtig.<br />
Welches Problem löst denn eigentlich volatile? Was ist denn das eigentliche Problem, das einer Lösung bedarf?<br />
<br />
Das Problem findet sich diesmal im Optimierer eines C Compilers. C Compiler übersetzen, wenn sie optimieren dürfen, den C Code nicht direkt so, wie ihn der Programmierer geschrieben hat, sondern sie versuchen Ressourcen einzusparen. Das kann sowohl Programmspeicher als auch Laufzeit, häufig auch beides gemeinsam sein. Zu diesem Zweck untersuchen sie das Programm und versuchen in der funktional gleichwertigen, in Maschinensprache übersetzen Version, Anweisungen einzusparen. Das dürfen sie auch. Der C-Standard erlaubt Optimierungen, solange die 'As-If'-Regel eingehalten wird. Das bedeutet: Der Compiler darf das Programm umstellen und verändern, solange die Programmergebnisse dieselben bleiben. Eben "As-if" die Optimierung nie stattgefunden hätte.<br />
<br />
Nehmen wir ein Beispiel<br />
<syntaxhighlight lang="c"><br />
i = 2;<br />
<br />
if( i == 5 )<br />
j = 8;<br />
else<br />
j = 6;<br />
</syntaxhighlight><br />
In diesem Programmausschnitt darf der Compiler seine Kenntnisse ausnutzen. Er weiß an dieser Stelle, dass i den Wert 2 hat. Damit ist aber auch klar, dass die Bedingung niemals wahr sein kann, denn 2 kann niemals gleich 5 sein. Wenn die Bedingung aber niemals wahr sein kann, dann kann auch die Zuweisung von 8 an j niemals ausgeführt werden. Der Compiler kann also diesen Programmtext zu diesem hier kürzen<br />
<syntaxhighlight lang="c"><br />
i = 2;<br />
j = 6;<br />
</syntaxhighlight><br />
ohne das sich an den Programmergebnissen etwas ändert. Die zweite Version ist aber kürzer und wird, wegen des Wegfalles des Vergleiches, auch schneller ausgeführt.<br />
<br />
Eine andere Form der Optimierung betrifft die Verwaltung von µC-Ressourcen und da wieder ganz speziell die Register. Variablen werden ja erst mal im SRAM-Speicher des µC angelegt. Um mit den Werten von Variablen arbeiten zu können, müssen diese Wert aber vom SRAM-Speicher in µC-Register überführt werden (Register kann man sich wie Speicherstellen in der eigentlichen CPU vorstellen). Nur dort können diese Werte mittels Maschinenbefehlen manipuliert werden.<br />
Jetzt haben aber µC nicht beliebig viele Register. Das bedeutet aber auch, der Compiler muss darüber Buch führen, welche Werte (welche Variablen) gerade in welchen Registern liegen und wenn alle Register belegt sind, muss ein anderes Register freigeräumt werden, in dem der Wert aus dem Register wieder ins SRAM zurück übertragen wird.<br />
Allerdings kostet das auch Zeit. Der Compiler wird daher versuchen, Variablen, die in einem Programmstück oft benötigt werden, für längere Zeit in den Registern zu halten, um das Registerladen bzw. -zurückschreiben einzusparen. Die Grundannahme lautet dabei immer: In Anweisungen, in denen eine Variable nicht vorkommt, kann diese Variable auch nicht verändert werden. Im Programmstück<br />
<br />
<syntaxhighlight lang="c"><br />
while( 1 ) {<br />
if( i == 5 )<br />
j = 8;<br />
}<br />
</syntaxhighlight><br />
gibt es für i keine Möglichkeit, verändert zu werden. Der Compiler kann daher entscheiden, dass er diese Variable, *an dieser Stelle*, gar nicht aus dem SRAM laden muss, sondern sich den entsprechenden Wert in einem Register vorhält und dieses Register ausschließlich dafür reserviert. (Er könnte auch entscheiden, dass der Code nie ausgeführt werden kann, aber das ist eine andere Geschichte)<br />
<br />
Der springende Punkt ist nun, dass der Compiler hier eine zu kleine Sicht der Dinge hat. Betrachtet man nur dieses Code Stück, dann gibt es tatsächlich für i keine Möglichkeit, seinen Wert zu verändern. Aber die Dinge ändern sich, wenn Interrupts ins Spiel kommen.<br />
<br />
<syntaxhighlight lang="c"><br />
uint8_t i;<br />
<br />
ISR( irgendein_Interrupt )<br />
{<br />
i = 5;<br />
}<br />
<br />
int main()<br />
{<br />
...<br />
<br />
while( 1 ) {<br />
if( i == 5 )<br />
j = 8;<br />
}<br />
}<br />
</syntaxhighlight><br />
Jetzt gibt es plötzlich eine Möglichkeit, wie i seinen Wert ändern kann: Wenn der entsprechende Interrupt ausgelöst wird, dann wird i auf den Wert 5 gesetzt. i, das ist aber nichts anderes als ein bestimmter Speicherbereich im SRAM. D.h. im SRAM wird die Variable tatsächlich korrekt auf den Wert 5 gesetzt. Nur: Als der Compiler die while-Schleife übersetzt hat, wusste er nichts davon, dass diese Möglichkeit existiert. Er hat entschieden, dass er an dieser Stelle den Wert der Variablen in einem CPU-Register halten wird, um Zugriffe einzusparen. Nur wird diese Kopie des Wertes im Register natürlich nicht verändert, wenn in der ISR das Original von i im SRAM verändert wird.<br />
Fazit: Obwohl die ISR die Variable tatsächlich verändert, kriegt das der Code im while nicht mit, weil der Compiler es mit der Optimierung an dieser Stelle übertrieben hat. In der while-Schleife wird mit einer Kopie des Wertes von i in einem Register gearbeitet und nicht mit dem originalen Wert von i im SRAM.<br />
<br />
Und an dieser Stelle kommt jetzt volatile ins Spiel.<br />
<br />
volatile teilt dem Compiler mit, dass ausnahmslos alle Zugriffe auf eine Variable auch tatsächlich auszuführen sind und keine Optimierungen gemacht werden dürfen, weil eine Variable auf Wegen benutzt werden kann, die für den Compiler prinzipiell nicht einsichtig sind. Im obigen Beispiel könnte man argumentieren, dass der Compiler ja wohl die ISR bemerken könne und daher feststellen könnte, dass i tatsächlich verändert wird. Aber das stimmt so in der allgemeinen Form nicht. Niemand sagt, dass der Compiler die ISR überhaupt zu Gesicht bekommen muss, die könnte ja auch in einem ganz anderen C File stecken.<br />
<br />
<syntaxhighlight lang="c"><br />
volatile uint8_t i;<br />
<br />
ISR( irgendein_Interrupt )<br />
{<br />
i = 5;<br />
}<br />
<br />
int main()<br />
{<br />
...<br />
<br />
while( 1 ) {<br />
if( i == 5 )<br />
j = 8;<br />
}<br />
}<br />
</syntaxhighlight><br />
wird i volatile gemacht, so verbietet man damit dem Compiler explizit, Annahmen über den Datenfluss von i zu treffen. Innerhalb der Schleife muss also tatsächlich jedes Mal wieder erneut i aus dem SRAM geholt werden und mit 5 verglichen werden. Abkürzungen durch Mehrfachverwendung von Registern oder sonstigen Optimierungstricks sind nicht erlaubt. Und damit ist das Problem gelöst. Wird i in der ISR verändert, so bekommt das auch die Abfrage mit, weil ja jetzt auf jeden Fall auf das Original im SRAM zurückgegriffen wird.<br />
<br />
Das Gleiche gilt auch ebenso "in die andere Richtung", wenn also i in der Schleife geändert und in der ISR nur gelesen wird. Auch hier könnte die Optimierung negativ zuschlagen und den Schreibzugriff nur auf eine lokale Kopie der Variable in einem Register durchführen (oder gar ganz wegfallen) lassen, weil der Lesezugriff außerhalb des direkten Programmflusses (in der ISR) für den Compiler nicht ersichtlich ist.<br />
<br />
Ein anderes Problem (das ebenfalls mittels volatile gelöst wird) sind Variablen, die tatsächlich im Code überhaupt nie aktiv verändert werden, sondern es sich um Zusatzhardware handelt, die so verschaltet ist, dass sie im Programm in Form einer Variablen auftaucht, z.B. ein Uhren-IC (oder auch ganz banal: Portpins). In diesem Fall wird z.B. die Variable für Sekunden vom Programm gar nicht vom Programm selber verändert, ändert aber trotzdem ihren Inhalt. Die Zusatzhardware selbst macht das. Aus Programmsicht handelt es sich um Speicherzellen, die magisch selbsttätig ihren Wert ändern. Und damit dürfen selbstverständlich auch hier keinerlei Annahmen über den Inhalt der Variablen getroffen werden. Eine derart angebundene externe Hardware nennt man übrigens "memory-mapped", weil sie ihre Werte ins Memory (=Hauptspeicher) mapped (=einblendet).<br />
<br />
Allerdings kann volatile nur bei den Variablen sinnvoll genutzt werden, die "von außen" auch änderbar sind. Bei lokalen Variablen, auch statischen, einer Funktion kann das nur passieren, wenn ihre Adresse einer ISR z.B. durch einen globalen Pointer bekannt gemacht wird.<br />
<syntaxhighlight lang="c"><br />
uint8_t *v;<br />
ISR( irgendein_Interrupt )<br />
{<br />
i = 5;<br />
*v = 42;<br />
}<br />
<br />
int main()<br />
{<br />
uint8_t i; // kann sich nie unerwartet ändern -> volatile nutzlos, behindert nur Optimizer<br />
<br />
volatile uint8_t j; // kann sich unerwartet ändern (über globalen *v)<br />
v = &j;<br />
...<br />
while( 1 ) {<br />
if( i == 5 )<br />
j = 8;<br />
if( j == 5 )<br />
i = 3;<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
= Konstanten an fester Flash-Adresse =<br />
<br />
Wie kann man eine Konstante an entsprechender Adresse im Flash ablegen?<br />
<br />
Mehmet Kendi hat eine Lösung für [[AVR Studio]] & [[WinAVR]] in <br />
[http://www.mikrocontroller.net/topic/142704#1453079] angegeben.<br />
<br />
= Timer =<br />
== Was macht ein Timer? ==<br />
Oft hört man im Forum die Aussage: Timer sind so kompliziert!<br />
<br />
Aber eigentlich stimmt das nicht. Ganz im Gegenteil, Timer sind eigentlich eine sehr einfache Sache. Was genau macht eigentlich ein Timer? Die Antwort lautet: er zählt unabhängig vom restlichen Programmfluss vor sich hin. Und? Was macht er noch? Nichts. Das wars schon. Im Kern ist genau das auch schon alles was ein Timer macht.<br />
[[Bild:Timer_Basis.gif|framed|center|ein 8-Bit Timer bei der Arbeit]]<br />
<br />
== Wie schnell macht er es? ==<br />
Aber so einfach ist die Sache dann doch wieder nicht. Da erhebt sich zunächst mal die Frage: wie schnell zählt denn eigentlich so ein Timer? Normalerweise ist der Timer mit der Taktfrequenz des Prozessors gekoppelt, so dass zb bei einer Taktfrequnz von 1Mhz der Timer auch genau so schnell zählt. In 1 Sekunde zählt ein Timer also von 0 bis 1000000, also 1 Mio Zählschritte. Nun kann aber ein beispielsweise 8-Bit Timer nicht bis 1000000 zählen, dazu ist er nicht groß genug. Mit 8 Bit kann man bis 255 zählen. Zählt man da dann noch 1 dazu, dann läuft der Timer über und beginnt wieder bei 0. Man kann daher ruhigen Gewissens sagen: In 1 Sekunde zählt dieser Timer 3906 mal den Bereich von 0 bis 255 (und weiter auf 0) durch (das sind 256 Zählschritte) und zuätzlich schafft er es danach noch bis 64 zu zählen. Denn 3906 * 256 + 64 = 1000000 und wir haben wieder die 1 Mio Zählschritte, die der Timer in 1 Sekunde erledigt.<br />
<br />
Das ist ganz schön schnell. Und weil das oft zu schnell ist, hat jeder Timer noch die Möglichkeit sogenannte Vorteiler (Prescaler) vor den Zähltakt zu schalten. Zb einen Vorteiler von 8. Anstelle von 1Mhz bekommt der Timer dann eine Frequenz von 1Mhz / 8 (= 125kHz) präsentiert. Und dementsprechend würde er in 1 Sekunde dann nur noch von 0 bis 125000 (= 1.000.000 / 8) zählen. Als 8 Bit Timer bedeutet das, dass er in 1 Sekunde jetzt nur noch 488 komplette Zyklen 0 bis 255 schafft und dann noch bis 72 zählen kann. Denn 488 * 256 + 72 = 125000<br />
<br />
== Das kann aber nicht alles gewesen sein? ==<br />
Bis jetzt ist das alles noch unspektakulär und man fragt sich: Was hab ich jetzt davon, wenn der Timer vor sich hinzählt? Nun, die Situation ändert sich, wenn man weiß, dass man bei bestimmten Ereignissen und/oder Zählerständen etwas auslösen lassen kann. So ist zb. dieser Überlauf von 255 auf 0 so ein Ereignis. Mittels eines Interrupts kann man auf dieses Ereignis reagieren lassen und als Folge davon wird eine Funktion vollautomatisch aufgerufen. Und zwar unabhängig davon, was der µC gerade sonst so tut. Und das ist schon recht cool, denn es bedeutet, dass man regelmäßig zu erfolgende Dinge in so eine ISR (Interrupt Service Routine, die Funktion die aufgerufen wird) stecken kann und der Timer sorgt ganz von alleine dafür, dass diese Funktionalität auch tatsächlich regelmäßig ausgeführt wird. Regelmäßig bedeutet in diesem Fall dann auch wirklich regelmäßig. Denn der Timer zählt ja losgelöst von den restlichen Arbeiten, die der µC sonst so erledigt, vor sich hin. Es spielt keine Rolle, ob der µC gerade mitten in einer komplizierten Berechnung steckt oder nicht. Der Timer zählt vor sich hin, und wenn das entsprechende Ereignis eintritt, wird der Interrupt ausgelöst. Und wenn der entsprechende Interrupt mit einer ISR-Funktion gekoppelt ist, dann wird der normale Programmfluss unterbrochen und der µC arbeitet genau diese eine Funktion ab. Und zwar in regelmässigen Zeitabständen, weil ja auch der Interrupt regelmässig auftritt.<br />
[[Bild:Timer_ISR.gif|framed|center|ein 8-Bit Timer löst durch seinen Overflow regelmäßige ISR Aufrufe aus]]<br />
Gut, beispielsweise 488 mal in der Sekunde mag für so manchen Zweck zu oft sein, aber es gibt ja auch noch andere Vorteiler (welche steht im Datenblatt) und dann kann man ja auch innerhalb der ISR in einer lokalen Variablen mitzählen und zb nur bei jedem 2.ten Aufruf eine Aktion machen, die dann nur noch 244 mal in der Sekunde ausgeführt wird. Hier gibt es also mehrere Möglichkeiten, wie man die Aufrufhäufigkeit weiter herunterteilen kann, so dass man sich der Zahl annähert, die man benötigt.<br />
<br />
<syntaxhighlight lang="c"><br />
// Für einen Mega16.<br />
// Andere Prozessoren: siehe Datenblatt wie die Timerkonfiguration einzustellen ist<br />
<br />
#define F_CPU 1000000UL<br />
#include <avr/io.h><br />
#include <avr/interrupt.h><br />
<br />
//<br />
// der Timer wird mit 1Mhz getaktet. Vorteiler ist 8<br />
// d.h. der Timer läuft mit 125kHz und würde daher in 1 Sekunde<br />
// von 0 bis 124999 zaehlen.<br />
// Aber nach jeweils 256 Zaehlungen erfolgt ein Overflow.<br />
// Daher werden in 1 Sekunde 125000 / 256 = 488.28125 Overflows erzeugt<br />
// Oder anders ausgedrückt: 1 / 488.2815 = 0.002048<br />
// alle 0.002048 Sekunden erfolgt ein Overflow<br />
//<br />
ISR( TIMER0_OVF_vect ) // Overflow Interrupt Vector<br />
{<br />
static uint8_t swTeiler = 0;<br />
<br />
swTeiler++;<br />
if( swTeiler == 200 ) { // nur bei jedem 200.ten Aufruf. Effektiv teilt dieses die<br />
// die Aufruffrequenz des nachfolgenden Codes nochmal um<br />
swTeiler = 0; // einen Faktor 200. Der nachfolgende Code wird daher nicht<br />
// alle 0.002 Sekunden sondern alle 0.4096 Sekunden ausgeführt.<br />
// Das reicht, dass man eine LED am Port schon blinken sieht.<br />
PORTD = PORTD ^ 0xFF; // alle Bits am Port umdrehen, einfach damit sich was tut<br />
}<br />
}<br />
<br />
int main()<br />
{<br />
DDRD = 0xFF; // irgendein Port, damit wir auch was sehen<br />
<br />
TIMSK |= (1<<TOIE0); // den Overflow Interrupt des Timers freigeben<br />
TCCR0 = (1<<CS01); // Vorteiler 8, jetzt zählt der Timer bereits<br />
<br />
<br />
sei(); // und Interrupts generell freigeben<br />
<br />
<br />
while( 1 )<br />
{ // hier braucht nichts mehr gemacht werden.<br />
} // der Timer selbst sorgt dafür, dass die ISR Funktion<br />
} // regelmäßig aufgerufen wird<br />
</syntaxhighlight><br />
<br />
== CTC Modus ==<br />
Manchmal reicht das aber nicht. Benötigt man zb nicht 488 sondern möglichst genau 500 ISR Aufrufe in der Sekunde, so wird man weder mit Vorteiler noch durch Softwaremässiges Weiterteilen in der ISR zum Ziel kommen. Man kann natürlich die Taktfrequenz des kompletten Systems soweit umstellen, dass sich das alles ausgeht, aber oft ist das einfach nicht möglich. Was tun?<br />
<br />
Die Sache wäre einfacher, wenn man dem Timer vorschreiben könnte, nicht einfach nur von 0 bis 255 zu zählen, sondern wenn man ihm eine Obergrenze vorgeben könnte. Denn dann könnte man sich eine Obergrenze so bestimmen, dass dieser neue Zählbereich in 1 Sekunde ganz genau so oft durchlaufen werden kann, wie man es benötigt. Und hier kommt der sog. <b>CTC</b> Modus ins Spiel. Denn genau darin besteht sein Wesen: Man gibt dem Timer eine Obergrenze vor. Erreicht seine Zählung diesen Wert, so wird der Timer auf 0 zurückgesetzt und beginnt wieder von vorne. Genau das was wir benötigen. Wollen wir exakt 500 ISR Ausfrufe in der Sekunde haben (bei 1 Mhz Systemtakt), dann wählen wir einen Vorteiler von 8 und setzen die Obergrenze auf 250-1 (nicht vergessen: wir brauchen 250 Zählschritte, das bedeutet der Timer muss von 0 bis 249 zählen, denn auch der Überlauf von 249 zurück auf 0 ist ein Zählschritt). Der Timer taktet dann mit 1Mhz / 8 = 125kHz und da nach jeweils 250 Zählschritten die Obergrenze erreicht ist, wird diese Obergrenze in 1 Sekunde 125000 / 250 = 500 mal erreicht. Genau so wie wir das wollten.<br />
Wie wird dem Timer nun mitgeteilt, dass er eine spezielle Obergrenze benutzen soll? Nun, jeder Timer hat verschiedene Modi. Welche das bei einem konkreten µC und bei einem konkreten Timer genau sind, findet sich im Datenblatt im Abschnitt über die Timer. Normalerweise ist immer eines der letzteren Abschnitte eines jeden Kapitels im Datenblatt das interessantere: "Register Summary" oder "Register Description" genannt (die Datenblätter sind da nicht ganz einheitlich). So auch hier.<br />
[[Bild:FAQ_Datenblatt_Timer_Mega16.png|framed|center|Auszug aus dem Atmel Datenblatt für den Mega16 - Suche im Datenblatt]]<br />
In jedem Atmel Datenblatt findet sich bei jedem Timer immer auch besagter Abschnitt (im Inhaltsverzeichnis beim Kapitel über den jeweiligen Timer suchen. Im Datenblatt-PDF daher immer das Inhaltsverzeichnis anzeigen lassen!), und in diesem Abschnitt gibt es eine Tabelle, aus der hervorgeht, welche Modi es gibt, welche Bits dazu in den Konfigurationsregistern gesetzt werden müssen, wie sich dann die Obergrenze des Timer-Zählbereichs zusammensetzt und noch ein paar Angaben mehr. Beim Mega16 findet sich diese Tabelle für den Timer 0 zb auf Seite 83 und dort ist es die Tabelle 14.2. Diese Tabelle sieht im Datenblatt so aus<br />
<br />
<center><br />
{| {{Tabelle}} <br />
|- style="background-color:#ffddcc"<br />
! Mode || WGM01 || WGM00 || Timer/Counter || TOP || Update of || TOV0 Flag<br />
|- style="background-color:#ffddcc"<br />
! || (CTC0) || (PWM0) || Mode of Operation || || OCR0 || Set-on<br />
|-<br />
| 0 || 0 || 0 || Normal || 0xFF || Immediate || MAX<br />
|-<br />
| 1 || 0 || 1 || PWM, Phase Correct || 0xFF || TOP|| BOTTOM<br />
|-<br />
| 2 || 1 || 0 || CTC || OCR0 || Immediate || MAX<br />
|-<br />
| 3 || 1 || 1 || Fast PWM || 0xFF || BOTTOM || MAX<br />
|}<br />
</center><br />
<br />
Dort beginnt man mit der Recherche und sucht sich die Bits für den gewünschten Modus raus. Mit diesen Bits sieht man dann in den Konfigurationsregistern nach, welches Bit zu welchem Register gehört und setzt es ganz einfach. In unserem Fall möchten wir den CTC Modus, also den Modus 2. Dazu muss das Bit WGM01 gesetzt werden und WGM00 muss auf 0 bleiben. Im Datenblatt ein wenig zurückscrollen bringt ans Licht, dass das Bit WGM01 im Konfigurationsregister TCCR0 angesiedelt ist. Weiters entnehmen wir der Tabelle, dass der Timer bis zum Wert in OCR0 zählen wird (die Spalte <b>TOP</b>). Dort hinein müssen also die 250-1 als Obergrenze geschrieben werden.<br />
<br />
Wichtig ist auch noch: Dieser Spezialmodus CTC löst keinen Overflow Interrupt aus, sondern einen sog. Compare Match Interrupt. Dies deshalb, weil die gewünschte Obergrenze ja laut Datenblatt in eines der sog. Compare Match Register geschrieben werden muss (OCR0). Das sind Spezialregister, die nach jedem Zählvorgang mit dem Zählregister verglichen werden. Stimmt ihr Inhalt mit dem des Zählregisters überein, so hat man einen Compare-Match und kann daran wieder eine Aktion (ISR) knüpfen. In diesem speziellen Fall des CTC Modus beinhaltet dieser Compare Match dann auch noch das automatische Rücksetzen des Timers auf 0.<br />
<br />
Und natürlich können auch mehrere Techniken kombiniert werden. Z. B. CTC Modus und zusätzliches weiteres softwaremässiges Herunterteilen in der ISR sieht dann so aus:<br />
<br />
<syntaxhighlight lang="c"><br />
// Für einen Mega16.<br />
// Andere Prozessoren: siehe Datenblatt wie die Timerkonfiguration einzustellen ist<br />
<br />
#define F_CPU 1000000UL<br />
#include <avr/io.h><br />
#include <avr/interrupt.h><br />
<br />
ISR( TIMER0_COMP_vect ) // Compare Match Interrupt Vector<br />
{<br />
static uint8_t swTeiler = 0;<br />
<br />
swTeiler++;<br />
if( swTeiler == 200 ) {<br />
swTeiler = 0;<br />
PORTD = PORTD ^ 0xFF;<br />
}<br />
}<br />
<br />
int main()<br />
{<br />
DDRD = 0xFF; // irgendein Port, damit wir auch was sehen<br />
<br />
TIMSK = (1<<OCIE0); // den Output Compare Interrupt des Timers freigeben<br />
OCR0 = 250 - 1; // nach 250 Zaehlschritten -> Interrupt und Timer auf 0<br />
TCCR0 = (1<<WGM01) | (1<<CS01); // Vorteiler 8, CTC Modus<br />
<br />
<br />
sei(); // und Interrupts generell freigeben<br />
<br />
<br />
while( 1 )<br />
{ // hier braucht nichts mehr gemacht werden.<br />
} // der Timer selbst sorgt dafür, dass die ISR Funktion<br />
} // regelmässig aufgerufen wird <br />
</syntaxhighlight><br />
<br />
== Fast PWM ==<br />
<br />
Aber der Timer kann noch mehr. Wenn der Timer so vor sich hinzählt, dann kann man bestimmte Output-Pins des µC an diesen Timer koppeln. Der Timer kann dann diesen Pin bei erreichen von bestimmten Zählerständen ganz von alleine wahlweise auf 0 schalten, auf 1 schalten oder umdrehen.<br />
<br />
Was passiert da genau? Im folgenden sei von der einfachsten Form der PWM auf einem Mega16 ausgegangen: Wenn der Timer in seiner Zählerei bei 0 ist, dann schaltet er den Pin auf 1, bei einem bestimmten Zählerstand soll er den Pin wieder auf 0 zurücksetzen und ansonsten soll der Timer wie gewohnt laufend von 0 bis 255 durchzählen.<br />
Es ist die Rede vom Timer-Modus 3, siehe die vorhergehende Tabelle aus dem Datenblatt.<br />
<br />
Der Tabelle entnehmen wir wieder: Die Bits WGM01 und WGM00 müssen auf 1 gestellt werden. Der TOP Wert (also der Wert, bis zu dem der Timer zählt) ist 0xFF (also 255) und das OCR0 Register steuert, bei welchem Zählerstand die Timerhardware den Pin wieder auf 0 zurück schaltet. Das Einschalten auf 1 ist vorgegeben (auch das kann man ändern, dazu später mehr).<br />
<br />
Stellt man also genau diese Konfiguration her und schreibt in das Register OCR0 beispielsweise den Wert 253, dann beginnt der Timer bei 0 zu zählen, wobei der den Ausgangspin auf 1 schaltet. Wird der Zählerstand 253 erreicht, dann schaltet der Timer den Pin wieder auf 0 zurück und zählt weiter bis 255 um dann wieder erneut bei 0 zu beginnen (und den Ausgansg-Pin wieder auf 1 zu schalten). Der Ausgangspin ist in diesem Fall also die meiste Zeit auf 1 und nur ganz kurz (während der Timer von 253 bis 255 zählt) auf 0.<br />
<br />
Schreibt am auf der anderen Seite in das Register OCR0 den Wert 3, dann passiert konzeptionell genau dasselbe nur mit anderen Zahlenwerten. Der Timer beginnt bei 0 zu zählen und schaltet den Ausgansgpin auf 1. Aber diesmal ist es bereits beim Zählerstand 3 so weit: Der Zählerstand stimmt mit dem Wert in OCR0 überein und als Folge davon wird der Ausgangspin wieder auf 0 gestellt. Der Timer zählt natürlich wie immer weiter bis 255 ehe dann das ganze Spiel wieder von vorne beginnt. In diesem Fall war also der Ausgangspin nur ganz kurze Zeit auf 1 (nämich in der Zeit, die der Timer benötigt um von 0 bis 3 zu zählen) und dann die meiste Zeit auf 0. Und genau darum geht es bei PWM: Mit dem Register OCR0 lässt sich daher der zeitliche Anteil steuern, in dem der Pin auf 1 liegt.<br />
<br />
<br />
<syntaxhighlight lang="c"><br />
// Für einen Mega16.<br />
// Andere Prozessoren: siehe Datenblatt wie die Timerkonfiguration einzustellen ist<br />
<br />
#define F_CPU 1000000UL<br />
#include <avr/io.h><br />
#include <util/delay.h><br />
<br />
int main()<br />
{<br />
uint8_t i;<br />
<br />
DDRB |= (1<<PB3); // PB3 auf Ausgang stellen. Dieser Pin<br />
// trägt auch die Bezeichnung OC0 und ist der Pin<br />
// an dem der Timer 0 seine PWM ausgibt<br />
<br />
OCR0 = 250;<br />
TCCR0 = (1<<WGM01) | (1<<WGM00) | (1<<CS01); // Vorteiler 8, Fast PWM 8 Bit<br />
TCCR0 = (1<<COM01); <br />
<br />
while( 1 )<br />
{ // hier braucht nichts mehr gemacht werden.<br />
// der Timer selbst sorgt dafür, dass die PWM läuft<br />
// wir wollen aber ein wenig Action haben.<br />
// Also setzen wir das OCR0 Register auf verschiedene<br />
// Werte, damit eine angeschlossene LED unterschiedliche<br />
// Helligkeiten zeigt<br />
OCR0 = 30;<br />
_delay_ms( 1000 );<br />
OCR0 = 200;<br />
_delay_ms( 1000 );<br />
<br />
for( i = 0; i < 255; ++i ) {<br />
OCR0 = i;<br />
_delay_ms( 10 );<br />
}<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
Bleibt noch das gesetzte Bit COM01. Was hat es damit auf sich? Bisher war immer die Rede davon, das der Ausganspin bei einem Zählerstand von 0 auf 1 geschaltet wird usw. Das regelt genau dieses Bit. Im Datenblatt findet sich die Tabelle 14.4 auf der Seite 83, die genau regelt welche Bedeutung die Bits COM01 bzw COM00 haben, wenn der Timer Modus auf Fast-PWM eingestellt ist. Achtung: Je nach Timer-Modus haben diese Bits andere Bedeutungen! Man muss sich also immer die zum jeweiligen Timer-Modus gehörende Tabelle im Datenblatt suchen.<br />
<br />
<br />
<references /><br />
<br />
<br />
<br />
[[Kategorie:C]]<br />
[[Kategorie:avr-gcc]]</div>Schweigstillhttps://www.mikrocontroller.net/index.php?title=Benutzer:Schweigstill&diff=78656Benutzer:Schweigstill2013-09-26T20:47:56Z<p>Schweigstill: </p>
<hr />
<div>Mein Name ist Andreas Schweigstill und ich bin Eigentümer und geschäftsführender Gesellschafter der folgenden Unternehmen:<br />
<br />
<pre><br />
Schweigstill IT | Embedded Systems<br />
Schauenburgerstraße 116<br />
24118 Kiel<br />
Web: http://www.schweigstill.de/<br />
</pre><br />
<br />
und<br />
<br />
<pre><br />
Baltic Seagull Electronics UG (haftungsbeschränkt)<br />
Schauenburgerstraße 116<br />
24118 Kiel<br />
Web: http://www.baltic-seagull.de/<br />
</pre><br />
<br />
Zu erreichen bin ich wie folgt:<br />
<pre><br />
Telefon: 0431/530354-0<br />
Mobil: 0171/6921973<br />
E-Mail: andreas@schweigstill.de<br />
</pre></div>Schweigstillhttps://www.mikrocontroller.net/index.php?title=Lokale_Elektroniklieferanten&diff=67936Lokale Elektroniklieferanten2012-08-16T11:01:14Z<p>Schweigstill: /* Kiel */</p>
<hr />
<div>=Einleitung=<br />
Diese Liste enthält '''Ladengeschäfte''', bei denen man als Privatkunde lokal, vor Ort, elektronische Bauteile erhalten kann. Keine Flohmärkte, einmalige Veranstaltungen oder Geschäfte, die nur an gewerbliche Kunden verkaufen.<br />
<br />
__TOC__<br />
<br />
Falls die Darstellungsart nicht gefällt oder Rubriken fehlen, so bitte nicht hier ändern, sondern das Template anpassen: [[Vorlage:ElektronikLieferant]]<br><br />
So soll das Template ausgefüllt werden:<br />
{{ElektronikLieferant<br />
|Firmenname=hier Firmenname eintragen<br />
|Straße=Straßenname, z.&nbsp;B. Musterstraße 123<br />
|PLZ=PLZ, z.&nbsp;B. 12345<br />
|Ort=Ort, z.&nbsp;B. München<br />
|Telefon=Telnr., z.&nbsp;B. 012345/12341234<br />
|Fax=Faxnr., z.&nbsp;B. 012345/12345234<br />
|Öffnungszeiten=Öffnungszeiten eintragen<br>Neue Zeile mit "br" abgetrennt<br />
|Weblink=http://www.mikrocontroller.net Link ohne umschliessende eckige Klammern<br />
|Email=Emailadresse, z.&nbsp;B. xxx@yyy.de<br />
|Bemerkung=ggf. Bemerkung, ansonsten Rubrik/Feld/Variable leer lassen<br />
}}<br />
<br />
=Deutschland=<br />
==Baden-Württemberg==<br />
===Aalen===<br />
{{ElektronikLieferant<br />
|Firmenname=mükra electronic shop GmbH<br />
|Straße=Wilhelm-Zapf-Str. 9<br />
|PLZ=73430<br />
|Ort=Aalen<br />
|Telefon=07361/610820<br />
|Fax=07361/610821<br />
|Öffnungszeiten=Mo.-Fr. 9.00 - 13.00 Uhr, 14.00 - 18.00 Uhr<br>Sa. 9.00 - 13.00 Uhr<br />
|Weblink=http://www.muekra.com/Filiale_Aalen<br />
|Email=info@muekra.de<br />
|Bemerkung=Keine SMD-Teile<br />
}}<br />
<br />
===Esslingen===<br />
{{ElektronikLieferant<br />
|Firmenname=mükra electronic shop GmbH<br />
|Straße=Bahnhofstr. 23<br />
|PLZ=73728<br />
|Ort=Esslingen<br />
|Telefon=0711/355676<br />
|Fax=0711/3108656<br />
|Öffnungszeiten=Mo.-Fr. 9.00 - 13.00 Uhr, 14.30 - 18.00 Uhr<br>Sa. 9.00 - 13.00 Uhr<br />
|Weblink=http://www.muekra.com/Filiale_Esslingen<br />
|Email=info@muekra.de<br />
|Bemerkung=Keine Mikrocontroller, keine SMD-Teile (ausser einige wenige Transistoren)<br />
}}<br />
<br />
===Göppingen===<br />
{{ElektronikLieferant<br />
|Firmenname=mükra electronic shop GmbH<br />
|Straße=Geislinger Str. 2<br />
|PLZ=73033<br />
|Ort=Göppingen<br />
|Telefon=07161/9641718<br />
|Fax=07161/9641730<br />
|Öffnungszeiten=Mo.-Fr. 9.00 - 12.30 Uhr, 14.00 - 18.00 Uhr<br>Sa. 9.00 - 13.00 Uhr<br />
|Weblink=http://www.muekra.com/Filiale_Goeppingen<br />
|Email=info@muekra.de<br />
|Bemerkung=Keine Mikrocontroller, keine SMD-Teile (ausser einige wenige Transistoren). Es besteht die Möglichkeit die Bauteile die nicht im Sortiment vorhanden sind zu bestellen. Dies ist sehr günstig und passiert in 2-3 Werktagen.<br />
}}<br />
<br />
===Heilbronn===<br />
{{ElektronikLieferant<br />
|Firmenname=Krauss Elektronik GmbH<br />
|Straße=Turmstraße 20<br />
|PLZ=74072 <br />
|Ort=Heilbronn<br />
|Telefon=07131/68191<br />
|Fax=07131/68192<br />
|Öffnungszeiten=Mo.-Mi.+Fr. 9.00 - 18.00 Uhr<br>Do. 9.00 - 19.00 Uhr<br>Sa. 9.00 - 13.00 Uhr<br />
|Weblink=http://www.krauss-elektronik.de/<br />
|Email=info@krauss-elektronik.de<br />
|Bemerkung=<br />
}}<br />
===Freiburg===<br />
{{ElektronikLieferant<br />
|Firmenname=Omega electronic GmbH<br />
|Straße=Eschholzstr. 58-60<br />
|PLZ=79115<br />
|Ort=Freiburg<br />
|Telefon=0761/76776-0<br />
|Fax=0761/76776-55<br />
|Öffnungszeiten=Mo.-Sa.: 10:00 - 19:30<br />
|Weblink=http://www.omega-electronic.de<br />
|Email=info@omega-electronic.de<br />
|Bemerkung=<br />
}}<br />
===Karlsbad===<br />
{{ElektronikLieferant<br />
|Firmenname=IT-WNS, Thomas Heldt<br />
|Straße=Schulstr. 13<br />
|PLZ=76307<br />
|Ort=Karlsbad - Mutschelbach<br />
|Telefon=07202/936083<br />
|Fax=07202/936085<br />
|Öffnungszeiten=Nach Vereinbahrung (Email-Kontakt)<br />
|Weblink=http://www.it-wns.de<br />
|Email=info@it-wns.de<br />
|Bemerkung=Bestellungen im Onlineshop können wahlweise auch direkt abgeholt werden<br />
}}<br />
<br />
===Karlsruhe===<br />
{{ElektronikLieferant<br />
|Firmenname=mükra electronic shop GmbH<br />
|Straße=Fritz-Erler-Straße 24<br />
|PLZ=76133<br />
|Ort=Karlsruhe<br />
|Telefon=0721/374270<br />
|Fax=0721/9379171<br />
|Öffnungszeiten=Mo.-Fr. 9.00 - 13.00 Uhr, 14.30 - 18.00 Uhr<br>Sa. 9.00 - 13.00 Uhr<br />
|Weblink=http://www.muekra.com/filiale_karlsruhe.html<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Werner Bremer Elektrotechnik & Einzelhandel<br />
|Straße=Zähringerstraße 55a<br />
|PLZ=76133<br />
|Telefon=<br />
|Fax=<br />
|Ort=Karlsruhe<br />
|Weblink=<br />
|Email=<br />
|Öffnungszeiten=<br />
|Bemerkung=Vielleicht geschlossen?? keine Website. Versand?<br />
}}<br />
<br />
===Offenburg===<br />
{{ElektronikLieferant<br />
|Firmenname=Günther Wultschner (Elektronikladen)<br />
|Straße=Luisenstraße 16<br />
|PLZ=77654<br />
|Ort=Offenburg<br />
|Telefon=0781 43270<br />
|Fax=<br />
|Öffnungszeiten=Mo.-Fr. 9.00 - 19:00 Uhr<br>Sa. 9.00 - 16.00 Uhr<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
===Pforzheim===<br />
{{ElektronikLieferant<br />
|Firmenname=mükra electronic shop GmbH<br />
|Straße=Westliche Karl-Friedrich-Str. 73 <br />
|PLZ=75172 <br />
|Ort=Pforzheim<br />
|Telefon=07231 313952<br />
|Fax=<br />
|Öffnungszeiten=Mo.-Fr. 9.00 - 12:30 Uhr; 14.00 Uhr - 18.00 Uhr<br>Sa. 9.00 - 13.00 Uhr<br />
|Weblink=http://www.muekra.com/Filiale_Pforzheim<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
===Reutlingen===<br />
{{ElektronikLieferant<br />
|Firmenname=mükra electronic shop GmbH<br />
|Straße=Federnseestr. 4 <br />
|PLZ=72764<br />
|Ort=Reutlingen<br />
|Telefon=07121/370748<br />
|Fax=07121/370741<br />
|Öffnungszeiten=Mo.-Fr. 9.30 - 13.00 Uhr, 14.00 - 18.00 Uhr<br>Sa. 9.30 - 13.00 Uhr<br />
|Weblink=http://www.muekra.com/filiale_reutlingen.html<br />
|Email=info@muekra.de<br />
|Bemerkung=Keine SMD-Teile<br />
}}<br />
<br />
===Schwäbisch Gmünd===<br />
{{ElektronikLieferant<br />
|Firmenname=mükra electronic shop GmbH<br />
|Straße=Kalter Markt 12<br />
|PLZ=73525<br />
|Ort=Schwäbisch Gmünd<br />
|Telefon=07171/64352<br />
|Fax=07171/405684<br />
|Öffnungszeiten=Mo.-Fr. 9.00 - 12.30 Uhr, 14.00 - 18.00 Uhr<br>Sa. 9.30 - 13.00 Uhr<br />
|Weblink=http://www.muekra.com/Filiale_Schwaebisch_Gmuend<br />
|Email=info@muekra.de<br />
|Bemerkung=Keine SMD-Teile<br />
}}<br />
<br />
===Stuttgart===<br />
{{ElektronikLieferant<br />
|Firmenname=Dräger Electronic & Audio GmbH<br />
|Straße=Hauptstätter Strasse 55<br />
|PLZ=70178<br />
|Ort=Stuttgart<br />
|Telefon=+49 711 601818-46<br />
|Fax=<br />
|Öffnungszeiten=Montag - Freitag 10:00 - 19:00 Uhr Samstag 10:00 - 16:00 Uhr<br />
|Weblink=http://www.dea-gmbh.de<br />
|Email=info@draeger-electronic.de<br />
|Bemerkung= Audio, Hifi, Tontechnik, Kabel, schon lange keine Bauelemente mehr!<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad<br />
|Straße=Kronenstraße 7, Altes Postquartier<br />
|PLZ=70173<br />
|Ort=Stuttgart<br />
|Telefon=0180 5 564445 (14 Cent/Min. aus dem Festnetz, max. 42 Cent/Min. aus dem Mobilfunknetz)<br />
|Fax=<br />
|Öffnungszeiten=Mo.-Sa. 10.00-20.00 Uhr<br />
|Weblink=http://www.conrad.de/ce/de/ChainstoreInfo.html?detail&chainstorecode=CS_DE_S<br />
|Email=filiale.stuttgart@conrad.de<br />
|Bemerkung=<br />
}}<br />
<br />
===Ulm===<br />
{{ElektronikLieferant<br />
|Firmenname=AW-Elektronik<br />
|Straße=Im Brühl 9<br />
|PLZ=89194<br />
|Ort=Ulm/Schnürpflingen<br />
|Dienstleistungen=Entwicklung Hard & Software; Leiterplattenbestückung SMD und THD; Leiterplattenlayout und Routing<br />
|Weblink=http://www.aw-elektronik.de<br />
|Email=info@aw-elektronik.de<br />
|Öffnungszeiten=<br />
|Telefon=<br />
|Fax=<br />
|Bemerkung=Nach Absprache können lagernde Bauteile gekauft werden. Am Lager sind SMD-Bauteile wie z.B. AVR, Widerstände, Kondensatoren, LEDs; Die LEDs sind als WarmWeiß 3500K (1800mcd), Kaltweis 7000K (2850mcd), Rot (1500mcd) und Blau (350mcd) und UV vorhanden.<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=mükra electronic shop GmbH<br />
|Straße=Neutorstr. 20<br />
|PLZ=89073<br />
|Ort=Ulm<br />
|Telefon=0731/64494<br />
|Fax=0731/6028676<br />
|Öffnungszeiten=Mo.-Fr. 9.00 - 18.00 Uhr<br>Sa. 9.00 - 13.00 Uhr<br />
|Weblink=http://www.muekra.com/Filiale_Ulm<br />
|Email=<br />
|Bemerkung=Keine SMD-Teile<br />
}}<br />
<br />
===Villingen-Schwenningen===<br />
{{ElektronikLieferant<br />
|Firmenname=Buchmann Elektronik<br />
|Straße=Wasenstraße 51<br />
|PLZ=78054<br />
|Ort=Villingen-Schwenningen<br />
|Telefon=07720/1308<br />
|Fax=07720/1360<br />
|Öffnungszeiten=Montag bis Freitag 09.00 - 12.30 & 14.00 - 19.00 Uhr; Mittwoch Nachmittag geschlossen; Samstag geschlossen<br />
|Weblink=http://www.buchmann-elektronik.de<br />
|Email=buchmann-elektronik@t-online.de<br />
|Bemerkung=keine SMD.<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=SchiBe Elektronik<br />
|Straße=Mühlenstr. 9<br />
|PLZ=78050<br />
|Ort=Villingen-Schwenningen<br />
|Telefon=07721/8879880<br />
|Fax=07721/88798820<br />
|Öffnungszeiten=Mo-Fr.; Zeiten leider unbekannt<br />
|Weblink=http://www.schibe.de<br />
|Email=info@SchiBe.de<br />
|Bemerkung=Bestellt auf Anfrage ohne Versandkosten bei Conrad mit Selbstabholung dort.<br />
}}<br />
<br />
==Bayern==<br />
===Ansbach===<br />
{{ElektronikLieferant<br />
|Firmenname=Mehl Electronic<br />
|Straße=Schaitbergerstr. 1<br />
|PLZ=91522<br />
|Ort=Ansbach<br />
|Telefon=0981/977166<br />
|Fax=0981/977167<br />
|Öffnungszeiten=Montag - Freitag 09:00 - 18:00 Uhr<br>Samtag 10:00 - 13:00 Uhr <br />
|Weblink=http://www.electronic-mehl.de<br />
|Email=service@electronic-mehl.de<br />
|Bemerkung=<br />
}}<br />
<br />
===Aschaffenburg===<br />
{{ElektronikLieferant<br />
|Firmenname=VS Elektronik OHG<br />
|Straße= Magnolienweg 3<br />
|PLZ= 63739<br />
|Ort=Aschaffenburg <br />
|Telefon=06021-30460<br />
|Fax=06021-304626<br />
|Öffnungszeiten= Montag - Freitag: 09:00 - 18:00 Uhr<br>Samstag: 09:00 - 13:00 Uhr<br />
|Weblink=http://www.vs-electronic.de<br />
|Email=info@vs-electronic.de<br />
|Bemerkung= führt Vellemann Bausätze, PCs, Telekommunikation und Bauteile<br />
}}<br />
<br />
===Augsburg===<br />
{{ElektronikLieferant<br />
|Firmenname=rf-elektronik<br />
|Straße= Karlstraße 2, Eingang über Obstmarkt<br />
|PLZ=86150<br />
|Ort=Augsburg <br />
|Telefon=0821 39830<br />
|Fax=0821 518727<br />
|Öffnungszeiten= Montag - Freitag: 10:00 - 18:00 Uhr<br>Samstag: 10:00 - 13:00 Uhr<br />
|Weblink=http://www.rf-elektronik.de<br />
|Email=info@rf-elektronik.de<br />
|Bemerkung=Bauelemente, Satellitentechnik+Zubehör, Halbleitertechnik, Satellitenanlagenbau, Akkus, im Laden befindet sich als nettes Schmankerl auch ein winziges, technisches Bücher-Antiquariat<br />
}}<br />
<br />
===Bamberg===<br />
{{ElektronikLieferant<br />
|Firmenname=Elektronik Box<br />
|Straße=Untere Königstraße 29<br />
|PLZ=96052<br />
|Ort=Bamberg<br />
|Telefon=0951 28500<br />
|Öffnungszeiten= Montag - Freitag: 9:00 - 13:00 Uhr, 14:00 - 18:00 Uhr<br>Samstag: 9:00 - 13:00 Uhr <br />
|Weblink=<br />
|Email=<br />
|Bemerkung=<br />
<br />
}}<br />
<br />
===Erlangen===<br />
{{ElektronikLieferant<br />
|Firmenname=Schoffer Radio-Fernseh-Elektronik<br />
|Straße=Beethovenstraße 2<br />
|PLZ=91052<br />
|Ort=Erlangen<br />
|Telefon=09131 25288<br />
|Fax=<br />
|Öffnungszeiten=<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Feller-electronic<br />
|Straße=Marquardsenstraße 21<br />
|PLZ=91054 <br />
|Ort=Erlangen<br />
|Telefon=09131 27595<br />
|Fax=<br />
|Öffnungszeiten=Mo-Fr 9.00 - 13.00, 14.00-18.00 Uhr. Sa 9.00 - 14.00 Uhr<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
===Fürth===<br />
{{ElektronikLieferant<br />
|Firmenname=B+D Electronic GmbH<br />
|Straße=Königstr. 107 (gegenüber Citycenter und neben Feuerwehr)<br />
|PLZ=90762 <br />
|Ort=Fürth<br />
|Telefon=0911 - 77 30 40<br />
|Fax=<br />
|Öffnungszeiten=Mo - Fr: 10.00 - 12.30 & 14.00 - 18.00<br>Sa: 10.00 - 13.00<br />
|Weblink=http://www.bdelectronic.de/<br />
|Email=<br />
|Bemerkung= keine Microkontoller<br />
}}<br />
<br />
===Holzheim===<br />
{{ElektronikLieferant<br />
|Firmenname=RH Electronic Eva Spaeth<br />
|Straße=Ostertalstraße 15<br />
|PLZ=86684<br />
|Ort=Holzheim<br />
|Telefon=08276 / 58800<br />
|Fax=08276 / 58802<br />
|Öffnungszeiten=<br />
|Weblink=http://rhelectronic.tradoria.de/<br />
|Email=eva@peterscable.de<br />
|Bemerkung=<br />
}}<br />
<br />
=== Kaufbeuren ===<br />
{{ElektronikLieferant<br />
|Firmenname=Jantsch-Elektronik GmbH<br />
|Straße=Porschestraße 26<br />
|PLZ=87600<br />
|Ort=Kaufbeuren<br />
|Telefon=0 83 41 / 95 33-0<br />
|Fax=0 83 41 / 37 00<br />
|Öffnungszeiten=Mo-Fr 9:00-12:30 / 13:30-18:00<br/><br />
Sa 9:00-13:00 Uhr<br />
|Weblink= http://www.j-e.de<br />
|Email=info@j-e.de<br />
|Bemerkung=führt auch gebrauchte Messgeräte<br />
}}<br />
<br />
===Landshut===<br />
{{ElektronikLieferant<br />
|Firmenname=Der Elektronik Landen<br />
|Straße=Innere Münchener Straße 16<br />
|PLZ=84036<br />
|Ort=Landshut<br />
|Telefon=<br />
|Fax=<br />
|Öffnungszeiten=Mo - Fr 8:00 - 12:00, 14:00 - 18:00; Sa 8:00 - 12:00<br />
|Weblink=<br />
|Email=<br />
|Bemerkung= kleiner, aber feiner Laden. Verkauft eher nur Analogtechnik, Röhren, und recht selten gewordene Sachen<br />
}}<br />
<br />
===Leiblfing (bei Straubing)===<br />
{{ElektronikLieferant<br />
|Firmenname=Hans Entner Funkelektronik<br />
|Straße=Landshuter Straße 1 <br />
|PLZ=94339<br />
|Ort=Leiblfing<br />
|Telefon=(0 94 27) 90 20 86<br />
|Fax=09427 - 902087<br />
|Öffnungszeiten= leider nicht bekannt<br />
|Weblink=<br />
|Email=Entner-DF9RJ@t-online.de<br />
|Bemerkung= Kleiner Laden und sehr netter Inhaber. Einige Geräte und Zubehör. Viele HF-Stecker (v.a. SMA, BNC, N und PL(UHF)) und Koax-Kabel. Bietet auch Reparaturen an.<br />
}}<br />
<br />
===München===<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic<br />
|Straße=Tal 29<br />
|PLZ=80331 <br />
|Ort=München<br />
|Telefon=<br />
|Fax=<br />
|Öffnungszeiten=Mo - Fr: 9:00 - 20:00<br>Sa: 9:00 - 20:00<br />
|Weblink=http://www.conrad.de/<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic<br />
|Straße=Hanauer Straße 91 (gegenüber OEZ)<br />
|PLZ=80993 <br />
|Ort=München - Moosach<br />
|Telefon=<br />
|Fax=<br />
|Öffnungszeiten=Mo - Fr: 9:30 - 20:00<br>Sa: 9:00 - 20:00<br />
|Weblink=http://www.conrad.de/<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Bürklin<br />
|Straße=Grünwalder Weg 30<br />
|PLZ=82041 <br />
|Ort=Oberhaching<br />
|Telefon=(089) 55 875-0<br />
|Fax=(089) 55 875-421<br />
|Öffnungszeiten=Mo - Do: 9:00 - 16:30<br>Fr: 9:00 - 13:00<br />
|Weblink=http://buerklin.de/<br />
|Email=info@buerklin.de<br />
|Bemerkung= Achtung neuer Standort nicht mehr Schillerstraße !!!<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Strixner & Holzinger<br />
|Straße=Schillerstraße 25-29<br />
|PLZ=80336 <br />
|Ort=München<br />
|Telefon=<br />
|Fax=<br />
|Öffnungszeiten=Mo - Fr: 9:30 - 18:00<br />
|Weblink=http://sh-halbleiter.de/<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
===Regensburg===<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic<br />
|Straße=Langobardenstraße 2<br />
|PLZ=93053<br />
|Ort=Regensburg<br />
|Telefon=0180 5 564445<br />
|Fax=<br />
|Öffnungszeiten=Mo - Sa: 9:30 - 20:00<br />
|Weblink=http://www.conrad.de/<br />
|Email=filiale.regensburg@conrad.de<br />
|Bemerkung=Im Fachmarktzentrum Bajuwarenstraße<br />
}}<br />
<br />
===Schweinfurt===<br />
{{ElektronikLieferant<br />
|Firmenname=Spath Elektronische Bauteile<br />
|Straße=Cramerstr. 9<br />
|PLZ=97421<br />
|Ort=Schweinfurt<br />
|Telefon=09721/25186<br />
|Fax=09721/22999<br />
|Öffnungszeiten=<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
===Straubing===<br />
{{ElektronikLieferant<br />
|Firmenname=Röhrner Electronic<br />
|Straße=Innere Passauer Str. 12<br />
|PLZ=94315<br />
|Ort=Straubing<br />
|Telefon=09421/12573<br />
|Fax=09421/22207<br />
|Öffnungszeiten=Mo - Do: 9:00 - 18:00<br>Sa: 10:00 - 13:00<br />
|Weblink=http://www.roehrner-electronic.de/<br />
|Email=<br />
|Bemerkung=Netter Elektronikladen mit vielen Halbleitern neben dem üppigen Standardsortiment<br />
}}<br />
<br />
===Pförring===<br />
{{ElektronikLieferant<br />
|Firmenname=Pollin<br />
|Straße=Max-Pollin-Straße 1<br />
|PLZ=85104<br />
|Ort=Pförring<br />
|Telefon=<br />
|Fax=<br />
|Öffnungszeiten=Mo.-Fr. 9 - 19 Uhr<br>Sa. 9 - 16 Uhr <br />
|Weblink=http://www.pollin.de/shop/static/ecenter.htm<br />
|Email=<br />
|Bemerkung=nähe Ingolstadt<br />
}}<br />
<br />
==Berlin==<br />
===Charlottenburg-Wilmersdorf===<br />
{{ElektronikLieferant<br />
|Firmenname=Segor-electronics<br />
|Straße=Kaiserin-Augusta-Allee 94<br />
|PLZ=10589<br />
|Ort=Berlin<br />
|Telefon=030 4399843<br />
|Fax=030 4399855<br />
|Öffnungszeiten=Mo.-Fr. 10.00-13.30 Uhr und 14:30-18:00 Uhr, Sa. 10.00-13.00 Uhr<br />
|Weblink=http://www.segor.de<br />
|Email=sales@segor.de<br />
|Bemerkung=Sehr gut sortiertes und vielseitiges Sortiment, preiswert, hochwertig.<br />
}}<br />
<br />
===Kreuzberg===<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic<br />
|Straße=Hasenheide 14-15<br />
|PLZ=10967<br />
|Ort=Berlin<br />
|Telefon=0180 5 564445 <br />
|Fax=<br />
|Öffnungszeiten=Mo.-Fr. 10.00-20.00 Uhr, Sa. 10.00-18.00 Uhr <br />
|Weblink=http://www.conrad.de<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
===Prenzlauer Berg===<br />
{{ElektronikLieferant<br />
|Firmenname=SLY electronic<br />
|Straße=Erich-Weinert-Straße 139-141<br />
|PLZ=10409<br />
|Ort=Berlin<br />
|Telefon=030 428492-0<br />
|Fax=030 428492-29<br />
|Öffnungszeiten=Mo.-Fr. 10.00-20.00 Uhr, Sa. 10.00-16.00 Uhr<br />
|Weblink=http://www.sly.de<br />
|Email=mail@sly.de<br />
|Bemerkung=<br />
}}<br />
<br />
===Schöneberg===<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic<br />
|Straße=Kleiststraße 30-31<br />
|PLZ=10787<br />
|Ort=Berlin<br />
|Telefon=0180 5 564445 <br />
|Fax=<br />
|Öffnungszeiten=Mo.-Sa. 10.00-20.00 Uhr<br />
|Weblink=http://www.conrad.de<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Atzert Radio<br />
|Straße=Kleiststraße 32-33<br />
|PLZ=10787<br />
|Ort=Berlin<br />
|Telefon=030/212984-0 <br />
|Fax=030/212984-11<br />
|Öffnungszeiten=Montag-Samstag 10:00-19.00 Uhr<br />
|Weblink=http://www.atzert-radio.de/<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
===Steglitz===<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic<br />
|Straße=Schloßstraße 34-36<br />
|PLZ=12163<br />
|Ort=Berlin<br />
|Telefon=0180 5 564445 <br />
|Fax=<br />
|Öffnungszeiten=Mo.-Do. 10.00-20.00 Uhr, Fr.-Sa. 10.00-22.00 Uhr<br />
|Weblink=http://www.conrad.de<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
==Brandenburg==<br />
<br />
===Cottbus===<br />
{{ElektronikLieferant<br />
|Firmenname=Klauck Electronic-Shop<br />
|Straße=Karl-Liebknecht-Str. 53a<br />
|PLZ=03046<br />
|Ort=Cottbus<br />
|Telefon=0355 / 797044<br />
|Fax=<br />
|Öffnungszeiten=<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=reichlich eigene Parkplätze im Hof<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=electronic Shop cottbus<br />
|Straße=Schweriner Str. 2<br />
|PLZ=03046<br />
|Ort=Cottbus<br />
|Telefon=0355 / 2890585<br />
|Fax=0355 / 539545<br />
|Öffnungszeiten=Mo.-Fr. 09.00 - 12.00 Uhr, 14.00 - 18.00 Uhr<br />
|Weblink=http://www.eshop-cb.de/eshop/<br />
|Email=<br />
|Bemerkung=der Shop ist sehr jung, daher ist das Team noch etwas unerfahren, macht dies aber durch Freundlichkeit wett<br />
}}<br />
<br />
===Frankfurt (Oder)===<br />
{{ElektronikLieferant<br />
|Firmenname=Elektronik Service Landrock<br />
|Straße=Karl-Ritter-Platz 8-9<br />
|PLZ=15230<br />
|Ort=Frankfurt (Oder) <br />
|Telefon=0335 / 6802029<br />
|Fax=0335 / 684171<br />
|Öffnungszeiten=Mo-Fr. 10-18 Uhr<br />
|Weblink=http://www.landrock-elektronik.de/<br />
|Email=<br />
|Bemerkung=Jürgen (Chef) ist superfreundlich, habe jahrelang dort eingekauft.<br />
}}<br />
<br />
==Bremen==<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic<br />
|Straße=Borgwardstr. 2<br />
|PLZ=28279<br />
|Ort=Bremen <br />
|Telefon=01 80 / 55 64 44 5<br />
|Fax=<br />
|Öffnungszeiten=<br />
|Weblink=http://www.conrad.de<br />
|Email=<br />
|Bemerkung= <br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Schuricht Distrelec GmbH<br />
|Straße=Rehland 8<br />
|PLZ=28832<br />
|Ort=Achim <br />
|Telefon= 04 20 2 / 97 47-97<br />
|Fax=<br />
|Öffnungszeiten=<br />
|Weblink=https://www.distrelec.de<br />
|Email=<br />
|Bemerkung= Nur telefonische Bestellung. Wenn man bei der Bestellung explizit sagt dass man die Sachen in Achim abholen möchte, dann klappt dies auch... meistens...<br />
}}<br />
<br />
==Hamburg==<br />
=== Hammerbrook ===<br />
{{ElektronikLieferant<br />
|Firmenname=Radio Kölsch<br />
|Straße=Kreuzbrook 14<br />
|PLZ=20537<br />
|Ort=Hamburg <br />
|Telefon=040 / 653 00 81<br />
|Fax=040 / 653 00 80<br />
|Öffnungszeiten=Montag - Freitag 10:00 - 19:00 Uhr, Samstag 10:00 - 16:00 Uhr<br />
|Weblink=http://www.shop-koelsch24.com/<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
===Hoheluft Ost===<br />
{{ElektronikLieferant<br />
|Firmenname=Statronic<br />
|Straße=Eppendorfer Weg 244<br />
|PLZ=20251<br />
|Ort=Hamburg <br />
|Telefon=040 / 422 33 22<br />
|Fax=040 / 422 33 25<br />
|Öffnungszeiten=<br />
|Weblink=http://www.statronic.de<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
===Wandsbek===<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic<br />
|Straße=Wandsbeker Zollstr. 67-69<br />
|PLZ=22041<br />
|Ort=Hamburg<br />
|Telefon=0180 5 564445 <br />
|Fax=<br />
|Öffnungszeiten=Mo.-Fr. 09.30-20.00 Uhr, Sa. 09.00-18.00 Uhr<br />
|Weblink=http://www.conrad.de<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
===Altona===<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic<br />
|Straße=Hahnenkamp 1<br />
|PLZ=22765 <br />
|Ort=Hamburg<br />
|Telefon=0180 5 564445 <br />
|Fax=<br />
|Öffnungszeiten=Mo.-Sa. 10.00-20.00 Uhr <br />
|Weblink=http://www.conrad.de<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
==Hessen==<br />
===Darmstadt===<br />
{{ElektronikLieferant<br />
|Firmenname=Zimmermann Electronic GmbH<br />
|Straße=Kasinostr. 2<br />
|PLZ=64293 <br />
|Ort=Darmstadt<br />
|Telefon=06151 - 66 69 - 240<br />
|Fax=06151 - 66 69 - 290<br />
|Öffnungszeiten=Mo.- Fr. 9:00 - 19:00 Uhr<br>Sa. 9:00 - 14:00 Uhr<br />
|Weblink=http://www.zeg-shop.de<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=EBG Electronic Business GmbH<br />
|Straße=Bismarckstr. 61<br />
|PLZ=64293 <br />
|Ort=Darmstadt<br />
|Telefon=06151 / 82 91 - 0<br />
|Fax=06151 / 82 91 - 20<br />
|Öffnungszeiten=Montag-Freitag: 9:00 bis 19:00 Uhr<br>Samstag: 9:00 bis 14:00 Uhr<br />
|Weblink=http://www.ebg-darmstadt.de<br />
|Email=info@ebg-darmstadt.de<br />
|Bemerkung=<br />
}}<br />
<br />
===Frankfurt/Main===<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic<br />
|Straße=Zeil 58 + 64 (Konstabler Wache)<br />
|PLZ=60313 <br />
|Ort=Frankfurt<br />
|Telefon=0180 5 564445<br />
|Fax=<br />
|Öffnungszeiten=Mo.-Mi. 10.00-20.00 Uhr<br>Do.-Sa. 10.00-21.00 Uhr<br />
|Weblink=http://www.conrad.de<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
===Gießen===<br />
{{ElektronikLieferant<br />
|Firmenname=Elektronik Hartel und Sanchez GbR (geschlossen)<br />
|Straße=Waldweide 14<br />
|PLZ=35398<br />
|Ort=Gießen<br />
|Telefon=<br />
|Fax=0641/9203777<br />
|Öffnungszeiten=geschlossen<br />
|Weblink=<br />
|Email=<br />
|Bemerkung= [http://www.mikrocontroller.net/topic/209488#2074882]<br />
}}<br />
<br />
===Hanau===<br />
{{ElektronikLieferant<br />
|Firmenname=MP Elektronik Vertriebs GmbH<br />
|Straße=Hospitalstr. 13<br />
|PLZ=63450 <br />
|Ort=Hanau<br />
|Telefon=06181/253077<br />
|Fax=06181/921450 <br />
|Öffnungszeiten=<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
===Kassel===<br />
{{ElektronikLieferant<br />
|Firmenname=Geddert-Elektronik<br />
|Straße=Holländische Straße 31<br />
|PLZ=34127<br />
|Ort=Kassel<br />
|Telefon=0561 / 897177<br />
|Fax=0561 / 84329<br />
|Öffnungszeiten=<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=UK-Elektronik<br />
|Straße=Königstor-Straße 52<br />
|PLZ=34117<br />
|Ort=Kassel<br />
|Telefon=0561 / 771074<br />
|Fax=<br />
|Öffnungszeiten=<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Schuro Elektronik GmbH<br />
|Straße=Friedrich-Ebert-Straße 3<br />
|PLZ=34117<br />
|Ort=Kassel<br />
|Telefon=0561 / 16415<br />
|Fax=0561 / 770318<br />
|Öffnungszeiten=<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=NT-Elektronik Toprakci Nihat Elektronik<br />
|Straße=Wolfsschlucht 10<br />
|PLZ=34117<br />
|Ort=Kassel<br />
|Telefon=0561 / 2020858<br />
|Fax=0561 / 2020857<br />
|Öffnungszeiten=Montag - Freitag 10:00 – 19:00 Uhr, Samstag 10:00 – 16:00 Uhr<br />
|Weblink=http://www.nt-elektronik.de/<br />
|Email=NT-Elektronik@hotmail.de<br />
|Bemerkung=<br />
}}<br />
<br />
===Offenbach===<br />
{{ElektronikLieferant<br />
|Firmenname=Rail Electronic<br />
|Straße=Großer Biergrund 4<br />
|PLZ=63065<br />
|Ort=Offenbach<br />
|Telefon=069 / 88 20 72<br />
|Fax=069 / 88 31 14<br />
|Öffnungszeiten=Mo. - Fr. 09.30 bis 12.30 sowie 13.30 bis 18.30 Uhr<br>Sa. 9.30 bis 13.30 Uhr<br />
|Weblink=http://www.rail-electronic.de<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
===Wetzlar===<br />
{{ElektronikLieferant<br />
|Firmenname=Electronic-Shop Lutz Hoffmann<br />
|Straße=Silhöfertorstr. 3<br />
|PLZ=35578<br />
|Ort=Wetzlar<br />
|Telefon=06441 / 94627<br />
|Fax=06441 / 946271<br />
|Öffnungszeiten=Mo. - Sa. 9.00 - 13.00 Uhr<br>Mo. - Fr. 14.00 - 18.00 Uhr<br />
|Weblink=http://www.funk-shop.de/<br />
|Email=mail@funk-shop.de<br />
|Bemerkung=<br />
}}<br />
<br />
===Wöllstadt===<br />
{{ElektronikLieferant<br />
|Firmenname=ELW Elektronik Handels GMBH<br />
|Straße=Am Kalkofen 10<br />
|PLZ=61206<br />
|Ort=Wöllstadt<br />
|Telefon=06034-4411<br />
|Fax=06034-5739<br />
|Öffnungszeiten=Mo. - Fr. 08.30 - 18.00 Uhr<br>Sa. 08.30 - 13.00 Uhr<br />
|Weblink=http://www.elw-elektronik.com/<br />
|Email=elw-gmbh@t-online.de<br />
|Bemerkung=<br />
}}<br />
<br />
==Mecklenburg-Vorpommern==<br />
===Rostock===<br />
{{ElektronikLieferant<br />
|Firmenname=A-Z City-Stores<br />
|Straße=Doberaner-Hof<br />
|PLZ=<br />
|Ort=Rostock<br />
|Telefon=0381-4031171<br />
|Fax=<br />
|Öffnungszeiten=Mo. – Fr. 9.30 – 19.30 Uhr<br>Sa. 9.30 – 16.00 Uhr<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=geringes Angebot<br>recht teuer<br />
}}<br />
<br />
==Niedersachsen==<br />
===Braunschweig===<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic GmbH<br />
|Straße=Sudetenstr. 4<br />
|PLZ=38114<br />
|Ort=Braunschweig<br />
|Telefon=0180 5 564445<br />
|Fax=???<br />
|Öffnungszeiten=Mo.-Fr. 09.30-19.00 Uhr, Sa. 09.00-18.00 Uhr (Abweichend in der Vorweihnachtszeit!)<br />
|Weblink=http://www.filialen.conrad.de/<br />
|Email=filiale.braunschweig@conrad.de<br />
|Bemerkung= Die Resterampe hinter dem Hauptgebäude gibt es nicht mehr. Dorthin wurde die Modellbau-Abteilung ausgelagert.<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=ETT - Electronic Toys Trading GmbH<br />
|Straße=Kreuzstraße 65<br />
|PLZ=38118<br />
|Ort=Braunschweig<br />
|Telefon=0531-58 11 00<br />
|Fax=0531-58 11 030<br />
|Öffnungszeiten=<br />
|Weblink=http://www.ett-online.de/<br />
|Email=bestell@ett-online.de<br />
|Bemerkung= Online-Katalog unter http://www.megakick-stores.de/. Zu Atzert-Elektronik mutiert.<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Elektronik Bauteile Vertrieb - Dipl.-Ing. Jörg Bassenberg<br />
|Straße=Nußbergstraße 9<br />
|PLZ=38102<br />
|Ort=Braunschweig<br />
|Telefon=0531-79 17 07<br />
|Fax=0531-7 60 22<br />
|Öffnungszeiten=<br />
|Weblink=http://www.bassenberg.de/<br />
|Email=info@bassenberg.de<br />
|Bemerkung= Kleines Ladengeschäft, hauptsächlich ältere Bauteile vorrätig.<br />
}}<br />
<br />
===Buxtehude===<br />
{{ElektronikLieferant<br />
|Firmenname=Sell-Elektronik<br />
|Straße=Brillenburgsweg 31A<br />
|PLZ=21614<br />
|Ort=Buxtehude<br />
|Telefon=04161-88305<br />
|Fax=-<br />
|Öffnungszeiten=Mo.-Fr. 10:00-12:00 Uhr & 15:00-18:30 Uhr, Sa. 10:00-13:00 Uhr <br />
|Weblink=<br />
|Email=<br />
|Bemerkung=Ladengeschäft. Riesen Sortiment an passiven, aktiven und mechanischen Bauteilen. Gute Beratung und faire Preise. <br />
}}<br />
<br />
===Hannover===<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic GmbH<br />
|Straße=Goseriede 3<br />
|PLZ=30159<br />
|Ort=Hannover<br />
|Telefon= 0180 5 564445<br />
|Fax=<br />
|Öffnungszeiten=Mo.-Sa. 09.00-20.00 Uhr<br />
|Weblink=http://www.filialen.conrad.de/<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Radio Menzel-Electronic<br />
|Straße=Fössestraße 6<br />
|PLZ=30451<br />
|Ort=Hannover<br />
|Telefon= 0511 442607<br />
|Fax=<br />
|Öffnungszeiten=Mo-Fr: 10:00-13:30, 14:30-18:00 Sa: 10:00-13:30<br />
|Weblink=www.menzel-electronic.de <br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Zloch-Elektronik<br />
|Straße=Calenberger Str. 33 <br />
|PLZ=30169<br />
|Ort=Hannover<br />
|Telefon=0511 15575 <br />
|Fax=<br />
|Öffnungszeiten=Mo-Fr: ? Sa: ?<br />
|Weblink=keine<br />
|Email=<br />
|Bemerkung= Zloch Elektronik ist einer der ältesten Läden dieser Art in Hannover. Man bekommt dort auch Bauteile, die selten sind (Restbestände alter Zeiten). Anfahrt mit öffentlichen Verkehrsmitteln: Haltestelle Humboldtstraße oder Haltestelle Waterloo. <br />
}}<br />
<br />
===Lüneburg===<br />
{{ElektronikLieferant<br />
|Firmenname=Beusch Elektronik<br />
|Straße=Reichenbachstr. 8<br />
|PLZ=21335 <br />
|Ort=Lüneburg<br />
|Telefon=04131 33311<br />
|Fax=?<br />
|Öffnungszeiten=Mo und Sa geschlossen, Di - Fr 10:00-13:00, 14:00-18:00<br />
|Bemerkung=<br />
}}<br />
<br />
===Oldenburg===<br />
{{ElektronikLieferant<br />
|Firmenname=ebc Utz Kohl GmbH <br />
|Straße=Alexanderstraße 31<br />
|Telefon=0441 82114<br />
|Fax=0441 85801<br />
|Weblink=www.e-b-c-elektronik.de<br />
|Email=kontakt@e-b-c-elektronik.de<br />
|PLZ=26121<br />
|Ort=Oldenburg<br />
|Öffnungszeiten=Mo. - Fr. 9:00 - 12:30 und 13:30 - 18:00 Uhr, Sa. 9:00 - 13:00 Uhr<br />
|Bemerkung=<br />
}}<br />
<br />
===Osnabrück===<br />
{{ElektronikLieferant<br />
|Firmenname=Heinicke-electronic<br />
|Straße=Meller Str. 43 <br />
|PLZ=49084<br />
|Ort=Osnabrück<br />
|Telefon=0541 587666<br />
|Fax=0541 586614 <br />
|Öffnungszeiten=Mo-Fr. 9:30-13:00Uhr und 14:30-18:00Uhr Sa. 9:30-13:00Uhr<br />
|Weblink=http://www.heinicke-electronic.de/<br />
|Email=sales@heinicke-electronic.de<br />
|Bemerkung=Haben auch einen PC Shop nebenan.<br />
}}<br />
<br />
===Wilhelmshaven===<br />
{{ElektronikLieferant<br />
|Firmenname=Reichelt Elektronik<br />
|Straße=Elektronikring 1 <br />
|PLZ=26452<br />
|Ort=Sande<br />
|Telefon=04422-955 333<br />
|Fax=04422-955 111 <br />
|Öffnungszeiten=Montag - Donnerstag: 9:00 - 17:00 Uhr; Freitag: 9:00 - 15:30 Uhr<br />
|Weblink=http://www.reichelt.de<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
==Nordrhein-Westfalen==<br />
===Aachen===<br />
Übernommen aus [http://aachen.wikia.com/wiki/Elektronik-Teile http://aachen.wikia.com/wiki/Elektronik-Teile]. Die Liste dort ist größer.<br />
* TH-Elektronic, Karlsgraben 47, 52062 Aachen, Tel: 404593, Fax: 404594, http://www.th-electronic.de/ Öffnungszeiten Mo-Fr 9-19:30 Sa 9-16 Uhr<br />
* AG Elektronik Witte & von der Heide, Hirschgraben 9-11, 52062 Aachen, Tel.: 0241-25226. (Sehr freundlich und großes Sortiment, Werktags geöffnet bis 18.30 (genauere Zeiten folgen noch))<br />
* Zilles Elektronik GmbH, Bauelemente für die Elektronik, Würselener Str. 8, 52080 Aachen (Aachen-Haaren), Tel: 162745 <br />
* Helmut Singer Elektronik, Feldchen 16-24, D-52070 Aachen. http://www.singer-elektronik.de/ (Gebrauchte Messgeräte)<br />
'''Nähere Umgebung:'''<br />
* Meuschke Elektronik, Pfarrer-Gau-Str. 37-39, 52223 Stolberg, Tel. 02402/36991, http://www.meuschke-elektronik.de, info@meuschke-elektronik.de<br />
* Fleu Elektronik, Kantgasse 26, 52477 Alsdorf, Tel. 02404/22240, ubestätigt: Öffnungszeiten Mo - Fr. von 09 - 12 und 15 - 19 Uhr. <br />
<br />
===Bielefeld===<br />
{{ElektronikLieferant<br />
|Firmenname=alpha electronic Ing. A. Berger GmbH<br />
|Straße=Oldentruper Str. 104<br />
|PLZ=33604<br />
|Ort=Bielefeld<br />
|Telefon=0521-324333<br />
|Fax=0521-320435<br />
|Öffnungszeiten=Mo. – Sa. 9.00 – 13.00 Uhr<br>Mo. – Fr. 14.00 – 18.00 Uhr<br />
|Weblink=http://www.alphaelectronic.de/<br />
|Email=info@alphaelectronic.de<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Fuchs und Lützow Elekronik - Handelsges. mbH<br />
|Straße=Heeper Str. 184<br />
|PLZ=33607<br />
|Ort=Bielefeld<br />
|Telefon=0521-5576555<br />
|Fax=0521-5576557<br />
|Öffnungszeiten=Mo. – Sa. 9.00 – 13.00 Uhr<br>Mo. – Fr. 14.00 – 18.00 Uhr<br />
|Weblink=http://www.electronicfuchs.com/<br />
|Email=info@electronicfuchs.com<br />
|Bemerkung=<br />
}}<br />
<br />
===Bonn===<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic<br />
|Straße=Karlstraße 3<br />
|PLZ=53115<br />
|Ort=Bonn<br />
|Telefon=0180 5 564445<br />
|Fax=<br />
|Öffnungszeiten=Mo.-Sa. 10.00-20.00 Uhr <br />
|Weblink=http://www.filialen.conrad.de/rubriken/filialen.php?filiale=28<br />
|Email=filiale.bonn@conrad.de <br />
|Bemerkung=<br />
}}<br />
{{ElektronikLieferant<br />
|Firmenname=P & M Elektronik Bonn GmbH<br />
|Straße=Budapester Straße 6<br />
|PLZ=53111<br />
|Ort=Bonn<br />
|Telefon=0228-656005<br />
|Fax=0228-656336<br />
|Öffnungszeiten=Mo-Fr 09:00 – 19:00 Uhr<br>Sa 10:00 – 16:00 Uhr<br />
|Weblink=http://www.pm-elektronik-bonn.de/<br />
|Email=pm-elektronikbonn@web.de<br />
|Bemerkung=<br />
}}<br />
<br />
===Dortmund===<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic<br />
|Straße=Westenhellweg 95-101<br />
|PLZ=44137<br />
|Ort=Dortmund<br />
|Telefon=01805-564445 <br />
|Fax=<br />
|Öffnungszeiten=Mo. – Fr. 10.00 – 20.00 Uhr<br>Sa. 9.30 – 20.00 Uhr<br />
|Weblink=http://www.conrad.de<br />
|Email=<br />
|Bemerkung=direkt in der Innenstadt<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=SR-Tronic<br />
|Straße=Beratgerstr. 28<br />
|PLZ=44149<br />
|Ort=Dortmund<br />
|Telefon=0231-33671-0<br />
|Fax=0231-33671-25<br />
|Öffnungszeiten=Mo. – Fr. 10.00 – 18.00 Uhr<br />
|Weblink=http://www.sr-tronic.de<br />
|Email=info@sr-tronic.de<br />
|Bemerkung=Ist zwar ein Versandhandel, Abholung ist aber möglich, extrem kleines Elektroniksortiment (Atmel, Eproms), ist eigentlich ein Satshop.<br />
}}<br />
<br />
<!-- laut Diskussion:Lokale_Elektroniklieferanten gibt es den Laden nicht mehr.<br />
{{ElektronikLieferant<br />
|Firmenname=Electronic am Wall<br />
|Straße=Hoher Wall 22<br />
|PLZ=44137<br />
|Ort=Dortmund<br />
|Telefon=0231-16863<br />
|Fax= 0231-160632<br />
|Öffnungszeiten=Mo. – Fr. 9.00 – 18.00 Uhr (?)<br />
|Weblink=http://electronic-am-wall.de<br />
|Email=electronic-am-wall@t-online.de<br />
|Bemerkung=Alteingesessener Laden mit mittlerem Elektronik und Bauteilesortiment (Leider nicht mehr so viel wie früher).<br />
}}<br />
--><br />
<br />
=== Duisburg ===<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Elektro Urban<br />
|Straße=Kaiser-Friedrich-Straße 127<br />
|PLZ=47169<br />
|Ort=Duisburg<br />
|Telefon=0203-593311<br />
|Fax=<br />
|Öffnungszeiten=Mo. – Fr. 9.00 – 18.00 Uhr, Mittagspause von 13.00 - 15.00 Uhr<br>Sa. 9.00 – 14.00 Uhr<br />
|Email=<br />
|Weblink=<br />
|Bemerkung=<br />
}}<br />
<br />
=== Düsseldorf ===<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic<br />
|Straße=Oststraße 34<br />
|PLZ=40211<br />
|Ort=Düsseldorf<br />
|Telefon=0211 - 38 83 76 - 0<br />
|Fax=0211 - 38 83 76 - 14<br />
|Öffnungszeiten=Mo.-Sa. 9.30-20.00 Uhr<br />
|Email=filiale.duesseldorf@conrad.de <br />
|Weblink=http://www.conrad.de<br />
|Bemerkung=<br />
}}<br />
<br />
===Essen===<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic<br />
|Straße=Altendorfer Str. 11<br />
|PLZ=45127<br />
|Ort=Essen<br />
|Telefon=01805-564445 <br />
|Fax=<br />
|Öffnungszeiten=Mo. – Fr. 10.00 – 19.30 Uhr<br>Sa. 10.00 – 13.00 Uhr<br />
|Weblink=http://www.conrad.de<br />
|Email=filiale.essen@conrad.de<br />
|Bemerkung=schräg gegenüber von IKEA, Tiefgarage im UG für Kunden kostenlos, Karte an der Kasse lochen lassen<br />
}}<br />
<br />
===Herne===<br />
{{ElektronikLieferant<br />
|Firmenname=Electronic Hanke<br />
|Straße=Wilhelmstr. 38 <br />
|PLZ=44649<br />
|Ort=Herne<br />
|Telefon=02325-52728 <br />
|Fax=<br />
|Öffnungszeiten=Mo. – Fr. 10.00 – 18.00 Uhr, außer Dienstags ab 15.00Uhr<br>Mittagspause von 13.00 Uhr - 15.00 Uhr<br>Sa. 9.30 – 13.00 Uhr<br />
|Weblink=http://www.electronic-hanke.de/<br />
|Email=electronic_hanke@t-online.de<br />
|Bemerkung=<br />
}}<br />
<br />
===Köln===<br />
{{ElektronikLieferant<br />
|Firmenname=M. + M. van der Meyden GmbH<br />
|Straße=Breite Straße 101<br />
|PLZ=50667<br />
|Ort=Köln<br />
|Telefon=0221/2576369<br />
|Fax=0221/2576369<br />
|Öffnungszeiten=Mo.–Fr. von 9:30 – 19:00 Uhr<br>Sa. von 10:00 – 16:30 Uhr <br />
|Weblink=http://vandermeyden.de<br />
|Email=http://vandermeyden.de/?page_id=13<br />
|Bemerkung=Sehr teuer (Standard Quarz HC49/S --> 1,50€); Muss µCs extra bestellen<br />
}}<br />
<br><br />
<br />
===Bergisch Gladbach===<br />
{{ElektronikLieferant<br />
|Firmenname=MS-Elektronik<br />
|Straße=Laurentiusstraße 20<br />
|PLZ=51465<br />
|Ort=Bergisch Gladbach<br />
|Telefon=02202 - 93 22 17<br />
|Fax=02202 - 93 22 18<br />
|Öffnungszeiten=Mo.-Fr.: 09:00-12:30 & 14:30 - 18:30 Uhr<br>Sa: 09:00 - 14:00 Uhr<br />
|Weblink=http://www.ms-elektronik.info/<br />
|Email=info@ms-elektronik.info<br />
|Bemerkung= Auch Versand<br />
}}<br />
<br />
===Langenfeld===<br />
{{ElektronikLieferant<br />
|Firmenname=rs elektronik - Reinhard Sinzel<br />
|Straße=Solinger Straße 152<br />
|PLZ=40764<br />
|Ort=Langenfeld<br />
|Telefon=02173/22766<br />
|Fax=02173/25958<br />
|Öffnungszeiten=Mo-Fr 10:00-13:00 + 15:00-18:00, Sa 10:00-13:00<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=zwischen Polizeiwache und Bahnunterführung auf der linken Seite. Nur Ladenverkauf!<br />
}}<br />
<br />
===Moers===<br />
{{ElektronikLieferant<br />
|Firmenname=Nürnberg Electronic<br />
|Straße=Uerdinger Str. 121<br />
|PLZ=47441<br />
|Ort=Moers<br />
|Telefon=02841-32221 <br />
|Fax=02841-31733<br />
|Öffnungszeiten=Mo.- Fr. 9:00 - 13:00 und 14:00 - 18:00<br>Samstag 9:00 - 13:00<br>Mittwoch Nachmittag geschlossen!<br />
|Weblink=http://www.nuernberg-electronic.de/<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
===Mönchengladbach===<br />
{{ElektronikLieferant<br />
|Firmenname=Brunenberg Elektronik<br />
|Straße=Lürriper Straße 170<br />
|PLZ=41065<br />
|Ort=Mönchengladbach<br />
|Telefon=02161-44421<br />
|Fax=02161-42552<br />
|Öffnungszeiten=Mo.- Fr. 9:00 - 13:00 und 14:00 - 18:00<br>Samstag 9:00 - 13:00<br>Donnerstag Nachmittag geschlossen!<br />
|Weblink=http://www.bruntronic.de<br />
|Email=info@bruntronic.de<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Zilles Elektronik GmbH<br />
|Straße=Staufenstraße 8-10<br />
|PLZ=41061<br />
|Ort=Mönchengladbach<br />
|Telefon=02161/176005<br />
|Fax=02161/176007<br />
|Öffnungszeiten=Montag - Freitag 8:30 - 13:00 & 14:00 - 18:00<br>Samstag 9:00 - 12:00<br />
|Weblink=http://www.zilles-elektronik.de/<br />
|Email=info@zilles-elektronik.de<br />
|Bemerkung=<br />
}}<br />
<br />
===Monheim am Rhein===<br />
<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Schukat electronic Vertriebs GmbH<br />
|Straße=Daimlerstraße 26<br />
|PLZ=40789<br />
|Ort=Monheim am Rhein<br />
|Telefon=02173 - 950-5<br />
|Fax=02173 - 950-999<br />
|Öffnungszeiten=montags bis freitags zwischen 8 Uhr und 18 Uhr<br />
|Weblink=http://www.schukat.com<br />
|Email=info@schukat.com<br />
|Internet: www.schukat.com<br />
|Bemerkung=nur Gewerblich Teile können nach Vorbestellung auch abgeholt werden ! <br />
}}<br />
<br />
===Paderborn===<br />
{{ElektronikLieferant<br />
|Firmenname=Jansen-Elektronik GmbH & Co. KG (GK-Elektronik Guido Kloss)<br />
|Straße=Heiersstraße 24<br />
|PLZ=33098 <br />
|Ort=Paderborn<br />
|Telefon=05251-282848<br />
|Fax=05251-282851<br />
|Öffnungszeiten=Mo. – Fr. 9.30 – 13.00 Uhr<br>Mo. – Fr. 14.30 – 18.30 Uhr<br>Sa. 9.30 – 14.00 Uhr<br />
|Weblink=http://www.jansen-elektronik.de/<br />
|Email=info@jansen-elektronik.de<br />
|Bemerkung=<br />
}}<br />
<br />
===Recklinghausen===<br />
{{ElektronikLieferant<br />
|Firmenname=Elektronik-Center Wenzlik, Inh. H.- J. Juhnke<br />
|Straße=Halterner Straße 24<br />
|PLZ=45657 <br />
|Ort=Recklinghausen<br />
|Telefon=02361-14103<br />
|Fax=02361-182489<br />
|Öffnungszeiten=Mo.-Fr.: 9.00h-13.00h u. 14.30h-18.30h, Sa.: 10.00h-13.00h geöffnet!<br />
|Weblink=http://www.Wenzlik-RE.de<br />
|Email=ecw-recklinghausen@t-online.de<br />
|Bemerkung= Elektronik Einzelhandel 35.000 verschiedene Artikel vorrätig.<br />
}}<br />
<br />
===Siegen===<br />
{{ElektronikLieferant<br />
|Firmenname=Radig Hard & Software, Inh. U. Radig<br />
|Straße=An der Bahn 18<br />
|PLZ=57223<br />
|Ort=Kreuztal<br />
|Telefon=02732-762442<br />
|Fax=02732-762443<br />
|Öffnungszeiten=Nach Vereinbahrung<br />
|Weblink=http://www.ulrichradig.de<br />
|Email=mail@ulrichradig.de<br />
|Bemerkung=<br />
}}<br />
<br />
<br />
===Wuppertal===<br />
{{ElektronikLieferant<br />
|Firmenname=WE elektronik<br />
|Straße=Sedanstraße 88<br />
|PLZ=42281<br />
|Ort=Wuppertal<br />
|Telefon=0202-510444<br />
|Fax=0202-510666<br />
|Öffnungszeiten=Mo.- Fr. 9.00 - 18.00<br />
|Weblink=http://www.we-wuppertal.de/<br />
|Email=info@we-wuppertal.de<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=K&K Elektronic<br />
|Straße=Höhne 33<br />
|PLZ=42275<br />
|Ort=Wuppertal<br />
|Telefon=0202<br />
|Fax=0202<br />
|Öffnungszeiten=<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
==Rheinland-Pfalz==<br />
===Andernach===<br />
{{ElektronikLieferant<br />
|Firmenname=EDV + Elektronic Systeme Manuel Zitzer e.K.<br />
|Straße=Füllscheuer 30<br />
|PLZ=56626<br />
|Ort=Andernach<br />
|Telefon=02632/9293-0<br />
|Fax=02632/9293-33<br />
|Öffnungszeiten=Montag-Freitag 8:00 Uhr - 12:00 Uhr und 14:00 Uhr - 18:00 Uhr, Dienstag zusätzlich bis 19:00 Uhr, Samstag geschlossen<br />
----<br />
<br />
|Weblink=http://www.eleksys.de/<br />
|Email=info@eleksys.de<br />
<br />
----<br />
<br />
|Bemerkung=<br />
}}<br />
<br />
===Kaiserslautern===<br />
{{ElektronikLieferant<br />
|Firmenname=BURCKHARDT-ELEKTRONIK<br />
|Straße=Waldstr. 17<br />
|PLZ=67659 <br />
|Ort=Kaiserslautern<br />
|Telefon=+49 (0)631 70114<br />
|Fax=49 (0)631 70162<br />
|Öffnungszeiten=Montag-Donnerstag 8:00 Uhr - 16:45 Uhr/Freitag 8:00 Uhr - 12:00 Uhr<br />
|Weblink=http://www.burckhardt-elektronik.de<br />
|Email=burckhardt-elektronik@web.de<br />
|Bemerkung=<br />
}}<br />
<br />
===Koblenz===<br />
{{ElektronikLieferant<br />
|Firmenname=Radio Erbar<br />
|Straße=Bahnhofstr. 40<br />
|PLZ=56068 <br />
|Ort=Koblenz<br />
|Telefon=0261/34782<br />
|Fax=0261/14570<br />
|Öffnungszeiten=Montag-Freitag 9:00 Uhr - 18:00 Uhr/Samstag 9:00 Uhr - 12:00 Uhr<br />
|Weblink=http://www.radio-erbar.de/<br />
|Email=webmaster@radio-erbar.de<br />
|Bemerkung=<br />
}}<br />
===Mainz===<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic<br />
|Straße=Binger Str. 14-16 (nähe Hauptbahnhof)<br />
|PLZ=55122 <br />
|Ort=Mainz<br />
|Telefon=0180 5312111<br />
|Fax=<br />
|Öffnungszeiten=<br />
|Weblink=http://www.conrad.de/<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Elektronik Schmidt<br />
|Straße=Boppstraße 62 - 64<br />
|PLZ=55118 <br />
|Ort=Mainz<br />
|Telefon=0180 5312111<br />
|Fax=<br />
|Öffnungszeiten=Montag - Freitag 09.00 Uhr - 13.00 Uhr und 14.00 Uhr - 18.00 Uhr<br><br />
Samstag 09.00 Uhr - 13.00 Uhr<br />
|Weblink=http://www.schmidt-electronic.de<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
==Saarland==<br />
=== Saarbrücken ===<br />
{{ElektronikLieferant<br />
|Firmenname=ESS Elektronik Service Skowronek<br />
|Straße=Peter-Zimmer-Str. 13<br />
|PLZ=66123 <br />
|Ort=Saarbrücken<br />
|Telefon=+49 (681) 816414<br />
|Fax= +49 (681) 816992<br />
|Öffnungszeiten= Mo-Fr 8:00-12:00 Uhr / 14:00-18:00 Uhr<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad<br />
|Straße=Trierer Straße 16-20<br />
|PLZ=66111<br />
|Ort=Saarbrücken<br />
|Telefon=0180 5 564445 (derzeit 14 Cent/Min. aus dem Festnetz der Dt. Telekom. Evtl. abweichende Preise für Anrufe aus den Mobilfunknetzen.)<br />
|Fax=<br />
|Öffnungszeiten= Mo.-Fr. 09.00-19.00 Uhr / Sa. 09.00-19.00 Uhr<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
==Sachsen==<br />
===Chemnitz===<br />
{{ElektronikLieferant<br />
|Firmenname=mükra electronic shop GmbH<br />
|Straße=Hartmannstr.45<br />
|PLZ=09113<br />
|Ort=Chemnitz<br />
|Telefon=0371/365736<br />
|Fax=0371/365736<br />
|Öffnungszeiten=Mo.-Fr. 10.00 Uhr - 18.00 Uhr<br>Sa. 10.00 Uhr - 13.00 Uhr<br />
|Weblink=http://www.muekra.com/Filiale_Chemnitz<br />
|Email=<br />
|Bemerkung=gut sortiert aber keine SMD BE | wirkt manchmal recht unfreundlich und demotiviert<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=köhler-elektronik<br>Firma Michael Köhler<br />
|Straße=Erfenschlager Straße 31<br />
|PLZ=09125<br />
|Ort=Chemnitz<br />
|Telefon=(03 71) 51 91 03<br />
|Fax=(03 71) 51 91 04<br />
|Öffnungszeiten=Mo.-Fr. von 9 - 18 Uhr <br> Sa. von 9 - 12 Uhr<br />
|Weblink=http://www.koehler-elektronik.de<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=NEUMERKEL<br />
|Straße=Straße der Nationen 26<br />
|PLZ=09111<br />
|Ort=Chemnitz<br />
|Telefon=(03 71) 6 66 29 27<br />
|Fax=(03 71) 6 66 29 51<br />
|Öffnungszeiten=Mo.-Fr. von 9 - 13 und 14 - 18 Uhr<br />
|Weblink=http://www.neumerkel.de<br />
|Email=neumerkel.chemnitz@neumerkel.de<br />
|Bemerkung=zwischen B. Uhse und ehemals McDonald’s :)<br />
}}<br />
<br />
===Dresden===<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad<br />
|Straße=Friedrich-List-Platz 2<br>gegenüber Hauptbahnhof<br />
|PLZ=01069<br />
|Ort=Dresden <br />
|Telefon=<br />
|Fax=<br />
|Öffnungszeiten=Mo.-Fr. 09.30-20.00 Uhr, <br>Sa. 09.00-20.00 Uhr<br />
|Weblink=<br />
|Email=<br />
|Bemerkung= verhältnismäßig teuer<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Sullus<br />
|Straße=Tharandter Str. 67<br />
|PLZ=01187<br />
|Ort=Dresden <br />
|Telefon=0351 4112100<br />
|Fax=0351 4112146<br />
|Öffnungszeiten=Mo.-Fr. 10.00-18.30 Uhr, <br>Sa. 09.00-12.00 Uhr<br />
|Weblink=http://www.sullus.de/<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Elektronic-Shop Meissen<br>Rainer Pötzsch<br />
|Straße=Neugasse 34<br />
|PLZ=01662<br />
|Ort=Meissen<br />
|Telefon= +49 3521 452301<br />
|Fax= +49 3521 452399<br />
|Öffnungszeiten=Mo.-Fr. von 9 - 19 Uhr <br> Sa. von 9 - 32 Uhr<br />
|Weblink=http://www.electronic-poetzsch.de<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
===Leipzig===<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad<br />
|Straße=Neumarkt 20<br />
|PLZ=04109<br />
|Ort=Leipzig <br />
|Telefon=<br />
|Fax=<br />
|Öffnungszeiten=Mo.-Sa.: 09.30-20.00 Uhr<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=ELMICRO Computer GmbH & Co. KG <br />
|Straße=Hohe Str. 9-13<br />
|PLZ=04107<br />
|Ort=Leipzig <br />
|Telefon=+49-(0)341-9104810<br />
|Fax=+49-(0)341-9104818<br />
|Öffnungszeiten=Mo.-Sa.: 09.00-17.00 Uhr<br />
|Weblink=http://elmicro.com/de/ela-leipzig.html<br />
|Email=leipzig|at|elmicro.com<br />
|Bemerkung=Besucher werden gebeten, sich kurzfristig telefonisch anzumelden.<br />
}}<br />
<br />
===Zwickau===<br />
{{ElektronikLieferant<br />
|Firmenname=Elektronik Neumerkel GmbH<br />
|Straße=Kolpingstraße 20<br />
|PLZ=08058<br />
|Ort=Zwickau<br />
|Telefon=+ 49 (0)375-589920<br />
|Fax=+ 49 (0)375-5899222<br />
|Öffnungszeiten=Mo. - Fr. 9:00 - 18:00 Uhr, Sa. 9:00 - 12:30 Uhr<br />
|Weblink=http://www.neumerkel.de<br />
|Email=info@neumerkel.de<br />
|Bemerkung=<br />
}}<br />
<br />
==Sachsen-Anhalt==<br />
===Magdeburg===<br />
{{ElektronikLieferant<br />
|Firmenname=mittrenga electronic<br />
|Straße=Maxim-Gorki-Str. 34<br />
|PLZ=39108<br />
|Ort=Magdeburg<br />
|Telefon=0391/7333500<br />
|Fax=0391/7346538<br />
|Öffnungszeiten= 15.00- 18.00<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=Keine Microcontroller<br />
}}<br />
<br />
===Halle (Saale)===<br />
{{ElektronikLieferant<br />
|Firmenname=Funkhaus Alter Markt<br />
|Straße=Alter Markt 6<br />
|PLZ=06108<br />
|Ort=Halle<br />
|Telefon=0345/2831651<br />
|Fax=0345/2831651<br />
|Öffnungszeiten=Mo bis Fr<br />
|Weblink=http://www.fernsehklinik-halle.de/<br />
|Email=Service@Fernsehklinik-Halle.de<br />
|Bemerkung=elektronische Bauteile aller Art gut sortiert auf Lager. Nach Möglichkeit vorher telefonisch nachfragen(!), damit das Teil aus dem Lager geholt werden kann, insgesamt vergleichsweise teuer, ansonsten recht unkompliziert<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Westfalia<br />
|Straße=Grenzstraße 35<br />
|PLZ=06112<br />
|Ort=Halle<br />
|Telefon=0345 560 62 31<br />
|Fax=0345 560 62 32 <br />
|Öffnungszeiten= <br />
Montag - Mittwoch 08.00 - 18.30<br />
<br />
Donnerstag 08.00 - 19.00<br />
<br />
Freitag 08.00 - 18.30<br />
<br />
Samstag 08.30 - 13.30 <br />
<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=Elektronikmäßig relativ klein sortiert, keine einzelnen Bauelemente, dafür Restposten-/Sortimentebeutel mit jeweils verschiedenen Widerständen, Kondensatoren, Transistoren, LEDs etc. <br />
Ferner Platinen, vereinzelt Trafos, jede Menge Bausätze, Lötzubehör, Lautsprecher, Stecker, Buchsen und Kabel aller Art, Gehäuse<br />
}}<br />
<br />
==Schleswig Holstein==<br />
===Kiel===<br />
{{ElektronikLieferant<br />
|Firmenname=Elektronik Schmidt Inh. Karl Heinz Parting<br />
|Straße=Adelheidstr. 28<br />
|PLZ=24103<br />
|Ort=Kiel<br />
|Telefon=0431 94682<br />
|Fax=0431 92574<br />
|Öffnungszeiten=<br />
|Weblink=<br />
|Email=<br />
|Bemerkung= viele historische Bauteile verfügbar, Röhren<br />
}}<br />
<br />
===Lübeck===<br />
{{ElektronikLieferant<br />
|Firmenname=Lenzner Jürgen Elektronik GmbH<br />
|Straße=Krähenstraße 19<br />
|PLZ=23552<br />
|Ort=Lübeck<br />
|Telefon=0451 77336<br />
|Fax=<br />
|Öffnungszeiten=<br />
|Weblink=<br />
|Email=<br />
|Bemerkung= keine uC, teils historische Bauteile verfügbar, Röhren, LEDs überteuert<br />
}}<br />
<br />
===Schwentinental===<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic<br />
|Straße=Mergenthalerstr. 22<br />
|PLZ=24223<br />
|Ort=Schwentinental, OT Raisdorf<br />
|Telefon=0180 5 564445 <br />
|Fax=<br />
|Öffnungszeiten=Mo.-Sa. 10.00-20.00 Uhr<br />
|Weblink=http://www.conrad.de<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
==Thüringen==<br />
===Eisenach===<br />
{{ElektronikLieferant<br />
|Firmenname=Elektronik-Stübchen<br />
|Straße=Katharinenstraße 117<br />
|PLZ=99817<br />
|Ort=Eisenach<br />
|Telefon= (03691)77324<br />
|Fax=<br />
|Öffnungszeiten=Montag-Freitag - 9.00 bis 13.00 Uhr, 14.30 bis 18 Uhr<br />
Sonnabend 9.00 bis 12.00 Uhr<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
===Jena===<br />
{{ElektronikLieferant<br />
|Firmenname=Stefan Schmutzer VAT Elektronik<br />
|Straße=Bachstraße 10<br />
|PLZ=07743<br />
|Ort=Jena<br />
|Telefon= (03641)447184<br />
|Fax=<br />
|Öffnungszeiten= Mo-Fr. bis 18:00Uhr. Sa zu<br />
|Weblink=<br />
|Email=<br />
|Bemerkung= reichlich teuer. Für einzelne Kleinteile jedoch definitiv zu empfehlen, wenn man nicht gleich bestellen will<br />
}}<br />
<br />
===Gera===<br />
{{ElektronikLieferant<br />
|Firmenname= Neumerkel Elektronik<br />
|Straße=Karl-Schurz-Straße 12<br />
|PLZ=07545<br />
|Ort=Gera<br />
|Telefon= +49 (0) 3 65 - 82 46 90<br />
|Fax= +49 (0) 3 65 - 82 46 922<br />
|Öffnungszeiten= Mo-Fr. 9.00 bis 18:00Uhr. Sa 9.00 bis 12.00 <br />
|Weblink= http://www.neumerkel.de/gera.htm<br />
|Email=<br />
|Bemerkung= <br />
}}<br />
<br />
=Österreich=<br />
==Linz==<br />
{{ElektronikLieferant<br />
|Firmenname=Aigner Elektronik<br />
|Straße=Dinghoferstr. 63<br />
|PLZ=A-4020 <br />
|Ort=Linz<br />
|Telefon=+43 732 669691-0 <br />
|Fax=+43 732 669691-15<br />
|Öffnungszeiten=Mo. bis Fr. 8:30 bis 17:00 (keine Mittagssperre), Samstag 8:30 bis 12:00<br />
|Weblink=http://www.aigner.co.at/<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic<br />
|Straße=Kornstraße 4<br />
|PLZ=A-4060 <br />
|Ort=Leonding<br />
|Telefon=+43 732 683040-0 <br />
|Fax=+43 732 683040-13 <br />
|Öffnungszeiten=Mo. bis Fr. 9:00 bis 19:00 , Samstag 9:00 bis 17:00<br />
|Weblink=http://www.conrad.at/<br />
|Email=mailto://filiale.linz@conrad.at<br />
|Bemerkung=<br />
}}<br />
<br />
==Graz== <br />
{{ElektronikLieferant<br />
|Firmenname=Neuhold Elektronik<br />
|Straße=Griesplatz 1<br />
|PLZ=A-8020 <br />
|Ort=Graz<br />
|Telefon=+43 (0) 316 711245 <br />
|Fax=+43 (0) 316 717419<br />
|Öffnungszeiten=Montag bis Freitag von 9.00 - 18.00 Uhr<br>Samstag 9.00-12.30 Uhr<br />
|Weblink=http://www.neuhold-elektronik.at/<br />
|Email=<br />
|Bemerkung=Großes Sortiment mit auch sehr ausgefallenen Artikeln. <br> Führt eine breite Produktpalette. <br> Durchweg sehr günstige Preise, jedoch manchmal bei Standardbauteilen (Mikrocontrollern z.B. AVRs) teurer als die Konkurrenz. <br> Vergleichbar mit Pollin. <br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=L-Tronik Austria<br />
|Straße=Karlauerstraße 5<br />
|PLZ=A-8020 <br />
|Ort=Graz<br />
|Telefon=Tel: +43 (0) 316 904 672 <br />
|Fax=<br />
|Öffnungszeiten=Montag bis Freitag von 9.00 - 17.00 Uhr <br>Samstag 9.00-12.00 Uhr<br />
|Weblink=http://www.l-tronik.com/index.php<br />
|Email=info@lta.at<br />
|Bemerkung=Riesiges Sortiment an Halbleitern (Auch SMD). Solartechnik, Sicherheitstechnik, Haustechnik u.s.w..<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad<br />
|Straße=Weblinger Gürtel 25<br />
|PLZ=A-8054<br />
|Ort=Graz<br />
|Telefon=Tel: +43 (0) 50 - 20 40 73 00 <br />
|Fax=<br />
|Öffnungszeiten=Montag bis Freitag von 9.00 - 19.30 Uhr <br>Samstag 9.00 - 18.00 Uhr<br />
|Weblink=http://www.conrad.at<br />
|Email=filiale.graz@conrad.at<br />
|Bemerkung=<br />
}}<br />
<br />
==Salzburg==<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad<br />
|Straße=Alpenstraße 95 - 97<br />
|PLZ=5020 <br />
|Ort=Salzburg<br />
|Telefon=050 - 20 40 81 00<br />
|Fax=<br />
|Öffnungszeiten=Mo.-Fr. 9.00-19.00 Uhr<br>Sa. 9.00-18.00 Uhr<br />
|Weblink=http://www.conrad.at/megastores<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
==Wien==<br />
{{ElektronikLieferant<br />
|Firmenname=Technotronic<br />
|Straße=ZIEGLERGASSE 27<br />
|PLZ=1070<br />
|Ort=Wien<br />
|Telefon=+43 1 5236204<br />
|Fax=<br />
|Öffnungszeiten=Mo.-Do. 9.00-18.00 Uhr<br/>Fr. 9-15<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=auch andere Filialen in Wien<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad<br />
|Straße=Gewerbeparkstraße 12 (Gewerbepark Stadlau)<br />
|PLZ=1220 <br />
|Ort=Wien<br />
|Telefon=050 - 20 40 72 00<br />
|Fax=<br />
|Öffnungszeiten=Mo.-Fr. 9.00-19.00 Uhr<br/>Sa. 9.00-18.00 Uhr<br />
|Weblink=http://www.conrad.at/megastores<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad<br />
|Straße=Nordring 2<br />
|PLZ=2334 <br />
|Ort=Vösendorf/Süd<br />
|Telefon=050 - 20 40 71 00<br />
|Fax=<br />
|Öffnungszeiten=Mo.-Fr. 9.00-19.00 Uhr<br/>Mi 9.00-20.00 Uhr<br/>Sa. 9.00-18.00 Uhr<br />
|Weblink=http://www.conrad.at/megastores<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
=Schweiz=<br />
----<br />
== Basel-Landschaft (BL) ==<br />
=== 4450 Sissach ===<br />
{{ElektronikLieferant<br />
|Firmenname=Grieder Elektronik Bauteile AG<br />
|Straße=Reuslistrasse 62<br />
|PLZ=4450<br />
|Ort=Sissach<br />
|Telefon=061 976 95 95<br />
|Fax=061 976 95 90<br />
|Öffnungszeiten=Mo-Do 800-1200, 1300-1600 und Fr 800-1200, 1300-1500.<br />
|Weblink=http://shop.griederbauteile.ch/<br />
|Email=info@griederbauteile.ch<br />
|Bemerkung=Mindestbestellwert CHF 20. Vorbestellte Waren können abgeholt werden. Der "Laden" befindet sich 10 Minuten zu Fuss vom Bahnhof Sissach.<br />
<br />
}}<br />
<br />
== Luzern (LU) ==<br />
=== Emmenbrücke ===<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic Schweiz<br />
|Straße=Seetalstrasse 11<br />
|PLZ=6020<br />
|Ort=Emmenbrücke <br />
|Telefon=0848/80 12 83<br />
|Fax=041/267 32 14<br />
|Öffnungszeiten=Mo/Di/Do 09:00-18:30, Mi/Fr 09:00-21:00, Sa 08:00-16:00 Uhr<br />
|Weblink=http://www1.ch2.conrad.com/infocenter/filialen.php<br />
|Email=filiale.emmenbruecke@conrad.ch<br />
|Bemerkung=5 Minuten vom Bahnhof Emmenbrücke<br>GRATIS Parkhaus & Parkplätze <br />
}}<br />
<br />
== Solothurn (SO) ==<br />
===5014 Gretzenbach===<br />
{{ElektronikLieferant<br />
|Firmenname=EFG Electronic AG<br />
|Straße=Köllikerstrasse 32<br />
|PLZ=5014<br />
|Ort=Gretzenbach<br />
|Telefon= 062 849 23 61 <br />
|Fax= 062 849 23 70 <br />
|Öffnungszeiten=<br />
Mo-Fr 08:30-11:30, 13:30-18:30, Mi geschlossen, Sa 09:00-16:00 <br />
|Weblink=http://www.maxland.ch/netmax/standseiten/efg/index.html<br />
|Email=efgag@yetnet.ch <br />
|Bemerkung=Kabel - Messgeräte - Lautsprecher - elektronische Bauteile<br />
kein Versand, nur Ladengeschäft<br />
}}<br />
<br />
== Zürich (ZH) ==<br />
===8004 Zürich===<br />
{{ElektronikLieferant<br />
|Firmenname=Pusterla Elektronik AG<br />
|Straße=Hohlstrasse 52 <br />
|PLZ=8004<br />
|Ort= Zürich<br />
|Telefon=044 241 56 77<br />
|Fax=044 242 01 04<br />
|Öffnungszeiten=<br />
Mo-Fr 09:00-18:30, Sa 09:00-16:00<br />
|Weblink=http://www.pusterla.ch/<br />
|Email=info@pusterla.ch<br />
|Bemerkung=Absoluter "Kult-Laden" mit Tradition. Wer jemals in der Schweiz einen Lötkolben in der Hand hatte, der kennt "Pusti"<br />
<br />
Das Sortiment ist zweigeteilt:<br><br><br />
'''hinter dem Tresen:'''<br><br />
gutes allgemeines Bauteilesortiment, spezielle Sachen werden bestellt.<br />
<br>Man nimmt sich Zeit für Fachberatung - es wird auch schon mal ein Vergleichstyp aus der Liste gesucht und dem jungen "Case-Modder" wird mit Engelsgeduld erklärt wie man den Vorwiderstand für seine coole LED-Prozessorinnenbeleuchtung berechnet.<br />
<br />
'''vor dem Tresen - Selbstbedienung:'''<br><br />
Am Eingang nimmt man sich eine Pappschale mit Bleistift und Notizblock.<br />
Artikel, Menge und Preise schreibt man selbst auf!<br />
<br />
Das Sortiment bietet einen Querschnitt durch die elektronische Bauteilefertigung der letzten 50 Jahre. Sehr gute Quelle für spannungsfeste Kondensatoren und hochohmige (Leistungs-)Widerstände sowie mechanischem "Klein-Grabbel-Kram." Gute Auswahl an Gehäusen, Transformatoren (z.T. recht schräge Typen) sowie Relais und Stecker/Buchsen die die Welt wohl niemals gebraucht hat. <br> '''Vorsicht bei Elektrolytkondensatoren:''' "historische" Lagerware, besser man hat ein ESR-Meter dabei - sodenn man hat!<br />
<br>Kabel jeglicher Art gibt es ab der Rolle zum Selberabschneiden - auch 10cm sind kein Problem - ausrechnen und aufschreiben machst Du ja selber.<br />
<br> Präsentation der Ware im Selbsbedienungsteil:<br />
<br> Bauteile offen oder ab Gurt in kleinen, liebevoll angeschriebenen Pappschachteln (noch von Vater Pusterla), grösseren Wühlschachteln, einer Wühlecke sowie hier und da einige Merkwürdigkeiten auf dem Fussboden.<br />
Man stelle sich das Ladenlokal eines Joint-Ventures aus Oppermann, Pollin, dem ehem. Völkner sowie dem örtlichen Entsorgungshof vor - '''das''' ist "Pusti" und so war er schon immer!<br><br />
<br />
'''Fazit:''' absolut lohnenswert, auch wenn man vielleicht nicht immer das bekommt was man wollte, dafür findet man aber alles, wonach man nie gesucht hatte!<br />
}}<br />
<br />
===8092 Zürich===<br />
{{ElektronikLieferant<br />
|Firmenname="Bastli"<br>Fachverein der Departemente Informationstechnologie und Elektrotechnik und Maschinenbau und Verfahrenstechnik an der ETH Zürich.<br />
|Straße=Universitätsstrasse 19<br />
|PLZ=8092<br />
|Ort= Zürich<br />
|Telefon= n/a<br />
|Fax= n/a<br />
|Öffnungszeiten=Die Öffnungszeiten gelten nur während des Semesters.<br />
Mo 12:15 - 13:00 Uhr<br><br />
Do 12:15 - 13:00 Uhr<br><br />
<br />
|Weblink=http://www.bastli.ethz.ch/<br />
|Email=bastli@amiv.ethz.ch<br />
|Bemerkung=Studentischer "Bastel-Shop"<br />
Während den Öffnungszeiten ist der Bastli-Shop im ersten Stock des UNG geöffnet.<br />
Ihr könnt Bauteile, welche wir an Lager haben, kaufen und euch wird mit diversen elektronischen Problemen geholfen. <br />
<br />
Organisierte Sammelbestellungen bei Fa. Reichelt / Deutschland<br />
<br />
'''Standort:'''<br><br />
<br />
Bastli und Messplatz befinden sich in den Räumlichkeiten des AMIV im UNG Gebäude schräg gegenüber des CAB.<br />
Es ist das gleiche Gebäude in dem auch der ehem. AMIV-Verlag respektive ehem. WBS respektive SPOD untergebracht ist.<br />
<br />
Das Gebäude wirkt beim ersten Kontakt wohl für jeden neuen ein bisschen abschreckend. Aber keine Scheu, wenn man durch das etwas schlecht beleuchtete Treppenhaus in den ersten Stock gelangt, wendet man sich dort gleich nach rechts. Bastli und Messplatz haben die Zimmernummern C6 und C5.<br />
}}<br />
<br />
=== 8305 Dietlikon ===<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic Schweiz<br />
|Straße=Alte Dübendorferstrasse 17<br />
|PLZ=8305<br />
|Ort=Dietlikon<br />
|Telefon=0848/80 12 84<br />
|Fax=044/805 35 14<br />
|Öffnungszeiten=Mo-Do 10:00-20:00, Fr 10:00-21:00, Sa 09:00-20:00 Uhr<br />
|Weblink=http://www1.ch2.conrad.com/infocenter/filialen.php<br />
|Email=filiale.dietlikon@conrad.ch<br />
|Bemerkung=5 Minuten vom Bahnhof Dietlikon<br>Parkhaus & Parkplätze vorhanden<br />
}}<br />
<br />
=== 8606 Nänikon ===<br />
{{ElektronikLieferant<br />
|Firmenname=Distrelec Schweiz<br />
|Straße=Grabenstrasse 6<br />
|PLZ=8606<br />
|Ort=Nänikon<br />
|Telefon=044 - 944 99 11<br />
|Fax=044 - 944 99 88<br />
|Öffnungszeiten=Mo-Fr 07:30-18:00 Uhr (nur Abholschalter)<br />
|Weblink=https://www.distrelec.ch<br />
|Email=info@distrelec.com<br />
|Bemerkung='''Abholschalter:''' (Vorbestellung unbedingt erforderlich)<br />
Telefonisch oder online bestellte Ware kann nach ca. 2 Stunden abgeholt werden.<br />
<br>Es kann auch direkt vor Ort ab Katalog bestellt werden, allerdings dann Wartezeit von min. 2 Stunden<br />
<br>Bezahlung: bar/EC- und Post-Card<br />
}}<br />
<br />
= Luxembourg =<br />
=== L-1510 Luxembourg ===<br />
{{ElektronikLieferant<br />
|Firmenname=Schaller Electronic S.à.r.l<br />
|Straße=19, Av. de la Faïencerie<br />
|PLZ=1510<br />
|Ort=Luxembourg<br />
|Telefon=+352-475239-1<br />
|Fax=+352-471507<br />
|Öffnungszeiten=Montag - Freitag: 08:30 - 12:30, 13:30 - 18:00<br>Samstag: 09:00 - 13:00<br />
|Weblink=http://schaller-electronic.lu/index.php?home<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
=== L-6905 Niederanven ===<br />
{{ElektronikLieferant<br />
|Firmenname=electronic-Shop S.àr.l. <br />
|Straße=141, route de Trèves<br />
|PLZ=6905<br />
|Ort=Niederanven<br />
|Telefon=+352 269464-1<br />
|Fax=+352 269464-64<br />
|Öffnungszeiten=<br><br />
<br />
|Weblink=www.electronic-shop.lu<br />
|Email=info@electronic-shop.lu<br />
|Bemerkung=Online-Bestellungen, die ein paar Tage später an der Abholtheke abgeholt werden können.<br />
}}<br />
= Türkei =<br />
== Istanbul ==<br />
=== Istanbul ===<br />
<br />
<br />
{{ElektronikLieferant<br />
|Firmenname= Ufuk Elektronik<br />
|Straße=Yemişçi Hasan Sok. 1<br />
|PLZ=<br />
|Ort=<br />
|Telefon=<br />
|Fax=<br />
|Öffnungszeiten=<br><br />
<br />
|Weblink=http://www.ufukelektronik.com/<br />
|Email=<br />
|Bemerkung= Im Gebiet des Fähranleger Karaköy gibt es einige Läden die Bauelemente anbieten. Der aufgeführte Laden wurde nur Beispielhaft aufgeführt. <br />
}}<br />
<br />
= Siehe auch =<br />
* [[Platinenhersteller]]<br />
* [[Elektronikversender]]<br />
* [[Eisenwarenversender]]<br />
<br />
[[Kategorie:Lieferanten]]</div>Schweigstillhttps://www.mikrocontroller.net/index.php?title=Benutzer:Schweigstill&diff=59594Benutzer:Schweigstill2011-08-17T14:14:30Z<p>Schweigstill: </p>
<hr />
<div>Mein Name ist Andreas Schweigstill und ich bin Eigentümer und geschäftsführender Gesellschafter der folgenden Unternehmen:<br />
<br />
<pre><br />
Schweigstill IT | Embedded Systems<br />
Schauenburgerstraße 116<br />
24118 Kiel<br />
Web: http://www.schweigstill.de/<br />
</pre><br />
<br />
und<br />
<br />
<pre><br />
Baltic Seagull Electronics UG (haftungsbeschränkt)<br />
Schauenburgerstraße 116<br />
24118 Kiel<br />
Web: http://www.baltic-seagull.de/<br />
</pre><br />
<br />
Zu erreichen bin ich wie folgt:<br />
<pre><br />
Telefon: 0431/530354-0<br />
Telefax: 0431/530354-36<br />
Mobil: 0171/6921973<br />
E-Mail: andreas@schweigstill.de<br />
</pre></div>Schweigstillhttps://www.mikrocontroller.net/index.php?title=Benutzer:Schweigstill&diff=59593Benutzer:Schweigstill2011-08-17T14:12:35Z<p>Schweigstill: Die Seite wurde neu angelegt: „Mein Name ist Andreas Schweigstill und ich bin Eigentümer und geschäftsführender Gesellschafter der folgenden Unternehmen: Schweigstill IT | Embedded Systems …“</p>
<hr />
<div>Mein Name ist Andreas Schweigstill und ich bin Eigentümer und geschäftsführender Gesellschafter der folgenden Unternehmen:<br />
<br />
Schweigstill IT | Embedded Systems<br />
Schauenburgerstraße 116<br />
24118 Kiel<br />
<br />
und<br />
<br />
Baltic Seagull Electronics UG (haftungsbeschränkt)<br />
Schauenburgerstraße 116<br />
24118 Kiel<br />
<br />
Zu erreichen bin ich wie folgt:<br />
Telefon: 0431/530354-0<br />
Telefax: 0431/530354-36<br />
Mobil: 0171/6921973<br />
E-Mail: andreas@schweigstill.de</div>Schweigstillhttps://www.mikrocontroller.net/index.php?title=Lokale_Elektroniklieferanten&diff=45725Lokale Elektroniklieferanten2010-04-05T13:00:37Z<p>Schweigstill: /* Kiel */</p>
<hr />
<div>=Einleitung=<br />
Da nicht jeder beim Fehlen einzelner Bauteile eine Online-Bestellung aufgeben möchte und der eine oder andere regionale Anbieter nicht so gut zu finden ist, soll hier eine Liste entstehen, die hilft Anbieter zu finden. <br />
<br />
__TOC__<br />
<br />
Falls die Darstellungsart nicht gefällt oder Rubriken fehlen, so bitte nicht hier ändern, sondern das Template anpassen: [[Vorlage:ElektronikLieferant]]<br><br />
So soll das Template ausgefüllt werden:<br />
{{ElektronikLieferant<br />
|Firmenname=hier Firmenname eintragen<br />
|Straße=Straßenname, z.&nbsp;B. Musterstraße 123<br />
|PLZ=PLZ, z.&nbsp;B. 12345<br />
|Ort=Ort, z.&nbsp;B. München<br />
|Telefon=Telnr., z.&nbsp;B. 012345/12341234<br />
|Fax=Faxnr., z.&nbsp;B. 012345/12345234<br />
|Öffnungszeiten=Öffnungszeiten eintragen<br>Neue Zeile mit "br" abgetrennt<br />
|Weblink=http://www.mikrocontroller.net Link ohne umschliessende eckige Klammern<br />
|Email=Emailadresse, z.&nbsp;B. xxx@yyy.de<br />
|Bemerkung=ggf. Bemerkung, ansonsten Rubrik/Feld/Variable leer lassen<br />
}}<br />
<br />
-----------------------------------------------------------------------------<br />
=Baden-Württemberg=<br />
==Aalen==<br />
{{ElektronikLieferant<br />
|Firmenname=mükra electronic shop GmbH<br />
|Straße=Wilhelm-Zapf-Str. 9<br />
|PLZ=73430<br />
|Ort=Aalen<br />
|Telefon=07361/610820<br />
|Fax=07361/610821<br />
|Öffnungszeiten=Mo.-Fr. 9.00 - 13.00 Uhr, 14.00 - 18.00 Uhr<br>Sa. 9.00 - 13.00 Uhr<br />
|Weblink=http://onlineshop.muekra-electronic.com<br />
|Email=info@muekra.de<br />
|Bemerkung=Keine SMD-Teile<br />
}}<br />
==Esslingen==<br />
{{ElektronikLieferant<br />
|Firmenname=mükra electronic shop GmbH<br />
|Straße=Bahnhofstr. 23<br />
|PLZ=73728<br />
|Ort=Esslingen<br />
|Telefon=0711/355676<br />
|Fax=0711/3108656<br />
|Öffnungszeiten=Mo.-Fr. 9.00 - 13.00 Uhr, 14.30 - 18.00 Uhr<br>Sa. 9.00 - 13.00 Uhr<br />
|Weblink=http://onlineshop.muekra-electronic.com/FilES.php<br />
|Email=info@muekra.de<br />
|Bemerkung=Keine Mikrocontroller, keine SMD-Teile (ausser einige wenige Transistoren)<br />
}}<br />
==Freiburg==<br />
{{ElektronikLieferant<br />
|Firmenname=Omega electronic GmbH<br />
|Straße=Eschholzstr. 58-60<br />
|PLZ=79115<br />
|Ort=Freiburg<br />
|Telefon=0761/76776-0<br />
|Fax=0761/76776-55<br />
|Öffnungszeiten=Mo.-Sa.: 10:00 - 19:30<br />
|Weblink=http://www.omega-electronic.de<br />
|Email=info@omega-electronic.de<br />
|Bemerkung=<br />
}}<br />
==Karlsbad==<br />
{{ElektronikLieferant<br />
|Firmenname=IT-WNS, Ute Heldt<br />
|Straße=Schulstr. 13<br />
|PLZ=76307<br />
|Ort=Karlsbad - Mutschelbach<br />
|Telefon=07202/936083<br />
|Fax=07202/936085<br />
|Öffnungszeiten=Nach Vereinbahrung (Email-Kontakt)<br />
|Weblink=http://www.it-wns.de<br />
|Email=info@it-wns.de<br />
|Bemerkung=Bestellungen im Onlineshop können wahlweise auch direkt abgeholt werden<br />
}}<br />
<br />
==Karlsruhe==<br />
{{ElektronikLieferant<br />
|Firmenname=mükra electronic shop GmbH<br />
|Straße=Fritz-Erler-Straße 24<br />
|PLZ=76133<br />
|Ort=Karlsruhe<br />
|Telefon=0721/374270<br />
|Fax=0721/9379171<br />
|Öffnungszeiten=Mo.-Fr. 9.00 - 13.00 Uhr, 14.30 - 18.00 Uhr<br>Sa. 9.00 - 13.00 Uhr<br />
|Weblink=http://onlineshop.muekra-electronic.com/FilKA.php<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Mc TEC Elektronik Vertriebs GmbH<br />
|Straße=Kaiserstrasse 160<br />
|PLZ=76133<br />
|Ort=Karlsruhe<br />
|Telefon=0721/24456<br />
|Fax=0721/20061<br />
|Öffnungszeiten=Mo.-Fr. 10.00 - 19.00 Uhr<br>Sa. 10.00 - 15.00 Uhr<br />
|Weblink=http://www.mctec.de/<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
==Offenburg==<br />
{{ElektronikLieferant<br />
|Firmenname=Günther Wultschner (Elektronikladen)<br />
|Straße=Luisenstraße 16<br />
|PLZ=77654<br />
|Ort=Offenburg<br />
|Telefon=0781 43270<br />
|Fax=<br />
|Öffnungszeiten=Mo.-Fr. 9.00 - 19:00 Uhr<br>Sa. 9.00 - 16.00 Uhr<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
==Reutlingen==<br />
{{ElektronikLieferant<br />
|Firmenname=mükra electronic shop GmbH<br />
|Straße=Federnseestr. 4 <br />
|PLZ=72764<br />
|Ort=Reutlingen<br />
|Telefon=07121/370748<br />
|Fax=07121/370741<br />
|Öffnungszeiten=Mo.-Fr. 9.30 - 13.00 Uhr, 14.00 - 18.00 Uhr<br>Sa. 9.30 - 13.00 Uhr<br />
|Weblink=http://onlineshop.muekra-electronic.com<br />
|Email=info@muekra.de<br />
|Bemerkung=Keine SMD-Teile<br />
}}<br />
<br />
==Ulm==<br />
{{ElektronikLieferant<br />
|Firmenname=mükra electronic shop GmbH<br />
|Straße=Neutorstr. 20<br />
|PLZ=89073<br />
|Ort=Ulm<br />
|Telefon=0731/64494<br />
|Fax=0731/6028676<br />
|Öffnungszeiten=Mo.-Fr. 9.00 - 18.00 Uhr<br>Sa. 9.00 - 13.00 Uhr<br />
|Weblink=http://onlineshop.muekra-electronic.com/FilUlm.php<br />
|Email=<br />
|Bemerkung=Keine SMD-Teile<br />
}}<br />
-----------------------------------------------------------------------------<br />
<br />
=Bayern=<br />
<br />
==Aschaffenburg==<br />
{{ElektronikLieferant<br />
|Firmenname=VS Elektronik OHG<br />
|Straße= Magnolienweg 3<br />
|PLZ= 63739<br />
|Ort=Aschaffenburg <br />
|Telefon=06021-30460<br />
|Fax=06021-304626<br />
|Öffnungszeiten= Montag - Freitag: 09:00 - 18:00 Uhr<br>Samstag: 09:00 - 13:00 Uhr<br />
|Weblink=http://www.vs-electronic.de<br />
|Email=info@vs-electronic.de<br />
|Bemerkung= führt Vellemann Bausätze, PCs, Telekommunikation und Bauteile<br />
}}<br />
<br />
==Erlangen==<br />
{{ElektronikLieferant<br />
|Firmenname=Radio-Fernseh-Elektronik<br />
|Straße=Beethovenstraße 2<br />
|PLZ=91052<br />
|Ort=Erlangen<br />
|Telefon=09131 25288<br />
|Fax=<br />
|Öffnungszeiten=<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Feller-electronic<br />
|Straße=Marquardsenstraße 21<br />
|PLZ=91054 <br />
|Ort=Erlangen<br />
|Telefon=09131 27595<br />
|Fax=<br />
|Öffnungszeiten=Mo-Fr 9.00 - 13.00, 14.00-18.00 Uhr. Sa 9.00 - 14.00 Uhr<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
==Fürth==<br />
{{ElektronikLieferant<br />
|Firmenname=B+D Electronic GmbH<br />
|Straße=Königstr. 107 (gegenüber Citycenter und neben Feuerwehr)<br />
|PLZ=90762 <br />
|Ort=Fürth<br />
|Telefon=0911 - 77 30 40<br />
|Fax=<br />
|Öffnungszeiten=Mo - Fr: 10.00 - 12.30 & 14.00 - 19.00<br>Sa: 10.00 - 13.00<br />
|Weblink=http://www.bdelectronic.de/<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
== Kaufbeuren ==<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Jantsch-Elektronik GmbH<br />
|Straße=Porschestrasse 26<br />
|PLZ=87600<br />
|Ort=Kaufbeuren<br />
|Telefon=0 83 41 / 95 33-0<br />
|Fax=0 83 41 / 37 00<br />
|Öffnungszeiten=Mo-Fr 9:00-12:30 / 13:30-18:00<br/><br />
Sa 9:00-13:00 Uhr<br />
|Weblink= http://www.j-e.de<br />
|Email=info@j-e.de<br />
|Bemerkung=führt auch gebrauchte Messgeräte<br />
}}<br />
<br />
==Leiblfing (bei Straubing)==<br />
{{ElektronikLieferant<br />
|Firmenname=Hans Entner Funkelektronik<br />
|Straße=Landshuter Straße 1 <br />
|PLZ=94339<br />
|Ort=Leiblfing<br />
|Telefon=(0 94 27) 90 20 86<br />
|Fax=09427 - 902087<br />
|Öffnungszeiten= leider nicht bekannt<br />
|Weblink=<br />
|Email=Entner-DF9RJ@t-online.de<br />
|Bemerkung= Kleiner Laden und sehr netter Inhaber. Einige Geräte und Zubehör. Viele HF-Stecker (v.a. SMA, BNC, N und PL(UHF)) und Koax-Kabel. Bietet auch Reparaturen an.<br />
}}<br />
<br />
==München==<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Elektronik<br />
|Straße=Tal 29<br />
|PLZ=80331 <br />
|Ort=München<br />
|Telefon=<br />
|Fax=<br />
|Öffnungszeiten=Mo - Fr: 9:00 - 20:00<br>Sa: 9:00 - 20:00<br />
|Weblink=http://www.conrad.de/<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Elektronik<br />
|Straße=Hanauer Straße 91 (gegenüber OEZ)<br />
|PLZ=80993 <br />
|Ort=München - Moosach<br />
|Telefon=<br />
|Fax=<br />
|Öffnungszeiten=Mo - Fr: 9:30 - 20:00<br>Sa: 9:00 - 20:00<br />
|Weblink=http://www.conrad.de/<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Bürklin<br />
|Straße=Schillerstr. 41<br />
|PLZ=80336 <br />
|Ort=München<br />
|Telefon=<br />
|Fax=<br />
|Öffnungszeiten=Mo - Do: 9:00 - 16:30<br>Fr: 9:00 - 13:00<br />
|Weblink=http://buerklin.de/<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Strixner & Holzinger<br />
|Straße=Schillerstraße 25-29<br />
|PLZ=80336 <br />
|Ort=München<br />
|Telefon=<br />
|Fax=<br />
|Öffnungszeiten=Mo - Fr: 9:30 - 18:00<br />
|Weblink=http://sh-halbleiter.de/<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
==Schweinfurt==<br />
{{ElektronikLieferant<br />
|Firmenname=Spath Elektronische Bauteile<br />
|Straße=Cramerstr. 9<br />
|PLZ=97421<br />
|Ort=Schweinfurt<br />
|Telefon=09721/25186<br />
|Fax=09721/22999<br />
|Öffnungszeiten=<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
==Straubing==<br />
{{ElektronikLieferant<br />
|Firmenname=Röhrner Electronic<br />
|Straße=Innere Passauer Str. 12<br />
|PLZ=94315<br />
|Ort=Straubing<br />
|Telefon=09421/12573<br />
|Fax=09421/22207<br />
|Öffnungszeiten=Mo - Do: 9:00 - 18:00<br>Sa: 10:00 - 13:00<br />
|Weblink=http://www.roehrner-electronic.de/<br />
|Email=<br />
|Bemerkung=Netter Elektronikladen mit vielen Halbleitern neben dem üppigen Standardsortiment<br />
}}<br />
<br />
==Pförring==<br />
{{ElektronikLieferant<br />
|Firmenname=Pollin<br />
|Straße=Max-Pollin-Straße 1<br />
|PLZ=85104<br />
|Ort=Pförring<br />
|Telefon=<br />
|Fax=<br />
|Öffnungszeiten=Mo.-Fr. 9 - 19 Uhr<br>Sa. 9 - 16 Uhr <br />
|Weblink=http://www.pollin.de/shop/static/ecenter.htm<br />
|Email=<br />
|Bemerkung=nähe Ingolstadt<br />
}}<br />
<br />
-----------------------------------------------------------------------------<br />
<br />
=Berlin=<br />
==Charlottenburg-Wilmersdorf==<br />
{{ElektronikLieferant<br />
|Firmenname=Segor-electronics<br />
|Straße=Kaiserin-Augusta-Alle 94<br />
|PLZ=10589<br />
|Ort=Berlin<br />
|Telefon=030 4399843<br />
|Fax=030 4399855<br />
|Öffnungszeiten=Mo.-Fr. 10.00-13.30 Uhr und 14:30-18:00 Uhr, Sa. 10.00-13.00 Uhr<br />
|Weblink=http://www.segor.de<br />
|Email=sales@segor.de<br />
|Bemerkung=Sehr gut sortiertes und vielseitiges Sortiment, preiswert, hochwertig.<br />
}}<br />
==Berlin Schöneberg==<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic<br />
|Straße=Kleiststraße 30-31<br />
|PLZ=10787<br />
|Ort=Berlin<br />
|Telefon=0180 5 564445 <br />
|Fax=<br />
|Öffnungszeiten=Mo.-Sa. 10.00-20.00 Uhr<br />
|Weblink=http://www.conrad.de<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Atzert Radio<br />
|Straße=Kleiststraße 32-33<br />
|PLZ=10787<br />
|Ort=Berlin<br />
|Telefon=030/212984-0 <br />
|Fax=030/212984-11<br />
|Öffnungszeiten=Montag-Samstag 10:00-19.00 Uhr<br />
|Weblink=http://www.atzert-radio.de/<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
==Berlin Kreuzberg==<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic<br />
|Straße=Hasenheide 14-15<br />
|PLZ=10967<br />
|Ort=Berlin<br />
|Telefon=0180 5 564445 <br />
|Fax=<br />
|Öffnungszeiten=Mo.-Fr. 10.00-20.00 Uhr, Sa. 10.00-18.00 Uhr <br />
|Weblink=http://www.conrad.de<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
==Berlin Steglitz==<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic<br />
|Straße=Schloßstrasse 34-36<br />
|PLZ=12163<br />
|Ort=Berlin<br />
|Telefon=0180 5 564445 <br />
|Fax=<br />
|Öffnungszeiten=Mo.-Do. 10.00-20.00 Uhr, Fr.-Sa. 10.00-22.00 Uhr<br />
|Weblink=http://www.conrad.de<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
-----------------------------------------------------------------------------<br />
<br />
=Brandenburg=<br />
==Frankfurt (Oder)==<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Elektronik Service Landrock<br />
|Straße=Karl-Ritter-Platz 8-9<br />
|PLZ=15230<br />
|Ort=Frankfurt (Oder) <br />
|Telefon=0335 / 6802029<br />
|Fax=0335 / 684171<br />
|Öffnungszeiten=Mo-Fr. 10-18 Uhr<br />
|Weblink=http://www.landrock-elektronik.de/<br />
|Email=<br />
|Bemerkung=Jürgen (Chef) ist superfreundlich, habe jahrelang dort eingekauft.<br />
}}<br />
<br />
----------------------------------------------------------------------------<br />
<br />
=Bremen=<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic<br />
|Straße=Borgwardstr. 2<br />
|PLZ=28279<br />
|Ort=Bremen <br />
|Telefon=01 80 / 55 64 44 5<br />
|Fax=<br />
|Öffnungszeiten=<br />
|Weblink=http://www.conrad.de<br />
|Email=<br />
|Bemerkung= <br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Schuricht Distrelec gmbh<br />
|Straße=Rehland 8<br />
|PLZ=28832<br />
|Ort=Achim <br />
|Telefon= 04 20 2 / 97 47-97<br />
|Fax=<br />
|Öffnungszeiten=<br />
|Weblink=https://www.distrelec.de<br />
|Email=<br />
|Bemerkung= Nur telefonische Bestellung. Wenn man bei der Bestellung explizit sagt dass man die Sachen in Achim abholen möchte, dann klappt dies auch... meißtens...<br />
}}<br />
<br />
-----------------------------------------------------------------------------<br />
<br />
=Hamburg=<br />
==Harburg==<br />
{{ElektronikLieferant<br />
|Firmenname=Electronic 70<br />
|Straße=Küchgarten 21<br />
|PLZ=21073<br />
|Ort=Hamburg <br />
|Telefon=040 / 77 81 08<br />
|Fax=<br />
|Öffnungszeiten=Mo. - Fr. 9.30 - 13.00 Uhr 14.00 - 18.00 Uhr<br><br />
Samstag 10.00 - 14.00 Uhr<br />
|Weblink=http://electronic70.de<br />
|Email=<br />
|Bemerkung= Nett und kompetent.<br />
}}<br />
<br />
==Sankt Pauli (Schanzenviertel)==<br />
{{ElektronikLieferant<br />
|Firmenname=Radio Kölsch<br />
|Straße=Schanzenstr. 1<br />
|PLZ=20357<br />
|Ort=Hamburg <br />
|Telefon=040 / 43 46 56<br />
|Fax=040 / 439 09 25<br />
|Öffnungszeiten=<br />
|Weblink=http://www.koelsch24.com<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
==Hoheluft Ost==<br />
{{ElektronikLieferant<br />
|Firmenname=Statronic<br />
|Straße=Eppendorfer Weg 244<br />
|PLZ=20251<br />
|Ort=Hamburg <br />
|Telefon=040 / 422 33 22<br />
|Fax=040 / 422 33 25<br />
|Öffnungszeiten=<br />
|Weblink=http://www.statronic.de<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
==Wandsbek==<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic<br />
|Straße=Wandsbeker Zollstr. 67-69<br />
|PLZ=22041<br />
|Ort=Hamburg<br />
|Telefon=0180 5 564445 <br />
|Fax=<br />
|Öffnungszeiten=Mo.-Fr. 09.30-20.00 Uhr, Sa. 09.00-18.00 Uhr<br />
|Weblink=http://www.conrad.de<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
==Altona==<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic<br />
|Straße=Hahnenkamp 1<br />
|PLZ=22765 <br />
|Ort=Hamburg<br />
|Telefon=0180 5 564445 <br />
|Fax=<br />
|Öffnungszeiten=Mo.-Sa. 10.00-20.00 Uhr <br />
|Weblink=http://www.conrad.de<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
-----------------------------------------------------------------------------<br />
<br />
=Hessen=<br />
==Darmstadt==<br />
{{ElektronikLieferant<br />
|Firmenname=Zimmermann Electronic GmbH<br />
|Straße=Kasinostr. 2<br />
|PLZ=64293 <br />
|Ort=Darmstadt<br />
|Telefon=06151 - 66 69 - 240<br />
|Fax=06151 - 66 69 - 290<br />
|Öffnungszeiten=Mo.- Fr. 9:00 - 19:00 Uhr<br>Sa. 9:00 - 14:00 Uhr<br />
|Weblink=http://www.zeg-shop.de<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=EBG Electronic Business GmbH<br />
|Straße=Bismarckstr. 61<br />
|PLZ=64293 <br />
|Ort=Darmstadt<br />
|Telefon=06151 / 82 91 - 0<br />
|Fax=06151 / 82 91 - 20<br />
|Öffnungszeiten=Montag-Freitag: 9:00 bis 19:00 Uhr<br>Samstag: 9:00 bis 14:00 Uhr<br />
|Weblink=http://www.ebg-darmstadt.de<br />
|Email=info@ebg-darmstadt.de<br />
|Bemerkung=<br />
}}<br />
<br />
==Offenbach==<br />
{{ElektronikLieferant<br />
|Firmenname=Rail Electronic<br />
|Straße=Großer Biergrund 4<br />
|PLZ=63065<br />
|Ort=Offenbach<br />
|Telefon=069 / 88 20 72<br />
|Fax=069 / 88 31 14<br />
|Öffnungszeiten=Mo.- Fr. 09.30 bis 12.30 sowie 13.30 bis 18.30 Uhr<br>Sa. 9.30 bis 13.30 Uhr<br />
|Weblink=http://www.rail-electronic.de<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
==Wöllstadt==<br />
{{ElektronikLieferant<br />
|Firmenname=ELW Elektronik Handels GMBH<br />
|Straße=Am Kalkofen 10<br />
|PLZ=61206<br />
|Ort=Wöllstadt<br />
|Telefon=06034-4411<br />
|Fax=06034-5739<br />
|Öffnungszeiten=Mo-Fr 08.30 - 18.00 Uhr<br>Sa 08.30 - 13.00 Uhr<br />
|Weblink=http://www.elw-elektronik.com/<br />
|Email=elw-gmbh@t-online.de<br />
|Bemerkung=<br />
}}<br />
<br />
==Frankfurt/Main==<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Elektronik<br />
|Straße=Zeil 58 + 64 (Konstabler Wache)<br />
|PLZ=60313 <br />
|Ort=Frankfurt<br />
|Telefon=0180 5 564445<br />
|Fax=<br />
|Öffnungszeiten=Mo.-Mi. 10.00-20.00 Uhr<br>Do.-Sa. 10.00-21.00 Uhr<br />
|Weblink=http://www.conrad.de<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
-----------------------------------------------------------------------------<br />
<br />
=Mecklenburg-Vorpommern=<br />
==Rostock== <br />
<br />
-----------------------------------------------------------------------------<br />
{{ElektronikLieferant<br />
|Firmenname=A-Z City-Stores<br />
|Straße=Doberaner-Hof<br />
|PLZ=<br />
|Ort=Rostock<br />
|Telefon=0381-4031171<br />
|Fax=<br />
|Öffnungszeiten=Mo. – Fr. 9.30 – 19.30 Uhr<br>Sa. 9.30 – 16.00 Uhr<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=geringes Angebot<br>recht teuer<br />
}}<br />
<br />
=Niedersachsen=<br />
<br />
-----------------------------------------------------------------------------<br />
==Braunschweig==<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic GmbH<br />
|Straße=Sudetenstr. 4<br />
|PLZ=38114<br />
|Ort=Braunschweig<br />
|Telefon= 0531 501514<br />
|Fax=<br />
|Öffnungszeiten=Mo.-Fr. 09.30-19.00 Uhr, Sa. 09.00-18.00 Uhr<br />
|Weblink=http://www.filialen.conrad.de/<br />
|Email=<br />
|Bemerkung= Hinter dem Conrad-Gebäude gibt es noch eine "Resterampe" mit Garantiefällen, unvollständigen Bausätzen etc. (andere Öffnungszeiten!)<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=EFB - Electronic Fundgrube Braunschweig<br />
|Straße=Kreuzstrasse 65<br />
|PLZ=38118<br />
|Ort=Braunschweig<br />
|Telefon=0531-58 11 058<br />
|Fax=0531-58 11 059<br />
|Öffnungszeiten=<br />
|Weblink=http://www.efb-online.de/<br />
|Bemerkung= Online-Katalog unter http://www.megakick-stores.de/.<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Elektronik Bauteile Vertrieb - Dipl.-Ing. Jörg Bassenberg<br />
|Straße=Nußbergstraße 9<br />
|PLZ=38102<br />
|Ort=Braunschweig<br />
|Telefon=0531-79 17 07<br />
|Fax=0531-7 60 22<br />
|Öffnungszeiten=<br />
|Weblink=http://www.bassenberg.de/<br />
|Email=info@bassenberg.de<br />
|Bemerkung= Kleines Ladengeschäft, hauptsächlich ältere Bauteile vorrätig.<br />
}}<br />
<br />
==Hannover==<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic GmbH<br />
|Straße=Goseriede 3<br />
|PLZ=30159<br />
|Ort=Hannover<br />
|Telefon= 0180 5 564445<br />
|Fax=<br />
|Öffnungszeiten=Mo.-Sa. 09.00-20.00 Uhr<br />
|Weblink=http://www.filialen.conrad.de/<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Radio Menzel-Electronic<br />
|Straße=Limmerstraße 3-5<br />
|PLZ=30451<br />
|Ort=Hannover<br />
|Telefon= 0511 442607<br />
|Fax=<br />
|Öffnungszeiten=Mo-Fr: 10:00-13:30, 14:30-18:00 Sa: 10:00-13:30<br />
|Weblink=www.menzel-electronic.de <br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
==Lüneburg==<br />
{{ElektronikLieferant<br />
|Firmenname=Beusch Elektronik<br />
|Straße=Reichenbachstr. 8<br />
|PLZ=21335 <br />
|Ort=Lüneburg<br />
|Telefon=04131 33311<br />
|Fax=?<br />
|Öffnungszeiten=Mo und Sa geschlossen, Di - Fr 10:00-13:00, 14:00-18:00<br />
|Bemerkung=<br />
}}<br />
<br />
==Oldenburg==<br />
{{ElektronikLieferant<br />
|Firmenname=ebc Utz Kohl GmbH <br />
|Straße=Alexanderstraße 31<br />
|Telefon=0441 82114<br />
|Fax=0441 85801<br />
|Weblink=www.e-b-c-elektronik.de<br />
|Email=kontakt@e-b-c-elektronik.de<br />
|PLZ=26121<br />
|Ort=Oldenburg<br />
|Öffnungszeiten=Mo. - Fr. 9:00 - 12:30 und 13:30 - 18:00 Uhr, Sa. 9:00 - 13:00 Uhr<br />
|Bemerkung=<br />
}}<br />
<br />
==Osnabrück==<br />
{{ElektronikLieferant<br />
|Firmenname=Heinicke-electronic<br />
|Straße=Meller Str. 43 <br />
|PLZ=49084<br />
|Ort=Osnabrück<br />
|Telefon=0541 587666<br />
|Fax=0541 586614 <br />
|Öffnungszeiten=Mo-Fr. 9:30-13:00Uhr und 14:30-18:00Uhr Sa. 9:30-13:00Uhr<br />
|Weblink=http://www.heinicke-electronic.de/<br />
|Email=sales@heinicke-electronic.de<br />
|Bemerkung=Haben auch einen PC Shop nebenan.<br />
}}<br />
<br />
==Wilhelmshaven==<br />
{{ElektronikLieferant<br />
|Firmenname=Reichelt Elektronik<br />
|Straße=Elektronikring 1 <br />
|PLZ=26452<br />
|Ort=Sande<br />
|Telefon=04422-955 333<br />
|Fax=04422-955 111 <br />
|Öffnungszeiten=Montag - Donnerstag: 9:00 - 17:00 Uhr; Freitag: 9:00 - 15:30 Uhr<br />
|Weblink=http://www.reichelt.de<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
-----------------------------------------------------------------------------<br />
<br />
=Nordrhein-Westfalen=<br />
==Aachen==<br />
Siehe http://aachen.wikia.com/wiki/Elektronik-Teile<br />
<br />
==Bielefeld==<br />
{{ElektronikLieferant<br />
|Firmenname=alpha electronic Ing. A. Berger GmbH<br />
|Straße=Oldentruper Str. 104<br />
|PLZ=33604<br />
|Ort=Bielefeld<br />
|Telefon=0521-324333<br />
|Fax=0521-320435<br />
|Öffnungszeiten=Mo. – Sa. 9.00 – 13.00 Uhr<br>Mo. – Fr. 14.00 – 18.00 Uhr<br />
|Weblink=http://www.alphaelectronic-bielefeld.de/<br />
|Email=info@alphaelectronic.de<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Fuchs und Lützow Elekronik - Handelsges. mbH<br />
|Straße=Heeper Str. 184<br />
|PLZ=33607<br />
|Ort=Bielefeld<br />
|Telefon=0521-5576555<br />
|Fax=0521-5576557<br />
|Öffnungszeiten=Mo. – Sa. 9.00 – 13.00 Uhr<br>Mo. – Fr. 14.00 – 18.00 Uhr<br />
|Weblink=http://www.electronicfuchs.com/<br />
|Email=info@electronicfuchs.com<br />
|Bemerkung=<br />
}}<br />
<br />
==Bonn==<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Elektronik<br />
|Straße=Karlstraße 3<br />
|PLZ=53115<br />
|Ort=Bonn<br />
|Telefon=0180 5 564445<br />
|Fax=<br />
|Öffnungszeiten=Mo.-Sa. 10.00-20.00 Uhr <br />
|Weblink=http://www.filialen.conrad.de/rubriken/filialen.php?filiale=28<br />
|Email=filiale.bonn@conrad.de <br />
|Bemerkung=<br />
}}<br />
{{ElektronikLieferant<br />
|Firmenname=P & M Elektronik Bonn GmbH<br />
|Straße=Budapester Strasse 6<br />
|PLZ=53111<br />
|Ort=Bonn<br />
|Telefon=0228-656005<br />
|Fax=0228-656336<br />
|Öffnungszeiten=Mo-Fr 09:00 – 19:00 Uhr<br>Sa 10:00 – 16:00 Uhr<br />
|Weblink=http://www.pm-elektronik-bonn.de/<br />
|Email=pm-elektronikbonn@web.de<br />
|Bemerkung=<br />
}}<br />
<br />
==Dortmund==<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic<br />
|Straße=Westenhellweg 95-101<br />
|PLZ=44137<br />
|Ort=Dortmund<br />
|Telefon=01805-564445 <br />
|Fax=<br />
|Öffnungszeiten=Mo. – Fr. 10.00 – 20.00 Uhr<br>Sa. 9.30 – 20.00 Uhr<br />
|Weblink=http://www.conrad.de<br />
|Email=<br />
|Bemerkung=direkt in der Innenstadt<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=SR-Tronic<br />
|Straße=Beratgerstr. 28<br />
|PLZ=44149<br />
|Ort=Dortmund<br />
|Telefon=0231-33671-0<br />
|Fax=0231-33671-25<br />
|Öffnungszeiten=Mo. – Fr. 10.00 – 18.00 Uhr<br />
|Weblink=http://www.sr-tronic.de<br />
|Email=info@sr-tronic.de<br />
|Bemerkung=Ist zwar ein Versandhandel, Abholung ist aber möglich, extrem kleines Elektroniksortiment (Atmel, Eproms), ist eigentlich ein Satshop.<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Electronic am Wall<br />
|Straße=Hoher Wall 22<br />
|PLZ=44137<br />
|Ort=Dortmund<br />
|Telefon=0231-16863<br />
|Fax= 0231-160632<br />
|Öffnungszeiten=Mo. – Fr. 9.00 – 18.00 Uhr (?)<br />
|Weblink=http://electronic-am-wall.de<br />
|Email=electronic-am-wall@t-online.de<br />
|Bemerkung=Alteingesessener Laden mit mittlerem Elektronik und Bauteilesortiment (Leider nicht mehr so viel wie früher).<br />
}}<br />
<br />
==Essen==<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic<br />
|Straße=Altendorfer Str. 11<br />
|PLZ=45127<br />
|Ort=Essen<br />
|Telefon=01805-564445 <br />
|Fax=<br />
|Öffnungszeiten=Mo. – Fr. 10.00 – 19.30 Uhr<br>Sa. 9.30 – 18.00 Uhr<br />
|Weblink=http://www.conrad.de<br />
|Email=<br />
|Bemerkung=schräg gegenüber von IKEA, Tiefgarage im UG für Kunden kostenlos, Karte an der Kasse lochen lassen<br />
}}<br />
<br />
==Köln==<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic<br />
|Straße=Horbellerstr. 2-4<br />
|PLZ=50858<br />
|Ort=Köln<br />
|Telefon=0180 5 564445 <br />
|Fax=<br />
|Öffnungszeiten=Mo.-Sa. 9.30-20.00 Uhr <br />
|Weblink=http://filialen.conrad.de/rubriken/filialen.php?filiale=13<br />
|Email=filiale.koeln@conrad.de<br />
|Bemerkung=<br />
}}<br />
<br />
==Langenfeld==<br />
{{ElektronikLieferant<br />
|Firmenname=rs elektronik - Reinhard Sinzel<br />
|Straße=Solinger Strasse 152<br />
|PLZ=40764<br />
|Ort=Langenfeld<br />
|Telefon=02173/22766<br />
|Fax=02173/25958<br />
|Öffnungszeiten=Mo-Fr 10:00-13:00 + 15:00-18:00, Sa 10:00-13:00<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=zwischen Polizeiwache und Bahnunterführung auf der linken Seite. Nur Ladenverkauf!<br />
}}<br />
<br />
==Mönchengladbach==<br />
{{ElektronikLieferant<br />
|Firmenname=Brunenberg Elektronik<br />
|Straße=Lürriper Strasse 170<br />
|PLZ=41065<br />
|Ort=Mönchengladbach<br />
|Telefon=02161-44421<br />
|Fax=02161-42552<br />
|Öffnungszeiten=Mo.- Fr. 9:00 - 13:00 und 14:00 - 18:00<br>Samstag 9:00 - 13:00<br>Donnerstag Nachmittag geschlossen!<br />
|Weblink=http://www.bruntronic.de<br />
|Email=info@bruntronic.de<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Zilles Elektronik GmbH<br />
|Straße=Staufenstraße 8-10<br />
|PLZ=41061<br />
|Ort=Mönchengladbach<br />
|Telefon=02161/176005<br />
|Fax=02161/176007<br />
|Öffnungszeiten=Montag - Freitag 8:30 - 13:00 & 14:00 - 18:00<br>Samstag 9:00 - 12:00<br />
|Weblink=http://www.zilles-elektronik.de/<br />
|Email=info@zilles-elektronik.de<br />
|Bemerkung=<br />
}}<br />
<br />
==Paderborn==<br />
{{ElektronikLieferant<br />
|Firmenname=Jansen-Elektronik GmbH & Co. KG<br />
|Straße=Heiersstrasse 24<br />
|PLZ=33098 <br />
|Ort=Paderborn<br />
|Telefon=05251-282848<br />
|Fax=05251-282851<br />
|Öffnungszeiten=Mo. – Sa. 9.30 – 13.00 Uhr<br>Mo. – Fr. 14.30 – 18.00 Uhr<br />
|Weblink=http://www.jansen-elektronik.de/<br />
|Email=info@jansen-elektronik.de<br />
|Bemerkung=<br />
}}<br />
<br />
==Recklinghausen==<br />
{{ElektronikLieferant<br />
|Firmenname=Elektronik-Center Wenzlik, Inh. H.- J. Juhnke<br />
|Straße=Halterner Straße 24<br />
|PLZ=45657 <br />
|Ort=Recklinghausen<br />
|Telefon=02361-14103<br />
|Fax=02361-182489<br />
|Öffnungszeiten=Mo.-Fr.: 9.00h-18.30h, Sa.: 9.30h - 14.00h durchgehend geöffnet!<br />
|Weblink=http://www.Wenzlik-RE.de<br />
|Email=ecw-recklinghausen@t-online.de<br />
|Bemerkung= Elektronik Einzelhandel 47.000 verschiedene Artikel vorrätig.<br />
}}<br />
<br />
-----------------------------------------------------------------------------<br />
<br />
=Rheinland-Pfalz=<br />
<br />
==Andernach==<br />
{{ElektronikLieferant<br />
|Firmenname=EDV + Elektronic Systeme<br />
|Straße=Füllscheuer 30<br />
|PLZ=56626<br />
|Ort=Andernach<br />
|Telefon=02632/9293-0<br />
|Fax=02632/9293-33<br />
|Öffnungszeiten=Montag-Freitag 8:00 Uhr - 18:00 Uhr/Samstag geschlossen<br />
|Weblink=http://www.eleksys.de/<br />
|Email=info@eleksys.de<br />
|Bemerkung=<br />
}}<br />
<br />
==Koblenz==<br />
{{ElektronikLieferant<br />
|Firmenname=Radio Erbar<br />
|Straße=Bahnhofstr. 40<br />
|PLZ=56068 <br />
|Ort=Koblenz<br />
|Telefon=0261/34782<br />
|Fax=0261/14570<br />
|Öffnungszeiten=Montag-Freitag 9:00 Uhr - 18:00 Uhr/Samstag 9:00 Uhr - 12:00 Uhr<br />
|Weblink=http://www.radio-erbar.de/<br />
|Email=webmaster@radio-erbar.de<br />
|Bemerkung=<br />
}}<br />
==Mainz==<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Elektronik<br />
|Straße=Binger Str. 14-16 (nähe Hauptbahnhof)<br />
|PLZ=55122 <br />
|Ort=Mainz<br />
|Telefon=0180 5312111<br />
|Fax=<br />
|Öffnungszeiten=<br />
|Weblink=http://www.conrad.de/<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Elektronik Schmidt<br />
|Straße=Boppstrasse 62 - 64<br />
|PLZ=55118 <br />
|Ort=Mainz<br />
|Telefon=0180 5312111<br />
|Fax=<br />
|Öffnungszeiten=Montag - Freitag 09.00 Uhr - 13.00 Uhr und 14.00 Uhr - 18.00 Uhr<br><br />
Samstag 09.00 Uhr - 13.00 Uhr<br />
|Weblink=http://www.schmidt-electronic.de<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
-----------------------------------------------------------------------------<br />
<br />
=Saarland=<br />
<br />
<br />
== Saarbrücken ==<br />
<br />
<br />
<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=ESS Elektronik Service Skowronek<br />
|Straße=Peter-Zimmer-Str. 13<br />
|PLZ=66123 <br />
|Ort=Saarbrücken<br />
|Telefon=+49 (681) 816414<br />
|Fax= +49 (681) 816992<br />
|Öffnungszeiten= Mo-Fr 8:00-12:00 Uhr / 14:00-18:00 Uhr<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad<br />
|Straße=Trierer Straße 16-20<br />
|PLZ=66111<br />
|Ort=Saarbrücken<br />
|Telefon=0180 5 564445 (derzeit 14 Cent/Min. aus dem Festnetz der Dt. Telekom. Evtl. abweichende Preise für Anrufe aus den Mobilfunknetzen.)<br />
|Fax=<br />
|Öffnungszeiten= Mo.-Fr. 09.00-19.00 Uhr / Sa. 09.00-19.00 Uhr<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
=Sachsen=<br />
==Chemnitz==<br />
{{ElektronikLieferant<br />
|Firmenname=mükra electronic shop GmbH<br />
|Straße=Hartmannstr.45<br />
|PLZ=09113<br />
|Ort=Chemnitz<br />
|Telefon=0371/365736<br />
|Fax=0371/365736<br />
|Öffnungszeiten=Mo.-Fr. 10.00 Uhr - 18.00 Uhr<br>Sa. 10.00 Uhr - 13.00 Uhr<br />
|Weblink=http://onlineshop.muekra-electronic.com<br />
|Email=<br />
|Bemerkung=gut sortiert aber keine SMD BE<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=köhler-elektronik<br>Firma Michael Köhler<br />
|Straße=Erfenschlager Strasse 31<br />
|PLZ=09125<br />
|Ort=Chemnitz<br />
|Telefon=(03 71) 51 91 03<br />
|Fax=(03 71) 51 91 04<br />
|Öffnungszeiten=Mo.-Fr. von 9 - 18 Uhr <br> Sa. von 9 - 12 Uhr<br />
|Weblink=http://www.koehler-elektronik.de<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=NEUMERKEL<br>...Elektronik erleben!<br />
|Straße=Straße der Nationen 26<br />
|PLZ=09111<br />
|Ort=Chemnitz<br />
|Telefon=(03 71) 6 66 29 27<br />
|Fax=(03 71) 6 66 29 51<br />
|Öffnungszeiten=Mo.-Fr. von 9 - 13 und 14 - 18 Uhr<br />
|Weblink=http://www.neumerkel.de<br />
|Email=neumerkel.chemnitz@neumerkel.de<br />
|Bemerkung=zwischen B. Uhse und Mc. Donald :)<br />
}}<br />
<br />
==Dresden==<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad<br />
|Straße=Friedrich-List-Platz 2<br>gegenüber Hauptbahnhof<br />
|PLZ=01069<br />
|Ort=Dresden <br />
|Telefon=<br />
|Fax=<br />
|Öffnungszeiten=Mo.-Fr. 09.30-20.00 Uhr, <br>Sa. 09.00-20.00 Uhr<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Sullus<br />
|Straße=Tharandter Str. 67<br />
|PLZ=01187<br />
|Ort=Dresden <br />
|Telefon=0351 4112100<br />
|Fax=0351 4112146<br />
|Öffnungszeiten=Mo.-Fr. 10.00-18.30 Uhr, <br>Sa. 09.00-12.00 Uhr<br />
|Weblink=http://www.sullus.de/<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
==Leipzig==<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad<br />
|Straße=Neumarkt 20<br />
|PLZ=04109<br />
|Ort=Leipzig <br />
|Telefon=<br />
|Fax=<br />
|Öffnungszeiten=Mo.-Sa.: 09.30-20.00 Uhr<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=ELMICRO Computer GmbH & Co. KG <br />
|Straße=Hohe Str. 9-13<br />
|PLZ=04107<br />
|Ort=Leipzig <br />
|Telefon=+49-(0)341-9104810<br />
|Fax=+49-(0)341-9104818<br />
|Öffnungszeiten=Mo.-Sa.: 09.00-17.00 Uhr<br />
|Weblink=http://elmicro.com/de/ela-leipzig.html<br />
|Email=leipzig|at|elmicro.com<br />
|Bemerkung=Besucher werden gebeten, sich kurzfristig telefonisch anzumelden.<br />
}}<br />
<br />
==Zwickau==<br />
{{ElektronikLieferant<br />
|Firmenname=Elektronik Neumerkel GmbH<br />
|Straße=Kolpingstraße 20<br />
|PLZ=08058<br />
|Ort=Zwickau<br />
|Telefon=+ 49 (0)375-589920<br />
|Fax=+ 49 (0)375-5899222<br />
|Öffnungszeiten=Mo. - Fr. 9:00 - 18:00 Uhr, Sa. 9:00 - 12:30 Uhr<br />
|Weblink=http://www.neumerkel.de<br />
|Email=info@neumerkel.de<br />
|Bemerkung=Auch als Teuermerkel bekannt :)<br />
}}<br />
<br />
-----------------------------------------------------------------------------<br />
<br />
=Sachsen-Anhalt=<br />
==Magdeburg==<br />
{{ElektronikLieferant<br />
|Firmenname=mittrenga electronic<br />
|Straße=Maxim-Gorki-Str. 34<br />
|PLZ=39108<br />
|Ort=Magdeburg<br />
|Telefon=0391/7333500<br />
|Fax=0391/7346538<br />
|Öffnungszeiten= 15.00- 18.00<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Nova Electronic<br />
|Straße=Leipziger Str. 31<br />
|PLZ=39112<br />
|Ort=Magdeburg<br />
|Telefon=0391/6272537<br />
|Fax=?<br />
|Öffnungszeiten=15.00- 1800<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
-----------------------------------------------------------------------------<br />
<br />
=Schleswig Holstein=<br />
==Kiel==<br />
{{ElektronikLieferant<br />
|Firmenname=Elektronik Schmidt Inh. Karl Heinz Parting<br />
|Straße=Adelheidstr. 28<br />
|PLZ=24103<br />
|Ort=Kiel<br />
|Telefon=0431 94682<br />
|Fax=0431 92574<br />
|Öffnungszeiten=<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=durch Zigarettenqualm stark verräuchertes Ladengeschäft; viele historische Bauteile verfügbar<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic<br />
|Straße=Mergenthalerstr. 22<br />
|PLZ=24223<br />
|Ort=Raisdorf<br />
|Telefon=0180 5 564445 <br />
|Fax=<br />
|Öffnungszeiten=Mo.-Sa. 10.00-20.00 Uhr<br />
|Weblink=http://www.conrad.de<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
-----------------------------------------------------------------------------<br />
<br />
=Thüringen=<br />
==Erfurt==<br />
{{ElektronikLieferant<br />
|Firmenname=Hübner-Elektronik e.K.<br />
|Straße=Juri-Gagarin-Ring 27<br />
|PLZ=99084 <br />
|Ort=Erfurt<br />
|Telefon= +49 (0361) 6 42 34 56<br />
|Fax= +49 (0361) 6 42 34 55<br />
|Öffnungszeiten=Montag-Freitag - 9.30 bis 18.30 Uhr, Samstag - 10.00 bis 13.00 Uhr<br />
|Weblink=http://www.huebner-elektronik.de/<br />
|Email= info@huebner-elektronik.de<br />
|Bemerkung=<br />
}}<br />
<br />
==Eisenach==<br />
{{ElektronikLieferant<br />
|Firmenname=Elektronik-Stübchen<br />
|Straße=Katharinenstraße 117<br />
|PLZ=99817<br />
|Ort=Eisenach<br />
|Telefon= (03691)77324<br />
|Fax=<br />
|Öffnungszeiten=Montag-Freitag - 9.00 bis 13.00 Uhr, 14.30 bis 18 Uhr<br />
Sonnabend 9.00 bis 12.00 Uhr<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
==Jena==<br />
{{ElektronikLieferant<br />
|Firmenname=Stefan Schmutzer VAT Elektronik<br />
|Straße=Bachstraße 10<br />
|PLZ=07743<br />
|Ort=Jena<br />
|Telefon= (03641)447184<br />
|Fax=<br />
|Öffnungszeiten= Mo-Fr. bis 18:00Uhr. Sa zu<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
=Österreich=<br />
==Linz==<br />
{{ElektronikLieferant<br />
|Firmenname=Aigner Elektronik<br />
|Straße=Dinghoferstr. 63<br />
|PLZ=A-4020 <br />
|Ort=Linz<br />
|Telefon=+43 732 669691-0 <br />
|Fax=+43 732 669691-15<br />
|Öffnungszeiten=Mo. bis Fr. 8:30 bis 17:00 (keine Mittagssperre), Samstag 8:30 bis 12:00<br />
|Weblink=http://www.aigner.co.at/<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic<br />
|Straße=Kornstraße 4<br />
|PLZ=A-4060 <br />
|Ort=Leonding<br />
|Telefon=+43 732 683040-0 <br />
|Fax=+43 732 683040-13 <br />
|Öffnungszeiten=Mo. bis Fr. 9:00 bis 19:00 , Samstag 9:00 bis 17:00<br />
|Weblink=http://www.conrad.at/<br />
|Email=mailto://filiale.linz@conrad.at<br />
|Bemerkung=<br />
}}<br />
<br />
==Graz== <br />
{{ElektronikLieferant<br />
|Firmenname=Neuhold Elektronik<br />
|Straße=Griesplatz 1<br />
|PLZ=A-8020 <br />
|Ort=Graz<br />
|Telefon=+43 (0) 316 711245<br />
|Fax=+43 (0) 316 717419<br />
|Öffnungszeiten=Montag bis Freitag von 9.00 - 18.00 Uhr<br>Samstag 9.00-12.30 Uhr<br />
|Weblink=http://www.neuhold-elektronik.at/<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
==Salzburg==<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad<br />
|Straße=Alpenstraße 95 - 97<br />
|PLZ=5020 <br />
|Ort=Salzburg<br />
|Telefon=050 - 20 40 81 00<br />
|Fax=<br />
|Öffnungszeiten=Mo.-Fr. 9.00-19.00 Uhr<br>Sa. 9.00-18.00 Uhr<br />
|Weblink=http://www.conrad.at/megastores<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
==Wels== <br />
{{ElektronikLieferant<br />
|Firmenname=Andi Leitner - AL Elektronik<br />
|Straße=Linzer Straße 57<br />
|PLZ=4600<br />
|Ort=Wels<br />
|Telefon=07242/53624<br />
|Fax=07242/53624-3<br />
|Öffnungszeiten=Montag bis Freitag von 0800 bis 1800<br />
|Weblink=http://www.al-elektronik.at<br />
|Email=office@al-elektronik.at<br />
|Bemerkung=Modellbau- und Elektronik-Laden. Andi nimmt sich für jeden Kunden die nötige Zeit. Nicht lagernde Ware nach Bestellung abholbar. Umfangreiche, kompetente Beratung. Nur wenig SMD-Bauteile, generell keine MSP430, sonst umfangreiche Auswahl. Website sehr unvollständig - besonders im Elektronikbereich.<br />
<br />
Anfahrt: Von der Innenstadt kommend: Auf der Stelzhamerstraße westwärts bis zur Ampel vor der Gebietskrankenkasse. An der Ampel rechts, nach ungefähr 100m an der nächsten Kreuzung Links. Nach rund 250m erreichen Sie das Geschäft auf der Linken Straßenseite.<br />
<br />
Von Osten kommend: Auf der Wiener Bundesstraße Richtung Zentrum, immer gerade aus (Osttangente queren). Weiter gerade aus westwärts (auf der Hans-Sachs-Straße). Auch beim Kreisverkehr beim Pensionistenheim gerade drüber (sprich: 2. Ausfahrt des Kreisverkehrs). Weiter gerade in Richtung Innenstadt, bis sie zur Ampel bei der Gebietskrankenkasse kommen. Hier Links abbiegen. Nach ungefähr 100m an der nächsten Kreuzung Links. Nach rund 250m erreichen Sie das Geschäft auf der Linken Straßenseite.<br />
}}<br />
<br />
==Wien==<br />
{{ElektronikLieferant<br />
|Firmenname=GM Electronic GmbH<br />
|Straße=Brünner Straße 19<br />
|PLZ=1210 <br />
|Ort=Wien<br />
|Telefon=01/27 11 256<br />
|Fax=<br />
|Öffnungszeiten=Mo.-Fr. 9.00-13.00 14.00-18.00 Uhr<br>Sa. 10.00-13.00 14.00-16.00 Uhr<br />
|Weblink=http://www.gm-e.eu/index.php<br />
|Email=<br />
|Bemerkung=<br />
}}<br />
<br />
----<br />
<br />
=Schweiz=<br />
----<br />
==Aargau (AG)==<br />
===Baden===<br />
{{ElektronikLieferant<br />
|Firmenname=<s>Gautschi Elektronik (ehemals AUTRIX Meier)</s> ***)<br />
|Straße=Martinsbergstrasse 28<br />
|PLZ=5400<br />
|Ort=Baden<br />
|Telefon=056 222 24 24<br />
|Fax=056 210 06 12<br />
|Öffnungszeiten=<br />
Montag 13:30-18:00, Di-Fr 08:00-12:00 und 13:00-18:00, Sa 09:00-12:00<br />
|Weblink=<br />
|Email=<br />
|Bemerkung=Orchesterelektronik, REVOX und Elektronik-Laden. <br />
Ehemals AUTRIX Meier. Nach bald 30 Jahren hat Ernst Meier den Laden 2006 in neue<br />
Hände gegeben. Hier spürt man noch den Charme der 70er Jahre des letzten Jahrhunderts: ca. 20m2 Ladenlokal, vollgestopft bis unter die Decke mit mit elektronischem Kleinkram!<br />
Teile des Sortiments entstammen ebenfalls dieser Zeitepoche. Mikroprozessoren und SMD-Bauteile sucht man hier vergebens. Dafür lassen sich auch mal (heute seltene) TTL's finden!<br />
<br><br>[[Spezial:Beiträge/85.3.130.90|85.3.130.90]] 13:12, 13. Okt. 2009 (UTC)<br />
<br><br> '''***)''' seit Frühjahr 2009 Liegenschaft abgebrochen. Nachfolgefirma unbekannt.<br><br />
Schweizermacher [[Spezial:Beiträge/83.78.147.198|83.78.147.198]] 07:13, 7. Jan. 2010 (UTC)<br />
}}<br />
<br />
===Zofingen===<br />
{{ElektronikLieferant<br />
|Firmenname=Surplus Party Zofingen<br>Funkerverein Zofingerrunde HB9FX<br />
|Straße=Strengelbacherstrasse 27 (Mehrzweckhalle)<br />
|PLZ=4800<br />
|Ort=Zofingen<br />
|Telefon=<br />
|Fax=<br />
|Öffnungszeiten=<br><br />
'''1x jährlich am letzen Samstag im Oktober:''' 31. Oktober 2009 / 30. Oktober 2010 / 29. Oktober 2011 / 27. Oktober 2012<br />
<br>08:30 bis 16:30 Uhr<br />
|Weblink=http://www.surplusparty.ch/surplus.htm<br />
|Email=event(at)surplusparty.ch<br />
|Bemerkung='''Die Surplus Party, seit 1984 der grösste Flohmarkt der Schweiz von Amateufunkern für Amateurfunker! Der Eintritt ist gratis.'''<br />
Neue und gebrauchte Bauteile aus Elektronik, Funk- und Computertechnik, Surplus-Messgeräte, Funkgeräte und alles wonach man nie gesucht hat!<br />
<br />
'''Anreise mit dem Auto:'''<br><br />
Aus den Richtungen Basel, Bern und Zürich die Autobahn A1 in Oftringen (Ausfahrt Nr. 48) verlassen und in Richtung Zofingen fahren. Vor dem Stadteingang beginnt die Beschilderung zu den Parkplätzen (nach rechts abbiegen, am Bahnhof vorbei, nach dem Busterminal rechts abbiegen und die Bahnlinie überqueren).<br />
<br />
Aus der Richtung Luzern die Autobahn A2 in Reiden (Ausfahrt Nr. 18) verlassen und in Richtung Zofingen fahren. Vor dem Stadteingang beginnt die Beschilderung zu den Parkplätzen (nach links abbiegen).<br />
Es stehen ausreichend Parkplätze zur Verfügung!<br />
<br />
Die Parkplätze direkt bei der Halle sind gebührenpflichtig (Samstag bis 12:00 Uhr). Die Parkkarten für reservierte Plätze berechtigen nur zur Einfahrt direkt vor die Halle, aber Ersetzen nicht das notwendige Parkticket!<br />
<br />
Total stehen für die Surplus Party '''rund 1'000 Parkplätze''' (davon etwa 750 gratis) zur Verfügung. Bitte befolgen Sie die Anweisungen des Parkdienstes.<br />
<br />
'''Anreise mit dem Zug:'''<br><br />
Zofingen befindet sich an der SBB Linie 501 Olten - Luzern und ist Haltestelle für die meisten Schnellzüge.<br />
In Zofingen angekommen, verlassen Sie und der Bahnlinie entlang in südlicher Richtung. Gehen Sie an den Busterminals vorbei, überqueren Sie die Bahnlinie nach rechts und von da an gehen Sie alles geradeaus bis zur Mehrzweckhalle (problemlos in 10 Minuten Fussmarsch erreichbar).<br />
<br><br>[[Spezial:Beiträge/85.3.130.90|85.3.130.90]] 13:12, 13. Okt. 2009 (UTC)<br />
}}<br />
<br />
<br />
== Basel-Stadt (BS) ==<br />
=== 4002 Basel ===<br />
{{ElektronikLieferant<br />
|Firmenname=<s>Grieder Elektronik Bauteile AG</s><br />
|Straße=<s>Nauenstrasse 63</s><br />
|PLZ=<s>4002</s><br />
|Ort=<s>Basel</s><br />
|Telefon=n/a<br />
|Fax=n/a<br />
|Öffnungszeiten='''Ladenlokal in Basel per Ende 2008 geschlossen.'''<br />
|Weblink=http://shop.griederbauteile.ch/<br />
|Email=n/a<br />
|Bemerkung=Umzug nach 4450 Sissach ==> [[Lokale_Elektroniklieferanten#4450_Sissach]]<br />
Fortführung als Versandunternehmen.<br><br />
z.Zt. liegen keine Informationen über die Möglichkeit der Abholung von vorbestellter Ware vor Ort vor.<br />
<br />
<br><br>[[Spezial:Beiträge/85.3.130.90|85.3.130.90]] 13:37, 13. Okt. 2009 (UTC)<br />
}}<br />
<br />
== Basel-Landschaft (BL) ==<br />
=== 4450 Sissach ===<br />
{{ElektronikLieferant<br />
|Firmenname=Grieder Elektronik Bauteile AG<br />
|Straße=Reuslistrasse 62<br />
|PLZ=4450<br />
|Ort=Sissach<br />
|Telefon=061 976 95 95<br />
|Fax=061 976 95 90<br />
|Öffnungszeiten=Mo-Do 800-1200, 1300-1600 und Fr 800-1200, 1300-1500.<br />
|Weblink=http://shop.griederbauteile.ch/<br />
|Email=info@griederbauteile.ch<br />
|Bemerkung=Mindestbestellwert CHF 20. Vorbestellte Waren können abgeholt werden. Der "Laden" befindet sich 10 Minuten zu Fuss vom Bahnhof Sissach.<br />
<br />
}}<br />
<br />
== Luzern (LU) ==<br />
=== Emmenbrücke ===<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic Schweiz<br />
|Straße=Seetalstrasse 11<br />
|PLZ=6020<br />
|Ort=Emmenbrücke <br />
|Telefon=0848/80 12 83<br />
|Fax=041/267 32 14<br />
|Öffnungszeiten=<br><br />
Mo/Di/Do 09:00-18:30, Mi/Fr 09:00-21:00, Sa 08:00-16:00 Uhr<br />
<br />
|Weblink=http://www1.ch2.conrad.com/infocenter/filialen.php<br />
|Email=filiale.emmenbruecke@conrad.ch<br />
<br />
|Bemerkung=5 Minuten vom Bahnhof Emmenbrücke<br>GRATIS Parkhaus & Parkplätze<br />
<br><br>[[Spezial:Beiträge/85.3.130.90|85.3.130.90]] 13:12, 13. Okt. 2009 (UTC) <br />
}}<br />
<br />
<br />
== Solothurn (SO) ==<br />
===5014 Gretzenbach===<br />
{{ElektronikLieferant<br />
|Firmenname=EFG Electronic AG<br />
|Straße=Köllikerstrasse 32<br />
|PLZ=5014<br />
|Ort=Gretzenbach<br />
|Telefon= 062 849 23 61 <br />
|Fax= 062 849 23 70 <br />
|Öffnungszeiten=<br />
Mo-Fr 09:30-11:30, 13:30-18:30, Mi geschlossen, Sa 08:30-16:00 <br />
|Weblink=http://www.maxland.ch/netmax/standseiten/efg/index.html<br />
|Email=efgag@yetnet.ch <br />
|Bemerkung=Kabel - Messgeräte - Lautsprecher - elektronische Bauteile<br />
kein Versand, nur Ladengeschäft<br />
<br><br>[[Spezial:Beiträge/62.203.205.15|62.203.205.15]] 11:35, 8. Feb. 2010 (UTC) -- Edit: Schweizermacher<br />
}}<br />
<br />
== Zürich (ZH) ==<br />
===8004 Zürich===<br />
{{ElektronikLieferant<br />
|Firmenname=Pusterla Elektronik AG<br />
|Straße=Hohlstrasse 52 <br />
|PLZ=8004<br />
|Ort= Zürich<br />
|Telefon=044 241 56 77<br />
|Fax=044 242 01 04<br />
|Öffnungszeiten=<br />
Mo-Fr 09:00-18:30, Sa 09:00-16:00<br />
|Weblink=http://www.pusterla.ch/<br />
|Email=info@pusterla.ch<br />
|Bemerkung=Absoluter "Kult-Laden" mit Tradition. Wer jemals in der Schweiz einen Lötkolben in der Hand hatte, der kennt "Pusti"<br />
<br />
Das Sortiment ist zweigeteilt:<br><br><br />
'''hinter dem Tresen:'''<br><br />
gutes allgemeines Bauteilesortiment, spezielle Sachen werden bestellt.<br />
<br>Man nimmt sich Zeit für Fachberatung - es wird auch schon mal ein Vergleichstyp aus der Liste gesucht und dem jungen "Case-Modder" wird mit Engelsgeduld erklärt wie man den Vorwiderstand für seine coole LED-Prozessorinnenbeleuchtung berechnet.<br />
<br />
'''vor dem Tresen - Selbstbedienung:'''<br><br />
Am Eingang nimmt man sich eine Pappschale mit Bleistift und Notizblock.<br />
Artikel, Menge und Preise schreibt man selbst auf!<br />
<br />
Das Sortiment bietet einen Querschnitt durch die elektronische Bauteilefertigung der letzten 50 Jahre. Sehr gute Quelle für spannungsfeste Kondensatoren und hochohmige (Leistungs-)Widerstände sowie mechanischem "Klein-Grabbel-Kram." Gute Auswahl an Gehäusen, Transformatoren (z.T. recht schräge Typen) sowie Relais und Stecker/Buchsen die die Welt wohl niemals gebraucht hat. <br> '''Vorsicht bei Elektrolytkondensatoren:''' "historische" Lagerware, besser man hat ein ESR-Meter dabei - sodenn man hat!<br />
<br>Kabel jeglicher Art gibt es ab der Rolle zum Selberabschneiden - auch 10cm sind kein Problem - ausrechnen und aufschreiben machst Du ja selber.<br />
<br> Präsentation der Ware im Selbsbedienungsteil:<br />
<br> Bauteile offen oder ab Gurt in kleinen, liebevoll angeschriebenen Pappschachteln (noch von Vater Pusterla), grösseren Wühlschachteln, einer Wühlecke sowie hier und da einige Merkwürdigkeiten auf dem Fussboden.<br />
Man stelle sich das Ladenlokal eines Joint-Ventures aus Oppermann, Pollin, dem ehem. Völkner sowie dem örtlichen Entsorgungshof vor - '''das''' ist "Pusti" und so war er schon immer!<br><br />
<br />
'''Fazit:''' absolut lohnenswert, auch wenn man vielleicht nicht immer das bekommt was man wollte, dafür findet man aber alles, wonach man nie gesucht hatte!<br />
<br><br>[[Spezial:Beiträge/85.3.130.90|85.3.130.90]] 13:12, 13. Okt. 2009 (UTC)<br />
<br>[[Spezial:Beiträge/62.203.205.15|62.203.205.15]] 11:45, 8. Feb. 2010 (UTC) -- Edit: Tippfehler (Schweizermacher)<br />
}}<br />
<br />
===8025 Zürich===<br />
{{ElektronikLieferant<br />
|Firmenname=in Memoriam: (1967 - 1996)<br />
''Alfred Mattern AG''<br />
|Straße=''Seilergraben 53'' <br />
|PLZ=''8025''<br />
|Ort= ''Zürich''<br />
|Telefon= n/a<br />
|Fax= n/a<br />
|Öffnungszeiten=n/a<br />
|Weblink=http://www.moneyhouse.ch/u/pub/alfred_mattern_ag_CH-020.3.916.364-3.htm<br />
|Email=<br />
|Bemerkung=Firmengründung 1967, Konkurs 1996<br />
<br />
'''SHAB: 235 / 1996 vom 03.12.1996 (Seite 7457)''' <br><br />
27. November 1996 (25729)<br><br />
Alfred Mattern AG, in Z ü r i c h, Handel mit Antennen und Antennenzubehör sowie mit Geräten und Bauteilen der Elektro-, Elektronik-, Radio-und Fernsehindustrie, Aktiengesellschaft (SHAB Nr. 210 vom 30. 10. 1995, S. 5945).<br />
Firma neu: Alfred Mattern AG in Liquidation. Mit Verfügung vom 02.10.1996 hat der Konkursrichter des Bezirksgerichts Zürich über die Gesellschaft den Konkurs eröffnet; demnach ist die Gesellschaft aufgelöst. Das Konkursverfahren ist mit Verfügung desselben Richters vom 13.11.1996 mangels Aktiven eingestellt worden.<br />
<br><br>[[Spezial:Beiträge/85.3.130.90|85.3.130.90]] 13:12, 13. Okt. 2009 (UTC) <br />
}}<br />
<br />
===8092 Zürich===<br />
{{ElektronikLieferant<br />
|Firmenname="Bastli"<br>Fachverein der Departemente Informationstechnologie und Elektrotechnik und Maschinenbau und Verfahrenstechnik an der ETH Zürich.<br />
|Straße=Universitätsstrasse 19<br />
|PLZ=8092<br />
|Ort= Zürich<br />
|Telefon= n/a<br />
|Fax= n/a<br />
|Öffnungszeiten=Die Öffnungszeiten gelten nur während des Semesters.<br />
Mo 12:15 - 13:00 Uhr<br><br />
Do 12:15 - 13:00 Uhr<br><br />
<br />
|Weblink=http://www.bastli.ethz.ch/<br />
|Email=bastli@amiv.ethz.ch<br />
|Bemerkung=Studentischer "Bastel-Shop"<br />
Während den Öffnungszeiten ist der Bastli-Shop im ersten Stock des UNG geöffnet.<br />
Ihr könnt Bauteile, welche wir an Lager haben, kaufen und euch wird mit diversen elektronischen Problemen geholfen. <br />
<br />
Organisierte Sammelbestellungen bei Fa. Reichelt / Deutschland<br />
<br />
'''Standort:'''<br><br />
<br />
Bastli und Messplatz befinden sich in den Räumlichkeiten des AMIV im UNG Gebäude schräg gegenüber des CAB.<br />
Es ist das gleiche Gebäude in dem auch der ehem. AMIV-Verlag respektive ehem. WBS respektive SPOD untergebracht ist.<br />
<br />
Das Gebäude wirkt beim ersten Kontakt wohl für jeden neuen ein bisschen abschreckend. Aber keine Scheu, wenn man durch das etwas schlecht beleuchtete Treppenhaus in den ersten Stock gelangt, wendet man sich dort gleich nach rechts. Bastli und Messplatz haben die Zimmernummern C6 und C5.<br />
<br><br>[[Spezial:Beiträge/85.3.130.90|85.3.130.90]] 13:12, 13. Okt. 2009 (UTC)<br />
}}<br />
<br />
=== 8305 Dietlikon ===<br />
{{ElektronikLieferant<br />
|Firmenname=Conrad Electronic Schweiz<br />
|Straße=Alte Dübendorferstrasse 17<br />
|PLZ=8305<br />
|Ort=Dietlikon<br />
|Telefon=0848/80 12 84<br />
|Fax=044/805 35 14<br />
|Öffnungszeiten=<br><br />
Mo-Do 10:00-20:00, Fr 10:00-21:00, Sa 09:00-20:00 Uhr<br />
<br />
|Weblink=http://www1.ch2.conrad.com/infocenter/filialen.php<br />
|Email=filiale.dietlikon@conrad.ch<br />
<br />
|Bemerkung=5 Minuten vom Bahnhof Dietlikon<br>Parkhaus & Parkplätze vorhanden<br />
<br><br>[[Spezial:Beiträge/85.3.130.90|85.3.130.90]] 13:12, 13. Okt. 2009 (UTC)<br />
}}<br />
<br />
=== 8606 Nänikon ===<br />
{{ElektronikLieferant<br />
|Firmenname=Distrelec Schweiz<br />
|Straße=Grabenstrasse 6<br />
|PLZ=8606<br />
|Ort=Nänikon<br />
|Telefon=044 - 944 99 11<br />
|Fax=044 - 944 99 88<br />
|Öffnungszeiten=<br><br />
Mo-Fr 07:30-18:00 Uhr (nur Abholschalter)<br />
<br />
|Weblink=https://www.distrelec.ch<br />
|Email=info@distrelec.com<br />
|Bemerkung='''Abholschalter:''' (Vorbestellung unbedingt erforderlich)<br />
Telefonisch oder online bestellte Ware kann nach ca. 2 Stunden abgeholt werden.<br />
<br>Es kann auch direkt vor Ort ab Katalog bestellt werden, allerdings dann Wartezeit von min. 2 Stunden<br />
<br>Bezahlung: bar/EC- und Post-Card<br />
<br><br>[[Spezial:Beiträge/85.3.130.90|85.3.130.90]] 13:12, 13. Okt. 2009 (UTC)<br />
}}<br />
<br />
= Siehe auch =<br />
* [[Platinenhersteller]]<br />
* [[Elektronikversender]]<br />
* [[Eisenwarenversender]]</div>Schweigstill