<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=134.109.9.176</id>
	<title>Mikrocontroller.net - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=134.109.9.176"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/134.109.9.176"/>
	<updated>2026-04-11T03:16:03Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVRDUDE&amp;diff=78368</id>
		<title>AVRDUDE</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVRDUDE&amp;diff=78368"/>
		<updated>2013-09-02T11:26:56Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* 64-Bit-Problem */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beschreibung ==&lt;br /&gt;
AVRDUDE (http://www.nongnu.org/avrdude/) ist eine Programmiersoftware für Atmel [[AVR]] Controller. &lt;br /&gt;
&lt;br /&gt;
Funktionen unter Anderem: &lt;br /&gt;
&lt;br /&gt;
* Übertragen von Programmcode in den Flash-Speicher&lt;br /&gt;
* Auslesen ungeschützen Codes aus dem Flash&lt;br /&gt;
* Setzen und Lesen von Fuse- und Lockbits (Siehe auch: [[AVR_Fuses#Vergleich_der_Fuses_bei_verschiedenen_Programmen|Vergleich der Fuses bei verschiedenen Programmen]])&lt;br /&gt;
* Schreiben und Lesen des EEPROMs&lt;br /&gt;
&lt;br /&gt;
AVRDUDE kann das [[STK500]] (auch mit Firmware 2.x als stk500v2), das Atmel AVRISP (auch mit Firmware 2.x als avrispv2 o.ä.), das Atmel AVRISP MKII (USB Ansteuerung mittels lib-usb bzw. lib-usb-W32), [[AVR_In_System_Programmer#USB | AVR910-kompatible]] Programmierer, den [[AVR Butterfly]]/AVR109-kompatible Bootloader, [[STK200]]-Programmierdongles und verschiedene andere Parallelport-Adapter sowie &amp;quot;serielle Statusportprogrammierer&amp;quot; (Siprog) ansteuern. Auch das Atmel JTAGICE (oder Nachbauten wie Bootice oder Evertool), Atmel JTAGICE-MKII und der AVR Dragon können als Programmierhardware genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Das Programm ist unter MS-Windows (Cygwin nicht erforderlich), Linux, BSD, Solaris und Mac OS X lauffähig. Die Version für MS-Windows ist im [[WinAVR]]-Paket enthalten. Der Quellcode ist frei verfügbar (Lizenz beachten).&lt;br /&gt;
&lt;br /&gt;
Da alle AVRDUDE-Funktionen über Kommandozeilenparamter gesteuert werden können, eignet es sich gut zur Integration in Makefiles. Beispiele finden sich in der Makefile-Vorlage von [[WinAVR]] und Mfile. &lt;br /&gt;
&lt;br /&gt;
Die gesamte Konfiguration liegt in einer Textdatei (avrdude.conf), so dass sich bei Bedarf ein beliebiger neuer Parallelport-Programmierdongle oder auch ein noch nicht unterstützter AVR-Controller ergänzen lassen. Die Syntax für die Definition eines AVR-Controllers lehnt sich an die Datenblatt-Tabelle für die serielle Programmierung an, so dass man praktisch nur das Datenblatt &amp;quot;intelligent&amp;quot; abtippen muss.&lt;br /&gt;
&lt;br /&gt;
Für die Ansteuerung von Parallelport-Adaptern unter MS-Windows NT/2000/XP wird ein spezieller Porttreiber (giveio) mitgeliefert. Bei der Installation von [[WinAVR]] wird giveio bereits mitinstalliert. &lt;br /&gt;
&lt;br /&gt;
Programmer mit üblicher serieller Schnittstelle (RS232) benötigen keine zusätzliche Software oder Treiber zum Betrieb mit AVRDUDE. &lt;br /&gt;
&lt;br /&gt;
Für Hardware mit USB-Anschluss muss die lib-usb bzw. lib-usb-win32 installiert sein.&lt;br /&gt;
&lt;br /&gt;
===GUIs===&lt;br /&gt;
Bei [[WinAVR]] wird die grafische Oberfläche avrdude-gui.exe mitgeliefert.&lt;br /&gt;
&lt;br /&gt;
In der IDE von [[LunaAVR]] ist ebenfalls eine GUI für AVRDUDE enthalten (Windows und Linux).&lt;br /&gt;
&lt;br /&gt;
Für Windows, Linux und andere Betriebssysteme gibt es zwei weitere GUIs: den in Java geschriebene [[Burn-o-mat|AVR Burn-O-Mat]] und den [http://www.soft-land.de/ AVRBurner].&lt;br /&gt;
&lt;br /&gt;
Für Mac OS X gibt es noch [http://www.vonnieda.org/software/avrfuses AVRFuses.app]. AVRFuses muss beim ersten Starten auf den verwendeten Programmer und den Speicherort von AVRDUDE eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
GUIs vereinfachen vor allem Programmieren der Fuses.&lt;br /&gt;
&lt;br /&gt;
== Kurzanleitung für Linux und STK200 ==&lt;br /&gt;
&lt;br /&gt;
Dazu muss erst ein Hardware-Link auf die Printerport-Treiber eingerichtet werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
su&lt;br /&gt;
mknod /dev/parport0 c 99 0&lt;br /&gt;
chmod a+rw /dev/parport0&lt;br /&gt;
avrdude -p m8535 -c stk200 -e -U qqtraff.hex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis :&lt;br /&gt;
Bei USB Programmern ist zu beachten, dass diese durch das Betriebssystem auf einen anderen Port gelegt werden können, als im Beispiel angegeben.&lt;br /&gt;
Diesen Port kann man unter Anderem &amp;quot;im Terminal&amp;quot; mit dem Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
user@server: dmesg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ermitteln.&lt;br /&gt;
Alternativ kann man sich eine Auflistung der Ports, im Verzeichnis &amp;quot;/dev&amp;quot; anzeigen lassen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
user@server: ls /dev/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Sollte man nicht sicher sein, auf welchem Port der Programmer liegt, kann man den Programmer nochmals ausstecken und &amp;quot;ls /dev/&amp;quot; ausführen. Der nun Fehlende Port, ist der Programmerport.&lt;br /&gt;
Diesen Port muss man statt &amp;quot;parport0&amp;quot; in die oben beschriebenen Terminalkommandos einsetzen.&lt;br /&gt;
&lt;br /&gt;
Siehe auch : &lt;br /&gt;
* [http://wiki.ctbot.de/index.php/AVR_ISP_Programmer#BlueMP3_bzw._STK200_kompatible_Flasher weitere Beispiele für avrdude Kommandos (http://wiki.ctbot.de/index.php)]&lt;br /&gt;
* [[AVR_In_System_Programmer#STK200-kompatibel]]&lt;br /&gt;
* http://www.mikrocontroller.net/topic/200390#new&lt;br /&gt;
&lt;br /&gt;
== Tipps + Tricks ==&lt;br /&gt;
&lt;br /&gt;
=== [[AVR_In_System_Programmer#Parallelport|Parallelport-Programmer]] an aktuellen PCs ===&lt;br /&gt;
&lt;br /&gt;
Sofern man ein echtes Parallelport hat, die preiswerteste und auch schnellste Art der Datenübertragung zum Zielsystem (Mikrocontroller). Alles andere wie bspw. eine PCI-, PCIexpress- oder ExpressCard-Karte ist schon komplizierter und teurer.&lt;br /&gt;
&lt;br /&gt;
==== Steckkarten ====&lt;br /&gt;
&lt;br /&gt;
Diese liegen auf anderen Basisadressen. Kann man im Geräte-Manager einsehen. Diese ist &amp;lt;tt&amp;gt;avrdude&amp;lt;/tt&amp;gt; per Kommandozeile &#039;&#039;(irgendwie)&#039;&#039; mitzuteilen. Sonst kann es nicht funktionieren.&lt;br /&gt;
&lt;br /&gt;
Die Geschwindigkeit ist gleich eingebauter echter Parallelports, also sehr schnell.&lt;br /&gt;
&lt;br /&gt;
==== USB-Parallel-Adapter ====&lt;br /&gt;
&lt;br /&gt;
Gewöhnliche USB-Paralleldrucker-Adapter (um 5 € zu haben) &#039;&#039;&#039;funktionieren nicht&#039;&#039;&#039;. (Das Problem wäre zu lösen, wenn &amp;lt;tt&amp;gt;avrdude&amp;lt;/tt&amp;gt; auf InpOut32.dll setzt. Siehe [[#64-Bit-Problem|64-Bit-Problem unten]].)&lt;br /&gt;
&lt;br /&gt;
[http://www.tu-chemnitz.de/~heha/usb2lpt Spezielle USB-Parallel-Adapter], die Portadressen emulieren, funktionieren, allerdings gähnend langsam.&lt;br /&gt;
&lt;br /&gt;
==== Geschwindigkeit begrenzen ====&lt;br /&gt;
&lt;br /&gt;
Aktuelle PCs sind einfach zu schnell mit dem Bitgewackel an der parallelen Schnittstelle, vor allem für AVRs, die noch mit den 1 MHz im Auslieferungszustand laufen (maximal zulässiger ISP-Takt &amp;lt; 250 kHz). Neuere Versionen von avrdude unterstützen zu diesem Zweck eine Option &#039;&#039;&#039;-i &amp;lt;N&amp;gt;&#039;&#039;&#039;, wobei &amp;lt;N&amp;gt; die Anzahl der Mikrosekunden bezeichnet, die beim Bitwackeln zusätzlich zu warten ist. Einfach mal mit -i 10 anfangen und dann entweder die Fuses auf die Ziel-Taktfrequenz umstellen (falls diese wesentlich höher sein wird als die 1 MHz), oder sukkzessive mit kleineren Werten testen ([http://www.mikrocontroller.net/topic/83524#699933 Forenbeitrag von Jörg]).&lt;br /&gt;
&lt;br /&gt;
Die Option -i ist auch nützlich bei AVRs, die für einen langsamen Takt konfiguriert sind. Bei einem ATmega8, der mit einem 32.768 kHz Quarz läuft, kann es z.B. notwendig sein, die Option -i 90 zu verwenden. Den Zahlenwert ggf. ausprobieren.&lt;br /&gt;
&lt;br /&gt;
Manche Programmer werten die Option -i manchmal nicht aus, dann sollte man einen anderen Programmer versuchen.&lt;br /&gt;
&lt;br /&gt;
Beim USBTINY und USBASP kann man die Geschwindigkeit der SPI-Schnittstelle mit dem Parameter -B [Periodendauer in Mikrosekunden] begrenzen. Da beide Geräte durch Interrupts der Software-USB-Schnittstelle stark belastet werden, handelt es sich hier um die Maximalbitrate.&lt;br /&gt;
&lt;br /&gt;
==== Spezielle Hacks ====&lt;br /&gt;
&lt;br /&gt;
Unter Windows XP Service Pack 2 auf einem IBM Thinkpad T40 ließ sich die Fehlermeldung „avrdude: AVR device not responding“ beheben durch Ändern im Gerätemanager⇒Lpt1⇒Eigenschaften⇒Anschlusseinstellungen⇒„Interrupt-nie-verwenden“ in „Jeden dem Anschluss zugewiesenem Interrupt verwenden“.&lt;br /&gt;
&lt;br /&gt;
==== 64-Bit-Problem ====&lt;br /&gt;
&lt;br /&gt;
Unter 64-Bit-Windows-Versionen kann das Parallelport nicht benutzt werden, da der GiveIO-Treiber systembedingt nicht funktioniert. Genauer, es wird ohne [http://www.codeproject.com/Articles/28318/Bypassing-PatchGuard-3 böse Hacks] nicht möglich sein, eine 64-Bit-Version von GiveIO zu erstellen, da es hier eine [http://msdn.microsoft.com/en-us/library/windows/hardware/gg487350.aspx Kernel-Mode-Codeänderungs-Überwachung] gibt, die Änderungen an Systemtabellen (hier: Die IOPM, die In/Out Permission Map, falls es diese überhaupt gibt, und wenn ja, dann nur als Emulation für das 32-Bit-Subsystem) vereitelt (d.h. ein paar Minuten nach der Änderung kommt ein Bluescreen). Solange AVRDUDE an GiveIO (und eincompilierten E/A-Befehlen) festhält bleibt es so, und der Ausweich für den Bastler ist [[Pony-Prog_Tutorial|PonyProg]], bis AVRDUDE künftig ebenfalls InpOut32.dll bzw. InpOutX64.dll verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0.5em;padding:0.5em;border:1px green solid;border-radius:8px;-moz-border-radius:8px;background:#EFE&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Problem gelöst!&amp;lt;/b&amp;gt;&amp;lt;p&amp;gt;&lt;br /&gt;
So geht&#039;s:&lt;br /&gt;
* Neue [http://www-user.tu-chemnitz.de/~heha/viewzip.cgi/hs_freeware/inpout32-h%23s.zip/2013/Release InpOut32.dll] herunterladen&lt;br /&gt;
* Kommandozeile: &amp;lt;b&amp;gt;crundll InpOut32,CatchIo avrdude.exe &amp;lt;/b&amp;gt;&amp;lt;i&amp;gt;... (usw.)&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Und so funktioniert&#039;s:&amp;lt;/small&amp;gt;&lt;br /&gt;
* Die winzige crundll.exe ist ein Ersatz für rundll32.exe, als Konsolen-Version. Das verhindert, dass für avrdude eine neue Konsole geöffnet wird.&lt;br /&gt;
* crundll lädt InpOut32.dll und ruft den Einsprungpunkt CatchIoW auf. Als Kommandozeile wird L&amp;quot;avrdude.exe ...&amp;quot; (also die üblichen Parameter) übergeben&lt;br /&gt;
* Die CatchIoW-Routine erstellt einen schlafenden Prozess aus dem avrdude-Image. Nicht als Debugger, um teuere Prozessumschaltungen für das Exception-Handling (s.u.) zu vermeiden&lt;br /&gt;
* Ein &amp;quot;Remote Thread&amp;quot; wird im avrdude-Prozess gestartet, um InpOut32.dll zu laden. Genannt: [http://de.wikipedia.org/wiki/DLL-Injection DLL-Injektion]&lt;br /&gt;
* Die DLL-Initialisierungsroutine packt inpout64.sys aus, installiert und lädt diesen Kernmodus-Treiber. Das erfordert Admin-Rechte. Da es keine &amp;quot;I/O permission map&amp;quot; im X64 &amp;quot;long mode&amp;quot; gibt, kann es keinen Treiber geben, der E/A-Zugriffe für den User Mode transparent macht. Deshalb bleibt nichts anderes als ein Exception-Mechanismus übrig, um das Problem zu erschlagen. Nebenbei kann InpOut32.dll auf unübliche Portadressen sowie USB-Geräte umleiten. Die dazu notwendige Geräte- und Adresserkennung läuft ebenfalls in der Initialisierungsroutine&lt;br /&gt;
* In der Initialisierung wird ein prozessweiter Exception-Filter installiert&lt;br /&gt;
* Ein zweiter &amp;quot;Remote Thread&amp;quot; ändert die Adresse von kernel32.dll:GetVersionEx(). Die Ersatzroutine liefert als Plattform Windows 9x/Me. Auch genannt API-Hooking. Der Grund für den zweiten &amp;quot;Remote Thread&amp;quot; ist, dass dieses Verhalten bei regulärer Benutzung der InpOut32.dll (also LoadLibrary oder quasistatische Einbindung) unerwünscht ist.&lt;br /&gt;
* Der avrdude-Prozess wird aufgeweckt und startet. Er &amp;quot;erkennt&amp;quot; Windows 9x/Me and versucht gar nicht erst, GiveIo.sys zu starten.&lt;br /&gt;
* Dann macht avrdude die üblichen IN+OUT-Befehle. Jeder dieser Befehle generiert eine (IMHO) Allgemeine Schutzverletzung, also Int13 (General Protection Fault #GP). Bevor die sattsam bekannte Messagebox erscheint, geht der Interrupthandler zu ntdll:KiUserExceptionDispatcher, welche schließlich den installierten prozessweiten Exception-Filter aufruft, bevor es zum Abarbeiten eventueller try/except-Blöcke kommt&lt;br /&gt;
* Der Filter (also das Stückchen Kode in der InpOut32.dll) stellt fest, dass es sich tatsächlich im einen IN- oder OUT-Befehl handelt. Der Befehl wird einfach übersprungen und inpoutx64.sys bemüht, per DeviceIoControl() die E/A-Operation im Kernel Mode auszuführen. Kontext-Register (hier AL und DX) werden entsprechend benutzt. Danach meldet der Filter dem Aufrufer &amp;quot;Ausnahme erschlagen, bitte weiter im Text&amp;quot;&lt;br /&gt;
* Nach dieser länglichen Umleitung geht es weiter mit dem nächsten Assemblerbefehl&lt;br /&gt;
&lt;br /&gt;
Fertig.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== USB-Programmer ===&lt;br /&gt;
Die meisten USB-Programmiergeräte benötigen [http://sourceforge.net/apps/trac/libusb-win32/wiki libusb-win32] bzw. [http://www.libusb.org/ libusb].&lt;br /&gt;
&lt;br /&gt;
Ein Selbstbau-USB-Programmieradapter ist unter&lt;br /&gt;
[http://www.rototron.info/?Page=USBAVR/USBAVR.aspx http://www.rototron.info]&lt;br /&gt;
zu finden. Er benötigt eine relativ neue AVRDUDE-Version, aber benötigt unter &#039;&#039;keinem&#039;&#039; Windows-Betriebssystem einen Treiber, da er ein [http://de.wikipedia.org/wiki/Human_Interface_Device HID]-Gerät implementiert. &amp;lt;tt&amp;gt;libusb-win32&amp;lt;/tt&amp;gt; wird nicht benötigt. Normale (= reduzierte) Benutzerrechte genügen zum Betrieb des Gerätes.&lt;br /&gt;
&lt;br /&gt;
==== libusb0.dll wird bei WinAvr 20070525 nicht gefunden====&lt;br /&gt;
[http://www.mikrocontroller.net/topic/83524#701461 Forenbeitrag von Paul]: Habe leider noch etwas zu bemängeln, und zwar meckerte avrdude, dass es die &amp;quot;libusb0.dll&amp;quot; nicht fand. Musste dann erst noch manuell den Pfad c:\winavr\utils\libusb\bin in die autoxecec.bat eintragen. Siehe auch [http://www.avrfreaks.net/index.php?name=PNphpBB2&amp;amp;file=viewtopic&amp;amp;p=373283 Diskussion bei www.avrfreaks.net]&lt;br /&gt;
&lt;br /&gt;
====Aufruf unter Linux als user (non-root)====&lt;br /&gt;
&lt;br /&gt;
Unter Linux kann häufig avrdude nur als user &#039;root&#039; auf den USB-Programmer zugreifen. Als normaler User bekommt man eine Fehlermeldung wie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#avrdude -c usbtiny -p m8&lt;br /&gt;
 &lt;br /&gt;
avrdude: error: usbtiny_transmit: &lt;br /&gt;
error sending control message: &lt;br /&gt;
Operation not permitted&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies liegt daran, dass die device-nodes, die beim Einstecken des USB-Programmers von udev angelegt werden, root zugeordnet sind. Man kann dies ändern, indem man udev-Regeln für die verwendeten Programmer anlegt. Unter Debian muß man dazu nur eine neue Datei, z.&amp;amp;nbsp;B. 015_usbprog.rules unter /etc/udev/rules.d anlegen, z.&amp;amp;nbsp;B. mit folgenden Inhalt:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Atmel AVR ISP mkII&lt;br /&gt;
SUBSYSTEM==&amp;quot;usb&amp;quot;, ATTRS{idVendor}==&amp;quot;03eb&amp;quot;, ATTRS{idProduct}==&amp;quot;2104&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# usbprog bootloader&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;1781&amp;quot;, ATTRS{idProduct}==&amp;quot;0c62&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
# USBasp programmer&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;16c0&amp;quot;, ATTRS{idProduct}==&amp;quot;05dc&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
# USBtiny programmer&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;1781&amp;quot;, ATTRS{idProduct}==&amp;quot;0c9f&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
habe den alten Inhalt nur auskommentiert, weil ich das ganze nur mit dem mkII testen konnte. ...Nur falls sich jemand beschweren sollte.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Atmel AVR ISP mkII&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;03eb&amp;quot;, ATTRS{idProduct}==&amp;quot;2104&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot; &lt;br /&gt;
 &lt;br /&gt;
# usbprog bootloader&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;1781&amp;quot;, ATTRS{idProduct}==&amp;quot;0c62&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
# USBasp programmer&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;16c0&amp;quot;, ATTRS{idProduct}==&amp;quot;05dc&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
# USBtiny programmer&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;1781&amp;quot;, ATTRS{idProduct}==&amp;quot;0c9f&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach muss in der Regel der udev-Dienst neu gestartet werden, was -- je nach System -- mit einem der beiden folgenden Befehle funktionieren sollte (natürlich nur als root):&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 /etc/init.d/udev restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 service udev restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo /sbin/udevadm control --reload-rules&amp;lt;/pre&amp;gt; bei aktueller udev-version, oder&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo /sbin/udevcontrol --reload_rules&amp;lt;/pre&amp;gt;, bei älteren udev-versionen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Danach sollte der USB-Programmer erneut angeschlossen werden. Falls es immer noch nicht funktioniert kann es helfen, als GROUP &amp;quot;plugdev&amp;quot; statt &amp;quot;users&amp;quot; zu verwenden.&lt;br /&gt;
&lt;br /&gt;
Hiermit werden der AVR ISP mkII, der usbprog Bootloader, USBasp und USBtiny bekannt gemacht, so daß alle User in der Gruppe &amp;quot;users&amp;quot; darauf zugreifen können.&lt;br /&gt;
&lt;br /&gt;
Für weitere USB-Programmer muß man die entsprechende Zeile (mit ATTRS...) anlegen und die passenden Vendor und Product IDs eintragen.&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* [http://www.reactivated.net/writing_udev_rules.html Writing udev rules]&lt;br /&gt;
&lt;br /&gt;
====Linux-Treiberprobleme====&lt;br /&gt;
&lt;br /&gt;
Wenn der Programmer (usbprog mit AVRisp mkII) unter Ubuntu trotz korrekter Konfiguration nicht gefunden wird, kann es daran liegen, dass das Paket &amp;quot;libmtp-runtime&amp;quot; installiert ist. siehe [https://www.mikrocontroller.net/topic/245816 hier]&lt;br /&gt;
&lt;br /&gt;
=== Anzeige unterstützter AVRs ===&lt;br /&gt;
Wie die anderen Atmels bei avrdude heißen zeigt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -?&lt;br /&gt;
avrdude -p ?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== neuere AVRs hinzufügen ===&lt;br /&gt;
Manch neueres Silizium wird nicht erkannt da sich z.T. die IDs geändert haben. Um diese erfolgreich zu Programmieren empfiehlt sich ein eigenes config-File zu verwenden. Darin werden die &#039;fehlenden&#039; CPUs ergänzt:&lt;br /&gt;
&lt;br /&gt;
z.B. ATmega168P (Programmierung wie ATmega168): einfach den ATmega168 Teil duplizieren und die entsprechenden Änderungen (id, desc, signature) vornehmen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
# ATmega168P&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
part&lt;br /&gt;
    id              = &amp;quot;m168p&amp;quot;;&lt;br /&gt;
    desc            = &amp;quot;ATMEGA168P&amp;quot;;&lt;br /&gt;
     has_debugwire = yes;&lt;br /&gt;
     flash_instr   = 0xB6, 0x01, 0x11;&lt;br /&gt;
     eeprom_instr  = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00,&lt;br /&gt;
	             0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF,&lt;br /&gt;
	             0x99, 0xF9, 0xBB, 0xAF;&lt;br /&gt;
    stk500_devcode  = 0x86;&lt;br /&gt;
    # avr910_devcode = 0x;&lt;br /&gt;
    signature       = 0x1e 0x94 0x0b;&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
danach kann, unter Angabe des neuen config-Files, auch ein ATmega168P programmiert werden, z.B.:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -pm168p -C ~/.avrdude.config.neu -cstk500v2 -v  -U flash:w:main.hex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Anschluss an COM10 und höher (Windows) ===&lt;br /&gt;
&lt;br /&gt;
Wenn AVRDUDE unter Windows an COM10 und höher betrieben werden soll, ist eine andere Schreibweise für die Schnittstelle in der Kommandozeile nötig. Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -c stk500v2 -p m16 -P \\.\com13 -uF -vvvv 2&amp;gt; logfile.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird statt der gewohnten Schreibweise &#039;&#039;&#039;com13&#039;&#039;&#039; die spezielle Schreibweise  &#039;&#039;&#039;\\.\com13&#039;&#039;&#039; verwendet und es wird mit &#039;&#039;-vvvv 2&amp;gt; logfile.txt&#039;&#039; eine ausführliche Debugausgabe für Fragen im Forum erzeugt. Näheres hierzu in der  [http://www.mikrocontroller.net/topic/90401 Forumsdiskussion].&lt;br /&gt;
&lt;br /&gt;
=== AVRISPmkII + AVRDUDE + Window Vista (32) ===&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/topic/126594#1157327&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;avrdude was compiled without usb support&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Offenbar enthielt WinAVR-20100110 zunächst fälschlicherweise eine AVRDUDE Version ohne USB Support [http://www.mikrocontroller.net/topic/163022#1554907].&lt;br /&gt;
&lt;br /&gt;
Abhilfe:&lt;br /&gt;
 &lt;br /&gt;
1. WinAVR deinstallieren, gleiches Release (WinAVR-20100110) nocheinmal herunterladen und installieren (mindestens seit Anfang März 2010 enthält dieses Release avrdude in der Version 5.10 und bringt USB-Support mit).&lt;br /&gt;
&lt;br /&gt;
2. AVRDUDE selbst compilieren: http://www.mikrocontroller.net/topic/163675&lt;br /&gt;
&lt;br /&gt;
3. Compilierte Version 5.10 downloaden: http://www.mikrocontroller.net/topic/163675#1594689&lt;br /&gt;
&lt;br /&gt;
=== Textausgabe in Datei umleiten? ===&lt;br /&gt;
&lt;br /&gt;
Die Windows-&amp;quot;Shell&amp;quot; &#039;&#039;cmd&#039;&#039; benutzt für die Ausgabeumleitung die gleiche Syntax wie die Bourne-Shell (und damit auch&lt;br /&gt;
Bash): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
programm &amp;gt;datei 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zur Umleitung von STDOUT und STDERR in die gleiche Datei (Yalu in [http://www.mikrocontroller.net/topic/124509#1135568]).&lt;br /&gt;
&lt;br /&gt;
Beispiel für Windows ([http://www.mikrocontroller.net/topic/124509#1136322], [http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/redirection.mspx?mfr=true M$]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -c avrispmkII -p m8 -P usb:xx -v &amp;gt; &amp;quot;C:\output.txt&amp;quot; 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder nur STDERR in Datei umleiten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -c avrispmkII -p m8 -P usb:xx -v 2&amp;gt; &amp;quot;C:\output.txt&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [http://www.franzis.de/elektronik/lernpakete-elektronik/lernpaket-mikrocontroller Franzis] bzw. [http://www.elo-web.de/elo/mikrocontroller-und-programmierung/avr-grundlagen/experimente-mit-dem-attiny13 ELO] Lernpaket Mikrocontroller (Attiny13) ===&lt;br /&gt;
&lt;br /&gt;
Markus hat in [http://www.mikrocontroller.net/topic/169549#1649459] einen Weg beschrieben, wie man den einfachen Programmieradapter des Lernpakets mit AVRDUDE ansteuern kann.&lt;br /&gt;
&lt;br /&gt;
Eine weitere Anleitung [http://www.elektronik-labor.de/AVR/AVRdude.html LP Mikrocontroller und Attiny45 mit Avrdude] gibt es von Ralf Beesner auf der Webseite des Entwicklers Burkhard Kainka. In &#039;&#039;avrdude.conf&#039;&#039; wird dabei ein neuer Programmieradapter namens &#039;&#039;burkhard&#039;&#039; hinzugefügt. Ein zweiter Eintrag &#039;&#039;burkhard2&#039;&#039; in dieser &#039;&#039;&#039;avrdude.conf&#039;&#039;&#039; ist für die Programmierung des Atmega8 auf dem Franzis Retro-Pong Bausatz mit Hilfe des &amp;quot;Mega8-ISP-Programmer&amp;quot; (Layout siehe ELO-Webseite) vorgesehen.&lt;br /&gt;
&lt;br /&gt;
=== AVRDUDE mit Arduino Bootloader benutzen ===&lt;br /&gt;
&lt;br /&gt;
Mit der Option &#039;&#039;-c stk500v1&#039;&#039; kann AVRDUDE den [[Bootloader]] in Arduino Boards ansprechen [http://www.mikrocontroller.net/topic/195963#1919654].&lt;br /&gt;
&lt;br /&gt;
Es existieren auch modifizierte Versionen von AVRDUDE, die einen Programmer namens &#039;&#039;arduino&#039;&#039; kennen (avrdude.conf untersuchen!). Damit lautet die Kommandozeile für ein Arduinoboard mit Atmega168 beispielsweise [http://www.neuraladvance.com/2010/04/08/using-avrdude-with-the-arduino-duemilanove/]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -c arduino -p m168 -P usb -U flash:w:&amp;lt;filename&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Evtl. muss auch noch die Datenrate mit der Option -b angepasst werden, je nach Board werden verschiedene (19200, 57600, 115200) verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Bootloader-Hacks von [http://www.ladyada.net/library/arduino/bootloader.html Ladyada] arbeiten nochmal etwas anders.&lt;br /&gt;
&lt;br /&gt;
Gelegentlich gibt es unter Windows Probleme mit der allgemeinen AVRDUDE Version und deren Handling der DTR/RTS Leitung ([[RS232]]). Es kann helfen, unmittelbar von dem Absenden der Kommandozeile einen RESET auf dem Arduinoboard durchzuführen.&lt;br /&gt;
Ein kurzes Setzen der DTR Leitung auf HIGH bewirkt ein RESET. So ist es möglich eine .bat Datei zu erstellen mit folgendem Code: (com6 ist ein Virtueller USB Comport) &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mode com6 dtr=on&lt;br /&gt;
avrdude -c arduino -p m168 -P \\.\com6 -U flash:w:&amp;lt;filename&amp;gt;&lt;br /&gt;
if %ERRORLEVEL%==0 goto fertig&lt;br /&gt;
Pause&lt;br /&gt;
:fertig&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man den mode-Befehl nicht verwenden kann, etwa weil man cygwin und ein makefile verwendet, so kann man stattdessen &amp;lt;pre&amp;gt;cmd /c mode com6 dtr=on&amp;lt;/pre&amp;gt; verwenden. In cygwin empfiehlt sich &amp;lt;pre&amp;gt;cmd /c mode com6 dtr=on &amp;gt; /dev/null&amp;lt;/pre&amp;gt;, damit wird die unnütze Ausgabe des Befehls verborgen.&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* http://www.mikrocontroller.net/topic/232367&lt;br /&gt;
* http://www.mikrocontroller.net/topic/238243&lt;br /&gt;
&lt;br /&gt;
=== mysmartUSB V2.11 und ATtiny 13 ===&lt;br /&gt;
&lt;br /&gt;
mysmartUSB V2.11 verlangt -cavr910 als Programmer. Leider ist in avrdude&lt;br /&gt;
5.10 immer noch nicht der ATtiny13 damit zu programmieren. Also in die&lt;br /&gt;
avrdude.conf folgendes mit unter ATtiny13 aufnehmen, so kann er dann&lt;br /&gt;
korrekt programmiert werden(inkl. Fuse Bits).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
# ATtiny13&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
part&lt;br /&gt;
    id                  = &amp;quot;t13&amp;quot;;&lt;br /&gt;
    desc                = &amp;quot;ATtiny13&amp;quot;;&lt;br /&gt;
     has_debugwire = yes;&lt;br /&gt;
     flash_instr   = 0xB4, 0x0E, 0x1E;&lt;br /&gt;
     eeprom_instr  = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D,&lt;br /&gt;
               0xBC, 0x0E, 0xB4, 0x0E, 0xBA, 0x0D, 0xBB, 0xBC,&lt;br /&gt;
               0x99, 0xE1, 0xBB, 0xAC;&lt;br /&gt;
    stk500_devcode      = 0x14;&lt;br /&gt;
    avr910_devcode      = 0x55;&lt;br /&gt;
......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung! Programmieren geht auch mit -cavr911. Allerdings geht das Fuse&lt;br /&gt;
setzen nicht und man bekommt eine Fehlermeldung.(Programm läuft aber)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Reading | ################################################## | 100%&lt;br /&gt;
0.12s&lt;br /&gt;
&lt;br /&gt;
avrdude: verifying ...&lt;br /&gt;
avrdude: 226 bytes of flash verified&lt;br /&gt;
avrdude: reading input file &amp;quot;0x7a&amp;quot;&lt;br /&gt;
avrdude: writing lfuse (1 bytes):&lt;br /&gt;
&lt;br /&gt;
Writing |  ***failed;&lt;br /&gt;
################################################## | 100% 0.00s&lt;br /&gt;
&lt;br /&gt;
avrdude: 1 bytes of lfuse written&lt;br /&gt;
avrdude: verifying lfuse memory against 0x7a:&lt;br /&gt;
avrdude: load data lfuse data from input file 0x7a:&lt;br /&gt;
avrdude: input file 0x7a contains 1 bytes&lt;br /&gt;
avrdude: reading on-chip lfuse data:&lt;br /&gt;
&lt;br /&gt;
Reading | ################################################## | 100%&lt;br /&gt;
0.00s&lt;br /&gt;
&lt;br /&gt;
avrdude: verifying ...&lt;br /&gt;
avrdude: 1 bytes of lfuse verified&lt;br /&gt;
avrdude: reading input file &amp;quot;0xff&amp;quot;&lt;br /&gt;
avrdude: writing hfuse (1 bytes):&lt;br /&gt;
&lt;br /&gt;
Writing |  ***failed;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Anpassungen von avrdude.conf an neuere AVRs ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ATtiny167&#039;&#039;&#039; siehe [http://www.mikrocontroller.net/topic/236355 Forumbeitrag von Volker U.]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* Offizielle AVRDUDE Homepage unter http://www.nongnu.org/avrdude/&lt;br /&gt;
* User Manual (engl.) unter http://www.nongnu.org/avrdude/user-manual/avrdude.html#Top&lt;br /&gt;
* Kompilierte Windows Version mit USB Support http://yuki-lab.jp/hw/avrdude-GUI/avrdude-5.5-win32-bin.zip&lt;br /&gt;
* Kompilierte Windows Version avrdude 5.10 mit USB Support http://www.mikrocontroller.net/topic/163675#1594689&lt;br /&gt;
* Kompilierte Windows Version avrdude 5.11.1 mit USB Support http://www.mikrocontroller.net/topic/163675#2383773&lt;br /&gt;
* Kompilierte Windows Version avrdude 6.0 rc2 http://www.mikrocontroller.net/topic/296379#3166155&lt;br /&gt;
* Wer Interesse an der modifizierten Version von AVRDUDE und des AVR910-Programmer hat, kann sich bei http://www.fischl.de/thomas/elektronik/avr910e/ informieren. Der Programmer bleibt auch mit der Modifikation weiterhin kompatibel zu anderer Programmiersoftware.&lt;br /&gt;
* [[LunaAVR]] GUI für AVRDUDE in der IDE enthalten http://avr.myluna.de mit FUSE-Editor (für Windows und Linux)&lt;br /&gt;
* [[Burn-o-mat|AVR Burn-O-Mat]] GUI (Graphic User Interface) für AVRDUDE http://burn-o-mat.net mit FUSE-Editor (Java, für Windows und Linux)&lt;br /&gt;
* [http://www.soft-land.de/ AVRBurner] Ponyprog-ähnliche Oberfläche für AVRDUDE.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* [http://www.microstar.ir/download/SinaProg.zip SinaProg] SinaProg - avrdude GUI mit AVR Fuse Calculator. &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; LINK IST TOT&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
[[Kategorie:AVR-Programmer und -Bootloader]]&lt;br /&gt;
[[Kategorie:Entwicklungstools]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVRDUDE&amp;diff=78367</id>
		<title>AVRDUDE</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVRDUDE&amp;diff=78367"/>
		<updated>2013-09-02T11:25:18Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* 64-Bit-Problem */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beschreibung ==&lt;br /&gt;
AVRDUDE (http://www.nongnu.org/avrdude/) ist eine Programmiersoftware für Atmel [[AVR]] Controller. &lt;br /&gt;
&lt;br /&gt;
Funktionen unter Anderem: &lt;br /&gt;
&lt;br /&gt;
* Übertragen von Programmcode in den Flash-Speicher&lt;br /&gt;
* Auslesen ungeschützen Codes aus dem Flash&lt;br /&gt;
* Setzen und Lesen von Fuse- und Lockbits (Siehe auch: [[AVR_Fuses#Vergleich_der_Fuses_bei_verschiedenen_Programmen|Vergleich der Fuses bei verschiedenen Programmen]])&lt;br /&gt;
* Schreiben und Lesen des EEPROMs&lt;br /&gt;
&lt;br /&gt;
AVRDUDE kann das [[STK500]] (auch mit Firmware 2.x als stk500v2), das Atmel AVRISP (auch mit Firmware 2.x als avrispv2 o.ä.), das Atmel AVRISP MKII (USB Ansteuerung mittels lib-usb bzw. lib-usb-W32), [[AVR_In_System_Programmer#USB | AVR910-kompatible]] Programmierer, den [[AVR Butterfly]]/AVR109-kompatible Bootloader, [[STK200]]-Programmierdongles und verschiedene andere Parallelport-Adapter sowie &amp;quot;serielle Statusportprogrammierer&amp;quot; (Siprog) ansteuern. Auch das Atmel JTAGICE (oder Nachbauten wie Bootice oder Evertool), Atmel JTAGICE-MKII und der AVR Dragon können als Programmierhardware genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Das Programm ist unter MS-Windows (Cygwin nicht erforderlich), Linux, BSD, Solaris und Mac OS X lauffähig. Die Version für MS-Windows ist im [[WinAVR]]-Paket enthalten. Der Quellcode ist frei verfügbar (Lizenz beachten).&lt;br /&gt;
&lt;br /&gt;
Da alle AVRDUDE-Funktionen über Kommandozeilenparamter gesteuert werden können, eignet es sich gut zur Integration in Makefiles. Beispiele finden sich in der Makefile-Vorlage von [[WinAVR]] und Mfile. &lt;br /&gt;
&lt;br /&gt;
Die gesamte Konfiguration liegt in einer Textdatei (avrdude.conf), so dass sich bei Bedarf ein beliebiger neuer Parallelport-Programmierdongle oder auch ein noch nicht unterstützter AVR-Controller ergänzen lassen. Die Syntax für die Definition eines AVR-Controllers lehnt sich an die Datenblatt-Tabelle für die serielle Programmierung an, so dass man praktisch nur das Datenblatt &amp;quot;intelligent&amp;quot; abtippen muss.&lt;br /&gt;
&lt;br /&gt;
Für die Ansteuerung von Parallelport-Adaptern unter MS-Windows NT/2000/XP wird ein spezieller Porttreiber (giveio) mitgeliefert. Bei der Installation von [[WinAVR]] wird giveio bereits mitinstalliert. &lt;br /&gt;
&lt;br /&gt;
Programmer mit üblicher serieller Schnittstelle (RS232) benötigen keine zusätzliche Software oder Treiber zum Betrieb mit AVRDUDE. &lt;br /&gt;
&lt;br /&gt;
Für Hardware mit USB-Anschluss muss die lib-usb bzw. lib-usb-win32 installiert sein.&lt;br /&gt;
&lt;br /&gt;
===GUIs===&lt;br /&gt;
Bei [[WinAVR]] wird die grafische Oberfläche avrdude-gui.exe mitgeliefert.&lt;br /&gt;
&lt;br /&gt;
In der IDE von [[LunaAVR]] ist ebenfalls eine GUI für AVRDUDE enthalten (Windows und Linux).&lt;br /&gt;
&lt;br /&gt;
Für Windows, Linux und andere Betriebssysteme gibt es zwei weitere GUIs: den in Java geschriebene [[Burn-o-mat|AVR Burn-O-Mat]] und den [http://www.soft-land.de/ AVRBurner].&lt;br /&gt;
&lt;br /&gt;
Für Mac OS X gibt es noch [http://www.vonnieda.org/software/avrfuses AVRFuses.app]. AVRFuses muss beim ersten Starten auf den verwendeten Programmer und den Speicherort von AVRDUDE eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
GUIs vereinfachen vor allem Programmieren der Fuses.&lt;br /&gt;
&lt;br /&gt;
== Kurzanleitung für Linux und STK200 ==&lt;br /&gt;
&lt;br /&gt;
Dazu muss erst ein Hardware-Link auf die Printerport-Treiber eingerichtet werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
su&lt;br /&gt;
mknod /dev/parport0 c 99 0&lt;br /&gt;
chmod a+rw /dev/parport0&lt;br /&gt;
avrdude -p m8535 -c stk200 -e -U qqtraff.hex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis :&lt;br /&gt;
Bei USB Programmern ist zu beachten, dass diese durch das Betriebssystem auf einen anderen Port gelegt werden können, als im Beispiel angegeben.&lt;br /&gt;
Diesen Port kann man unter Anderem &amp;quot;im Terminal&amp;quot; mit dem Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
user@server: dmesg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ermitteln.&lt;br /&gt;
Alternativ kann man sich eine Auflistung der Ports, im Verzeichnis &amp;quot;/dev&amp;quot; anzeigen lassen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
user@server: ls /dev/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Sollte man nicht sicher sein, auf welchem Port der Programmer liegt, kann man den Programmer nochmals ausstecken und &amp;quot;ls /dev/&amp;quot; ausführen. Der nun Fehlende Port, ist der Programmerport.&lt;br /&gt;
Diesen Port muss man statt &amp;quot;parport0&amp;quot; in die oben beschriebenen Terminalkommandos einsetzen.&lt;br /&gt;
&lt;br /&gt;
Siehe auch : &lt;br /&gt;
* [http://wiki.ctbot.de/index.php/AVR_ISP_Programmer#BlueMP3_bzw._STK200_kompatible_Flasher weitere Beispiele für avrdude Kommandos (http://wiki.ctbot.de/index.php)]&lt;br /&gt;
* [[AVR_In_System_Programmer#STK200-kompatibel]]&lt;br /&gt;
* http://www.mikrocontroller.net/topic/200390#new&lt;br /&gt;
&lt;br /&gt;
== Tipps + Tricks ==&lt;br /&gt;
&lt;br /&gt;
=== [[AVR_In_System_Programmer#Parallelport|Parallelport-Programmer]] an aktuellen PCs ===&lt;br /&gt;
&lt;br /&gt;
Sofern man ein echtes Parallelport hat, die preiswerteste und auch schnellste Art der Datenübertragung zum Zielsystem (Mikrocontroller). Alles andere wie bspw. eine PCI-, PCIexpress- oder ExpressCard-Karte ist schon komplizierter und teurer.&lt;br /&gt;
&lt;br /&gt;
==== Steckkarten ====&lt;br /&gt;
&lt;br /&gt;
Diese liegen auf anderen Basisadressen. Kann man im Geräte-Manager einsehen. Diese ist &amp;lt;tt&amp;gt;avrdude&amp;lt;/tt&amp;gt; per Kommandozeile &#039;&#039;(irgendwie)&#039;&#039; mitzuteilen. Sonst kann es nicht funktionieren.&lt;br /&gt;
&lt;br /&gt;
Die Geschwindigkeit ist gleich eingebauter echter Parallelports, also sehr schnell.&lt;br /&gt;
&lt;br /&gt;
==== USB-Parallel-Adapter ====&lt;br /&gt;
&lt;br /&gt;
Gewöhnliche USB-Paralleldrucker-Adapter (um 5 € zu haben) &#039;&#039;&#039;funktionieren nicht&#039;&#039;&#039;. (Das Problem wäre zu lösen, wenn &amp;lt;tt&amp;gt;avrdude&amp;lt;/tt&amp;gt; auf InpOut32.dll setzt. Siehe [[#64-Bit-Problem|64-Bit-Problem unten]].)&lt;br /&gt;
&lt;br /&gt;
[http://www.tu-chemnitz.de/~heha/usb2lpt Spezielle USB-Parallel-Adapter], die Portadressen emulieren, funktionieren, allerdings gähnend langsam.&lt;br /&gt;
&lt;br /&gt;
==== Geschwindigkeit begrenzen ====&lt;br /&gt;
&lt;br /&gt;
Aktuelle PCs sind einfach zu schnell mit dem Bitgewackel an der parallelen Schnittstelle, vor allem für AVRs, die noch mit den 1 MHz im Auslieferungszustand laufen (maximal zulässiger ISP-Takt &amp;lt; 250 kHz). Neuere Versionen von avrdude unterstützen zu diesem Zweck eine Option &#039;&#039;&#039;-i &amp;lt;N&amp;gt;&#039;&#039;&#039;, wobei &amp;lt;N&amp;gt; die Anzahl der Mikrosekunden bezeichnet, die beim Bitwackeln zusätzlich zu warten ist. Einfach mal mit -i 10 anfangen und dann entweder die Fuses auf die Ziel-Taktfrequenz umstellen (falls diese wesentlich höher sein wird als die 1 MHz), oder sukkzessive mit kleineren Werten testen ([http://www.mikrocontroller.net/topic/83524#699933 Forenbeitrag von Jörg]).&lt;br /&gt;
&lt;br /&gt;
Die Option -i ist auch nützlich bei AVRs, die für einen langsamen Takt konfiguriert sind. Bei einem ATmega8, der mit einem 32.768 kHz Quarz läuft, kann es z.B. notwendig sein, die Option -i 90 zu verwenden. Den Zahlenwert ggf. ausprobieren.&lt;br /&gt;
&lt;br /&gt;
Manche Programmer werten die Option -i manchmal nicht aus, dann sollte man einen anderen Programmer versuchen.&lt;br /&gt;
&lt;br /&gt;
Beim USBTINY und USBASP kann man die Geschwindigkeit der SPI-Schnittstelle mit dem Parameter -B [Periodendauer in Mikrosekunden] begrenzen. Da beide Geräte durch Interrupts der Software-USB-Schnittstelle stark belastet werden, handelt es sich hier um die Maximalbitrate.&lt;br /&gt;
&lt;br /&gt;
==== Spezielle Hacks ====&lt;br /&gt;
&lt;br /&gt;
Unter Windows XP Service Pack 2 auf einem IBM Thinkpad T40 ließ sich die Fehlermeldung „avrdude: AVR device not responding“ beheben durch Ändern im Gerätemanager⇒Lpt1⇒Eigenschaften⇒Anschlusseinstellungen⇒„Interrupt-nie-verwenden“ in „Jeden dem Anschluss zugewiesenem Interrupt verwenden“.&lt;br /&gt;
&lt;br /&gt;
==== 64-Bit-Problem ====&lt;br /&gt;
&lt;br /&gt;
Unter 64-Bit-Windows-Versionen kann das Parallelport nicht benutzt werden, da der GiveIO-Treiber systembedingt nicht funktioniert. Genauer, es wird ohne [http://www.codeproject.com/Articles/28318/Bypassing-PatchGuard-3 böse Hacks] nicht möglich sein, eine 64-Bit-Version von GiveIO zu erstellen, da es hier eine [http://msdn.microsoft.com/en-us/library/windows/hardware/gg487350.aspx Kernel-Mode-Codeänderungs-Überwachung] gibt, die Änderungen an Systemtabellen (hier: Die IOPM, die In/Out Permission Map, falls es diese überhaupt gibt, und wenn ja, dann nur als Emulation für das 32-Bit-Subsystem) vereitelt (d.h. ein paar Minuten nach der Änderung kommt ein Bluescreen). Solange AVRDUDE an GiveIO (und eincompilierten E/A-Befehlen) festhält bleibt es so, und der Ausweich für den Bastler ist [[Pony-Prog_Tutorial|PonyProg]], bis AVRDUDE künftig ebenfalls InpOut32.dll bzw. InpOutX64.dll verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0.5em;padding:0.5em;border:1px green solid;border-radius:8px;-moz-border-radius:8px;background:#EFE&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Problem gelöst!&amp;lt;/b&amp;gt;&amp;lt;p&amp;gt;&lt;br /&gt;
So geht&#039;s:&lt;br /&gt;
* Neue [http://www-user.tu-chemnitz.de/~heha/viewzip.cgi/hs_freeware/inpout32-h%23s.zip/2013/Release InpOut32.dll] herunterladen&lt;br /&gt;
* Kommandozeile: &amp;lt;b&amp;gt;crundll InpOut32,CatchIo avrdude.exe &amp;lt;/b&amp;gt;&amp;lt;i&amp;gt;... (usw.)&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Und so funktioniert&#039;s:&amp;lt;/small&amp;gt;&lt;br /&gt;
* Die winzige crundll.exe ist ein Ersatz für rundll32.exe, als Konsolen-Version. Das verhindert, dass für avrdude eine neue Konsole geöffnet wird.&lt;br /&gt;
* crundll lädt InpOut32.dll und ruft den Einsprungpunkt CatchIoW auf. Als Kommandozeile wird L&amp;quot;avrdude.exe ...&amp;quot; (also die üblichen Parameter) übergeben&lt;br /&gt;
* Die CatchIoW-Routine erstellt einen schlafenden Prozess aus dem avrdude-Image. Nicht als Debugger, um teuere Prozessumschaltungen für das Exception-Handling (s.u.) zu vermeiden&lt;br /&gt;
* Ein &amp;quot;Remote Thread&amp;quot; wird im avrdude-Prozess gestartet, um InpOut32.dll zu laden. Genannt: [http://de.wikipedia.org/wiki/DLL-Injection DLL-Injektion]&lt;br /&gt;
* Die DLL-Initialisierungsroutine packt inpout64.sys aus, installiert und lädt diesen Kernmodus-Treiber. Das erfordert Admin-Rechte. Da es keine &amp;quot;I/O permission map&amp;quot; im X64 &amp;quot;long mode&amp;quot; gibt, kann es keinen Treiber geben, der E/A-Zugriffe für den User Mode transparent macht. Deshalb bleibt nichts anderes als ein Exception-Mechanismus übrig, um das Problem zu erschlagen. Nebenbei kann InpOut32.dll auf unübliche Portadressen sowie USB-Geräte umleiten. Die dazu notwendige Geräte- und Adresserkennung läuft ebenfalls in der Initialisierungsroutine&lt;br /&gt;
* In der Initialisierung wird ein prozessweiter Exception-Filter installiert&lt;br /&gt;
* Ein zweiter &amp;quot;Remote Thread&amp;quot; ändert die Adresse von kernel32.dll:GetVersionEx(). Die Ersatzroutine liefert als Plattform Windows 9x/Me. Auch genannt API-Hooking. Der Grund für den zweiten &amp;quot;Remote Thread&amp;quot; ist, dass dieses Verhalten bei regulärer Benutzung der InpOut32.dll (also LoadLibrary oder quasistatische Einbindung) unerwünscht ist.&lt;br /&gt;
* Der avrdude-Prozess wird aufgeweckt und startet. Er &amp;quot;erkennt&amp;quot; Windows 9x/Me and versucht gar nicht erst, GiveIo.sys zu starten.&lt;br /&gt;
* Dann macht avrdude die üblichen IN+OUT-Befehle. Jeder dieser Befehle generiert eine (IMHO) Allgemeine Schutzverletzung, also Int13 (General Protection Fault #GP). Bevor die sattsam bekannte Messagebox erscheint, geht der Interrupthandler zu ntdll:KiUserExceptionDispatcher, welche schließlich den installierten prozessweiten Exception-Filter aufruft, bevor es zum Abarbeiten eventueller try/except-Blöcke kommt&lt;br /&gt;
* Der Filter (also das Stückchen Kode in der InpOut32.dll) stellt fest, dass es sich tatsächlich im einen IN- oder OUT-Befehl handelt. Der Befehl wird einfach übersprungen und inpoutx64.sys bemüht, per DeviceIoControl() die E/A-Operation im Kernel Mode auszuführen. Kontext-Register (hier AL und DX) werden entsprechend benutzt. Danach meldet der Filter dem Aufrufer &amp;quot;Ausnahme erschlagen, bitte weiter im Text&amp;quot;&lt;br /&gt;
* Nach dieser länglichen Umleitung geht es weiter mit dem nächsten Assemblerbefehl&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== USB-Programmer ===&lt;br /&gt;
Die meisten USB-Programmiergeräte benötigen [http://sourceforge.net/apps/trac/libusb-win32/wiki libusb-win32] bzw. [http://www.libusb.org/ libusb].&lt;br /&gt;
&lt;br /&gt;
Ein Selbstbau-USB-Programmieradapter ist unter&lt;br /&gt;
[http://www.rototron.info/?Page=USBAVR/USBAVR.aspx http://www.rototron.info]&lt;br /&gt;
zu finden. Er benötigt eine relativ neue AVRDUDE-Version, aber benötigt unter &#039;&#039;keinem&#039;&#039; Windows-Betriebssystem einen Treiber, da er ein [http://de.wikipedia.org/wiki/Human_Interface_Device HID]-Gerät implementiert. &amp;lt;tt&amp;gt;libusb-win32&amp;lt;/tt&amp;gt; wird nicht benötigt. Normale (= reduzierte) Benutzerrechte genügen zum Betrieb des Gerätes.&lt;br /&gt;
&lt;br /&gt;
==== libusb0.dll wird bei WinAvr 20070525 nicht gefunden====&lt;br /&gt;
[http://www.mikrocontroller.net/topic/83524#701461 Forenbeitrag von Paul]: Habe leider noch etwas zu bemängeln, und zwar meckerte avrdude, dass es die &amp;quot;libusb0.dll&amp;quot; nicht fand. Musste dann erst noch manuell den Pfad c:\winavr\utils\libusb\bin in die autoxecec.bat eintragen. Siehe auch [http://www.avrfreaks.net/index.php?name=PNphpBB2&amp;amp;file=viewtopic&amp;amp;p=373283 Diskussion bei www.avrfreaks.net]&lt;br /&gt;
&lt;br /&gt;
====Aufruf unter Linux als user (non-root)====&lt;br /&gt;
&lt;br /&gt;
Unter Linux kann häufig avrdude nur als user &#039;root&#039; auf den USB-Programmer zugreifen. Als normaler User bekommt man eine Fehlermeldung wie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#avrdude -c usbtiny -p m8&lt;br /&gt;
 &lt;br /&gt;
avrdude: error: usbtiny_transmit: &lt;br /&gt;
error sending control message: &lt;br /&gt;
Operation not permitted&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies liegt daran, dass die device-nodes, die beim Einstecken des USB-Programmers von udev angelegt werden, root zugeordnet sind. Man kann dies ändern, indem man udev-Regeln für die verwendeten Programmer anlegt. Unter Debian muß man dazu nur eine neue Datei, z.&amp;amp;nbsp;B. 015_usbprog.rules unter /etc/udev/rules.d anlegen, z.&amp;amp;nbsp;B. mit folgenden Inhalt:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Atmel AVR ISP mkII&lt;br /&gt;
SUBSYSTEM==&amp;quot;usb&amp;quot;, ATTRS{idVendor}==&amp;quot;03eb&amp;quot;, ATTRS{idProduct}==&amp;quot;2104&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# usbprog bootloader&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;1781&amp;quot;, ATTRS{idProduct}==&amp;quot;0c62&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
# USBasp programmer&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;16c0&amp;quot;, ATTRS{idProduct}==&amp;quot;05dc&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
# USBtiny programmer&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;1781&amp;quot;, ATTRS{idProduct}==&amp;quot;0c9f&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
habe den alten Inhalt nur auskommentiert, weil ich das ganze nur mit dem mkII testen konnte. ...Nur falls sich jemand beschweren sollte.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Atmel AVR ISP mkII&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;03eb&amp;quot;, ATTRS{idProduct}==&amp;quot;2104&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot; &lt;br /&gt;
 &lt;br /&gt;
# usbprog bootloader&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;1781&amp;quot;, ATTRS{idProduct}==&amp;quot;0c62&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
# USBasp programmer&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;16c0&amp;quot;, ATTRS{idProduct}==&amp;quot;05dc&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
# USBtiny programmer&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;1781&amp;quot;, ATTRS{idProduct}==&amp;quot;0c9f&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach muss in der Regel der udev-Dienst neu gestartet werden, was -- je nach System -- mit einem der beiden folgenden Befehle funktionieren sollte (natürlich nur als root):&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 /etc/init.d/udev restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 service udev restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo /sbin/udevadm control --reload-rules&amp;lt;/pre&amp;gt; bei aktueller udev-version, oder&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo /sbin/udevcontrol --reload_rules&amp;lt;/pre&amp;gt;, bei älteren udev-versionen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Danach sollte der USB-Programmer erneut angeschlossen werden. Falls es immer noch nicht funktioniert kann es helfen, als GROUP &amp;quot;plugdev&amp;quot; statt &amp;quot;users&amp;quot; zu verwenden.&lt;br /&gt;
&lt;br /&gt;
Hiermit werden der AVR ISP mkII, der usbprog Bootloader, USBasp und USBtiny bekannt gemacht, so daß alle User in der Gruppe &amp;quot;users&amp;quot; darauf zugreifen können.&lt;br /&gt;
&lt;br /&gt;
Für weitere USB-Programmer muß man die entsprechende Zeile (mit ATTRS...) anlegen und die passenden Vendor und Product IDs eintragen.&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* [http://www.reactivated.net/writing_udev_rules.html Writing udev rules]&lt;br /&gt;
&lt;br /&gt;
====Linux-Treiberprobleme====&lt;br /&gt;
&lt;br /&gt;
Wenn der Programmer (usbprog mit AVRisp mkII) unter Ubuntu trotz korrekter Konfiguration nicht gefunden wird, kann es daran liegen, dass das Paket &amp;quot;libmtp-runtime&amp;quot; installiert ist. siehe [https://www.mikrocontroller.net/topic/245816 hier]&lt;br /&gt;
&lt;br /&gt;
=== Anzeige unterstützter AVRs ===&lt;br /&gt;
Wie die anderen Atmels bei avrdude heißen zeigt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -?&lt;br /&gt;
avrdude -p ?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== neuere AVRs hinzufügen ===&lt;br /&gt;
Manch neueres Silizium wird nicht erkannt da sich z.T. die IDs geändert haben. Um diese erfolgreich zu Programmieren empfiehlt sich ein eigenes config-File zu verwenden. Darin werden die &#039;fehlenden&#039; CPUs ergänzt:&lt;br /&gt;
&lt;br /&gt;
z.B. ATmega168P (Programmierung wie ATmega168): einfach den ATmega168 Teil duplizieren und die entsprechenden Änderungen (id, desc, signature) vornehmen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
# ATmega168P&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
part&lt;br /&gt;
    id              = &amp;quot;m168p&amp;quot;;&lt;br /&gt;
    desc            = &amp;quot;ATMEGA168P&amp;quot;;&lt;br /&gt;
     has_debugwire = yes;&lt;br /&gt;
     flash_instr   = 0xB6, 0x01, 0x11;&lt;br /&gt;
     eeprom_instr  = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00,&lt;br /&gt;
	             0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF,&lt;br /&gt;
	             0x99, 0xF9, 0xBB, 0xAF;&lt;br /&gt;
    stk500_devcode  = 0x86;&lt;br /&gt;
    # avr910_devcode = 0x;&lt;br /&gt;
    signature       = 0x1e 0x94 0x0b;&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
danach kann, unter Angabe des neuen config-Files, auch ein ATmega168P programmiert werden, z.B.:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -pm168p -C ~/.avrdude.config.neu -cstk500v2 -v  -U flash:w:main.hex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Anschluss an COM10 und höher (Windows) ===&lt;br /&gt;
&lt;br /&gt;
Wenn AVRDUDE unter Windows an COM10 und höher betrieben werden soll, ist eine andere Schreibweise für die Schnittstelle in der Kommandozeile nötig. Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -c stk500v2 -p m16 -P \\.\com13 -uF -vvvv 2&amp;gt; logfile.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird statt der gewohnten Schreibweise &#039;&#039;&#039;com13&#039;&#039;&#039; die spezielle Schreibweise  &#039;&#039;&#039;\\.\com13&#039;&#039;&#039; verwendet und es wird mit &#039;&#039;-vvvv 2&amp;gt; logfile.txt&#039;&#039; eine ausführliche Debugausgabe für Fragen im Forum erzeugt. Näheres hierzu in der  [http://www.mikrocontroller.net/topic/90401 Forumsdiskussion].&lt;br /&gt;
&lt;br /&gt;
=== AVRISPmkII + AVRDUDE + Window Vista (32) ===&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/topic/126594#1157327&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;avrdude was compiled without usb support&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Offenbar enthielt WinAVR-20100110 zunächst fälschlicherweise eine AVRDUDE Version ohne USB Support [http://www.mikrocontroller.net/topic/163022#1554907].&lt;br /&gt;
&lt;br /&gt;
Abhilfe:&lt;br /&gt;
 &lt;br /&gt;
1. WinAVR deinstallieren, gleiches Release (WinAVR-20100110) nocheinmal herunterladen und installieren (mindestens seit Anfang März 2010 enthält dieses Release avrdude in der Version 5.10 und bringt USB-Support mit).&lt;br /&gt;
&lt;br /&gt;
2. AVRDUDE selbst compilieren: http://www.mikrocontroller.net/topic/163675&lt;br /&gt;
&lt;br /&gt;
3. Compilierte Version 5.10 downloaden: http://www.mikrocontroller.net/topic/163675#1594689&lt;br /&gt;
&lt;br /&gt;
=== Textausgabe in Datei umleiten? ===&lt;br /&gt;
&lt;br /&gt;
Die Windows-&amp;quot;Shell&amp;quot; &#039;&#039;cmd&#039;&#039; benutzt für die Ausgabeumleitung die gleiche Syntax wie die Bourne-Shell (und damit auch&lt;br /&gt;
Bash): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
programm &amp;gt;datei 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zur Umleitung von STDOUT und STDERR in die gleiche Datei (Yalu in [http://www.mikrocontroller.net/topic/124509#1135568]).&lt;br /&gt;
&lt;br /&gt;
Beispiel für Windows ([http://www.mikrocontroller.net/topic/124509#1136322], [http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/redirection.mspx?mfr=true M$]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -c avrispmkII -p m8 -P usb:xx -v &amp;gt; &amp;quot;C:\output.txt&amp;quot; 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder nur STDERR in Datei umleiten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -c avrispmkII -p m8 -P usb:xx -v 2&amp;gt; &amp;quot;C:\output.txt&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [http://www.franzis.de/elektronik/lernpakete-elektronik/lernpaket-mikrocontroller Franzis] bzw. [http://www.elo-web.de/elo/mikrocontroller-und-programmierung/avr-grundlagen/experimente-mit-dem-attiny13 ELO] Lernpaket Mikrocontroller (Attiny13) ===&lt;br /&gt;
&lt;br /&gt;
Markus hat in [http://www.mikrocontroller.net/topic/169549#1649459] einen Weg beschrieben, wie man den einfachen Programmieradapter des Lernpakets mit AVRDUDE ansteuern kann.&lt;br /&gt;
&lt;br /&gt;
Eine weitere Anleitung [http://www.elektronik-labor.de/AVR/AVRdude.html LP Mikrocontroller und Attiny45 mit Avrdude] gibt es von Ralf Beesner auf der Webseite des Entwicklers Burkhard Kainka. In &#039;&#039;avrdude.conf&#039;&#039; wird dabei ein neuer Programmieradapter namens &#039;&#039;burkhard&#039;&#039; hinzugefügt. Ein zweiter Eintrag &#039;&#039;burkhard2&#039;&#039; in dieser &#039;&#039;&#039;avrdude.conf&#039;&#039;&#039; ist für die Programmierung des Atmega8 auf dem Franzis Retro-Pong Bausatz mit Hilfe des &amp;quot;Mega8-ISP-Programmer&amp;quot; (Layout siehe ELO-Webseite) vorgesehen.&lt;br /&gt;
&lt;br /&gt;
=== AVRDUDE mit Arduino Bootloader benutzen ===&lt;br /&gt;
&lt;br /&gt;
Mit der Option &#039;&#039;-c stk500v1&#039;&#039; kann AVRDUDE den [[Bootloader]] in Arduino Boards ansprechen [http://www.mikrocontroller.net/topic/195963#1919654].&lt;br /&gt;
&lt;br /&gt;
Es existieren auch modifizierte Versionen von AVRDUDE, die einen Programmer namens &#039;&#039;arduino&#039;&#039; kennen (avrdude.conf untersuchen!). Damit lautet die Kommandozeile für ein Arduinoboard mit Atmega168 beispielsweise [http://www.neuraladvance.com/2010/04/08/using-avrdude-with-the-arduino-duemilanove/]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -c arduino -p m168 -P usb -U flash:w:&amp;lt;filename&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Evtl. muss auch noch die Datenrate mit der Option -b angepasst werden, je nach Board werden verschiedene (19200, 57600, 115200) verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Bootloader-Hacks von [http://www.ladyada.net/library/arduino/bootloader.html Ladyada] arbeiten nochmal etwas anders.&lt;br /&gt;
&lt;br /&gt;
Gelegentlich gibt es unter Windows Probleme mit der allgemeinen AVRDUDE Version und deren Handling der DTR/RTS Leitung ([[RS232]]). Es kann helfen, unmittelbar von dem Absenden der Kommandozeile einen RESET auf dem Arduinoboard durchzuführen.&lt;br /&gt;
Ein kurzes Setzen der DTR Leitung auf HIGH bewirkt ein RESET. So ist es möglich eine .bat Datei zu erstellen mit folgendem Code: (com6 ist ein Virtueller USB Comport) &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mode com6 dtr=on&lt;br /&gt;
avrdude -c arduino -p m168 -P \\.\com6 -U flash:w:&amp;lt;filename&amp;gt;&lt;br /&gt;
if %ERRORLEVEL%==0 goto fertig&lt;br /&gt;
Pause&lt;br /&gt;
:fertig&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man den mode-Befehl nicht verwenden kann, etwa weil man cygwin und ein makefile verwendet, so kann man stattdessen &amp;lt;pre&amp;gt;cmd /c mode com6 dtr=on&amp;lt;/pre&amp;gt; verwenden. In cygwin empfiehlt sich &amp;lt;pre&amp;gt;cmd /c mode com6 dtr=on &amp;gt; /dev/null&amp;lt;/pre&amp;gt;, damit wird die unnütze Ausgabe des Befehls verborgen.&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* http://www.mikrocontroller.net/topic/232367&lt;br /&gt;
* http://www.mikrocontroller.net/topic/238243&lt;br /&gt;
&lt;br /&gt;
=== mysmartUSB V2.11 und ATtiny 13 ===&lt;br /&gt;
&lt;br /&gt;
mysmartUSB V2.11 verlangt -cavr910 als Programmer. Leider ist in avrdude&lt;br /&gt;
5.10 immer noch nicht der ATtiny13 damit zu programmieren. Also in die&lt;br /&gt;
avrdude.conf folgendes mit unter ATtiny13 aufnehmen, so kann er dann&lt;br /&gt;
korrekt programmiert werden(inkl. Fuse Bits).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
# ATtiny13&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
part&lt;br /&gt;
    id                  = &amp;quot;t13&amp;quot;;&lt;br /&gt;
    desc                = &amp;quot;ATtiny13&amp;quot;;&lt;br /&gt;
     has_debugwire = yes;&lt;br /&gt;
     flash_instr   = 0xB4, 0x0E, 0x1E;&lt;br /&gt;
     eeprom_instr  = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D,&lt;br /&gt;
               0xBC, 0x0E, 0xB4, 0x0E, 0xBA, 0x0D, 0xBB, 0xBC,&lt;br /&gt;
               0x99, 0xE1, 0xBB, 0xAC;&lt;br /&gt;
    stk500_devcode      = 0x14;&lt;br /&gt;
    avr910_devcode      = 0x55;&lt;br /&gt;
......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung! Programmieren geht auch mit -cavr911. Allerdings geht das Fuse&lt;br /&gt;
setzen nicht und man bekommt eine Fehlermeldung.(Programm läuft aber)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Reading | ################################################## | 100%&lt;br /&gt;
0.12s&lt;br /&gt;
&lt;br /&gt;
avrdude: verifying ...&lt;br /&gt;
avrdude: 226 bytes of flash verified&lt;br /&gt;
avrdude: reading input file &amp;quot;0x7a&amp;quot;&lt;br /&gt;
avrdude: writing lfuse (1 bytes):&lt;br /&gt;
&lt;br /&gt;
Writing |  ***failed;&lt;br /&gt;
################################################## | 100% 0.00s&lt;br /&gt;
&lt;br /&gt;
avrdude: 1 bytes of lfuse written&lt;br /&gt;
avrdude: verifying lfuse memory against 0x7a:&lt;br /&gt;
avrdude: load data lfuse data from input file 0x7a:&lt;br /&gt;
avrdude: input file 0x7a contains 1 bytes&lt;br /&gt;
avrdude: reading on-chip lfuse data:&lt;br /&gt;
&lt;br /&gt;
Reading | ################################################## | 100%&lt;br /&gt;
0.00s&lt;br /&gt;
&lt;br /&gt;
avrdude: verifying ...&lt;br /&gt;
avrdude: 1 bytes of lfuse verified&lt;br /&gt;
avrdude: reading input file &amp;quot;0xff&amp;quot;&lt;br /&gt;
avrdude: writing hfuse (1 bytes):&lt;br /&gt;
&lt;br /&gt;
Writing |  ***failed;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Anpassungen von avrdude.conf an neuere AVRs ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ATtiny167&#039;&#039;&#039; siehe [http://www.mikrocontroller.net/topic/236355 Forumbeitrag von Volker U.]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* Offizielle AVRDUDE Homepage unter http://www.nongnu.org/avrdude/&lt;br /&gt;
* User Manual (engl.) unter http://www.nongnu.org/avrdude/user-manual/avrdude.html#Top&lt;br /&gt;
* Kompilierte Windows Version mit USB Support http://yuki-lab.jp/hw/avrdude-GUI/avrdude-5.5-win32-bin.zip&lt;br /&gt;
* Kompilierte Windows Version avrdude 5.10 mit USB Support http://www.mikrocontroller.net/topic/163675#1594689&lt;br /&gt;
* Kompilierte Windows Version avrdude 5.11.1 mit USB Support http://www.mikrocontroller.net/topic/163675#2383773&lt;br /&gt;
* Kompilierte Windows Version avrdude 6.0 rc2 http://www.mikrocontroller.net/topic/296379#3166155&lt;br /&gt;
* Wer Interesse an der modifizierten Version von AVRDUDE und des AVR910-Programmer hat, kann sich bei http://www.fischl.de/thomas/elektronik/avr910e/ informieren. Der Programmer bleibt auch mit der Modifikation weiterhin kompatibel zu anderer Programmiersoftware.&lt;br /&gt;
* [[LunaAVR]] GUI für AVRDUDE in der IDE enthalten http://avr.myluna.de mit FUSE-Editor (für Windows und Linux)&lt;br /&gt;
* [[Burn-o-mat|AVR Burn-O-Mat]] GUI (Graphic User Interface) für AVRDUDE http://burn-o-mat.net mit FUSE-Editor (Java, für Windows und Linux)&lt;br /&gt;
* [http://www.soft-land.de/ AVRBurner] Ponyprog-ähnliche Oberfläche für AVRDUDE.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* [http://www.microstar.ir/download/SinaProg.zip SinaProg] SinaProg - avrdude GUI mit AVR Fuse Calculator. &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; LINK IST TOT&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
[[Kategorie:AVR-Programmer und -Bootloader]]&lt;br /&gt;
[[Kategorie:Entwicklungstools]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVRDUDE&amp;diff=78366</id>
		<title>AVRDUDE</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVRDUDE&amp;diff=78366"/>
		<updated>2013-09-02T11:24:44Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* 64-Bit-Problem */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beschreibung ==&lt;br /&gt;
AVRDUDE (http://www.nongnu.org/avrdude/) ist eine Programmiersoftware für Atmel [[AVR]] Controller. &lt;br /&gt;
&lt;br /&gt;
Funktionen unter Anderem: &lt;br /&gt;
&lt;br /&gt;
* Übertragen von Programmcode in den Flash-Speicher&lt;br /&gt;
* Auslesen ungeschützen Codes aus dem Flash&lt;br /&gt;
* Setzen und Lesen von Fuse- und Lockbits (Siehe auch: [[AVR_Fuses#Vergleich_der_Fuses_bei_verschiedenen_Programmen|Vergleich der Fuses bei verschiedenen Programmen]])&lt;br /&gt;
* Schreiben und Lesen des EEPROMs&lt;br /&gt;
&lt;br /&gt;
AVRDUDE kann das [[STK500]] (auch mit Firmware 2.x als stk500v2), das Atmel AVRISP (auch mit Firmware 2.x als avrispv2 o.ä.), das Atmel AVRISP MKII (USB Ansteuerung mittels lib-usb bzw. lib-usb-W32), [[AVR_In_System_Programmer#USB | AVR910-kompatible]] Programmierer, den [[AVR Butterfly]]/AVR109-kompatible Bootloader, [[STK200]]-Programmierdongles und verschiedene andere Parallelport-Adapter sowie &amp;quot;serielle Statusportprogrammierer&amp;quot; (Siprog) ansteuern. Auch das Atmel JTAGICE (oder Nachbauten wie Bootice oder Evertool), Atmel JTAGICE-MKII und der AVR Dragon können als Programmierhardware genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Das Programm ist unter MS-Windows (Cygwin nicht erforderlich), Linux, BSD, Solaris und Mac OS X lauffähig. Die Version für MS-Windows ist im [[WinAVR]]-Paket enthalten. Der Quellcode ist frei verfügbar (Lizenz beachten).&lt;br /&gt;
&lt;br /&gt;
Da alle AVRDUDE-Funktionen über Kommandozeilenparamter gesteuert werden können, eignet es sich gut zur Integration in Makefiles. Beispiele finden sich in der Makefile-Vorlage von [[WinAVR]] und Mfile. &lt;br /&gt;
&lt;br /&gt;
Die gesamte Konfiguration liegt in einer Textdatei (avrdude.conf), so dass sich bei Bedarf ein beliebiger neuer Parallelport-Programmierdongle oder auch ein noch nicht unterstützter AVR-Controller ergänzen lassen. Die Syntax für die Definition eines AVR-Controllers lehnt sich an die Datenblatt-Tabelle für die serielle Programmierung an, so dass man praktisch nur das Datenblatt &amp;quot;intelligent&amp;quot; abtippen muss.&lt;br /&gt;
&lt;br /&gt;
Für die Ansteuerung von Parallelport-Adaptern unter MS-Windows NT/2000/XP wird ein spezieller Porttreiber (giveio) mitgeliefert. Bei der Installation von [[WinAVR]] wird giveio bereits mitinstalliert. &lt;br /&gt;
&lt;br /&gt;
Programmer mit üblicher serieller Schnittstelle (RS232) benötigen keine zusätzliche Software oder Treiber zum Betrieb mit AVRDUDE. &lt;br /&gt;
&lt;br /&gt;
Für Hardware mit USB-Anschluss muss die lib-usb bzw. lib-usb-win32 installiert sein.&lt;br /&gt;
&lt;br /&gt;
===GUIs===&lt;br /&gt;
Bei [[WinAVR]] wird die grafische Oberfläche avrdude-gui.exe mitgeliefert.&lt;br /&gt;
&lt;br /&gt;
In der IDE von [[LunaAVR]] ist ebenfalls eine GUI für AVRDUDE enthalten (Windows und Linux).&lt;br /&gt;
&lt;br /&gt;
Für Windows, Linux und andere Betriebssysteme gibt es zwei weitere GUIs: den in Java geschriebene [[Burn-o-mat|AVR Burn-O-Mat]] und den [http://www.soft-land.de/ AVRBurner].&lt;br /&gt;
&lt;br /&gt;
Für Mac OS X gibt es noch [http://www.vonnieda.org/software/avrfuses AVRFuses.app]. AVRFuses muss beim ersten Starten auf den verwendeten Programmer und den Speicherort von AVRDUDE eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
GUIs vereinfachen vor allem Programmieren der Fuses.&lt;br /&gt;
&lt;br /&gt;
== Kurzanleitung für Linux und STK200 ==&lt;br /&gt;
&lt;br /&gt;
Dazu muss erst ein Hardware-Link auf die Printerport-Treiber eingerichtet werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
su&lt;br /&gt;
mknod /dev/parport0 c 99 0&lt;br /&gt;
chmod a+rw /dev/parport0&lt;br /&gt;
avrdude -p m8535 -c stk200 -e -U qqtraff.hex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis :&lt;br /&gt;
Bei USB Programmern ist zu beachten, dass diese durch das Betriebssystem auf einen anderen Port gelegt werden können, als im Beispiel angegeben.&lt;br /&gt;
Diesen Port kann man unter Anderem &amp;quot;im Terminal&amp;quot; mit dem Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
user@server: dmesg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ermitteln.&lt;br /&gt;
Alternativ kann man sich eine Auflistung der Ports, im Verzeichnis &amp;quot;/dev&amp;quot; anzeigen lassen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
user@server: ls /dev/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Sollte man nicht sicher sein, auf welchem Port der Programmer liegt, kann man den Programmer nochmals ausstecken und &amp;quot;ls /dev/&amp;quot; ausführen. Der nun Fehlende Port, ist der Programmerport.&lt;br /&gt;
Diesen Port muss man statt &amp;quot;parport0&amp;quot; in die oben beschriebenen Terminalkommandos einsetzen.&lt;br /&gt;
&lt;br /&gt;
Siehe auch : &lt;br /&gt;
* [http://wiki.ctbot.de/index.php/AVR_ISP_Programmer#BlueMP3_bzw._STK200_kompatible_Flasher weitere Beispiele für avrdude Kommandos (http://wiki.ctbot.de/index.php)]&lt;br /&gt;
* [[AVR_In_System_Programmer#STK200-kompatibel]]&lt;br /&gt;
* http://www.mikrocontroller.net/topic/200390#new&lt;br /&gt;
&lt;br /&gt;
== Tipps + Tricks ==&lt;br /&gt;
&lt;br /&gt;
=== [[AVR_In_System_Programmer#Parallelport|Parallelport-Programmer]] an aktuellen PCs ===&lt;br /&gt;
&lt;br /&gt;
Sofern man ein echtes Parallelport hat, die preiswerteste und auch schnellste Art der Datenübertragung zum Zielsystem (Mikrocontroller). Alles andere wie bspw. eine PCI-, PCIexpress- oder ExpressCard-Karte ist schon komplizierter und teurer.&lt;br /&gt;
&lt;br /&gt;
==== Steckkarten ====&lt;br /&gt;
&lt;br /&gt;
Diese liegen auf anderen Basisadressen. Kann man im Geräte-Manager einsehen. Diese ist &amp;lt;tt&amp;gt;avrdude&amp;lt;/tt&amp;gt; per Kommandozeile &#039;&#039;(irgendwie)&#039;&#039; mitzuteilen. Sonst kann es nicht funktionieren.&lt;br /&gt;
&lt;br /&gt;
Die Geschwindigkeit ist gleich eingebauter echter Parallelports, also sehr schnell.&lt;br /&gt;
&lt;br /&gt;
==== USB-Parallel-Adapter ====&lt;br /&gt;
&lt;br /&gt;
Gewöhnliche USB-Paralleldrucker-Adapter (um 5 € zu haben) &#039;&#039;&#039;funktionieren nicht&#039;&#039;&#039;. (Das Problem wäre zu lösen, wenn &amp;lt;tt&amp;gt;avrdude&amp;lt;/tt&amp;gt; auf InpOut32.dll setzt. Siehe [[#64-Bit-Problem|64-Bit-Problem unten]].)&lt;br /&gt;
&lt;br /&gt;
[http://www.tu-chemnitz.de/~heha/usb2lpt Spezielle USB-Parallel-Adapter], die Portadressen emulieren, funktionieren, allerdings gähnend langsam.&lt;br /&gt;
&lt;br /&gt;
==== Geschwindigkeit begrenzen ====&lt;br /&gt;
&lt;br /&gt;
Aktuelle PCs sind einfach zu schnell mit dem Bitgewackel an der parallelen Schnittstelle, vor allem für AVRs, die noch mit den 1 MHz im Auslieferungszustand laufen (maximal zulässiger ISP-Takt &amp;lt; 250 kHz). Neuere Versionen von avrdude unterstützen zu diesem Zweck eine Option &#039;&#039;&#039;-i &amp;lt;N&amp;gt;&#039;&#039;&#039;, wobei &amp;lt;N&amp;gt; die Anzahl der Mikrosekunden bezeichnet, die beim Bitwackeln zusätzlich zu warten ist. Einfach mal mit -i 10 anfangen und dann entweder die Fuses auf die Ziel-Taktfrequenz umstellen (falls diese wesentlich höher sein wird als die 1 MHz), oder sukkzessive mit kleineren Werten testen ([http://www.mikrocontroller.net/topic/83524#699933 Forenbeitrag von Jörg]).&lt;br /&gt;
&lt;br /&gt;
Die Option -i ist auch nützlich bei AVRs, die für einen langsamen Takt konfiguriert sind. Bei einem ATmega8, der mit einem 32.768 kHz Quarz läuft, kann es z.B. notwendig sein, die Option -i 90 zu verwenden. Den Zahlenwert ggf. ausprobieren.&lt;br /&gt;
&lt;br /&gt;
Manche Programmer werten die Option -i manchmal nicht aus, dann sollte man einen anderen Programmer versuchen.&lt;br /&gt;
&lt;br /&gt;
Beim USBTINY und USBASP kann man die Geschwindigkeit der SPI-Schnittstelle mit dem Parameter -B [Periodendauer in Mikrosekunden] begrenzen. Da beide Geräte durch Interrupts der Software-USB-Schnittstelle stark belastet werden, handelt es sich hier um die Maximalbitrate.&lt;br /&gt;
&lt;br /&gt;
==== Spezielle Hacks ====&lt;br /&gt;
&lt;br /&gt;
Unter Windows XP Service Pack 2 auf einem IBM Thinkpad T40 ließ sich die Fehlermeldung „avrdude: AVR device not responding“ beheben durch Ändern im Gerätemanager⇒Lpt1⇒Eigenschaften⇒Anschlusseinstellungen⇒„Interrupt-nie-verwenden“ in „Jeden dem Anschluss zugewiesenem Interrupt verwenden“.&lt;br /&gt;
&lt;br /&gt;
==== 64-Bit-Problem ====&lt;br /&gt;
&lt;br /&gt;
Unter 64-Bit-Windows-Versionen kann das Parallelport nicht benutzt werden, da der GiveIO-Treiber systembedingt nicht funktioniert. Genauer, es wird ohne [http://www.codeproject.com/Articles/28318/Bypassing-PatchGuard-3 böse Hacks] nicht möglich sein, eine 64-Bit-Version von GiveIO zu erstellen, da es hier eine [http://msdn.microsoft.com/en-us/library/windows/hardware/gg487350.aspx Kernel-Mode-Codeänderungs-Überwachung] gibt, die Änderungen an Systemtabellen (hier: Die IOPM, die In/Out Permission Map, falls es diese überhaupt gibt, und wenn ja, dann nur als Emulation für das 32-Bit-Subsystem) vereitelt (d.h. ein paar Minuten nach der Änderung kommt ein Bluescreen). Solange AVRDUDE an GiveIO (und eincompilierten E/A-Befehlen) festhält bleibt es so, und der Ausweich für den Bastler ist [[Pony-Prog_Tutorial|PonyProg]], bis AVRDUDE künftig ebenfalls InpOut32.dll bzw. InpOutX64.dll verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0.5em;padding:0.5em;border:1px green solid;border-radius:8px;-moz-border-radius:8px;background:#EFE&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Problem gelöst!&amp;lt;/b&amp;gt;&amp;lt;p&amp;gt;&lt;br /&gt;
So geht&#039;s:&lt;br /&gt;
* Neue [http://www-user.tu-chemnitz.de/~heha/viewzip.cgi/hs_freeware/inpout32-h%23s.zip/2013/Release InpOut32.dll] herunterladen&lt;br /&gt;
* Kommandozeile: &amp;lt;b&amp;gt;crundll InpOut32,CatchIo avrdude.exe &amp;lt;/b&amp;gt;&amp;lt;i&amp;gt;... (usw.)&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Und so funktioniert&#039;s:&amp;lt;/small&amp;gt;&lt;br /&gt;
* Die winzige crundll.exe ist ein Ersatz für rundll32.exe, als Konsolen-Version. Das verhindert, dass für avrdude eine neue Konsole geöffnet wird.&lt;br /&gt;
* crundll lädt InpOut32.dll und ruft den Einsprungpunkt CatchIoW auf. Als Kommandozeile wird L&amp;quot;avrdude.exe ...&amp;quot; (also die üblichen Parameter) übergeben&lt;br /&gt;
* Die CatchIoW-Routine erstellt einen schlafenden Prozess aus dem avrdude-Image. Nicht als Debugger, um teuere Prozessumschaltungen für das Exception-Handling (s.u.) zu vermeiden&lt;br /&gt;
* Ein &amp;quot;Remote Thread&amp;quot; wird im avrdude-Prozess gestartet, um InpOut32.dll zu laden. Genannt: [http://de.wikipedia.org/wiki/DLL-Injection DLL-Injektion]&lt;br /&gt;
* Die DLL-Initialisierungsroutine packt inpout64.sys aus, installiert und lädt diesen Kernmodus-Treiber. Das erfordert Admin-Rechte. Da es keine &amp;quot;I/O permission map&amp;quot; im X64 &amp;quot;long mode&amp;quot; gibt, kann es keinen Treiber geben, der E/A-Zugriffe für den User Mode transparent macht. Deshalb bleibt nichts anderes als ein Exception-Mechanismus übrig, um das Problem zu erschlagen. Nebenbei kann InpOut32.dll auf unübliche Portadressen sowie USB-Geräte umleiten. Die dazu notwendige Geräte- und Adresserkennung läuft ebenfalls in der Initialisierungsroutine&lt;br /&gt;
* In der Initialisierung wird ein prozessweiter Exception-Filter installiert&lt;br /&gt;
* Ein zweiter &amp;quot;Remote Thread&amp;quot; ändert die Adresse von kernel32.dll:GetVersionEx(). Die Ersatzroutine liefert als Plattform Windows 9x/Me. Auch genannt API-Hooking. Der Grund für den zweiten &amp;quot;Remote Thread&amp;quot; ist, dass dieses Verhalten bei regulärer Benutzung der InpOut32.dll (also LoadLibrary oder quasistatische Einbindung) unerwünscht ist.&lt;br /&gt;
* Der avrdude-Prozess wird aufgeweckt und startet. Er &amp;quot;erkennt&amp;quot; Windows 9x/Me and versucht gar nicht erst, GiveIo.sys zu starten.&lt;br /&gt;
* Dann macht avrdude die üblichen IN+OUT-Befehle. Jeder dieser Befehle generiert eine (IMHO) Allgemeine Schutzverletzung, also Int13 (General Protection Fault #GP). Bevor die sattsam bekannte Messagebox erscheint, geht der Interrupthandler zu ntdll:KiUserExceptionDispatcher, welche schließlich den installierten prozessweiten Exception-Filter aufruft, bevor es zum Abarbeiten eventueller try/except-Blöcke kommt&lt;br /&gt;
* Der Filter (also das Stückchen Kode in der InpOut32.dll) stellt fest, dass es sich tatsächlich im einen IN- oder OUT-Befehl handelt. Der Befehl wird einfach übersprungen und inpoutx64.sys bemüht, per DeviceIoControl() die E/A-Operation im Kernel Mode auszuführen. Kontext-Register (hier AL und DX) werden entsprechend benutzt. Danach meldet der Filter dem Aufrufer &amp;quot;Ausnahme erschlagen, bitte weiter im Text&amp;quot;&lt;br /&gt;
* Nach dieser länglichen Umleitung geht es weiter mit dem nächsten Assemblerbefehl&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== USB-Programmer ===&lt;br /&gt;
Die meisten USB-Programmiergeräte benötigen [http://sourceforge.net/apps/trac/libusb-win32/wiki libusb-win32] bzw. [http://www.libusb.org/ libusb].&lt;br /&gt;
&lt;br /&gt;
Ein Selbstbau-USB-Programmieradapter ist unter&lt;br /&gt;
[http://www.rototron.info/?Page=USBAVR/USBAVR.aspx http://www.rototron.info]&lt;br /&gt;
zu finden. Er benötigt eine relativ neue AVRDUDE-Version, aber benötigt unter &#039;&#039;keinem&#039;&#039; Windows-Betriebssystem einen Treiber, da er ein [http://de.wikipedia.org/wiki/Human_Interface_Device HID]-Gerät implementiert. &amp;lt;tt&amp;gt;libusb-win32&amp;lt;/tt&amp;gt; wird nicht benötigt. Normale (= reduzierte) Benutzerrechte genügen zum Betrieb des Gerätes.&lt;br /&gt;
&lt;br /&gt;
==== libusb0.dll wird bei WinAvr 20070525 nicht gefunden====&lt;br /&gt;
[http://www.mikrocontroller.net/topic/83524#701461 Forenbeitrag von Paul]: Habe leider noch etwas zu bemängeln, und zwar meckerte avrdude, dass es die &amp;quot;libusb0.dll&amp;quot; nicht fand. Musste dann erst noch manuell den Pfad c:\winavr\utils\libusb\bin in die autoxecec.bat eintragen. Siehe auch [http://www.avrfreaks.net/index.php?name=PNphpBB2&amp;amp;file=viewtopic&amp;amp;p=373283 Diskussion bei www.avrfreaks.net]&lt;br /&gt;
&lt;br /&gt;
====Aufruf unter Linux als user (non-root)====&lt;br /&gt;
&lt;br /&gt;
Unter Linux kann häufig avrdude nur als user &#039;root&#039; auf den USB-Programmer zugreifen. Als normaler User bekommt man eine Fehlermeldung wie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#avrdude -c usbtiny -p m8&lt;br /&gt;
 &lt;br /&gt;
avrdude: error: usbtiny_transmit: &lt;br /&gt;
error sending control message: &lt;br /&gt;
Operation not permitted&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies liegt daran, dass die device-nodes, die beim Einstecken des USB-Programmers von udev angelegt werden, root zugeordnet sind. Man kann dies ändern, indem man udev-Regeln für die verwendeten Programmer anlegt. Unter Debian muß man dazu nur eine neue Datei, z.&amp;amp;nbsp;B. 015_usbprog.rules unter /etc/udev/rules.d anlegen, z.&amp;amp;nbsp;B. mit folgenden Inhalt:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Atmel AVR ISP mkII&lt;br /&gt;
SUBSYSTEM==&amp;quot;usb&amp;quot;, ATTRS{idVendor}==&amp;quot;03eb&amp;quot;, ATTRS{idProduct}==&amp;quot;2104&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# usbprog bootloader&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;1781&amp;quot;, ATTRS{idProduct}==&amp;quot;0c62&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
# USBasp programmer&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;16c0&amp;quot;, ATTRS{idProduct}==&amp;quot;05dc&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
# USBtiny programmer&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;1781&amp;quot;, ATTRS{idProduct}==&amp;quot;0c9f&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
habe den alten Inhalt nur auskommentiert, weil ich das ganze nur mit dem mkII testen konnte. ...Nur falls sich jemand beschweren sollte.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Atmel AVR ISP mkII&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;03eb&amp;quot;, ATTRS{idProduct}==&amp;quot;2104&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot; &lt;br /&gt;
 &lt;br /&gt;
# usbprog bootloader&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;1781&amp;quot;, ATTRS{idProduct}==&amp;quot;0c62&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
# USBasp programmer&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;16c0&amp;quot;, ATTRS{idProduct}==&amp;quot;05dc&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
# USBtiny programmer&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;1781&amp;quot;, ATTRS{idProduct}==&amp;quot;0c9f&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach muss in der Regel der udev-Dienst neu gestartet werden, was -- je nach System -- mit einem der beiden folgenden Befehle funktionieren sollte (natürlich nur als root):&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 /etc/init.d/udev restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 service udev restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo /sbin/udevadm control --reload-rules&amp;lt;/pre&amp;gt; bei aktueller udev-version, oder&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo /sbin/udevcontrol --reload_rules&amp;lt;/pre&amp;gt;, bei älteren udev-versionen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Danach sollte der USB-Programmer erneut angeschlossen werden. Falls es immer noch nicht funktioniert kann es helfen, als GROUP &amp;quot;plugdev&amp;quot; statt &amp;quot;users&amp;quot; zu verwenden.&lt;br /&gt;
&lt;br /&gt;
Hiermit werden der AVR ISP mkII, der usbprog Bootloader, USBasp und USBtiny bekannt gemacht, so daß alle User in der Gruppe &amp;quot;users&amp;quot; darauf zugreifen können.&lt;br /&gt;
&lt;br /&gt;
Für weitere USB-Programmer muß man die entsprechende Zeile (mit ATTRS...) anlegen und die passenden Vendor und Product IDs eintragen.&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* [http://www.reactivated.net/writing_udev_rules.html Writing udev rules]&lt;br /&gt;
&lt;br /&gt;
====Linux-Treiberprobleme====&lt;br /&gt;
&lt;br /&gt;
Wenn der Programmer (usbprog mit AVRisp mkII) unter Ubuntu trotz korrekter Konfiguration nicht gefunden wird, kann es daran liegen, dass das Paket &amp;quot;libmtp-runtime&amp;quot; installiert ist. siehe [https://www.mikrocontroller.net/topic/245816 hier]&lt;br /&gt;
&lt;br /&gt;
=== Anzeige unterstützter AVRs ===&lt;br /&gt;
Wie die anderen Atmels bei avrdude heißen zeigt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -?&lt;br /&gt;
avrdude -p ?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== neuere AVRs hinzufügen ===&lt;br /&gt;
Manch neueres Silizium wird nicht erkannt da sich z.T. die IDs geändert haben. Um diese erfolgreich zu Programmieren empfiehlt sich ein eigenes config-File zu verwenden. Darin werden die &#039;fehlenden&#039; CPUs ergänzt:&lt;br /&gt;
&lt;br /&gt;
z.B. ATmega168P (Programmierung wie ATmega168): einfach den ATmega168 Teil duplizieren und die entsprechenden Änderungen (id, desc, signature) vornehmen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
# ATmega168P&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
part&lt;br /&gt;
    id              = &amp;quot;m168p&amp;quot;;&lt;br /&gt;
    desc            = &amp;quot;ATMEGA168P&amp;quot;;&lt;br /&gt;
     has_debugwire = yes;&lt;br /&gt;
     flash_instr   = 0xB6, 0x01, 0x11;&lt;br /&gt;
     eeprom_instr  = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00,&lt;br /&gt;
	             0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF,&lt;br /&gt;
	             0x99, 0xF9, 0xBB, 0xAF;&lt;br /&gt;
    stk500_devcode  = 0x86;&lt;br /&gt;
    # avr910_devcode = 0x;&lt;br /&gt;
    signature       = 0x1e 0x94 0x0b;&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
danach kann, unter Angabe des neuen config-Files, auch ein ATmega168P programmiert werden, z.B.:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -pm168p -C ~/.avrdude.config.neu -cstk500v2 -v  -U flash:w:main.hex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Anschluss an COM10 und höher (Windows) ===&lt;br /&gt;
&lt;br /&gt;
Wenn AVRDUDE unter Windows an COM10 und höher betrieben werden soll, ist eine andere Schreibweise für die Schnittstelle in der Kommandozeile nötig. Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -c stk500v2 -p m16 -P \\.\com13 -uF -vvvv 2&amp;gt; logfile.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird statt der gewohnten Schreibweise &#039;&#039;&#039;com13&#039;&#039;&#039; die spezielle Schreibweise  &#039;&#039;&#039;\\.\com13&#039;&#039;&#039; verwendet und es wird mit &#039;&#039;-vvvv 2&amp;gt; logfile.txt&#039;&#039; eine ausführliche Debugausgabe für Fragen im Forum erzeugt. Näheres hierzu in der  [http://www.mikrocontroller.net/topic/90401 Forumsdiskussion].&lt;br /&gt;
&lt;br /&gt;
=== AVRISPmkII + AVRDUDE + Window Vista (32) ===&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/topic/126594#1157327&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;avrdude was compiled without usb support&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Offenbar enthielt WinAVR-20100110 zunächst fälschlicherweise eine AVRDUDE Version ohne USB Support [http://www.mikrocontroller.net/topic/163022#1554907].&lt;br /&gt;
&lt;br /&gt;
Abhilfe:&lt;br /&gt;
 &lt;br /&gt;
1. WinAVR deinstallieren, gleiches Release (WinAVR-20100110) nocheinmal herunterladen und installieren (mindestens seit Anfang März 2010 enthält dieses Release avrdude in der Version 5.10 und bringt USB-Support mit).&lt;br /&gt;
&lt;br /&gt;
2. AVRDUDE selbst compilieren: http://www.mikrocontroller.net/topic/163675&lt;br /&gt;
&lt;br /&gt;
3. Compilierte Version 5.10 downloaden: http://www.mikrocontroller.net/topic/163675#1594689&lt;br /&gt;
&lt;br /&gt;
=== Textausgabe in Datei umleiten? ===&lt;br /&gt;
&lt;br /&gt;
Die Windows-&amp;quot;Shell&amp;quot; &#039;&#039;cmd&#039;&#039; benutzt für die Ausgabeumleitung die gleiche Syntax wie die Bourne-Shell (und damit auch&lt;br /&gt;
Bash): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
programm &amp;gt;datei 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zur Umleitung von STDOUT und STDERR in die gleiche Datei (Yalu in [http://www.mikrocontroller.net/topic/124509#1135568]).&lt;br /&gt;
&lt;br /&gt;
Beispiel für Windows ([http://www.mikrocontroller.net/topic/124509#1136322], [http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/redirection.mspx?mfr=true M$]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -c avrispmkII -p m8 -P usb:xx -v &amp;gt; &amp;quot;C:\output.txt&amp;quot; 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder nur STDERR in Datei umleiten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -c avrispmkII -p m8 -P usb:xx -v 2&amp;gt; &amp;quot;C:\output.txt&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [http://www.franzis.de/elektronik/lernpakete-elektronik/lernpaket-mikrocontroller Franzis] bzw. [http://www.elo-web.de/elo/mikrocontroller-und-programmierung/avr-grundlagen/experimente-mit-dem-attiny13 ELO] Lernpaket Mikrocontroller (Attiny13) ===&lt;br /&gt;
&lt;br /&gt;
Markus hat in [http://www.mikrocontroller.net/topic/169549#1649459] einen Weg beschrieben, wie man den einfachen Programmieradapter des Lernpakets mit AVRDUDE ansteuern kann.&lt;br /&gt;
&lt;br /&gt;
Eine weitere Anleitung [http://www.elektronik-labor.de/AVR/AVRdude.html LP Mikrocontroller und Attiny45 mit Avrdude] gibt es von Ralf Beesner auf der Webseite des Entwicklers Burkhard Kainka. In &#039;&#039;avrdude.conf&#039;&#039; wird dabei ein neuer Programmieradapter namens &#039;&#039;burkhard&#039;&#039; hinzugefügt. Ein zweiter Eintrag &#039;&#039;burkhard2&#039;&#039; in dieser &#039;&#039;&#039;avrdude.conf&#039;&#039;&#039; ist für die Programmierung des Atmega8 auf dem Franzis Retro-Pong Bausatz mit Hilfe des &amp;quot;Mega8-ISP-Programmer&amp;quot; (Layout siehe ELO-Webseite) vorgesehen.&lt;br /&gt;
&lt;br /&gt;
=== AVRDUDE mit Arduino Bootloader benutzen ===&lt;br /&gt;
&lt;br /&gt;
Mit der Option &#039;&#039;-c stk500v1&#039;&#039; kann AVRDUDE den [[Bootloader]] in Arduino Boards ansprechen [http://www.mikrocontroller.net/topic/195963#1919654].&lt;br /&gt;
&lt;br /&gt;
Es existieren auch modifizierte Versionen von AVRDUDE, die einen Programmer namens &#039;&#039;arduino&#039;&#039; kennen (avrdude.conf untersuchen!). Damit lautet die Kommandozeile für ein Arduinoboard mit Atmega168 beispielsweise [http://www.neuraladvance.com/2010/04/08/using-avrdude-with-the-arduino-duemilanove/]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -c arduino -p m168 -P usb -U flash:w:&amp;lt;filename&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Evtl. muss auch noch die Datenrate mit der Option -b angepasst werden, je nach Board werden verschiedene (19200, 57600, 115200) verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Bootloader-Hacks von [http://www.ladyada.net/library/arduino/bootloader.html Ladyada] arbeiten nochmal etwas anders.&lt;br /&gt;
&lt;br /&gt;
Gelegentlich gibt es unter Windows Probleme mit der allgemeinen AVRDUDE Version und deren Handling der DTR/RTS Leitung ([[RS232]]). Es kann helfen, unmittelbar von dem Absenden der Kommandozeile einen RESET auf dem Arduinoboard durchzuführen.&lt;br /&gt;
Ein kurzes Setzen der DTR Leitung auf HIGH bewirkt ein RESET. So ist es möglich eine .bat Datei zu erstellen mit folgendem Code: (com6 ist ein Virtueller USB Comport) &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mode com6 dtr=on&lt;br /&gt;
avrdude -c arduino -p m168 -P \\.\com6 -U flash:w:&amp;lt;filename&amp;gt;&lt;br /&gt;
if %ERRORLEVEL%==0 goto fertig&lt;br /&gt;
Pause&lt;br /&gt;
:fertig&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man den mode-Befehl nicht verwenden kann, etwa weil man cygwin und ein makefile verwendet, so kann man stattdessen &amp;lt;pre&amp;gt;cmd /c mode com6 dtr=on&amp;lt;/pre&amp;gt; verwenden. In cygwin empfiehlt sich &amp;lt;pre&amp;gt;cmd /c mode com6 dtr=on &amp;gt; /dev/null&amp;lt;/pre&amp;gt;, damit wird die unnütze Ausgabe des Befehls verborgen.&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* http://www.mikrocontroller.net/topic/232367&lt;br /&gt;
* http://www.mikrocontroller.net/topic/238243&lt;br /&gt;
&lt;br /&gt;
=== mysmartUSB V2.11 und ATtiny 13 ===&lt;br /&gt;
&lt;br /&gt;
mysmartUSB V2.11 verlangt -cavr910 als Programmer. Leider ist in avrdude&lt;br /&gt;
5.10 immer noch nicht der ATtiny13 damit zu programmieren. Also in die&lt;br /&gt;
avrdude.conf folgendes mit unter ATtiny13 aufnehmen, so kann er dann&lt;br /&gt;
korrekt programmiert werden(inkl. Fuse Bits).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
# ATtiny13&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
part&lt;br /&gt;
    id                  = &amp;quot;t13&amp;quot;;&lt;br /&gt;
    desc                = &amp;quot;ATtiny13&amp;quot;;&lt;br /&gt;
     has_debugwire = yes;&lt;br /&gt;
     flash_instr   = 0xB4, 0x0E, 0x1E;&lt;br /&gt;
     eeprom_instr  = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D,&lt;br /&gt;
               0xBC, 0x0E, 0xB4, 0x0E, 0xBA, 0x0D, 0xBB, 0xBC,&lt;br /&gt;
               0x99, 0xE1, 0xBB, 0xAC;&lt;br /&gt;
    stk500_devcode      = 0x14;&lt;br /&gt;
    avr910_devcode      = 0x55;&lt;br /&gt;
......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung! Programmieren geht auch mit -cavr911. Allerdings geht das Fuse&lt;br /&gt;
setzen nicht und man bekommt eine Fehlermeldung.(Programm läuft aber)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Reading | ################################################## | 100%&lt;br /&gt;
0.12s&lt;br /&gt;
&lt;br /&gt;
avrdude: verifying ...&lt;br /&gt;
avrdude: 226 bytes of flash verified&lt;br /&gt;
avrdude: reading input file &amp;quot;0x7a&amp;quot;&lt;br /&gt;
avrdude: writing lfuse (1 bytes):&lt;br /&gt;
&lt;br /&gt;
Writing |  ***failed;&lt;br /&gt;
################################################## | 100% 0.00s&lt;br /&gt;
&lt;br /&gt;
avrdude: 1 bytes of lfuse written&lt;br /&gt;
avrdude: verifying lfuse memory against 0x7a:&lt;br /&gt;
avrdude: load data lfuse data from input file 0x7a:&lt;br /&gt;
avrdude: input file 0x7a contains 1 bytes&lt;br /&gt;
avrdude: reading on-chip lfuse data:&lt;br /&gt;
&lt;br /&gt;
Reading | ################################################## | 100%&lt;br /&gt;
0.00s&lt;br /&gt;
&lt;br /&gt;
avrdude: verifying ...&lt;br /&gt;
avrdude: 1 bytes of lfuse verified&lt;br /&gt;
avrdude: reading input file &amp;quot;0xff&amp;quot;&lt;br /&gt;
avrdude: writing hfuse (1 bytes):&lt;br /&gt;
&lt;br /&gt;
Writing |  ***failed;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Anpassungen von avrdude.conf an neuere AVRs ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ATtiny167&#039;&#039;&#039; siehe [http://www.mikrocontroller.net/topic/236355 Forumbeitrag von Volker U.]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* Offizielle AVRDUDE Homepage unter http://www.nongnu.org/avrdude/&lt;br /&gt;
* User Manual (engl.) unter http://www.nongnu.org/avrdude/user-manual/avrdude.html#Top&lt;br /&gt;
* Kompilierte Windows Version mit USB Support http://yuki-lab.jp/hw/avrdude-GUI/avrdude-5.5-win32-bin.zip&lt;br /&gt;
* Kompilierte Windows Version avrdude 5.10 mit USB Support http://www.mikrocontroller.net/topic/163675#1594689&lt;br /&gt;
* Kompilierte Windows Version avrdude 5.11.1 mit USB Support http://www.mikrocontroller.net/topic/163675#2383773&lt;br /&gt;
* Kompilierte Windows Version avrdude 6.0 rc2 http://www.mikrocontroller.net/topic/296379#3166155&lt;br /&gt;
* Wer Interesse an der modifizierten Version von AVRDUDE und des AVR910-Programmer hat, kann sich bei http://www.fischl.de/thomas/elektronik/avr910e/ informieren. Der Programmer bleibt auch mit der Modifikation weiterhin kompatibel zu anderer Programmiersoftware.&lt;br /&gt;
* [[LunaAVR]] GUI für AVRDUDE in der IDE enthalten http://avr.myluna.de mit FUSE-Editor (für Windows und Linux)&lt;br /&gt;
* [[Burn-o-mat|AVR Burn-O-Mat]] GUI (Graphic User Interface) für AVRDUDE http://burn-o-mat.net mit FUSE-Editor (Java, für Windows und Linux)&lt;br /&gt;
* [http://www.soft-land.de/ AVRBurner] Ponyprog-ähnliche Oberfläche für AVRDUDE.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* [http://www.microstar.ir/download/SinaProg.zip SinaProg] SinaProg - avrdude GUI mit AVR Fuse Calculator. &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; LINK IST TOT&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
[[Kategorie:AVR-Programmer und -Bootloader]]&lt;br /&gt;
[[Kategorie:Entwicklungstools]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Power_Management&amp;diff=77886</id>
		<title>AVR-Tutorial: Power Management</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Power_Management&amp;diff=77886"/>
		<updated>2013-08-05T14:07:45Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Theorie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ACHTUNG!&#039;&#039;&#039;&lt;br /&gt;
Dieser Artikel befindet sich noch im Aufbau!&lt;br /&gt;
&lt;br /&gt;
Vorallem in batteriebetriebenen Systemen spielt die Leistungsaufnahme eine wichtige Rolle, d.h. sie soll so niedrig wie möglich gehalten werden um eine lange Laufzeit zu erreichen. Den sparsamen Umgang mit der verfügbaren el. Ladung nennt man &#039;&#039;&#039;Power Management&#039;&#039;&#039; (dt. Energiesparen).&lt;br /&gt;
&lt;br /&gt;
Im Rahmen des Power Managements stehen uns beispielsweise die Sleep-Modi zur Verfügung, mit denen wir bestimmte Module zeitweise deaktivieren können. Andere garnicht genutzte Module können wir durch entsprechende Konfiguration (z.B. in den Fuses) auch komplett deaktivieren.&lt;br /&gt;
&lt;br /&gt;
== Theorie ==&lt;br /&gt;
&lt;br /&gt;
Der Stromverbrauch einer CMOS-Schaltung (was auch Mikrocontroller sind) hängt letztlich nur davon ab, wie viele Gates bei welcher Spannung umgeladen werden. Zur Reduktion steht demnach zur Verfügung:&lt;br /&gt;
* Reduktion der Umladevorgänge pro Sekunde, also Reduktion der Taktfrequenz&lt;br /&gt;
* Reduktion der beteiligten Kapazitäten, also Abschalten nicht benutzter Funktionsblöcke&lt;br /&gt;
* Reduktion der Speisespannung (bei manchen Controllern ist das die &#039;&#039;Kernspannung&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Den statischen Reststrom kann man heutzutage vernachlässigen, auch wenn an dieser Stelle die Anmerkung fallen muss, dass AVRs da eher schlecht abschneiden. Hingegen muss Strom durch ohmsche Lasten, etwa Pull-Up-Widerstände oder LEDs, unbedingt beachtet werden! Außerdem dürfen keine offenen (CMOS!-)Eingänge „herumfliegen“ sondern müssen allesamt an definiertem Potenzial liegen. In der Regel können Mikrocontroller unbenutzte Eingänge im Schlafmodus oder Analogeingangsbetrieb automatisch abtrennen.&lt;br /&gt;
&lt;br /&gt;
Grundsätzlich sollte für Stromsparbetrieb die niedrigstmögliche Taktfrequenz gewählt werden, die möglich ist. Übliche Mikrocontroller können direkt von einem Uhrenquarz mit 32,768 kHz gespeist werden. Macht natürlich auch nur maximal 32768 Befehle pro Sekunde. Die Stromaufnahme ist dabei sehr gering und im Gegensatz zu Sleep-Mode-Tricksereien ohne hohe Spitzen.&lt;br /&gt;
&lt;br /&gt;
Da das Antwortverhalten bei derart geringen Taktfrequenzen leidet, wird man eine höhere Frequenz wählen und den Prozessor bei Nicht-Bedarf schlafen schicken. Die Strom-Spitzen sind dementsprechend höher, die Gesamtstromaufnahme bleibt jedoch gering.&lt;br /&gt;
&lt;br /&gt;
Viele Mikrocontroller können einzelne Funktionsblöcke abschalten. Bei den AVRs schlägt da vor allem der 16-Bit-Timer 1 zu Buche. Aber auch die Referenzspannungsquelle für den A/D-Wandler, Analogvergleicher oder den Brown-Out-Detektor kann man abschalten.&lt;br /&gt;
&lt;br /&gt;
Für die Kontrolle der Stromaufnahme aus einer Batterie ist ein Digitalmultimeter mit vielen Strommessbereichen bis 20 µA (Auflösung 10 nA) vorteilhaft. Außerdem ein Plättchen einer doppelseitigen Leiterplatte mit dünnen Drähtchen, das man unter die Batteriekontaktierung schieben kann. Weicht die Stromaufnahme vom Datenblatt ab, hat man wohl noch irgendetwas vergessen.&lt;br /&gt;
&lt;br /&gt;
=== Sleep Modi ===&lt;br /&gt;
&lt;br /&gt;
Welche Sleep-Modi es gibt, hängt vom verwendeten µC ab, dieser Artikel nimmt jedoch Bezug auf den ATmega32. Um einen der verfügbaren Sleep-Modi des ATmega32 zu betreten müssen folgende Schritte ausgeführt werden&lt;br /&gt;
&lt;br /&gt;
# Das SE-Bit im MCUCR-Register wird auf 1 gesetzt&lt;br /&gt;
# Die SMx-Bits im MCUCR-Register je nach gewünschtem Modus setzen&lt;br /&gt;
# Der SLEEP-Befehl wird ausgeführt&lt;br /&gt;
&lt;br /&gt;
Der Mikrocontroller geht dann sofort in den SLEEP-Modus, d.h. noch vor eventuell anstehenden Interrupts, und wacht erst wieder auf wenn ein Signal eines geeigneten Moduls (je nach Modus) ihn aufweckt.&lt;br /&gt;
&lt;br /&gt;
Die Arbeit wird dann mit der ersten Anweisung hinter dem SLEEP-Befehl wieder aufgenommen.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ MCUCR - MCU Control Register&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! Bit&lt;br /&gt;
| style=&amp;quot;width:12%&amp;quot; | 7&lt;br /&gt;
| style=&amp;quot;width:12%&amp;quot; | 6&lt;br /&gt;
| style=&amp;quot;width:12%&amp;quot; | 5&lt;br /&gt;
| style=&amp;quot;width:12%&amp;quot; | 4&lt;br /&gt;
| style=&amp;quot;width:12%; background-color:#c0c0c0&amp;quot; | 3&lt;br /&gt;
| style=&amp;quot;width:12%; background-color:#c0c0c0&amp;quot; | 2&lt;br /&gt;
| style=&amp;quot;width:12%; background-color:#c0c0c0&amp;quot; | 1&lt;br /&gt;
| style=&amp;quot;width:12%; background-color:#c0c0c0&amp;quot; | 0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
| SE&lt;br /&gt;
| SM2&lt;br /&gt;
| SM1&lt;br /&gt;
| SM0&lt;br /&gt;
| style=&amp;quot;background-color:#c0c0c0&amp;quot; | ISC11&lt;br /&gt;
| style=&amp;quot;background-color:#c0c0c0&amp;quot; | ISC10&lt;br /&gt;
| style=&amp;quot;background-color:#c0c0c0&amp;quot; | ISC01&lt;br /&gt;
| style=&amp;quot;background-color:#c0c0c0&amp;quot; | ISC00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Bit 7 - SE: Sleep Enable&lt;br /&gt;
:Mit diesem Bit wird bestimmt ob der Sleep-Befehl ausgeführt wird (1) oder nicht (0).&lt;br /&gt;
&lt;br /&gt;
;Bit 6..4 - SM2..0: Sleep Mode Select&lt;br /&gt;
:Mit diesen drei Bits wird der gewünschte Sleep-Modus gewählt&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! SM2&lt;br /&gt;
! SM1&lt;br /&gt;
! SM0&lt;br /&gt;
! style=&amp;quot;text-align:left&amp;quot; | Sleep Modus&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Idle&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | ADC Noise Reduction&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Power-down&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Power-save&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Reserved&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Reserved&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Standby&amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Extended Standby&amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt; Nur verfügbar mit externem Taktgeber&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Modi Übersicht====&lt;br /&gt;
&lt;br /&gt;
Generell ist der Modus zu wählen, der die meisten nicht benötigten Module abschaltet.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&lt;br /&gt;
! colspan=&amp;quot;5&amp;quot; | Aktive Takte &lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | Aktive Oszillatoren&lt;br /&gt;
! colspan=&amp;quot;6&amp;quot; | Weckquellen&lt;br /&gt;
|- style=&amp;quot;background-color:#f0f0f0&amp;quot;&lt;br /&gt;
| Sleep Modus&lt;br /&gt;
| clk&amp;lt;sub&amp;gt;CPU&amp;lt;/sub&amp;gt;&lt;br /&gt;
| clk&amp;lt;sub&amp;gt;FLASH&amp;lt;/sub&amp;gt;&lt;br /&gt;
| clk&amp;lt;sub&amp;gt;IO&amp;lt;/sub&amp;gt;&lt;br /&gt;
| clk&amp;lt;sub&amp;gt;ADC&amp;lt;/sub&amp;gt;&lt;br /&gt;
| clk&amp;lt;sub&amp;gt;ASY&amp;lt;/sub&amp;gt;&lt;br /&gt;
| Haupttaktgeber&lt;br /&gt;
| Timer Oszillator&lt;br /&gt;
| INT2&amp;lt;br /&amp;gt;INT1&amp;lt;br /&amp;gt;INT0&lt;br /&gt;
| TWI Address Match&lt;br /&gt;
| Timer2&lt;br /&gt;
| SPM/EEPROM Ready&lt;br /&gt;
| ADC&lt;br /&gt;
| Andere I/O&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Idle&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | ADC Noise Reduction&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&amp;lt;sup&amp;gt;(3)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Power-down&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| x&amp;lt;sup&amp;gt;(3)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Power-save&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| x&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
| x&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&amp;lt;sup&amp;gt;(3)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&lt;br /&gt;
| x&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Standby&amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| x&lt;br /&gt;
| &lt;br /&gt;
| x&amp;lt;sup&amp;gt;(3)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Extended Standby&amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| x&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&lt;br /&gt;
| x&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&amp;lt;sup&amp;gt;(3)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&lt;br /&gt;
| x&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt; Nur verfügbar bei externer Taktquelle&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt; Wenn AS2-Bit in ASSR-Register gesetzt&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;(3)&amp;lt;/sup&amp;gt; Nur INT2 oder Level Interrupt INT1 und INT0&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manuelles Deaktivieren ===&lt;br /&gt;
Einzelne Module können auch manuell deaktviert werden um Strom zu sparen, das bietet sich vorallem an wenn bestimmte Module im gegebenen Projekt generell nicht benötigt werden und damit deaktiviert werden können.&lt;br /&gt;
&lt;br /&gt;
==== Analog to Digital Converter ====&lt;br /&gt;
todo...&lt;br /&gt;
&lt;br /&gt;
==== Analog Comparator ====&lt;br /&gt;
Der Analogkomparator ist standardmäßig aktiviert. Um ihn zu deaktivieren, muss man ACD (Bit 7) im Register ACSR setzen.&lt;br /&gt;
&lt;br /&gt;
==== Brown-Out Detector ====&lt;br /&gt;
Der Brown-Out Detector lässt sich entweder durch das BODEN-Bit in den Fuses oder mit entsprechenden Befehlen aktivieren oder deaktivieren. Das Fuse-Bit ist standardmäßig gesetzt (Achtung: Umgekehrte Logik!) und der BOD damit deaktiviert.&lt;br /&gt;
&lt;br /&gt;
==== Watchdog ====&lt;br /&gt;
Auch der Watchdog-Timer lässt sich in den Fuses standardmäßig aktivieren/deaktivieren, hier über das WDTON-Bit.&lt;br /&gt;
Natürlich geht auch das softwareseitig [http://www.mikrocontroller.net/articles/AVR-Tutorial:_Watchdog]&lt;br /&gt;
&lt;br /&gt;
== Praxis ==&lt;br /&gt;
&lt;br /&gt;
=== Assembler ===&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; ASM-Quellcode Beispiele&lt;br /&gt;
&lt;br /&gt;
=== C ===&lt;br /&gt;
&lt;br /&gt;
Ein simples Testprogramm, um mit sleep modi im AVR zu spielen. Es funktioniert sehr gut mit dem ATmega8 und ist auch auf andere AVRs portierbar. Teilweise sind weitere Modi verfügbar.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist, daß die Interruptroutine für den &amp;quot;Weckruf&amp;quot; vorhanden sein muss. Es müssen nicht zwingend Aktionen in ihr durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/* ATmega8 with internal 4Mhz clock (6cycle + 64ms) */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/sleep.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
   DDRC |= (1 &amp;lt;&amp;lt; PC2) | (1 &amp;lt;&amp;lt; PC1); // leds for testing&lt;br /&gt;
&lt;br /&gt;
   DDRD &amp;amp;= ~(1 &amp;lt;&amp;lt; PD2); // INT0: input...&lt;br /&gt;
   PORTD |= (1 &amp;lt;&amp;lt; PD2); // ...with pullup.&lt;br /&gt;
&lt;br /&gt;
   // level interrupt INT0 (low level)&lt;br /&gt;
   MCUCR &amp;amp;= ~((1 &amp;lt;&amp;lt; ISC01) | (1 &amp;lt;&amp;lt; ISC00));&lt;br /&gt;
&lt;br /&gt;
   // infinite main loop&lt;br /&gt;
   while (1)&lt;br /&gt;
   {&lt;br /&gt;
      // trigger leds for testing&lt;br /&gt;
      PORTC ^= (1 &amp;lt;&amp;lt; PC1);&lt;br /&gt;
      _delay_ms(500);&lt;br /&gt;
      PORTC ^= (1 &amp;lt;&amp;lt; PC1);&lt;br /&gt;
&lt;br /&gt;
      // enable external interrupt&lt;br /&gt;
      GICR |= (1 &amp;lt;&amp;lt; INT0);&lt;br /&gt;
&lt;br /&gt;
      // set sleep mode&lt;br /&gt;
      set_sleep_mode(SLEEP_MODE_PWR_DOWN);&lt;br /&gt;
&lt;br /&gt;
      // sleep_mode() has a possible race condition&lt;br /&gt;
      sleep_enable();&lt;br /&gt;
      sei();&lt;br /&gt;
      sleep_cpu();&lt;br /&gt;
      sleep_disable();&lt;br /&gt;
&lt;br /&gt;
      // waking up...&lt;br /&gt;
      // disable external interrupt here, in case the external low pulse is too long&lt;br /&gt;
      GICR &amp;amp;= ~(1 &amp;lt;&amp;lt; INT0);&lt;br /&gt;
&lt;br /&gt;
      // disable all interrupts&lt;br /&gt;
      cli();&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ISR(INT0_vect)&lt;br /&gt;
{&lt;br /&gt;
   // ISR might be empty, but is necessary nonetheless&lt;br /&gt;
   PORTC ^= (1 &amp;lt;&amp;lt; PC2); // debugging&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quellen ==&lt;br /&gt;
[http://www.atmel.com/dyn/resources/prod_documents/doc2503.pdf ATMEL AVR ATmega32 Datenblatt]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{{Navigation_zurückhoch|&lt;br /&gt;
zurücktext=Power Management|&lt;br /&gt;
zurücklink=AVR-Tutorial: Power Management|&lt;br /&gt;
hochtext=Inhaltsverzeichnis|&lt;br /&gt;
hochlink=AVR-Tutorial}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: AVR-Tutorial|Power Management]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Power_Management&amp;diff=77885</id>
		<title>AVR-Tutorial: Power Management</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Power_Management&amp;diff=77885"/>
		<updated>2013-08-05T14:02:28Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Theorie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ACHTUNG!&#039;&#039;&#039;&lt;br /&gt;
Dieser Artikel befindet sich noch im Aufbau!&lt;br /&gt;
&lt;br /&gt;
Vorallem in batteriebetriebenen Systemen spielt die Leistungsaufnahme eine wichtige Rolle, d.h. sie soll so niedrig wie möglich gehalten werden um eine lange Laufzeit zu erreichen. Den sparsamen Umgang mit der verfügbaren el. Ladung nennt man &#039;&#039;&#039;Power Management&#039;&#039;&#039; (dt. Energiesparen).&lt;br /&gt;
&lt;br /&gt;
Im Rahmen des Power Managements stehen uns beispielsweise die Sleep-Modi zur Verfügung, mit denen wir bestimmte Module zeitweise deaktivieren können. Andere garnicht genutzte Module können wir durch entsprechende Konfiguration (z.B. in den Fuses) auch komplett deaktivieren.&lt;br /&gt;
&lt;br /&gt;
== Theorie ==&lt;br /&gt;
&lt;br /&gt;
Der Stromverbrauch einer CMOS-Schaltung (was auch Mikrocontroller sind) hängt letztlich nur davon ab, wie viele Gates bei welcher Spannung umgeladen werden. Zur Reduktion steht demnach zur Verfügung:&lt;br /&gt;
* Reduktion der Umladevorgänge pro Sekunde, also Reduktion der Taktfrequenz&lt;br /&gt;
* Reduktion der beteiligten Kapazitäten, also Abschalten nicht benutzter Funktionsblöcke&lt;br /&gt;
* Reduktion der Speisespannung (bei manchen Controllern ist das die &#039;&#039;Kernspannung&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Den statischen Reststrom kann man heutzutage vernachlässigen, auch wenn an dieser Stelle die Anmerkung fallen muss, dass AVRs da eher schlecht abschneiden. Hingegen muss Strom durch ohmsche Lasten, etwa Pull-Up-Widerstände oder LEDs, unbedingt beachtet werden! Außerdem dürfen keine offenen (CMOS!-)Eingänge „herumfliegen“ sondern müssen allesamt an definiertem Potenzial liegen. In der Regel können Mikrocontroller unbenutzte Eingänge im Schlafmodus oder Analogeingangsbetrieb automatisch abtrennen.&lt;br /&gt;
&lt;br /&gt;
Grundsätzlich sollte für Stromsparbetrieb die niedrigstmögliche Taktfrequenz gewählt werden, die möglich ist. Übliche Mikrocontroller können direkt von einem Uhrenquarz mit 32,768 kHz gespeist werden. Macht natürlich auch nur maximal 32768 Befehle pro Sekunde. Die Stromaufnahme ist dabei sehr gering und im Gegensatz zu Sleep-Mode-Tricksereien ohne hohe Spitzen.&lt;br /&gt;
&lt;br /&gt;
Da das Antwortverhalten bei derart geringen Taktfrequenzen leidet, wird man eine höhere Frequenz wählen und den Prozessor bei Nicht-Bedarf schlafen schicken. Die Strom-Spitzen sind dementsprechend höher, die Gesamtstromaufnahme bleibt jedoch gering.&lt;br /&gt;
&lt;br /&gt;
Viele Mikrocontroller können einzelne Funktionsblöcke abschalten. Bei den AVRs schlägt da vor allem der 16-Bit-Timer 1 zu Buche. Aber auch die Referenzspannungsquelle für den A/D-Wandler, Analogvergleicher oder den Brown-Out-Detektor kann man abschalten.&lt;br /&gt;
&lt;br /&gt;
=== Sleep Modi ===&lt;br /&gt;
&lt;br /&gt;
Welche Sleep-Modi es gibt, hängt vom verwendeten µC ab, dieser Artikel nimmt jedoch Bezug auf den ATmega32. Um einen der verfügbaren Sleep-Modi des ATmega32 zu betreten müssen folgende Schritte ausgeführt werden&lt;br /&gt;
&lt;br /&gt;
# Das SE-Bit im MCUCR-Register wird auf 1 gesetzt&lt;br /&gt;
# Die SMx-Bits im MCUCR-Register je nach gewünschtem Modus setzen&lt;br /&gt;
# Der SLEEP-Befehl wird ausgeführt&lt;br /&gt;
&lt;br /&gt;
Der Mikrocontroller geht dann sofort in den SLEEP-Modus, d.h. noch vor eventuell anstehenden Interrupts, und wacht erst wieder auf wenn ein Signal eines geeigneten Moduls (je nach Modus) ihn aufweckt.&lt;br /&gt;
&lt;br /&gt;
Die Arbeit wird dann mit der ersten Anweisung hinter dem SLEEP-Befehl wieder aufgenommen.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ MCUCR - MCU Control Register&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! Bit&lt;br /&gt;
| style=&amp;quot;width:12%&amp;quot; | 7&lt;br /&gt;
| style=&amp;quot;width:12%&amp;quot; | 6&lt;br /&gt;
| style=&amp;quot;width:12%&amp;quot; | 5&lt;br /&gt;
| style=&amp;quot;width:12%&amp;quot; | 4&lt;br /&gt;
| style=&amp;quot;width:12%; background-color:#c0c0c0&amp;quot; | 3&lt;br /&gt;
| style=&amp;quot;width:12%; background-color:#c0c0c0&amp;quot; | 2&lt;br /&gt;
| style=&amp;quot;width:12%; background-color:#c0c0c0&amp;quot; | 1&lt;br /&gt;
| style=&amp;quot;width:12%; background-color:#c0c0c0&amp;quot; | 0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
| SE&lt;br /&gt;
| SM2&lt;br /&gt;
| SM1&lt;br /&gt;
| SM0&lt;br /&gt;
| style=&amp;quot;background-color:#c0c0c0&amp;quot; | ISC11&lt;br /&gt;
| style=&amp;quot;background-color:#c0c0c0&amp;quot; | ISC10&lt;br /&gt;
| style=&amp;quot;background-color:#c0c0c0&amp;quot; | ISC01&lt;br /&gt;
| style=&amp;quot;background-color:#c0c0c0&amp;quot; | ISC00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Bit 7 - SE: Sleep Enable&lt;br /&gt;
:Mit diesem Bit wird bestimmt ob der Sleep-Befehl ausgeführt wird (1) oder nicht (0).&lt;br /&gt;
&lt;br /&gt;
;Bit 6..4 - SM2..0: Sleep Mode Select&lt;br /&gt;
:Mit diesen drei Bits wird der gewünschte Sleep-Modus gewählt&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! SM2&lt;br /&gt;
! SM1&lt;br /&gt;
! SM0&lt;br /&gt;
! style=&amp;quot;text-align:left&amp;quot; | Sleep Modus&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Idle&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | ADC Noise Reduction&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Power-down&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Power-save&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Reserved&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Reserved&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Standby&amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Extended Standby&amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt; Nur verfügbar mit externem Taktgeber&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Modi Übersicht====&lt;br /&gt;
&lt;br /&gt;
Generell ist der Modus zu wählen, der die meisten nicht benötigten Module abschaltet.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&lt;br /&gt;
! colspan=&amp;quot;5&amp;quot; | Aktive Takte &lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | Aktive Oszillatoren&lt;br /&gt;
! colspan=&amp;quot;6&amp;quot; | Weckquellen&lt;br /&gt;
|- style=&amp;quot;background-color:#f0f0f0&amp;quot;&lt;br /&gt;
| Sleep Modus&lt;br /&gt;
| clk&amp;lt;sub&amp;gt;CPU&amp;lt;/sub&amp;gt;&lt;br /&gt;
| clk&amp;lt;sub&amp;gt;FLASH&amp;lt;/sub&amp;gt;&lt;br /&gt;
| clk&amp;lt;sub&amp;gt;IO&amp;lt;/sub&amp;gt;&lt;br /&gt;
| clk&amp;lt;sub&amp;gt;ADC&amp;lt;/sub&amp;gt;&lt;br /&gt;
| clk&amp;lt;sub&amp;gt;ASY&amp;lt;/sub&amp;gt;&lt;br /&gt;
| Haupttaktgeber&lt;br /&gt;
| Timer Oszillator&lt;br /&gt;
| INT2&amp;lt;br /&amp;gt;INT1&amp;lt;br /&amp;gt;INT0&lt;br /&gt;
| TWI Address Match&lt;br /&gt;
| Timer2&lt;br /&gt;
| SPM/EEPROM Ready&lt;br /&gt;
| ADC&lt;br /&gt;
| Andere I/O&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Idle&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | ADC Noise Reduction&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&amp;lt;sup&amp;gt;(3)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Power-down&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| x&amp;lt;sup&amp;gt;(3)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Power-save&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| x&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
| x&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&amp;lt;sup&amp;gt;(3)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&lt;br /&gt;
| x&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Standby&amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| x&lt;br /&gt;
| &lt;br /&gt;
| x&amp;lt;sup&amp;gt;(3)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Extended Standby&amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| x&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&lt;br /&gt;
| x&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&amp;lt;sup&amp;gt;(3)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&lt;br /&gt;
| x&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt; Nur verfügbar bei externer Taktquelle&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt; Wenn AS2-Bit in ASSR-Register gesetzt&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;(3)&amp;lt;/sup&amp;gt; Nur INT2 oder Level Interrupt INT1 und INT0&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manuelles Deaktivieren ===&lt;br /&gt;
Einzelne Module können auch manuell deaktviert werden um Strom zu sparen, das bietet sich vorallem an wenn bestimmte Module im gegebenen Projekt generell nicht benötigt werden und damit deaktiviert werden können.&lt;br /&gt;
&lt;br /&gt;
==== Analog to Digital Converter ====&lt;br /&gt;
todo...&lt;br /&gt;
&lt;br /&gt;
==== Analog Comparator ====&lt;br /&gt;
Der Analogkomparator ist standardmäßig aktiviert. Um ihn zu deaktivieren, muss man ACD (Bit 7) im Register ACSR setzen.&lt;br /&gt;
&lt;br /&gt;
==== Brown-Out Detector ====&lt;br /&gt;
Der Brown-Out Detector lässt sich entweder durch das BODEN-Bit in den Fuses oder mit entsprechenden Befehlen aktivieren oder deaktivieren. Das Fuse-Bit ist standardmäßig gesetzt (Achtung: Umgekehrte Logik!) und der BOD damit deaktiviert.&lt;br /&gt;
&lt;br /&gt;
==== Watchdog ====&lt;br /&gt;
Auch der Watchdog-Timer lässt sich in den Fuses standardmäßig aktivieren/deaktivieren, hier über das WDTON-Bit.&lt;br /&gt;
Natürlich geht auch das softwareseitig [http://www.mikrocontroller.net/articles/AVR-Tutorial:_Watchdog]&lt;br /&gt;
&lt;br /&gt;
== Praxis ==&lt;br /&gt;
&lt;br /&gt;
=== Assembler ===&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; ASM-Quellcode Beispiele&lt;br /&gt;
&lt;br /&gt;
=== C ===&lt;br /&gt;
&lt;br /&gt;
Ein simples Testprogramm, um mit sleep modi im AVR zu spielen. Es funktioniert sehr gut mit dem ATmega8 und ist auch auf andere AVRs portierbar. Teilweise sind weitere Modi verfügbar.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist, daß die Interruptroutine für den &amp;quot;Weckruf&amp;quot; vorhanden sein muss. Es müssen nicht zwingend Aktionen in ihr durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/* ATmega8 with internal 4Mhz clock (6cycle + 64ms) */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/sleep.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
   DDRC |= (1 &amp;lt;&amp;lt; PC2) | (1 &amp;lt;&amp;lt; PC1); // leds for testing&lt;br /&gt;
&lt;br /&gt;
   DDRD &amp;amp;= ~(1 &amp;lt;&amp;lt; PD2); // INT0: input...&lt;br /&gt;
   PORTD |= (1 &amp;lt;&amp;lt; PD2); // ...with pullup.&lt;br /&gt;
&lt;br /&gt;
   // level interrupt INT0 (low level)&lt;br /&gt;
   MCUCR &amp;amp;= ~((1 &amp;lt;&amp;lt; ISC01) | (1 &amp;lt;&amp;lt; ISC00));&lt;br /&gt;
&lt;br /&gt;
   // infinite main loop&lt;br /&gt;
   while (1)&lt;br /&gt;
   {&lt;br /&gt;
      // trigger leds for testing&lt;br /&gt;
      PORTC ^= (1 &amp;lt;&amp;lt; PC1);&lt;br /&gt;
      _delay_ms(500);&lt;br /&gt;
      PORTC ^= (1 &amp;lt;&amp;lt; PC1);&lt;br /&gt;
&lt;br /&gt;
      // enable external interrupt&lt;br /&gt;
      GICR |= (1 &amp;lt;&amp;lt; INT0);&lt;br /&gt;
&lt;br /&gt;
      // set sleep mode&lt;br /&gt;
      set_sleep_mode(SLEEP_MODE_PWR_DOWN);&lt;br /&gt;
&lt;br /&gt;
      // sleep_mode() has a possible race condition&lt;br /&gt;
      sleep_enable();&lt;br /&gt;
      sei();&lt;br /&gt;
      sleep_cpu();&lt;br /&gt;
      sleep_disable();&lt;br /&gt;
&lt;br /&gt;
      // waking up...&lt;br /&gt;
      // disable external interrupt here, in case the external low pulse is too long&lt;br /&gt;
      GICR &amp;amp;= ~(1 &amp;lt;&amp;lt; INT0);&lt;br /&gt;
&lt;br /&gt;
      // disable all interrupts&lt;br /&gt;
      cli();&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ISR(INT0_vect)&lt;br /&gt;
{&lt;br /&gt;
   // ISR might be empty, but is necessary nonetheless&lt;br /&gt;
   PORTC ^= (1 &amp;lt;&amp;lt; PC2); // debugging&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quellen ==&lt;br /&gt;
[http://www.atmel.com/dyn/resources/prod_documents/doc2503.pdf ATMEL AVR ATmega32 Datenblatt]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{{Navigation_zurückhoch|&lt;br /&gt;
zurücktext=Power Management|&lt;br /&gt;
zurücklink=AVR-Tutorial: Power Management|&lt;br /&gt;
hochtext=Inhaltsverzeichnis|&lt;br /&gt;
hochlink=AVR-Tutorial}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: AVR-Tutorial|Power Management]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Equipment&amp;diff=77884</id>
		<title>AVR-Tutorial: Equipment</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Equipment&amp;diff=77884"/>
		<updated>2013-08-05T13:33:59Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Literatur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AVR-Tutorial - Benötigte Ausrüstung =&lt;br /&gt;
==Hardware==&lt;br /&gt;
&lt;br /&gt;
Ein Mikrocontroller alleine ist noch zu nichts nützlich. Damit man etwas damit anfangen kann, braucht man eine Schaltung, in die der Controller eingesetzt wird. Dazu werden bei Elektronikhändlern Platinen angeboten, die alles nötige (Taster, LEDs, Steckverbinder...) enthalten. Häufig enthalten diese Platinen nicht nur Platz für den Mikroprozessor, sondern auch einen ISP-Programmierer (Näheres dazu später)&lt;br /&gt;
&lt;br /&gt;
Da es eine Unmenge verschiedener Mikrocontroller allein aus der AVR-Familie gibt, ist der Anfänger mit der Auswahl bereits überfordert. Dieses Tutorial (und viele andere auch) beginnt mit dem &#039;&#039;mittelgroßen&#039;&#039; Controller &#039;&#039;&#039;ATmega8&#039;&#039;&#039;. Die 8 steht für 8 Kilobyte Flash-Speicher. Er gilt als ideal für Einsteiger, und auch von „alten Hasen“ wird dieser Typ gern verwendet. Es gibt ihn im 28-poligen DIL-Gehäuse, ideal für Bastelschaltungen auf dem Steckbrett, als auch in verschiedenen SMD-Gehäusen, wenn das Endgerät klein werden soll.&lt;br /&gt;
&lt;br /&gt;
=== Fertige Evaluations-Boards und Starterkits ===&lt;br /&gt;
&lt;br /&gt;
==== AVR Starterkit aus dem Mikrocontroller.net-Shop ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Damit der Programmer mit AS5.x zusammen arbeitet, muss die Firmware aktualisiert werden: http://www.usbprog.org/index.php/Firmwares (siehe Update Hinweis)&lt;br /&gt;
&lt;br /&gt;
Sehr gut für dieses Tutorial geeignet ist das [http://shop.embedded-projects.net/index.php?module=artikel&amp;amp;action=artikel&amp;amp;id=108 AVR-Starterkit aus dem Mikrocontroller.net-Shop]. Das Kit enthält eine Platine mit dem Controller ATmega8, einen USB-ISP-Programmieradapter und ein Steckernetzteil. Die im Starterkit enthaltene [http://www.eproo.de/index.php?module=artikel&amp;amp;action=artikel&amp;amp;id=74 AVR Entwicklungsplatine für 28-pol. AVRs] gibt es auch einzeln. Diese enthält eine Fassung für den Controller, einen Spannungswandler, die Beschaltung für die serielle Schnittstelle und einen Anschluss für den Programmieradapter. Die restliche Hardware wie LEDs und Taster kann man sich selber nach Belieben auf das Lochrasterfeld löten.&lt;br /&gt;
&lt;br /&gt;
==== STK500 ====&lt;br /&gt;
[[Bild:Stk500.jpg|right]]&lt;br /&gt;
Das STK500 ist das Standard-Board für AVR Entwicklung, direkt von Atmel. Es enthält auch einen ISP-Programmer und ist fertig aufgebaut. Es ist unter Entwicklern sehr beliebt und wird natürlich von Atmel unterstützt. Es gilt allgemein als gute Investition, wenn man ernsthaft in das Thema einsteigen möchte.&lt;br /&gt;
&lt;br /&gt;
Das STK500 kostet bei Reichelt ca. 80 Euro (ein geeignetes Netzteil muss zusätzlich erworben werden).&lt;br /&gt;
&lt;br /&gt;
==== Pollin ATMEL Evaluations-Board Version 2.x ====&lt;br /&gt;
&lt;br /&gt;
Bei Pollin Elektronik gibt es für ca. 15 Euro ein Evaluations-Board als Bausatz zum Selbstlöten. Im Bausatz sind die Aufbauanleitung, die Platine und Bauteile enthalten. Der/die Mikrocontroller und eine Stromversorgung müssen separat beschafft werden. Auf dem Board ist ein einfacher ISP-Programmer (serielles &#039;&#039;bit-banging&#039;&#039;) integriert. &lt;br /&gt;
&lt;br /&gt;
Siehe: &lt;br /&gt;
* [[Pollin ATMEL Evaluations-Board]]&lt;br /&gt;
* http://www.pollin.de&lt;br /&gt;
&lt;br /&gt;
==== Pollin Funk-AVR-Evaluationsboard v1.x ====&lt;br /&gt;
&lt;br /&gt;
Bei diesem Board besteht die Möglichkeit, Funkmodule wie das [[RFM12]], RFM01 oder RFM02 auf dem Board aufzulöten.&lt;br /&gt;
&lt;br /&gt;
Siehe: &lt;br /&gt;
* [[Pollin Funk-AVR-Evaluationsboard]]&lt;br /&gt;
* [http://www.pollin.de http://www.pollin.de]&lt;br /&gt;
&lt;br /&gt;
==== Rumpus Board von lochraster.org ====&lt;br /&gt;
&lt;br /&gt;
Lochraster.org bietet ein Entwicklungsboard namens Rumpus an. Es kommt als Bausatz mit allen Teilen und Microcontroller (Atmega 168), auf dem Microcontroller ist bereits ein USB Bootloader installiert so dass man nach dem Zusammenbau sofort starten kann. Das Board wird direkt über USB mit Strom versorgt und auch über USB programmiert, es kann auch selbst als Programmer für AVR Microcontroller benutzt  werden. Das Board ist mit recht umfangreicher Peripherie ausgestattet, so das sich von sehr einfachen Anwendungen wie dem Blinken einer LED bis hin zu komplexen Aufgaben wie senden und empfangen von Infrarot Signalen eine Vielzahl von Anwendungen realisieren lassen. Mit 45 Euro gehört es sicher nicht zu den ganz billigen Einsteigerboards, für den ambitionierten Amateur bietet die reichhaltige Peripherie den Vorteil, das Board während des gesamten Lernprozesses zu nutzen ohne für die Realisierung komplexerer Aufgaben neue Hardware auflöten zu müssen. Auch relativiert sich dieser Preis wieder dadurch, dass kein ISP Programmer benötigt wird. Beim Umstieg auf ein anderes Board, für welches man dann einen ISP Programmer benötigt, kann der Rumpus diese Aufgabe übernehmen anstatt zum alten Eisen geworfen zu werden (s. Infos im [http://www.mikrocontroller.net/topic/217122#2165435 Forumbeitrag von Sebastian Noack]).&lt;br /&gt;
&lt;br /&gt;
Weitere Infos unter http://www.lochraster.org/ und http://wiki.lochraster.org/&lt;br /&gt;
&lt;br /&gt;
==== RN-Control ====&lt;br /&gt;
&lt;br /&gt;
Die Forengemeinde von Roboternetz hat ebenfalls ein Evaluierungsboard entwickelt, das mittlerweile sehr ausgereift ist und viele Erweiterungsmöglichkeiten bietet.&lt;br /&gt;
&lt;br /&gt;
Siehe:&lt;br /&gt;
* [http://robotikhardware.de/ http://robotikhardware.de/]&lt;br /&gt;
* [http://www.roboternetz.de/ http://www.roboternetz.de/]&lt;br /&gt;
&lt;br /&gt;
==== Arduino ====&lt;br /&gt;
Die Boards der [http://www.arduino.cc Arduino-Familie] bieten z.B. einen ATmega328P mit 16MHz und lassen sich über einen integrierten USB-seriell-Wandler und [[Bootloader]] programmieren. Die Ports sind auf Buchsenleisten herausgeführt. Arduino-Boards können auch unabhängig von der Arduino-Entwicklungsumgebung (Arduino-IDE) als AVR-Entwicklungsboard genutzt werden.&lt;br /&gt;
&lt;br /&gt;
==== Andere ====&lt;br /&gt;
&lt;br /&gt;
Das Angebot an AVR-Evaluationboards, -Experimentierplatinen, -Entwicklerplatinen oder wie die jeweiligen Hersteller ihre Produkte auch immer bezeichnen, ist mittlerweile recht groß geworden. Sie alle zu bewerten ist unmöglich geworden.&lt;br /&gt;
&lt;br /&gt;
===Selbstbau===&lt;br /&gt;
&lt;br /&gt;
Ein fertiges Board ist gar nicht nötig, man kann die benötigte Schaltung auch selbst auf einem kleinen Steckbrett oder einer Lochrasterplatine aufbauen. So kompliziert wie das STK500 wird es nicht, es reichen eine Handvoll Bauteile. Wie man das macht, wird im Folgenden beschrieben.&lt;br /&gt;
Steckbretter (Breadboards) gibt&#039;s z.&amp;amp;nbsp;B. bei [http://www.reichelt.de Reichelt],  [http://www.conelek.com/Steckplatinen ConeleK], [http://www.elv.de/ ELV] oder [http://www.conrad.de/ Conrad]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mega8_Tutorial.png|center|framed| Die Grundschaltung eines ATmega8/ATmega8A.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG:&#039;&#039;&#039; Die Pinbelegung der 6-poligen ISP-Verbindung weicht von den ATMEL Angaben ab! Wenn ATMEL oder ATMEL-kompatible ISP-Adapter benutzt werden, die Pinbelegung aus [http://www.atmel.com/dyn/resources/prod_documents/doc2521.pdf AVR042] (PDF) bzw. [[AVR_In_System_Programmer#Pinbelegung]] benutzen]]&lt;br /&gt;
&lt;br /&gt;
Über den Takteingang &#039;&#039;&#039;XTAL1&#039;&#039;&#039; ist der Mikrocontroller mit dem &#039;&#039;&#039;Quarzoszillator&#039;&#039;&#039; verbunden, der den benötigten Takt von 4 MHz liefert (siehe unten). Achtung: die Pins werden, wenn man den Oszillator mit der Schrift nach oben vor sich liegen hat, von unten links aus abgezählt. Unten links ist Pin 1, unten rechts Pin 7, oben rechts Pin 8 und oben links Pin 14 (natürlich hat der Oszillator nur 4 Pins. Die Nummerierung kommt daher, dass bei einem normalen IC dieser Größe an den gleichen Positionen die Pins Nr. 1, 7, 8 und 14 wären). Zu den Pins Datenblatt beachten [http://www.mikrocontroller.net/topic/204429#2015503].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PD0-PD7&#039;&#039;&#039; und &#039;&#039;&#039;PB0-PB5&#039;&#039;&#039; sind die &#039;&#039;&#039;IO-Ports&#039;&#039;&#039; des Mikrocontrollers. Hier können Bauteile wie LEDs, Taster oder LCDs angeschlossen werden.&lt;br /&gt;
Der &#039;&#039;&#039;Port C (PC0-PC5)&#039;&#039;&#039; spielt beim Atmega8 eine Sonderrolle: mit diesem Port können Analog-Spannungen gemessen werden. Aber dazu später mehr!&lt;br /&gt;
An &#039;&#039;&#039;Pin 17-19&#039;&#039;&#039; ist die Stiftleiste zur Verbindung mit dem ISP-Programmer angeschlossen, über den der AVR vom PC programmiert wird (Achtung: Pins in Abbildung entsprechen nicht der Belegung des AVRISP mkII. Die korrekte Pin-Belegung kann im Handbuch des AVRISP mkII eingesehen werden).&lt;br /&gt;
Die Resetschaltung, bestehend aus &#039;&#039;&#039;R1&#039;&#039;&#039; und &#039;&#039;&#039;C1&#039;&#039;&#039;, sorgt dafür, dass der Reseteingang des Controllers standardmäßig auf Vcc=+5V liegt.&lt;br /&gt;
Zum Programmieren zieht der ISP-Adapter die Resetleitung auf Masse (GND), die Programmausführung wird dadurch unterbrochen und der interne Speicher des Controllers kann neu programmiert werden.&lt;br /&gt;
Zwischen Vcc und GND kommen noch jeweils ein 100nF Keramik- oder Folienkondensator C3 und C4, um Störungen in der Versorgungsspannung zu unterdrücken. Diese [[Kondensator#Entkoppelkondensator | Abblockkondensatoren]] sollten so nah wie möglich am Controller platziert werden. An den Ausgang ARef wird ebenfalls ein 100nF Kondensator angeschlossen. Dieser wird allerdings erst benötigt, wenn der Analog/Digital Konverter des µC in Betrieb genommen wird.&lt;br /&gt;
&lt;br /&gt;
Für den Anschluss des ISP-Programmiergerätes kann man im Grunde jede beliebige Pin-Belegung des ISP Steckers benutzen, solange nur alle benötigten Leitungen mit dem Programmiergerät verbunden sind. In der Praxis haben sich allerdings bestimmte Belegungen durchgesetzt. Im Schaltbild ist eine &#039;&#039;&#039;eigene&#039;&#039;&#039; Belegung des 6-poligen Steckers gezeigt. Die alternative Pinbelegung eines 2-reihigen/10-poligen Steckers ist eine übliche Belegung. Benutzt man so eine übliche Belegung, so reicht normalerweise ein 10-poliges Flachbandkabel, um den vorhandenen ISP-Programmer so mit der Schaltung zu verbinden, dass alle Signale am richtigen Prozessorpin ankommen. Siehe auch [[AVR_In_System_Programmer]].&lt;br /&gt;
&lt;br /&gt;
Hier die Liste der benötigten Bauteile: &lt;br /&gt;
&lt;br /&gt;
* R1         Widerstand 10 kOhm&lt;br /&gt;
* C1         Keramikkondensator 47 nF&lt;br /&gt;
* C2, C3, C4 Keramik- oder Folienkondensator 100 nF&lt;br /&gt;
*            Stiftleiste 6-polig&lt;br /&gt;
*            Mikrocontroller ATmega8 oder ATmega8A (kann u.a. auf [http://shop.mikrocontroller.net/ http://shop.mikrocontroller.net/] bestellt werden)&lt;br /&gt;
*            Quarzoszillator 4 MHz&lt;br /&gt;
&lt;br /&gt;
Beim Steckbrett ist darauf zu achten, dass man die parallellaufenden Schienen für GND (blau) und Vcc (rot) jeweils mit Drähten verbindet (nicht Vcc und GND miteinander!).&lt;br /&gt;
&lt;br /&gt;
Eine Zusammenstellung der benötigten Bauteile befindet sich in der [[AVR-Tutorial_Bestellliste|Bestellliste]].&lt;br /&gt;
&lt;br /&gt;
Eine weitere Beschreibung für ein Minimalsystem gibt es [http://conelek.org/Mikrocontroller_Minimalsystem_mit_AVR_ATMega8 hier.]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 1px solid grey; padding: 1ex; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ergänzende Hinweise zur Taktversorgung (kann übersprungen werden) ===&lt;br /&gt;
&lt;br /&gt;
Ein Mikrocontroller benötigt, wie jeder Computer, eine Taktversorgung. Der Takt ist notwendig, um die internen Abläufe im Prozessor in einer zeitlich geordneten Reihenfolge ausführen zu können. Die Frequenz des Taktes bestimmt im Wesentlichen, wie schnell ein Mikrocontroller arbeitet. Bei einem ATMega8 gibt es viele Möglichkeiten zur Taktversorgung, die Wichtigsten sollen hier gezeigt werden.&lt;br /&gt;
&lt;br /&gt;
* interner RC-Oszillator, das ist der Auslieferungszustand&lt;br /&gt;
* Keramikresonator&lt;br /&gt;
* Quarz&lt;br /&gt;
* Quarzoszillator&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Vergleich der AVR-Taktquellen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Typ || Genauigkeit || Vorteile || Nachteile&lt;br /&gt;
|-&lt;br /&gt;
| interner&amp;lt;br&amp;gt;RC-Oszillator || 1-5% || Xtal1/2 Pins verfügbar&amp;lt;br&amp;gt;kostenlos&amp;lt;br&amp;gt;kein Platzbedarf&amp;lt;br&amp;gt;schnellstes Einschwingen (wenige Takte) || ungenau&amp;lt;br&amp;gt;Betrieb der [[UART]] riskant&lt;br /&gt;
|-&lt;br /&gt;
| Keramikresonator || 0,5-1% || ausreichend genau für [[UART]]&amp;lt;br&amp;gt;in sehr hohen Stückzahlen billiger als Quarz&amp;lt;br&amp;gt;schnelleres Einschwingen als Quarz (ca. 1ms) || XTAL1/2 Pins nicht verfügbar&amp;lt;br&amp;gt;Platzbedarf&lt;br /&gt;
|-&lt;br /&gt;
| Quarz || 10-100ppm || sehr genau&amp;lt;br&amp;gt;temperaturstabil || XTAL1/2 Pins nicht verfügbar&amp;lt;br&amp;gt;Platzbedarf&amp;lt;br&amp;gt;Kosten bei sehr hohen Stückzahlen (1000++)&amp;lt;br&amp;gt;langsames Anschwingen (ca. 10ms)&amp;lt;br&amp;gt;2 zusätzliche Ballast-Kondensatoren typ. 22 pF&lt;br /&gt;
|-&lt;br /&gt;
| Quarzoszillator || 1-100ppm || hochgenau&amp;lt;br&amp;gt;sehr temperaturstabil&amp;lt;br&amp;gt;liefert selbst ein Signal, kann dadurch [[AVR_Fuses#Taktquellen_Fuse_Einstellung | verfuste AVRs]] retten&amp;lt;br&amp;gt;kann mehrere Takteingänge treiben || XTAL1 Pin nicht verfügbar&amp;lt;br&amp;gt;Platzbedarf&amp;lt;br&amp;gt;Kosten bei sehr hohen Stückzahlen (1000++)&amp;lt;br&amp;gt;langsames Anschwingen (ca. 10ms)&lt;br /&gt;
|}&lt;br /&gt;
1ppm = 0,0001% (engl. one &#039;&#039;&#039;p&#039;&#039;&#039;art &#039;&#039;&#039;p&#039;&#039;&#039;er &#039;&#039;&#039;m&#039;&#039;&#039;illion, der millionste Teil) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;FF0000&amp;quot;&amp;gt;Achtung: Ein ATMega8 wird mit aktiviertem internen RC-Oszillator ausgeliefert. Um eine andere Taktquelle zu aktivieren, müssen die [[AVR Fuses#Taktquellen Fuse Einstellung|AVR Fuses]] des Prozessors verändert werden. Das muss jedoch sehr vorsichtig gemacht werden, siehe Artikel.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Keramikresonator ====&lt;br /&gt;
&lt;br /&gt;
Die Anbindung des Keramikresonators sieht so aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Resonator.png|framed|center| Resonator Standardbeschaltung]]&lt;br /&gt;
&lt;br /&gt;
Es werden keine Kondensatoren benötigt, diese sind schon eingebaut, daher ist der Anschluss eines Keramikschwingers kinderleicht. Achtung: Keramikresonatoren gibt es mit zwei oder drei Pins. Nur die mit drei Pins besitzen interne Kondensatoren.&lt;br /&gt;
&lt;br /&gt;
==== Quarz ====&lt;br /&gt;
&lt;br /&gt;
Die Anbindung des Quarzes sieht so aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:tutorial-quarz-schaltplan.png|center|framed| Quarz Standardbeschaltung]]&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren &#039;&#039;&#039;C3&#039;&#039;&#039; und &#039;&#039;&#039;C4&#039;&#039;&#039; sind zum Betrieb des Quarzes notwendig. Ihre Größe ist abhängig von den Daten des Quarzes. Zur Berechnung ihrer Größe gibt es die folgende Formel:&lt;br /&gt;
&lt;br /&gt;
C=2xCL-(CP+CI)&lt;br /&gt;
&lt;br /&gt;
* CP: Leiterbahnen bedingte Kapazität&lt;br /&gt;
* CI: Portbedingte Kapazität&lt;br /&gt;
* CL: Datenblatt des Quarzes&lt;br /&gt;
CP+CI ca. 5pF ?&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von CL = 32pF:&lt;br /&gt;
&lt;br /&gt;
C = 2x32pF-5pF = 59pF&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Spannungsversorgung ===&lt;br /&gt;
&lt;br /&gt;
Die Versorgungsspannung &#039;&#039;&#039;U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt;&#039;&#039;&#039; beträgt 5V und kann z.&amp;amp;nbsp;B. mit der in diesem Kapitel beschriebenen Schaltung erzeugt werden. Falls zum Programmieren des Mikrocontrollers ein [[AVR_In_System_Programmer|ISP-Programmiergerät]] verwendet wird, das an die USB-Schnittstelle angeschlossen ist, kann man die Schaltung auch darüber mit Strom versorgen und dieses Kapitel überspringen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:V_Regler.gif|framed|center|Standard-Netzteilbeschaltung eines 7805]]&lt;br /&gt;
&lt;br /&gt;
Bauteile:&lt;br /&gt;
* IC1: 5V-Spannungsregler 7805&lt;br /&gt;
* C1: Elko 10µF (Polung beachten!)&lt;br /&gt;
* C2,C3: 2x Kondensator 100nF (kein Elektrolyt)&lt;br /&gt;
* D1: Diode 1N4001&lt;br /&gt;
&lt;br /&gt;
Hauptelement der Schaltung ist das IC 7805. Seine Aufgabe ist es aus der Versorgungsspannung stabile 5 V zu erzeugen. Dieses IC gibt es seit vielen Jahren und wird von vielen Chipherstellern produziert. Er stellt die einfachste Möglichkeit dar, aus einer vorhandenen Gleichspannung definierte 5 V zu erzeugen. Den 7805 gibt es in verschiedenen Ausführungen, was seine maximale Strombelastung angeht. Für die Zwecke dieses Tutorials ist die Standard-Variante, welche maximal 1 A abgeben kann, völlig ausreichend. Der 7805 enthält eine Übertemperatursicherung, so dass er abschaltet, wenn es ihm zu heiß wird. Auch ansonsten ist dieser Spannungsregler-IC kaum kaputt zu bekommen.&lt;br /&gt;
&lt;br /&gt;
Die beiden 100-nF-Kondensatoren haben die Aufgabe, eine mögliche Schwingneigung des 7805 zu unterdrücken. Sie müssen so nahe wie möglich an den Anschlusspins des 7805 angeschlossen werden, um ihre Wirkung zu entfalten.&lt;br /&gt;
&lt;br /&gt;
An den Eingang (+ und – im Schaltplan) wird ein Steckernetzteil mit einer Spannung von 7 .. 12 V angeschlossen. Der 7805 benötigt an seinem Eingang eine Gleichspannung, die mindestens 7 V beträgt. Auf der anderen Seite ergibt es auch keinen Sinn, wesentlich über 12 V Eingangsspannung hinauszugehen. Der 7805 ist ein Linearregler. Salopp gesagt, wird die überschüssige Spannung in Form von Wärme vernichtet. Deshalb die Kühlfahne zum thermischen Anschluss an eine Wärmesenke. Liegt die Eingangsspannung weit über 12 V, so wird schon wesentlich mehr Energie in Form von Wärme umgesetzt, als am Ausgang entnommen werden kann. Mal ganz davon abgesehen, dass der 7805 davon brennend heiß wird. Je nach Strombedarf der Gesamtschaltung kann es zweckmäßig sein, einen Schaltregler vorzusehen, wenn die Eingangsspannung stark schwanken kann, etwa für die alternative Speisung mit 24 V aus einem Schaltschrank oder dem LKW-Bordnetz. Für Anfänger führt das zu weit, und ein Kühlblech am 7805 tut es dann auch.&lt;br /&gt;
&lt;br /&gt;
Hier ein paar kleine Rechenbeispiele:&lt;br /&gt;
12 V Eingangsspannung – 5 V Ausgangsspannung = 7 V Differenz x 0,1 A Strombedarf der Schaltung ergibt die Verlustwärme die abgeführt werden muss.&lt;br /&gt;
&lt;br /&gt;
7 V × 0,1 A = 0,7 Watt&lt;br /&gt;
&lt;br /&gt;
Wenn man jetzt eine Eingangsspannung von 7 V nimmt, so dass die Mindestdifferenz von 2V noch eingehalten wird kommen wir zu diesen Werten&lt;br /&gt;
&lt;br /&gt;
2 V ×  0,1 A = 0,2 Watt Abwärme&lt;br /&gt;
2 V × 0,35 A = 0,7 Watt Abwärme oder anders gesagt, können wir der Schaltung 350 mA entnehmen und haben die gleiche Abwärme wie im oberen Beispiel mit nur 100 mA Stromentnahme.&lt;br /&gt;
&lt;br /&gt;
Man sieht, dass man die Eingangsspannung so klein wie möglich wählen sollte um dadurch die Verluste in Grenzen halten zu können. Außerdem ist es meist so, dass für eine geringere Stromentnahme auch eine niedrigere Differenzspannung ausreicht. In manchen Datenblätter ist z.B. angegeben 0,5 A = 1 V Spannungsgefälle und bei 1 A = 2 V Gefälle …&lt;br /&gt;
&lt;br /&gt;
Weiterhin sei gesagt, dass es so genannte Low-Drop-, Ultra-Low-Drop- usw. -Regler gibt, die mit einer viel kleineren Differenz zwischen Ein- und Ausgangsspannung zurechtkommen, wodurch man die Verluste noch weiter drücken kann.&lt;br /&gt;
&lt;br /&gt;
Eine Stromversorgung mit Batterien ist grundsätzlich auch möglich, wenn die elektrischen Grenzdaten des Mikrocontrollers eingehalten werden (max. Spannung, min. Spannung). Bei der geregelten Stromversorgung oben sollte die Batteriespannung ca. 1,5 .. 2,5 V (Dropout-Spannung des Linearreglers) größer sein als die Versorgungsspannung des Controllers. Die [[Versorgung aus einer Zelle]] ist ein Thema für Fortgeschrittene. In der Regel verzichtet man dabei auf die Spannungsregelung, da der Controller in einem weiten Speisespannungsbereich betriebsfähig ist.&lt;br /&gt;
&lt;br /&gt;
=== Beispielhafter Aufbau auf einem [[Steckbrett]] ===&lt;br /&gt;
&lt;br /&gt;
Auf einem [[Steckbrett]] könnte eine Schaltung etwa so aussehen:&lt;br /&gt;
&lt;br /&gt;
[[Bild:tutorial_grundschaltung_breadboard.jpg|600px|center|Steckbrett mit Selbstschaltung Atmega8 und Quarz als externe Taktquelle]]&lt;br /&gt;
&lt;br /&gt;
Hier ist die oben beschriebene Selbstbauschaltung zu sehen.  Spannungsversorgung (links), 6-poliger ISP-Anschluss (rechts hinter dem µC), Quarz mit 2 Kondensatoren statt Oszillator, erweitert um eine LED mit Vorwiderstand an PB0 (rechts vor dem µC), einem Resettaster (links vor dem µC) und einem Stützkondensator zwischen +5V und GND (rechts unten).&lt;br /&gt;
&lt;br /&gt;
=== Der ISP-Programmierer (In-System-Programmer)===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mikrocontroller.gif|framed|right|ISP Programmierer]]&lt;br /&gt;
Dann braucht man nur noch den &#039;&#039;&#039;ISP-Programmieradapter&#039;&#039;&#039;, über den man die Programme vom PC in den Controller übertragen kann. Eine Übersicht über mögliche ISP-Programmer Varianten findet sich im Artikel [[AVR_In_System_Programmer]].&lt;br /&gt;
&lt;br /&gt;
Fertige ISP-Programmer zum Anschluss an den Parallelport oder USB gibt es z.&amp;amp;nbsp;B. auf http://shop.mikrocontroller.net/. &lt;br /&gt;
&lt;br /&gt;
Eine Bauanleitung gibt es u.a. auf [http://www.rn-wissen.de/index.php/AVR-ISP_Programmierkabel http://www.rn-wissen.de/index.php/AVR-ISP_Programmierkabel] oder [http://rumil.de/hardware/avrisp.html http://rumil.de/hardware/avrisp.html].&lt;br /&gt;
&lt;br /&gt;
Den ISP-Adapter schließt man an den Parallelport an und verbindet ihn mit der Stiftleiste SV1 über ein 6-adriges Kabel (siehe Schaltplan).&lt;br /&gt;
&lt;br /&gt;
=== Sonstiges ===&lt;br /&gt;
&lt;br /&gt;
Wer vorausschauend kauft, kauft mehr als einen Mikrocontroller. Bis der erste Controller defekt ist, oder man durch Austauschen sicher gehen möchte, ob der Fehler im Programm oder im Controller ist, vergeht nur wenig Zeit.&lt;br /&gt;
&lt;br /&gt;
Tipp: Die Preise für Mikrocontroller haben eine deutliche Spannweite, nicht selten ist ein und derselbe Typ für 3 oder 8 Euro zu haben. Oft sind neuere oder größere Modelle billiger (ATmega8A statt ATmega8, ATmega328 statt ATmega8A). Eine Suche im Internet lohnt sich. Das Gleiche gilt für den Kauf von ISP-Programmierern.&lt;br /&gt;
&lt;br /&gt;
Für weitere Kapitel dieses Tutorials sollte man sich noch die folgenden Bauteile besorgen: &lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 2 (I/O-Grundlagen)&lt;br /&gt;
* 6 LEDs 5mm (Standard-LED, ruhig auch in unterschiedlichen Farben, rot/gelb/grün)&lt;br /&gt;
* 5 Taster&lt;br /&gt;
* 6 Widerstände 1k&lt;br /&gt;
* 5 Widerstände 10k&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 6 (LC-Display)&lt;br /&gt;
* 1 Potentiometer 10k&lt;br /&gt;
* 1 HD44780-kompatibles LCD, z.&amp;amp;nbsp;B. 4x20 oder 2x16 Zeichen&lt;br /&gt;
*   besitzt das LCD eine Hintergrundbeleuchtung, dann noch einen Vorwiderstand dafür. Details dazu stehen im Datenblatt des LCD. Ein Wert von 50Ω sollte aber in jedem Fall passen. Schlimmstenfalls ist die Hintergrundbeleuchtung dann etwas zu dunkel.&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 10 (Der UART)&lt;br /&gt;
* 1 Pegelwandler MAX232, MAX232&#039;&#039;&#039;A&#039;&#039;&#039; oder MAX202&lt;br /&gt;
* 5 Kondensatoren&lt;br /&gt;
** Bei einem MAX232: je 1µF Elektrolytkondensator&lt;br /&gt;
** Bei einem MAX202 oder MAX232&#039;&#039;&#039;A&#039;&#039;&#039;: je  100nF Keramik- oder Elektrolytkondensator&lt;br /&gt;
:Die Kondensatoren dürfen auch größer sein. Ist man sich nicht sicher, welchen MAX232 man hat (A oder nicht A), dann die größeren Kondensatoren 1µF nehmen, die funktionieren auch beim MAX232A oder MAX202.&lt;br /&gt;
* 1 9-polige SUBD-Buchse (female)&lt;br /&gt;
* 1 dazu passendes Modem(nicht Nullmodem!)-Kabel&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 14 (ADC)&lt;br /&gt;
* 1 Kondensator 100n&lt;br /&gt;
* 1 Potentiometer 10k&lt;br /&gt;
* nach Lust und Laune temperatur- oder lichtabhängige Widerstände und jeweils einen Widerstand in der gleichen Größenordnung wie der Sensor&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 17 (Schieberegister)&lt;br /&gt;
* 2 Schieberegister 74HC595&lt;br /&gt;
* einige LED, damit man an die Schieberegister auch etwas anschließen kann, samt passenden Vorwiderständen&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 19 (7-Segmentanzeige)&lt;br /&gt;
* 4 7-Segmentanzeigen mit gemeinsamer Anode&lt;br /&gt;
* 4 PNP-Transistoren BC328&lt;br /&gt;
* 4 Widerstände 1k&lt;br /&gt;
* 7 Widerstände 100Ω&lt;br /&gt;
&lt;br /&gt;
Für weitere Bauteile, die man als angehender µC Bastler auch des Öfteren mal benötigt, empfiehlt sich ein Blick in die Liste der [[Standardbauelemente]] bzw. in die [[Absolute_beginner|Grundausstattung]]. Wenn Ihr Händler Großpackungen (zb. 100 Stück) von 100n Kondensatoren, 10k, 1k oder 100Ω Widerständen anbietet, sollten Sie deren Erwerb in Erwägung ziehen. Diese Bauteile benötigt man oft, und derartige Großpackungen sind meist nicht teurer, als wenn man einige wenige Exemplare einzeln kauft. Dies hängt damit zusammen, dass das Herauszählen von 9 Bauteilen für den Verkäufer teurer kommt, als 100 Bauteile abgepackt aus dem Regal zu nehmen.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
In diesem Tutorial wird nur auf die Programmierung in Assembler eingegangen, da Assembler für das Verständnis der Hardware am besten geeignet ist.&lt;br /&gt;
&lt;br /&gt;
=== Assembler ===&lt;br /&gt;
&lt;br /&gt;
Zuerst braucht man einen &#039;&#039;&#039;Assembler&#039;&#039;&#039;, der in Assemblersprache geschriebene Programme in Maschinencode übersetzt. Windows-User können das [http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2725 AVR-Studio] von Atmel verwenden, das neben dem Assembler auch einen Simulator enthält, mit dem sich die Programme vor der Übertragung in den Controller testen lassen; für Linux gibt es [http://www.tavrasm.org/ tavrasm], [http://avra.sourceforge.net/ avra] und [http://avr-asm-tutorial.net/gavrasm/index_de.html gavrasm]. &lt;br /&gt;
&lt;br /&gt;
Um die vom Assembler erzeugte &amp;quot;.hex&amp;quot;-Datei über den ISP-Adapter in den Mikrocontroller zu programmieren, kann man unter Windows z.&amp;amp;nbsp;B. das Programm [http://www.myplace.nu/avr/yaap/ yaap] verwenden, für Linux gibt es [http://savannah.nongnu.org/projects/uisp/ uisp], für beide avrdude.&lt;br /&gt;
&lt;br /&gt;
=== C ===&lt;br /&gt;
Wer in C programmieren möchte, kann den kostenlosen GNU-C-Compiler AVR-GCC (unter Windows &amp;quot;WinAVR&amp;quot;) ausprobieren. Dieser C-Compiler kann auch in das für Assembler-Programmierung notwendige AVR-Studio integriert werden. In der Artikelsammlung gibt es ein umfangreiches [[AVR-GCC-Tutorial|Tutorial]] zu diesem Compiler;&lt;br /&gt;
&lt;br /&gt;
Wer unter Windows und Linux gleichermassen kostenlos entwickeln will, der sollte sich die [http://www.eclipse.org/ IDE Eclipse for C/C++ Developers] und das [http://avr-eclipse.sourceforge.net/wiki/index.php/The_AVR_Eclipse_Plugin AVR-Eclipse Plugin ] ansehen, beide sind unter Windows und Linux einfach zu installieren. Hier wird auch der AVR-GCC benutzt. In der Artikelsammlung gibt es ein umfangreiches [[AVR Eclipse|AVR Eclipse Tutorial]] zu dieser IDE.&lt;br /&gt;
Ebenfalls unter Linux und Windows verfügbar ist die Entwicklungsumgebung [http://www.codeblocks.org/ Code::Blocks] (aktuelle, stabile Versionen sind als Nightly Builds regelmäßig im [http://forums.codeblocks.org/ Forum] verfügbar). Innerhalb dieser Entwicklungsumgebung können ohne die Installation zusätzlicher Plugins &amp;quot;AVR-Projekte&amp;quot; angelegt werden.&lt;br /&gt;
&lt;br /&gt;
Fragen dazu stellt man am besten hier im [http://www.mikrocontroller.net/forum/list-2-1.html GCC-Forum].&lt;br /&gt;
&lt;br /&gt;
=== Pascal ===&lt;br /&gt;
Wer in Pascal programmieren muss, kann [http://www.e-lab.de AVRPascal] ausprobieren.&amp;lt;br&amp;gt; &lt;br /&gt;
Dieser Pascalcompiler ist kostenfrei bis 4kb Code und bietet viele ausgereifte Bibliotheken für Servoansteuerung, Serielle Schnittstellen (COM, TWI, SPI), PWM, Timernutzung, LC-Displays usw.&amp;lt;br&amp;gt; &lt;br /&gt;
Außerdem gibt es eine kostenfreie Version für den Mega8 und den Mega88.&lt;br /&gt;
[http://www.e-lab.de E-LAB].&lt;br /&gt;
&lt;br /&gt;
=== Basic ===&lt;br /&gt;
Auch Basic-Fans kommen nicht zu kurz, für die gibt es z.&amp;amp;nbsp;B. [[Bascom AVR]] ($69, Demo verfügbar) oder das kostenlose [[http://avr.myluna.de LunaAVR]].&lt;br /&gt;
&lt;br /&gt;
=== Forth ===&lt;br /&gt;
Wer einen direkten und interaktiven Zugang zum Controller haben will, sollte sich [http://amforth.sourceforge.net Forth] anschauen. Voraussetzung ist ein serieller Anschluß (Max232), also etwas mehr als die Minimalbeschaltung.&lt;br /&gt;
&lt;br /&gt;
== Bereit für das erste Programm? ==&lt;br /&gt;
&lt;br /&gt;
Zum nächsten Kapitel geht es erst, wenn man Hard- und Software in einer Weise zum Funktionieren gebracht hat, dass:&lt;br /&gt;
* die Programmiersoftware das Programmiergerät erkennt&lt;br /&gt;
* die Programmiersoftware den Mikrocontroller erkennt (alle heute üblichen Controller haben eine typspezifische Selbsterkennung), dazu muss der Controller mit Strom versorgt sein&lt;br /&gt;
* die verwendete Erstell-Software (bspw. der Assembler) aus einem leeren oder Beispiel-Projekt eine Programmier-Datei erstellt (meistens eine .HEX-Datei), die man in die Programmiersoftware laden kann (noch nicht in den Controller programmieren!)&lt;br /&gt;
Diesen arbeitsfähigen Zustand zu erreichen ist im Eigenbau (etwa dem Steckbrett) schwieriger als mit einem Starterkit — und der wichtigste Grund warum viele das Geld für das ansonsten nutzlose Starterkit ausgeben.&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
Bevor man anfängt, sollte man sich die folgenden PDF-Dateien runterladen und zumindest mal reinschauen:&lt;br /&gt;
&lt;br /&gt;
* [http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf Datenblatt des ATmega8 (4,54 MB)]&lt;br /&gt;
* [http://www.atmel.com/dyn/resources/prod_documents/doc0856.pdf Befehlssatz der AVRs (1,27 MB)]&lt;br /&gt;
* oder [http://www.avr-roboter.de/controller/befehle/befehle.html Befehlssatz in deutscher Übersetzung online]&lt;br /&gt;
* oder [http://www.avr-modelleisenbahn.de/atmega8/0-einleitung.htm Datenblatt des ATmega8 in deutscher Übersetzung online]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Datenblatt eines Controllers ist das wichtigste Dokument für einen Entwickler. Es enthält Informationen über die Pinbelegung, Versorgungsspannung, Beschaltung, Speicher, die Verwendung der IO-Komponenten und vieles mehr.&lt;br /&gt;
&lt;br /&gt;
Im Befehlssatz sind alle Assemblerbefehle der AVR-Controllerfamilie aufgelistet und erklärt.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
{{Navigation_hochvor|	 &lt;br /&gt;
hochtext=Inhaltsverzeichnis|	 &lt;br /&gt;
hochlink=AVR-Tutorial|	 &lt;br /&gt;
vortext=I/O Grundlagen|	 &lt;br /&gt;
vorlink=AVR-Tutorial: IO-Grundlagen}}	 &lt;br /&gt;
 &lt;br /&gt;
[[Category:AVR-Tutorial|Equipment]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Versorgung_aus_einer_Zelle&amp;diff=77883</id>
		<title>Versorgung aus einer Zelle</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Versorgung_aus_einer_Zelle&amp;diff=77883"/>
		<updated>2013-08-05T13:17:54Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Step-Up-Schaltregler */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bei batteriebetriebenen Anwendungen stellt sich oft das Problem der Spannungsversorgung. Darauf soll hier näher eingegangen werden.&lt;br /&gt;
&lt;br /&gt;
== Erste Ideen ==&lt;br /&gt;
&lt;br /&gt;
=== 9V-Block mit Linearregler ===&lt;br /&gt;
&lt;br /&gt;
Die erste Idee ist, einen 9V-Block mit dahintergehängtem Linearregler à la 7805 zu verwenden. Dieser Ansatz ist einfach, er hat aber einen sehr schlechten Wirkungsgrad. Bei Abwärtsregelung auf 5V verbrät der Regler immerhin 45% =&amp;gt; 55% Wirkungsgrad, bei 3,3V verbrät er 64% =&amp;gt; nur noch 36% Wirkungsgrad), und auch der Platzbedarf auf der Leiterplatte ist erheblich. Angesichts dessen kann man schon fast vernachlässigen, dass der klassische 7805 ca. 5mA für sich selber braucht. Das ist meist mehr als ein Mikrocontroller! Diesbezüglich besser sind Low Power Linearregler wie z.&amp;amp;nbsp;B. der [http://www.national.com/mpf/LP/LP2950.html LP2950] (ca. 75&amp;amp;mu;A Eigenverbrauch) oder gar ein [http://focus.ti.com/docs/prod/folders/print/tps71501.html TPS715xx] von [http://www.ti.com Texas Instuments], der mit unglaublich geringen 3,2 &amp;amp;mu;A auskommt.&lt;br /&gt;
Statt des Linearreglers könnte man natürlich auch einen Step-Down-Schaltregler benutzen, dann hätte man zumindest einen besseren Wirkungsgrad von 80-90%. Last but not least ist die Energiedichte von 9V-Blocks im Verhältnis zu Mignonzellen eher gering.&lt;br /&gt;
&lt;br /&gt;
http://data.energizer.com/ (Auf Technical Info oben rechts klicken, dann die Batteriefamilie links auswählen, z.&amp;amp;nbsp;B. Alkaline)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! width=&amp;quot;18%&amp;quot; | Batterietyp &lt;br /&gt;
! Volumen&amp;lt;BR&amp;gt;[cm³] &lt;br /&gt;
! Kapazität&amp;lt;BR&amp;gt;[mAh] &lt;br /&gt;
! mittlere&amp;lt;BR&amp;gt;Ausgangs-&amp;lt;BR&amp;gt;spannung [V] &lt;br /&gt;
! Energiegehalt&amp;lt;BR&amp;gt;[mWh] &lt;br /&gt;
! Energiedichte&amp;lt;BR&amp;gt;[mWh/cm³] &lt;br /&gt;
! Masse&amp;lt;BR&amp;gt;[g]&lt;br /&gt;
|-&lt;br /&gt;
|9V Alkaline&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 21,1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 625&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 7&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 4375&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 207&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 45,6&lt;br /&gt;
|-&lt;br /&gt;
|Mono Alkaline [D]&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 56&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 20500&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1,3&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 26650&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 475&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 148&lt;br /&gt;
|-&lt;br /&gt;
|Baby Alkaline [C]&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 26,9&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 8350&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1,3&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 10855&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 404&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 26,2&lt;br /&gt;
|-&lt;br /&gt;
|Mignon Alkaline [AA]&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 8,1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 2850&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1,3&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 3705&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 457&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 23&lt;br /&gt;
|-&lt;br /&gt;
|Micro Alkaline [AAA]&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 3,8&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1250&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1,3&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1625&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 428&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 11,5&lt;br /&gt;
|-&lt;br /&gt;
|Lithiumzelle, 2032&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 240&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 2,9&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 496&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 653&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Vier Mignonzellen mit LowDrop-Linearregler ===&lt;br /&gt;
&lt;br /&gt;
Als weitere Möglichkeit wären vier Mignonzellen (leer 3,6V, voll 6V) mit nachgeschaltetem LowDrop-Linearregler zu verwenden. Wenn die Schaltung mit 3,3V auskommt, dann ist man mit dieser Möglichkeit bestens bedient. Die Batterien können bis zum Ende ausgenutzt werden und der Wirkungsgrad liegt bei ca. 75%.&lt;br /&gt;
Allerdings bleibt ein Nachteil wenn man 5V braucht: Die Batterien werden nicht einmal annähernd geleert, weil sie bereits bei 1,25V pro Zelle zusammen gerade noch 5V ergeben, der Regler aber auch gern noch seinen Teil abhaben will (Dropout Voltage). Zu bedenken sind hierbei die Entladekennlinien von Batterien oder noch schlimmer, die von Akkus.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Sparsame Spannungsregler&#039;&#039;&#039;&lt;br /&gt;
!Bezeichnung || Ausgangsspannung [V] || Stromverbrauch [µA] || DropOut @ 50/150/250mA [mV] || Lieferant&lt;br /&gt;
|-&lt;br /&gt;
|LP2950&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |3 / 3,3 / 5&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |75&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |300 / - / -&lt;br /&gt;
| [[Elektronikversender#Reichelt | Rei]]&lt;br /&gt;
|-&lt;br /&gt;
|LF33&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |3,3&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |500&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |100 / 175 / 250&lt;br /&gt;
| [[Elektronikversender#Reichelt | Rei]]&lt;br /&gt;
|-&lt;br /&gt;
|LF50&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |5&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |500&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |100 / 175 / 250&lt;br /&gt;
| [[Elektronikversender#Reichelt | Rei]]&lt;br /&gt;
|-&lt;br /&gt;
|TPS715xx&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |1,2..5&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |3.2&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |415 / - / -&lt;br /&gt;
| [[Elektronikversender#RS Components | RS]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.robotikhardware.de/download/tps78233.pdf TPS78233]&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |3.3&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |0.42&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |130&lt;br /&gt;
| [[Elektronikversender#Robotikhardware | RH]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|MCP1702&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |1,2..5&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |2&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |15 / 40 / 650&lt;br /&gt;
| [[Elektronikversender#Reichelt | Rei]]&lt;br /&gt;
|-&lt;br /&gt;
|MCP1824&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |0,8..5&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |120&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |30 / 90 / 150&lt;br /&gt;
| [[Elektronikversender#RS Components | RS]]&lt;br /&gt;
|- &lt;br /&gt;
|ZLDO330&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |3,3&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |1000&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |20 / 50 / 85&lt;br /&gt;
| [[Elektronikversender#Reichelt | Rei]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Drei Mignonzellen ohne Spannungsregler ===&lt;br /&gt;
&lt;br /&gt;
Die meisten modernen [[Mikrocontroller]] haben einen sehr breiten Versorgungsspannungsbereich, teilweise von 1,8V bis 5,5V. Daher können sie direkt mit drei in Reihe geschalteten Zellen betrieben werden. Während der Entladung sinkt die Betriebsspannung (3&amp;amp;times;0,8V = 2,4V), was der Mikrocontroller aber verkraftet, sofern er nicht mit maximalem Takt läuft. Wenn man keine weiteren ICs in der Schaltung benötigt oder diese ebenso tolerant bezüglich einer veränderlichen Versorgungsspannung sind, ist diese Methode die einfachste und günstigste (100% Wirkungsgrad). Vor allem wird bei [[Ultra low power | Low Power]] Anwendungen mit [[Sleep Mode]] kein Mikroampere für einen Spannungsregler verschwendet.&lt;br /&gt;
&lt;br /&gt;
=== Lithiumzelle ===&lt;br /&gt;
&lt;br /&gt;
Lithiumzellen haben eine sehr geringe Selbstentladung und eine hohe Spannung von typisch 3V. Damit kann man einen sparsamen Mikrocontroller betreiben. Meist werden diese Zellen für Echtzeituhren und zum Datenerhalt von RAMs genutzt, da hier nur sehr geringe Ströme im Mikroamperebereich benötigt werden. Darauf sind diese Zellen ausgelegt. Aus den meisten kann man nur einige mA entnehmen, bei 10mA und mehr sinkt die verfügbare Kapazität rapide.&lt;br /&gt;
&lt;br /&gt;
Um ein Gerät nur im Notfall mit einer Lithiumzelle zu betreiben (Pufferbetrieb, Netzausfallsicherung), braucht man eine unterbrechungsfreie Umschaltung zwischen Netzteilbetrieb und Batteriebetrieb. Kritisch ist das vor allem für die Lithiumzelle (damit ist kein Lithiumakku gemeint!), da diese nicht aufgeladen werden darf. Sie wird dabei mit heftiger Reaktion zerstört! Eine einfache Schaltung ist die Nutzung von zwei Schottkydioden zur Entkopplung von Batterie und Netzteil, wie es im Artikel &#039;&#039;Speicher&#039;&#039; über  [[Speicher#EEPROM_Schreibzugriffe_minimieren | EEPROM]] gezeigt wird.&lt;br /&gt;
&lt;br /&gt;
Der Nachteil dieser Lösung ist der relativ hohe Spannungsabfall von 300..400mV über den Dioden. Besser ist der Einsatz eines P-Kanal MOSFETs zum Schalten der Batteriespannung. Dadurch kann der Spannungsabfall auf wenige Millivolt gesenkt werden. Die Schaltung dazu ist im diesem [http://www.mikrocontroller.net/topic/72275#591483 Beitrag] zu finden.&lt;br /&gt;
&lt;br /&gt;
== Bessere Lösungsansätze ==&lt;br /&gt;
&lt;br /&gt;
Wie man sehen kann, sind oben dargestellte Methoden nur bedingt zufriedenstellend. Vor allem der Platzbedarf dürfte ein k.-o.-Kriterium sein. Besser wäre es, nur eine oder zwei Zellen zu verwenden.&lt;br /&gt;
&lt;br /&gt;
=== Step-Down-Schaltregler (Abwärtsregler, Tiefsetzsteller) ===&lt;br /&gt;
&lt;br /&gt;
Falls die Batteriespannung auch am Ende der Entladung höher als die Versorgungsspannung ist, bieten sich Step-down Regler an.&lt;br /&gt;
* TPS62056 : U&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt; 2,7 .. 10 V, U&amp;lt;sub&amp;gt;out&amp;lt;/sub&amp;gt;=0,7 .. 6 V, 12 µA Eigenverbrauch, SMD-Gehäuse MSOP10&lt;br /&gt;
* TPS62202 : U&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt; 2,5 .. 6 V, U&amp;lt;sub&amp;gt;out&amp;lt;/sub&amp;gt; 1,8V, 12 µA Eigenverbrauch, SMD-Gehäuse SOT23-5&lt;br /&gt;
&lt;br /&gt;
=== Step-Up-Schaltregler (Aufwärtsregler, Hochsetzsteller) ===&lt;br /&gt;
&lt;br /&gt;
Step-Up-Schaltregler bringen die Spannung, wie der Name schon sagt, &#039;einen Schritt nach oben&#039;. Ideal also, um aus 1,5V oder 3V z.&amp;amp;nbsp;B. 5V zu erzeugen. Desweiteren sind sie auch geeignet, um höhere Ströme (bis 0,5 A, je nach Aufbau und Spule) zu entnehmen. Das Arbeitsprinzip bei Step-Up-Schaltreglern ist immer gleich: Eine Spule wird ständig an- und abgeschaltet und durch Eigeninduktion eine höhere Spannung erzeugt. Um einen Step-Up-Schaltregler aufzubauen, gibt es verschiedene Möglichkeiten:&lt;br /&gt;
&lt;br /&gt;
==== ICs ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* zuverlässig&lt;br /&gt;
* meist wenig Außenbeschaltung nötig&lt;br /&gt;
* geringe Größe, auch der Spule, da hohe Schaltfrequenzen verwendet werden&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* teuer, vor allem die, welche ab 1V arbeiten&lt;br /&gt;
* teilweise schwer zu bekommen&lt;br /&gt;
* benötigen mehr Aufwand für Filterung und Schirmung als Linearregler.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Bauteile]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Schaltregler-ICs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! IC !! Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.tranzistoare.ro/datasheets/2300/57048_DS.pdf LT1073-5] ||1V (1 Zelle) auf 5V, 40mA&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.ortodoxism.ro/datasheets/lineartechnology/lt1301.pdf LT1301] ||2V (2 Zellen) auf 5V oder 12V, 250mA (erhältlich bei Conrad)&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.ortodoxism.ro/datasheets/lineartechnology/lt1302.pdf LT1302] ||2V (2 Zellen) auf 5V oder 12V, 250mA (erhältlich bei Reichelt und Conrad; Bauteil,Platine oder Fertigmodul bei Robotikhardware.de erhältlich)&lt;br /&gt;
|-&lt;br /&gt;
| [http://cds.linear.com/docs/Datasheet/3401fb.pdf LTC3401]  ||ziemlich geniales Teil, weil es mit hoher Schaltfrequenz arbeitet, dadurch kann eine kleine Spule verwendet und ein sehr hoher Wirkungsgrad erzielt werden. 0.5...5.5V Vin, 1,0V Startup-Voltage, 2,6...5,5V Vout, bis 1A&lt;br /&gt;
|-&lt;br /&gt;
| [http://cds.linear.com/docs/Datasheet/3429fa.pdf LTC3429]||0,5...4,4V Vin, 1,0V Startup-Voltage, 2,5...4,3V Vout, 100mA aus einer Zelle, 250mA aus zwei Zellen bei 3,3V Vout&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.linear.com/pc/downloadDocument.do?navId=H0,C1,C1003,C1042,C1031,C1060,P13393,D9338 LTC3525-5] ||&lt;br /&gt;
|-&lt;br /&gt;
| [http://datasheets.maxim-ic.com/en/ds/MAX866-MAX867.pdf MAX866/MAX867] ||ziemlich geniales Teil, weil es mit hoher Schaltfrequenz arbeitet, ab 0.8V, bei 0.9V Start-Up-Voltage&lt;br /&gt;
|-&lt;br /&gt;
| [http://datasheets.maxim-ic.com/en/ds/MAX1595.pdf MAX1595] || dito, benötigt lediglich 3 Kondensatoren als Außenbeschaltung&lt;br /&gt;
|-&lt;br /&gt;
| [http://datasheets.maxim-ic.com/en/ds/MAX1674-MAX1676.pdf MAX1674-1676] ||bis zu ein Ampere, bei einer Zelle ist aber bei 100mA Schluss, und das auch nur, wenn die Spannung beim &amp;quot;Hochfahren&amp;quot; höher war und die richtige Spule verwendet wird&lt;br /&gt;
|-&lt;br /&gt;
| [http://datasheets.maxim-ic.com/en/ds/MAX1759.pdf MAX1759] || noch ein Hochfrequenz-Teil&lt;br /&gt;
|-&lt;br /&gt;
| [http://datasheets.maxim-ic.com/en/ds/MAX1722-MAX1724.pdf MAX1722-1724] || bis 150 mA&lt;br /&gt;
|-&lt;br /&gt;
| [http://ww1.microchip.com/downloads/en/DeviceDoc/22234B.pdf MCP1640] ||ab 0.35V bei 0.65V startup, einfache Beschaltung, regelbare Ausgangsspannung, bis 350 mA, 19µA quiescent current, nur kleine Induktivität (4,7µH) nötig, bei Reichelt günstig erhältlich (0,55€)&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.prema.com/Application/whiteleddriver.html PR4401/PR4402]||22 und 44 mA, benötigen lediglich 1 externes Bauteil, die Spule. Einfach zu handhaben, bei Reichelt zu bekommen.&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.prema.com/Application/pr4404_e.html PR4404]||150 mA von einer, und 300 mA von zwei Zellen. Preiswert, bei Reichelt.&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.sipex.com/Files/DataSheets/sp6648.pdf SP6648] &lt;br /&gt;
|-&lt;br /&gt;
| [http://focus.ti.com/lit/ds/symlink/tps61200.pdf TPS61200/201/202] ||1,8..5,5V out, Quellspannung bis herunter auf 0,3V, ?&amp;gt;90%, 0,5mm Pinabstand, 3,15*3,15mm, 10-Pin QFN&lt;br /&gt;
|-&lt;br /&gt;
| [http://focus.ti.com/docs/prod/folders/print/tps61006.html TPS6100x]||Single- and Dual-Cell Boost Converster, min 0,8V Vin, 1,5V...3,3V Vout, min. 100mA aus einer Zelle, min.250mA auf zwei Zellen, Gehäuse 10MSOP&lt;br /&gt;
|-&lt;br /&gt;
| [http://focus.ti.com/docs/prod/folders/print/tps61016.html TPS6101x]||1-Cell and 2-Cell Boost Converters, TPS61006 and TPS61016 are functionally equivalent. TPS61006 is non-synchronous. TPS61016 is synchronous and does not require an external Schottky diode.&lt;br /&gt;
|-&lt;br /&gt;
| TPS6030x, TPS6031x, [http://www.ortodoxism.ro/datasheets/lineartechnology/15023f.pdf LTC1502-3.3]  ||(typ. 3,x V bei 15-20 mA)&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.ortodoxism.ro/datasheets2/7/0y1y62f9lzj79rs7uuf28jq4xtwy.pdf LM2621] &lt;br /&gt;
|-&lt;br /&gt;
| [[MC34063]]||(ungeeignet, läuft erst ab 3V)&lt;br /&gt;
|-&lt;br /&gt;
| [http://atmel.com/dyn/products/product_card.asp?part_id=4523 ATtiny43U]||AVR-Microcontroller, der einen Boost-Converter eingebaut hat und damit eine Batterie bis auf 0.7V aussaugen kann.&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.onsemi.com/pub_link/Collateral/NCP1400A-D.PDF NCP1400A]||Startup 0.8V / fertige Module bei Watterott erhältlich&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.onsemi.com/pub_link/Collateral/NCP1402-D.PDF NCP1402]||Startup 0.8V, 200mA, Preis &amp;lt; 1 Euro / fertige Module bei Watterott erhältlich&lt;br /&gt;
|-&lt;br /&gt;
| [http://cds.linear.com/docs/Datasheet/338813f.pdf LTC3388] ||Nanopower Step Down Regulator, weniger als 1µA Leerlaufstrom, 50mA Ausgangsstrom&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dioden&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Prakisch kann nahezu jede Schottkydiode mit ausreichend Strombelastbarkeit genutzt werden, siehe [[Dioden-Übersicht]].&lt;br /&gt;
&lt;br /&gt;
==== Diskrete Schaltungen ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile:&#039;&#039;&#039;&lt;br /&gt;
* größtmögliche Anpassung an Verwendungszweck&lt;br /&gt;
* teilweise schon mit Standardhühnerfutter aufzubauen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteile:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* kompliziert&lt;br /&gt;
* nicht garantierte Funktion (z.&amp;amp;nbsp;B. wegen gepulster Gleichspannung)&lt;br /&gt;
* schlechte EMV-Eigenschaften&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Auflistung diskreter Step-Up-Schaltregler:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.elektronik-kompendium.de/forum/forum_entry.php?id=17395&lt;br /&gt;
* http://www.joretronik.de/Web_NT_Buch/Kap6_2/Kapitel6_2.html#6.2&lt;br /&gt;
* http://www.mikrocontroller.net/topic/73532#604774&lt;br /&gt;
* [http://www.nxp.com/acrobat_download/applicationnotes/AN10218_1.pdf NXP AN10218] (PDF) (Philips LPC900 microcontroller) single cell power supply&lt;br /&gt;
* [http://www.b-kainka.de/bastel36.htm Der LED-Spannungswandler] von B. Kainka&lt;br /&gt;
* [http://www.bigclive.com/joule.htm Make a Joule Thief] - Versorgung einer LED aus einer 1,5V Zelle&lt;br /&gt;
* Diskussionen von &#039;&#039;&#039;Joule-Thief&#039;&#039;&#039; Schaltungen im Forum&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/47224 Sensor autark betreiben mit einem Thermogenerator]&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/55041 LEDs mit Akku(s) effizient betreiben]&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/38163 Wie kann man eine Knopfzellenspannung um ca. 1 Volt erhöhen]&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/62158 Spannungsanhebung 1,2V -&amp;gt; 2V]&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/77154 Step-Up Transistorschaltung für LED Lampe]&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/56523 3x 2,9V LEDs mit 2xAAA versorgen]&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/55962 Gibt es eine Möglichkeit LEDs bei 1V zu betreiben]&lt;br /&gt;
** [http://cappels.org/dproj/ledpage/leddrv.htm#Rusty_Nail_Night_Light Rusty Nail Night Light]&lt;br /&gt;
&lt;br /&gt;
=== Ladungspumpen ===&lt;br /&gt;
&lt;br /&gt;
Ladungspumpen erhöhen die Spannung, indem sie Kondensatoren zyklisch parallel laden, umpolen und in Reihe entladen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile:&#039;&#039;&#039;&lt;br /&gt;
* geringer Stromverbrauch, deshalb für Low-Power-Anwendungen gut geeignet&lt;br /&gt;
* keine Spulen, deshalb kein magnetisches Störfeld&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteile:&#039;&#039;&#039;&lt;br /&gt;
* nur geringe Ausgangsströme möglich (100mA)&lt;br /&gt;
* ICs nur für höhere Eingangspannungen erhältlich, ab 3V&lt;br /&gt;
* Teilweise starke Strompulse beim Umladen der Kondensatoren, womit empfindliche Analogschaltungen gestört werden können (Funkempfänger etc.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Auflistung von Ladungspumpen:&#039;&#039;&#039;&lt;br /&gt;
* TPS60300 - Vin 0,9-1,8V&lt;br /&gt;
* TPS60100 - Vin 1,8-3,6V (200mA)&lt;br /&gt;
* MAX1759 - Vin 1,6-5,5V (2-3 Zellen)&lt;br /&gt;
* ICL7660 - Vin 1,5-10V (10mA) [Pollin]&lt;br /&gt;
&lt;br /&gt;
== Forumsbeiträge zum Thema ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/45101 3v3 Volt aus einer 1v2 Volt Zelle]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/18789 Stromversorgung aus einer Zelle]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/73532 Step-Up Mignon zu 5V]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/141635 Stepup/-down: Konstante 5V aus 4xMonozelle]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/189526 Ersatz 9V-Block durch Mikrozelle]&lt;br /&gt;
&lt;br /&gt;
== Externe Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.powerdesignersusa.com/InfoWeb/index.shtml Powerdesigners InfoWeb] - Free tools, resources and education for power electronics designers and students (engl.)&lt;br /&gt;
* http://www.ti.com/power&lt;br /&gt;
* [http://focus.ti.com/lit/an/slaa105/slaa105.pdf TI Application Report SLAA 105] Simple 1.5-V Boost Converter for MSP430&lt;br /&gt;
* http://www.maxim-ic.com/products/power/&lt;br /&gt;
* 2-6V DC nach 5V DC Konverter auf der Basis des &#039;&#039;&#039;LT1302&#039;&#039;&#039; als  [http://www.shop.robotikhardware.de/shop/catalog/product_info.php?cPath=83&amp;amp;products_id=195 Fertigmodul] bzw. [http://www.shop.robotikhardware.de/shop/catalog/product_info.php?products_id=194 Platine] (Shop robotikhardware.de)&lt;br /&gt;
* [http://www.heise.de/mobil/Langzeittest-von-NiMH-Akkus-mit-reduzierter-Selbstentladung--/artikel/143297 Langzeittest von NiMH-Akkus mit reduzierter Selbstentladung] auf heise.de&lt;br /&gt;
* [http://spritesmods.com/?art=ucboost Run an uC from an AA-battery] auf spritesmods.com&lt;br /&gt;
* [http://www.powerstream.com/BatteryFAQ.html PowerStream Battery Chemistry FAQ]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/AppNotes/01416a.pdf AN1416: Low-Power Design Guide] von Microchip (PDF)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Bauteile]]&lt;br /&gt;
[[Kategorie:Spannungsversorgung und Energiequellen]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Versorgung_aus_einer_Zelle&amp;diff=77882</id>
		<title>Versorgung aus einer Zelle</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Versorgung_aus_einer_Zelle&amp;diff=77882"/>
		<updated>2013-08-05T13:17:33Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Step-Down Schaltregler */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bei batteriebetriebenen Anwendungen stellt sich oft das Problem der Spannungsversorgung. Darauf soll hier näher eingegangen werden.&lt;br /&gt;
&lt;br /&gt;
== Erste Ideen ==&lt;br /&gt;
&lt;br /&gt;
=== 9V-Block mit Linearregler ===&lt;br /&gt;
&lt;br /&gt;
Die erste Idee ist, einen 9V-Block mit dahintergehängtem Linearregler à la 7805 zu verwenden. Dieser Ansatz ist einfach, er hat aber einen sehr schlechten Wirkungsgrad. Bei Abwärtsregelung auf 5V verbrät der Regler immerhin 45% =&amp;gt; 55% Wirkungsgrad, bei 3,3V verbrät er 64% =&amp;gt; nur noch 36% Wirkungsgrad), und auch der Platzbedarf auf der Leiterplatte ist erheblich. Angesichts dessen kann man schon fast vernachlässigen, dass der klassische 7805 ca. 5mA für sich selber braucht. Das ist meist mehr als ein Mikrocontroller! Diesbezüglich besser sind Low Power Linearregler wie z.&amp;amp;nbsp;B. der [http://www.national.com/mpf/LP/LP2950.html LP2950] (ca. 75&amp;amp;mu;A Eigenverbrauch) oder gar ein [http://focus.ti.com/docs/prod/folders/print/tps71501.html TPS715xx] von [http://www.ti.com Texas Instuments], der mit unglaublich geringen 3,2 &amp;amp;mu;A auskommt.&lt;br /&gt;
Statt des Linearreglers könnte man natürlich auch einen Step-Down-Schaltregler benutzen, dann hätte man zumindest einen besseren Wirkungsgrad von 80-90%. Last but not least ist die Energiedichte von 9V-Blocks im Verhältnis zu Mignonzellen eher gering.&lt;br /&gt;
&lt;br /&gt;
http://data.energizer.com/ (Auf Technical Info oben rechts klicken, dann die Batteriefamilie links auswählen, z.&amp;amp;nbsp;B. Alkaline)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! width=&amp;quot;18%&amp;quot; | Batterietyp &lt;br /&gt;
! Volumen&amp;lt;BR&amp;gt;[cm³] &lt;br /&gt;
! Kapazität&amp;lt;BR&amp;gt;[mAh] &lt;br /&gt;
! mittlere&amp;lt;BR&amp;gt;Ausgangs-&amp;lt;BR&amp;gt;spannung [V] &lt;br /&gt;
! Energiegehalt&amp;lt;BR&amp;gt;[mWh] &lt;br /&gt;
! Energiedichte&amp;lt;BR&amp;gt;[mWh/cm³] &lt;br /&gt;
! Masse&amp;lt;BR&amp;gt;[g]&lt;br /&gt;
|-&lt;br /&gt;
|9V Alkaline&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 21,1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 625&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 7&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 4375&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 207&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 45,6&lt;br /&gt;
|-&lt;br /&gt;
|Mono Alkaline [D]&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 56&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 20500&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1,3&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 26650&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 475&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 148&lt;br /&gt;
|-&lt;br /&gt;
|Baby Alkaline [C]&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 26,9&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 8350&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1,3&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 10855&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 404&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 26,2&lt;br /&gt;
|-&lt;br /&gt;
|Mignon Alkaline [AA]&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 8,1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 2850&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1,3&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 3705&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 457&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 23&lt;br /&gt;
|-&lt;br /&gt;
|Micro Alkaline [AAA]&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 3,8&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1250&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1,3&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1625&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 428&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 11,5&lt;br /&gt;
|-&lt;br /&gt;
|Lithiumzelle, 2032&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 240&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 2,9&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 496&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 653&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Vier Mignonzellen mit LowDrop-Linearregler ===&lt;br /&gt;
&lt;br /&gt;
Als weitere Möglichkeit wären vier Mignonzellen (leer 3,6V, voll 6V) mit nachgeschaltetem LowDrop-Linearregler zu verwenden. Wenn die Schaltung mit 3,3V auskommt, dann ist man mit dieser Möglichkeit bestens bedient. Die Batterien können bis zum Ende ausgenutzt werden und der Wirkungsgrad liegt bei ca. 75%.&lt;br /&gt;
Allerdings bleibt ein Nachteil wenn man 5V braucht: Die Batterien werden nicht einmal annähernd geleert, weil sie bereits bei 1,25V pro Zelle zusammen gerade noch 5V ergeben, der Regler aber auch gern noch seinen Teil abhaben will (Dropout Voltage). Zu bedenken sind hierbei die Entladekennlinien von Batterien oder noch schlimmer, die von Akkus.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Sparsame Spannungsregler&#039;&#039;&#039;&lt;br /&gt;
!Bezeichnung || Ausgangsspannung [V] || Stromverbrauch [µA] || DropOut @ 50/150/250mA [mV] || Lieferant&lt;br /&gt;
|-&lt;br /&gt;
|LP2950&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |3 / 3,3 / 5&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |75&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |300 / - / -&lt;br /&gt;
| [[Elektronikversender#Reichelt | Rei]]&lt;br /&gt;
|-&lt;br /&gt;
|LF33&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |3,3&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |500&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |100 / 175 / 250&lt;br /&gt;
| [[Elektronikversender#Reichelt | Rei]]&lt;br /&gt;
|-&lt;br /&gt;
|LF50&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |5&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |500&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |100 / 175 / 250&lt;br /&gt;
| [[Elektronikversender#Reichelt | Rei]]&lt;br /&gt;
|-&lt;br /&gt;
|TPS715xx&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |1,2..5&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |3.2&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |415 / - / -&lt;br /&gt;
| [[Elektronikversender#RS Components | RS]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.robotikhardware.de/download/tps78233.pdf TPS78233]&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |3.3&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |0.42&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |130&lt;br /&gt;
| [[Elektronikversender#Robotikhardware | RH]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|MCP1702&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |1,2..5&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |2&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |15 / 40 / 650&lt;br /&gt;
| [[Elektronikversender#Reichelt | Rei]]&lt;br /&gt;
|-&lt;br /&gt;
|MCP1824&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |0,8..5&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |120&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |30 / 90 / 150&lt;br /&gt;
| [[Elektronikversender#RS Components | RS]]&lt;br /&gt;
|- &lt;br /&gt;
|ZLDO330&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |3,3&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |1000&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |20 / 50 / 85&lt;br /&gt;
| [[Elektronikversender#Reichelt | Rei]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Drei Mignonzellen ohne Spannungsregler ===&lt;br /&gt;
&lt;br /&gt;
Die meisten modernen [[Mikrocontroller]] haben einen sehr breiten Versorgungsspannungsbereich, teilweise von 1,8V bis 5,5V. Daher können sie direkt mit drei in Reihe geschalteten Zellen betrieben werden. Während der Entladung sinkt die Betriebsspannung (3&amp;amp;times;0,8V = 2,4V), was der Mikrocontroller aber verkraftet, sofern er nicht mit maximalem Takt läuft. Wenn man keine weiteren ICs in der Schaltung benötigt oder diese ebenso tolerant bezüglich einer veränderlichen Versorgungsspannung sind, ist diese Methode die einfachste und günstigste (100% Wirkungsgrad). Vor allem wird bei [[Ultra low power | Low Power]] Anwendungen mit [[Sleep Mode]] kein Mikroampere für einen Spannungsregler verschwendet.&lt;br /&gt;
&lt;br /&gt;
=== Lithiumzelle ===&lt;br /&gt;
&lt;br /&gt;
Lithiumzellen haben eine sehr geringe Selbstentladung und eine hohe Spannung von typisch 3V. Damit kann man einen sparsamen Mikrocontroller betreiben. Meist werden diese Zellen für Echtzeituhren und zum Datenerhalt von RAMs genutzt, da hier nur sehr geringe Ströme im Mikroamperebereich benötigt werden. Darauf sind diese Zellen ausgelegt. Aus den meisten kann man nur einige mA entnehmen, bei 10mA und mehr sinkt die verfügbare Kapazität rapide.&lt;br /&gt;
&lt;br /&gt;
Um ein Gerät nur im Notfall mit einer Lithiumzelle zu betreiben (Pufferbetrieb, Netzausfallsicherung), braucht man eine unterbrechungsfreie Umschaltung zwischen Netzteilbetrieb und Batteriebetrieb. Kritisch ist das vor allem für die Lithiumzelle (damit ist kein Lithiumakku gemeint!), da diese nicht aufgeladen werden darf. Sie wird dabei mit heftiger Reaktion zerstört! Eine einfache Schaltung ist die Nutzung von zwei Schottkydioden zur Entkopplung von Batterie und Netzteil, wie es im Artikel &#039;&#039;Speicher&#039;&#039; über  [[Speicher#EEPROM_Schreibzugriffe_minimieren | EEPROM]] gezeigt wird.&lt;br /&gt;
&lt;br /&gt;
Der Nachteil dieser Lösung ist der relativ hohe Spannungsabfall von 300..400mV über den Dioden. Besser ist der Einsatz eines P-Kanal MOSFETs zum Schalten der Batteriespannung. Dadurch kann der Spannungsabfall auf wenige Millivolt gesenkt werden. Die Schaltung dazu ist im diesem [http://www.mikrocontroller.net/topic/72275#591483 Beitrag] zu finden.&lt;br /&gt;
&lt;br /&gt;
== Bessere Lösungsansätze ==&lt;br /&gt;
&lt;br /&gt;
Wie man sehen kann, sind oben dargestellte Methoden nur bedingt zufriedenstellend. Vor allem der Platzbedarf dürfte ein k.-o.-Kriterium sein. Besser wäre es, nur eine oder zwei Zellen zu verwenden.&lt;br /&gt;
&lt;br /&gt;
=== Step-Down-Schaltregler (Abwärtsregler, Tiefsetzsteller) ===&lt;br /&gt;
&lt;br /&gt;
Falls die Batteriespannung auch am Ende der Entladung höher als die Versorgungsspannung ist, bieten sich Step-down Regler an.&lt;br /&gt;
* TPS62056 : U&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt; 2,7 .. 10 V, U&amp;lt;sub&amp;gt;out&amp;lt;/sub&amp;gt;=0,7 .. 6 V, 12 µA Eigenverbrauch, SMD-Gehäuse MSOP10&lt;br /&gt;
* TPS62202 : U&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt; 2,5 .. 6 V, U&amp;lt;sub&amp;gt;out&amp;lt;/sub&amp;gt; 1,8V, 12 µA Eigenverbrauch, SMD-Gehäuse SOT23-5&lt;br /&gt;
&lt;br /&gt;
=== Step-Up-Schaltregler ===&lt;br /&gt;
&lt;br /&gt;
Step-Up-Schaltregler bringen die Spannung, wie der Name schon sagt, &#039;einen Schritt nach oben&#039;. Ideal also, um aus 1,5V oder 3V z.&amp;amp;nbsp;B. 5V zu erzeugen. Desweiteren sind sie auch geeignet, um höhere Ströme (bis 0,5 A, je nach Aufbau und Spule) zu entnehmen. Das Arbeitsprinzip bei Step-Up-Schaltreglern ist immer gleich: Eine Spule wird ständig an- und abgeschaltet und durch Eigeninduktion eine höhere Spannung erzeugt. Um einen Step-Up-Schaltregler aufzubauen, gibt es verschiedene Möglichkeiten:&lt;br /&gt;
&lt;br /&gt;
==== ICs ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* zuverlässig&lt;br /&gt;
* meist wenig Außenbeschaltung nötig&lt;br /&gt;
* geringe Größe, auch der Spule, da hohe Schaltfrequenzen verwendet werden&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* teuer, vor allem die, welche ab 1V arbeiten&lt;br /&gt;
* teilweise schwer zu bekommen&lt;br /&gt;
* benötigen mehr Aufwand für Filterung und Schirmung als Linearregler.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Bauteile]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Schaltregler-ICs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! IC !! Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.tranzistoare.ro/datasheets/2300/57048_DS.pdf LT1073-5] ||1V (1 Zelle) auf 5V, 40mA&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.ortodoxism.ro/datasheets/lineartechnology/lt1301.pdf LT1301] ||2V (2 Zellen) auf 5V oder 12V, 250mA (erhältlich bei Conrad)&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.ortodoxism.ro/datasheets/lineartechnology/lt1302.pdf LT1302] ||2V (2 Zellen) auf 5V oder 12V, 250mA (erhältlich bei Reichelt und Conrad; Bauteil,Platine oder Fertigmodul bei Robotikhardware.de erhältlich)&lt;br /&gt;
|-&lt;br /&gt;
| [http://cds.linear.com/docs/Datasheet/3401fb.pdf LTC3401]  ||ziemlich geniales Teil, weil es mit hoher Schaltfrequenz arbeitet, dadurch kann eine kleine Spule verwendet und ein sehr hoher Wirkungsgrad erzielt werden. 0.5...5.5V Vin, 1,0V Startup-Voltage, 2,6...5,5V Vout, bis 1A&lt;br /&gt;
|-&lt;br /&gt;
| [http://cds.linear.com/docs/Datasheet/3429fa.pdf LTC3429]||0,5...4,4V Vin, 1,0V Startup-Voltage, 2,5...4,3V Vout, 100mA aus einer Zelle, 250mA aus zwei Zellen bei 3,3V Vout&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.linear.com/pc/downloadDocument.do?navId=H0,C1,C1003,C1042,C1031,C1060,P13393,D9338 LTC3525-5] ||&lt;br /&gt;
|-&lt;br /&gt;
| [http://datasheets.maxim-ic.com/en/ds/MAX866-MAX867.pdf MAX866/MAX867] ||ziemlich geniales Teil, weil es mit hoher Schaltfrequenz arbeitet, ab 0.8V, bei 0.9V Start-Up-Voltage&lt;br /&gt;
|-&lt;br /&gt;
| [http://datasheets.maxim-ic.com/en/ds/MAX1595.pdf MAX1595] || dito, benötigt lediglich 3 Kondensatoren als Außenbeschaltung&lt;br /&gt;
|-&lt;br /&gt;
| [http://datasheets.maxim-ic.com/en/ds/MAX1674-MAX1676.pdf MAX1674-1676] ||bis zu ein Ampere, bei einer Zelle ist aber bei 100mA Schluss, und das auch nur, wenn die Spannung beim &amp;quot;Hochfahren&amp;quot; höher war und die richtige Spule verwendet wird&lt;br /&gt;
|-&lt;br /&gt;
| [http://datasheets.maxim-ic.com/en/ds/MAX1759.pdf MAX1759] || noch ein Hochfrequenz-Teil&lt;br /&gt;
|-&lt;br /&gt;
| [http://datasheets.maxim-ic.com/en/ds/MAX1722-MAX1724.pdf MAX1722-1724] || bis 150 mA&lt;br /&gt;
|-&lt;br /&gt;
| [http://ww1.microchip.com/downloads/en/DeviceDoc/22234B.pdf MCP1640] ||ab 0.35V bei 0.65V startup, einfache Beschaltung, regelbare Ausgangsspannung, bis 350 mA, 19µA quiescent current, nur kleine Induktivität (4,7µH) nötig, bei Reichelt günstig erhältlich (0,55€)&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.prema.com/Application/whiteleddriver.html PR4401/PR4402]||22 und 44 mA, benötigen lediglich 1 externes Bauteil, die Spule. Einfach zu handhaben, bei Reichelt zu bekommen.&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.prema.com/Application/pr4404_e.html PR4404]||150 mA von einer, und 300 mA von zwei Zellen. Preiswert, bei Reichelt.&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.sipex.com/Files/DataSheets/sp6648.pdf SP6648] &lt;br /&gt;
|-&lt;br /&gt;
| [http://focus.ti.com/lit/ds/symlink/tps61200.pdf TPS61200/201/202] ||1,8..5,5V out, Quellspannung bis herunter auf 0,3V, ?&amp;gt;90%, 0,5mm Pinabstand, 3,15*3,15mm, 10-Pin QFN&lt;br /&gt;
|-&lt;br /&gt;
| [http://focus.ti.com/docs/prod/folders/print/tps61006.html TPS6100x]||Single- and Dual-Cell Boost Converster, min 0,8V Vin, 1,5V...3,3V Vout, min. 100mA aus einer Zelle, min.250mA auf zwei Zellen, Gehäuse 10MSOP&lt;br /&gt;
|-&lt;br /&gt;
| [http://focus.ti.com/docs/prod/folders/print/tps61016.html TPS6101x]||1-Cell and 2-Cell Boost Converters, TPS61006 and TPS61016 are functionally equivalent. TPS61006 is non-synchronous. TPS61016 is synchronous and does not require an external Schottky diode.&lt;br /&gt;
|-&lt;br /&gt;
| TPS6030x, TPS6031x, [http://www.ortodoxism.ro/datasheets/lineartechnology/15023f.pdf LTC1502-3.3]  ||(typ. 3,x V bei 15-20 mA)&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.ortodoxism.ro/datasheets2/7/0y1y62f9lzj79rs7uuf28jq4xtwy.pdf LM2621] &lt;br /&gt;
|-&lt;br /&gt;
| [[MC34063]]||(ungeeignet, läuft erst ab 3V)&lt;br /&gt;
|-&lt;br /&gt;
| [http://atmel.com/dyn/products/product_card.asp?part_id=4523 ATtiny43U]||AVR-Microcontroller, der einen Boost-Converter eingebaut hat und damit eine Batterie bis auf 0.7V aussaugen kann.&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.onsemi.com/pub_link/Collateral/NCP1400A-D.PDF NCP1400A]||Startup 0.8V / fertige Module bei Watterott erhältlich&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.onsemi.com/pub_link/Collateral/NCP1402-D.PDF NCP1402]||Startup 0.8V, 200mA, Preis &amp;lt; 1 Euro / fertige Module bei Watterott erhältlich&lt;br /&gt;
|-&lt;br /&gt;
| [http://cds.linear.com/docs/Datasheet/338813f.pdf LTC3388] ||Nanopower Step Down Regulator, weniger als 1µA Leerlaufstrom, 50mA Ausgangsstrom&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dioden&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Prakisch kann nahezu jede Schottkydiode mit ausreichend Strombelastbarkeit genutzt werden, siehe [[Dioden-Übersicht]].&lt;br /&gt;
&lt;br /&gt;
==== Diskrete Schaltungen ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile:&#039;&#039;&#039;&lt;br /&gt;
* größtmögliche Anpassung an Verwendungszweck&lt;br /&gt;
* teilweise schon mit Standardhühnerfutter aufzubauen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteile:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* kompliziert&lt;br /&gt;
* nicht garantierte Funktion (z.&amp;amp;nbsp;B. wegen gepulster Gleichspannung)&lt;br /&gt;
* schlechte EMV-Eigenschaften&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Auflistung diskreter Step-Up-Schaltregler:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.elektronik-kompendium.de/forum/forum_entry.php?id=17395&lt;br /&gt;
* http://www.joretronik.de/Web_NT_Buch/Kap6_2/Kapitel6_2.html#6.2&lt;br /&gt;
* http://www.mikrocontroller.net/topic/73532#604774&lt;br /&gt;
* [http://www.nxp.com/acrobat_download/applicationnotes/AN10218_1.pdf NXP AN10218] (PDF) (Philips LPC900 microcontroller) single cell power supply&lt;br /&gt;
* [http://www.b-kainka.de/bastel36.htm Der LED-Spannungswandler] von B. Kainka&lt;br /&gt;
* [http://www.bigclive.com/joule.htm Make a Joule Thief] - Versorgung einer LED aus einer 1,5V Zelle&lt;br /&gt;
* Diskussionen von &#039;&#039;&#039;Joule-Thief&#039;&#039;&#039; Schaltungen im Forum&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/47224 Sensor autark betreiben mit einem Thermogenerator]&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/55041 LEDs mit Akku(s) effizient betreiben]&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/38163 Wie kann man eine Knopfzellenspannung um ca. 1 Volt erhöhen]&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/62158 Spannungsanhebung 1,2V -&amp;gt; 2V]&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/77154 Step-Up Transistorschaltung für LED Lampe]&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/56523 3x 2,9V LEDs mit 2xAAA versorgen]&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/55962 Gibt es eine Möglichkeit LEDs bei 1V zu betreiben]&lt;br /&gt;
** [http://cappels.org/dproj/ledpage/leddrv.htm#Rusty_Nail_Night_Light Rusty Nail Night Light]&lt;br /&gt;
&lt;br /&gt;
=== Ladungspumpen ===&lt;br /&gt;
&lt;br /&gt;
Ladungspumpen erhöhen die Spannung, indem sie Kondensatoren zyklisch parallel laden, umpolen und in Reihe entladen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile:&#039;&#039;&#039;&lt;br /&gt;
* geringer Stromverbrauch, deshalb für Low-Power-Anwendungen gut geeignet&lt;br /&gt;
* keine Spulen, deshalb kein magnetisches Störfeld&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteile:&#039;&#039;&#039;&lt;br /&gt;
* nur geringe Ausgangsströme möglich (100mA)&lt;br /&gt;
* ICs nur für höhere Eingangspannungen erhältlich, ab 3V&lt;br /&gt;
* Teilweise starke Strompulse beim Umladen der Kondensatoren, womit empfindliche Analogschaltungen gestört werden können (Funkempfänger etc.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Auflistung von Ladungspumpen:&#039;&#039;&#039;&lt;br /&gt;
* TPS60300 - Vin 0,9-1,8V&lt;br /&gt;
* TPS60100 - Vin 1,8-3,6V (200mA)&lt;br /&gt;
* MAX1759 - Vin 1,6-5,5V (2-3 Zellen)&lt;br /&gt;
* ICL7660 - Vin 1,5-10V (10mA) [Pollin]&lt;br /&gt;
&lt;br /&gt;
== Forumsbeiträge zum Thema ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/45101 3v3 Volt aus einer 1v2 Volt Zelle]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/18789 Stromversorgung aus einer Zelle]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/73532 Step-Up Mignon zu 5V]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/141635 Stepup/-down: Konstante 5V aus 4xMonozelle]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/189526 Ersatz 9V-Block durch Mikrozelle]&lt;br /&gt;
&lt;br /&gt;
== Externe Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.powerdesignersusa.com/InfoWeb/index.shtml Powerdesigners InfoWeb] - Free tools, resources and education for power electronics designers and students (engl.)&lt;br /&gt;
* http://www.ti.com/power&lt;br /&gt;
* [http://focus.ti.com/lit/an/slaa105/slaa105.pdf TI Application Report SLAA 105] Simple 1.5-V Boost Converter for MSP430&lt;br /&gt;
* http://www.maxim-ic.com/products/power/&lt;br /&gt;
* 2-6V DC nach 5V DC Konverter auf der Basis des &#039;&#039;&#039;LT1302&#039;&#039;&#039; als  [http://www.shop.robotikhardware.de/shop/catalog/product_info.php?cPath=83&amp;amp;products_id=195 Fertigmodul] bzw. [http://www.shop.robotikhardware.de/shop/catalog/product_info.php?products_id=194 Platine] (Shop robotikhardware.de)&lt;br /&gt;
* [http://www.heise.de/mobil/Langzeittest-von-NiMH-Akkus-mit-reduzierter-Selbstentladung--/artikel/143297 Langzeittest von NiMH-Akkus mit reduzierter Selbstentladung] auf heise.de&lt;br /&gt;
* [http://spritesmods.com/?art=ucboost Run an uC from an AA-battery] auf spritesmods.com&lt;br /&gt;
* [http://www.powerstream.com/BatteryFAQ.html PowerStream Battery Chemistry FAQ]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/AppNotes/01416a.pdf AN1416: Low-Power Design Guide] von Microchip (PDF)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Bauteile]]&lt;br /&gt;
[[Kategorie:Spannungsversorgung und Energiequellen]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Versorgung_aus_einer_Zelle&amp;diff=77881</id>
		<title>Versorgung aus einer Zelle</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Versorgung_aus_einer_Zelle&amp;diff=77881"/>
		<updated>2013-08-05T13:16:53Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Bessere Lösungsansätze */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bei batteriebetriebenen Anwendungen stellt sich oft das Problem der Spannungsversorgung. Darauf soll hier näher eingegangen werden.&lt;br /&gt;
&lt;br /&gt;
== Erste Ideen ==&lt;br /&gt;
&lt;br /&gt;
=== 9V-Block mit Linearregler ===&lt;br /&gt;
&lt;br /&gt;
Die erste Idee ist, einen 9V-Block mit dahintergehängtem Linearregler à la 7805 zu verwenden. Dieser Ansatz ist einfach, er hat aber einen sehr schlechten Wirkungsgrad. Bei Abwärtsregelung auf 5V verbrät der Regler immerhin 45% =&amp;gt; 55% Wirkungsgrad, bei 3,3V verbrät er 64% =&amp;gt; nur noch 36% Wirkungsgrad), und auch der Platzbedarf auf der Leiterplatte ist erheblich. Angesichts dessen kann man schon fast vernachlässigen, dass der klassische 7805 ca. 5mA für sich selber braucht. Das ist meist mehr als ein Mikrocontroller! Diesbezüglich besser sind Low Power Linearregler wie z.&amp;amp;nbsp;B. der [http://www.national.com/mpf/LP/LP2950.html LP2950] (ca. 75&amp;amp;mu;A Eigenverbrauch) oder gar ein [http://focus.ti.com/docs/prod/folders/print/tps71501.html TPS715xx] von [http://www.ti.com Texas Instuments], der mit unglaublich geringen 3,2 &amp;amp;mu;A auskommt.&lt;br /&gt;
Statt des Linearreglers könnte man natürlich auch einen Step-Down-Schaltregler benutzen, dann hätte man zumindest einen besseren Wirkungsgrad von 80-90%. Last but not least ist die Energiedichte von 9V-Blocks im Verhältnis zu Mignonzellen eher gering.&lt;br /&gt;
&lt;br /&gt;
http://data.energizer.com/ (Auf Technical Info oben rechts klicken, dann die Batteriefamilie links auswählen, z.&amp;amp;nbsp;B. Alkaline)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! width=&amp;quot;18%&amp;quot; | Batterietyp &lt;br /&gt;
! Volumen&amp;lt;BR&amp;gt;[cm³] &lt;br /&gt;
! Kapazität&amp;lt;BR&amp;gt;[mAh] &lt;br /&gt;
! mittlere&amp;lt;BR&amp;gt;Ausgangs-&amp;lt;BR&amp;gt;spannung [V] &lt;br /&gt;
! Energiegehalt&amp;lt;BR&amp;gt;[mWh] &lt;br /&gt;
! Energiedichte&amp;lt;BR&amp;gt;[mWh/cm³] &lt;br /&gt;
! Masse&amp;lt;BR&amp;gt;[g]&lt;br /&gt;
|-&lt;br /&gt;
|9V Alkaline&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 21,1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 625&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 7&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 4375&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 207&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 45,6&lt;br /&gt;
|-&lt;br /&gt;
|Mono Alkaline [D]&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 56&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 20500&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1,3&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 26650&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 475&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 148&lt;br /&gt;
|-&lt;br /&gt;
|Baby Alkaline [C]&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 26,9&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 8350&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1,3&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 10855&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 404&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 26,2&lt;br /&gt;
|-&lt;br /&gt;
|Mignon Alkaline [AA]&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 8,1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 2850&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1,3&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 3705&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 457&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 23&lt;br /&gt;
|-&lt;br /&gt;
|Micro Alkaline [AAA]&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 3,8&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1250&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1,3&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1625&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 428&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 11,5&lt;br /&gt;
|-&lt;br /&gt;
|Lithiumzelle, 2032&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 240&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 2,9&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 496&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 653&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Vier Mignonzellen mit LowDrop-Linearregler ===&lt;br /&gt;
&lt;br /&gt;
Als weitere Möglichkeit wären vier Mignonzellen (leer 3,6V, voll 6V) mit nachgeschaltetem LowDrop-Linearregler zu verwenden. Wenn die Schaltung mit 3,3V auskommt, dann ist man mit dieser Möglichkeit bestens bedient. Die Batterien können bis zum Ende ausgenutzt werden und der Wirkungsgrad liegt bei ca. 75%.&lt;br /&gt;
Allerdings bleibt ein Nachteil wenn man 5V braucht: Die Batterien werden nicht einmal annähernd geleert, weil sie bereits bei 1,25V pro Zelle zusammen gerade noch 5V ergeben, der Regler aber auch gern noch seinen Teil abhaben will (Dropout Voltage). Zu bedenken sind hierbei die Entladekennlinien von Batterien oder noch schlimmer, die von Akkus.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Sparsame Spannungsregler&#039;&#039;&#039;&lt;br /&gt;
!Bezeichnung || Ausgangsspannung [V] || Stromverbrauch [µA] || DropOut @ 50/150/250mA [mV] || Lieferant&lt;br /&gt;
|-&lt;br /&gt;
|LP2950&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |3 / 3,3 / 5&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |75&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |300 / - / -&lt;br /&gt;
| [[Elektronikversender#Reichelt | Rei]]&lt;br /&gt;
|-&lt;br /&gt;
|LF33&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |3,3&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |500&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |100 / 175 / 250&lt;br /&gt;
| [[Elektronikversender#Reichelt | Rei]]&lt;br /&gt;
|-&lt;br /&gt;
|LF50&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |5&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |500&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |100 / 175 / 250&lt;br /&gt;
| [[Elektronikversender#Reichelt | Rei]]&lt;br /&gt;
|-&lt;br /&gt;
|TPS715xx&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |1,2..5&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |3.2&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |415 / - / -&lt;br /&gt;
| [[Elektronikversender#RS Components | RS]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.robotikhardware.de/download/tps78233.pdf TPS78233]&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |3.3&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |0.42&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |130&lt;br /&gt;
| [[Elektronikversender#Robotikhardware | RH]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|MCP1702&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |1,2..5&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |2&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |15 / 40 / 650&lt;br /&gt;
| [[Elektronikversender#Reichelt | Rei]]&lt;br /&gt;
|-&lt;br /&gt;
|MCP1824&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |0,8..5&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |120&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |30 / 90 / 150&lt;br /&gt;
| [[Elektronikversender#RS Components | RS]]&lt;br /&gt;
|- &lt;br /&gt;
|ZLDO330&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |3,3&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |1000&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |20 / 50 / 85&lt;br /&gt;
| [[Elektronikversender#Reichelt | Rei]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Drei Mignonzellen ohne Spannungsregler ===&lt;br /&gt;
&lt;br /&gt;
Die meisten modernen [[Mikrocontroller]] haben einen sehr breiten Versorgungsspannungsbereich, teilweise von 1,8V bis 5,5V. Daher können sie direkt mit drei in Reihe geschalteten Zellen betrieben werden. Während der Entladung sinkt die Betriebsspannung (3&amp;amp;times;0,8V = 2,4V), was der Mikrocontroller aber verkraftet, sofern er nicht mit maximalem Takt läuft. Wenn man keine weiteren ICs in der Schaltung benötigt oder diese ebenso tolerant bezüglich einer veränderlichen Versorgungsspannung sind, ist diese Methode die einfachste und günstigste (100% Wirkungsgrad). Vor allem wird bei [[Ultra low power | Low Power]] Anwendungen mit [[Sleep Mode]] kein Mikroampere für einen Spannungsregler verschwendet.&lt;br /&gt;
&lt;br /&gt;
=== Lithiumzelle ===&lt;br /&gt;
&lt;br /&gt;
Lithiumzellen haben eine sehr geringe Selbstentladung und eine hohe Spannung von typisch 3V. Damit kann man einen sparsamen Mikrocontroller betreiben. Meist werden diese Zellen für Echtzeituhren und zum Datenerhalt von RAMs genutzt, da hier nur sehr geringe Ströme im Mikroamperebereich benötigt werden. Darauf sind diese Zellen ausgelegt. Aus den meisten kann man nur einige mA entnehmen, bei 10mA und mehr sinkt die verfügbare Kapazität rapide.&lt;br /&gt;
&lt;br /&gt;
Um ein Gerät nur im Notfall mit einer Lithiumzelle zu betreiben (Pufferbetrieb, Netzausfallsicherung), braucht man eine unterbrechungsfreie Umschaltung zwischen Netzteilbetrieb und Batteriebetrieb. Kritisch ist das vor allem für die Lithiumzelle (damit ist kein Lithiumakku gemeint!), da diese nicht aufgeladen werden darf. Sie wird dabei mit heftiger Reaktion zerstört! Eine einfache Schaltung ist die Nutzung von zwei Schottkydioden zur Entkopplung von Batterie und Netzteil, wie es im Artikel &#039;&#039;Speicher&#039;&#039; über  [[Speicher#EEPROM_Schreibzugriffe_minimieren | EEPROM]] gezeigt wird.&lt;br /&gt;
&lt;br /&gt;
Der Nachteil dieser Lösung ist der relativ hohe Spannungsabfall von 300..400mV über den Dioden. Besser ist der Einsatz eines P-Kanal MOSFETs zum Schalten der Batteriespannung. Dadurch kann der Spannungsabfall auf wenige Millivolt gesenkt werden. Die Schaltung dazu ist im diesem [http://www.mikrocontroller.net/topic/72275#591483 Beitrag] zu finden.&lt;br /&gt;
&lt;br /&gt;
== Bessere Lösungsansätze ==&lt;br /&gt;
&lt;br /&gt;
Wie man sehen kann, sind oben dargestellte Methoden nur bedingt zufriedenstellend. Vor allem der Platzbedarf dürfte ein k.-o.-Kriterium sein. Besser wäre es, nur eine oder zwei Zellen zu verwenden.&lt;br /&gt;
&lt;br /&gt;
=== Step-Down Schaltregler ===&lt;br /&gt;
&lt;br /&gt;
Falls die Batteriespannung auch am Ende der Entladung höher als die Versorgungsspannung ist, bieten sich Step-down Regler an.&lt;br /&gt;
* TPS62056 : U&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt; 2,7 .. 10 V, U&amp;lt;sub&amp;gt;out&amp;lt;/sub&amp;gt;=0,7 .. 6 V, 12 µA Eigenverbrauch, SMD-Gehäuse MSOP10&lt;br /&gt;
* TPS62202 : U&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt; 2,5 .. 6 V, U&amp;lt;sub&amp;gt;out&amp;lt;/sub&amp;gt; 1,8V, 12 µA Eigenverbrauch, SMD-Gehäuse SOT23-5&lt;br /&gt;
&lt;br /&gt;
=== Step-Up-Schaltregler ===&lt;br /&gt;
&lt;br /&gt;
Step-Up-Schaltregler bringen die Spannung, wie der Name schon sagt, &#039;einen Schritt nach oben&#039;. Ideal also, um aus 1,5V oder 3V z.&amp;amp;nbsp;B. 5V zu erzeugen. Desweiteren sind sie auch geeignet, um höhere Ströme (bis 0,5 A, je nach Aufbau und Spule) zu entnehmen. Das Arbeitsprinzip bei Step-Up-Schaltreglern ist immer gleich: Eine Spule wird ständig an- und abgeschaltet und durch Eigeninduktion eine höhere Spannung erzeugt. Um einen Step-Up-Schaltregler aufzubauen, gibt es verschiedene Möglichkeiten:&lt;br /&gt;
&lt;br /&gt;
==== ICs ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* zuverlässig&lt;br /&gt;
* meist wenig Außenbeschaltung nötig&lt;br /&gt;
* geringe Größe, auch der Spule, da hohe Schaltfrequenzen verwendet werden&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* teuer, vor allem die, welche ab 1V arbeiten&lt;br /&gt;
* teilweise schwer zu bekommen&lt;br /&gt;
* benötigen mehr Aufwand für Filterung und Schirmung als Linearregler.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Bauteile]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Schaltregler-ICs&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! IC !! Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.tranzistoare.ro/datasheets/2300/57048_DS.pdf LT1073-5] ||1V (1 Zelle) auf 5V, 40mA&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.ortodoxism.ro/datasheets/lineartechnology/lt1301.pdf LT1301] ||2V (2 Zellen) auf 5V oder 12V, 250mA (erhältlich bei Conrad)&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.ortodoxism.ro/datasheets/lineartechnology/lt1302.pdf LT1302] ||2V (2 Zellen) auf 5V oder 12V, 250mA (erhältlich bei Reichelt und Conrad; Bauteil,Platine oder Fertigmodul bei Robotikhardware.de erhältlich)&lt;br /&gt;
|-&lt;br /&gt;
| [http://cds.linear.com/docs/Datasheet/3401fb.pdf LTC3401]  ||ziemlich geniales Teil, weil es mit hoher Schaltfrequenz arbeitet, dadurch kann eine kleine Spule verwendet und ein sehr hoher Wirkungsgrad erzielt werden. 0.5...5.5V Vin, 1,0V Startup-Voltage, 2,6...5,5V Vout, bis 1A&lt;br /&gt;
|-&lt;br /&gt;
| [http://cds.linear.com/docs/Datasheet/3429fa.pdf LTC3429]||0,5...4,4V Vin, 1,0V Startup-Voltage, 2,5...4,3V Vout, 100mA aus einer Zelle, 250mA aus zwei Zellen bei 3,3V Vout&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.linear.com/pc/downloadDocument.do?navId=H0,C1,C1003,C1042,C1031,C1060,P13393,D9338 LTC3525-5] ||&lt;br /&gt;
|-&lt;br /&gt;
| [http://datasheets.maxim-ic.com/en/ds/MAX866-MAX867.pdf MAX866/MAX867] ||ziemlich geniales Teil, weil es mit hoher Schaltfrequenz arbeitet, ab 0.8V, bei 0.9V Start-Up-Voltage&lt;br /&gt;
|-&lt;br /&gt;
| [http://datasheets.maxim-ic.com/en/ds/MAX1595.pdf MAX1595] || dito, benötigt lediglich 3 Kondensatoren als Außenbeschaltung&lt;br /&gt;
|-&lt;br /&gt;
| [http://datasheets.maxim-ic.com/en/ds/MAX1674-MAX1676.pdf MAX1674-1676] ||bis zu ein Ampere, bei einer Zelle ist aber bei 100mA Schluss, und das auch nur, wenn die Spannung beim &amp;quot;Hochfahren&amp;quot; höher war und die richtige Spule verwendet wird&lt;br /&gt;
|-&lt;br /&gt;
| [http://datasheets.maxim-ic.com/en/ds/MAX1759.pdf MAX1759] || noch ein Hochfrequenz-Teil&lt;br /&gt;
|-&lt;br /&gt;
| [http://datasheets.maxim-ic.com/en/ds/MAX1722-MAX1724.pdf MAX1722-1724] || bis 150 mA&lt;br /&gt;
|-&lt;br /&gt;
| [http://ww1.microchip.com/downloads/en/DeviceDoc/22234B.pdf MCP1640] ||ab 0.35V bei 0.65V startup, einfache Beschaltung, regelbare Ausgangsspannung, bis 350 mA, 19µA quiescent current, nur kleine Induktivität (4,7µH) nötig, bei Reichelt günstig erhältlich (0,55€)&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.prema.com/Application/whiteleddriver.html PR4401/PR4402]||22 und 44 mA, benötigen lediglich 1 externes Bauteil, die Spule. Einfach zu handhaben, bei Reichelt zu bekommen.&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.prema.com/Application/pr4404_e.html PR4404]||150 mA von einer, und 300 mA von zwei Zellen. Preiswert, bei Reichelt.&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.sipex.com/Files/DataSheets/sp6648.pdf SP6648] &lt;br /&gt;
|-&lt;br /&gt;
| [http://focus.ti.com/lit/ds/symlink/tps61200.pdf TPS61200/201/202] ||1,8..5,5V out, Quellspannung bis herunter auf 0,3V, ?&amp;gt;90%, 0,5mm Pinabstand, 3,15*3,15mm, 10-Pin QFN&lt;br /&gt;
|-&lt;br /&gt;
| [http://focus.ti.com/docs/prod/folders/print/tps61006.html TPS6100x]||Single- and Dual-Cell Boost Converster, min 0,8V Vin, 1,5V...3,3V Vout, min. 100mA aus einer Zelle, min.250mA auf zwei Zellen, Gehäuse 10MSOP&lt;br /&gt;
|-&lt;br /&gt;
| [http://focus.ti.com/docs/prod/folders/print/tps61016.html TPS6101x]||1-Cell and 2-Cell Boost Converters, TPS61006 and TPS61016 are functionally equivalent. TPS61006 is non-synchronous. TPS61016 is synchronous and does not require an external Schottky diode.&lt;br /&gt;
|-&lt;br /&gt;
| TPS6030x, TPS6031x, [http://www.ortodoxism.ro/datasheets/lineartechnology/15023f.pdf LTC1502-3.3]  ||(typ. 3,x V bei 15-20 mA)&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.ortodoxism.ro/datasheets2/7/0y1y62f9lzj79rs7uuf28jq4xtwy.pdf LM2621] &lt;br /&gt;
|-&lt;br /&gt;
| [[MC34063]]||(ungeeignet, läuft erst ab 3V)&lt;br /&gt;
|-&lt;br /&gt;
| [http://atmel.com/dyn/products/product_card.asp?part_id=4523 ATtiny43U]||AVR-Microcontroller, der einen Boost-Converter eingebaut hat und damit eine Batterie bis auf 0.7V aussaugen kann.&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.onsemi.com/pub_link/Collateral/NCP1400A-D.PDF NCP1400A]||Startup 0.8V / fertige Module bei Watterott erhältlich&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.onsemi.com/pub_link/Collateral/NCP1402-D.PDF NCP1402]||Startup 0.8V, 200mA, Preis &amp;lt; 1 Euro / fertige Module bei Watterott erhältlich&lt;br /&gt;
|-&lt;br /&gt;
| [http://cds.linear.com/docs/Datasheet/338813f.pdf LTC3388] ||Nanopower Step Down Regulator, weniger als 1µA Leerlaufstrom, 50mA Ausgangsstrom&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dioden&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Prakisch kann nahezu jede Schottkydiode mit ausreichend Strombelastbarkeit genutzt werden, siehe [[Dioden-Übersicht]].&lt;br /&gt;
&lt;br /&gt;
==== Diskrete Schaltungen ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile:&#039;&#039;&#039;&lt;br /&gt;
* größtmögliche Anpassung an Verwendungszweck&lt;br /&gt;
* teilweise schon mit Standardhühnerfutter aufzubauen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteile:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* kompliziert&lt;br /&gt;
* nicht garantierte Funktion (z.&amp;amp;nbsp;B. wegen gepulster Gleichspannung)&lt;br /&gt;
* schlechte EMV-Eigenschaften&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Auflistung diskreter Step-Up-Schaltregler:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* http://www.elektronik-kompendium.de/forum/forum_entry.php?id=17395&lt;br /&gt;
* http://www.joretronik.de/Web_NT_Buch/Kap6_2/Kapitel6_2.html#6.2&lt;br /&gt;
* http://www.mikrocontroller.net/topic/73532#604774&lt;br /&gt;
* [http://www.nxp.com/acrobat_download/applicationnotes/AN10218_1.pdf NXP AN10218] (PDF) (Philips LPC900 microcontroller) single cell power supply&lt;br /&gt;
* [http://www.b-kainka.de/bastel36.htm Der LED-Spannungswandler] von B. Kainka&lt;br /&gt;
* [http://www.bigclive.com/joule.htm Make a Joule Thief] - Versorgung einer LED aus einer 1,5V Zelle&lt;br /&gt;
* Diskussionen von &#039;&#039;&#039;Joule-Thief&#039;&#039;&#039; Schaltungen im Forum&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/47224 Sensor autark betreiben mit einem Thermogenerator]&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/55041 LEDs mit Akku(s) effizient betreiben]&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/38163 Wie kann man eine Knopfzellenspannung um ca. 1 Volt erhöhen]&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/62158 Spannungsanhebung 1,2V -&amp;gt; 2V]&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/77154 Step-Up Transistorschaltung für LED Lampe]&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/56523 3x 2,9V LEDs mit 2xAAA versorgen]&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/55962 Gibt es eine Möglichkeit LEDs bei 1V zu betreiben]&lt;br /&gt;
** [http://cappels.org/dproj/ledpage/leddrv.htm#Rusty_Nail_Night_Light Rusty Nail Night Light]&lt;br /&gt;
&lt;br /&gt;
=== Ladungspumpen ===&lt;br /&gt;
&lt;br /&gt;
Ladungspumpen erhöhen die Spannung, indem sie Kondensatoren zyklisch parallel laden, umpolen und in Reihe entladen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorteile:&#039;&#039;&#039;&lt;br /&gt;
* geringer Stromverbrauch, deshalb für Low-Power-Anwendungen gut geeignet&lt;br /&gt;
* keine Spulen, deshalb kein magnetisches Störfeld&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteile:&#039;&#039;&#039;&lt;br /&gt;
* nur geringe Ausgangsströme möglich (100mA)&lt;br /&gt;
* ICs nur für höhere Eingangspannungen erhältlich, ab 3V&lt;br /&gt;
* Teilweise starke Strompulse beim Umladen der Kondensatoren, womit empfindliche Analogschaltungen gestört werden können (Funkempfänger etc.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Auflistung von Ladungspumpen:&#039;&#039;&#039;&lt;br /&gt;
* TPS60300 - Vin 0,9-1,8V&lt;br /&gt;
* TPS60100 - Vin 1,8-3,6V (200mA)&lt;br /&gt;
* MAX1759 - Vin 1,6-5,5V (2-3 Zellen)&lt;br /&gt;
* ICL7660 - Vin 1,5-10V (10mA) [Pollin]&lt;br /&gt;
&lt;br /&gt;
== Forumsbeiträge zum Thema ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/45101 3v3 Volt aus einer 1v2 Volt Zelle]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/18789 Stromversorgung aus einer Zelle]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/73532 Step-Up Mignon zu 5V]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/141635 Stepup/-down: Konstante 5V aus 4xMonozelle]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/189526 Ersatz 9V-Block durch Mikrozelle]&lt;br /&gt;
&lt;br /&gt;
== Externe Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.powerdesignersusa.com/InfoWeb/index.shtml Powerdesigners InfoWeb] - Free tools, resources and education for power electronics designers and students (engl.)&lt;br /&gt;
* http://www.ti.com/power&lt;br /&gt;
* [http://focus.ti.com/lit/an/slaa105/slaa105.pdf TI Application Report SLAA 105] Simple 1.5-V Boost Converter for MSP430&lt;br /&gt;
* http://www.maxim-ic.com/products/power/&lt;br /&gt;
* 2-6V DC nach 5V DC Konverter auf der Basis des &#039;&#039;&#039;LT1302&#039;&#039;&#039; als  [http://www.shop.robotikhardware.de/shop/catalog/product_info.php?cPath=83&amp;amp;products_id=195 Fertigmodul] bzw. [http://www.shop.robotikhardware.de/shop/catalog/product_info.php?products_id=194 Platine] (Shop robotikhardware.de)&lt;br /&gt;
* [http://www.heise.de/mobil/Langzeittest-von-NiMH-Akkus-mit-reduzierter-Selbstentladung--/artikel/143297 Langzeittest von NiMH-Akkus mit reduzierter Selbstentladung] auf heise.de&lt;br /&gt;
* [http://spritesmods.com/?art=ucboost Run an uC from an AA-battery] auf spritesmods.com&lt;br /&gt;
* [http://www.powerstream.com/BatteryFAQ.html PowerStream Battery Chemistry FAQ]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/AppNotes/01416a.pdf AN1416: Low-Power Design Guide] von Microchip (PDF)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Bauteile]]&lt;br /&gt;
[[Kategorie:Spannungsversorgung und Energiequellen]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Equipment&amp;diff=77880</id>
		<title>AVR-Tutorial: Equipment</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Equipment&amp;diff=77880"/>
		<updated>2013-08-05T13:13:40Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Spannungsversorgung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AVR-Tutorial - Benötigte Ausrüstung =&lt;br /&gt;
==Hardware==&lt;br /&gt;
&lt;br /&gt;
Ein Mikrocontroller alleine ist noch zu nichts nützlich. Damit man etwas damit anfangen kann, braucht man eine Schaltung, in die der Controller eingesetzt wird. Dazu werden bei Elektronikhändlern Platinen angeboten, die alles nötige (Taster, LEDs, Steckverbinder...) enthalten. Häufig enthalten diese Platinen nicht nur Platz für den Mikroprozessor, sondern auch einen ISP-Programmierer (Näheres dazu später)&lt;br /&gt;
&lt;br /&gt;
Da es eine Unmenge verschiedener Mikrocontroller allein aus der AVR-Familie gibt, ist der Anfänger mit der Auswahl bereits überfordert. Dieses Tutorial (und viele andere auch) beginnt mit dem &#039;&#039;mittelgroßen&#039;&#039; Controller &#039;&#039;&#039;ATmega8&#039;&#039;&#039;. Die 8 steht für 8 Kilobyte Flash-Speicher. Er gilt als ideal für Einsteiger, und auch von „alten Hasen“ wird dieser Typ gern verwendet. Es gibt ihn im 28-poligen DIL-Gehäuse, ideal für Bastelschaltungen auf dem Steckbrett, als auch in verschiedenen SMD-Gehäusen, wenn das Endgerät klein werden soll.&lt;br /&gt;
&lt;br /&gt;
=== Fertige Evaluations-Boards und Starterkits ===&lt;br /&gt;
&lt;br /&gt;
==== AVR Starterkit aus dem Mikrocontroller.net-Shop ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Damit der Programmer mit AS5.x zusammen arbeitet, muss die Firmware aktualisiert werden: http://www.usbprog.org/index.php/Firmwares (siehe Update Hinweis)&lt;br /&gt;
&lt;br /&gt;
Sehr gut für dieses Tutorial geeignet ist das [http://shop.embedded-projects.net/index.php?module=artikel&amp;amp;action=artikel&amp;amp;id=108 AVR-Starterkit aus dem Mikrocontroller.net-Shop]. Das Kit enthält eine Platine mit dem Controller ATmega8, einen USB-ISP-Programmieradapter und ein Steckernetzteil. Die im Starterkit enthaltene [http://www.eproo.de/index.php?module=artikel&amp;amp;action=artikel&amp;amp;id=74 AVR Entwicklungsplatine für 28-pol. AVRs] gibt es auch einzeln. Diese enthält eine Fassung für den Controller, einen Spannungswandler, die Beschaltung für die serielle Schnittstelle und einen Anschluss für den Programmieradapter. Die restliche Hardware wie LEDs und Taster kann man sich selber nach Belieben auf das Lochrasterfeld löten.&lt;br /&gt;
&lt;br /&gt;
==== STK500 ====&lt;br /&gt;
[[Bild:Stk500.jpg|right]]&lt;br /&gt;
Das STK500 ist das Standard-Board für AVR Entwicklung, direkt von Atmel. Es enthält auch einen ISP-Programmer und ist fertig aufgebaut. Es ist unter Entwicklern sehr beliebt und wird natürlich von Atmel unterstützt. Es gilt allgemein als gute Investition, wenn man ernsthaft in das Thema einsteigen möchte.&lt;br /&gt;
&lt;br /&gt;
Das STK500 kostet bei Reichelt ca. 80 Euro (ein geeignetes Netzteil muss zusätzlich erworben werden).&lt;br /&gt;
&lt;br /&gt;
==== Pollin ATMEL Evaluations-Board Version 2.x ====&lt;br /&gt;
&lt;br /&gt;
Bei Pollin Elektronik gibt es für ca. 15 Euro ein Evaluations-Board als Bausatz zum Selbstlöten. Im Bausatz sind die Aufbauanleitung, die Platine und Bauteile enthalten. Der/die Mikrocontroller und eine Stromversorgung müssen separat beschafft werden. Auf dem Board ist ein einfacher ISP-Programmer (serielles &#039;&#039;bit-banging&#039;&#039;) integriert. &lt;br /&gt;
&lt;br /&gt;
Siehe: &lt;br /&gt;
* [[Pollin ATMEL Evaluations-Board]]&lt;br /&gt;
* http://www.pollin.de&lt;br /&gt;
&lt;br /&gt;
==== Pollin Funk-AVR-Evaluationsboard v1.x ====&lt;br /&gt;
&lt;br /&gt;
Bei diesem Board besteht die Möglichkeit, Funkmodule wie das [[RFM12]], RFM01 oder RFM02 auf dem Board aufzulöten.&lt;br /&gt;
&lt;br /&gt;
Siehe: &lt;br /&gt;
* [[Pollin Funk-AVR-Evaluationsboard]]&lt;br /&gt;
* [http://www.pollin.de http://www.pollin.de]&lt;br /&gt;
&lt;br /&gt;
==== Rumpus Board von lochraster.org ====&lt;br /&gt;
&lt;br /&gt;
Lochraster.org bietet ein Entwicklungsboard namens Rumpus an. Es kommt als Bausatz mit allen Teilen und Microcontroller (Atmega 168), auf dem Microcontroller ist bereits ein USB Bootloader installiert so dass man nach dem Zusammenbau sofort starten kann. Das Board wird direkt über USB mit Strom versorgt und auch über USB programmiert, es kann auch selbst als Programmer für AVR Microcontroller benutzt  werden. Das Board ist mit recht umfangreicher Peripherie ausgestattet, so das sich von sehr einfachen Anwendungen wie dem Blinken einer LED bis hin zu komplexen Aufgaben wie senden und empfangen von Infrarot Signalen eine Vielzahl von Anwendungen realisieren lassen. Mit 45 Euro gehört es sicher nicht zu den ganz billigen Einsteigerboards, für den ambitionierten Amateur bietet die reichhaltige Peripherie den Vorteil, das Board während des gesamten Lernprozesses zu nutzen ohne für die Realisierung komplexerer Aufgaben neue Hardware auflöten zu müssen. Auch relativiert sich dieser Preis wieder dadurch, dass kein ISP Programmer benötigt wird. Beim Umstieg auf ein anderes Board, für welches man dann einen ISP Programmer benötigt, kann der Rumpus diese Aufgabe übernehmen anstatt zum alten Eisen geworfen zu werden (s. Infos im [http://www.mikrocontroller.net/topic/217122#2165435 Forumbeitrag von Sebastian Noack]).&lt;br /&gt;
&lt;br /&gt;
Weitere Infos unter http://www.lochraster.org/ und http://wiki.lochraster.org/&lt;br /&gt;
&lt;br /&gt;
==== RN-Control ====&lt;br /&gt;
&lt;br /&gt;
Die Forengemeinde von Roboternetz hat ebenfalls ein Evaluierungsboard entwickelt, das mittlerweile sehr ausgereift ist und viele Erweiterungsmöglichkeiten bietet.&lt;br /&gt;
&lt;br /&gt;
Siehe:&lt;br /&gt;
* [http://robotikhardware.de/ http://robotikhardware.de/]&lt;br /&gt;
* [http://www.roboternetz.de/ http://www.roboternetz.de/]&lt;br /&gt;
&lt;br /&gt;
==== Arduino ====&lt;br /&gt;
Die Boards der [http://www.arduino.cc Arduino-Familie] bieten z.B. einen ATmega328P mit 16MHz und lassen sich über einen integrierten USB-seriell-Wandler und [[Bootloader]] programmieren. Die Ports sind auf Buchsenleisten herausgeführt. Arduino-Boards können auch unabhängig von der Arduino-Entwicklungsumgebung (Arduino-IDE) als AVR-Entwicklungsboard genutzt werden.&lt;br /&gt;
&lt;br /&gt;
==== Andere ====&lt;br /&gt;
&lt;br /&gt;
Das Angebot an AVR-Evaluationboards, -Experimentierplatinen, -Entwicklerplatinen oder wie die jeweiligen Hersteller ihre Produkte auch immer bezeichnen, ist mittlerweile recht groß geworden. Sie alle zu bewerten ist unmöglich geworden.&lt;br /&gt;
&lt;br /&gt;
===Selbstbau===&lt;br /&gt;
&lt;br /&gt;
Ein fertiges Board ist gar nicht nötig, man kann die benötigte Schaltung auch selbst auf einem kleinen Steckbrett oder einer Lochrasterplatine aufbauen. So kompliziert wie das STK500 wird es nicht, es reichen eine Handvoll Bauteile. Wie man das macht, wird im Folgenden beschrieben.&lt;br /&gt;
Steckbretter (Breadboards) gibt&#039;s z.&amp;amp;nbsp;B. bei [http://www.reichelt.de Reichelt],  [http://www.conelek.com/Steckplatinen ConeleK], [http://www.elv.de/ ELV] oder [http://www.conrad.de/ Conrad]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mega8_Tutorial.png|center|framed| Die Grundschaltung eines ATmega8/ATmega8A.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG:&#039;&#039;&#039; Die Pinbelegung der 6-poligen ISP-Verbindung weicht von den ATMEL Angaben ab! Wenn ATMEL oder ATMEL-kompatible ISP-Adapter benutzt werden, die Pinbelegung aus [http://www.atmel.com/dyn/resources/prod_documents/doc2521.pdf AVR042] (PDF) bzw. [[AVR_In_System_Programmer#Pinbelegung]] benutzen]]&lt;br /&gt;
&lt;br /&gt;
Über den Takteingang &#039;&#039;&#039;XTAL1&#039;&#039;&#039; ist der Mikrocontroller mit dem &#039;&#039;&#039;Quarzoszillator&#039;&#039;&#039; verbunden, der den benötigten Takt von 4 MHz liefert (siehe unten). Achtung: die Pins werden, wenn man den Oszillator mit der Schrift nach oben vor sich liegen hat, von unten links aus abgezählt. Unten links ist Pin 1, unten rechts Pin 7, oben rechts Pin 8 und oben links Pin 14 (natürlich hat der Oszillator nur 4 Pins. Die Nummerierung kommt daher, dass bei einem normalen IC dieser Größe an den gleichen Positionen die Pins Nr. 1, 7, 8 und 14 wären). Zu den Pins Datenblatt beachten [http://www.mikrocontroller.net/topic/204429#2015503].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PD0-PD7&#039;&#039;&#039; und &#039;&#039;&#039;PB0-PB5&#039;&#039;&#039; sind die &#039;&#039;&#039;IO-Ports&#039;&#039;&#039; des Mikrocontrollers. Hier können Bauteile wie LEDs, Taster oder LCDs angeschlossen werden.&lt;br /&gt;
Der &#039;&#039;&#039;Port C (PC0-PC5)&#039;&#039;&#039; spielt beim Atmega8 eine Sonderrolle: mit diesem Port können Analog-Spannungen gemessen werden. Aber dazu später mehr!&lt;br /&gt;
An &#039;&#039;&#039;Pin 17-19&#039;&#039;&#039; ist die Stiftleiste zur Verbindung mit dem ISP-Programmer angeschlossen, über den der AVR vom PC programmiert wird (Achtung: Pins in Abbildung entsprechen nicht der Belegung des AVRISP mkII. Die korrekte Pin-Belegung kann im Handbuch des AVRISP mkII eingesehen werden).&lt;br /&gt;
Die Resetschaltung, bestehend aus &#039;&#039;&#039;R1&#039;&#039;&#039; und &#039;&#039;&#039;C1&#039;&#039;&#039;, sorgt dafür, dass der Reseteingang des Controllers standardmäßig auf Vcc=+5V liegt.&lt;br /&gt;
Zum Programmieren zieht der ISP-Adapter die Resetleitung auf Masse (GND), die Programmausführung wird dadurch unterbrochen und der interne Speicher des Controllers kann neu programmiert werden.&lt;br /&gt;
Zwischen Vcc und GND kommen noch jeweils ein 100nF Keramik- oder Folienkondensator C3 und C4, um Störungen in der Versorgungsspannung zu unterdrücken. Diese [[Kondensator#Entkoppelkondensator | Abblockkondensatoren]] sollten so nah wie möglich am Controller platziert werden. An den Ausgang ARef wird ebenfalls ein 100nF Kondensator angeschlossen. Dieser wird allerdings erst benötigt, wenn der Analog/Digital Konverter des µC in Betrieb genommen wird.&lt;br /&gt;
&lt;br /&gt;
Für den Anschluss des ISP-Programmiergerätes kann man im Grunde jede beliebige Pin-Belegung des ISP Steckers benutzen, solange nur alle benötigten Leitungen mit dem Programmiergerät verbunden sind. In der Praxis haben sich allerdings bestimmte Belegungen durchgesetzt. Im Schaltbild ist eine &#039;&#039;&#039;eigene&#039;&#039;&#039; Belegung des 6-poligen Steckers gezeigt. Die alternative Pinbelegung eines 2-reihigen/10-poligen Steckers ist eine übliche Belegung. Benutzt man so eine übliche Belegung, so reicht normalerweise ein 10-poliges Flachbandkabel, um den vorhandenen ISP-Programmer so mit der Schaltung zu verbinden, dass alle Signale am richtigen Prozessorpin ankommen. Siehe auch [[AVR_In_System_Programmer]].&lt;br /&gt;
&lt;br /&gt;
Hier die Liste der benötigten Bauteile: &lt;br /&gt;
&lt;br /&gt;
* R1         Widerstand 10 kOhm&lt;br /&gt;
* C1         Keramikkondensator 47 nF&lt;br /&gt;
* C2, C3, C4 Keramik- oder Folienkondensator 100 nF&lt;br /&gt;
*            Stiftleiste 6-polig&lt;br /&gt;
*            Mikrocontroller ATmega8 oder ATmega8A (kann u.a. auf [http://shop.mikrocontroller.net/ http://shop.mikrocontroller.net/] bestellt werden)&lt;br /&gt;
*            Quarzoszillator 4 MHz&lt;br /&gt;
&lt;br /&gt;
Beim Steckbrett ist darauf zu achten, dass man die parallellaufenden Schienen für GND (blau) und Vcc (rot) jeweils mit Drähten verbindet (nicht Vcc und GND miteinander!).&lt;br /&gt;
&lt;br /&gt;
Eine Zusammenstellung der benötigten Bauteile befindet sich in der [[AVR-Tutorial_Bestellliste|Bestellliste]].&lt;br /&gt;
&lt;br /&gt;
Eine weitere Beschreibung für ein Minimalsystem gibt es [http://conelek.org/Mikrocontroller_Minimalsystem_mit_AVR_ATMega8 hier.]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 1px solid grey; padding: 1ex; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ergänzende Hinweise zur Taktversorgung (kann übersprungen werden) ===&lt;br /&gt;
&lt;br /&gt;
Ein Mikrocontroller benötigt, wie jeder Computer, eine Taktversorgung. Der Takt ist notwendig, um die internen Abläufe im Prozessor in einer zeitlich geordneten Reihenfolge ausführen zu können. Die Frequenz des Taktes bestimmt im Wesentlichen, wie schnell ein Mikrocontroller arbeitet. Bei einem ATMega8 gibt es viele Möglichkeiten zur Taktversorgung, die Wichtigsten sollen hier gezeigt werden.&lt;br /&gt;
&lt;br /&gt;
* interner RC-Oszillator, das ist der Auslieferungszustand&lt;br /&gt;
* Keramikresonator&lt;br /&gt;
* Quarz&lt;br /&gt;
* Quarzoszillator&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Vergleich der AVR-Taktquellen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Typ || Genauigkeit || Vorteile || Nachteile&lt;br /&gt;
|-&lt;br /&gt;
| interner&amp;lt;br&amp;gt;RC-Oszillator || 1-5% || Xtal1/2 Pins verfügbar&amp;lt;br&amp;gt;kostenlos&amp;lt;br&amp;gt;kein Platzbedarf&amp;lt;br&amp;gt;schnellstes Einschwingen (wenige Takte) || ungenau&amp;lt;br&amp;gt;Betrieb der [[UART]] riskant&lt;br /&gt;
|-&lt;br /&gt;
| Keramikresonator || 0,5-1% || ausreichend genau für [[UART]]&amp;lt;br&amp;gt;in sehr hohen Stückzahlen billiger als Quarz&amp;lt;br&amp;gt;schnelleres Einschwingen als Quarz (ca. 1ms) || XTAL1/2 Pins nicht verfügbar&amp;lt;br&amp;gt;Platzbedarf&lt;br /&gt;
|-&lt;br /&gt;
| Quarz || 10-100ppm || sehr genau&amp;lt;br&amp;gt;temperaturstabil || XTAL1/2 Pins nicht verfügbar&amp;lt;br&amp;gt;Platzbedarf&amp;lt;br&amp;gt;Kosten bei sehr hohen Stückzahlen (1000++)&amp;lt;br&amp;gt;langsames Anschwingen (ca. 10ms)&amp;lt;br&amp;gt;2 zusätzliche Ballast-Kondensatoren typ. 22 pF&lt;br /&gt;
|-&lt;br /&gt;
| Quarzoszillator || 1-100ppm || hochgenau&amp;lt;br&amp;gt;sehr temperaturstabil&amp;lt;br&amp;gt;liefert selbst ein Signal, kann dadurch [[AVR_Fuses#Taktquellen_Fuse_Einstellung | verfuste AVRs]] retten&amp;lt;br&amp;gt;kann mehrere Takteingänge treiben || XTAL1 Pin nicht verfügbar&amp;lt;br&amp;gt;Platzbedarf&amp;lt;br&amp;gt;Kosten bei sehr hohen Stückzahlen (1000++)&amp;lt;br&amp;gt;langsames Anschwingen (ca. 10ms)&lt;br /&gt;
|}&lt;br /&gt;
1ppm = 0,0001% (engl. one &#039;&#039;&#039;p&#039;&#039;&#039;art &#039;&#039;&#039;p&#039;&#039;&#039;er &#039;&#039;&#039;m&#039;&#039;&#039;illion, der millionste Teil) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;FF0000&amp;quot;&amp;gt;Achtung: Ein ATMega8 wird mit aktiviertem internen RC-Oszillator ausgeliefert. Um eine andere Taktquelle zu aktivieren, müssen die [[AVR Fuses#Taktquellen Fuse Einstellung|AVR Fuses]] des Prozessors verändert werden. Das muss jedoch sehr vorsichtig gemacht werden, siehe Artikel.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Keramikresonator ====&lt;br /&gt;
&lt;br /&gt;
Die Anbindung des Keramikresonators sieht so aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Resonator.png|framed|center| Resonator Standardbeschaltung]]&lt;br /&gt;
&lt;br /&gt;
Es werden keine Kondensatoren benötigt, diese sind schon eingebaut, daher ist der Anschluss eines Keramikschwingers kinderleicht. Achtung: Keramikresonatoren gibt es mit zwei oder drei Pins. Nur die mit drei Pins besitzen interne Kondensatoren.&lt;br /&gt;
&lt;br /&gt;
==== Quarz ====&lt;br /&gt;
&lt;br /&gt;
Die Anbindung des Quarzes sieht so aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:tutorial-quarz-schaltplan.png|center|framed| Quarz Standardbeschaltung]]&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren &#039;&#039;&#039;C3&#039;&#039;&#039; und &#039;&#039;&#039;C4&#039;&#039;&#039; sind zum Betrieb des Quarzes notwendig. Ihre Größe ist abhängig von den Daten des Quarzes. Zur Berechnung ihrer Größe gibt es die folgende Formel:&lt;br /&gt;
&lt;br /&gt;
C=2xCL-(CP+CI)&lt;br /&gt;
&lt;br /&gt;
* CP: Leiterbahnen bedingte Kapazität&lt;br /&gt;
* CI: Portbedingte Kapazität&lt;br /&gt;
* CL: Datenblatt des Quarzes&lt;br /&gt;
CP+CI ca. 5pF ?&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von CL = 32pF:&lt;br /&gt;
&lt;br /&gt;
C = 2x32pF-5pF = 59pF&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Spannungsversorgung ===&lt;br /&gt;
&lt;br /&gt;
Die Versorgungsspannung &#039;&#039;&#039;U&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt;&#039;&#039;&#039; beträgt 5V und kann z.&amp;amp;nbsp;B. mit der in diesem Kapitel beschriebenen Schaltung erzeugt werden. Falls zum Programmieren des Mikrocontrollers ein [[AVR_In_System_Programmer|ISP-Programmiergerät]] verwendet wird, das an die USB-Schnittstelle angeschlossen ist, kann man die Schaltung auch darüber mit Strom versorgen und dieses Kapitel überspringen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:V_Regler.gif|framed|center|Standard-Netzteilbeschaltung eines 7805]]&lt;br /&gt;
&lt;br /&gt;
Bauteile:&lt;br /&gt;
* IC1: 5V-Spannungsregler 7805&lt;br /&gt;
* C1: Elko 10µF (Polung beachten!)&lt;br /&gt;
* C2,C3: 2x Kondensator 100nF (kein Elektrolyt)&lt;br /&gt;
* D1: Diode 1N4001&lt;br /&gt;
&lt;br /&gt;
Hauptelement der Schaltung ist das IC 7805. Seine Aufgabe ist es aus der Versorgungsspannung stabile 5 V zu erzeugen. Dieses IC gibt es seit vielen Jahren und wird von vielen Chipherstellern produziert. Er stellt die einfachste Möglichkeit dar, aus einer vorhandenen Gleichspannung definierte 5 V zu erzeugen. Den 7805 gibt es in verschiedenen Ausführungen, was seine maximale Strombelastung angeht. Für die Zwecke dieses Tutorials ist die Standard-Variante, welche maximal 1 A abgeben kann, völlig ausreichend. Der 7805 enthält eine Übertemperatursicherung, so dass er abschaltet, wenn es ihm zu heiß wird. Auch ansonsten ist dieser Spannungsregler-IC kaum kaputt zu bekommen.&lt;br /&gt;
&lt;br /&gt;
Die beiden 100-nF-Kondensatoren haben die Aufgabe, eine mögliche Schwingneigung des 7805 zu unterdrücken. Sie müssen so nahe wie möglich an den Anschlusspins des 7805 angeschlossen werden, um ihre Wirkung zu entfalten.&lt;br /&gt;
&lt;br /&gt;
An den Eingang (+ und – im Schaltplan) wird ein Steckernetzteil mit einer Spannung von 7 .. 12 V angeschlossen. Der 7805 benötigt an seinem Eingang eine Gleichspannung, die mindestens 7 V beträgt. Auf der anderen Seite ergibt es auch keinen Sinn, wesentlich über 12 V Eingangsspannung hinauszugehen. Der 7805 ist ein Linearregler. Salopp gesagt, wird die überschüssige Spannung in Form von Wärme vernichtet. Deshalb die Kühlfahne zum thermischen Anschluss an eine Wärmesenke. Liegt die Eingangsspannung weit über 12 V, so wird schon wesentlich mehr Energie in Form von Wärme umgesetzt, als am Ausgang entnommen werden kann. Mal ganz davon abgesehen, dass der 7805 davon brennend heiß wird. Je nach Strombedarf der Gesamtschaltung kann es zweckmäßig sein, einen Schaltregler vorzusehen, wenn die Eingangsspannung stark schwanken kann, etwa für die alternative Speisung mit 24 V aus einem Schaltschrank oder dem LKW-Bordnetz. Für Anfänger führt das zu weit, und ein Kühlblech am 7805 tut es dann auch.&lt;br /&gt;
&lt;br /&gt;
Hier ein paar kleine Rechenbeispiele:&lt;br /&gt;
12 V Eingangsspannung – 5 V Ausgangsspannung = 7 V Differenz x 0,1 A Strombedarf der Schaltung ergibt die Verlustwärme die abgeführt werden muss.&lt;br /&gt;
&lt;br /&gt;
7 V × 0,1 A = 0,7 Watt&lt;br /&gt;
&lt;br /&gt;
Wenn man jetzt eine Eingangsspannung von 7 V nimmt, so dass die Mindestdifferenz von 2V noch eingehalten wird kommen wir zu diesen Werten&lt;br /&gt;
&lt;br /&gt;
2 V ×  0,1 A = 0,2 Watt Abwärme&lt;br /&gt;
2 V × 0,35 A = 0,7 Watt Abwärme oder anders gesagt, können wir der Schaltung 350 mA entnehmen und haben die gleiche Abwärme wie im oberen Beispiel mit nur 100 mA Stromentnahme.&lt;br /&gt;
&lt;br /&gt;
Man sieht, dass man die Eingangsspannung so klein wie möglich wählen sollte um dadurch die Verluste in Grenzen halten zu können. Außerdem ist es meist so, dass für eine geringere Stromentnahme auch eine niedrigere Differenzspannung ausreicht. In manchen Datenblätter ist z.B. angegeben 0,5 A = 1 V Spannungsgefälle und bei 1 A = 2 V Gefälle …&lt;br /&gt;
&lt;br /&gt;
Weiterhin sei gesagt, dass es so genannte Low-Drop-, Ultra-Low-Drop- usw. -Regler gibt, die mit einer viel kleineren Differenz zwischen Ein- und Ausgangsspannung zurechtkommen, wodurch man die Verluste noch weiter drücken kann.&lt;br /&gt;
&lt;br /&gt;
Eine Stromversorgung mit Batterien ist grundsätzlich auch möglich, wenn die elektrischen Grenzdaten des Mikrocontrollers eingehalten werden (max. Spannung, min. Spannung). Bei der geregelten Stromversorgung oben sollte die Batteriespannung ca. 1,5 .. 2,5 V (Dropout-Spannung des Linearreglers) größer sein als die Versorgungsspannung des Controllers. Die [[Versorgung aus einer Zelle]] ist ein Thema für Fortgeschrittene. In der Regel verzichtet man dabei auf die Spannungsregelung, da der Controller in einem weiten Speisespannungsbereich betriebsfähig ist.&lt;br /&gt;
&lt;br /&gt;
=== Beispielhafter Aufbau auf einem [[Steckbrett]] ===&lt;br /&gt;
&lt;br /&gt;
Auf einem [[Steckbrett]] könnte eine Schaltung etwa so aussehen:&lt;br /&gt;
&lt;br /&gt;
[[Bild:tutorial_grundschaltung_breadboard.jpg|600px|center|Steckbrett mit Selbstschaltung Atmega8 und Quarz als externe Taktquelle]]&lt;br /&gt;
&lt;br /&gt;
Hier ist die oben beschriebene Selbstbauschaltung zu sehen.  Spannungsversorgung (links), 6-poliger ISP-Anschluss (rechts hinter dem µC), Quarz mit 2 Kondensatoren statt Oszillator, erweitert um eine LED mit Vorwiderstand an PB0 (rechts vor dem µC), einem Resettaster (links vor dem µC) und einem Stützkondensator zwischen +5V und GND (rechts unten).&lt;br /&gt;
&lt;br /&gt;
=== Der ISP-Programmierer (In-System-Programmer)===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mikrocontroller.gif|framed|right|ISP Programmierer]]&lt;br /&gt;
Dann braucht man nur noch den &#039;&#039;&#039;ISP-Programmieradapter&#039;&#039;&#039;, über den man die Programme vom PC in den Controller übertragen kann. Eine Übersicht über mögliche ISP-Programmer Varianten findet sich im Artikel [[AVR_In_System_Programmer]].&lt;br /&gt;
&lt;br /&gt;
Fertige ISP-Programmer zum Anschluss an den Parallelport oder USB gibt es z.&amp;amp;nbsp;B. auf http://shop.mikrocontroller.net/. &lt;br /&gt;
&lt;br /&gt;
Eine Bauanleitung gibt es u.a. auf [http://www.rn-wissen.de/index.php/AVR-ISP_Programmierkabel http://www.rn-wissen.de/index.php/AVR-ISP_Programmierkabel] oder [http://rumil.de/hardware/avrisp.html http://rumil.de/hardware/avrisp.html].&lt;br /&gt;
&lt;br /&gt;
Den ISP-Adapter schließt man an den Parallelport an und verbindet ihn mit der Stiftleiste SV1 über ein 6-adriges Kabel (siehe Schaltplan).&lt;br /&gt;
&lt;br /&gt;
=== Sonstiges ===&lt;br /&gt;
&lt;br /&gt;
Wer vorausschauend kauft, kauft mehr als einen Mikrocontroller. Bis der erste Controller defekt ist, oder man durch Austauschen sicher gehen möchte, ob der Fehler im Programm oder im Controller ist, vergeht nur wenig Zeit.&lt;br /&gt;
&lt;br /&gt;
Tipp: Die Preise für Mikrocontroller haben eine deutliche Spannweite, nicht selten ist ein und derselbe Typ für 3 oder 8 Euro zu haben. Oft sind neuere oder größere Modelle billiger (ATmega8A statt ATmega8, ATmega328 statt ATmega8A). Eine Suche im Internet lohnt sich. Das Gleiche gilt für den Kauf von ISP-Programmierern.&lt;br /&gt;
&lt;br /&gt;
Für weitere Kapitel dieses Tutorials sollte man sich noch die folgenden Bauteile besorgen: &lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 2 (I/O-Grundlagen)&lt;br /&gt;
* 6 LEDs 5mm (Standard-LED, ruhig auch in unterschiedlichen Farben, rot/gelb/grün)&lt;br /&gt;
* 5 Taster&lt;br /&gt;
* 6 Widerstände 1k&lt;br /&gt;
* 5 Widerstände 10k&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 6 (LC-Display)&lt;br /&gt;
* 1 Potentiometer 10k&lt;br /&gt;
* 1 HD44780-kompatibles LCD, z.&amp;amp;nbsp;B. 4x20 oder 2x16 Zeichen&lt;br /&gt;
*   besitzt das LCD eine Hintergrundbeleuchtung, dann noch einen Vorwiderstand dafür. Details dazu stehen im Datenblatt des LCD. Ein Wert von 50Ω sollte aber in jedem Fall passen. Schlimmstenfalls ist die Hintergrundbeleuchtung dann etwas zu dunkel.&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 10 (Der UART)&lt;br /&gt;
* 1 Pegelwandler MAX232, MAX232&#039;&#039;&#039;A&#039;&#039;&#039; oder MAX202&lt;br /&gt;
* 5 Kondensatoren&lt;br /&gt;
** Bei einem MAX232: je 1µF Elektrolytkondensator&lt;br /&gt;
** Bei einem MAX202 oder MAX232&#039;&#039;&#039;A&#039;&#039;&#039;: je  100nF Keramik- oder Elektrolytkondensator&lt;br /&gt;
:Die Kondensatoren dürfen auch größer sein. Ist man sich nicht sicher, welchen MAX232 man hat (A oder nicht A), dann die größeren Kondensatoren 1µF nehmen, die funktionieren auch beim MAX232A oder MAX202.&lt;br /&gt;
* 1 9-polige SUBD-Buchse (female)&lt;br /&gt;
* 1 dazu passendes Modem(nicht Nullmodem!)-Kabel&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 14 (ADC)&lt;br /&gt;
* 1 Kondensator 100n&lt;br /&gt;
* 1 Potentiometer 10k&lt;br /&gt;
* nach Lust und Laune temperatur- oder lichtabhängige Widerstände und jeweils einen Widerstand in der gleichen Größenordnung wie der Sensor&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 17 (Schieberegister)&lt;br /&gt;
* 2 Schieberegister 74HC595&lt;br /&gt;
* einige LED, damit man an die Schieberegister auch etwas anschließen kann, samt passenden Vorwiderständen&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 19 (7-Segmentanzeige)&lt;br /&gt;
* 4 7-Segmentanzeigen mit gemeinsamer Anode&lt;br /&gt;
* 4 PNP-Transistoren BC328&lt;br /&gt;
* 4 Widerstände 1k&lt;br /&gt;
* 7 Widerstände 100Ω&lt;br /&gt;
&lt;br /&gt;
Für weitere Bauteile, die man als angehender µC Bastler auch des Öfteren mal benötigt, empfiehlt sich ein Blick in die Liste der [[Standardbauelemente]] bzw. in die [[Absolute_beginner|Grundausstattung]]. Wenn Ihr Händler Großpackungen (zb. 100 Stück) von 100n Kondensatoren, 10k, 1k oder 100Ω Widerständen anbietet, sollten Sie deren Erwerb in Erwägung ziehen. Diese Bauteile benötigt man oft, und derartige Großpackungen sind meist nicht teurer, als wenn man einige wenige Exemplare einzeln kauft. Dies hängt damit zusammen, dass das Herauszählen von 9 Bauteilen für den Verkäufer teurer kommt, als 100 Bauteile abgepackt aus dem Regal zu nehmen.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
In diesem Tutorial wird nur auf die Programmierung in Assembler eingegangen, da Assembler für das Verständnis der Hardware am besten geeignet ist.&lt;br /&gt;
&lt;br /&gt;
=== Assembler ===&lt;br /&gt;
&lt;br /&gt;
Zuerst braucht man einen &#039;&#039;&#039;Assembler&#039;&#039;&#039;, der in Assemblersprache geschriebene Programme in Maschinencode übersetzt. Windows-User können das [http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2725 AVR-Studio] von Atmel verwenden, das neben dem Assembler auch einen Simulator enthält, mit dem sich die Programme vor der Übertragung in den Controller testen lassen; für Linux gibt es [http://www.tavrasm.org/ tavrasm], [http://avra.sourceforge.net/ avra] und [http://avr-asm-tutorial.net/gavrasm/index_de.html gavrasm]. &lt;br /&gt;
&lt;br /&gt;
Um die vom Assembler erzeugte &amp;quot;.hex&amp;quot;-Datei über den ISP-Adapter in den Mikrocontroller zu programmieren, kann man unter Windows z.&amp;amp;nbsp;B. das Programm [http://www.myplace.nu/avr/yaap/ yaap] verwenden, für Linux gibt es [http://savannah.nongnu.org/projects/uisp/ uisp], für beide avrdude.&lt;br /&gt;
&lt;br /&gt;
=== C ===&lt;br /&gt;
Wer in C programmieren möchte, kann den kostenlosen GNU-C-Compiler AVR-GCC (unter Windows &amp;quot;WinAVR&amp;quot;) ausprobieren. Dieser C-Compiler kann auch in das für Assembler-Programmierung notwendige AVR-Studio integriert werden. In der Artikelsammlung gibt es ein umfangreiches [[AVR-GCC-Tutorial|Tutorial]] zu diesem Compiler;&lt;br /&gt;
&lt;br /&gt;
Wer unter Windows und Linux gleichermassen kostenlos entwickeln will, der sollte sich die [http://www.eclipse.org/ IDE Eclipse for C/C++ Developers] und das [http://avr-eclipse.sourceforge.net/wiki/index.php/The_AVR_Eclipse_Plugin AVR-Eclipse Plugin ] ansehen, beide sind unter Windows und Linux einfach zu installieren. Hier wird auch der AVR-GCC benutzt. In der Artikelsammlung gibt es ein umfangreiches [[AVR Eclipse|AVR Eclipse Tutorial]] zu dieser IDE.&lt;br /&gt;
Ebenfalls unter Linux und Windows verfügbar ist die Entwicklungsumgebung [http://www.codeblocks.org/ Code::Blocks] (aktuelle, stabile Versionen sind als Nightly Builds regelmäßig im [http://forums.codeblocks.org/ Forum] verfügbar). Innerhalb dieser Entwicklungsumgebung können ohne die Installation zusätzlicher Plugins &amp;quot;AVR-Projekte&amp;quot; angelegt werden.&lt;br /&gt;
&lt;br /&gt;
Fragen dazu stellt man am besten hier im [http://www.mikrocontroller.net/forum/list-2-1.html GCC-Forum].&lt;br /&gt;
&lt;br /&gt;
=== Pascal ===&lt;br /&gt;
Wer in Pascal programmieren muss, kann [http://www.e-lab.de AVRPascal] ausprobieren.&amp;lt;br&amp;gt; &lt;br /&gt;
Dieser Pascalcompiler ist kostenfrei bis 4kb Code und bietet viele ausgereifte Bibliotheken für Servoansteuerung, Serielle Schnittstellen (COM, TWI, SPI), PWM, Timernutzung, LC-Displays usw.&amp;lt;br&amp;gt; &lt;br /&gt;
Außerdem gibt es eine kostenfreie Version für den Mega8 und den Mega88.&lt;br /&gt;
[http://www.e-lab.de E-LAB].&lt;br /&gt;
&lt;br /&gt;
=== Basic ===&lt;br /&gt;
Auch Basic-Fans kommen nicht zu kurz, für die gibt es z.&amp;amp;nbsp;B. [[Bascom AVR]] ($69, Demo verfügbar) oder das kostenlose [[http://avr.myluna.de LunaAVR]].&lt;br /&gt;
&lt;br /&gt;
=== Forth ===&lt;br /&gt;
Wer einen direkten und interaktiven Zugang zum Controller haben will, sollte sich [http://amforth.sourceforge.net Forth] anschauen. Voraussetzung ist ein serieller Anschluß (Max232), also etwas mehr als die Minimalbeschaltung.&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
Bevor man anfängt, sollte man sich die folgenden PDF-Dateien runterladen und zumindest mal reinschauen:&lt;br /&gt;
&lt;br /&gt;
* [http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf Datenblatt des ATmega8 (4,54 MB)]&lt;br /&gt;
* [http://www.atmel.com/dyn/resources/prod_documents/doc0856.pdf Befehlssatz der AVRs (1,27 MB)]&lt;br /&gt;
* oder [http://www.avr-roboter.de/controller/befehle/befehle.html Befehlssatz in deutscher Übersetzung online]&lt;br /&gt;
* oder [http://www.avr-modelleisenbahn.de/atmega8/0-einleitung.htm Datenblatt des ATmega8 in deutscher Übersetzung online]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Datenblatt eines Controllers ist das wichtigste Dokument für einen Entwickler. Es enthält Informationen über die Pinbelegung, Versorgungsspannung, Beschaltung, Speicher, die Verwendung der IO-Komponenten und vieles mehr.&lt;br /&gt;
&lt;br /&gt;
Im Befehlssatz sind alle Assemblerbefehle der AVR-Controllerfamilie aufgelistet und erklärt.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
{{Navigation_hochvor|	 &lt;br /&gt;
hochtext=Inhaltsverzeichnis|	 &lt;br /&gt;
hochlink=AVR-Tutorial|	 &lt;br /&gt;
vortext=I/O Grundlagen|	 &lt;br /&gt;
vorlink=AVR-Tutorial: IO-Grundlagen}}	 &lt;br /&gt;
 &lt;br /&gt;
[[Category:AVR-Tutorial|Equipment]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Equipment&amp;diff=77879</id>
		<title>AVR-Tutorial: Equipment</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Equipment&amp;diff=77879"/>
		<updated>2013-08-05T13:00:46Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Ergänzende Hinweise zur Taktversorgung (kann übersprungen werden) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AVR-Tutorial - Benötigte Ausrüstung =&lt;br /&gt;
==Hardware==&lt;br /&gt;
&lt;br /&gt;
Ein Mikrocontroller alleine ist noch zu nichts nützlich. Damit man etwas damit anfangen kann, braucht man eine Schaltung, in die der Controller eingesetzt wird. Dazu werden bei Elektronikhändlern Platinen angeboten, die alles nötige (Taster, LEDs, Steckverbinder...) enthalten. Häufig enthalten diese Platinen nicht nur Platz für den Mikroprozessor, sondern auch einen ISP-Programmierer (Näheres dazu später)&lt;br /&gt;
&lt;br /&gt;
Da es eine Unmenge verschiedener Mikrocontroller allein aus der AVR-Familie gibt, ist der Anfänger mit der Auswahl bereits überfordert. Dieses Tutorial (und viele andere auch) beginnt mit dem &#039;&#039;mittelgroßen&#039;&#039; Controller &#039;&#039;&#039;ATmega8&#039;&#039;&#039;. Die 8 steht für 8 Kilobyte Flash-Speicher. Er gilt als ideal für Einsteiger, und auch von „alten Hasen“ wird dieser Typ gern verwendet. Es gibt ihn im 28-poligen DIL-Gehäuse, ideal für Bastelschaltungen auf dem Steckbrett, als auch in verschiedenen SMD-Gehäusen, wenn das Endgerät klein werden soll.&lt;br /&gt;
&lt;br /&gt;
=== Fertige Evaluations-Boards und Starterkits ===&lt;br /&gt;
&lt;br /&gt;
==== AVR Starterkit aus dem Mikrocontroller.net-Shop ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Damit der Programmer mit AS5.x zusammen arbeitet, muss die Firmware aktualisiert werden: http://www.usbprog.org/index.php/Firmwares (siehe Update Hinweis)&lt;br /&gt;
&lt;br /&gt;
Sehr gut für dieses Tutorial geeignet ist das [http://shop.embedded-projects.net/index.php?module=artikel&amp;amp;action=artikel&amp;amp;id=108 AVR-Starterkit aus dem Mikrocontroller.net-Shop]. Das Kit enthält eine Platine mit dem Controller ATmega8, einen USB-ISP-Programmieradapter und ein Steckernetzteil. Die im Starterkit enthaltene [http://www.eproo.de/index.php?module=artikel&amp;amp;action=artikel&amp;amp;id=74 AVR Entwicklungsplatine für 28-pol. AVRs] gibt es auch einzeln. Diese enthält eine Fassung für den Controller, einen Spannungswandler, die Beschaltung für die serielle Schnittstelle und einen Anschluss für den Programmieradapter. Die restliche Hardware wie LEDs und Taster kann man sich selber nach Belieben auf das Lochrasterfeld löten.&lt;br /&gt;
&lt;br /&gt;
==== STK500 ====&lt;br /&gt;
[[Bild:Stk500.jpg|right]]&lt;br /&gt;
Das STK500 ist das Standard-Board für AVR Entwicklung, direkt von Atmel. Es enthält auch einen ISP-Programmer und ist fertig aufgebaut. Es ist unter Entwicklern sehr beliebt und wird natürlich von Atmel unterstützt. Es gilt allgemein als gute Investition, wenn man ernsthaft in das Thema einsteigen möchte.&lt;br /&gt;
&lt;br /&gt;
Das STK500 kostet bei Reichelt ca. 80 Euro (ein geeignetes Netzteil muss zusätzlich erworben werden).&lt;br /&gt;
&lt;br /&gt;
==== Pollin ATMEL Evaluations-Board Version 2.x ====&lt;br /&gt;
&lt;br /&gt;
Bei Pollin Elektronik gibt es für ca. 15 Euro ein Evaluations-Board als Bausatz zum Selbstlöten. Im Bausatz sind die Aufbauanleitung, die Platine und Bauteile enthalten. Der/die Mikrocontroller und eine Stromversorgung müssen separat beschafft werden. Auf dem Board ist ein einfacher ISP-Programmer (serielles &#039;&#039;bit-banging&#039;&#039;) integriert. &lt;br /&gt;
&lt;br /&gt;
Siehe: &lt;br /&gt;
* [[Pollin ATMEL Evaluations-Board]]&lt;br /&gt;
* http://www.pollin.de&lt;br /&gt;
&lt;br /&gt;
==== Pollin Funk-AVR-Evaluationsboard v1.x ====&lt;br /&gt;
&lt;br /&gt;
Bei diesem Board besteht die Möglichkeit, Funkmodule wie das [[RFM12]], RFM01 oder RFM02 auf dem Board aufzulöten.&lt;br /&gt;
&lt;br /&gt;
Siehe: &lt;br /&gt;
* [[Pollin Funk-AVR-Evaluationsboard]]&lt;br /&gt;
* [http://www.pollin.de http://www.pollin.de]&lt;br /&gt;
&lt;br /&gt;
==== Rumpus Board von lochraster.org ====&lt;br /&gt;
&lt;br /&gt;
Lochraster.org bietet ein Entwicklungsboard namens Rumpus an. Es kommt als Bausatz mit allen Teilen und Microcontroller (Atmega 168), auf dem Microcontroller ist bereits ein USB Bootloader installiert so dass man nach dem Zusammenbau sofort starten kann. Das Board wird direkt über USB mit Strom versorgt und auch über USB programmiert, es kann auch selbst als Programmer für AVR Microcontroller benutzt  werden. Das Board ist mit recht umfangreicher Peripherie ausgestattet, so das sich von sehr einfachen Anwendungen wie dem Blinken einer LED bis hin zu komplexen Aufgaben wie senden und empfangen von Infrarot Signalen eine Vielzahl von Anwendungen realisieren lassen. Mit 45 Euro gehört es sicher nicht zu den ganz billigen Einsteigerboards, für den ambitionierten Amateur bietet die reichhaltige Peripherie den Vorteil, das Board während des gesamten Lernprozesses zu nutzen ohne für die Realisierung komplexerer Aufgaben neue Hardware auflöten zu müssen. Auch relativiert sich dieser Preis wieder dadurch, dass kein ISP Programmer benötigt wird. Beim Umstieg auf ein anderes Board, für welches man dann einen ISP Programmer benötigt, kann der Rumpus diese Aufgabe übernehmen anstatt zum alten Eisen geworfen zu werden (s. Infos im [http://www.mikrocontroller.net/topic/217122#2165435 Forumbeitrag von Sebastian Noack]).&lt;br /&gt;
&lt;br /&gt;
Weitere Infos unter http://www.lochraster.org/ und http://wiki.lochraster.org/&lt;br /&gt;
&lt;br /&gt;
==== RN-Control ====&lt;br /&gt;
&lt;br /&gt;
Die Forengemeinde von Roboternetz hat ebenfalls ein Evaluierungsboard entwickelt, das mittlerweile sehr ausgereift ist und viele Erweiterungsmöglichkeiten bietet.&lt;br /&gt;
&lt;br /&gt;
Siehe:&lt;br /&gt;
* [http://robotikhardware.de/ http://robotikhardware.de/]&lt;br /&gt;
* [http://www.roboternetz.de/ http://www.roboternetz.de/]&lt;br /&gt;
&lt;br /&gt;
==== Arduino ====&lt;br /&gt;
Die Boards der [http://www.arduino.cc Arduino-Familie] bieten z.B. einen ATmega328P mit 16MHz und lassen sich über einen integrierten USB-seriell-Wandler und [[Bootloader]] programmieren. Die Ports sind auf Buchsenleisten herausgeführt. Arduino-Boards können auch unabhängig von der Arduino-Entwicklungsumgebung (Arduino-IDE) als AVR-Entwicklungsboard genutzt werden.&lt;br /&gt;
&lt;br /&gt;
==== Andere ====&lt;br /&gt;
&lt;br /&gt;
Das Angebot an AVR-Evaluationboards, -Experimentierplatinen, -Entwicklerplatinen oder wie die jeweiligen Hersteller ihre Produkte auch immer bezeichnen, ist mittlerweile recht groß geworden. Sie alle zu bewerten ist unmöglich geworden.&lt;br /&gt;
&lt;br /&gt;
===Selbstbau===&lt;br /&gt;
&lt;br /&gt;
Ein fertiges Board ist gar nicht nötig, man kann die benötigte Schaltung auch selbst auf einem kleinen Steckbrett oder einer Lochrasterplatine aufbauen. So kompliziert wie das STK500 wird es nicht, es reichen eine Handvoll Bauteile. Wie man das macht, wird im Folgenden beschrieben.&lt;br /&gt;
Steckbretter (Breadboards) gibt&#039;s z.&amp;amp;nbsp;B. bei [http://www.reichelt.de Reichelt],  [http://www.conelek.com/Steckplatinen ConeleK], [http://www.elv.de/ ELV] oder [http://www.conrad.de/ Conrad]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mega8_Tutorial.png|center|framed| Die Grundschaltung eines ATmega8/ATmega8A.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG:&#039;&#039;&#039; Die Pinbelegung der 6-poligen ISP-Verbindung weicht von den ATMEL Angaben ab! Wenn ATMEL oder ATMEL-kompatible ISP-Adapter benutzt werden, die Pinbelegung aus [http://www.atmel.com/dyn/resources/prod_documents/doc2521.pdf AVR042] (PDF) bzw. [[AVR_In_System_Programmer#Pinbelegung]] benutzen]]&lt;br /&gt;
&lt;br /&gt;
Über den Takteingang &#039;&#039;&#039;XTAL1&#039;&#039;&#039; ist der Mikrocontroller mit dem &#039;&#039;&#039;Quarzoszillator&#039;&#039;&#039; verbunden, der den benötigten Takt von 4 MHz liefert (siehe unten). Achtung: die Pins werden, wenn man den Oszillator mit der Schrift nach oben vor sich liegen hat, von unten links aus abgezählt. Unten links ist Pin 1, unten rechts Pin 7, oben rechts Pin 8 und oben links Pin 14 (natürlich hat der Oszillator nur 4 Pins. Die Nummerierung kommt daher, dass bei einem normalen IC dieser Größe an den gleichen Positionen die Pins Nr. 1, 7, 8 und 14 wären). Zu den Pins Datenblatt beachten [http://www.mikrocontroller.net/topic/204429#2015503].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PD0-PD7&#039;&#039;&#039; und &#039;&#039;&#039;PB0-PB5&#039;&#039;&#039; sind die &#039;&#039;&#039;IO-Ports&#039;&#039;&#039; des Mikrocontrollers. Hier können Bauteile wie LEDs, Taster oder LCDs angeschlossen werden.&lt;br /&gt;
Der &#039;&#039;&#039;Port C (PC0-PC5)&#039;&#039;&#039; spielt beim Atmega8 eine Sonderrolle: mit diesem Port können Analog-Spannungen gemessen werden. Aber dazu später mehr!&lt;br /&gt;
An &#039;&#039;&#039;Pin 17-19&#039;&#039;&#039; ist die Stiftleiste zur Verbindung mit dem ISP-Programmer angeschlossen, über den der AVR vom PC programmiert wird (Achtung: Pins in Abbildung entsprechen nicht der Belegung des AVRISP mkII. Die korrekte Pin-Belegung kann im Handbuch des AVRISP mkII eingesehen werden).&lt;br /&gt;
Die Resetschaltung, bestehend aus &#039;&#039;&#039;R1&#039;&#039;&#039; und &#039;&#039;&#039;C1&#039;&#039;&#039;, sorgt dafür, dass der Reseteingang des Controllers standardmäßig auf Vcc=+5V liegt.&lt;br /&gt;
Zum Programmieren zieht der ISP-Adapter die Resetleitung auf Masse (GND), die Programmausführung wird dadurch unterbrochen und der interne Speicher des Controllers kann neu programmiert werden.&lt;br /&gt;
Zwischen Vcc und GND kommen noch jeweils ein 100nF Keramik- oder Folienkondensator C3 und C4, um Störungen in der Versorgungsspannung zu unterdrücken. Diese [[Kondensator#Entkoppelkondensator | Abblockkondensatoren]] sollten so nah wie möglich am Controller platziert werden. An den Ausgang ARef wird ebenfalls ein 100nF Kondensator angeschlossen. Dieser wird allerdings erst benötigt, wenn der Analog/Digital Konverter des µC in Betrieb genommen wird.&lt;br /&gt;
&lt;br /&gt;
Für den Anschluss des ISP-Programmiergerätes kann man im Grunde jede beliebige Pin-Belegung des ISP Steckers benutzen, solange nur alle benötigten Leitungen mit dem Programmiergerät verbunden sind. In der Praxis haben sich allerdings bestimmte Belegungen durchgesetzt. Im Schaltbild ist eine &#039;&#039;&#039;eigene&#039;&#039;&#039; Belegung des 6-poligen Steckers gezeigt. Die alternative Pinbelegung eines 2-reihigen/10-poligen Steckers ist eine übliche Belegung. Benutzt man so eine übliche Belegung, so reicht normalerweise ein 10-poliges Flachbandkabel, um den vorhandenen ISP-Programmer so mit der Schaltung zu verbinden, dass alle Signale am richtigen Prozessorpin ankommen. Siehe auch [[AVR_In_System_Programmer]].&lt;br /&gt;
&lt;br /&gt;
Hier die Liste der benötigten Bauteile: &lt;br /&gt;
&lt;br /&gt;
* R1         Widerstand 10 kOhm&lt;br /&gt;
* C1         Keramikkondensator 47 nF&lt;br /&gt;
* C2, C3, C4 Keramik- oder Folienkondensator 100 nF&lt;br /&gt;
*            Stiftleiste 6-polig&lt;br /&gt;
*            Mikrocontroller ATmega8 oder ATmega8A (kann u.a. auf [http://shop.mikrocontroller.net/ http://shop.mikrocontroller.net/] bestellt werden)&lt;br /&gt;
*            Quarzoszillator 4 MHz&lt;br /&gt;
&lt;br /&gt;
Beim Steckbrett ist darauf zu achten, dass man die parallellaufenden Schienen für GND (blau) und Vcc (rot) jeweils mit Drähten verbindet (nicht Vcc und GND miteinander!).&lt;br /&gt;
&lt;br /&gt;
Eine Zusammenstellung der benötigten Bauteile befindet sich in der [[AVR-Tutorial_Bestellliste|Bestellliste]].&lt;br /&gt;
&lt;br /&gt;
Eine weitere Beschreibung für ein Minimalsystem gibt es [http://conelek.org/Mikrocontroller_Minimalsystem_mit_AVR_ATMega8 hier.]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 1px solid grey; padding: 1ex; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ergänzende Hinweise zur Taktversorgung (kann übersprungen werden) ===&lt;br /&gt;
&lt;br /&gt;
Ein Mikrocontroller benötigt, wie jeder Computer, eine Taktversorgung. Der Takt ist notwendig, um die internen Abläufe im Prozessor in einer zeitlich geordneten Reihenfolge ausführen zu können. Die Frequenz des Taktes bestimmt im Wesentlichen, wie schnell ein Mikrocontroller arbeitet. Bei einem ATMega8 gibt es viele Möglichkeiten zur Taktversorgung, die Wichtigsten sollen hier gezeigt werden.&lt;br /&gt;
&lt;br /&gt;
* interner RC-Oszillator, das ist der Auslieferungszustand&lt;br /&gt;
* Keramikresonator&lt;br /&gt;
* Quarz&lt;br /&gt;
* Quarzoszillator&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Vergleich der AVR-Taktquellen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Typ || Genauigkeit || Vorteile || Nachteile&lt;br /&gt;
|-&lt;br /&gt;
| interner&amp;lt;br&amp;gt;RC-Oszillator || 1-5% || Xtal1/2 Pins verfügbar&amp;lt;br&amp;gt;kostenlos&amp;lt;br&amp;gt;kein Platzbedarf&amp;lt;br&amp;gt;schnellstes Einschwingen (wenige Takte) || ungenau&amp;lt;br&amp;gt;Betrieb der [[UART]] riskant&lt;br /&gt;
|-&lt;br /&gt;
| Keramikresonator || 0,5-1% || ausreichend genau für [[UART]]&amp;lt;br&amp;gt;in sehr hohen Stückzahlen billiger als Quarz&amp;lt;br&amp;gt;schnelleres Einschwingen als Quarz (ca. 1ms) || XTAL1/2 Pins nicht verfügbar&amp;lt;br&amp;gt;Platzbedarf&lt;br /&gt;
|-&lt;br /&gt;
| Quarz || 10-100ppm || sehr genau&amp;lt;br&amp;gt;temperaturstabil || XTAL1/2 Pins nicht verfügbar&amp;lt;br&amp;gt;Platzbedarf&amp;lt;br&amp;gt;Kosten bei sehr hohen Stückzahlen (1000++)&amp;lt;br&amp;gt;langsames Anschwingen (ca. 10ms)&amp;lt;br&amp;gt;2 zusätzliche Ballast-Kondensatoren typ. 22 pF&lt;br /&gt;
|-&lt;br /&gt;
| Quarzoszillator || 1-100ppm || hochgenau&amp;lt;br&amp;gt;sehr temperaturstabil&amp;lt;br&amp;gt;liefert selbst ein Signal, kann dadurch [[AVR_Fuses#Taktquellen_Fuse_Einstellung | verfuste AVRs]] retten&amp;lt;br&amp;gt;kann mehrere Takteingänge treiben || XTAL1 Pin nicht verfügbar&amp;lt;br&amp;gt;Platzbedarf&amp;lt;br&amp;gt;Kosten bei sehr hohen Stückzahlen (1000++)&amp;lt;br&amp;gt;langsames Anschwingen (ca. 10ms)&lt;br /&gt;
|}&lt;br /&gt;
1ppm = 0,0001% (engl. one &#039;&#039;&#039;p&#039;&#039;&#039;art &#039;&#039;&#039;p&#039;&#039;&#039;er &#039;&#039;&#039;m&#039;&#039;&#039;illion, der millionste Teil) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;FF0000&amp;quot;&amp;gt;Achtung: Ein ATMega8 wird mit aktiviertem internen RC-Oszillator ausgeliefert. Um eine andere Taktquelle zu aktivieren, müssen die [[AVR Fuses#Taktquellen Fuse Einstellung|AVR Fuses]] des Prozessors verändert werden. Das muss jedoch sehr vorsichtig gemacht werden, siehe Artikel.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Keramikresonator ====&lt;br /&gt;
&lt;br /&gt;
Die Anbindung des Keramikresonators sieht so aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Resonator.png|framed|center| Resonator Standardbeschaltung]]&lt;br /&gt;
&lt;br /&gt;
Es werden keine Kondensatoren benötigt, diese sind schon eingebaut, daher ist der Anschluss eines Keramikschwingers kinderleicht. Achtung: Keramikresonatoren gibt es mit zwei oder drei Pins. Nur die mit drei Pins besitzen interne Kondensatoren.&lt;br /&gt;
&lt;br /&gt;
==== Quarz ====&lt;br /&gt;
&lt;br /&gt;
Die Anbindung des Quarzes sieht so aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:tutorial-quarz-schaltplan.png|center|framed| Quarz Standardbeschaltung]]&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren &#039;&#039;&#039;C3&#039;&#039;&#039; und &#039;&#039;&#039;C4&#039;&#039;&#039; sind zum Betrieb des Quarzes notwendig. Ihre Größe ist abhängig von den Daten des Quarzes. Zur Berechnung ihrer Größe gibt es die folgende Formel:&lt;br /&gt;
&lt;br /&gt;
C=2xCL-(CP+CI)&lt;br /&gt;
&lt;br /&gt;
* CP: Leiterbahnen bedingte Kapazität&lt;br /&gt;
* CI: Portbedingte Kapazität&lt;br /&gt;
* CL: Datenblatt des Quarzes&lt;br /&gt;
CP+CI ca. 5pF ?&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von CL = 32pF:&lt;br /&gt;
&lt;br /&gt;
C = 2x32pF-5pF = 59pF&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Spannungsversorgung ===&lt;br /&gt;
&lt;br /&gt;
Die Versorgungsspannung &#039;&#039;&#039;Vcc&#039;&#039;&#039; beträgt 5V und kann z.&amp;amp;nbsp;B. mit der in diesem Kapitel beschriebenen Schaltung erzeugt werden. Falls zum Programmieren des Mikrocontrollers ein [[AVR_In_System_Programmer|ISP-Programmiergerät]] verwendet wird, das an die USB-Schnittstelle angeschlossen ist, kann man die Schaltung auch darüber mit Strom versorgen und dieses Kapitel überspringen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:V_Regler.gif|framed|center|Standard-Netzteilbeschaltung eines 7805]]&lt;br /&gt;
&lt;br /&gt;
Bauteile:&lt;br /&gt;
* IC1: 5V-Spannungsregler 7805&lt;br /&gt;
* C1: Elko 10µF (Polung beachten!)&lt;br /&gt;
* C2,C3: 2x Kondensator 100nF (kein Elektrolyt)&lt;br /&gt;
* D1: Diode 1N4001&lt;br /&gt;
&lt;br /&gt;
Hauptelement der Schaltung ist das IC 7805. Seine Aufgabe ist es aus der Versorgungsspannung stabile 5V zu erzeugen. Dieses IC gibt es seit vielen Jahren und wird von vielen Chipherstellern produziert. Er stellt die einfachste und simpelste Möglichkeit dar, aus einer vorhandenen Gleichspannung definierte 5V zu erzeugen. Den 7805 gibt es in verschiedenen Ausführungen, was seine maximale Strombelastung angeht. Für die Zwecke dieses Tutorials ist die Standard-Variante, welche maximal 1A abgeben kann, völlig ausreichend. Der 7805 enthält eine Übertemperatursicherung, so dass er abschaltet, wenn es ihm zu heiß wird.&lt;br /&gt;
&lt;br /&gt;
Die beiden 100nF Kondensatoren haben die Aufgabe, eine mögliche Schwingneigung des 7805 zu unterdrücken. Sie müssen so nahe wie möglich an den Anschlusspins des 7805 angeschlossen werden, um ihre Wirkung zu entfalten.&lt;br /&gt;
&lt;br /&gt;
An den Eingang (+ und - im Schaltplan) wird ein Steckernetzteil mit einer Spannung von 7 - 12V angeschlossen. Der 7805 benötigt an seinem Eingang eine Gleichspannung, die mindestens 7V beträgt. Auf der anderen Seite ergibt es auch keinen Sinn, wesentlich über 12V Eingangsspannung hinauszugehen. Der 7805 ist ein Linearregler. Salopp gesagt, wird die überschüssige Spannung in Form von Wärme vernichtet. Liegt die Eingangsspannung weit über 12V, so wird schon wesentlich mehr Energie in Form von Wärme umgesetzt, als am Ausgang entnommen werden kann. Mal ganz davon abgesehen, dass der 7805 davon brennend heiß werden wird.&lt;br /&gt;
&lt;br /&gt;
Hier ein paar kleine Rechenbeispiele:&lt;br /&gt;
12V Eingangsspannung - 5V Ausgangsspannung = 7V Differenz x 0,1A Strombedarf der Schaltung ergibt die Verlustwärme die abgeführt werden muss.&lt;br /&gt;
&lt;br /&gt;
7V x 0,1A = 0,7 Watt&lt;br /&gt;
&lt;br /&gt;
Wenn man jetzt eine Eingangsspannung von 7V nimmt, so dass die Mindestdifferenz von 2V noch eingehalten wird kommen wir zu diesen Werten&lt;br /&gt;
&lt;br /&gt;
2V x  0,1A = 0,2 Watt Abwärme&lt;br /&gt;
2V x 0,35A = 0,7 Watt Abwärme oder anders gesagt, können wir der Schaltung 350mA entnehmen und haben die gleiche Abwärme wie im oberen Beispiel mit nur 100mA Stromentnahme.&lt;br /&gt;
&lt;br /&gt;
Man sieht, dass man die Eingangsspannung so klein wie möglich wählen sollte um dadurch die Verluste in Grenzen halten zu können. Außerdem ist es meist so, dass für eine geringere Stromentnahme auch eine niedrigere Differenzspannung ausreicht. In manchen Datenblätter ist z.B. angegeben 0,5A = 1V Dropvoltage und bei 1A = 2V Dropvoltage....&lt;br /&gt;
&lt;br /&gt;
Weiterhin sei gesagt, dass es so genannte Low Drop, Ultra Low Drop...Regler gibt, die mit einer viel kleineren Differenz zw. Ein- und Ausgangsspannung zurechtkommen, wodurch man die Verluste noch weiter drücken kann.&lt;br /&gt;
&lt;br /&gt;
Eine Stromversorgung mit Batterien ist grundsätzlich auch möglich, wenn die elektrischen Grenzdaten des µC eingehalten werden (max. Spannung, min. Spannung). Bei der geregelten Stromversorgung oben sollte die Batteriespannung ca. 1.5 - 2.5V (Dropout-Spannung des Linearreglers) größer sein als die Versorgungsspannung des µC. Die [[Versorgung aus einer Zelle]] ist ein Thema für Fortgeschrittene.&lt;br /&gt;
&lt;br /&gt;
=== Beispielhafter Aufbau auf einem [[Steckbrett]] ===&lt;br /&gt;
&lt;br /&gt;
Auf einem [[Steckbrett]] könnte eine Schaltung etwa so aussehen:&lt;br /&gt;
&lt;br /&gt;
[[Bild:tutorial_grundschaltung_breadboard.jpg|600px|center|Steckbrett mit Selbstschaltung Atmega8 und Quarz als externe Taktquelle]]&lt;br /&gt;
&lt;br /&gt;
Hier ist die oben beschriebene Selbstbauschaltung zu sehen.  Spannungsversorgung (links), 6-poliger ISP-Anschluss (rechts hinter dem µC), Quarz mit 2 Kondensatoren statt Oszillator, erweitert um eine LED mit Vorwiderstand an PB0 (rechts vor dem µC), einem Resettaster (links vor dem µC) und einem Stützkondensator zwischen +5V und GND (rechts unten).&lt;br /&gt;
&lt;br /&gt;
=== Der ISP-Programmierer (In-System-Programmer)===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mikrocontroller.gif|framed|right|ISP Programmierer]]&lt;br /&gt;
Dann braucht man nur noch den &#039;&#039;&#039;ISP-Programmieradapter&#039;&#039;&#039;, über den man die Programme vom PC in den Controller übertragen kann. Eine Übersicht über mögliche ISP-Programmer Varianten findet sich im Artikel [[AVR_In_System_Programmer]].&lt;br /&gt;
&lt;br /&gt;
Fertige ISP-Programmer zum Anschluss an den Parallelport oder USB gibt es z.&amp;amp;nbsp;B. auf http://shop.mikrocontroller.net/. &lt;br /&gt;
&lt;br /&gt;
Eine Bauanleitung gibt es u.a. auf [http://www.rn-wissen.de/index.php/AVR-ISP_Programmierkabel http://www.rn-wissen.de/index.php/AVR-ISP_Programmierkabel] oder [http://rumil.de/hardware/avrisp.html http://rumil.de/hardware/avrisp.html].&lt;br /&gt;
&lt;br /&gt;
Den ISP-Adapter schließt man an den Parallelport an und verbindet ihn mit der Stiftleiste SV1 über ein 6-adriges Kabel (siehe Schaltplan).&lt;br /&gt;
&lt;br /&gt;
=== Sonstiges ===&lt;br /&gt;
&lt;br /&gt;
Wer vorausschauend kauft, kauft mehr als einen Mikrocontroller. Bis der erste Controller defekt ist, oder man durch Austauschen sicher gehen möchte, ob der Fehler im Programm oder im Controller ist, vergeht nur wenig Zeit.&lt;br /&gt;
&lt;br /&gt;
Tipp: Die Preise für Mikrocontroller haben eine deutliche Spannweite, nicht selten ist ein und derselbe Typ für 3 oder 8 Euro zu haben. Oft sind neuere oder größere Modelle billiger (ATmega8A statt ATmega8, ATmega328 statt ATmega8A). Eine Suche im Internet lohnt sich. Das Gleiche gilt für den Kauf von ISP-Programmierern.&lt;br /&gt;
&lt;br /&gt;
Für weitere Kapitel dieses Tutorials sollte man sich noch die folgenden Bauteile besorgen: &lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 2 (I/O-Grundlagen)&lt;br /&gt;
* 6 LEDs 5mm (Standard-LED, ruhig auch in unterschiedlichen Farben, rot/gelb/grün)&lt;br /&gt;
* 5 Taster&lt;br /&gt;
* 6 Widerstände 1k&lt;br /&gt;
* 5 Widerstände 10k&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 6 (LC-Display)&lt;br /&gt;
* 1 Potentiometer 10k&lt;br /&gt;
* 1 HD44780-kompatibles LCD, z.&amp;amp;nbsp;B. 4x20 oder 2x16 Zeichen&lt;br /&gt;
*   besitzt das LCD eine Hintergrundbeleuchtung, dann noch einen Vorwiderstand dafür. Details dazu stehen im Datenblatt des LCD. Ein Wert von 50Ω sollte aber in jedem Fall passen. Schlimmstenfalls ist die Hintergrundbeleuchtung dann etwas zu dunkel.&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 10 (Der UART)&lt;br /&gt;
* 1 Pegelwandler MAX232, MAX232&#039;&#039;&#039;A&#039;&#039;&#039; oder MAX202&lt;br /&gt;
* 5 Kondensatoren&lt;br /&gt;
** Bei einem MAX232: je 1µF Elektrolytkondensator&lt;br /&gt;
** Bei einem MAX202 oder MAX232&#039;&#039;&#039;A&#039;&#039;&#039;: je  100nF Keramik- oder Elektrolytkondensator&lt;br /&gt;
:Die Kondensatoren dürfen auch größer sein. Ist man sich nicht sicher, welchen MAX232 man hat (A oder nicht A), dann die größeren Kondensatoren 1µF nehmen, die funktionieren auch beim MAX232A oder MAX202.&lt;br /&gt;
* 1 9-polige SUBD-Buchse (female)&lt;br /&gt;
* 1 dazu passendes Modem(nicht Nullmodem!)-Kabel&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 14 (ADC)&lt;br /&gt;
* 1 Kondensator 100n&lt;br /&gt;
* 1 Potentiometer 10k&lt;br /&gt;
* nach Lust und Laune temperatur- oder lichtabhängige Widerstände und jeweils einen Widerstand in der gleichen Größenordnung wie der Sensor&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 17 (Schieberegister)&lt;br /&gt;
* 2 Schieberegister 74HC595&lt;br /&gt;
* einige LED, damit man an die Schieberegister auch etwas anschließen kann, samt passenden Vorwiderständen&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 19 (7-Segmentanzeige)&lt;br /&gt;
* 4 7-Segmentanzeigen mit gemeinsamer Anode&lt;br /&gt;
* 4 PNP-Transistoren BC328&lt;br /&gt;
* 4 Widerstände 1k&lt;br /&gt;
* 7 Widerstände 100Ω&lt;br /&gt;
&lt;br /&gt;
Für weitere Bauteile, die man als angehender µC Bastler auch des Öfteren mal benötigt, empfiehlt sich ein Blick in die Liste der [[Standardbauelemente]] bzw. in die [[Absolute_beginner|Grundausstattung]]. Wenn Ihr Händler Großpackungen (zb. 100 Stück) von 100n Kondensatoren, 10k, 1k oder 100Ω Widerständen anbietet, sollten Sie deren Erwerb in Erwägung ziehen. Diese Bauteile benötigt man oft, und derartige Großpackungen sind meist nicht teurer, als wenn man einige wenige Exemplare einzeln kauft. Dies hängt damit zusammen, dass das Herauszählen von 9 Bauteilen für den Verkäufer teurer kommt, als 100 Bauteile abgepackt aus dem Regal zu nehmen.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
In diesem Tutorial wird nur auf die Programmierung in Assembler eingegangen, da Assembler für das Verständnis der Hardware am besten geeignet ist.&lt;br /&gt;
&lt;br /&gt;
=== Assembler ===&lt;br /&gt;
&lt;br /&gt;
Zuerst braucht man einen &#039;&#039;&#039;Assembler&#039;&#039;&#039;, der in Assemblersprache geschriebene Programme in Maschinencode übersetzt. Windows-User können das [http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2725 AVR-Studio] von Atmel verwenden, das neben dem Assembler auch einen Simulator enthält, mit dem sich die Programme vor der Übertragung in den Controller testen lassen; für Linux gibt es [http://www.tavrasm.org/ tavrasm], [http://avra.sourceforge.net/ avra] und [http://avr-asm-tutorial.net/gavrasm/index_de.html gavrasm]. &lt;br /&gt;
&lt;br /&gt;
Um die vom Assembler erzeugte &amp;quot;.hex&amp;quot;-Datei über den ISP-Adapter in den Mikrocontroller zu programmieren, kann man unter Windows z.&amp;amp;nbsp;B. das Programm [http://www.myplace.nu/avr/yaap/ yaap] verwenden, für Linux gibt es [http://savannah.nongnu.org/projects/uisp/ uisp], für beide avrdude.&lt;br /&gt;
&lt;br /&gt;
=== C ===&lt;br /&gt;
Wer in C programmieren möchte, kann den kostenlosen GNU-C-Compiler AVR-GCC (unter Windows &amp;quot;WinAVR&amp;quot;) ausprobieren. Dieser C-Compiler kann auch in das für Assembler-Programmierung notwendige AVR-Studio integriert werden. In der Artikelsammlung gibt es ein umfangreiches [[AVR-GCC-Tutorial|Tutorial]] zu diesem Compiler;&lt;br /&gt;
&lt;br /&gt;
Wer unter Windows und Linux gleichermassen kostenlos entwickeln will, der sollte sich die [http://www.eclipse.org/ IDE Eclipse for C/C++ Developers] und das [http://avr-eclipse.sourceforge.net/wiki/index.php/The_AVR_Eclipse_Plugin AVR-Eclipse Plugin ] ansehen, beide sind unter Windows und Linux einfach zu installieren. Hier wird auch der AVR-GCC benutzt. In der Artikelsammlung gibt es ein umfangreiches [[AVR Eclipse|AVR Eclipse Tutorial]] zu dieser IDE.&lt;br /&gt;
Ebenfalls unter Linux und Windows verfügbar ist die Entwicklungsumgebung [http://www.codeblocks.org/ Code::Blocks] (aktuelle, stabile Versionen sind als Nightly Builds regelmäßig im [http://forums.codeblocks.org/ Forum] verfügbar). Innerhalb dieser Entwicklungsumgebung können ohne die Installation zusätzlicher Plugins &amp;quot;AVR-Projekte&amp;quot; angelegt werden.&lt;br /&gt;
&lt;br /&gt;
Fragen dazu stellt man am besten hier im [http://www.mikrocontroller.net/forum/list-2-1.html GCC-Forum].&lt;br /&gt;
&lt;br /&gt;
=== Pascal ===&lt;br /&gt;
Wer in Pascal programmieren muss, kann [http://www.e-lab.de AVRPascal] ausprobieren.&amp;lt;br&amp;gt; &lt;br /&gt;
Dieser Pascalcompiler ist kostenfrei bis 4kb Code und bietet viele ausgereifte Bibliotheken für Servoansteuerung, Serielle Schnittstellen (COM, TWI, SPI), PWM, Timernutzung, LC-Displays usw.&amp;lt;br&amp;gt; &lt;br /&gt;
Außerdem gibt es eine kostenfreie Version für den Mega8 und den Mega88.&lt;br /&gt;
[http://www.e-lab.de E-LAB].&lt;br /&gt;
&lt;br /&gt;
=== Basic ===&lt;br /&gt;
Auch Basic-Fans kommen nicht zu kurz, für die gibt es z.&amp;amp;nbsp;B. [[Bascom AVR]] ($69, Demo verfügbar) oder das kostenlose [[http://avr.myluna.de LunaAVR]].&lt;br /&gt;
&lt;br /&gt;
=== Forth ===&lt;br /&gt;
Wer einen direkten und interaktiven Zugang zum Controller haben will, sollte sich [http://amforth.sourceforge.net Forth] anschauen. Voraussetzung ist ein serieller Anschluß (Max232), also etwas mehr als die Minimalbeschaltung.&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
Bevor man anfängt, sollte man sich die folgenden PDF-Dateien runterladen und zumindest mal reinschauen:&lt;br /&gt;
&lt;br /&gt;
* [http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf Datenblatt des ATmega8 (4,54 MB)]&lt;br /&gt;
* [http://www.atmel.com/dyn/resources/prod_documents/doc0856.pdf Befehlssatz der AVRs (1,27 MB)]&lt;br /&gt;
* oder [http://www.avr-roboter.de/controller/befehle/befehle.html Befehlssatz in deutscher Übersetzung online]&lt;br /&gt;
* oder [http://www.avr-modelleisenbahn.de/atmega8/0-einleitung.htm Datenblatt des ATmega8 in deutscher Übersetzung online]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Datenblatt eines Controllers ist das wichtigste Dokument für einen Entwickler. Es enthält Informationen über die Pinbelegung, Versorgungsspannung, Beschaltung, Speicher, die Verwendung der IO-Komponenten und vieles mehr.&lt;br /&gt;
&lt;br /&gt;
Im Befehlssatz sind alle Assemblerbefehle der AVR-Controllerfamilie aufgelistet und erklärt.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
{{Navigation_hochvor|	 &lt;br /&gt;
hochtext=Inhaltsverzeichnis|	 &lt;br /&gt;
hochlink=AVR-Tutorial|	 &lt;br /&gt;
vortext=I/O Grundlagen|	 &lt;br /&gt;
vorlink=AVR-Tutorial: IO-Grundlagen}}	 &lt;br /&gt;
 &lt;br /&gt;
[[Category:AVR-Tutorial|Equipment]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Equipment&amp;diff=77878</id>
		<title>AVR-Tutorial: Equipment</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Equipment&amp;diff=77878"/>
		<updated>2013-08-05T12:54:57Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AVR-Tutorial - Benötigte Ausrüstung =&lt;br /&gt;
==Hardware==&lt;br /&gt;
&lt;br /&gt;
Ein Mikrocontroller alleine ist noch zu nichts nützlich. Damit man etwas damit anfangen kann, braucht man eine Schaltung, in die der Controller eingesetzt wird. Dazu werden bei Elektronikhändlern Platinen angeboten, die alles nötige (Taster, LEDs, Steckverbinder...) enthalten. Häufig enthalten diese Platinen nicht nur Platz für den Mikroprozessor, sondern auch einen ISP-Programmierer (Näheres dazu später)&lt;br /&gt;
&lt;br /&gt;
Da es eine Unmenge verschiedener Mikrocontroller allein aus der AVR-Familie gibt, ist der Anfänger mit der Auswahl bereits überfordert. Dieses Tutorial (und viele andere auch) beginnt mit dem &#039;&#039;mittelgroßen&#039;&#039; Controller &#039;&#039;&#039;ATmega8&#039;&#039;&#039;. Die 8 steht für 8 Kilobyte Flash-Speicher. Er gilt als ideal für Einsteiger, und auch von „alten Hasen“ wird dieser Typ gern verwendet. Es gibt ihn im 28-poligen DIL-Gehäuse, ideal für Bastelschaltungen auf dem Steckbrett, als auch in verschiedenen SMD-Gehäusen, wenn das Endgerät klein werden soll.&lt;br /&gt;
&lt;br /&gt;
=== Fertige Evaluations-Boards und Starterkits ===&lt;br /&gt;
&lt;br /&gt;
==== AVR Starterkit aus dem Mikrocontroller.net-Shop ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Damit der Programmer mit AS5.x zusammen arbeitet, muss die Firmware aktualisiert werden: http://www.usbprog.org/index.php/Firmwares (siehe Update Hinweis)&lt;br /&gt;
&lt;br /&gt;
Sehr gut für dieses Tutorial geeignet ist das [http://shop.embedded-projects.net/index.php?module=artikel&amp;amp;action=artikel&amp;amp;id=108 AVR-Starterkit aus dem Mikrocontroller.net-Shop]. Das Kit enthält eine Platine mit dem Controller ATmega8, einen USB-ISP-Programmieradapter und ein Steckernetzteil. Die im Starterkit enthaltene [http://www.eproo.de/index.php?module=artikel&amp;amp;action=artikel&amp;amp;id=74 AVR Entwicklungsplatine für 28-pol. AVRs] gibt es auch einzeln. Diese enthält eine Fassung für den Controller, einen Spannungswandler, die Beschaltung für die serielle Schnittstelle und einen Anschluss für den Programmieradapter. Die restliche Hardware wie LEDs und Taster kann man sich selber nach Belieben auf das Lochrasterfeld löten.&lt;br /&gt;
&lt;br /&gt;
==== STK500 ====&lt;br /&gt;
[[Bild:Stk500.jpg|right]]&lt;br /&gt;
Das STK500 ist das Standard-Board für AVR Entwicklung, direkt von Atmel. Es enthält auch einen ISP-Programmer und ist fertig aufgebaut. Es ist unter Entwicklern sehr beliebt und wird natürlich von Atmel unterstützt. Es gilt allgemein als gute Investition, wenn man ernsthaft in das Thema einsteigen möchte.&lt;br /&gt;
&lt;br /&gt;
Das STK500 kostet bei Reichelt ca. 80 Euro (ein geeignetes Netzteil muss zusätzlich erworben werden).&lt;br /&gt;
&lt;br /&gt;
==== Pollin ATMEL Evaluations-Board Version 2.x ====&lt;br /&gt;
&lt;br /&gt;
Bei Pollin Elektronik gibt es für ca. 15 Euro ein Evaluations-Board als Bausatz zum Selbstlöten. Im Bausatz sind die Aufbauanleitung, die Platine und Bauteile enthalten. Der/die Mikrocontroller und eine Stromversorgung müssen separat beschafft werden. Auf dem Board ist ein einfacher ISP-Programmer (serielles &#039;&#039;bit-banging&#039;&#039;) integriert. &lt;br /&gt;
&lt;br /&gt;
Siehe: &lt;br /&gt;
* [[Pollin ATMEL Evaluations-Board]]&lt;br /&gt;
* http://www.pollin.de&lt;br /&gt;
&lt;br /&gt;
==== Pollin Funk-AVR-Evaluationsboard v1.x ====&lt;br /&gt;
&lt;br /&gt;
Bei diesem Board besteht die Möglichkeit, Funkmodule wie das [[RFM12]], RFM01 oder RFM02 auf dem Board aufzulöten.&lt;br /&gt;
&lt;br /&gt;
Siehe: &lt;br /&gt;
* [[Pollin Funk-AVR-Evaluationsboard]]&lt;br /&gt;
* [http://www.pollin.de http://www.pollin.de]&lt;br /&gt;
&lt;br /&gt;
==== Rumpus Board von lochraster.org ====&lt;br /&gt;
&lt;br /&gt;
Lochraster.org bietet ein Entwicklungsboard namens Rumpus an. Es kommt als Bausatz mit allen Teilen und Microcontroller (Atmega 168), auf dem Microcontroller ist bereits ein USB Bootloader installiert so dass man nach dem Zusammenbau sofort starten kann. Das Board wird direkt über USB mit Strom versorgt und auch über USB programmiert, es kann auch selbst als Programmer für AVR Microcontroller benutzt  werden. Das Board ist mit recht umfangreicher Peripherie ausgestattet, so das sich von sehr einfachen Anwendungen wie dem Blinken einer LED bis hin zu komplexen Aufgaben wie senden und empfangen von Infrarot Signalen eine Vielzahl von Anwendungen realisieren lassen. Mit 45 Euro gehört es sicher nicht zu den ganz billigen Einsteigerboards, für den ambitionierten Amateur bietet die reichhaltige Peripherie den Vorteil, das Board während des gesamten Lernprozesses zu nutzen ohne für die Realisierung komplexerer Aufgaben neue Hardware auflöten zu müssen. Auch relativiert sich dieser Preis wieder dadurch, dass kein ISP Programmer benötigt wird. Beim Umstieg auf ein anderes Board, für welches man dann einen ISP Programmer benötigt, kann der Rumpus diese Aufgabe übernehmen anstatt zum alten Eisen geworfen zu werden (s. Infos im [http://www.mikrocontroller.net/topic/217122#2165435 Forumbeitrag von Sebastian Noack]).&lt;br /&gt;
&lt;br /&gt;
Weitere Infos unter http://www.lochraster.org/ und http://wiki.lochraster.org/&lt;br /&gt;
&lt;br /&gt;
==== RN-Control ====&lt;br /&gt;
&lt;br /&gt;
Die Forengemeinde von Roboternetz hat ebenfalls ein Evaluierungsboard entwickelt, das mittlerweile sehr ausgereift ist und viele Erweiterungsmöglichkeiten bietet.&lt;br /&gt;
&lt;br /&gt;
Siehe:&lt;br /&gt;
* [http://robotikhardware.de/ http://robotikhardware.de/]&lt;br /&gt;
* [http://www.roboternetz.de/ http://www.roboternetz.de/]&lt;br /&gt;
&lt;br /&gt;
==== Arduino ====&lt;br /&gt;
Die Boards der [http://www.arduino.cc Arduino-Familie] bieten z.B. einen ATmega328P mit 16MHz und lassen sich über einen integrierten USB-seriell-Wandler und [[Bootloader]] programmieren. Die Ports sind auf Buchsenleisten herausgeführt. Arduino-Boards können auch unabhängig von der Arduino-Entwicklungsumgebung (Arduino-IDE) als AVR-Entwicklungsboard genutzt werden.&lt;br /&gt;
&lt;br /&gt;
==== Andere ====&lt;br /&gt;
&lt;br /&gt;
Das Angebot an AVR-Evaluationboards, -Experimentierplatinen, -Entwicklerplatinen oder wie die jeweiligen Hersteller ihre Produkte auch immer bezeichnen, ist mittlerweile recht groß geworden. Sie alle zu bewerten ist unmöglich geworden.&lt;br /&gt;
&lt;br /&gt;
===Selbstbau===&lt;br /&gt;
&lt;br /&gt;
Ein fertiges Board ist gar nicht nötig, man kann die benötigte Schaltung auch selbst auf einem kleinen Steckbrett oder einer Lochrasterplatine aufbauen. So kompliziert wie das STK500 wird es nicht, es reichen eine Handvoll Bauteile. Wie man das macht, wird im Folgenden beschrieben.&lt;br /&gt;
Steckbretter (Breadboards) gibt&#039;s z.&amp;amp;nbsp;B. bei [http://www.reichelt.de Reichelt],  [http://www.conelek.com/Steckplatinen ConeleK], [http://www.elv.de/ ELV] oder [http://www.conrad.de/ Conrad]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mega8_Tutorial.png|center|framed| Die Grundschaltung eines ATmega8/ATmega8A.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG:&#039;&#039;&#039; Die Pinbelegung der 6-poligen ISP-Verbindung weicht von den ATMEL Angaben ab! Wenn ATMEL oder ATMEL-kompatible ISP-Adapter benutzt werden, die Pinbelegung aus [http://www.atmel.com/dyn/resources/prod_documents/doc2521.pdf AVR042] (PDF) bzw. [[AVR_In_System_Programmer#Pinbelegung]] benutzen]]&lt;br /&gt;
&lt;br /&gt;
Über den Takteingang &#039;&#039;&#039;XTAL1&#039;&#039;&#039; ist der Mikrocontroller mit dem &#039;&#039;&#039;Quarzoszillator&#039;&#039;&#039; verbunden, der den benötigten Takt von 4 MHz liefert (siehe unten). Achtung: die Pins werden, wenn man den Oszillator mit der Schrift nach oben vor sich liegen hat, von unten links aus abgezählt. Unten links ist Pin 1, unten rechts Pin 7, oben rechts Pin 8 und oben links Pin 14 (natürlich hat der Oszillator nur 4 Pins. Die Nummerierung kommt daher, dass bei einem normalen IC dieser Größe an den gleichen Positionen die Pins Nr. 1, 7, 8 und 14 wären). Zu den Pins Datenblatt beachten [http://www.mikrocontroller.net/topic/204429#2015503].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PD0-PD7&#039;&#039;&#039; und &#039;&#039;&#039;PB0-PB5&#039;&#039;&#039; sind die &#039;&#039;&#039;IO-Ports&#039;&#039;&#039; des Mikrocontrollers. Hier können Bauteile wie LEDs, Taster oder LCDs angeschlossen werden.&lt;br /&gt;
Der &#039;&#039;&#039;Port C (PC0-PC5)&#039;&#039;&#039; spielt beim Atmega8 eine Sonderrolle: mit diesem Port können Analog-Spannungen gemessen werden. Aber dazu später mehr!&lt;br /&gt;
An &#039;&#039;&#039;Pin 17-19&#039;&#039;&#039; ist die Stiftleiste zur Verbindung mit dem ISP-Programmer angeschlossen, über den der AVR vom PC programmiert wird (Achtung: Pins in Abbildung entsprechen nicht der Belegung des AVRISP mkII. Die korrekte Pin-Belegung kann im Handbuch des AVRISP mkII eingesehen werden).&lt;br /&gt;
Die Resetschaltung, bestehend aus &#039;&#039;&#039;R1&#039;&#039;&#039; und &#039;&#039;&#039;C1&#039;&#039;&#039;, sorgt dafür, dass der Reseteingang des Controllers standardmäßig auf Vcc=+5V liegt.&lt;br /&gt;
Zum Programmieren zieht der ISP-Adapter die Resetleitung auf Masse (GND), die Programmausführung wird dadurch unterbrochen und der interne Speicher des Controllers kann neu programmiert werden.&lt;br /&gt;
Zwischen Vcc und GND kommen noch jeweils ein 100nF Keramik- oder Folienkondensator C3 und C4, um Störungen in der Versorgungsspannung zu unterdrücken. Diese [[Kondensator#Entkoppelkondensator | Abblockkondensatoren]] sollten so nah wie möglich am Controller platziert werden. An den Ausgang ARef wird ebenfalls ein 100nF Kondensator angeschlossen. Dieser wird allerdings erst benötigt, wenn der Analog/Digital Konverter des µC in Betrieb genommen wird.&lt;br /&gt;
&lt;br /&gt;
Für den Anschluss des ISP-Programmiergerätes kann man im Grunde jede beliebige Pin-Belegung des ISP Steckers benutzen, solange nur alle benötigten Leitungen mit dem Programmiergerät verbunden sind. In der Praxis haben sich allerdings bestimmte Belegungen durchgesetzt. Im Schaltbild ist eine &#039;&#039;&#039;eigene&#039;&#039;&#039; Belegung des 6-poligen Steckers gezeigt. Die alternative Pinbelegung eines 2-reihigen/10-poligen Steckers ist eine übliche Belegung. Benutzt man so eine übliche Belegung, so reicht normalerweise ein 10-poliges Flachbandkabel, um den vorhandenen ISP-Programmer so mit der Schaltung zu verbinden, dass alle Signale am richtigen Prozessorpin ankommen. Siehe auch [[AVR_In_System_Programmer]].&lt;br /&gt;
&lt;br /&gt;
Hier die Liste der benötigten Bauteile: &lt;br /&gt;
&lt;br /&gt;
* R1         Widerstand 10 kOhm&lt;br /&gt;
* C1         Keramikkondensator 47 nF&lt;br /&gt;
* C2, C3, C4 Keramik- oder Folienkondensator 100 nF&lt;br /&gt;
*            Stiftleiste 6-polig&lt;br /&gt;
*            Mikrocontroller ATmega8 oder ATmega8A (kann u.a. auf [http://shop.mikrocontroller.net/ http://shop.mikrocontroller.net/] bestellt werden)&lt;br /&gt;
*            Quarzoszillator 4 MHz&lt;br /&gt;
&lt;br /&gt;
Beim Steckbrett ist darauf zu achten, dass man die parallellaufenden Schienen für GND (blau) und Vcc (rot) jeweils mit Drähten verbindet (nicht Vcc und GND miteinander!).&lt;br /&gt;
&lt;br /&gt;
Eine Zusammenstellung der benötigten Bauteile befindet sich in der [[AVR-Tutorial_Bestellliste|Bestellliste]].&lt;br /&gt;
&lt;br /&gt;
Eine weitere Beschreibung für ein Minimalsystem gibt es [http://conelek.org/Mikrocontroller_Minimalsystem_mit_AVR_ATMega8 hier.]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 1px solid grey; padding: 1ex; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ergänzende Hinweise zur Taktversorgung (kann übersprungen werden) ===&lt;br /&gt;
&lt;br /&gt;
Ein Mikrocontroller benötigt, wie jeder Computer, eine Taktversorgung. Der Takt ist notwendig, um die internen Abläufe im Prozessor in einer zeitlich geordneten Reihenfolge ausführen zu können. Die Frequenz des Taktes bestimmt im Wesentlichen, wie schnell ein Mikrocontroller arbeitet. Bei einem ATMega8 gibt es viele Möglichkeiten zur Taktversorgung, die Wichtigsten sollen hier gezeigt werden.&lt;br /&gt;
&lt;br /&gt;
* interner RC-Oszillator, das ist der Auslieferungszustand&lt;br /&gt;
* Keramikresonator&lt;br /&gt;
* Quarz&lt;br /&gt;
* Quarzoszillator&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Vergleich der AVR-Taktquellen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Typ || Genauigkeit || Vorteile || Nachteile&lt;br /&gt;
|-&lt;br /&gt;
| interner&amp;lt;br&amp;gt;RC-Oszillator || 1-5% || Xtal1/2 Pins verfügbar&amp;lt;br&amp;gt;kostenlos&amp;lt;br&amp;gt;kein Platzbedarf&amp;lt;br&amp;gt;schnellstes Einschwingen (wenige Takte) || ungenau&lt;br /&gt;
|-&lt;br /&gt;
| Keramikresonator || 0,5-1% || ausreichend genau für [[UART]]&amp;lt;br&amp;gt;in sehr hohen Stückzahlen billiger als Quarz&amp;lt;br&amp;gt;schnelleres Einschwingen als Quarz (ca. 1ms) || XTAL1/2 Pins nicht verfügbar&amp;lt;br&amp;gt;Platzbedarf&lt;br /&gt;
|-&lt;br /&gt;
| Quarz || 10-100ppm || sehr genau&amp;lt;br&amp;gt;temperaturstabil || XTAL1/2 Pins nicht verfügbar&amp;lt;br&amp;gt;Platzbedarf&amp;lt;br&amp;gt;Kosten bei sehr hohen Stückzahlen (1000++)&amp;lt;br&amp;gt;langsames Anschwingen (ca. 10ms)&lt;br /&gt;
|-&lt;br /&gt;
| Quarzoszillator || 1-100ppm || hochgenau&amp;lt;br&amp;gt;sehr temperaturstabil&amp;lt;br&amp;gt;liefert selbst ein Signal, kann dadurch [[AVR_Fuses#Taktquellen_Fuse_Einstellung | verfuste AVRs]] retten&amp;lt;br&amp;gt;kann mehrere Takteingänge treiben || XTAL1 Pin nicht verfügbar&amp;lt;br&amp;gt;Platzbedarf&amp;lt;br&amp;gt;Kosten bei sehr hohen Stückzahlen (1000++)&amp;lt;br&amp;gt;langsames Anschwingen (ca. 10ms)&lt;br /&gt;
|}&lt;br /&gt;
1ppm = 0,0001% (engl. one &#039;&#039;&#039;p&#039;&#039;&#039;art &#039;&#039;&#039;p&#039;&#039;&#039;er &#039;&#039;&#039;m&#039;&#039;&#039;illion, der millionste Teil) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;FF0000&amp;quot;&amp;gt;Achtung: Ein ATMega8 wird mit aktiviertem internen RC-Oszillator ausgeliefert. Um eine andere Taktquelle zu aktivieren, müssen die [[AVR Fuses#Taktquellen Fuse Einstellung|AVR Fuses]] des Prozessors verändert werden. Das muss jedoch sehr vorsichtig gemacht werden, siehe Artikel.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Keramikresonator ====&lt;br /&gt;
&lt;br /&gt;
Die Anbindung des Keramikresonators sieht so aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Resonator.png|framed|center| Resonator Standardbeschaltung]]&lt;br /&gt;
&lt;br /&gt;
Es werden keine Kondensatoren benötigt, diese sind schon eingebaut, daher ist der Anschluss eines Keramikschwingers kinderleicht. Achtung: Keramikresonatoren gibt es mit zwei oder drei Pins. Nur die mit drei Pins besitzen interne Kondensatoren.&lt;br /&gt;
&lt;br /&gt;
==== Quarz ====&lt;br /&gt;
&lt;br /&gt;
Die Anbindung des Quarzes sieht so aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:tutorial-quarz-schaltplan.png|center|framed| Quarz Standardbeschaltung]]&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren &#039;&#039;&#039;C3&#039;&#039;&#039; und &#039;&#039;&#039;C4&#039;&#039;&#039; sind zum Betrieb des Quarzes notwendig. Ihre Größe ist abhängig von den Daten des Quarzes. Zur Berechnung ihrer Größe gibt es die folgende Formel:&lt;br /&gt;
&lt;br /&gt;
C=2xCL-(CP+CI)&lt;br /&gt;
&lt;br /&gt;
* CP: Leiterbahnen bedingte Kapazität&lt;br /&gt;
* CI: Portbedingte Kapazität&lt;br /&gt;
* CL: Datenblatt des Quarzes&lt;br /&gt;
CP+CI ca. 5pF ?&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von CL = 32pF:&lt;br /&gt;
&lt;br /&gt;
C = 2x32pF-5pF = 59pF&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Spannungsversorgung ===&lt;br /&gt;
&lt;br /&gt;
Die Versorgungsspannung &#039;&#039;&#039;Vcc&#039;&#039;&#039; beträgt 5V und kann z.&amp;amp;nbsp;B. mit der in diesem Kapitel beschriebenen Schaltung erzeugt werden. Falls zum Programmieren des Mikrocontrollers ein [[AVR_In_System_Programmer|ISP-Programmiergerät]] verwendet wird, das an die USB-Schnittstelle angeschlossen ist, kann man die Schaltung auch darüber mit Strom versorgen und dieses Kapitel überspringen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:V_Regler.gif|framed|center|Standard-Netzteilbeschaltung eines 7805]]&lt;br /&gt;
&lt;br /&gt;
Bauteile:&lt;br /&gt;
* IC1: 5V-Spannungsregler 7805&lt;br /&gt;
* C1: Elko 10µF (Polung beachten!)&lt;br /&gt;
* C2,C3: 2x Kondensator 100nF (kein Elektrolyt)&lt;br /&gt;
* D1: Diode 1N4001&lt;br /&gt;
&lt;br /&gt;
Hauptelement der Schaltung ist das IC 7805. Seine Aufgabe ist es aus der Versorgungsspannung stabile 5V zu erzeugen. Dieses IC gibt es seit vielen Jahren und wird von vielen Chipherstellern produziert. Er stellt die einfachste und simpelste Möglichkeit dar, aus einer vorhandenen Gleichspannung definierte 5V zu erzeugen. Den 7805 gibt es in verschiedenen Ausführungen, was seine maximale Strombelastung angeht. Für die Zwecke dieses Tutorials ist die Standard-Variante, welche maximal 1A abgeben kann, völlig ausreichend. Der 7805 enthält eine Übertemperatursicherung, so dass er abschaltet, wenn es ihm zu heiß wird.&lt;br /&gt;
&lt;br /&gt;
Die beiden 100nF Kondensatoren haben die Aufgabe, eine mögliche Schwingneigung des 7805 zu unterdrücken. Sie müssen so nahe wie möglich an den Anschlusspins des 7805 angeschlossen werden, um ihre Wirkung zu entfalten.&lt;br /&gt;
&lt;br /&gt;
An den Eingang (+ und - im Schaltplan) wird ein Steckernetzteil mit einer Spannung von 7 - 12V angeschlossen. Der 7805 benötigt an seinem Eingang eine Gleichspannung, die mindestens 7V beträgt. Auf der anderen Seite ergibt es auch keinen Sinn, wesentlich über 12V Eingangsspannung hinauszugehen. Der 7805 ist ein Linearregler. Salopp gesagt, wird die überschüssige Spannung in Form von Wärme vernichtet. Liegt die Eingangsspannung weit über 12V, so wird schon wesentlich mehr Energie in Form von Wärme umgesetzt, als am Ausgang entnommen werden kann. Mal ganz davon abgesehen, dass der 7805 davon brennend heiß werden wird.&lt;br /&gt;
&lt;br /&gt;
Hier ein paar kleine Rechenbeispiele:&lt;br /&gt;
12V Eingangsspannung - 5V Ausgangsspannung = 7V Differenz x 0,1A Strombedarf der Schaltung ergibt die Verlustwärme die abgeführt werden muss.&lt;br /&gt;
&lt;br /&gt;
7V x 0,1A = 0,7 Watt&lt;br /&gt;
&lt;br /&gt;
Wenn man jetzt eine Eingangsspannung von 7V nimmt, so dass die Mindestdifferenz von 2V noch eingehalten wird kommen wir zu diesen Werten&lt;br /&gt;
&lt;br /&gt;
2V x  0,1A = 0,2 Watt Abwärme&lt;br /&gt;
2V x 0,35A = 0,7 Watt Abwärme oder anders gesagt, können wir der Schaltung 350mA entnehmen und haben die gleiche Abwärme wie im oberen Beispiel mit nur 100mA Stromentnahme.&lt;br /&gt;
&lt;br /&gt;
Man sieht, dass man die Eingangsspannung so klein wie möglich wählen sollte um dadurch die Verluste in Grenzen halten zu können. Außerdem ist es meist so, dass für eine geringere Stromentnahme auch eine niedrigere Differenzspannung ausreicht. In manchen Datenblätter ist z.B. angegeben 0,5A = 1V Dropvoltage und bei 1A = 2V Dropvoltage....&lt;br /&gt;
&lt;br /&gt;
Weiterhin sei gesagt, dass es so genannte Low Drop, Ultra Low Drop...Regler gibt, die mit einer viel kleineren Differenz zw. Ein- und Ausgangsspannung zurechtkommen, wodurch man die Verluste noch weiter drücken kann.&lt;br /&gt;
&lt;br /&gt;
Eine Stromversorgung mit Batterien ist grundsätzlich auch möglich, wenn die elektrischen Grenzdaten des µC eingehalten werden (max. Spannung, min. Spannung). Bei der geregelten Stromversorgung oben sollte die Batteriespannung ca. 1.5 - 2.5V (Dropout-Spannung des Linearreglers) größer sein als die Versorgungsspannung des µC. Die [[Versorgung aus einer Zelle]] ist ein Thema für Fortgeschrittene.&lt;br /&gt;
&lt;br /&gt;
=== Beispielhafter Aufbau auf einem [[Steckbrett]] ===&lt;br /&gt;
&lt;br /&gt;
Auf einem [[Steckbrett]] könnte eine Schaltung etwa so aussehen:&lt;br /&gt;
&lt;br /&gt;
[[Bild:tutorial_grundschaltung_breadboard.jpg|600px|center|Steckbrett mit Selbstschaltung Atmega8 und Quarz als externe Taktquelle]]&lt;br /&gt;
&lt;br /&gt;
Hier ist die oben beschriebene Selbstbauschaltung zu sehen.  Spannungsversorgung (links), 6-poliger ISP-Anschluss (rechts hinter dem µC), Quarz mit 2 Kondensatoren statt Oszillator, erweitert um eine LED mit Vorwiderstand an PB0 (rechts vor dem µC), einem Resettaster (links vor dem µC) und einem Stützkondensator zwischen +5V und GND (rechts unten).&lt;br /&gt;
&lt;br /&gt;
=== Der ISP-Programmierer (In-System-Programmer)===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mikrocontroller.gif|framed|right|ISP Programmierer]]&lt;br /&gt;
Dann braucht man nur noch den &#039;&#039;&#039;ISP-Programmieradapter&#039;&#039;&#039;, über den man die Programme vom PC in den Controller übertragen kann. Eine Übersicht über mögliche ISP-Programmer Varianten findet sich im Artikel [[AVR_In_System_Programmer]].&lt;br /&gt;
&lt;br /&gt;
Fertige ISP-Programmer zum Anschluss an den Parallelport oder USB gibt es z.&amp;amp;nbsp;B. auf http://shop.mikrocontroller.net/. &lt;br /&gt;
&lt;br /&gt;
Eine Bauanleitung gibt es u.a. auf [http://www.rn-wissen.de/index.php/AVR-ISP_Programmierkabel http://www.rn-wissen.de/index.php/AVR-ISP_Programmierkabel] oder [http://rumil.de/hardware/avrisp.html http://rumil.de/hardware/avrisp.html].&lt;br /&gt;
&lt;br /&gt;
Den ISP-Adapter schließt man an den Parallelport an und verbindet ihn mit der Stiftleiste SV1 über ein 6-adriges Kabel (siehe Schaltplan).&lt;br /&gt;
&lt;br /&gt;
=== Sonstiges ===&lt;br /&gt;
&lt;br /&gt;
Wer vorausschauend kauft, kauft mehr als einen Mikrocontroller. Bis der erste Controller defekt ist, oder man durch Austauschen sicher gehen möchte, ob der Fehler im Programm oder im Controller ist, vergeht nur wenig Zeit.&lt;br /&gt;
&lt;br /&gt;
Tipp: Die Preise für Mikrocontroller haben eine deutliche Spannweite, nicht selten ist ein und derselbe Typ für 3 oder 8 Euro zu haben. Oft sind neuere oder größere Modelle billiger (ATmega8A statt ATmega8, ATmega328 statt ATmega8A). Eine Suche im Internet lohnt sich. Das Gleiche gilt für den Kauf von ISP-Programmierern.&lt;br /&gt;
&lt;br /&gt;
Für weitere Kapitel dieses Tutorials sollte man sich noch die folgenden Bauteile besorgen: &lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 2 (I/O-Grundlagen)&lt;br /&gt;
* 6 LEDs 5mm (Standard-LED, ruhig auch in unterschiedlichen Farben, rot/gelb/grün)&lt;br /&gt;
* 5 Taster&lt;br /&gt;
* 6 Widerstände 1k&lt;br /&gt;
* 5 Widerstände 10k&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 6 (LC-Display)&lt;br /&gt;
* 1 Potentiometer 10k&lt;br /&gt;
* 1 HD44780-kompatibles LCD, z.&amp;amp;nbsp;B. 4x20 oder 2x16 Zeichen&lt;br /&gt;
*   besitzt das LCD eine Hintergrundbeleuchtung, dann noch einen Vorwiderstand dafür. Details dazu stehen im Datenblatt des LCD. Ein Wert von 50Ω sollte aber in jedem Fall passen. Schlimmstenfalls ist die Hintergrundbeleuchtung dann etwas zu dunkel.&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 10 (Der UART)&lt;br /&gt;
* 1 Pegelwandler MAX232, MAX232&#039;&#039;&#039;A&#039;&#039;&#039; oder MAX202&lt;br /&gt;
* 5 Kondensatoren&lt;br /&gt;
** Bei einem MAX232: je 1µF Elektrolytkondensator&lt;br /&gt;
** Bei einem MAX202 oder MAX232&#039;&#039;&#039;A&#039;&#039;&#039;: je  100nF Keramik- oder Elektrolytkondensator&lt;br /&gt;
:Die Kondensatoren dürfen auch größer sein. Ist man sich nicht sicher, welchen MAX232 man hat (A oder nicht A), dann die größeren Kondensatoren 1µF nehmen, die funktionieren auch beim MAX232A oder MAX202.&lt;br /&gt;
* 1 9-polige SUBD-Buchse (female)&lt;br /&gt;
* 1 dazu passendes Modem(nicht Nullmodem!)-Kabel&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 14 (ADC)&lt;br /&gt;
* 1 Kondensator 100n&lt;br /&gt;
* 1 Potentiometer 10k&lt;br /&gt;
* nach Lust und Laune temperatur- oder lichtabhängige Widerstände und jeweils einen Widerstand in der gleichen Größenordnung wie der Sensor&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 17 (Schieberegister)&lt;br /&gt;
* 2 Schieberegister 74HC595&lt;br /&gt;
* einige LED, damit man an die Schieberegister auch etwas anschließen kann, samt passenden Vorwiderständen&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 19 (7-Segmentanzeige)&lt;br /&gt;
* 4 7-Segmentanzeigen mit gemeinsamer Anode&lt;br /&gt;
* 4 PNP-Transistoren BC328&lt;br /&gt;
* 4 Widerstände 1k&lt;br /&gt;
* 7 Widerstände 100Ω&lt;br /&gt;
&lt;br /&gt;
Für weitere Bauteile, die man als angehender µC Bastler auch des Öfteren mal benötigt, empfiehlt sich ein Blick in die Liste der [[Standardbauelemente]] bzw. in die [[Absolute_beginner|Grundausstattung]]. Wenn Ihr Händler Großpackungen (zb. 100 Stück) von 100n Kondensatoren, 10k, 1k oder 100Ω Widerständen anbietet, sollten Sie deren Erwerb in Erwägung ziehen. Diese Bauteile benötigt man oft, und derartige Großpackungen sind meist nicht teurer, als wenn man einige wenige Exemplare einzeln kauft. Dies hängt damit zusammen, dass das Herauszählen von 9 Bauteilen für den Verkäufer teurer kommt, als 100 Bauteile abgepackt aus dem Regal zu nehmen.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
In diesem Tutorial wird nur auf die Programmierung in Assembler eingegangen, da Assembler für das Verständnis der Hardware am besten geeignet ist.&lt;br /&gt;
&lt;br /&gt;
=== Assembler ===&lt;br /&gt;
&lt;br /&gt;
Zuerst braucht man einen &#039;&#039;&#039;Assembler&#039;&#039;&#039;, der in Assemblersprache geschriebene Programme in Maschinencode übersetzt. Windows-User können das [http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2725 AVR-Studio] von Atmel verwenden, das neben dem Assembler auch einen Simulator enthält, mit dem sich die Programme vor der Übertragung in den Controller testen lassen; für Linux gibt es [http://www.tavrasm.org/ tavrasm], [http://avra.sourceforge.net/ avra] und [http://avr-asm-tutorial.net/gavrasm/index_de.html gavrasm]. &lt;br /&gt;
&lt;br /&gt;
Um die vom Assembler erzeugte &amp;quot;.hex&amp;quot;-Datei über den ISP-Adapter in den Mikrocontroller zu programmieren, kann man unter Windows z.&amp;amp;nbsp;B. das Programm [http://www.myplace.nu/avr/yaap/ yaap] verwenden, für Linux gibt es [http://savannah.nongnu.org/projects/uisp/ uisp], für beide avrdude.&lt;br /&gt;
&lt;br /&gt;
=== C ===&lt;br /&gt;
Wer in C programmieren möchte, kann den kostenlosen GNU-C-Compiler AVR-GCC (unter Windows &amp;quot;WinAVR&amp;quot;) ausprobieren. Dieser C-Compiler kann auch in das für Assembler-Programmierung notwendige AVR-Studio integriert werden. In der Artikelsammlung gibt es ein umfangreiches [[AVR-GCC-Tutorial|Tutorial]] zu diesem Compiler;&lt;br /&gt;
&lt;br /&gt;
Wer unter Windows und Linux gleichermassen kostenlos entwickeln will, der sollte sich die [http://www.eclipse.org/ IDE Eclipse for C/C++ Developers] und das [http://avr-eclipse.sourceforge.net/wiki/index.php/The_AVR_Eclipse_Plugin AVR-Eclipse Plugin ] ansehen, beide sind unter Windows und Linux einfach zu installieren. Hier wird auch der AVR-GCC benutzt. In der Artikelsammlung gibt es ein umfangreiches [[AVR Eclipse|AVR Eclipse Tutorial]] zu dieser IDE.&lt;br /&gt;
Ebenfalls unter Linux und Windows verfügbar ist die Entwicklungsumgebung [http://www.codeblocks.org/ Code::Blocks] (aktuelle, stabile Versionen sind als Nightly Builds regelmäßig im [http://forums.codeblocks.org/ Forum] verfügbar). Innerhalb dieser Entwicklungsumgebung können ohne die Installation zusätzlicher Plugins &amp;quot;AVR-Projekte&amp;quot; angelegt werden.&lt;br /&gt;
&lt;br /&gt;
Fragen dazu stellt man am besten hier im [http://www.mikrocontroller.net/forum/list-2-1.html GCC-Forum].&lt;br /&gt;
&lt;br /&gt;
=== Pascal ===&lt;br /&gt;
Wer in Pascal programmieren muss, kann [http://www.e-lab.de AVRPascal] ausprobieren.&amp;lt;br&amp;gt; &lt;br /&gt;
Dieser Pascalcompiler ist kostenfrei bis 4kb Code und bietet viele ausgereifte Bibliotheken für Servoansteuerung, Serielle Schnittstellen (COM, TWI, SPI), PWM, Timernutzung, LC-Displays usw.&amp;lt;br&amp;gt; &lt;br /&gt;
Außerdem gibt es eine kostenfreie Version für den Mega8 und den Mega88.&lt;br /&gt;
[http://www.e-lab.de E-LAB].&lt;br /&gt;
&lt;br /&gt;
=== Basic ===&lt;br /&gt;
Auch Basic-Fans kommen nicht zu kurz, für die gibt es z.&amp;amp;nbsp;B. [[Bascom AVR]] ($69, Demo verfügbar) oder das kostenlose [[http://avr.myluna.de LunaAVR]].&lt;br /&gt;
&lt;br /&gt;
=== Forth ===&lt;br /&gt;
Wer einen direkten und interaktiven Zugang zum Controller haben will, sollte sich [http://amforth.sourceforge.net Forth] anschauen. Voraussetzung ist ein serieller Anschluß (Max232), also etwas mehr als die Minimalbeschaltung.&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
Bevor man anfängt, sollte man sich die folgenden PDF-Dateien runterladen und zumindest mal reinschauen:&lt;br /&gt;
&lt;br /&gt;
* [http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf Datenblatt des ATmega8 (4,54 MB)]&lt;br /&gt;
* [http://www.atmel.com/dyn/resources/prod_documents/doc0856.pdf Befehlssatz der AVRs (1,27 MB)]&lt;br /&gt;
* oder [http://www.avr-roboter.de/controller/befehle/befehle.html Befehlssatz in deutscher Übersetzung online]&lt;br /&gt;
* oder [http://www.avr-modelleisenbahn.de/atmega8/0-einleitung.htm Datenblatt des ATmega8 in deutscher Übersetzung online]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Datenblatt eines Controllers ist das wichtigste Dokument für einen Entwickler. Es enthält Informationen über die Pinbelegung, Versorgungsspannung, Beschaltung, Speicher, die Verwendung der IO-Komponenten und vieles mehr.&lt;br /&gt;
&lt;br /&gt;
Im Befehlssatz sind alle Assemblerbefehle der AVR-Controllerfamilie aufgelistet und erklärt.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
{{Navigation_hochvor|	 &lt;br /&gt;
hochtext=Inhaltsverzeichnis|	 &lt;br /&gt;
hochlink=AVR-Tutorial|	 &lt;br /&gt;
vortext=I/O Grundlagen|	 &lt;br /&gt;
vorlink=AVR-Tutorial: IO-Grundlagen}}	 &lt;br /&gt;
 &lt;br /&gt;
[[Category:AVR-Tutorial|Equipment]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Equipment&amp;diff=77877</id>
		<title>AVR-Tutorial: Equipment</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Equipment&amp;diff=77877"/>
		<updated>2013-08-05T12:52:59Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AVR-Tutorial - Benötigte Ausrüstung =&lt;br /&gt;
==Hardware==&lt;br /&gt;
&lt;br /&gt;
Ein Mikrocontroller alleine ist noch zu nichts nützlich. Damit man etwas damit anfangen kann, braucht man eine Schaltung, in die der Controller eingesetzt wird. Dazu werden bei Elektronikhändlern Platinen angeboten, die alles nötige (Taster, LEDs, Steckverbinder...) enthalten. Häufig enthalten diese Platinen nicht nur Platz für den Mikroprozessor, sondern auch einen ISP-Programmierer (Näheres dazu später)&lt;br /&gt;
&lt;br /&gt;
Da es eine Unmenge verschiedener Mikrocontroller allein aus der AVR-Familie gibt, ist der Anfänger mit der Auswahl bereits überfordert. Dieses Tutorial (und viele andere auch) beginnt mit dem &#039;&#039;mittelgroßen&#039;&#039; Controller &#039;&#039;&#039;ATmega8&#039;&#039;&#039;. Die 8 steht für 8 Kilobyte Flash-Speicher. Er gilt als ideal für Einsteiger, und auch von „alten Hasen“ wird dieser Typ gern verwendet.&lt;br /&gt;
&lt;br /&gt;
=== Fertige Evaluations-Boards und Starterkits ===&lt;br /&gt;
&lt;br /&gt;
==== AVR Starterkit aus dem Mikrocontroller.net-Shop ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Damit der Programmer mit AS5.x zusammen arbeitet, muss die Firmware aktualisiert werden: http://www.usbprog.org/index.php/Firmwares (siehe Update Hinweis)&lt;br /&gt;
&lt;br /&gt;
Sehr gut für dieses Tutorial geeignet ist das [http://shop.embedded-projects.net/index.php?module=artikel&amp;amp;action=artikel&amp;amp;id=108 AVR-Starterkit aus dem Mikrocontroller.net-Shop]. Das Kit enthält eine Platine mit dem Controller ATmega8, einen USB-ISP-Programmieradapter und ein Steckernetzteil. Die im Starterkit enthaltene [http://www.eproo.de/index.php?module=artikel&amp;amp;action=artikel&amp;amp;id=74 AVR Entwicklungsplatine für 28-pol. AVRs] gibt es auch einzeln. Diese enthält eine Fassung für den Controller, einen Spannungswandler, die Beschaltung für die serielle Schnittstelle und einen Anschluss für den Programmieradapter. Die restliche Hardware wie LEDs und Taster kann man sich selber nach Belieben auf das Lochrasterfeld löten.&lt;br /&gt;
&lt;br /&gt;
==== STK500 ====&lt;br /&gt;
[[Bild:Stk500.jpg|right]]&lt;br /&gt;
Das STK500 ist das Standard-Board für AVR Entwicklung, direkt von Atmel. Es enthält auch einen ISP-Programmer und ist fertig aufgebaut. Es ist unter Entwicklern sehr beliebt und wird natürlich von Atmel unterstützt. Es gilt allgemein als gute Investition, wenn man ernsthaft in das Thema einsteigen möchte.&lt;br /&gt;
&lt;br /&gt;
Das STK500 kostet bei Reichelt ca. 80 Euro (ein geeignetes Netzteil muss zusätzlich erworben werden).&lt;br /&gt;
&lt;br /&gt;
==== Pollin ATMEL Evaluations-Board Version 2.x ====&lt;br /&gt;
&lt;br /&gt;
Bei Pollin Elektronik gibt es für ca. 15 Euro ein Evaluations-Board als Bausatz zum Selbstlöten. Im Bausatz sind die Aufbauanleitung, die Platine und Bauteile enthalten. Der/die Mikrocontroller und eine Stromversorgung müssen separat beschafft werden. Auf dem Board ist ein einfacher ISP-Programmer (serielles &#039;&#039;bit-banging&#039;&#039;) integriert. &lt;br /&gt;
&lt;br /&gt;
Siehe: &lt;br /&gt;
* [[Pollin ATMEL Evaluations-Board]]&lt;br /&gt;
* http://www.pollin.de&lt;br /&gt;
&lt;br /&gt;
==== Pollin Funk-AVR-Evaluationsboard v1.x ====&lt;br /&gt;
&lt;br /&gt;
Bei diesem Board besteht die Möglichkeit, Funkmodule wie das [[RFM12]], RFM01 oder RFM02 auf dem Board aufzulöten.&lt;br /&gt;
&lt;br /&gt;
Siehe: &lt;br /&gt;
* [[Pollin Funk-AVR-Evaluationsboard]]&lt;br /&gt;
* [http://www.pollin.de http://www.pollin.de]&lt;br /&gt;
&lt;br /&gt;
==== Rumpus Board von lochraster.org ====&lt;br /&gt;
&lt;br /&gt;
Lochraster.org bietet ein Entwicklungsboard namens Rumpus an. Es kommt als Bausatz mit allen Teilen und Microcontroller (Atmega 168), auf dem Microcontroller ist bereits ein USB Bootloader installiert so dass man nach dem Zusammenbau sofort starten kann. Das Board wird direkt über USB mit Strom versorgt und auch über USB programmiert, es kann auch selbst als Programmer für AVR Microcontroller benutzt  werden. Das Board ist mit recht umfangreicher Peripherie ausgestattet, so das sich von sehr einfachen Anwendungen wie dem Blinken einer LED bis hin zu komplexen Aufgaben wie senden und empfangen von Infrarot Signalen eine Vielzahl von Anwendungen realisieren lassen. Mit 45 Euro gehört es sicher nicht zu den ganz billigen Einsteigerboards, für den ambitionierten Amateur bietet die reichhaltige Peripherie den Vorteil, das Board während des gesamten Lernprozesses zu nutzen ohne für die Realisierung komplexerer Aufgaben neue Hardware auflöten zu müssen. Auch relativiert sich dieser Preis wieder dadurch, dass kein ISP Programmer benötigt wird. Beim Umstieg auf ein anderes Board, für welches man dann einen ISP Programmer benötigt, kann der Rumpus diese Aufgabe übernehmen anstatt zum alten Eisen geworfen zu werden (s. Infos im [http://www.mikrocontroller.net/topic/217122#2165435 Forumbeitrag von Sebastian Noack]).&lt;br /&gt;
&lt;br /&gt;
Weitere Infos unter http://www.lochraster.org/ und http://wiki.lochraster.org/&lt;br /&gt;
&lt;br /&gt;
==== RN-Control ====&lt;br /&gt;
&lt;br /&gt;
Die Forengemeinde von Roboternetz hat ebenfalls ein Evaluierungsboard entwickelt, das mittlerweile sehr ausgereift ist und viele Erweiterungsmöglichkeiten bietet.&lt;br /&gt;
&lt;br /&gt;
Siehe:&lt;br /&gt;
* [http://robotikhardware.de/ http://robotikhardware.de/]&lt;br /&gt;
* [http://www.roboternetz.de/ http://www.roboternetz.de/]&lt;br /&gt;
&lt;br /&gt;
==== Arduino ====&lt;br /&gt;
Die Boards der [http://www.arduino.cc Arduino-Familie] bieten z.B. einen ATmega328P mit 16MHz und lassen sich über einen integrierten USB-seriell-Wandler und [[Bootloader]] programmieren. Die Ports sind auf Buchsenleisten herausgeführt. Arduino-Boards können auch unabhängig von der Arduino-Entwicklungsumgebung (Arduino-IDE) als AVR-Entwicklungsboard genutzt werden.&lt;br /&gt;
&lt;br /&gt;
==== Andere ====&lt;br /&gt;
&lt;br /&gt;
Das Angebot an AVR-Evaluationboards, -Experimentierplatinen, -Entwicklerplatinen oder wie die jeweiligen Hersteller ihre Produkte auch immer bezeichnen, ist mittlerweile recht groß geworden. Sie alle zu bewerten ist unmöglich geworden.&lt;br /&gt;
&lt;br /&gt;
===Selbstbau===&lt;br /&gt;
&lt;br /&gt;
Ein fertiges Board ist gar nicht nötig, man kann die benötigte Schaltung auch selbst auf einem kleinen Steckbrett oder einer Lochrasterplatine aufbauen. So kompliziert wie das STK500 wird es nicht, es reichen eine Handvoll Bauteile. Wie man das macht, wird im Folgenden beschrieben.&lt;br /&gt;
Steckbretter (Breadboards) gibt&#039;s z.&amp;amp;nbsp;B. bei [http://www.reichelt.de Reichelt],  [http://www.conelek.com/Steckplatinen ConeleK], [http://www.elv.de/ ELV] oder [http://www.conrad.de/ Conrad]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mega8_Tutorial.png|center|framed| Die Grundschaltung eines ATmega8/ATmega8A.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG:&#039;&#039;&#039; Die Pinbelegung der 6-poligen ISP-Verbindung weicht von den ATMEL Angaben ab! Wenn ATMEL oder ATMEL-kompatible ISP-Adapter benutzt werden, die Pinbelegung aus [http://www.atmel.com/dyn/resources/prod_documents/doc2521.pdf AVR042] (PDF) bzw. [[AVR_In_System_Programmer#Pinbelegung]] benutzen]]&lt;br /&gt;
&lt;br /&gt;
Über den Takteingang &#039;&#039;&#039;XTAL1&#039;&#039;&#039; ist der Mikrocontroller mit dem &#039;&#039;&#039;Quarzoszillator&#039;&#039;&#039; verbunden, der den benötigten Takt von 4 MHz liefert (siehe unten). Achtung: die Pins werden, wenn man den Oszillator mit der Schrift nach oben vor sich liegen hat, von unten links aus abgezählt. Unten links ist Pin 1, unten rechts Pin 7, oben rechts Pin 8 und oben links Pin 14 (natürlich hat der Oszillator nur 4 Pins. Die Nummerierung kommt daher, dass bei einem normalen IC dieser Größe an den gleichen Positionen die Pins Nr. 1, 7, 8 und 14 wären). Zu den Pins Datenblatt beachten [http://www.mikrocontroller.net/topic/204429#2015503].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PD0-PD7&#039;&#039;&#039; und &#039;&#039;&#039;PB0-PB5&#039;&#039;&#039; sind die &#039;&#039;&#039;IO-Ports&#039;&#039;&#039; des Mikrocontrollers. Hier können Bauteile wie LEDs, Taster oder LCDs angeschlossen werden.&lt;br /&gt;
Der &#039;&#039;&#039;Port C (PC0-PC5)&#039;&#039;&#039; spielt beim Atmega8 eine Sonderrolle: mit diesem Port können Analog-Spannungen gemessen werden. Aber dazu später mehr!&lt;br /&gt;
An &#039;&#039;&#039;Pin 17-19&#039;&#039;&#039; ist die Stiftleiste zur Verbindung mit dem ISP-Programmer angeschlossen, über den der AVR vom PC programmiert wird (Achtung: Pins in Abbildung entsprechen nicht der Belegung des AVRISP mkII. Die korrekte Pin-Belegung kann im Handbuch des AVRISP mkII eingesehen werden).&lt;br /&gt;
Die Resetschaltung, bestehend aus &#039;&#039;&#039;R1&#039;&#039;&#039; und &#039;&#039;&#039;C1&#039;&#039;&#039;, sorgt dafür, dass der Reseteingang des Controllers standardmäßig auf Vcc=+5V liegt.&lt;br /&gt;
Zum Programmieren zieht der ISP-Adapter die Resetleitung auf Masse (GND), die Programmausführung wird dadurch unterbrochen und der interne Speicher des Controllers kann neu programmiert werden.&lt;br /&gt;
Zwischen Vcc und GND kommen noch jeweils ein 100nF Keramik- oder Folienkondensator C3 und C4, um Störungen in der Versorgungsspannung zu unterdrücken. Diese [[Kondensator#Entkoppelkondensator | Abblockkondensatoren]] sollten so nah wie möglich am Controller platziert werden. An den Ausgang ARef wird ebenfalls ein 100nF Kondensator angeschlossen. Dieser wird allerdings erst benötigt, wenn der Analog/Digital Konverter des µC in Betrieb genommen wird.&lt;br /&gt;
&lt;br /&gt;
Für den Anschluss des ISP-Programmiergerätes kann man im Grunde jede beliebige Pin-Belegung des ISP Steckers benutzen, solange nur alle benötigten Leitungen mit dem Programmiergerät verbunden sind. In der Praxis haben sich allerdings bestimmte Belegungen durchgesetzt. Im Schaltbild ist eine &#039;&#039;&#039;eigene&#039;&#039;&#039; Belegung des 6-poligen Steckers gezeigt. Die alternative Pinbelegung eines 2-reihigen/10-poligen Steckers ist eine übliche Belegung. Benutzt man so eine übliche Belegung, so reicht normalerweise ein 10-poliges Flachbandkabel, um den vorhandenen ISP-Programmer so mit der Schaltung zu verbinden, dass alle Signale am richtigen Prozessorpin ankommen. Siehe auch [[AVR_In_System_Programmer]].&lt;br /&gt;
&lt;br /&gt;
Hier die Liste der benötigten Bauteile: &lt;br /&gt;
&lt;br /&gt;
* R1         Widerstand 10 kOhm&lt;br /&gt;
* C1         Keramikkondensator 47 nF&lt;br /&gt;
* C2, C3, C4 Keramik- oder Folienkondensator 100 nF&lt;br /&gt;
*            Stiftleiste 6-polig&lt;br /&gt;
*            Mikrocontroller ATmega8 oder ATmega8A (kann u.a. auf [http://shop.mikrocontroller.net/ http://shop.mikrocontroller.net/] bestellt werden)&lt;br /&gt;
*            Quarzoszillator 4 MHz&lt;br /&gt;
&lt;br /&gt;
Beim Steckbrett ist darauf zu achten, dass man die parallellaufenden Schienen für GND (blau) und Vcc (rot) jeweils mit Drähten verbindet (nicht Vcc und GND miteinander!).&lt;br /&gt;
&lt;br /&gt;
Eine Zusammenstellung der benötigten Bauteile befindet sich in der [[AVR-Tutorial_Bestellliste|Bestellliste]].&lt;br /&gt;
&lt;br /&gt;
Eine weitere Beschreibung für ein Minimalsystem gibt es [http://conelek.org/Mikrocontroller_Minimalsystem_mit_AVR_ATMega8 hier.]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 1px solid grey; padding: 1ex; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ergänzende Hinweise zur Taktversorgung (kann übersprungen werden) ===&lt;br /&gt;
&lt;br /&gt;
Ein Mikrocontroller benötigt, wie jeder Computer, eine Taktversorgung. Der Takt ist notwendig, um die internen Abläufe im Prozessor in einer zeitlich geordneten Reihenfolge ausführen zu können. Die Frequenz des Taktes bestimmt im Wesentlichen, wie schnell ein Mikrocontroller arbeitet. Bei einem ATMega8 gibt es viele Möglichkeiten zur Taktversorgung, die Wichtigsten sollen hier gezeigt werden.&lt;br /&gt;
&lt;br /&gt;
* interner RC-Oszillator, das ist der Auslieferungszustand&lt;br /&gt;
* Keramikresonator&lt;br /&gt;
* Quarz&lt;br /&gt;
* Quarzoszillator&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Vergleich der AVR-Taktquellen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Typ || Genauigkeit || Vorteile || Nachteile&lt;br /&gt;
|-&lt;br /&gt;
| interner&amp;lt;br&amp;gt;RC-Oszillator || 1-5% || Xtal1/2 Pins verfügbar&amp;lt;br&amp;gt;kostenlos&amp;lt;br&amp;gt;kein Platzbedarf&amp;lt;br&amp;gt;schnellstes Einschwingen (wenige Takte) || ungenau&lt;br /&gt;
|-&lt;br /&gt;
| Keramikresonator || 0,5-1% || ausreichend genau für [[UART]]&amp;lt;br&amp;gt;in sehr hohen Stückzahlen billiger als Quarz&amp;lt;br&amp;gt;schnelleres Einschwingen als Quarz (ca. 1ms) || XTAL1/2 Pins nicht verfügbar&amp;lt;br&amp;gt;Platzbedarf&lt;br /&gt;
|-&lt;br /&gt;
| Quarz || 10-100ppm || sehr genau&amp;lt;br&amp;gt;temperaturstabil || XTAL1/2 Pins nicht verfügbar&amp;lt;br&amp;gt;Platzbedarf&amp;lt;br&amp;gt;Kosten bei sehr hohen Stückzahlen (1000++)&amp;lt;br&amp;gt;langsames Anschwingen (ca. 10ms)&lt;br /&gt;
|-&lt;br /&gt;
| Quarzoszillator || 1-100ppm || hochgenau&amp;lt;br&amp;gt;sehr temperaturstabil&amp;lt;br&amp;gt;liefert selbst ein Signal, kann dadurch [[AVR_Fuses#Taktquellen_Fuse_Einstellung | verfuste AVRs]] retten&amp;lt;br&amp;gt;kann mehrere Takteingänge treiben || XTAL1 Pin nicht verfügbar&amp;lt;br&amp;gt;Platzbedarf&amp;lt;br&amp;gt;Kosten bei sehr hohen Stückzahlen (1000++)&amp;lt;br&amp;gt;langsames Anschwingen (ca. 10ms)&lt;br /&gt;
|}&lt;br /&gt;
1ppm = 0,0001% (engl. one &#039;&#039;&#039;p&#039;&#039;&#039;art &#039;&#039;&#039;p&#039;&#039;&#039;er &#039;&#039;&#039;m&#039;&#039;&#039;illion, der millionste Teil) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;FF0000&amp;quot;&amp;gt;Achtung: Ein ATMega8 wird mit aktiviertem internen RC-Oszillator ausgeliefert. Um eine andere Taktquelle zu aktivieren, müssen die [[AVR Fuses#Taktquellen Fuse Einstellung|AVR Fuses]] des Prozessors verändert werden. Das muss jedoch sehr vorsichtig gemacht werden, siehe Artikel.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Keramikresonator ====&lt;br /&gt;
&lt;br /&gt;
Die Anbindung des Keramikresonators sieht so aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Resonator.png|framed|center| Resonator Standardbeschaltung]]&lt;br /&gt;
&lt;br /&gt;
Es werden keine Kondensatoren benötigt, diese sind schon eingebaut, daher ist der Anschluss eines Keramikschwingers kinderleicht. Achtung: Keramikresonatoren gibt es mit zwei oder drei Pins. Nur die mit drei Pins besitzen interne Kondensatoren.&lt;br /&gt;
&lt;br /&gt;
==== Quarz ====&lt;br /&gt;
&lt;br /&gt;
Die Anbindung des Quarzes sieht so aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:tutorial-quarz-schaltplan.png|center|framed| Quarz Standardbeschaltung]]&lt;br /&gt;
&lt;br /&gt;
Die beiden Kondensatoren &#039;&#039;&#039;C3&#039;&#039;&#039; und &#039;&#039;&#039;C4&#039;&#039;&#039; sind zum Betrieb des Quarzes notwendig. Ihre Größe ist abhängig von den Daten des Quarzes. Zur Berechnung ihrer Größe gibt es die folgende Formel:&lt;br /&gt;
&lt;br /&gt;
C=2xCL-(CP+CI)&lt;br /&gt;
&lt;br /&gt;
* CP: Leiterbahnen bedingte Kapazität&lt;br /&gt;
* CI: Portbedingte Kapazität&lt;br /&gt;
* CL: Datenblatt des Quarzes&lt;br /&gt;
CP+CI ca. 5pF ?&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von CL = 32pF:&lt;br /&gt;
&lt;br /&gt;
C = 2x32pF-5pF = 59pF&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Spannungsversorgung ===&lt;br /&gt;
&lt;br /&gt;
Die Versorgungsspannung &#039;&#039;&#039;Vcc&#039;&#039;&#039; beträgt 5V und kann z.&amp;amp;nbsp;B. mit der in diesem Kapitel beschriebenen Schaltung erzeugt werden. Falls zum Programmieren des Mikrocontrollers ein [[AVR_In_System_Programmer|ISP-Programmiergerät]] verwendet wird, das an die USB-Schnittstelle angeschlossen ist, kann man die Schaltung auch darüber mit Strom versorgen und dieses Kapitel überspringen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:V_Regler.gif|framed|center|Standard-Netzteilbeschaltung eines 7805]]&lt;br /&gt;
&lt;br /&gt;
Bauteile:&lt;br /&gt;
* IC1: 5V-Spannungsregler 7805&lt;br /&gt;
* C1: Elko 10µF (Polung beachten!)&lt;br /&gt;
* C2,C3: 2x Kondensator 100nF (kein Elektrolyt)&lt;br /&gt;
* D1: Diode 1N4001&lt;br /&gt;
&lt;br /&gt;
Hauptelement der Schaltung ist das IC 7805. Seine Aufgabe ist es aus der Versorgungsspannung stabile 5V zu erzeugen. Dieses IC gibt es seit vielen Jahren und wird von vielen Chipherstellern produziert. Er stellt die einfachste und simpelste Möglichkeit dar, aus einer vorhandenen Gleichspannung definierte 5V zu erzeugen. Den 7805 gibt es in verschiedenen Ausführungen, was seine maximale Strombelastung angeht. Für die Zwecke dieses Tutorials ist die Standard-Variante, welche maximal 1A abgeben kann, völlig ausreichend. Der 7805 enthält eine Übertemperatursicherung, so dass er abschaltet, wenn es ihm zu heiß wird.&lt;br /&gt;
&lt;br /&gt;
Die beiden 100nF Kondensatoren haben die Aufgabe, eine mögliche Schwingneigung des 7805 zu unterdrücken. Sie müssen so nahe wie möglich an den Anschlusspins des 7805 angeschlossen werden, um ihre Wirkung zu entfalten.&lt;br /&gt;
&lt;br /&gt;
An den Eingang (+ und - im Schaltplan) wird ein Steckernetzteil mit einer Spannung von 7 - 12V angeschlossen. Der 7805 benötigt an seinem Eingang eine Gleichspannung, die mindestens 7V beträgt. Auf der anderen Seite ergibt es auch keinen Sinn, wesentlich über 12V Eingangsspannung hinauszugehen. Der 7805 ist ein Linearregler. Salopp gesagt, wird die überschüssige Spannung in Form von Wärme vernichtet. Liegt die Eingangsspannung weit über 12V, so wird schon wesentlich mehr Energie in Form von Wärme umgesetzt, als am Ausgang entnommen werden kann. Mal ganz davon abgesehen, dass der 7805 davon brennend heiß werden wird.&lt;br /&gt;
&lt;br /&gt;
Hier ein paar kleine Rechenbeispiele:&lt;br /&gt;
12V Eingangsspannung - 5V Ausgangsspannung = 7V Differenz x 0,1A Strombedarf der Schaltung ergibt die Verlustwärme die abgeführt werden muss.&lt;br /&gt;
&lt;br /&gt;
7V x 0,1A = 0,7 Watt&lt;br /&gt;
&lt;br /&gt;
Wenn man jetzt eine Eingangsspannung von 7V nimmt, so dass die Mindestdifferenz von 2V noch eingehalten wird kommen wir zu diesen Werten&lt;br /&gt;
&lt;br /&gt;
2V x  0,1A = 0,2 Watt Abwärme&lt;br /&gt;
2V x 0,35A = 0,7 Watt Abwärme oder anders gesagt, können wir der Schaltung 350mA entnehmen und haben die gleiche Abwärme wie im oberen Beispiel mit nur 100mA Stromentnahme.&lt;br /&gt;
&lt;br /&gt;
Man sieht, dass man die Eingangsspannung so klein wie möglich wählen sollte um dadurch die Verluste in Grenzen halten zu können. Außerdem ist es meist so, dass für eine geringere Stromentnahme auch eine niedrigere Differenzspannung ausreicht. In manchen Datenblätter ist z.B. angegeben 0,5A = 1V Dropvoltage und bei 1A = 2V Dropvoltage....&lt;br /&gt;
&lt;br /&gt;
Weiterhin sei gesagt, dass es so genannte Low Drop, Ultra Low Drop...Regler gibt, die mit einer viel kleineren Differenz zw. Ein- und Ausgangsspannung zurechtkommen, wodurch man die Verluste noch weiter drücken kann.&lt;br /&gt;
&lt;br /&gt;
Eine Stromversorgung mit Batterien ist grundsätzlich auch möglich, wenn die elektrischen Grenzdaten des µC eingehalten werden (max. Spannung, min. Spannung). Bei der geregelten Stromversorgung oben sollte die Batteriespannung ca. 1.5 - 2.5V (Dropout-Spannung des Linearreglers) größer sein als die Versorgungsspannung des µC. Die [[Versorgung aus einer Zelle]] ist ein Thema für Fortgeschrittene.&lt;br /&gt;
&lt;br /&gt;
=== Beispielhafter Aufbau auf einem [[Steckbrett]] ===&lt;br /&gt;
&lt;br /&gt;
Auf einem [[Steckbrett]] könnte eine Schaltung etwa so aussehen:&lt;br /&gt;
&lt;br /&gt;
[[Bild:tutorial_grundschaltung_breadboard.jpg|600px|center|Steckbrett mit Selbstschaltung Atmega8 und Quarz als externe Taktquelle]]&lt;br /&gt;
&lt;br /&gt;
Hier ist die oben beschriebene Selbstbauschaltung zu sehen.  Spannungsversorgung (links), 6-poliger ISP-Anschluss (rechts hinter dem µC), Quarz mit 2 Kondensatoren statt Oszillator, erweitert um eine LED mit Vorwiderstand an PB0 (rechts vor dem µC), einem Resettaster (links vor dem µC) und einem Stützkondensator zwischen +5V und GND (rechts unten).&lt;br /&gt;
&lt;br /&gt;
=== Der ISP-Programmierer (In-System-Programmer)===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mikrocontroller.gif|framed|right|ISP Programmierer]]&lt;br /&gt;
Dann braucht man nur noch den &#039;&#039;&#039;ISP-Programmieradapter&#039;&#039;&#039;, über den man die Programme vom PC in den Controller übertragen kann. Eine Übersicht über mögliche ISP-Programmer Varianten findet sich im Artikel [[AVR_In_System_Programmer]].&lt;br /&gt;
&lt;br /&gt;
Fertige ISP-Programmer zum Anschluss an den Parallelport oder USB gibt es z.&amp;amp;nbsp;B. auf http://shop.mikrocontroller.net/. &lt;br /&gt;
&lt;br /&gt;
Eine Bauanleitung gibt es u.a. auf [http://www.rn-wissen.de/index.php/AVR-ISP_Programmierkabel http://www.rn-wissen.de/index.php/AVR-ISP_Programmierkabel] oder [http://rumil.de/hardware/avrisp.html http://rumil.de/hardware/avrisp.html].&lt;br /&gt;
&lt;br /&gt;
Den ISP-Adapter schließt man an den Parallelport an und verbindet ihn mit der Stiftleiste SV1 über ein 6-adriges Kabel (siehe Schaltplan).&lt;br /&gt;
&lt;br /&gt;
=== Sonstiges ===&lt;br /&gt;
&lt;br /&gt;
Wer vorausschauend kauft, kauft mehr als einen Mikrocontroller. Bis der erste Controller defekt ist, oder man durch Austauschen sicher gehen möchte, ob der Fehler im Programm oder im Controller ist, vergeht nur wenig Zeit.&lt;br /&gt;
&lt;br /&gt;
Tipp: Die Preise für Mikrocontroller haben eine deutliche Spannweite, nicht selten ist ein und derselbe Typ für 3 oder 8 Euro zu haben. Oft sind neuere oder größere Modelle billiger (ATmega8A statt ATmega8, ATmega328 statt ATmega8A). Eine Suche im Internet lohnt sich. Das Gleiche gilt für den Kauf von ISP-Programmierern.&lt;br /&gt;
&lt;br /&gt;
Für weitere Kapitel dieses Tutorials sollte man sich noch die folgenden Bauteile besorgen: &lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 2 (I/O-Grundlagen)&lt;br /&gt;
* 6 LEDs 5mm (Standard-LED, ruhig auch in unterschiedlichen Farben, rot/gelb/grün)&lt;br /&gt;
* 5 Taster&lt;br /&gt;
* 6 Widerstände 1k&lt;br /&gt;
* 5 Widerstände 10k&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 6 (LC-Display)&lt;br /&gt;
* 1 Potentiometer 10k&lt;br /&gt;
* 1 HD44780-kompatibles LCD, z.&amp;amp;nbsp;B. 4x20 oder 2x16 Zeichen&lt;br /&gt;
*   besitzt das LCD eine Hintergrundbeleuchtung, dann noch einen Vorwiderstand dafür. Details dazu stehen im Datenblatt des LCD. Ein Wert von 50Ω sollte aber in jedem Fall passen. Schlimmstenfalls ist die Hintergrundbeleuchtung dann etwas zu dunkel.&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 10 (Der UART)&lt;br /&gt;
* 1 Pegelwandler MAX232, MAX232&#039;&#039;&#039;A&#039;&#039;&#039; oder MAX202&lt;br /&gt;
* 5 Kondensatoren&lt;br /&gt;
** Bei einem MAX232: je 1µF Elektrolytkondensator&lt;br /&gt;
** Bei einem MAX202 oder MAX232&#039;&#039;&#039;A&#039;&#039;&#039;: je  100nF Keramik- oder Elektrolytkondensator&lt;br /&gt;
:Die Kondensatoren dürfen auch größer sein. Ist man sich nicht sicher, welchen MAX232 man hat (A oder nicht A), dann die größeren Kondensatoren 1µF nehmen, die funktionieren auch beim MAX232A oder MAX202.&lt;br /&gt;
* 1 9-polige SUBD-Buchse (female)&lt;br /&gt;
* 1 dazu passendes Modem(nicht Nullmodem!)-Kabel&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 14 (ADC)&lt;br /&gt;
* 1 Kondensator 100n&lt;br /&gt;
* 1 Potentiometer 10k&lt;br /&gt;
* nach Lust und Laune temperatur- oder lichtabhängige Widerstände und jeweils einen Widerstand in der gleichen Größenordnung wie der Sensor&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 17 (Schieberegister)&lt;br /&gt;
* 2 Schieberegister 74HC595&lt;br /&gt;
* einige LED, damit man an die Schieberegister auch etwas anschließen kann, samt passenden Vorwiderständen&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
Teil 19 (7-Segmentanzeige)&lt;br /&gt;
* 4 7-Segmentanzeigen mit gemeinsamer Anode&lt;br /&gt;
* 4 PNP-Transistoren BC328&lt;br /&gt;
* 4 Widerstände 1k&lt;br /&gt;
* 7 Widerstände 100Ω&lt;br /&gt;
&lt;br /&gt;
Für weitere Bauteile, die man als angehender µC Bastler auch des Öfteren mal benötigt, empfiehlt sich ein Blick in die Liste der [[Standardbauelemente]] bzw. in die [[Absolute_beginner|Grundausstattung]]. Wenn Ihr Händler Großpackungen (zb. 100 Stück) von 100n Kondensatoren, 10k, 1k oder 100Ω Widerständen anbietet, sollten Sie deren Erwerb in Erwägung ziehen. Diese Bauteile benötigt man oft, und derartige Großpackungen sind meist nicht teurer, als wenn man einige wenige Exemplare einzeln kauft. Dies hängt damit zusammen, dass das Herauszählen von 9 Bauteilen für den Verkäufer teurer kommt, als 100 Bauteile abgepackt aus dem Regal zu nehmen.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
In diesem Tutorial wird nur auf die Programmierung in Assembler eingegangen, da Assembler für das Verständnis der Hardware am besten geeignet ist.&lt;br /&gt;
&lt;br /&gt;
=== Assembler ===&lt;br /&gt;
&lt;br /&gt;
Zuerst braucht man einen &#039;&#039;&#039;Assembler&#039;&#039;&#039;, der in Assemblersprache geschriebene Programme in Maschinencode übersetzt. Windows-User können das [http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2725 AVR-Studio] von Atmel verwenden, das neben dem Assembler auch einen Simulator enthält, mit dem sich die Programme vor der Übertragung in den Controller testen lassen; für Linux gibt es [http://www.tavrasm.org/ tavrasm], [http://avra.sourceforge.net/ avra] und [http://avr-asm-tutorial.net/gavrasm/index_de.html gavrasm]. &lt;br /&gt;
&lt;br /&gt;
Um die vom Assembler erzeugte &amp;quot;.hex&amp;quot;-Datei über den ISP-Adapter in den Mikrocontroller zu programmieren, kann man unter Windows z.&amp;amp;nbsp;B. das Programm [http://www.myplace.nu/avr/yaap/ yaap] verwenden, für Linux gibt es [http://savannah.nongnu.org/projects/uisp/ uisp], für beide avrdude.&lt;br /&gt;
&lt;br /&gt;
=== C ===&lt;br /&gt;
Wer in C programmieren möchte, kann den kostenlosen GNU-C-Compiler AVR-GCC (unter Windows &amp;quot;WinAVR&amp;quot;) ausprobieren. Dieser C-Compiler kann auch in das für Assembler-Programmierung notwendige AVR-Studio integriert werden. In der Artikelsammlung gibt es ein umfangreiches [[AVR-GCC-Tutorial|Tutorial]] zu diesem Compiler;&lt;br /&gt;
&lt;br /&gt;
Wer unter Windows und Linux gleichermassen kostenlos entwickeln will, der sollte sich die [http://www.eclipse.org/ IDE Eclipse for C/C++ Developers] und das [http://avr-eclipse.sourceforge.net/wiki/index.php/The_AVR_Eclipse_Plugin AVR-Eclipse Plugin ] ansehen, beide sind unter Windows und Linux einfach zu installieren. Hier wird auch der AVR-GCC benutzt. In der Artikelsammlung gibt es ein umfangreiches [[AVR Eclipse|AVR Eclipse Tutorial]] zu dieser IDE.&lt;br /&gt;
Ebenfalls unter Linux und Windows verfügbar ist die Entwicklungsumgebung [http://www.codeblocks.org/ Code::Blocks] (aktuelle, stabile Versionen sind als Nightly Builds regelmäßig im [http://forums.codeblocks.org/ Forum] verfügbar). Innerhalb dieser Entwicklungsumgebung können ohne die Installation zusätzlicher Plugins &amp;quot;AVR-Projekte&amp;quot; angelegt werden.&lt;br /&gt;
&lt;br /&gt;
Fragen dazu stellt man am besten hier im [http://www.mikrocontroller.net/forum/list-2-1.html GCC-Forum].&lt;br /&gt;
&lt;br /&gt;
=== Pascal ===&lt;br /&gt;
Wer in Pascal programmieren muss, kann [http://www.e-lab.de AVRPascal] ausprobieren.&amp;lt;br&amp;gt; &lt;br /&gt;
Dieser Pascalcompiler ist kostenfrei bis 4kb Code und bietet viele ausgereifte Bibliotheken für Servoansteuerung, Serielle Schnittstellen (COM, TWI, SPI), PWM, Timernutzung, LC-Displays usw.&amp;lt;br&amp;gt; &lt;br /&gt;
Außerdem gibt es eine kostenfreie Version für den Mega8 und den Mega88.&lt;br /&gt;
[http://www.e-lab.de E-LAB].&lt;br /&gt;
&lt;br /&gt;
=== Basic ===&lt;br /&gt;
Auch Basic-Fans kommen nicht zu kurz, für die gibt es z.&amp;amp;nbsp;B. [[Bascom AVR]] ($69, Demo verfügbar) oder das kostenlose [[http://avr.myluna.de LunaAVR]].&lt;br /&gt;
&lt;br /&gt;
=== Forth ===&lt;br /&gt;
Wer einen direkten und interaktiven Zugang zum Controller haben will, sollte sich [http://amforth.sourceforge.net Forth] anschauen. Voraussetzung ist ein serieller Anschluß (Max232), also etwas mehr als die Minimalbeschaltung.&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
Bevor man anfängt, sollte man sich die folgenden PDF-Dateien runterladen und zumindest mal reinschauen:&lt;br /&gt;
&lt;br /&gt;
* [http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf Datenblatt des ATmega8 (4,54 MB)]&lt;br /&gt;
* [http://www.atmel.com/dyn/resources/prod_documents/doc0856.pdf Befehlssatz der AVRs (1,27 MB)]&lt;br /&gt;
* oder [http://www.avr-roboter.de/controller/befehle/befehle.html Befehlssatz in deutscher Übersetzung online]&lt;br /&gt;
* oder [http://www.avr-modelleisenbahn.de/atmega8/0-einleitung.htm Datenblatt des ATmega8 in deutscher Übersetzung online]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Datenblatt eines Controllers ist das wichtigste Dokument für einen Entwickler. Es enthält Informationen über die Pinbelegung, Versorgungsspannung, Beschaltung, Speicher, die Verwendung der IO-Komponenten und vieles mehr.&lt;br /&gt;
&lt;br /&gt;
Im Befehlssatz sind alle Assemblerbefehle der AVR-Controllerfamilie aufgelistet und erklärt.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
 &lt;br /&gt;
{{Navigation_hochvor|	 &lt;br /&gt;
hochtext=Inhaltsverzeichnis|	 &lt;br /&gt;
hochlink=AVR-Tutorial|	 &lt;br /&gt;
vortext=I/O Grundlagen|	 &lt;br /&gt;
vorlink=AVR-Tutorial: IO-Grundlagen}}	 &lt;br /&gt;
 &lt;br /&gt;
[[Category:AVR-Tutorial|Equipment]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVRDUDE&amp;diff=77876</id>
		<title>AVRDUDE</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVRDUDE&amp;diff=77876"/>
		<updated>2013-08-05T11:54:27Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Parallelport-Programmer an aktuellen PCs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beschreibung ==&lt;br /&gt;
AVRDUDE (http://www.nongnu.org/avrdude/) ist eine Programmiersoftware für Atmel [[AVR]] Controller. &lt;br /&gt;
&lt;br /&gt;
Funktionen unter Anderem: &lt;br /&gt;
&lt;br /&gt;
* Übertragen von Programmcode in den Flash-Speicher&lt;br /&gt;
* Auslesen ungeschützen Codes aus dem Flash&lt;br /&gt;
* Setzen und Lesen von Fuse- und Lockbits (Siehe auch: [[AVR_Fuses#Vergleich_der_Fuses_bei_verschiedenen_Programmen|Vergleich der Fuses bei verschiedenen Programmen]])&lt;br /&gt;
* Schreiben und Lesen des EEPROMs&lt;br /&gt;
&lt;br /&gt;
AVRDUDE kann das [[STK500]] (auch mit Firmware 2.x als stk500v2), das Atmel AVRISP (auch mit Firmware 2.x als avrispv2 o.ä.), das Atmel AVRISP MKII (USB Ansteuerung mittels lib-usb bzw. lib-usb-W32), [[AVR_In_System_Programmer#USB | AVR910-kompatible]] Programmierer, den [[AVR Butterfly]]/AVR109-kompatible Bootloader, [[STK200]]-Programmierdongles und verschiedene andere Parallelport-Adapter sowie &amp;quot;serielle Statusportprogrammierer&amp;quot; (Siprog) ansteuern. Auch das Atmel JTAGICE (oder Nachbauten wie Bootice oder Evertool), Atmel JTAGICE-MKII und der AVR Dragon können als Programmierhardware genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Das Programm ist unter MS-Windows (Cygwin nicht erforderlich), Linux, BSD, Solaris und Mac OS X lauffähig. Die Version für MS-Windows ist im [[WinAVR]]-Paket enthalten. Der Quellcode ist frei verfügbar (Lizenz beachten).&lt;br /&gt;
&lt;br /&gt;
Da alle AVRDUDE-Funktionen über Kommandozeilenparamter gesteuert werden können, eignet es sich gut zur Integration in Makefiles. Beispiele finden sich in der Makefile-Vorlage von [[WinAVR]] und Mfile. &lt;br /&gt;
&lt;br /&gt;
Die gesamte Konfiguration liegt in einer Textdatei (avrdude.conf), so dass sich bei Bedarf ein beliebiger neuer Parallelport-Programmierdongle oder auch ein noch nicht unterstützter AVR-Controller ergänzen lassen. Die Syntax für die Definition eines AVR-Controllers lehnt sich an die Datenblatt-Tabelle für die serielle Programmierung an, so dass man praktisch nur das Datenblatt &amp;quot;intelligent&amp;quot; abtippen muss.&lt;br /&gt;
&lt;br /&gt;
Für die Ansteuerung von Parallelport-Adaptern unter MS-Windows NT/2000/XP wird ein spezieller Porttreiber (giveio) mitgeliefert. Bei der Installation von [[WinAVR]] wird giveio bereits mitinstalliert. &lt;br /&gt;
&lt;br /&gt;
Programmer mit üblicher serieller Schnittstelle (RS232) benötigen keine zusätzliche Software oder Treiber zum Betrieb mit AVRDUDE. &lt;br /&gt;
&lt;br /&gt;
Für Hardware mit USB-Anschluss muss die lib-usb bzw. lib-usb-win32 installiert sein.&lt;br /&gt;
&lt;br /&gt;
===GUIs===&lt;br /&gt;
Bei [[WinAVR]] wird die grafische Oberfläche avrdude-gui.exe mitgeliefert.&lt;br /&gt;
&lt;br /&gt;
In der IDE von [[LunaAVR]] ist ebenfalls eine GUI für AVRDUDE enthalten (Windows und Linux).&lt;br /&gt;
&lt;br /&gt;
Für Windows, Linux und andere Betriebssysteme gibt es zwei weitere GUIs: den in Java geschriebene [[Burn-o-mat|AVR Burn-O-Mat]] und den [http://www.soft-land.de/index.php?page=avrburner avrburner] (avrburner: Link defekt).&lt;br /&gt;
&lt;br /&gt;
Für Mac OS X gibt es noch [http://www.vonnieda.org/software/avrfuses AVRFuses.app]. AVRFuses muss beim ersten Starten auf den verwendeten Programmer und den Speicherort von AVRDUDE eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
GUIs vereinfachen vor allem Programmieren der Fuses.&lt;br /&gt;
&lt;br /&gt;
== Kurzanleitung für Linux und STK200 ==&lt;br /&gt;
&lt;br /&gt;
Dazu muss erst ein Hardware-Link auf die Printerport-Treiber eingerichtet werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
su&lt;br /&gt;
mknod /dev/parport0 c 99 0&lt;br /&gt;
chmod a+rw /dev/parport0&lt;br /&gt;
avrdude -p m8535 -c stk200 -e -U qqtraff.hex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis :&lt;br /&gt;
Bei USB Programmern ist zu beachten, dass diese durch das Betriebssystem auf einen anderen Port gelegt werden können, als im Beispiel angegeben.&lt;br /&gt;
Diesen Port kann man unter Anderem &amp;quot;im Terminal&amp;quot; mit dem Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
user@server: dmesg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ermitteln.&lt;br /&gt;
Alternativ kann man sich eine Auflistung der Ports, im Verzeichnis &amp;quot;/dev&amp;quot; anzeigen lassen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
user@server: ls /dev/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Sollte man nicht sicher sein, auf welchem Port der Programmer liegt, kann man den Programmer nochmals ausstecken und &amp;quot;ls /dev/&amp;quot; ausführen. Der nun Fehlende Port, ist der Programmerport.&lt;br /&gt;
Diesen Port muss man statt &amp;quot;parport0&amp;quot; in die oben beschriebenen Terminalkommandos einsetzen.&lt;br /&gt;
&lt;br /&gt;
Siehe auch : &lt;br /&gt;
* [http://wiki.ctbot.de/index.php/AVR_ISP_Programmer#BlueMP3_bzw._STK200_kompatible_Flasher weitere Beispiele für avrdude Kommandos (http://wiki.ctbot.de/index.php)]&lt;br /&gt;
* [[AVR_In_System_Programmer#STK200-kompatibel]]&lt;br /&gt;
* http://www.mikrocontroller.net/topic/200390#new&lt;br /&gt;
&lt;br /&gt;
== Tipps + Tricks ==&lt;br /&gt;
&lt;br /&gt;
=== [[AVR_In_System_Programmer#Parallelport|Parallelport-Programmer]] an aktuellen PCs ===&lt;br /&gt;
&lt;br /&gt;
Sofern man ein echtes Parallelport hat, die preiswerteste und auch schnellste Art der Datenübertragung zum Zielsystem (Mikrocontroller). Alles andere wie bspw. eine PCI-, PCIexpress- oder ExpressCard-Karte ist schon komplizierter und teurer.&lt;br /&gt;
&lt;br /&gt;
==== Steckkarten ====&lt;br /&gt;
&lt;br /&gt;
Diese liegen auf anderen Basisadressen. Kann man im Geräte-Manager einsehen. Diese ist &amp;lt;tt&amp;gt;avrdude&amp;lt;/tt&amp;gt; per Kommandozeile &#039;&#039;(irgendwie)&#039;&#039; mitzuteilen. Sonst kann es nicht funktionieren.&lt;br /&gt;
&lt;br /&gt;
Die Geschwindigkeit ist gleich eingebauter echter Parallelports, also sehr schnell.&lt;br /&gt;
&lt;br /&gt;
==== USB-Parallel-Adapter ====&lt;br /&gt;
&lt;br /&gt;
Gewöhnliche USB-Paralleldrucker-Adapter (um 5 € zu haben) &#039;&#039;&#039;funktionieren nicht&#039;&#039;&#039;. (Das Problem wäre zu lösen, wenn &amp;lt;tt&amp;gt;avrdude&amp;lt;/tt&amp;gt; auf InpOut32.dll setzt. Siehe [[#64-Bit-Problem|64-Bit-Problem unten]].)&lt;br /&gt;
&lt;br /&gt;
[http://www.tu-chemnitz.de/~heha/usb2lpt Spezielle USB-Parallel-Adapter], die Portadressen emulieren, funktionieren, allerdings gähnend langsam.&lt;br /&gt;
&lt;br /&gt;
==== Geschwindigkeit begrenzen ====&lt;br /&gt;
&lt;br /&gt;
Aktuelle PCs sind einfach zu schnell mit dem Bitgewackel an der parallelen Schnittstelle, vor allem für AVRs, die noch mit den 1 MHz im Auslieferungszustand laufen (maximal zulässiger ISP-Takt &amp;lt; 250 kHz). Neuere Versionen von avrdude unterstützen zu diesem Zweck eine Option &#039;&#039;&#039;-i &amp;lt;N&amp;gt;&#039;&#039;&#039;, wobei &amp;lt;N&amp;gt; die Anzahl der Mikrosekunden bezeichnet, die beim Bitwackeln zusätzlich zu warten ist. Einfach mal mit -i 10 anfangen und dann entweder die Fuses auf die Ziel-Taktfrequenz umstellen (falls diese wesentlich höher sein wird als die 1 MHz), oder sukkzessive mit kleineren Werten testen ([http://www.mikrocontroller.net/topic/83524#699933 Forenbeitrag von Jörg]).&lt;br /&gt;
&lt;br /&gt;
Die Option -i ist auch nützlich bei AVRs, die für einen langsamen Takt konfiguriert sind. Bei einem ATmega8, der mit einem 32.768 kHz Quarz läuft, kann es z.B. notwendig sein, die Option -i 90 zu verwenden. Den Zahlenwert ggf. ausprobieren.&lt;br /&gt;
&lt;br /&gt;
Manche Programmer werten die Option -i manchmal nicht aus, dann sollte man einen anderen Programmer versuchen.&lt;br /&gt;
&lt;br /&gt;
Beim USBTINY und USBASP kann man die Geschwindigkeit der SPI-Schnittstelle mit dem Parameter -B [Periodendauer in Mikrosekunden] begrenzen. Da beide Geräte durch Interrupts der Software-USB-Schnittstelle stark belastet werden, handelt es sich hier um die Maximalbitrate.&lt;br /&gt;
&lt;br /&gt;
==== Spezielle Hacks ====&lt;br /&gt;
&lt;br /&gt;
Unter Windows XP Service Pack 2 auf einem IBM Thinkpad T40 ließ sich die Fehlermeldung „avrdude: AVR device not responding“ beheben durch Ändern im Gerätemanager⇒Lpt1⇒Eigenschaften⇒Anschlusseinstellungen⇒„Interrupt-nie-verwenden“ in „Jeden dem Anschluss zugewiesenem Interrupt verwenden“.&lt;br /&gt;
&lt;br /&gt;
==== 64-Bit-Problem ====&lt;br /&gt;
&lt;br /&gt;
Unter 64-Bit-Windows-Versionen kann das Parallelport nicht benutzt werden, da der GiveIO-Treiber systembedingt nicht funktioniert. Genauer, es wird ohne [http://www.codeproject.com/Articles/28318/Bypassing-PatchGuard-3 böse Hacks] nicht möglich sein, eine 64-Bit-Version von GiveIO zu erstellen, da es hier eine [http://msdn.microsoft.com/en-us/library/windows/hardware/gg487350.aspx Kernel-Mode-Codeänderungs-Überwachung] gibt, die Änderungen an Systemtabellen (hier: Die IOPM, die In/Out Permission Map, falls es diese überhaupt gibt, und wenn ja, dann nur als Emulation für das 32-Bit-Subsystem) vereitelt (d.h. ein paar Minuten nach der Änderung kommt ein Bluescreen). Solange AVRDUDE an GiveIO (und eincompilierten E/A-Befehlen) festhält bleibt es so, und der Ausweich für den Bastler ist [[Pony-Prog_Tutorial|PonyProg]], bis AVRDUDE künftig ebenfalls InpOut32.dll bzw. InpOutX64.dll verwendet.&lt;br /&gt;
&lt;br /&gt;
=== USB-Programmer ===&lt;br /&gt;
Die meisten USB-Programmiergeräte benötigen [http://sourceforge.net/apps/trac/libusb-win32/wiki libusb-win32] bzw. [http://www.libusb.org/ libusb].&lt;br /&gt;
&lt;br /&gt;
Ein Selbstbau-USB-Programmieradapter ist unter&lt;br /&gt;
[http://www.rototron.info/?Page=USBAVR/USBAVR.aspx http://www.rototron.info]&lt;br /&gt;
zu finden. Er benötigt eine relativ neue AVRDUDE-Version, aber benötigt unter &#039;&#039;keinem&#039;&#039; Windows-Betriebssystem einen Treiber, da er ein [http://de.wikipedia.org/wiki/Human_Interface_Device HID]-Gerät implementiert. &amp;lt;tt&amp;gt;libusb-win32&amp;lt;/tt&amp;gt; wird nicht benötigt. Normale (= reduzierte) Benutzerrechte genügen zum Betrieb des Gerätes.&lt;br /&gt;
&lt;br /&gt;
==== libusb0.dll wird bei WinAvr 20070525 nicht gefunden====&lt;br /&gt;
[http://www.mikrocontroller.net/topic/83524#701461 Forenbeitrag von Paul]: Habe leider noch etwas zu bemängeln, und zwar meckerte avrdude, dass es die &amp;quot;libusb0.dll&amp;quot; nicht fand. Musste dann erst noch manuell den Pfad c:\winavr\utils\libusb\bin in die autoxecec.bat eintragen. Siehe auch [http://www.avrfreaks.net/index.php?name=PNphpBB2&amp;amp;file=viewtopic&amp;amp;p=373283 Diskussion bei www.avrfreaks.net]&lt;br /&gt;
&lt;br /&gt;
====Aufruf unter Linux als user (non-root)====&lt;br /&gt;
&lt;br /&gt;
Unter Linux kann häufig avrdude nur als user &#039;root&#039; auf den USB-Programmer zugreifen. Als normaler User bekommt man eine Fehlermeldung wie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#avrdude -c usbtiny -p m8&lt;br /&gt;
 &lt;br /&gt;
avrdude: error: usbtiny_transmit: &lt;br /&gt;
error sending control message: &lt;br /&gt;
Operation not permitted&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies liegt daran, dass die device-nodes, die beim Einstecken des USB-Programmers von udev angelegt werden, root zugeordnet sind. Man kann dies ändern, indem man udev-Regeln für die verwendeten Programmer anlegt. Unter Debian muß man dazu nur eine neue Datei, z.&amp;amp;nbsp;B. 015_usbprog.rules unter /etc/udev/rules.d anlegen, z.&amp;amp;nbsp;B. mit folgenden Inhalt:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Atmel AVR ISP mkII&lt;br /&gt;
SUBSYSTEM==&amp;quot;usb&amp;quot;, ATTRS{idVendor}==&amp;quot;03eb&amp;quot;, ATTRS{idProduct}==&amp;quot;2104&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# usbprog bootloader&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;1781&amp;quot;, ATTRS{idProduct}==&amp;quot;0c62&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
# USBasp programmer&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;16c0&amp;quot;, ATTRS{idProduct}==&amp;quot;05dc&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
# USBtiny programmer&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;1781&amp;quot;, ATTRS{idProduct}==&amp;quot;0c9f&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
habe den alten Inhalt nur auskommentiert, weil ich das ganze nur mit dem mkII testen konnte. ...Nur falls sich jemand beschweren sollte.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Atmel AVR ISP mkII&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;03eb&amp;quot;, ATTRS{idProduct}==&amp;quot;2104&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot; &lt;br /&gt;
 &lt;br /&gt;
# usbprog bootloader&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;1781&amp;quot;, ATTRS{idProduct}==&amp;quot;0c62&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
# USBasp programmer&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;16c0&amp;quot;, ATTRS{idProduct}==&amp;quot;05dc&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
# USBtiny programmer&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;1781&amp;quot;, ATTRS{idProduct}==&amp;quot;0c9f&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach muss in der Regel der udev-Dienst neu gestartet werden, was -- je nach System -- mit einem der beiden folgenden Befehle funktionieren sollte (natürlich nur als root):&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 /etc/init.d/udev restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 service udev restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo /sbin/udevadm control --reload-rules&amp;lt;/pre&amp;gt; bei aktueller udev-version, oder&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo /sbin/udevcontrol --reload_rules&amp;lt;/pre&amp;gt;, bei älteren udev-versionen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Danach sollte der USB-Programmer erneut angeschlossen werden. Falls es immer noch nicht funktioniert kann es helfen, als GROUP &amp;quot;plugdev&amp;quot; statt &amp;quot;users&amp;quot; zu verwenden.&lt;br /&gt;
&lt;br /&gt;
Hiermit werden der AVR ISP mkII, der usbprog Bootloader, USBasp und USBtiny bekannt gemacht, so daß alle User in der Gruppe &amp;quot;users&amp;quot; darauf zugreifen können.&lt;br /&gt;
&lt;br /&gt;
Für weitere USB-Programmer muß man die entsprechende Zeile (mit ATTRS...) anlegen und die passenden Vendor und Product IDs eintragen.&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* [http://www.reactivated.net/writing_udev_rules.html Writing udev rules]&lt;br /&gt;
&lt;br /&gt;
====Linux-Treiberprobleme====&lt;br /&gt;
&lt;br /&gt;
Wenn der Programmer (usbprog mit AVRisp mkII) unter Ubuntu trotz korrekter Konfiguration nicht gefunden wird, kann es daran liegen, dass das Paket &amp;quot;libmtp-runtime&amp;quot; installiert ist. siehe [https://www.mikrocontroller.net/topic/245816 hier]&lt;br /&gt;
&lt;br /&gt;
=== Anzeige unterstützter AVRs ===&lt;br /&gt;
Wie die anderen Atmels bei avrdude heißen zeigt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -?&lt;br /&gt;
avrdude -p ?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== neuere AVRs hinzufügen ===&lt;br /&gt;
Manch neueres Silizium wird nicht erkannt da sich z.T. die IDs geändert haben. Um diese erfolgreich zu Programmieren empfiehlt sich ein eigenes config-File zu verwenden. Darin werden die &#039;fehlenden&#039; CPUs ergänzt:&lt;br /&gt;
&lt;br /&gt;
z.B. ATmega168P (Programmierung wie ATmega168): einfach den ATmega168 Teil duplizieren und die entsprechenden Änderungen (id, desc, signature) vornehmen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
# ATmega168P&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
part&lt;br /&gt;
    id              = &amp;quot;m168p&amp;quot;;&lt;br /&gt;
    desc            = &amp;quot;ATMEGA168P&amp;quot;;&lt;br /&gt;
     has_debugwire = yes;&lt;br /&gt;
     flash_instr   = 0xB6, 0x01, 0x11;&lt;br /&gt;
     eeprom_instr  = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00,&lt;br /&gt;
	             0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF,&lt;br /&gt;
	             0x99, 0xF9, 0xBB, 0xAF;&lt;br /&gt;
    stk500_devcode  = 0x86;&lt;br /&gt;
    # avr910_devcode = 0x;&lt;br /&gt;
    signature       = 0x1e 0x94 0x0b;&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
danach kann, unter Angabe des neuen config-Files, auch ein ATmega168P programmiert werden, z.B.:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -pm168p -C ~/.avrdude.config.neu -cstk500v2 -v  -U flash:w:main.hex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Anschluss an COM10 und höher (Windows) ===&lt;br /&gt;
&lt;br /&gt;
Wenn AVRDUDE unter Windows an COM10 und höher betrieben werden soll, ist eine andere Schreibweise für die Schnittstelle in der Kommandozeile nötig. Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -c stk500v2 -p m16 -P \\.\com13 -uF -vvvv 2&amp;gt; logfile.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird statt der gewohnten Schreibweise &#039;&#039;&#039;com13&#039;&#039;&#039; die spezielle Schreibweise  &#039;&#039;&#039;\\.\com13&#039;&#039;&#039; verwendet und es wird mit &#039;&#039;-vvvv 2&amp;gt; logfile.txt&#039;&#039; eine ausführliche Debugausgabe für Fragen im Forum erzeugt. Näheres hierzu in der  [http://www.mikrocontroller.net/topic/90401 Forumsdiskussion].&lt;br /&gt;
&lt;br /&gt;
=== AVRISPmkII + AVRDUDE + Window Vista (32) ===&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/topic/126594#1157327&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;avrdude was compiled without usb support&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Offenbar enthielt WinAVR-20100110 zunächst fälschlicherweise eine AVRDUDE Version ohne USB Support [http://www.mikrocontroller.net/topic/163022#1554907].&lt;br /&gt;
&lt;br /&gt;
Abhilfe:&lt;br /&gt;
 &lt;br /&gt;
1. WinAVR deinstallieren, gleiches Release (WinAVR-20100110) nocheinmal herunterladen und installieren (mindestens seit Anfang März 2010 enthält dieses Release avrdude in der Version 5.10 und bringt USB-Support mit).&lt;br /&gt;
&lt;br /&gt;
2. AVRDUDE selbst compilieren: http://www.mikrocontroller.net/topic/163675&lt;br /&gt;
&lt;br /&gt;
3. Compilierte Version 5.10 downloaden: http://www.mikrocontroller.net/topic/163675#1594689&lt;br /&gt;
&lt;br /&gt;
=== Textausgabe in Datei umleiten? ===&lt;br /&gt;
&lt;br /&gt;
Die Windows-&amp;quot;Shell&amp;quot; &#039;&#039;cmd&#039;&#039; benutzt für die Ausgabeumleitung die gleiche Syntax wie die Bourne-Shell (und damit auch&lt;br /&gt;
Bash): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
programm &amp;gt;datei 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zur Umleitung von STDOUT und STDERR in die gleiche Datei (Yalu in [http://www.mikrocontroller.net/topic/124509#1135568]).&lt;br /&gt;
&lt;br /&gt;
Beispiel für Windows ([http://www.mikrocontroller.net/topic/124509#1136322], [http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/redirection.mspx?mfr=true M$]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -c avrispmkII -p m8 -P usb:xx -v &amp;gt; &amp;quot;C:\output.txt&amp;quot; 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder nur STDERR in Datei umleiten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -c avrispmkII -p m8 -P usb:xx -v 2&amp;gt; &amp;quot;C:\output.txt&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [http://www.franzis.de/elektronik/lernpakete-elektronik/lernpaket-mikrocontroller Franzis] bzw. [http://www.elo-web.de/elo/mikrocontroller-und-programmierung/avr-grundlagen/experimente-mit-dem-attiny13 ELO] Lernpaket Mikrocontroller (Attiny13) ===&lt;br /&gt;
&lt;br /&gt;
Markus hat in [http://www.mikrocontroller.net/topic/169549#1649459] einen Weg beschrieben, wie man den einfachen Programmieradapter des Lernpakets mit AVRDUDE ansteuern kann.&lt;br /&gt;
&lt;br /&gt;
Eine weitere Anleitung [http://www.elektronik-labor.de/AVR/AVRdude.html LP Mikrocontroller und Attiny45 mit Avrdude] gibt es von Ralf Beesner auf der Webseite des Entwicklers Burkhard Kainka. In &#039;&#039;avrdude.conf&#039;&#039; wird dabei ein neuer Programmieradapter namens &#039;&#039;burkhard&#039;&#039; hinzugefügt. Ein zweiter Eintrag &#039;&#039;burkhard2&#039;&#039; in dieser &#039;&#039;&#039;avrdude.conf&#039;&#039;&#039; ist für die Programmierung des Atmega8 auf dem Franzis Retro-Pong Bausatz mit Hilfe des &amp;quot;Mega8-ISP-Programmer&amp;quot; (Layout siehe ELO-Webseite) vorgesehen.&lt;br /&gt;
&lt;br /&gt;
=== AVRDUDE mit Arduino Bootloader benutzen ===&lt;br /&gt;
&lt;br /&gt;
Mit der Option &#039;&#039;-c stk500v1&#039;&#039; kann AVRDUDE den [[Bootloader]] in Arduino Boards ansprechen [http://www.mikrocontroller.net/topic/195963#1919654].&lt;br /&gt;
&lt;br /&gt;
Es existieren auch modifizierte Versionen von AVRDUDE, die einen Programmer namens &#039;&#039;arduino&#039;&#039; kennen (avrdude.conf untersuchen!). Damit lautet die Kommandozeile für ein Arduinoboard mit Atmega168 beispielsweise [http://www.neuraladvance.com/2010/04/08/using-avrdude-with-the-arduino-duemilanove/]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -c arduino -p m168 -P usb -U flash:w:&amp;lt;filename&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Evtl. muss auch noch die Datenrate mit der Option -b angepasst werden, je nach Board werden verschiedene (19200, 57600, 115200) verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Bootloader-Hacks von [http://www.ladyada.net/library/arduino/bootloader.html Ladyada] arbeiten nochmal etwas anders.&lt;br /&gt;
&lt;br /&gt;
Gelegentlich gibt es unter Windows Probleme mit der allgemeinen AVRDUDE Version und deren Handling der DTR/RTS Leitung ([[RS232]]). Es kann helfen, unmittelbar von dem Absenden der Kommandozeile einen RESET auf dem Arduinoboard durchzuführen.&lt;br /&gt;
Ein kurzes Setzen der DTR Leitung auf HIGH bewirkt ein RESET. So ist es möglich eine .bat Datei zu erstellen mit folgendem Code: (com6 ist ein Virtueller USB Comport) &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mode com6 dtr=on&lt;br /&gt;
avrdude -c arduino -p m168 -P \\.\com6 -U flash:w:&amp;lt;filename&amp;gt;&lt;br /&gt;
if %ERRORLEVEL%==0 goto fertig&lt;br /&gt;
Pause&lt;br /&gt;
:fertig&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man den mode-Befehl nicht verwenden kann, etwa weil man cygwin und ein makefile verwendet, so kann man stattdessen &amp;lt;pre&amp;gt;cmd /c mode com6 dtr=on&amp;lt;/pre&amp;gt; verwenden. In cygwin empfiehlt sich &amp;lt;pre&amp;gt;cmd /c mode com6 dtr=on &amp;gt; /dev/null&amp;lt;/pre&amp;gt;, damit wird die unnütze Ausgabe des Befehls verborgen.&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* http://www.mikrocontroller.net/topic/232367&lt;br /&gt;
* http://www.mikrocontroller.net/topic/238243&lt;br /&gt;
&lt;br /&gt;
=== mysmartUSB V2.11 und ATtiny 13 ===&lt;br /&gt;
&lt;br /&gt;
mysmartUSB V2.11 verlangt -cavr910 als Programmer. Leider ist in avrdude&lt;br /&gt;
5.10 immer noch nicht der ATtiny13 damit zu programmieren. Also in die&lt;br /&gt;
avrdude.conf folgendes mit unter ATtiny13 aufnehmen, so kann er dann&lt;br /&gt;
korrekt programmiert werden(inkl. Fuse Bits).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
# ATtiny13&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
part&lt;br /&gt;
    id                  = &amp;quot;t13&amp;quot;;&lt;br /&gt;
    desc                = &amp;quot;ATtiny13&amp;quot;;&lt;br /&gt;
     has_debugwire = yes;&lt;br /&gt;
     flash_instr   = 0xB4, 0x0E, 0x1E;&lt;br /&gt;
     eeprom_instr  = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D,&lt;br /&gt;
               0xBC, 0x0E, 0xB4, 0x0E, 0xBA, 0x0D, 0xBB, 0xBC,&lt;br /&gt;
               0x99, 0xE1, 0xBB, 0xAC;&lt;br /&gt;
    stk500_devcode      = 0x14;&lt;br /&gt;
    avr910_devcode      = 0x55;&lt;br /&gt;
......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung! Programmieren geht auch mit -cavr911. Allerdings geht das Fuse&lt;br /&gt;
setzen nicht und man bekommt eine Fehlermeldung.(Programm läuft aber)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Reading | ################################################## | 100%&lt;br /&gt;
0.12s&lt;br /&gt;
&lt;br /&gt;
avrdude: verifying ...&lt;br /&gt;
avrdude: 226 bytes of flash verified&lt;br /&gt;
avrdude: reading input file &amp;quot;0x7a&amp;quot;&lt;br /&gt;
avrdude: writing lfuse (1 bytes):&lt;br /&gt;
&lt;br /&gt;
Writing |  ***failed;&lt;br /&gt;
################################################## | 100% 0.00s&lt;br /&gt;
&lt;br /&gt;
avrdude: 1 bytes of lfuse written&lt;br /&gt;
avrdude: verifying lfuse memory against 0x7a:&lt;br /&gt;
avrdude: load data lfuse data from input file 0x7a:&lt;br /&gt;
avrdude: input file 0x7a contains 1 bytes&lt;br /&gt;
avrdude: reading on-chip lfuse data:&lt;br /&gt;
&lt;br /&gt;
Reading | ################################################## | 100%&lt;br /&gt;
0.00s&lt;br /&gt;
&lt;br /&gt;
avrdude: verifying ...&lt;br /&gt;
avrdude: 1 bytes of lfuse verified&lt;br /&gt;
avrdude: reading input file &amp;quot;0xff&amp;quot;&lt;br /&gt;
avrdude: writing hfuse (1 bytes):&lt;br /&gt;
&lt;br /&gt;
Writing |  ***failed;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Anpassungen von avrdude.conf an neuere AVRs ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ATtiny167&#039;&#039;&#039; siehe [http://www.mikrocontroller.net/topic/236355 Forumbeitrag von Volker U.]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* Offizielle AVRDUDE Homepage unter http://www.nongnu.org/avrdude/&lt;br /&gt;
* User Manual (engl.) unter http://www.nongnu.org/avrdude/user-manual/avrdude.html#Top&lt;br /&gt;
* Kompilierte Windows Version mit USB Support http://yuki-lab.jp/hw/avrdude-GUI/avrdude-5.5-win32-bin.zip&lt;br /&gt;
* Kompilierte Windows Version avrdude 5.10 mit USB Support http://www.mikrocontroller.net/topic/163675#1594689&lt;br /&gt;
* Kompilierte Windows Version avrdude 5.11.1 mit USB Support http://www.mikrocontroller.net/topic/163675#2383773&lt;br /&gt;
* Kompilierte Windows Version avrdude 6.0 rc2 http://www.mikrocontroller.net/topic/296379#3166155&lt;br /&gt;
* Wer Interesse an der modifizierten Version von AVRDUDE und des AVR910-Programmer hat, kann sich bei http://www.fischl.de/thomas/elektronik/avr910e/ informieren. Der Programmer bleibt auch mit der Modifikation weiterhin kompatibel zu anderer Programmiersoftware.&lt;br /&gt;
* [[LunaAVR]] GUI für AVRDUDE in der IDE enthalten http://avr.myluna.de mit FUSE-Editor (für Windows und Linux)&lt;br /&gt;
* [[Burn-o-mat|AVR Burn-O-Mat]] GUI (Graphic User Interface) für AVRDUDE http://burn-o-mat.net mit FUSE-Editor (Java, für Windows und Linux)&lt;br /&gt;
* [http://www.soft-land.de/ AVRBurner] Ponyprog-ähnliche Oberfläche für AVRDUDE.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* [http://www.microstar.ir/download/SinaProg.zip SinaProg] SinaProg - avrdude GUI mit AVR Fuse Calculator. &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; LINK IST TOT&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
[[Kategorie:AVR-Programmer und -Bootloader]]&lt;br /&gt;
[[Kategorie:Entwicklungstools]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVRDUDE&amp;diff=77875</id>
		<title>AVRDUDE</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVRDUDE&amp;diff=77875"/>
		<updated>2013-08-05T11:41:47Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Parallelport-Programmer an aktuellen PCs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beschreibung ==&lt;br /&gt;
AVRDUDE (http://www.nongnu.org/avrdude/) ist eine Programmiersoftware für Atmel [[AVR]] Controller. &lt;br /&gt;
&lt;br /&gt;
Funktionen unter Anderem: &lt;br /&gt;
&lt;br /&gt;
* Übertragen von Programmcode in den Flash-Speicher&lt;br /&gt;
* Auslesen ungeschützen Codes aus dem Flash&lt;br /&gt;
* Setzen und Lesen von Fuse- und Lockbits (Siehe auch: [[AVR_Fuses#Vergleich_der_Fuses_bei_verschiedenen_Programmen|Vergleich der Fuses bei verschiedenen Programmen]])&lt;br /&gt;
* Schreiben und Lesen des EEPROMs&lt;br /&gt;
&lt;br /&gt;
AVRDUDE kann das [[STK500]] (auch mit Firmware 2.x als stk500v2), das Atmel AVRISP (auch mit Firmware 2.x als avrispv2 o.ä.), das Atmel AVRISP MKII (USB Ansteuerung mittels lib-usb bzw. lib-usb-W32), [[AVR_In_System_Programmer#USB | AVR910-kompatible]] Programmierer, den [[AVR Butterfly]]/AVR109-kompatible Bootloader, [[STK200]]-Programmierdongles und verschiedene andere Parallelport-Adapter sowie &amp;quot;serielle Statusportprogrammierer&amp;quot; (Siprog) ansteuern. Auch das Atmel JTAGICE (oder Nachbauten wie Bootice oder Evertool), Atmel JTAGICE-MKII und der AVR Dragon können als Programmierhardware genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Das Programm ist unter MS-Windows (Cygwin nicht erforderlich), Linux, BSD, Solaris und Mac OS X lauffähig. Die Version für MS-Windows ist im [[WinAVR]]-Paket enthalten. Der Quellcode ist frei verfügbar (Lizenz beachten).&lt;br /&gt;
&lt;br /&gt;
Da alle AVRDUDE-Funktionen über Kommandozeilenparamter gesteuert werden können, eignet es sich gut zur Integration in Makefiles. Beispiele finden sich in der Makefile-Vorlage von [[WinAVR]] und Mfile. &lt;br /&gt;
&lt;br /&gt;
Die gesamte Konfiguration liegt in einer Textdatei (avrdude.conf), so dass sich bei Bedarf ein beliebiger neuer Parallelport-Programmierdongle oder auch ein noch nicht unterstützter AVR-Controller ergänzen lassen. Die Syntax für die Definition eines AVR-Controllers lehnt sich an die Datenblatt-Tabelle für die serielle Programmierung an, so dass man praktisch nur das Datenblatt &amp;quot;intelligent&amp;quot; abtippen muss.&lt;br /&gt;
&lt;br /&gt;
Für die Ansteuerung von Parallelport-Adaptern unter MS-Windows NT/2000/XP wird ein spezieller Porttreiber (giveio) mitgeliefert. Bei der Installation von [[WinAVR]] wird giveio bereits mitinstalliert. &lt;br /&gt;
&lt;br /&gt;
Programmer mit üblicher serieller Schnittstelle (RS232) benötigen keine zusätzliche Software oder Treiber zum Betrieb mit AVRDUDE. &lt;br /&gt;
&lt;br /&gt;
Für Hardware mit USB-Anschluss muss die lib-usb bzw. lib-usb-win32 installiert sein.&lt;br /&gt;
&lt;br /&gt;
===GUIs===&lt;br /&gt;
Bei [[WinAVR]] wird die grafische Oberfläche avrdude-gui.exe mitgeliefert.&lt;br /&gt;
&lt;br /&gt;
In der IDE von [[LunaAVR]] ist ebenfalls eine GUI für AVRDUDE enthalten (Windows und Linux).&lt;br /&gt;
&lt;br /&gt;
Für Windows, Linux und andere Betriebssysteme gibt es zwei weitere GUIs: den in Java geschriebene [[Burn-o-mat|AVR Burn-O-Mat]] und den [http://www.soft-land.de/index.php?page=avrburner avrburner] (avrburner: Link defekt).&lt;br /&gt;
&lt;br /&gt;
Für Mac OS X gibt es noch [http://www.vonnieda.org/software/avrfuses AVRFuses.app]. AVRFuses muss beim ersten Starten auf den verwendeten Programmer und den Speicherort von AVRDUDE eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
GUIs vereinfachen vor allem Programmieren der Fuses.&lt;br /&gt;
&lt;br /&gt;
== Kurzanleitung für Linux und STK200 ==&lt;br /&gt;
&lt;br /&gt;
Dazu muss erst ein Hardware-Link auf die Printerport-Treiber eingerichtet werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
su&lt;br /&gt;
mknod /dev/parport0 c 99 0&lt;br /&gt;
chmod a+rw /dev/parport0&lt;br /&gt;
avrdude -p m8535 -c stk200 -e -U qqtraff.hex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis :&lt;br /&gt;
Bei USB Programmern ist zu beachten, dass diese durch das Betriebssystem auf einen anderen Port gelegt werden können, als im Beispiel angegeben.&lt;br /&gt;
Diesen Port kann man unter Anderem &amp;quot;im Terminal&amp;quot; mit dem Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
user@server: dmesg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ermitteln.&lt;br /&gt;
Alternativ kann man sich eine Auflistung der Ports, im Verzeichnis &amp;quot;/dev&amp;quot; anzeigen lassen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
user@server: ls /dev/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Sollte man nicht sicher sein, auf welchem Port der Programmer liegt, kann man den Programmer nochmals ausstecken und &amp;quot;ls /dev/&amp;quot; ausführen. Der nun Fehlende Port, ist der Programmerport.&lt;br /&gt;
Diesen Port muss man statt &amp;quot;parport0&amp;quot; in die oben beschriebenen Terminalkommandos einsetzen.&lt;br /&gt;
&lt;br /&gt;
Siehe auch : &lt;br /&gt;
* [http://wiki.ctbot.de/index.php/AVR_ISP_Programmer#BlueMP3_bzw._STK200_kompatible_Flasher weitere Beispiele für avrdude Kommandos (http://wiki.ctbot.de/index.php)]&lt;br /&gt;
* [[AVR_In_System_Programmer#STK200-kompatibel]]&lt;br /&gt;
* http://www.mikrocontroller.net/topic/200390#new&lt;br /&gt;
&lt;br /&gt;
== Tipps + Tricks ==&lt;br /&gt;
&lt;br /&gt;
=== [[AVR_In_System_Programmer#Parallelport|Parallelport-Programmer]] an aktuellen PCs ===&lt;br /&gt;
Aktuelle PCs sind einfach zu schnell mit dem Bitgewackel an der parallelen Schnittstelle, vor allem für AVRs, die noch mit den 1 MHz im Auslieferungszustand laufen (maximal zulässiger ISP-Takt &amp;lt; 250 kHz). Neuere Versionen von avrdude unterstützen zu diesem Zweck eine Option &#039;&#039;&#039;-i &amp;lt;N&amp;gt;&#039;&#039;&#039;, wobei &amp;lt;N&amp;gt; die Anzahl der Mikrosekunden bezeichnet, die beim Bitwackeln zusätzlich zu warten ist. Einfach mal mit -i 10 anfangen und dann entweder die Fuses auf die Ziel-Taktfrequenz umstellen (falls diese wesentlich höher sein wird als die 1 MHz), oder sukkzessive mit kleineren Werten testen ([http://www.mikrocontroller.net/topic/83524#699933 Forenbeitrag von Jörg]).&lt;br /&gt;
&lt;br /&gt;
Die Option -i ist auch nützlich bei AVRs, die für einen langsamen Takt konfiguriert sind. Bei einem ATmega8, der mit einem 32.768 kHz Quarz läuft, kann es z.B. notwendig sein, die Option -i 90 zu verwenden. Den Zahlenwert ggf. ausprobieren.&lt;br /&gt;
&lt;br /&gt;
Manche Programmer werten die Option -i manchmal nicht aus, dann sollte man einen anderen Programmer versuchen.&lt;br /&gt;
&lt;br /&gt;
Beim USBTINY und USBASP kann man die Geschwindigkeit der SPI-Schnittstelle mit dem Parameter -B [Periodendauer in Mikrosekunden] begrenzen. Da beide Geräte durch Interrupts der Software-USB-Schnittstelle stark belastet werden, handelt es sich hier um die Maximalbitrate.&lt;br /&gt;
&lt;br /&gt;
Unter Windows XP Service Pack 2 auf einem IBM Thinkpad T40 ließ sich die Fehlermeldung „avrdude: AVR device not responding“ beheben durch Ändern im Gerätemanager⇒Lpt1⇒Eigenschaften⇒Anschlusseinstellungen⇒„Interrupt-nie-verwenden“ in „Jeden dem Anschluss zugewiesenem Interrupt verwenden“.&lt;br /&gt;
&lt;br /&gt;
Unter 64-Bit-Windows-Versionen kann das Parallelport nicht benutzt werden, da der GiveIO-Treiber systembedingt nicht funktioniert. Genauer, es wird ohne [http://www.codeproject.com/Articles/28318/Bypassing-PatchGuard-3 böse Hacks] nicht möglich sein, eine 64-Bit-Version von GiveIO zu erstellen, da es hier eine [http://msdn.microsoft.com/en-us/library/windows/hardware/gg487350.aspx Kernel-Mode-Codeänderungs-Überwachung] gibt, die Änderungen an Systemtabellen (hier: Die IOPM, die In/Out Permission Map, falls es diese überhaupt gibt, und wenn ja, dann nur als Emulation für das 32-Bit-Subsystem) vereitelt (d.h. ein paar Minuten nach der Änderung kommt ein Bluescreen). Solange AVRDUDE an GiveIO (und eincompilierten E/A-Befehlen) festhält bleibt es so, und der Ausweich für den Bastler ist [[Pony-Prog_Tutorial|PonyProg]], bis AVRDUDE künftig ebenfalls InpOut32.dll bzw. InpOutX64.dll verwendet.&lt;br /&gt;
&lt;br /&gt;
=== USB-Programmer ===&lt;br /&gt;
Die meisten USB-Programmiergeräte benötigen [http://sourceforge.net/apps/trac/libusb-win32/wiki libusb-win32] bzw. [http://www.libusb.org/ libusb].&lt;br /&gt;
&lt;br /&gt;
Ein Selbstbau-USB-Programmieradapter ist unter&lt;br /&gt;
[http://www.rototron.info/?Page=USBAVR/USBAVR.aspx http://www.rototron.info]&lt;br /&gt;
zu finden. Er benötigt eine relativ neue AVRDUDE-Version, aber benötigt unter &#039;&#039;keinem&#039;&#039; Windows-Betriebssystem einen Treiber, da er ein [http://de.wikipedia.org/wiki/Human_Interface_Device HID]-Gerät implementiert. &amp;lt;tt&amp;gt;libusb-win32&amp;lt;/tt&amp;gt; wird nicht benötigt. Normale (= reduzierte) Benutzerrechte genügen zum Betrieb des Gerätes.&lt;br /&gt;
&lt;br /&gt;
==== libusb0.dll wird bei WinAvr 20070525 nicht gefunden====&lt;br /&gt;
[http://www.mikrocontroller.net/topic/83524#701461 Forenbeitrag von Paul]: Habe leider noch etwas zu bemängeln, und zwar meckerte avrdude, dass es die &amp;quot;libusb0.dll&amp;quot; nicht fand. Musste dann erst noch manuell den Pfad c:\winavr\utils\libusb\bin in die autoxecec.bat eintragen. Siehe auch [http://www.avrfreaks.net/index.php?name=PNphpBB2&amp;amp;file=viewtopic&amp;amp;p=373283 Diskussion bei www.avrfreaks.net]&lt;br /&gt;
&lt;br /&gt;
====Aufruf unter Linux als user (non-root)====&lt;br /&gt;
&lt;br /&gt;
Unter Linux kann häufig avrdude nur als user &#039;root&#039; auf den USB-Programmer zugreifen. Als normaler User bekommt man eine Fehlermeldung wie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#avrdude -c usbtiny -p m8&lt;br /&gt;
 &lt;br /&gt;
avrdude: error: usbtiny_transmit: &lt;br /&gt;
error sending control message: &lt;br /&gt;
Operation not permitted&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies liegt daran, dass die device-nodes, die beim Einstecken des USB-Programmers von udev angelegt werden, root zugeordnet sind. Man kann dies ändern, indem man udev-Regeln für die verwendeten Programmer anlegt. Unter Debian muß man dazu nur eine neue Datei, z.&amp;amp;nbsp;B. 015_usbprog.rules unter /etc/udev/rules.d anlegen, z.&amp;amp;nbsp;B. mit folgenden Inhalt:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Atmel AVR ISP mkII&lt;br /&gt;
SUBSYSTEM==&amp;quot;usb&amp;quot;, ATTRS{idVendor}==&amp;quot;03eb&amp;quot;, ATTRS{idProduct}==&amp;quot;2104&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# usbprog bootloader&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;1781&amp;quot;, ATTRS{idProduct}==&amp;quot;0c62&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
# USBasp programmer&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;16c0&amp;quot;, ATTRS{idProduct}==&amp;quot;05dc&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
# USBtiny programmer&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;1781&amp;quot;, ATTRS{idProduct}==&amp;quot;0c9f&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
habe den alten Inhalt nur auskommentiert, weil ich das ganze nur mit dem mkII testen konnte. ...Nur falls sich jemand beschweren sollte.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Atmel AVR ISP mkII&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;03eb&amp;quot;, ATTRS{idProduct}==&amp;quot;2104&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot; &lt;br /&gt;
 &lt;br /&gt;
# usbprog bootloader&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;1781&amp;quot;, ATTRS{idProduct}==&amp;quot;0c62&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
# USBasp programmer&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;16c0&amp;quot;, ATTRS{idProduct}==&amp;quot;05dc&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
# USBtiny programmer&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;1781&amp;quot;, ATTRS{idProduct}==&amp;quot;0c9f&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach muss in der Regel der udev-Dienst neu gestartet werden, was -- je nach System -- mit einem der beiden folgenden Befehle funktionieren sollte (natürlich nur als root):&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 /etc/init.d/udev restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 service udev restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo /sbin/udevadm control --reload-rules&amp;lt;/pre&amp;gt; bei aktueller udev-version, oder&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo /sbin/udevcontrol --reload_rules&amp;lt;/pre&amp;gt;, bei älteren udev-versionen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Danach sollte der USB-Programmer erneut angeschlossen werden. Falls es immer noch nicht funktioniert kann es helfen, als GROUP &amp;quot;plugdev&amp;quot; statt &amp;quot;users&amp;quot; zu verwenden.&lt;br /&gt;
&lt;br /&gt;
Hiermit werden der AVR ISP mkII, der usbprog Bootloader, USBasp und USBtiny bekannt gemacht, so daß alle User in der Gruppe &amp;quot;users&amp;quot; darauf zugreifen können.&lt;br /&gt;
&lt;br /&gt;
Für weitere USB-Programmer muß man die entsprechende Zeile (mit ATTRS...) anlegen und die passenden Vendor und Product IDs eintragen.&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* [http://www.reactivated.net/writing_udev_rules.html Writing udev rules]&lt;br /&gt;
&lt;br /&gt;
====Linux-Treiberprobleme====&lt;br /&gt;
&lt;br /&gt;
Wenn der Programmer (usbprog mit AVRisp mkII) unter Ubuntu trotz korrekter Konfiguration nicht gefunden wird, kann es daran liegen, dass das Paket &amp;quot;libmtp-runtime&amp;quot; installiert ist. siehe [https://www.mikrocontroller.net/topic/245816 hier]&lt;br /&gt;
&lt;br /&gt;
=== Anzeige unterstützter AVRs ===&lt;br /&gt;
Wie die anderen Atmels bei avrdude heißen zeigt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -?&lt;br /&gt;
avrdude -p ?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== neuere AVRs hinzufügen ===&lt;br /&gt;
Manch neueres Silizium wird nicht erkannt da sich z.T. die IDs geändert haben. Um diese erfolgreich zu Programmieren empfiehlt sich ein eigenes config-File zu verwenden. Darin werden die &#039;fehlenden&#039; CPUs ergänzt:&lt;br /&gt;
&lt;br /&gt;
z.B. ATmega168P (Programmierung wie ATmega168): einfach den ATmega168 Teil duplizieren und die entsprechenden Änderungen (id, desc, signature) vornehmen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
# ATmega168P&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
part&lt;br /&gt;
    id              = &amp;quot;m168p&amp;quot;;&lt;br /&gt;
    desc            = &amp;quot;ATMEGA168P&amp;quot;;&lt;br /&gt;
     has_debugwire = yes;&lt;br /&gt;
     flash_instr   = 0xB6, 0x01, 0x11;&lt;br /&gt;
     eeprom_instr  = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00,&lt;br /&gt;
	             0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF,&lt;br /&gt;
	             0x99, 0xF9, 0xBB, 0xAF;&lt;br /&gt;
    stk500_devcode  = 0x86;&lt;br /&gt;
    # avr910_devcode = 0x;&lt;br /&gt;
    signature       = 0x1e 0x94 0x0b;&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
danach kann, unter Angabe des neuen config-Files, auch ein ATmega168P programmiert werden, z.B.:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -pm168p -C ~/.avrdude.config.neu -cstk500v2 -v  -U flash:w:main.hex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Anschluss an COM10 und höher (Windows) ===&lt;br /&gt;
&lt;br /&gt;
Wenn AVRDUDE unter Windows an COM10 und höher betrieben werden soll, ist eine andere Schreibweise für die Schnittstelle in der Kommandozeile nötig. Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -c stk500v2 -p m16 -P \\.\com13 -uF -vvvv 2&amp;gt; logfile.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird statt der gewohnten Schreibweise &#039;&#039;&#039;com13&#039;&#039;&#039; die spezielle Schreibweise  &#039;&#039;&#039;\\.\com13&#039;&#039;&#039; verwendet und es wird mit &#039;&#039;-vvvv 2&amp;gt; logfile.txt&#039;&#039; eine ausführliche Debugausgabe für Fragen im Forum erzeugt. Näheres hierzu in der  [http://www.mikrocontroller.net/topic/90401 Forumsdiskussion].&lt;br /&gt;
&lt;br /&gt;
=== AVRISPmkII + AVRDUDE + Window Vista (32) ===&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/topic/126594#1157327&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;avrdude was compiled without usb support&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Offenbar enthielt WinAVR-20100110 zunächst fälschlicherweise eine AVRDUDE Version ohne USB Support [http://www.mikrocontroller.net/topic/163022#1554907].&lt;br /&gt;
&lt;br /&gt;
Abhilfe:&lt;br /&gt;
 &lt;br /&gt;
1. WinAVR deinstallieren, gleiches Release (WinAVR-20100110) nocheinmal herunterladen und installieren (mindestens seit Anfang März 2010 enthält dieses Release avrdude in der Version 5.10 und bringt USB-Support mit).&lt;br /&gt;
&lt;br /&gt;
2. AVRDUDE selbst compilieren: http://www.mikrocontroller.net/topic/163675&lt;br /&gt;
&lt;br /&gt;
3. Compilierte Version 5.10 downloaden: http://www.mikrocontroller.net/topic/163675#1594689&lt;br /&gt;
&lt;br /&gt;
=== Textausgabe in Datei umleiten? ===&lt;br /&gt;
&lt;br /&gt;
Die Windows-&amp;quot;Shell&amp;quot; &#039;&#039;cmd&#039;&#039; benutzt für die Ausgabeumleitung die gleiche Syntax wie die Bourne-Shell (und damit auch&lt;br /&gt;
Bash): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
programm &amp;gt;datei 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zur Umleitung von STDOUT und STDERR in die gleiche Datei (Yalu in [http://www.mikrocontroller.net/topic/124509#1135568]).&lt;br /&gt;
&lt;br /&gt;
Beispiel für Windows ([http://www.mikrocontroller.net/topic/124509#1136322], [http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/redirection.mspx?mfr=true M$]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -c avrispmkII -p m8 -P usb:xx -v &amp;gt; &amp;quot;C:\output.txt&amp;quot; 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder nur STDERR in Datei umleiten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -c avrispmkII -p m8 -P usb:xx -v 2&amp;gt; &amp;quot;C:\output.txt&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [http://www.franzis.de/elektronik/lernpakete-elektronik/lernpaket-mikrocontroller Franzis] bzw. [http://www.elo-web.de/elo/mikrocontroller-und-programmierung/avr-grundlagen/experimente-mit-dem-attiny13 ELO] Lernpaket Mikrocontroller (Attiny13) ===&lt;br /&gt;
&lt;br /&gt;
Markus hat in [http://www.mikrocontroller.net/topic/169549#1649459] einen Weg beschrieben, wie man den einfachen Programmieradapter des Lernpakets mit AVRDUDE ansteuern kann.&lt;br /&gt;
&lt;br /&gt;
Eine weitere Anleitung [http://www.elektronik-labor.de/AVR/AVRdude.html LP Mikrocontroller und Attiny45 mit Avrdude] gibt es von Ralf Beesner auf der Webseite des Entwicklers Burkhard Kainka. In &#039;&#039;avrdude.conf&#039;&#039; wird dabei ein neuer Programmieradapter namens &#039;&#039;burkhard&#039;&#039; hinzugefügt. Ein zweiter Eintrag &#039;&#039;burkhard2&#039;&#039; in dieser &#039;&#039;&#039;avrdude.conf&#039;&#039;&#039; ist für die Programmierung des Atmega8 auf dem Franzis Retro-Pong Bausatz mit Hilfe des &amp;quot;Mega8-ISP-Programmer&amp;quot; (Layout siehe ELO-Webseite) vorgesehen.&lt;br /&gt;
&lt;br /&gt;
=== AVRDUDE mit Arduino Bootloader benutzen ===&lt;br /&gt;
&lt;br /&gt;
Mit der Option &#039;&#039;-c stk500v1&#039;&#039; kann AVRDUDE den [[Bootloader]] in Arduino Boards ansprechen [http://www.mikrocontroller.net/topic/195963#1919654].&lt;br /&gt;
&lt;br /&gt;
Es existieren auch modifizierte Versionen von AVRDUDE, die einen Programmer namens &#039;&#039;arduino&#039;&#039; kennen (avrdude.conf untersuchen!). Damit lautet die Kommandozeile für ein Arduinoboard mit Atmega168 beispielsweise [http://www.neuraladvance.com/2010/04/08/using-avrdude-with-the-arduino-duemilanove/]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -c arduino -p m168 -P usb -U flash:w:&amp;lt;filename&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Evtl. muss auch noch die Datenrate mit der Option -b angepasst werden, je nach Board werden verschiedene (19200, 57600, 115200) verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Bootloader-Hacks von [http://www.ladyada.net/library/arduino/bootloader.html Ladyada] arbeiten nochmal etwas anders.&lt;br /&gt;
&lt;br /&gt;
Gelegentlich gibt es unter Windows Probleme mit der allgemeinen AVRDUDE Version und deren Handling der DTR/RTS Leitung ([[RS232]]). Es kann helfen, unmittelbar von dem Absenden der Kommandozeile einen RESET auf dem Arduinoboard durchzuführen.&lt;br /&gt;
Ein kurzes Setzen der DTR Leitung auf HIGH bewirkt ein RESET. So ist es möglich eine .bat Datei zu erstellen mit folgendem Code: (com6 ist ein Virtueller USB Comport) &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mode com6 dtr=on&lt;br /&gt;
avrdude -c arduino -p m168 -P \\.\com6 -U flash:w:&amp;lt;filename&amp;gt;&lt;br /&gt;
if %ERRORLEVEL%==0 goto fertig&lt;br /&gt;
Pause&lt;br /&gt;
:fertig&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man den mode-Befehl nicht verwenden kann, etwa weil man cygwin und ein makefile verwendet, so kann man stattdessen &amp;lt;pre&amp;gt;cmd /c mode com6 dtr=on&amp;lt;/pre&amp;gt; verwenden. In cygwin empfiehlt sich &amp;lt;pre&amp;gt;cmd /c mode com6 dtr=on &amp;gt; /dev/null&amp;lt;/pre&amp;gt;, damit wird die unnütze Ausgabe des Befehls verborgen.&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* http://www.mikrocontroller.net/topic/232367&lt;br /&gt;
* http://www.mikrocontroller.net/topic/238243&lt;br /&gt;
&lt;br /&gt;
=== mysmartUSB V2.11 und ATtiny 13 ===&lt;br /&gt;
&lt;br /&gt;
mysmartUSB V2.11 verlangt -cavr910 als Programmer. Leider ist in avrdude&lt;br /&gt;
5.10 immer noch nicht der ATtiny13 damit zu programmieren. Also in die&lt;br /&gt;
avrdude.conf folgendes mit unter ATtiny13 aufnehmen, so kann er dann&lt;br /&gt;
korrekt programmiert werden(inkl. Fuse Bits).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
# ATtiny13&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
part&lt;br /&gt;
    id                  = &amp;quot;t13&amp;quot;;&lt;br /&gt;
    desc                = &amp;quot;ATtiny13&amp;quot;;&lt;br /&gt;
     has_debugwire = yes;&lt;br /&gt;
     flash_instr   = 0xB4, 0x0E, 0x1E;&lt;br /&gt;
     eeprom_instr  = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D,&lt;br /&gt;
               0xBC, 0x0E, 0xB4, 0x0E, 0xBA, 0x0D, 0xBB, 0xBC,&lt;br /&gt;
               0x99, 0xE1, 0xBB, 0xAC;&lt;br /&gt;
    stk500_devcode      = 0x14;&lt;br /&gt;
    avr910_devcode      = 0x55;&lt;br /&gt;
......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung! Programmieren geht auch mit -cavr911. Allerdings geht das Fuse&lt;br /&gt;
setzen nicht und man bekommt eine Fehlermeldung.(Programm läuft aber)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Reading | ################################################## | 100%&lt;br /&gt;
0.12s&lt;br /&gt;
&lt;br /&gt;
avrdude: verifying ...&lt;br /&gt;
avrdude: 226 bytes of flash verified&lt;br /&gt;
avrdude: reading input file &amp;quot;0x7a&amp;quot;&lt;br /&gt;
avrdude: writing lfuse (1 bytes):&lt;br /&gt;
&lt;br /&gt;
Writing |  ***failed;&lt;br /&gt;
################################################## | 100% 0.00s&lt;br /&gt;
&lt;br /&gt;
avrdude: 1 bytes of lfuse written&lt;br /&gt;
avrdude: verifying lfuse memory against 0x7a:&lt;br /&gt;
avrdude: load data lfuse data from input file 0x7a:&lt;br /&gt;
avrdude: input file 0x7a contains 1 bytes&lt;br /&gt;
avrdude: reading on-chip lfuse data:&lt;br /&gt;
&lt;br /&gt;
Reading | ################################################## | 100%&lt;br /&gt;
0.00s&lt;br /&gt;
&lt;br /&gt;
avrdude: verifying ...&lt;br /&gt;
avrdude: 1 bytes of lfuse verified&lt;br /&gt;
avrdude: reading input file &amp;quot;0xff&amp;quot;&lt;br /&gt;
avrdude: writing hfuse (1 bytes):&lt;br /&gt;
&lt;br /&gt;
Writing |  ***failed;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Anpassungen von avrdude.conf an neuere AVRs ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ATtiny167&#039;&#039;&#039; siehe [http://www.mikrocontroller.net/topic/236355 Forumbeitrag von Volker U.]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* Offizielle AVRDUDE Homepage unter http://www.nongnu.org/avrdude/&lt;br /&gt;
* User Manual (engl.) unter http://www.nongnu.org/avrdude/user-manual/avrdude.html#Top&lt;br /&gt;
* Kompilierte Windows Version mit USB Support http://yuki-lab.jp/hw/avrdude-GUI/avrdude-5.5-win32-bin.zip&lt;br /&gt;
* Kompilierte Windows Version avrdude 5.10 mit USB Support http://www.mikrocontroller.net/topic/163675#1594689&lt;br /&gt;
* Kompilierte Windows Version avrdude 5.11.1 mit USB Support http://www.mikrocontroller.net/topic/163675#2383773&lt;br /&gt;
* Kompilierte Windows Version avrdude 6.0 rc2 http://www.mikrocontroller.net/topic/296379#3166155&lt;br /&gt;
* Wer Interesse an der modifizierten Version von AVRDUDE und des AVR910-Programmer hat, kann sich bei http://www.fischl.de/thomas/elektronik/avr910e/ informieren. Der Programmer bleibt auch mit der Modifikation weiterhin kompatibel zu anderer Programmiersoftware.&lt;br /&gt;
* [[LunaAVR]] GUI für AVRDUDE in der IDE enthalten http://avr.myluna.de mit FUSE-Editor (für Windows und Linux)&lt;br /&gt;
* [[Burn-o-mat|AVR Burn-O-Mat]] GUI (Graphic User Interface) für AVRDUDE http://burn-o-mat.net mit FUSE-Editor (Java, für Windows und Linux)&lt;br /&gt;
* [http://www.soft-land.de/ AVRBurner] Ponyprog-ähnliche Oberfläche für AVRDUDE.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* [http://www.microstar.ir/download/SinaProg.zip SinaProg] SinaProg - avrdude GUI mit AVR Fuse Calculator. &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; LINK IST TOT&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
[[Kategorie:AVR-Programmer und -Bootloader]]&lt;br /&gt;
[[Kategorie:Entwicklungstools]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVRDUDE&amp;diff=77874</id>
		<title>AVRDUDE</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVRDUDE&amp;diff=77874"/>
		<updated>2013-08-05T11:38:13Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* USB Programmer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beschreibung ==&lt;br /&gt;
AVRDUDE (http://www.nongnu.org/avrdude/) ist eine Programmiersoftware für Atmel [[AVR]] Controller. &lt;br /&gt;
&lt;br /&gt;
Funktionen unter Anderem: &lt;br /&gt;
&lt;br /&gt;
* Übertragen von Programmcode in den Flash-Speicher&lt;br /&gt;
* Auslesen ungeschützen Codes aus dem Flash&lt;br /&gt;
* Setzen und Lesen von Fuse- und Lockbits (Siehe auch: [[AVR_Fuses#Vergleich_der_Fuses_bei_verschiedenen_Programmen|Vergleich der Fuses bei verschiedenen Programmen]])&lt;br /&gt;
* Schreiben und Lesen des EEPROMs&lt;br /&gt;
&lt;br /&gt;
AVRDUDE kann das [[STK500]] (auch mit Firmware 2.x als stk500v2), das Atmel AVRISP (auch mit Firmware 2.x als avrispv2 o.ä.), das Atmel AVRISP MKII (USB Ansteuerung mittels lib-usb bzw. lib-usb-W32), [[AVR_In_System_Programmer#USB | AVR910-kompatible]] Programmierer, den [[AVR Butterfly]]/AVR109-kompatible Bootloader, [[STK200]]-Programmierdongles und verschiedene andere Parallelport-Adapter sowie &amp;quot;serielle Statusportprogrammierer&amp;quot; (Siprog) ansteuern. Auch das Atmel JTAGICE (oder Nachbauten wie Bootice oder Evertool), Atmel JTAGICE-MKII und der AVR Dragon können als Programmierhardware genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Das Programm ist unter MS-Windows (Cygwin nicht erforderlich), Linux, BSD, Solaris und Mac OS X lauffähig. Die Version für MS-Windows ist im [[WinAVR]]-Paket enthalten. Der Quellcode ist frei verfügbar (Lizenz beachten).&lt;br /&gt;
&lt;br /&gt;
Da alle AVRDUDE-Funktionen über Kommandozeilenparamter gesteuert werden können, eignet es sich gut zur Integration in Makefiles. Beispiele finden sich in der Makefile-Vorlage von [[WinAVR]] und Mfile. &lt;br /&gt;
&lt;br /&gt;
Die gesamte Konfiguration liegt in einer Textdatei (avrdude.conf), so dass sich bei Bedarf ein beliebiger neuer Parallelport-Programmierdongle oder auch ein noch nicht unterstützter AVR-Controller ergänzen lassen. Die Syntax für die Definition eines AVR-Controllers lehnt sich an die Datenblatt-Tabelle für die serielle Programmierung an, so dass man praktisch nur das Datenblatt &amp;quot;intelligent&amp;quot; abtippen muss.&lt;br /&gt;
&lt;br /&gt;
Für die Ansteuerung von Parallelport-Adaptern unter MS-Windows NT/2000/XP wird ein spezieller Porttreiber (giveio) mitgeliefert. Bei der Installation von [[WinAVR]] wird giveio bereits mitinstalliert. &lt;br /&gt;
&lt;br /&gt;
Programmer mit üblicher serieller Schnittstelle (RS232) benötigen keine zusätzliche Software oder Treiber zum Betrieb mit AVRDUDE. &lt;br /&gt;
&lt;br /&gt;
Für Hardware mit USB-Anschluss muss die lib-usb bzw. lib-usb-win32 installiert sein.&lt;br /&gt;
&lt;br /&gt;
===GUIs===&lt;br /&gt;
Bei [[WinAVR]] wird die grafische Oberfläche avrdude-gui.exe mitgeliefert.&lt;br /&gt;
&lt;br /&gt;
In der IDE von [[LunaAVR]] ist ebenfalls eine GUI für AVRDUDE enthalten (Windows und Linux).&lt;br /&gt;
&lt;br /&gt;
Für Windows, Linux und andere Betriebssysteme gibt es zwei weitere GUIs: den in Java geschriebene [[Burn-o-mat|AVR Burn-O-Mat]] und den [http://www.soft-land.de/index.php?page=avrburner avrburner] (avrburner: Link defekt).&lt;br /&gt;
&lt;br /&gt;
Für Mac OS X gibt es noch [http://www.vonnieda.org/software/avrfuses AVRFuses.app]. AVRFuses muss beim ersten Starten auf den verwendeten Programmer und den Speicherort von AVRDUDE eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
GUIs vereinfachen vor allem Programmieren der Fuses.&lt;br /&gt;
&lt;br /&gt;
== Kurzanleitung für Linux und STK200 ==&lt;br /&gt;
&lt;br /&gt;
Dazu muss erst ein Hardware-Link auf die Printerport-Treiber eingerichtet werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
su&lt;br /&gt;
mknod /dev/parport0 c 99 0&lt;br /&gt;
chmod a+rw /dev/parport0&lt;br /&gt;
avrdude -p m8535 -c stk200 -e -U qqtraff.hex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis :&lt;br /&gt;
Bei USB Programmern ist zu beachten, dass diese durch das Betriebssystem auf einen anderen Port gelegt werden können, als im Beispiel angegeben.&lt;br /&gt;
Diesen Port kann man unter Anderem &amp;quot;im Terminal&amp;quot; mit dem Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
user@server: dmesg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ermitteln.&lt;br /&gt;
Alternativ kann man sich eine Auflistung der Ports, im Verzeichnis &amp;quot;/dev&amp;quot; anzeigen lassen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
user@server: ls /dev/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Sollte man nicht sicher sein, auf welchem Port der Programmer liegt, kann man den Programmer nochmals ausstecken und &amp;quot;ls /dev/&amp;quot; ausführen. Der nun Fehlende Port, ist der Programmerport.&lt;br /&gt;
Diesen Port muss man statt &amp;quot;parport0&amp;quot; in die oben beschriebenen Terminalkommandos einsetzen.&lt;br /&gt;
&lt;br /&gt;
Siehe auch : &lt;br /&gt;
* [http://wiki.ctbot.de/index.php/AVR_ISP_Programmer#BlueMP3_bzw._STK200_kompatible_Flasher weitere Beispiele für avrdude Kommandos (http://wiki.ctbot.de/index.php)]&lt;br /&gt;
* [[AVR_In_System_Programmer#STK200-kompatibel]]&lt;br /&gt;
* http://www.mikrocontroller.net/topic/200390#new&lt;br /&gt;
&lt;br /&gt;
== Tipps + Tricks ==&lt;br /&gt;
&lt;br /&gt;
=== [[AVR_In_System_Programmer#Parallelport|Parallelport-Programmer]] an aktuellen PCs ===&lt;br /&gt;
Aktuelle PCs sind einfach zu schnell mit dem Bitgewackel an der parallelen Schnittstelle, vor allem für AVRs, die noch mit den 1 MHz im Auslieferungszustand laufen (maximal zulässiger ISP-Takt &amp;lt; 250 kHz). Neuere Versionen von avrdude unterstützen zu diesem Zweck eine Option &#039;&#039;&#039;-i &amp;lt;N&amp;gt;&#039;&#039;&#039;, wobei &amp;lt;N&amp;gt; die Anzahl der Mikrosekunden bezeichnet, die beim Bitwackeln zusätzlich zu warten ist. Einfach mal mit -i 10 anfangen und dann entweder die Fuses auf die Ziel-Taktfrequenz umstellen (falls diese wesentlich höher sein wird als die 1 MHz), oder sukkzessive mit kleineren Werten testen ([http://www.mikrocontroller.net/topic/83524#699933 Forenbeitrag von Jörg]).&lt;br /&gt;
&lt;br /&gt;
Die Option -i ist auch nützlich bei AVRs, die für einen langsamen Takt konfiguriert sind. Bei einem ATmega8, der mit einem 32.768 kHz Quarz läuft, kann es z.B. notwendig sein, die Option -i 90 zu verwenden. Den Zahlenwert ggf. ausprobieren.&lt;br /&gt;
&lt;br /&gt;
Manche Programmer werten die Option -i manchmal nicht aus, dann sollte man einen anderen Programmer versuchen.&lt;br /&gt;
&lt;br /&gt;
Beim USBTINY und USBASP kann man die Geschwindigkeit der SPI-Schnittstelle mit dem Parameter -B [Periodendauer in Mikrosekunden] begrenzen. Da beide Geräte durch Interrupts der Software-USB-Schnittstelle stark belastet werden, handelt es sich hier um die Maximalbitrate.&lt;br /&gt;
&lt;br /&gt;
Unter WinXPsp2 auf einem Thinkpad T40 lies sich die &amp;quot;avrdude: AVR device not responding&amp;quot;-Meldung beheben durch Ändern von Gerätemanager--&amp;gt;Ltp1--&amp;gt;Eigenschaften--&amp;gt;Anschlusseinstellungen--&amp;gt;Interrupt-nie-verwenden in &amp;quot;Jeden dem Anschluss zugewiesenem Interrupt verwenden&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Unter 64-Bit-Windows-Versionen kann das Parallelport nicht benutzt werden, da der GiveIO-Treiber systembedingt nicht funktioniert. Genauer, es wird ohne [http://www.codeproject.com/Articles/28318/Bypassing-PatchGuard-3 böse Hacks] nicht möglich sein, eine 64-Bit-Version von GiveIO zu erstellen, da es hier eine [http://msdn.microsoft.com/en-us/library/windows/hardware/gg487350.aspx Kernel-Mode-Codeänderungs-Überwachung] gibt, die Änderungen an Systemtabellen (hier: Die IOPM, die In/Out Permission Map, falls es diese überhaupt gibt, und wenn ja, dann nur als Emulation für das 32-Bit-Subsystem) vereitelt (d.h. ein paar Minuten nach der Änderung kommt ein Bluescreen). Solange AVRDUDE an GiveIO (und eincompilierten E/A-Befehlen) festhält bleibt es so, und der Ausweich für den Bastler ist [[Pony-Prog_Tutorial|PonyProg]], bis AVRDUDE künftig ebenfalls InpOut32.dll bzw. InpOutX64.dll verwendet.&lt;br /&gt;
&lt;br /&gt;
=== USB-Programmer ===&lt;br /&gt;
Die meisten USB-Programmiergeräte benötigen [http://sourceforge.net/apps/trac/libusb-win32/wiki libusb-win32] bzw. [http://www.libusb.org/ libusb].&lt;br /&gt;
&lt;br /&gt;
Ein Selbstbau-USB-Programmieradapter ist unter&lt;br /&gt;
[http://www.rototron.info/?Page=USBAVR/USBAVR.aspx http://www.rototron.info]&lt;br /&gt;
zu finden. Er benötigt eine relativ neue AVRDUDE-Version, aber benötigt unter &#039;&#039;keinem&#039;&#039; Windows-Betriebssystem einen Treiber, da er ein [http://de.wikipedia.org/wiki/Human_Interface_Device HID]-Gerät implementiert. &amp;lt;tt&amp;gt;libusb-win32&amp;lt;/tt&amp;gt; wird nicht benötigt. Normale (= reduzierte) Benutzerrechte genügen zum Betrieb des Gerätes.&lt;br /&gt;
&lt;br /&gt;
==== libusb0.dll wird bei WinAvr 20070525 nicht gefunden====&lt;br /&gt;
[http://www.mikrocontroller.net/topic/83524#701461 Forenbeitrag von Paul]: Habe leider noch etwas zu bemängeln, und zwar meckerte avrdude, dass es die &amp;quot;libusb0.dll&amp;quot; nicht fand. Musste dann erst noch manuell den Pfad c:\winavr\utils\libusb\bin in die autoxecec.bat eintragen. Siehe auch [http://www.avrfreaks.net/index.php?name=PNphpBB2&amp;amp;file=viewtopic&amp;amp;p=373283 Diskussion bei www.avrfreaks.net]&lt;br /&gt;
&lt;br /&gt;
====Aufruf unter Linux als user (non-root)====&lt;br /&gt;
&lt;br /&gt;
Unter Linux kann häufig avrdude nur als user &#039;root&#039; auf den USB-Programmer zugreifen. Als normaler User bekommt man eine Fehlermeldung wie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#avrdude -c usbtiny -p m8&lt;br /&gt;
 &lt;br /&gt;
avrdude: error: usbtiny_transmit: &lt;br /&gt;
error sending control message: &lt;br /&gt;
Operation not permitted&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies liegt daran, dass die device-nodes, die beim Einstecken des USB-Programmers von udev angelegt werden, root zugeordnet sind. Man kann dies ändern, indem man udev-Regeln für die verwendeten Programmer anlegt. Unter Debian muß man dazu nur eine neue Datei, z.&amp;amp;nbsp;B. 015_usbprog.rules unter /etc/udev/rules.d anlegen, z.&amp;amp;nbsp;B. mit folgenden Inhalt:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Atmel AVR ISP mkII&lt;br /&gt;
SUBSYSTEM==&amp;quot;usb&amp;quot;, ATTRS{idVendor}==&amp;quot;03eb&amp;quot;, ATTRS{idProduct}==&amp;quot;2104&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# usbprog bootloader&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;1781&amp;quot;, ATTRS{idProduct}==&amp;quot;0c62&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
# USBasp programmer&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;16c0&amp;quot;, ATTRS{idProduct}==&amp;quot;05dc&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
# USBtiny programmer&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;1781&amp;quot;, ATTRS{idProduct}==&amp;quot;0c9f&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
habe den alten Inhalt nur auskommentiert, weil ich das ganze nur mit dem mkII testen konnte. ...Nur falls sich jemand beschweren sollte.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Atmel AVR ISP mkII&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;03eb&amp;quot;, ATTRS{idProduct}==&amp;quot;2104&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot; &lt;br /&gt;
 &lt;br /&gt;
# usbprog bootloader&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;1781&amp;quot;, ATTRS{idProduct}==&amp;quot;0c62&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
# USBasp programmer&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;16c0&amp;quot;, ATTRS{idProduct}==&amp;quot;05dc&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
# USBtiny programmer&lt;br /&gt;
ATTRS{idVendor}==&amp;quot;1781&amp;quot;, ATTRS{idProduct}==&amp;quot;0c9f&amp;quot;, GROUP=&amp;quot;users&amp;quot;, MODE=&amp;quot;0660&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach muss in der Regel der udev-Dienst neu gestartet werden, was -- je nach System -- mit einem der beiden folgenden Befehle funktionieren sollte (natürlich nur als root):&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 /etc/init.d/udev restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 service udev restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo /sbin/udevadm control --reload-rules&amp;lt;/pre&amp;gt; bei aktueller udev-version, oder&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo /sbin/udevcontrol --reload_rules&amp;lt;/pre&amp;gt;, bei älteren udev-versionen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Danach sollte der USB-Programmer erneut angeschlossen werden. Falls es immer noch nicht funktioniert kann es helfen, als GROUP &amp;quot;plugdev&amp;quot; statt &amp;quot;users&amp;quot; zu verwenden.&lt;br /&gt;
&lt;br /&gt;
Hiermit werden der AVR ISP mkII, der usbprog Bootloader, USBasp und USBtiny bekannt gemacht, so daß alle User in der Gruppe &amp;quot;users&amp;quot; darauf zugreifen können.&lt;br /&gt;
&lt;br /&gt;
Für weitere USB-Programmer muß man die entsprechende Zeile (mit ATTRS...) anlegen und die passenden Vendor und Product IDs eintragen.&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* [http://www.reactivated.net/writing_udev_rules.html Writing udev rules]&lt;br /&gt;
&lt;br /&gt;
====Linux-Treiberprobleme====&lt;br /&gt;
&lt;br /&gt;
Wenn der Programmer (usbprog mit AVRisp mkII) unter Ubuntu trotz korrekter Konfiguration nicht gefunden wird, kann es daran liegen, dass das Paket &amp;quot;libmtp-runtime&amp;quot; installiert ist. siehe [https://www.mikrocontroller.net/topic/245816 hier]&lt;br /&gt;
&lt;br /&gt;
=== Anzeige unterstützter AVRs ===&lt;br /&gt;
Wie die anderen Atmels bei avrdude heißen zeigt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -?&lt;br /&gt;
avrdude -p ?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== neuere AVRs hinzufügen ===&lt;br /&gt;
Manch neueres Silizium wird nicht erkannt da sich z.T. die IDs geändert haben. Um diese erfolgreich zu Programmieren empfiehlt sich ein eigenes config-File zu verwenden. Darin werden die &#039;fehlenden&#039; CPUs ergänzt:&lt;br /&gt;
&lt;br /&gt;
z.B. ATmega168P (Programmierung wie ATmega168): einfach den ATmega168 Teil duplizieren und die entsprechenden Änderungen (id, desc, signature) vornehmen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
# ATmega168P&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
part&lt;br /&gt;
    id              = &amp;quot;m168p&amp;quot;;&lt;br /&gt;
    desc            = &amp;quot;ATMEGA168P&amp;quot;;&lt;br /&gt;
     has_debugwire = yes;&lt;br /&gt;
     flash_instr   = 0xB6, 0x01, 0x11;&lt;br /&gt;
     eeprom_instr  = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00,&lt;br /&gt;
	             0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF,&lt;br /&gt;
	             0x99, 0xF9, 0xBB, 0xAF;&lt;br /&gt;
    stk500_devcode  = 0x86;&lt;br /&gt;
    # avr910_devcode = 0x;&lt;br /&gt;
    signature       = 0x1e 0x94 0x0b;&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
danach kann, unter Angabe des neuen config-Files, auch ein ATmega168P programmiert werden, z.B.:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -pm168p -C ~/.avrdude.config.neu -cstk500v2 -v  -U flash:w:main.hex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Anschluss an COM10 und höher (Windows) ===&lt;br /&gt;
&lt;br /&gt;
Wenn AVRDUDE unter Windows an COM10 und höher betrieben werden soll, ist eine andere Schreibweise für die Schnittstelle in der Kommandozeile nötig. Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -c stk500v2 -p m16 -P \\.\com13 -uF -vvvv 2&amp;gt; logfile.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird statt der gewohnten Schreibweise &#039;&#039;&#039;com13&#039;&#039;&#039; die spezielle Schreibweise  &#039;&#039;&#039;\\.\com13&#039;&#039;&#039; verwendet und es wird mit &#039;&#039;-vvvv 2&amp;gt; logfile.txt&#039;&#039; eine ausführliche Debugausgabe für Fragen im Forum erzeugt. Näheres hierzu in der  [http://www.mikrocontroller.net/topic/90401 Forumsdiskussion].&lt;br /&gt;
&lt;br /&gt;
=== AVRISPmkII + AVRDUDE + Window Vista (32) ===&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/topic/126594#1157327&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;avrdude was compiled without usb support&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Offenbar enthielt WinAVR-20100110 zunächst fälschlicherweise eine AVRDUDE Version ohne USB Support [http://www.mikrocontroller.net/topic/163022#1554907].&lt;br /&gt;
&lt;br /&gt;
Abhilfe:&lt;br /&gt;
 &lt;br /&gt;
1. WinAVR deinstallieren, gleiches Release (WinAVR-20100110) nocheinmal herunterladen und installieren (mindestens seit Anfang März 2010 enthält dieses Release avrdude in der Version 5.10 und bringt USB-Support mit).&lt;br /&gt;
&lt;br /&gt;
2. AVRDUDE selbst compilieren: http://www.mikrocontroller.net/topic/163675&lt;br /&gt;
&lt;br /&gt;
3. Compilierte Version 5.10 downloaden: http://www.mikrocontroller.net/topic/163675#1594689&lt;br /&gt;
&lt;br /&gt;
=== Textausgabe in Datei umleiten? ===&lt;br /&gt;
&lt;br /&gt;
Die Windows-&amp;quot;Shell&amp;quot; &#039;&#039;cmd&#039;&#039; benutzt für die Ausgabeumleitung die gleiche Syntax wie die Bourne-Shell (und damit auch&lt;br /&gt;
Bash): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
programm &amp;gt;datei 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zur Umleitung von STDOUT und STDERR in die gleiche Datei (Yalu in [http://www.mikrocontroller.net/topic/124509#1135568]).&lt;br /&gt;
&lt;br /&gt;
Beispiel für Windows ([http://www.mikrocontroller.net/topic/124509#1136322], [http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/redirection.mspx?mfr=true M$]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -c avrispmkII -p m8 -P usb:xx -v &amp;gt; &amp;quot;C:\output.txt&amp;quot; 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder nur STDERR in Datei umleiten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -c avrispmkII -p m8 -P usb:xx -v 2&amp;gt; &amp;quot;C:\output.txt&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [http://www.franzis.de/elektronik/lernpakete-elektronik/lernpaket-mikrocontroller Franzis] bzw. [http://www.elo-web.de/elo/mikrocontroller-und-programmierung/avr-grundlagen/experimente-mit-dem-attiny13 ELO] Lernpaket Mikrocontroller (Attiny13) ===&lt;br /&gt;
&lt;br /&gt;
Markus hat in [http://www.mikrocontroller.net/topic/169549#1649459] einen Weg beschrieben, wie man den einfachen Programmieradapter des Lernpakets mit AVRDUDE ansteuern kann.&lt;br /&gt;
&lt;br /&gt;
Eine weitere Anleitung [http://www.elektronik-labor.de/AVR/AVRdude.html LP Mikrocontroller und Attiny45 mit Avrdude] gibt es von Ralf Beesner auf der Webseite des Entwicklers Burkhard Kainka. In &#039;&#039;avrdude.conf&#039;&#039; wird dabei ein neuer Programmieradapter namens &#039;&#039;burkhard&#039;&#039; hinzugefügt. Ein zweiter Eintrag &#039;&#039;burkhard2&#039;&#039; in dieser &#039;&#039;&#039;avrdude.conf&#039;&#039;&#039; ist für die Programmierung des Atmega8 auf dem Franzis Retro-Pong Bausatz mit Hilfe des &amp;quot;Mega8-ISP-Programmer&amp;quot; (Layout siehe ELO-Webseite) vorgesehen.&lt;br /&gt;
&lt;br /&gt;
=== AVRDUDE mit Arduino Bootloader benutzen ===&lt;br /&gt;
&lt;br /&gt;
Mit der Option &#039;&#039;-c stk500v1&#039;&#039; kann AVRDUDE den [[Bootloader]] in Arduino Boards ansprechen [http://www.mikrocontroller.net/topic/195963#1919654].&lt;br /&gt;
&lt;br /&gt;
Es existieren auch modifizierte Versionen von AVRDUDE, die einen Programmer namens &#039;&#039;arduino&#039;&#039; kennen (avrdude.conf untersuchen!). Damit lautet die Kommandozeile für ein Arduinoboard mit Atmega168 beispielsweise [http://www.neuraladvance.com/2010/04/08/using-avrdude-with-the-arduino-duemilanove/]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude -c arduino -p m168 -P usb -U flash:w:&amp;lt;filename&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Evtl. muss auch noch die Datenrate mit der Option -b angepasst werden, je nach Board werden verschiedene (19200, 57600, 115200) verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Bootloader-Hacks von [http://www.ladyada.net/library/arduino/bootloader.html Ladyada] arbeiten nochmal etwas anders.&lt;br /&gt;
&lt;br /&gt;
Gelegentlich gibt es unter Windows Probleme mit der allgemeinen AVRDUDE Version und deren Handling der DTR/RTS Leitung ([[RS232]]). Es kann helfen, unmittelbar von dem Absenden der Kommandozeile einen RESET auf dem Arduinoboard durchzuführen.&lt;br /&gt;
Ein kurzes Setzen der DTR Leitung auf HIGH bewirkt ein RESET. So ist es möglich eine .bat Datei zu erstellen mit folgendem Code: (com6 ist ein Virtueller USB Comport) &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mode com6 dtr=on&lt;br /&gt;
avrdude -c arduino -p m168 -P \\.\com6 -U flash:w:&amp;lt;filename&amp;gt;&lt;br /&gt;
if %ERRORLEVEL%==0 goto fertig&lt;br /&gt;
Pause&lt;br /&gt;
:fertig&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man den mode-Befehl nicht verwenden kann, etwa weil man cygwin und ein makefile verwendet, so kann man stattdessen &amp;lt;pre&amp;gt;cmd /c mode com6 dtr=on&amp;lt;/pre&amp;gt; verwenden. In cygwin empfiehlt sich &amp;lt;pre&amp;gt;cmd /c mode com6 dtr=on &amp;gt; /dev/null&amp;lt;/pre&amp;gt;, damit wird die unnütze Ausgabe des Befehls verborgen.&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* http://www.mikrocontroller.net/topic/232367&lt;br /&gt;
* http://www.mikrocontroller.net/topic/238243&lt;br /&gt;
&lt;br /&gt;
=== mysmartUSB V2.11 und ATtiny 13 ===&lt;br /&gt;
&lt;br /&gt;
mysmartUSB V2.11 verlangt -cavr910 als Programmer. Leider ist in avrdude&lt;br /&gt;
5.10 immer noch nicht der ATtiny13 damit zu programmieren. Also in die&lt;br /&gt;
avrdude.conf folgendes mit unter ATtiny13 aufnehmen, so kann er dann&lt;br /&gt;
korrekt programmiert werden(inkl. Fuse Bits).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
# ATtiny13&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
part&lt;br /&gt;
    id                  = &amp;quot;t13&amp;quot;;&lt;br /&gt;
    desc                = &amp;quot;ATtiny13&amp;quot;;&lt;br /&gt;
     has_debugwire = yes;&lt;br /&gt;
     flash_instr   = 0xB4, 0x0E, 0x1E;&lt;br /&gt;
     eeprom_instr  = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D,&lt;br /&gt;
               0xBC, 0x0E, 0xB4, 0x0E, 0xBA, 0x0D, 0xBB, 0xBC,&lt;br /&gt;
               0x99, 0xE1, 0xBB, 0xAC;&lt;br /&gt;
    stk500_devcode      = 0x14;&lt;br /&gt;
    avr910_devcode      = 0x55;&lt;br /&gt;
......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung! Programmieren geht auch mit -cavr911. Allerdings geht das Fuse&lt;br /&gt;
setzen nicht und man bekommt eine Fehlermeldung.(Programm läuft aber)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Reading | ################################################## | 100%&lt;br /&gt;
0.12s&lt;br /&gt;
&lt;br /&gt;
avrdude: verifying ...&lt;br /&gt;
avrdude: 226 bytes of flash verified&lt;br /&gt;
avrdude: reading input file &amp;quot;0x7a&amp;quot;&lt;br /&gt;
avrdude: writing lfuse (1 bytes):&lt;br /&gt;
&lt;br /&gt;
Writing |  ***failed;&lt;br /&gt;
################################################## | 100% 0.00s&lt;br /&gt;
&lt;br /&gt;
avrdude: 1 bytes of lfuse written&lt;br /&gt;
avrdude: verifying lfuse memory against 0x7a:&lt;br /&gt;
avrdude: load data lfuse data from input file 0x7a:&lt;br /&gt;
avrdude: input file 0x7a contains 1 bytes&lt;br /&gt;
avrdude: reading on-chip lfuse data:&lt;br /&gt;
&lt;br /&gt;
Reading | ################################################## | 100%&lt;br /&gt;
0.00s&lt;br /&gt;
&lt;br /&gt;
avrdude: verifying ...&lt;br /&gt;
avrdude: 1 bytes of lfuse verified&lt;br /&gt;
avrdude: reading input file &amp;quot;0xff&amp;quot;&lt;br /&gt;
avrdude: writing hfuse (1 bytes):&lt;br /&gt;
&lt;br /&gt;
Writing |  ***failed;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Anpassungen von avrdude.conf an neuere AVRs ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ATtiny167&#039;&#039;&#039; siehe [http://www.mikrocontroller.net/topic/236355 Forumbeitrag von Volker U.]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* Offizielle AVRDUDE Homepage unter http://www.nongnu.org/avrdude/&lt;br /&gt;
* User Manual (engl.) unter http://www.nongnu.org/avrdude/user-manual/avrdude.html#Top&lt;br /&gt;
* Kompilierte Windows Version mit USB Support http://yuki-lab.jp/hw/avrdude-GUI/avrdude-5.5-win32-bin.zip&lt;br /&gt;
* Kompilierte Windows Version avrdude 5.10 mit USB Support http://www.mikrocontroller.net/topic/163675#1594689&lt;br /&gt;
* Kompilierte Windows Version avrdude 5.11.1 mit USB Support http://www.mikrocontroller.net/topic/163675#2383773&lt;br /&gt;
* Kompilierte Windows Version avrdude 6.0 rc2 http://www.mikrocontroller.net/topic/296379#3166155&lt;br /&gt;
* Wer Interesse an der modifizierten Version von AVRDUDE und des AVR910-Programmer hat, kann sich bei http://www.fischl.de/thomas/elektronik/avr910e/ informieren. Der Programmer bleibt auch mit der Modifikation weiterhin kompatibel zu anderer Programmiersoftware.&lt;br /&gt;
* [[LunaAVR]] GUI für AVRDUDE in der IDE enthalten http://avr.myluna.de mit FUSE-Editor (für Windows und Linux)&lt;br /&gt;
* [[Burn-o-mat|AVR Burn-O-Mat]] GUI (Graphic User Interface) für AVRDUDE http://burn-o-mat.net mit FUSE-Editor (Java, für Windows und Linux)&lt;br /&gt;
* [http://www.soft-land.de/ AVRBurner] Ponyprog-ähnliche Oberfläche für AVRDUDE.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* [http://www.microstar.ir/download/SinaProg.zip SinaProg] SinaProg - avrdude GUI mit AVR Fuse Calculator. &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; LINK IST TOT&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
[[Kategorie:AVR-Programmer und -Bootloader]]&lt;br /&gt;
[[Kategorie:Entwicklungstools]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RFM12&amp;diff=65438</id>
		<title>RFM12</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RFM12&amp;diff=65438"/>
		<updated>2012-04-02T08:51:17Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* SPI Interface */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beschreibung der Funkmodule RFM01, RFM02 und RFM12.&lt;br /&gt;
&lt;br /&gt;
Benötigt werden in der Minimal-Version im FIFO-Modus nur die Anschlüsse nSEL, SDO, SDI und SCK, eben das komplette SPI-Interface. Der Zugriff auf das Sende- und Empfangs-FIFO ist per Software möglich, ebenso die Abfrage der Statusbits. Deshalb werden z.&amp;amp;nbsp;B. nIRQ und nFFS nicht unbedingt benötigt. nIRQ signalisiert unter anderem, dass das Modul bereit ist Daten zu empfangen. Wenn Daten empfangen wurden, kann dies über den FFIT-Pin abgefragt werden (falls die Füllschwelle eingestellt wurde). nFFS dient dazu das FIFO direkt anzusprechen (es ist quasi der Chipselect für das FIFO), davon wird in der Minimalversion aber kein Gebrauch gemacht. Der Pin muss daher auf high-Pegel gelegt werden!&lt;br /&gt;
An CLK kann eine Frequenz von 1MHz bis 10MHz eingestellt werden. Hiermit kann dann z.&amp;amp;nbsp;B. der Mikrocontroller versorgt werden.&lt;br /&gt;
Reset ist ein Open-Collector-Ausgang und gleichzeitig der Reset-Eingang. Er sollte daher entweder gar nicht, oder aber hochohmig angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Im FIFO-Mode kann das Modul konfiguriert werden mit dem Empfang zu warten, bis die Daten 0x2DD4 empfangen wurden. Sobald dieses Bitmuster empfangen wurde, werden Daten in das FIFO geschrieben, bis man das FIFO abschaltet und die Mustererkennung neu startet.&lt;br /&gt;
&lt;br /&gt;
Als weitere Modi stehen unter anderem ein synchroner Modus zur Verfügung (no FIFO mode), in dem der Sender/Empfänger den Bittakt ausgibt, und synchron dazu die zu sendenden Daten einliest bzw. die empfangenen Daten ausgibt. Der SPI Bus ist trotzdem zur Initialisierung des Moduls notwendig.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
&lt;br /&gt;
=== Soll ich 433 oder 868 MHz nehmen? ===&lt;br /&gt;
&lt;br /&gt;
Wähle das für deine Anwendung kleinere der beiden Übel: Bei 433 MHz sind i.d.R. mehr Störer unterwegs und bei 868 MHz sind die maximale Belegungsdauer bzw. das listen-before-talk (LBT) Verfahren gemäß [[Allgemeinzuteilung]] zu beachten. Siehe auch im Forum [http://www.mikrocontroller.net/topic/198559] und [http://www.mikrocontroller.net/topic/196693].&lt;br /&gt;
&lt;br /&gt;
=== SPI-Interface ===&lt;br /&gt;
* Maximale SCK-Frequenz: 20 MHz&lt;br /&gt;
* Maximale SCK-Frequenz zum Auslesen der Empfänger-FIFO (Kommando 0xB000 oder via &amp;lt;span style=text-decoration:overline&amp;gt;nFFS&amp;lt;/span&amp;gt;): 2,5 MHz = 10 MHz {Quarz} / 4&lt;br /&gt;
&lt;br /&gt;
=== CLK-Ausgang bleibt bei 1 MHz ===&lt;br /&gt;
&lt;br /&gt;
* Vor dem Umschalten (mit 0xC0E0) länger warten.&lt;br /&gt;
&lt;br /&gt;
=== RFM12 empfängt ein paar Bytes, dann nur Müll ===&lt;br /&gt;
&lt;br /&gt;
* Es wird zu langsam gesendet (TX FIFO underrun)&lt;br /&gt;
* Es wird zu langsam empfangen (RX FIFO overrun)&lt;br /&gt;
&lt;br /&gt;
Die Status-Bits helfen hier beim Debuggen. SPI sollte auf maximaler Transferrate stehen.&lt;br /&gt;
&lt;br /&gt;
=== RFM empfängt nur Müll ===&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/topic/73560#605528&lt;br /&gt;
&lt;br /&gt;
Deine Module verhalten sich normal. Man muß mit den Gain- und AFC-Bits&lt;br /&gt;
eine ganze Weile spielen, bis die Module korrekt laufen (kommt auf die&lt;br /&gt;
Anwendung an). Fakt ist: der Empfänger empfängt ständig Datenmüll als&lt;br /&gt;
Rauschen. Wenn der FIFO durch die Präambel getriggert wird, sind die&lt;br /&gt;
Daten im FIFO ziemlich korrekt, wenn alles &amp;quot;gut&amp;quot; eingestellt ist. Der&lt;br /&gt;
FIFO sollte per Interrupt dann auch sofort abgeholt werden, da sonst das&lt;br /&gt;
nächste Byte das alte direkt überschreibt. Jeder zusammenhängende&lt;br /&gt;
Datensatz (mehrere Bytes an einem Stück) muß von einer Präambel&lt;br /&gt;
eingeleitet werden. Nach dem kompletten Einlesen eines Datensatzes muß&lt;br /&gt;
der FIFO abgeschaltet, wieder eingeschaltet und für den Empfang der&lt;br /&gt;
nächsten Präambel neu scharf gemacht werden. (FifoFill bit)&lt;br /&gt;
&lt;br /&gt;
=== RFM hängt sich auf ===&lt;br /&gt;
&lt;br /&gt;
Wenn man die AFC nicht begrenzt, also keinen Wertebereich vorgibt, die eine maximale Abweichung korrigiert wird passiert es nach einer Weile, dass sich der Empfänger aufhängt, die Offsetbits im Status werden maximal und dann geht gar nichts mehr, er hängt fest.&lt;br /&gt;
&lt;br /&gt;
edit: Leider bringt die Beschränkung der AFC auf Minimum bei mir keine Verbesserung. Zumindest ist obige Aussage nicht allgemein gültig.&lt;br /&gt;
&lt;br /&gt;
Siehe auch &lt;br /&gt;
* Forenbeitrag [http://www.mikrocontroller.net/topic/82456#689660 RFM12: Erfahrungen ]&lt;br /&gt;
&lt;br /&gt;
=== Kommunikation mit RFM funktioniert nur sporadisch ===&lt;br /&gt;
&lt;br /&gt;
* Ist die Versorgungsspannung stabil? (evtl. Kondensator einbauen)&lt;br /&gt;
&lt;br /&gt;
=== Interrupt nIRQ klappt nicht bei 868MHz ===&lt;br /&gt;
&lt;br /&gt;
Wenn bei der Verwendung der 868er Module die üblichen Sourcen (dasLabor, etc) verwendet werden, müssen einige Änderungen gemacht werden, die sich leicht finden lassen. Ohne weiteres funktionierte der blockierende Empfang, der Interruptbetriebene (nIRQ) machte in mindestens einem Fall Probleme. Hier half die Anpassung des FIFO IT Level . In vorhandenen Sourcen ist 0xCA83 zu finden, eine Änderung auf 0xCAF3 hilft dabei.&lt;br /&gt;
&lt;br /&gt;
Bei Interruptbetrieb ist darauf zu achten, dass wirklich auf jeden Interrupt&lt;br /&gt;
reagiert wird.  Solange ein Interrupt nicht behandelt wird bleibt nIRQ auf LOW!&lt;br /&gt;
Durch das Lesen des Statusregisters können alle Interrupts ausser FFIT und RGIT&lt;br /&gt;
&amp;quot;gelöscht&amp;quot; werden.  Für FFIT ist das FIFO zu lesen und für RGIT das TxRegister zu beschreiben.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Register ==&lt;br /&gt;
&lt;br /&gt;
Von https://www.mikrocontroller.net/attachment/24947/RFM12.txt&lt;br /&gt;
&lt;br /&gt;
Dieses Dokument beschreibt die Nutzung des RFM12 TRX Moduls!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; WICHTIG &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dieses Dokument wurde aus mehreren Quellen zusammengestellt, und kann Fehler enthalten!&lt;br /&gt;
Es können Abweichungen in Bezug auf RF01 / RF02 / RF12 / RFM01 / RFM02 und andere Module auftreten!&lt;br /&gt;
Es wurde das Datenblatt vom RFM12B und RF12 von www.hoperf.com als Basis genuzt. Zusätzlich wurden diese Informationen mit Hilfe von Forums-Nutzern (https://www.mikrocontroller.net/topic/71682) weiter vervollständigt!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; WICHTIG &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Die LNA-Eingangsimpedanz beträgt 250Ω, und muss beim Anschluss einer 50-Ohm-Antenne entsprechend angepasst werden, um das Rauschen zu minimieren! &#039;&#039; -- (Auf den Pollin-Modulen bereits vorhanden)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;WICHTIG&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Wichtige Informationen zum Verständnis, etwa Logikpläne und Vorgabewerte,&lt;br /&gt;
wurden hier schlichtweg vergessen, daher am besten hier &#039;&#039;nicht&#039;&#039; weiterlesen und dringend das Datenblatt beschaffen. Von den Übersetzungsfehlern ganz zu schweigen …&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Configuration Setting ===&lt;br /&gt;
 Hex = 80 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: &lt;br /&gt;
{| cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Byte ||width=&amp;quot;40%&amp;quot;| 1 || 2&lt;br /&gt;
|-&lt;br /&gt;
!Bits&lt;br /&gt;
|{{8Bit|width=100%| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 }}||{{8Bit|width=100%| el | ef | b1 | b0 | x3 | x2 | x1 | x0}}|}&lt;br /&gt;
 el (TX FIFO) = Sendepuffer für Datentransfer nutzen (1 = An / 0 = Aus)&lt;br /&gt;
 ef (RX FIFO) = Empfangspuffer für Datenspeicherung nutzen (1 = An / 0 = Aus)&lt;br /&gt;
 b... = Zu nutzende Basisfrequenz (00=315MHz / 01=433MHz / 10=868MHz / 11=915MHz)&lt;br /&gt;
 x... = Interner Clock des Chips kann durch verschieben einer Kondensator-Anpass-Stufe bestimmt werden.&lt;br /&gt;
        0,5pF pro Schritt. Basis ist 8,5pF -&amp;gt; (0000=8,5 / 0001=9,0 / 0010=9,5 / ...)&lt;br /&gt;
&lt;br /&gt;
=== Power-Management ===&lt;br /&gt;
 Hex = 82 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax:&lt;br /&gt;
{| cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Byte ||width=&amp;quot;40%&amp;quot;| 1 || 2&lt;br /&gt;
|-&lt;br /&gt;
!Bits&lt;br /&gt;
|{{8Bit|width=100%| 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 }}||{{8Bit|width=100%| er | ebb | et | es | ex | eb | ew | dc}}|}&lt;br /&gt;
 er = Gesamten Empfänger einschalten (1 = an / 0 = Aus).  &lt;br /&gt;
 ebb = Baseband Block einschalten (1 = an / 0 = aus)&lt;br /&gt;
 et = Sender einschalten (1 = an / 0 = Aus) (Wenn das TX-Register aktiv und mit Daten gefüllt ist/wurde,&lt;br /&gt;
      werden diese Daten sofort gesendet) (1 = an / 0 = aus)&lt;br /&gt;
 es = Schaltet den Synthesizer ein. (1 = an / 0 = aus)&lt;br /&gt;
 ex = Schaltet den Quarz-Oszilator ein. (1 = an / 0 = aus)&lt;br /&gt;
 eb = Vergleichbar mit BrownOutDetection -&amp;gt; Erkennt eine zu geringe Betriebsspannung und erzeugt einen Interrupt,&lt;br /&gt;
      um einen drohenden Spannungsaufall anzukündigen (1 = An / 0 = Aus)&lt;br /&gt;
 ew = Aktiviert den WakeUp Timer des Prozessors. (1 = an / 0 = aus)&lt;br /&gt;
 dc = Deaktiviert die Ausgabe des System Clocks auf dem CLK Pin am Chip (1 = Keine ClockAusgabe / 0 = Clock ausgeben)&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;er&amp;gt; bzw &amp;lt;et&amp;gt; schalten alle benötigten Module (Quarz-Oszillator, Sythesizer, Base Band Block,&lt;br /&gt;
 Power Amplifier ein auch wenn &amp;lt;ebb&amp;gt;, &amp;lt;es&amp;gt; oder &amp;lt;ex&amp;gt; nicht gesetzt sind.&lt;br /&gt;
 Durch separates Einschalten von &amp;lt;ebb&amp;gt;, &amp;lt;ex&amp;gt; oder &amp;lt;es&amp;gt; kann aber die Startzeit für den Empfänger bzw.&lt;br /&gt;
 den Sender verkürzt werden.&lt;br /&gt;
 Wird der WakeUp Timer verwendet ist &amp;lt;ew&amp;gt; nach jedem Cyclus zu löschen und wieder zu setzen.&lt;br /&gt;
&lt;br /&gt;
=== PLL Setting ===&lt;br /&gt;
 Hex = 198 + y&lt;br /&gt;
 Bit-Syntax: 110011000 | ob1 | ob0 | lpx | ddy | ddit | bw1 | bw0&lt;br /&gt;
 ob... = ... (00= 5 oder 10MHz [standard] / 01=3.3MHz / 1x=2.5MHz oder weniger)&lt;br /&gt;
 lpx = Wählt den Low-Power-Mode für den Quarz-Oszilator aus. (0=1ms [620µA] / 1=2ms [460µA])&lt;br /&gt;
 ddy = ...&lt;br /&gt;
 ddi = Schaltet das Dithering in PLL-Schleife ab. (1=abgeschaltet / 0=eingeschaltet)&lt;br /&gt;
 bw... = Wählt die Bandbreite des PLL-Signals aus. (00=86.2kbps [-107dBc/Hz] / 01=256kbps [-102dBc/Hz]) Bei 1MHz Offset Phasenrauschen.&lt;br /&gt;
&lt;br /&gt;
=== LowBatt / µC Clock Control ===&lt;br /&gt;
 Hex = c0 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 11000000 | d2 | d1 | d0 | v4 | v3 | v2 | v1 | v0&lt;br /&gt;
 d... = Bestimmt den Teilungsfaktor für die Clockausgabe am CLK-Pin in Abhängigkeit des Internen SystemTakts.&lt;br /&gt;
        (000=1 / 001=1.25 / 010=1.66 / 011=2 / 100=2.5 / 101=3.33 / 110=5 / 111=10)&lt;br /&gt;
 v... = Bestimmt die Betriebsspannung, bei der der RFM12 einen Low Battery Interrupt auslöst. (BrownOutDetection).&lt;br /&gt;
Im Power-Managment muss das eb-Bit aktiv sein, damit dies funktioniert.&lt;br /&gt;
&lt;br /&gt;
=== Frequency-setting ===&lt;br /&gt;
Bestimmt den Offset der Sende- und Empfangsfrequenz. Dieser Offset wird auf das Basisband im Configuration Setting hinzu gerechnet.&lt;br /&gt;
 Hex = a &amp;amp; xxx&lt;br /&gt;
 Bit-Syntax:&lt;br /&gt;
{| cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Byte ||width=&amp;quot;40%&amp;quot;| 1 || 2&lt;br /&gt;
|-&lt;br /&gt;
!Bits&lt;br /&gt;
|{{8Bit|width=100%| 1 | 0 | 1 | 0 | f11 | f10 | f9 | f8 }}||{{8Bit|width=100%| f7 | f6 | f5 | f4 | f3 | f2 | f1 | f0}}|}&lt;br /&gt;
&lt;br /&gt;
 f... = Bestimmt den Offsetwert der Frequenz.&lt;br /&gt;
        Als Basis gilt das eingestellte Band im Configuration-Settings-Kommando&lt;br /&gt;
&lt;br /&gt;
freq = 10 * C1 * (C2 + f/4000) [MHz]&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
! Band || C1 || C2&lt;br /&gt;
|-&lt;br /&gt;
| 315 || 1 || 31&lt;br /&gt;
|-&lt;br /&gt;
| 433 || 1 || 43&lt;br /&gt;
|-&lt;br /&gt;
| 868 || 2 || 43&lt;br /&gt;
|-&lt;br /&gt;
| 915 || 3 || 30&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Data-Rate ===&lt;br /&gt;
 Hex = c6 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 11000110 | cs | r6 | r5 | r4 | r3 | r2 | r1 | r0&lt;br /&gt;
 cs =  Vorteiler, Faktor 8. Hiermit kann ein Vorteiler aktiviert werden,&lt;br /&gt;
       der die errechnete Baudrate (r...) durch 8 teilt.&lt;br /&gt;
 r... = Baudratenteilerfaktor&lt;br /&gt;
&lt;br /&gt;
=== RX Control ===&lt;br /&gt;
 Hex = 94 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 10010 | p20 | d1 | d2 | i2 | i1 | i0 | g1 | g0 | r2 | r1 | r0&lt;br /&gt;
 p20 = Bestimmt die Funktion des Pin20 (nINT / VDI) am RFM12 Chip (1 = VDI-Ausgang / 0 = Interrupt-Eingang)&lt;br /&gt;
 d... = (Valid Data Indicator). Definiert die Geschwindigkeit, mit der bestimmt wird, ob ein Signal korrekt ist, oder nicht.&lt;br /&gt;
        (00=schnell / 01=mittel / 10=langsam / 11=immer an). Je nach eingestellter Variante werden&lt;br /&gt;
        unterschiedliche Hardware- und Software-Kombinationen genuzt.&lt;br /&gt;
        Fast:  CR_Lock  OR  DQD  ... Medium:  CR_Lock  AND ( DRSSI  OR  DQD ) ... &lt;br /&gt;
        SLOW: R/S FlipFlop aus (SET)  DRSSI  OR  DQD  OR  CR_Lock  und (CLR)  DRSSI  AND  DQD  AND  CR_Lock .&lt;br /&gt;
 i... = Bestimmt die Bandbreite des Empfängers in KHz (KiloHertz).&lt;br /&gt;
        (000=Reserviert / 001=400 / 010=340 / 011=270 / 100=200 / 101=134 / 110=67 / 111=Reserviert)&lt;br /&gt;
 g... = (LNA-Gain) Verstärkungsfaktor des Rauscharmen-Eingangs-Signal-Verstärkers (LNA Low Noise Amplifier).&lt;br /&gt;
        Werte in dBm (Dezibel [Grösse: Milliwatt]) Mögliche Werte sind: 0 / -6 / -14 / -20&lt;br /&gt;
 r... = (DRSSI = Digital Received Signal Strength Indication) Minimale Empfangssignalfeldstärke.&lt;br /&gt;
        6 dBm pro Schritt: (000=-103 / 001=-97 / 010=-91 / ...)&lt;br /&gt;
&lt;br /&gt;
=== Synchron Pattern ===&lt;br /&gt;
 Hex = ce &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 11001110 | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0&lt;br /&gt;
 b... = Legt den Wert fest, der als Synchronisations-Byte für die Datenfilterung verwendet werden soll.&lt;br /&gt;
&lt;br /&gt;
=== Data Filter ===&lt;br /&gt;
 Hex = c2 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 11000010 | al | ml | -unknow- (1) | s | -unknow- (1) | f2 | f1 | f0&lt;br /&gt;
 al = Baudratenregenerator schaltet automatisch in den langsamen Modus, &lt;br /&gt;
      sobald er einen Takt erkannt hat.&lt;br /&gt;
 ml = schneller/langsamer Modus&lt;br /&gt;
 -unknown- (1) = ??? (Standard = 1) (Auch im Datenblatt von IA4420 so beschrieben)&lt;br /&gt;
 s = (DataFilter) Typ des Datenfilters (0=DigitalFilter / 1=AnalogFilter).&lt;br /&gt;
     Bei Nutzung des Analog-Filters kann kein FIFO sowie kein ClockRecovery genuzt werden.&lt;br /&gt;
 -unknown- (1) = ??? (Standard = 1) (Auch im Datenblatt von IA4420 so beschrieben)&lt;br /&gt;
 f... = (DQD Threshold) Bestimmt den Schwellwert, ab dem ein Signal als gut empfunden wird,&lt;br /&gt;
         und der Empfänger dieses weiterverarbeiten soll.&lt;br /&gt;
         DQD (data quality detection) zählt die &amp;quot;Spikes&amp;quot; des ungefilterten Signals, und bestimmt darüber die Qualität der Daten.&lt;br /&gt;
&lt;br /&gt;
=== FIFO und RESET-Mode ===&lt;br /&gt;
 Hex = ca &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 11001010 | f3 | f2 | f1 | f0 | sp | al | ff | dr&lt;br /&gt;
 f... = (FIFO interrupt Level) Anzahl der bits im FIFO, die einen Interrupt auslösen sollen&lt;br /&gt;
 sp = (Sync-Pattern length) Legt die Länge des Synchron-Patterns fest&lt;br /&gt;
      (0 = 2Byte / 1 = 1Byte)&lt;br /&gt;
 al = (FIFO Fill Condition) Legt den Wert fest, ab dem das Füllen des FIFOs beginnt.&lt;br /&gt;
      (0=Synchron / 1=Ständig). Bei Nutzung des Synchron-Modus, werden erst dann Daten in den FIFO geschrieben,&lt;br /&gt;
      wenn eine definierte 8-Bit od. 16-Bit lange Datenfolge empfangen wurde (Standard ist Hex: 2dd4,&lt;br /&gt;
      das LSB kann geändert werden und stellt das 8-Bit Synchron-Pattern dar).&lt;br /&gt;
 ff = (FIFO Fill) Startet das Einlesen der empfangenen Daten in den FIFO-Puffer.&lt;br /&gt;
      Wenn al (FIFO Fill Condition) auf synchron steht, dann startet das Setzen dieses Bits die Synchronisation-Bit-Erkennung.&lt;br /&gt;
 dr = (Sens Reset Mode) Wenn dieses Bit auf 0 steht, wird bei einer Schwankung von 200mV auf&lt;br /&gt;
      der VCC-Leitung (Spannungsversorgung des Chips), ein System-Reset ausgelöst.&lt;br /&gt;
&lt;br /&gt;
=== Automatic Frequency Control ===&lt;br /&gt;
 Hex = c4 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 11000100 | a1 | a0 | rl1 | rl0 | st | fi | oe | en&lt;br /&gt;
 a... = Modus der AFC-Schaltung, 0=Auto off, 1=einmalig nach Einschalten, 2=Solange VDI low ist, 3=unabhängig von VDI&lt;br /&gt;
 r... = (Range Limit) Frequenzraster (00=KeineBegrenzung / 01=+15 &amp;gt; -16 / 10=+7 &amp;gt; -8 / 11=+3 &amp;gt; -4)&lt;br /&gt;
 st = Berechneten Offset-Wert übernehmen&lt;br /&gt;
 fi = Genauer Berechnungsmodus (besser aber lansgamer)&lt;br /&gt;
 oe = AFC-Offset freischalten&lt;br /&gt;
 en = AFC-Berechnung aktivieren&lt;br /&gt;
&lt;br /&gt;
=== TX Configuration Control ===&lt;br /&gt;
&lt;br /&gt;
* Hex = 98xx (99xx, da nur die 7 MSB fix sind)&lt;br /&gt;
&lt;br /&gt;
Bit-Syntax:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| POR || 0x9 || 0x8 || 0x0 || 0x0 &lt;br /&gt;
|-&lt;br /&gt;
| Nilbbes || 1001 || 100 mp || m3 m2 m1 m0 || 0 p2 p1 p0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Bitfelder:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| mp || Modulation Polarity || Bestimmt die Richtung der FSK-Erzeugung (invertiert das Spektrum).&lt;br /&gt;
|-&lt;br /&gt;
| m&#039;&#039;n&#039;&#039; || frequency deviation || Bestimmt den Frequenzabstand des High- und Low-Wertes bei der Übertragung im FSK-Betrieb. Basis ist der mp-Wert.&lt;br /&gt;
|-&lt;br /&gt;
| 0 || unknown || immer 0 (Auch im Datenblatt von IA4420 so beschrieben)&lt;br /&gt;
|-&lt;br /&gt;
| p&#039;&#039;n&#039;&#039; || relative output power || Bestimmt die relative Ausgangsleistung des Senders anhand des dBm-Wertes (Dezibel [Grösse: Milliwat]) 3-dBm-Schritte. (000=0 / 001=-3 / 010=-6 .. 111=-21 dBm). Der Wert steht im Zusammenhang mit der angeschlossenen Antennen-Impedanz.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Wake-Up Timer ===&lt;br /&gt;
 Bestimmt die Zeitperiode der zyklischen Einschaltung des WakeUp-Timers.&lt;br /&gt;
 Nach Ablauf der Zeitperiode erfolgt ein WKUP interrupt, der zB. zum Aufwecken eines Mikrocontrollers verwendet werden kann.  &lt;br /&gt;
 Hex = e &amp;amp; xxx&lt;br /&gt;
 Bit-Syntax: 111 | R4 | R3 | R2 | R1 | R0 | M7 | M6 | M5 | M4 | M3 | M2 | M1 | M0&lt;br /&gt;
 R = Exponent der Zeit&lt;br /&gt;
 M = Zeit&lt;br /&gt;
&lt;br /&gt;
=== Low Duty-Cycle ===&lt;br /&gt;
&lt;br /&gt;
 Hiermit kann der Empfänger, cyklisch ein- bzw ausgeschaltet werden. Er kann damit die eingestellte Frequenz &amp;quot;überwachen&amp;quot;.&lt;br /&gt;
 Dies wirkt sich stark auf die Stromaufnahme des Moduls bei Batteriebetrieb aus.&lt;br /&gt;
 Mit dem WakeUp Timer wird die Einschaltfrequenz des Empfängers eingestellt (zB. alle 500ms) und mit dem Low Duty Cycle&lt;br /&gt;
 wird bestimmt, wie lange  der Empfänger dann aktiv sein soll (zb. 30% von 500ms = 150ms.&lt;br /&gt;
 Werden während der On-Periode gültige Daten empfangen, bleibt der Empfänger bis zum Ende der Aussendung aktiv.&lt;br /&gt;
 Der WakeUp Timer muß zur Nutzung des Low Duty Cycles weder aktiviert sein, noch muss er in jedem Zyklus zurückgesetzt werden.    &lt;br /&gt;
&lt;br /&gt;
 hex = 6400 + Bits&lt;br /&gt;
 Bit-Syntax: 11001000 | d6 | d5 | d4 | d3 | d2 | d1 | d0 | en&lt;br /&gt;
 d... = Einschaltdauer während der zyklischen Einschaltung&lt;br /&gt;
 en = zyklische Einschaltung aktivieren&lt;br /&gt;
&lt;br /&gt;
=== RX FIFO Read ===&lt;br /&gt;
 Hex = b000&lt;br /&gt;
 Bit-Syntax: 1011000000000000&lt;br /&gt;
&lt;br /&gt;
Dieses Kommando löst die Rückgabe eines Datenbytes (synchron mit dem 8. Bit) aus. Es ist nötig, dass das ef-Bit (RX-FIFO) im Configuration Setting gesetzt wurde, um diese Funktion nutzen zu können!&lt;br /&gt;
&lt;br /&gt;
=== TX Register Write ===&lt;br /&gt;
Dieses Kommando schreibt Daten in den TX-Puffer. Wenn der Sender aktiv ist, wird dieses sofort gesendet. el (TX-Register) muss im Configuration-Setting-Kommando aktiv sein.&lt;br /&gt;
 Hex = b8 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 10111000 | DataByteToSend&lt;br /&gt;
 DataByteToSend = Das Datenbyte, welches gesendet werden soll.&lt;br /&gt;
&lt;br /&gt;
(Senden Funktioniert nur wenn zuvor der Status abgefragt wurde)&lt;br /&gt;
&lt;br /&gt;
=== Status Read ===&lt;br /&gt;
Dieses Kommando löst die Rückgabe des Statusregisters aus, welches nach der ersten 0 im ersten Bit synchron übertragen wird.&lt;br /&gt;
 Hex = 0000&lt;br /&gt;
 Bit-Syntax: 0000000000000000&amp;lt;000&amp;gt;&lt;br /&gt;
 Rückgabe-Syntax: x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | x10 | x11 | x12 | x13 | x14 | x15 | x16 | x17 | x18&lt;br /&gt;
 x0 -&amp;gt; x5 = Interrupt bits&lt;br /&gt;
 x6 -&amp;gt; x15 = Status Bits&lt;br /&gt;
 x16 -&amp;gt; x18 = FIFO&lt;br /&gt;
 x0 = FFIT / RGIT (RGIT = TX-Register ist bereit neue Daten zu senden ... kann mit dem TX-Register gelöscht werden)&lt;br /&gt;
     (FFIT = Die Anzahl der Datenbits im FIFO-Puffer hat das eingestellte Limit erreicht.&lt;br /&gt;
      Kann mit einer der FIFO-Lesemethoden gelöscht werden)&lt;br /&gt;
 x1 = POR (PowerOnReset)&lt;br /&gt;
 x2 = FFOV / RGUR (RGUR = Der Datenstrom beim Senden ist abgerissen, da nicht schnell genug Daten nachgeladen wurden)&lt;br /&gt;
      (FFOV = Der RX-FIFO ist übergelaufen)&lt;br /&gt;
 x3 = WKUP&lt;br /&gt;
 x4 = EXT (Externer IRq vom nINT-Pin)&lt;br /&gt;
 x5 = LBD (Low Battery Detected)&lt;br /&gt;
 x6 = FFEM (Der FIFO-Puffer ist leer/EMpty)&lt;br /&gt;
 x7 = RSSI/ATS (ATS = )(RSSI = Die Signalstärke ist über dem eingestelltem Limit)&lt;br /&gt;
 x8 = DQD&lt;br /&gt;
 x9 = CRL&lt;br /&gt;
 x10 = ATGL&lt;br /&gt;
 x11 = OFFS_6 (sign of offset)&lt;br /&gt;
 x12 = OFFS_3&lt;br /&gt;
 x13 = OFFS_2&lt;br /&gt;
 x14 = OFFS_1&lt;br /&gt;
 x15 = OFFS_0&lt;br /&gt;
 x16 = FO&lt;br /&gt;
 x17 = FO+1&lt;br /&gt;
 x18 = FO+2&lt;br /&gt;
&lt;br /&gt;
== Einstellungen für maximale Reichweite ==&lt;br /&gt;
&lt;br /&gt;
Für eine maximale Reichweite eignen sich folgende Einstellungen:&lt;br /&gt;
* Bitrate: 2k - 10kbit/s.&lt;br /&gt;
* Receiver Baseband Bandwidth: 134kHz&lt;br /&gt;
* RSSI Threshold: -97dBm&lt;br /&gt;
* LNA gain: 0dB. Falls in der Gegend Störer im gleichen Frequenzbereich sind, dann -6dB, ansonsten kann die Eingangsstufe übersteuern.&lt;br /&gt;
* FSK frequency deviation: +/-90kHz&lt;br /&gt;
* Output Power: 0dB&lt;br /&gt;
&lt;br /&gt;
Und vor allem: Eine gute (Richt-) Antenne.&lt;br /&gt;
&lt;br /&gt;
== Quarzfrequenz ändern==&lt;br /&gt;
Im Datenblatt wird die Verwendung eines 10 MHz-Quarzes empfohlen. Man darf die Frequenz aber nach oben und unten variieren, wie Messungen mit einem DDS-Generators anstelle des Quarzes zeigen: [[Media:PLL-Rastbereich_log.pdf|PLL-Einrast-Tabelle]]. Eine [[Media:RFM12Quarz.pdf|Tabelle: Quarzfrequenzen von 8,5-11 MHz]] zeigt die damit erreichbaren Frequenzen. Quarze für 3. oder auch 5.Oberton sollten auch auf ihrer Grundfrequenz verwendbar sein, dafür bieten sich u.a. CB-Funk- und 10m-Amateurbandquarze an. &lt;br /&gt;
&lt;br /&gt;
Den Einfluß der vier unteren Bits im Configuration Setting Register und des mp-Bits (Modulations-Polarität?) auf die PLL-Frequenz zeigt diese [[Media:Varicap_RFM12.pdf|Kapazitäts-Tabelle]]. Pro Stufe sind es hier etwa 4 kHz, das kann je nach Quarz schwanken. Möglicherweise ist so auch Schmalband-FSK möglich, ohne Änderung des PLL-Teilers.&lt;br /&gt;
&lt;br /&gt;
Was können wir damit anfangen? Neben dem regulären Einsatz auf den beiden zugelassenen Bändern 433 und 868 MHz sind das unter anderem (bitte weitere Ideen einfügen):&lt;br /&gt;
&lt;br /&gt;
* Packet-Radio mit 9600 Baud im 70cm-Amateurband 430-440 MHz. Die einfachste Möglichkeit ist das Programm [http://www.baycom.org/~tom/ham/soundmodem/ Soundmodem], das für Windows und Linux existiert. Wer es komfortabler haben will findet [http://www.dj4uf.de/funktechnik/soundmodem/soundmodem.htm hier] eine Beschreibung wie Soundmodem mit den Programmen [http://www.flexnet.info/ Flexnet] und [http://www.paxon.de Paxon] zusammenarbeitet. Eine Karte der Packet-Radio-Digipeater im 70cm-Band kann man mittels [http://www.hammap.de Hammap] erstellen. Leider werden die Daten in den letzten Jahren nicht mehr sehr gepflegt, es dürften einige Karteileichen enthalten sein.&lt;br /&gt;
&lt;br /&gt;
* Empfang der [http://www.adacom.org/projekte/funkruf/ POCSAG-Funkrufsender] am oberen Ende des Amateurbandes auf  439,9875 MHz 2-FSK mit 4kHz Hub und 1200 bit/s im POCSAG Radio Paging Code 1 [http://home.arcor.de/norbert_n/samsfaq/sams.txt (Liste der Sender, Stand 18.09.07)]. Zur Decodierung existieren mehrere Programme, aufbauend auf [http://www.baycom.org/~tom/ham/linux/multimon.html Multimon] die Weiterentwicklungen [http://www.monitor.mgrohmann.de/ Monitor] und [http://monitord.de/ MonitorD]. Im Prinzip könnte man damit auch die verschlüsselten Wettermeldungen auf 466,23 MHz mitschreiben, aber nicht decodieren.&lt;br /&gt;
&lt;br /&gt;
* Empfang der [http://www.darc.de/vus/digital.html D-Star-Relais]. Das ist eine patentierte digitale Sprach- und Datenübertragung, deren Eigentümer dafür sorgt, dass kein käufliches oder Selbstbaufunkgerät ohne den &amp;quot;AMBE&amp;quot;-Modemchip D-Star senden und empfangen darf. Es gibt eine kleine Ausnahme, das [http://www.darc.de/vus/down/dstar_decode_v02a.zip Programm r00t&#039;s D-Star Decoder V0.2a] für die Soundkarte, das nur Rufzeichen und Datentelegramme der beteiligten Funkamateure darstellt.&lt;br /&gt;
&lt;br /&gt;
* Panoramaempfänger (die Bezeichnung Spektrumanalysator wäre etwas übertrieben) unter Verwendung des analogen RSSI Ausgangs (Anschluß am Kondensator in der Ecke). Damit ließe sich z.&amp;amp;nbsp;B. auch die Bandbelegung im PMR-Bereich 446,0-446,2 MHz oder im Mobilfunkband um 900 MHz anzeigen.&lt;br /&gt;
&lt;br /&gt;
* Pegelanzeige für Mobilfunksender. Im 900 MHz Mobilfunkbereich könnte man mit dem RSSI-Ausgang die umliegenden Funkmasten anpeilen und ihre Pegel anzeigen. Laut Datenblatt nur ein Anzeigeumfang von 35 dB, aber mit umschaltbarem Grundpegel.&lt;br /&gt;
&lt;br /&gt;
* In Verbindung mit einem Frequenzumsetzer lassen sich weitere Frequenzbereiche erschließen, z.&amp;amp;nbsp;B. Packet-Radio im 23cm- (1240-1200 MHz)  und 13cm- (2320-2450 MHz) Amateurband. Leider liegt die Zwischenfrequenz der Satellitentuner (479,5 MHz) schon am oberen Ende des PLL-VCO-Einrastbereiches. Damit wäre ein preiswerter Konverter für 23cm möglich, meistens schon mit I2C-Bus PLL.&lt;br /&gt;
&lt;br /&gt;
* Local Oscillator für einen Empfänger. Mir den ca. 5 Milliwatt des RFM12 läßt sich ein [http://www.mini-circuits.com/products/fm_sm_main.html passiver Diodenringmischer] ansteuern. Damit kann man einen Überlagerungsempfänger oder -sender mit hoher erster Zwischenfrequenz bauen.&lt;br /&gt;
&lt;br /&gt;
== Antennen-Anpaßnetzwerk==&lt;br /&gt;
[[Image:Antennenanpassung.png|thumb|right|400px|Antennen-Anpassnetzwerk im Datenblatt]]&lt;br /&gt;
Soll das RFM12 auf anderen Frequenzen betrieben werden, ist nur eine Änderung des Antennennetzwerks nötig. Das Datenblatt bietet knappe aber ausreichende Informationen.  &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zwischen Pin 12 und 13 liegt eine Spannungsquelle, die ihre maximale Sendeleistung in eine komplexe Last nach der Tabelle &amp;quot;Note4&amp;quot; abgibt. Das bedeutet, ihr Innenwiderstand ist konjugiert-komplex zu dieser Last, also dieselben Zahlenwerte, nur mit Minuszeichen vor dem &amp;quot;j&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Anpassnetzwerk läßt sich auf zwei Bauteile reduzieren: von der Antenne ausgehend, die als reeller 50Ω- Widerstand angenommen wird, ist ein Kondensator in Reihe geschaltet. C8 und C9 (in der Tabelle C9 und C10 bezeichnet) liegen in Reihe und sind gleich groß, dürfen also in einem Kondensator mit der halben Kapazität zusammengefasst werden. Dann liegt noch L1 parallel zur Quelle, L3 hat mehr als den 20-fachen Wert und kann vernachlässigt werden.&lt;br /&gt;
Das ganze läßt sich im Smith-Diagramm gut darstellen.&lt;br /&gt;
&lt;br /&gt;
[[Image:SmithDiagramm.png|thumb|right|400px|Anpassnetzwerk im Smith-Diagramm]]&lt;br /&gt;
&lt;br /&gt;
Von der Antenne im Mittelpunkt ausgehend bewegen wir uns mit dem Serien-C Cs auf einem Kreisbogen nach unten (kapazitive Halbebene) auf den Punkt &amp;quot;Unendlich&amp;quot; rechts außen zu. Ungefähr senkrecht unter dem Zielpunkt, hier für 433 MHz gezeichnet, biegen wir ab auf eine Kreisbahn für die Parallelinduktivität Lp. Sie führt in die obere (induktive) Halbebene auf den Nullpunkt links zu. Der genaue Schnittpunkt beider Kreise kann &amp;quot;mit Zirkel und Lineal&amp;quot; oder einem der [http://www.mikrocontroller.net/articles/Schaltungssimulation#Hochfrequenztechnik Hochfrequenz-Berechnungsprogramme] ermittelt werden.&lt;br /&gt;
&lt;br /&gt;
Die Kreise für Lp oder Cp sind im Smith-Diagramm nicht eingezeichnet , um die Übersicht zu wahren. Man könnte ein gespiegeltes Diagramm darüberlegen, aber stattdessen spiegelt man die Kurve am Diagramm-Mittelpunkt (dünne blaue Kurven). Am Rand kann man jetzt die auf 50Ω (bzw. 1/50Ω für die gespiegelte Kurve) normierten Blindwiderstände ablesen. Für Cs lesen wir eine Differenz zwischen Start und Zielpunkt von etwa Xc=(3,2-0) * 50Ω ab, für Lp sind es (0,25 +0,32) = 0,57*(1/50Ω). Damit erhalten wir Cs=1/(2*Pi*f*Xc)=2,3 pF das war wie gesagt die halbe Kapazität der beiden hintereinandergeschalteten Kondensatoren, Tabellenwert ist 4,7pF und Lp=1/(2*Pi*f*0,57*(1/50))= 32,2 nH, der Tabellenwert ist 27nH.&lt;br /&gt;
&lt;br /&gt;
[[Image:Antennenanpassung_RF12.png|thumb|right|400px|Anpassnetzwerk im Datenblatt zu RF12]]&lt;br /&gt;
[[Image:Smith-Diagramm-RF12.png|thumb|right|400px|Smith-Diagramm zum RF12]]&lt;br /&gt;
Im RF12 wird ein um zwei Bauteile (im Bild C2 und L1 genannt) erweitertes Netzwerk empfohlen, das macht man um eine breitbandigere Anpassung zu erreichen.&lt;br /&gt;
&lt;br /&gt;
== Betriebsspannung==&lt;br /&gt;
Achtung nicht alle Module sind für 5V geeignet, alle Typen mit &amp;quot;B&amp;quot; am Ende sind nur für 3,3V. Man muß dann entweder den Mikrocontroller ebenfalls mit 3,3V betreiben, oder [http://www.mikrocontroller.net/articles/Pegelwandler Pegelwandler] verwenden.&lt;br /&gt;
&lt;br /&gt;
== Messungen ==&lt;br /&gt;
Drei Messungen am RFM12 zeigen den Einfluß von Eingangpegel, Frequenzhub und Mittenfrequenz auf das Ausgangssignal, gemessen am Filterkondensator CFIL. Zwei weitere Kurven zeigen die ARSSI-Spannung (Anschluß am Kondensator in der Ecke) und die damit gemessene Filterkurve.&lt;br /&gt;
[[Image:RFM12_Eingangspegel.png|thumb|right|800px|Messungen am RFM12 Änderung des Eingangspegels]]&lt;br /&gt;
[[Image:RFM12_Frequenzhub.png|thumb|right|800px|Messungen am RFM12 Änderung des Frequenzhubs]]&lt;br /&gt;
[[Image:RFM12_Mittenfrequenz.png|thumb|right|800px|Messungen am RFM12 Änderung der Mittenfrequenz]]&lt;br /&gt;
[[Image:RFM12_ARSSI_und_Filterkurve.png|thumb|right|200px|Messungen am RFM12 ARSSI_und_Filterkurve]]&lt;br /&gt;
&lt;br /&gt;
Was folgt aus diesen Messungen?&lt;br /&gt;
* Der ARRSI-Anschluß zeigt uns über mehr als 100 kHz ein Sendesignal an. Decodierbar ist es aber nur im Abstand von weniger als 5 kHz von der Mittenfrequenz. Ohne Abgleich von Sender und Empfänger ist also die AFC unverzichtbar.&lt;br /&gt;
* Das &amp;quot;Loch&amp;quot; in der Mitte der Durchlaßkurve stammt von dem im Datenblatt gezeigten Hochpass &amp;quot;&amp;gt; 7 kHz&amp;quot;. Für ein unmoduliertes Sendesignal geht die ARSSI-Spannung fast auf den Rauschpegel herunter, hier wurde mit +/-15kHz moduliert. &lt;br /&gt;
* Damit läßt sich der Empfänger abgleichen. Man braucht dazu nur ein unmoduliertes Sendesignal auf der Sollfrequenz. Das kann ein mittels Frequenzzähler abgeglichenes zweites RFM12 sein. Der Empfängerquarz wird mit den 4 Bit für die Oszillatorkapazität genau auf dieses &amp;quot;Loch&amp;quot; der ARRSI-Spannung eingestellt.&lt;br /&gt;
&lt;br /&gt;
Die AFC-Messdauer ist im Datenblatt nicht genannt, eine schnelle Abfrage des ATGL-Bit im Statusregister im &amp;quot;Auto-AFC&amp;quot; - Modus liefert minimale Pulsbreiten von ca. 250..270 µsec, entsprechend einer Messfolgefrequenz von 4 kHz - leider nicht ausreichend um 9600 Baud Schmalband-FM zu demodulieren. Im Auto-Modus werden zwei Messungen zusammengefasst, damit beträgt die Updaterate sogar nur 2 kHz. Weitere Messung : ab etwa +/-10 kHz Hub synchronisiert sich das ATGL-Bit auf der Mittenfrequenz mit einem bis zu 1,8...2 kHz FM-modulierten Signal.&lt;br /&gt;
&lt;br /&gt;
Neue Idee: &amp;quot;Dithering und FM-Flankendemodulator&amp;quot;: &amp;lt;br&amp;gt; &lt;br /&gt;
Wenn das Empfangssignal nicht weit genug FM-moduliert ist, müssen wir eben den Empfänger modulieren. Im Timer-Interrupt wird die Quarzkapazität oder die PLL z.&amp;amp;nbsp;B. mit 38,4 oder 76,8 kHz und mindestens +/-15kHz Hub umgeschaltet, sodaß bei Empfang eines unmodulierten Signals am CFIL-Ausgang ein symmetrisches Rechteck dieser Frequenz erscheint. Ist das Empfangssignal schmalbandig FM-moduliert, und man stimmt den Empfänger leicht daneben ab, so sollte das CFIL-Signal mit dieser Modulation PWM-moduliert sein. Ein Tiefpass filtert die Dithering-Frequenz weg und übrig bleibt (wenns funktioniert) die Modulation, vielleicht sogar analoger Sprechfunk...&lt;br /&gt;
Motto &amp;quot;Engineering is the art of making what you want from things you can get.&amp;quot; (von http://www.dsprelated.com)&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen ==&lt;br /&gt;
* [[Elektronikversender#csd-electronics|csd-electronics]]&lt;br /&gt;
* [[Elektronikversender#IT-WNS|IT-WNS]]&lt;br /&gt;
* [[Elektronikversender#Pollin_Electronic|Pollin Electronic]]&lt;br /&gt;
* [[Elektronikversender#RS_Components|RS Components]]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [[AVR RFM12]]&lt;br /&gt;
* [[RFM12 Protokoll Stack]]&lt;br /&gt;
* [[RF_SOAP]]&lt;br /&gt;
* [[ Pollin_Funk-AVR-Evaluationsboard]]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/93801 Bezugsquellen]&lt;br /&gt;
* [http://www.das-labor.org/wiki/RFM12_library Library zur Ansteuerung des RFM12]&lt;br /&gt;
* [http://www.compotron.com/daten/any/IA4420.pdf Datenblatt des Chipherstellers Integration IA4420.pdf]&lt;br /&gt;
* [https://www.silabs.com/Support%20Documents/TechnicalDocs/Si4420.pdf Silabs hat Integration im Juni 2008 gekauft, Chipbezeichnung jetzt Si4420]&lt;br /&gt;
Folgende Links sind mit Vorsicht zu genießen, da die Datenblätter teilweise  fehlerbehaftet sind. Es empfiehlt sich, direkt mit dem Datenblatt des RF12 (das ist das IC auf dem Modul) zu arbeiten. Dieses ist so gut wie fehlerfrei.&lt;br /&gt;
&lt;br /&gt;
* [http://www.hoperf.com/upload/rf/RF12.pdf Datenblatt des ICs RF12] (PDF)&lt;br /&gt;
* [http://www.hoperf.com/upload/rf/RFM12.pdf Datenblatt des Moduls RFM12] (PDF)&lt;br /&gt;
* [http://www.hoperf.com/upload/rf/RF12_code.pdf Programming Guide] (PDF)&lt;br /&gt;
* [http://www.hoperf.com/upload/rf/RF12TOOLS.pdf Demo Kit User Manual] (PDF)&lt;br /&gt;
* [http://www.pollin.de/shop/downloads/D810047S.ZIP Beispielprogramm von Pollin] (ZIP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Bauteile]]&lt;br /&gt;
[[Kategorie:RFM12| ]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Diskussion:RFM12_Protokoll_Stack&amp;diff=65358</id>
		<title>Diskussion:RFM12 Protokoll Stack</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Diskussion:RFM12_Protokoll_Stack&amp;diff=65358"/>
		<updated>2012-03-30T11:32:30Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Fragen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Fehler ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;F:&#039;&#039;&#039; &#039;&#039;(17.09.2008)&#039;&#039; Im IE haben die Hamming-Tabellen alle einen schwarzen Hintergrund und schwarze Schrift (Im Firefox ist die Darstellung i.o.)&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;A:&#039;&#039;&#039; Ich hab die Kurzschreibweise für Farben verwendet (#f12 statt #ff1122), ist aber eigentlich leider nur in CSS erlaubt... (Aber es scheint eine gute Methode zu sein um Inhalte vor IE nutzern zu verstecken *g*)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;fixed!&lt;br /&gt;
&lt;br /&gt;
== Anregungen ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;F:&#039;&#039;&#039; &#039;&#039;(31.08.2008)&#039;&#039; Ist der Code bereits benutzbar? Falls ja fände ein Beispielprogramm sehr hilfreich.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;A:&#039;&#039;&#039; Im LLC fehlt noch ein bisschen was, aber PHY und MAC sind benutzbar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;I:&#039;&#039;&#039; Der Hersteller empfiehlt 4 bytes Preamble zu senden.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;A:&#039;&#039;&#039; Kann man natürlich machen (und ist immernoch kompatible zum MAC). Bisher war&#039;s bei mir nicht nötig.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;F:&#039;&#039;&#039; &#039;&#039;(11.10.2011)&#039;&#039; Ist nun alles vollständig implementiert und getestet?&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fragen ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;F:&#039;&#039;&#039; &#039;&#039;(04.09.2008)&#039;&#039; Warum gibt es auf LLC-Ebene keine Paketlängeninformation? (Jörg Wunsch)&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;A:&#039;&#039;&#039; Overhead. Durch das Paketendezeichen ist die Länge definiert. Zugegeben, in manchen Applikationen erscheint es sinnvoll vor dem Empfang des Paketes die Länge zu wissen, aber IP hat z.B. dafür ein eigenes Feld.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A:&#039;&#039;&#039; (120330) Das ist aber — gelinde gesagt — unglücklich gelöst!&amp;lt;br&amp;gt;&lt;br /&gt;
Denn dann hätte man die Hammingbytes anders berechnen und dieses Byte als 17. Kombination eingehen lassen müssen. Zudem müsste man dieses Byte ebenfalls mit mindestens einem Bitfehler akzeptieren, um das Ende hinreichend sicher zu erkennen. Man kann einen Fehler im OSI-Layer 8 nicht im Layer 1 korrigieren: Das ganze Konstrukt bricht schließlich im Erdgeschoss zusammen. (heha)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;F:&#039;&#039;&#039; &#039;&#039;(07.10.2008)&#039;&#039; Benutzung?&lt;br /&gt;
Der Stack auf Layer 3 sieht ja so eigentlich ganz einfach zu verwenden aus. Aber wie genau benutze ich den jetzt?&lt;br /&gt;
Die einfachste Methode wäre ja beim Layer 3 ein init und sofort Daten draufschieben. Aber ich sehe im Quellcode keine Verbindung zu beispielsweise RFM12_PHY_init(). Also um welche Funktionen muss ich mich wirklich kümmern, um auf Layer 3 Bytes hin und her zu schicken?&lt;br /&gt;
Und ist das bischen was am 31.08.2008 fehlte inzwischen drinne?&lt;br /&gt;
&lt;br /&gt;
[[Benutzer:Malte|Malte]] 19:15, 7. Okt. 2008 (CEST)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A:&#039;&#039;&#039; So in etwa hab ich mir das API gedacht:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;quot;rfm12_phy.h&amp;quot;&lt;br /&gt;
#include &amp;quot;rfm12_mac.h&amp;quot;&lt;br /&gt;
#include &amp;quot;rfm12_llc.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define MY_RECEIVER  2&lt;br /&gt;
#define MY_PROTOCOL  13&lt;br /&gt;
#define BUF_SIZE     16&lt;br /&gt;
&lt;br /&gt;
uint8_t *buffer = &amp;quot;Hello world&amp;quot;;&lt;br /&gt;
uint8_t pos;&lt;br /&gt;
&lt;br /&gt;
void myrx(uint8_t data) {&lt;br /&gt;
    // TODO: handle rx data&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int16_t mytx(void) {&lt;br /&gt;
    if(pos &amp;lt; sizeof(buffer))&lt;br /&gt;
        return txBuf[pos++];&lt;br /&gt;
    return RFM12_L3_EOD;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void myack(bool ack) {&lt;br /&gt;
    printf(&amp;quot;Sending &amp;quot;);&lt;br /&gt;
    if(ack) printf(&amp;quot;OK\n&amp;quot;);&lt;br /&gt;
    else    printf(&amp;quot;failed\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main() {&lt;br /&gt;
    RFM12_L3_Protocol_t proto = {myrx, mytx, myack};&lt;br /&gt;
&lt;br /&gt;
    RFM12_PHY_init();&lt;br /&gt;
    RFM12_MAC_init();&lt;br /&gt;
    RFM12_MAC_setChannel(1);&lt;br /&gt;
    RFM12_LLC_registerType(MY_PROTOCOL, proto);&lt;br /&gt;
&lt;br /&gt;
    while(1) {&lt;br /&gt;
         while(RFM12_MAC_mediaBusy());&lt;br /&gt;
         pos = 0;&lt;br /&gt;
         RFM12_LLC_sendFrame(MY_PROTOCOL, MY_RECEIVER, false);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RFM12&amp;diff=65282</id>
		<title>RFM12</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RFM12&amp;diff=65282"/>
		<updated>2012-03-26T17:23:11Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Power-Management */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beschreibung der Funkmodule RFM01, RFM02 und RFM12.&lt;br /&gt;
&lt;br /&gt;
Benötigt werden in der Minimal-Version im FIFO-Modus nur die Anschlüsse nSEL, SDO, SDI und SCK, eben das komplette SPI-Interface. Der Zugriff auf das Sende- und Empfangs-FIFO ist per Software möglich, ebenso die Abfrage der Statusbits. Deshalb werden z.&amp;amp;nbsp;B. nIRQ und nFFS nicht unbedingt benötigt. nIRQ signalisiert unter anderem, dass das Modul bereit ist Daten zu empfangen. Wenn Daten empfangen wurden, kann dies über den FFIT-Pin abgefragt werden (falls die Füllschwelle eingestellt wurde). nFFS dient dazu das FIFO direkt anzusprechen (es ist quasi der Chipselect für das FIFO), davon wird in der Minimalversion aber kein Gebrauch gemacht. Der Pin muss daher auf high-Pegel gelegt werden!&lt;br /&gt;
An CLK kann eine Frequenz von 1MHz bis 10MHz eingestellt werden. Hiermit kann dann z.&amp;amp;nbsp;B. der Mikrocontroller versorgt werden.&lt;br /&gt;
Reset ist ein Open-Collector-Ausgang und gleichzeitig der Reset-Eingang. Er sollte daher entweder gar nicht, oder aber hochohmig angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Im FIFO-Mode kann das Modul konfiguriert werden mit dem Empfang zu warten, bis die Daten 0x2DD4 empfangen wurden. Sobald dieses Bitmuster empfangen wurde, werden Daten in das FIFO geschrieben, bis man das FIFO abschaltet und die Mustererkennung neu startet.&lt;br /&gt;
&lt;br /&gt;
Als weitere Modi stehen unter anderem ein synchroner Modus zur Verfügung (no FIFO mode), in dem der Sender/Empfänger den Bittakt ausgibt, und synchron dazu die zu sendenden Daten einliest bzw. die empfangenen Daten ausgibt. Der SPI Bus ist trotzdem zur Initialisierung des Moduls notwendig.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
&lt;br /&gt;
=== Soll ich 433 oder 868 MHz nehmen? ===&lt;br /&gt;
&lt;br /&gt;
Wähle das für deine Anwendung kleinere der beiden Übel: Bei 433 MHz sind i.d.R. mehr Störer unterwegs und bei 868 MHz sind die maximale Belegungsdauer bzw. das listen-before-talk (LBT) Verfahren gemäß [[Allgemeinzuteilung]] zu beachten. Siehe auch im Forum [http://www.mikrocontroller.net/topic/198559] und [http://www.mikrocontroller.net/topic/196693].&lt;br /&gt;
&lt;br /&gt;
=== SPI Interface ===&lt;br /&gt;
&lt;br /&gt;
* Maximale SPI Frequenz: 2,5MHz (10MHz Quarz / 4)&lt;br /&gt;
&lt;br /&gt;
=== CLK-Ausgang bleibt bei 1 MHz ===&lt;br /&gt;
&lt;br /&gt;
* Vor dem Umschalten (mit 0xC0E0) länger warten.&lt;br /&gt;
&lt;br /&gt;
=== RFM12 empfängt ein paar Bytes, dann nur Müll ===&lt;br /&gt;
&lt;br /&gt;
* Es wird zu langsam gesendet (TX FIFO underrun)&lt;br /&gt;
* Es wird zu langsam empfangen (RX FIFO overrun)&lt;br /&gt;
&lt;br /&gt;
Die Status-Bits helfen hier beim Debuggen. SPI sollte auf maximaler Transferrate stehen.&lt;br /&gt;
&lt;br /&gt;
=== RFM empfängt nur Müll ===&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/topic/73560#605528&lt;br /&gt;
&lt;br /&gt;
Deine Module verhalten sich normal. Man muß mit den Gain- und AFC-Bits&lt;br /&gt;
eine ganze Weile spielen, bis die Module korrekt laufen (kommt auf die&lt;br /&gt;
Anwendung an). Fakt ist: der Empfänger empfängt ständig Datenmüll als&lt;br /&gt;
Rauschen. Wenn der FIFO durch die Präambel getriggert wird, sind die&lt;br /&gt;
Daten im FIFO ziemlich korrekt, wenn alles &amp;quot;gut&amp;quot; eingestellt ist. Der&lt;br /&gt;
FIFO sollte per Interrupt dann auch sofort abgeholt werden, da sonst das&lt;br /&gt;
nächste Byte das alte direkt überschreibt. Jeder zusammenhängende&lt;br /&gt;
Datensatz (mehrere Bytes an einem Stück) muß von einer Präambel&lt;br /&gt;
eingeleitet werden. Nach dem kompletten Einlesen eines Datensatzes muß&lt;br /&gt;
der FIFO abgeschaltet, wieder eingeschaltet und für den Empfang der&lt;br /&gt;
nächsten Präambel neu scharf gemacht werden. (FifoFill bit)&lt;br /&gt;
&lt;br /&gt;
=== RFM hängt sich auf ===&lt;br /&gt;
&lt;br /&gt;
Wenn man die AFC nicht begrenzt, also keinen Wertebereich vorgibt, die eine maximale Abweichung korrigiert wird passiert es nach einer Weile, dass sich der Empfänger aufhängt, die Offsetbits im Status werden maximal und dann geht gar nichts mehr, er hängt fest.&lt;br /&gt;
&lt;br /&gt;
edit: Leider bringt die Beschränkung der AFC auf Minimum bei mir keine Verbesserung. Zumindest ist obige Aussage nicht allgemein gültig.&lt;br /&gt;
&lt;br /&gt;
Siehe auch &lt;br /&gt;
* Forenbeitrag [http://www.mikrocontroller.net/topic/82456#689660 RFM12: Erfahrungen ]&lt;br /&gt;
&lt;br /&gt;
=== Kommunikation mit RFM funktioniert nur sporadisch ===&lt;br /&gt;
&lt;br /&gt;
* Ist die Versorgungsspannung stabil? (evtl. Kondensator einbauen)&lt;br /&gt;
&lt;br /&gt;
=== Interrupt nIRQ klappt nicht bei 868MHz ===&lt;br /&gt;
&lt;br /&gt;
Wenn bei der Verwendung der 868er Module die üblichen Sourcen (dasLabor, etc) verwendet werden, müssen einige Änderungen gemacht werden, die sich leicht finden lassen. Ohne weiteres funktionierte der blockierende Empfang, der Interruptbetriebene (nIRQ) machte in mindestens einem Fall Probleme. Hier half die Anpassung des FIFO IT Level . In vorhandenen Sourcen ist 0xCA83 zu finden, eine Änderung auf 0xCAF3 hilft dabei.&lt;br /&gt;
&lt;br /&gt;
Bei Interruptbetrieb ist darauf zu achten, dass wirklich auf jeden Interrupt&lt;br /&gt;
reagiert wird.  Solange ein Interrupt nicht behandelt wird bleibt nIRQ auf LOW!&lt;br /&gt;
Durch das Lesen des Statusregisters können alle Interrupts ausser FFIT und RGIT&lt;br /&gt;
&amp;quot;gelöscht&amp;quot; werden.  Für FFIT ist das FIFO zu lesen und für RGIT das TxRegister zu beschreiben.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Register ==&lt;br /&gt;
&lt;br /&gt;
Von https://www.mikrocontroller.net/attachment/24947/RFM12.txt&lt;br /&gt;
&lt;br /&gt;
Dieses Dokument beschreibt die Nutzung des RFM12 TRX Moduls!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; WICHTIG &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dieses Dokument wurde aus mehreren Quellen zusammengestellt, und kann Fehler enthalten!&lt;br /&gt;
Es können Abweichungen in Bezug auf RF01 / RF02 / RF12 / RFM01 / RFM02 und andere Module auftreten!&lt;br /&gt;
Es wurde das Datenblatt vom RFM12B und RF12 von www.hoperf.com als Basis genuzt. Zusätzlich wurden diese Informationen mit Hilfe von Forums-Nutzern (https://www.mikrocontroller.net/topic/71682) weiter vervollständigt!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; WICHTIG &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Die LNA-Eingangsimpedanz beträgt 250Ω, und muss beim Anschluss einer 50-Ohm-Antenne entsprechend angepasst werden, um das Rauschen zu minimieren! &#039;&#039; -- (Auf den Pollin-Modulen bereits vorhanden)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Configuration Setting ===&lt;br /&gt;
 Hex = 80 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: &lt;br /&gt;
{| cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Byte ||width=&amp;quot;40%&amp;quot;| 1 || 2&lt;br /&gt;
|-&lt;br /&gt;
!Bits&lt;br /&gt;
|{{8Bit|width=100%| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 }}||{{8Bit|width=100%| el | ef | b1 | b0 | x3 | x2 | x1 | x0}}|}&lt;br /&gt;
 el (TX FIFO) = Sendepuffer für Datentransfer nutzen (1 = An / 0 = Aus)&lt;br /&gt;
 ef (RX FIFO) = Empfangspuffer für Datenspeicherung nutzen (1 = An / 0 = Aus)&lt;br /&gt;
 b... = Zu nutzende Basisfrequenz (00=315MHz / 01=433MHz / 10=868MHz / 11=915MHz)&lt;br /&gt;
 x... = Interner Clock des Chips kann durch verschieben einer Kondensator-Anpass-Stufe bestimmt werden.&lt;br /&gt;
        0,5pF pro Schritt. Basis ist 8,5pF -&amp;gt; (0000=8,5 / 0001=9,0 / 0010=9,5 / ...)&lt;br /&gt;
&lt;br /&gt;
=== Power-Management ===&lt;br /&gt;
 Hex = 82 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax:&lt;br /&gt;
{| cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Byte ||width=&amp;quot;40%&amp;quot;| 1 || 2&lt;br /&gt;
|-&lt;br /&gt;
!Bits&lt;br /&gt;
|{{8Bit|width=100%| 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 }}||{{8Bit|width=100%| er | ebb | et | es | ex | eb | ew | dc}}|}&lt;br /&gt;
 er = Gesamten Empfänger einschalten (1 = an / 0 = Aus).  &lt;br /&gt;
 ebb = Baseband Block einschalten (1 = an / 0 = aus)&lt;br /&gt;
 et = Sender einschalten (1 = an / 0 = Aus) (Wenn das TX-Register aktiv und mit Daten gefüllt ist/wurde,&lt;br /&gt;
      werden diese Daten sofort gesendet) (1 = an / 0 = aus)&lt;br /&gt;
 es = Schaltet den Synthesizer ein. (1 = an / 0 = aus)&lt;br /&gt;
 ex = Schaltet den Quarz-Oszilator ein. (1 = an / 0 = aus)&lt;br /&gt;
 eb = Vergleichbar mit BrownOutDetection -&amp;gt; Erkennt eine zu geringe Betriebsspannung und erzeugt einen Interrupt,&lt;br /&gt;
      um einen drohenden Spannungsaufall anzukündigen (1 = An / 0 = Aus)&lt;br /&gt;
 ew = Aktiviert den WakeUp Timer des Prozessors. (1 = an / 0 = aus)&lt;br /&gt;
 dc = Deaktiviert die Ausgabe des System Clocks auf dem CLK Pin am Chip (1 = Keine ClockAusgabe / 0 = Clock ausgeben)&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;er&amp;gt; bzw &amp;lt;et&amp;gt; schalten alle benötigten Module (Quarz-Oszillator, Sythesizer, Base Band Block,&lt;br /&gt;
 Power Amplifier ein auch wenn &amp;lt;ebb&amp;gt;, &amp;lt;es&amp;gt; oder &amp;lt;ex&amp;gt; nicht gesetzt sind.&lt;br /&gt;
 Durch separates Einschalten von &amp;lt;ebb&amp;gt;, &amp;lt;ex&amp;gt; oder &amp;lt;es&amp;gt; kann aber die Startzeit für den Empfänger bzw.&lt;br /&gt;
 den Sender verkürzt werden.&lt;br /&gt;
 Wird der WakeUp Timer verwendet ist &amp;lt;ew&amp;gt; nach jedem Cyclus zu löschen und wieder zu setzen.&lt;br /&gt;
&lt;br /&gt;
=== PLL Setting ===&lt;br /&gt;
 Hex = 198 + y&lt;br /&gt;
 Bit-Syntax: 110011000 | ob1 | ob0 | lpx | ddy | ddit | bw1 | bw0&lt;br /&gt;
 ob... = ... (00= 5 oder 10MHz [standard] / 01=3.3MHz / 1x=2.5MHz oder weniger)&lt;br /&gt;
 lpx = Wählt den Low-Power-Mode für den Quarz-Oszilator aus. (0=1ms [620µA] / 1=2ms [460µA])&lt;br /&gt;
 ddy = ...&lt;br /&gt;
 ddi = Schaltet das Dithering in PLL-Schleife ab. (1=abgeschaltet / 0=eingeschaltet)&lt;br /&gt;
 bw... = Wählt die Bandbreite des PLL-Signals aus. (00=86.2kbps [-107dBc/Hz] / 01=256kbps [-102dBc/Hz]) Bei 1MHz Offset Phasenrauschen.&lt;br /&gt;
&lt;br /&gt;
=== LowBatt / µC Clock Control ===&lt;br /&gt;
 Hex = c0 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 11000000 | d2 | d1 | d0 | v4 | v3 | v2 | v1 | v0&lt;br /&gt;
 d... = Bestimmt den Teilungsfaktor für die Clockausgabe am CLK-Pin in Abhängigkeit des Internen SystemTakts.&lt;br /&gt;
        (000=1 / 001=1.25 / 010=1.66 / 011=2 / 100=2.5 / 101=3.33 / 110=5 / 111=10)&lt;br /&gt;
 v... = Bestimmt die Betriebsspannung, bei der der RFM12 einen Low Battery Interrupt auslöst. (BrownOutDetection).&lt;br /&gt;
Im Power-Managment muss das eb-Bit aktiv sein, damit dies funktioniert.&lt;br /&gt;
&lt;br /&gt;
=== Frequency-setting ===&lt;br /&gt;
Bestimmt den Offset der Sende- und Empfangsfrequenz. Dieser Offset wird auf das Basisband im Configuration Setting hinzu gerechnet.&lt;br /&gt;
 Hex = a &amp;amp; xxx&lt;br /&gt;
 Bit-Syntax:&lt;br /&gt;
{| cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Byte ||width=&amp;quot;40%&amp;quot;| 1 || 2&lt;br /&gt;
|-&lt;br /&gt;
!Bits&lt;br /&gt;
|{{8Bit|width=100%| 1 | 0 | 1 | 0 | f11 | f10 | f9 | f8 }}||{{8Bit|width=100%| f7 | f6 | f5 | f4 | f3 | f2 | f1 | f0}}|}&lt;br /&gt;
&lt;br /&gt;
 f... = Bestimmt den Offsetwert der Frequenz.&lt;br /&gt;
        Als Basis gilt das eingestellte Band im Configuration-Settings-Kommando&lt;br /&gt;
&lt;br /&gt;
freq = 10 * C1 * (C2 + f/4000) [MHz]&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
! Band || C1 || C2&lt;br /&gt;
|-&lt;br /&gt;
| 315 || 1 || 31&lt;br /&gt;
|-&lt;br /&gt;
| 433 || 1 || 43&lt;br /&gt;
|-&lt;br /&gt;
| 868 || 2 || 43&lt;br /&gt;
|-&lt;br /&gt;
| 915 || 3 || 30&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Data-Rate ===&lt;br /&gt;
 Hex = c6 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 11000110 | cs | r6 | r5 | r4 | r3 | r2 | r1 | r0&lt;br /&gt;
 cs =  Vorteiler, Faktor 8. Hiermit kann ein Vorteiler aktiviert werden,&lt;br /&gt;
       der die errechnete Baudrate (r...) durch 8 teilt.&lt;br /&gt;
 r... = Baudratenteilerfaktor&lt;br /&gt;
&lt;br /&gt;
=== RX Control ===&lt;br /&gt;
 Hex = 94 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 10010 | p20 | d1 | d2 | i2 | i1 | i0 | g1 | g0 | r2 | r1 | r0&lt;br /&gt;
 p20 = Bestimmt die Funktion des Pin20 (nINT / VDI) am RFM12 Chip (1 = VDI-Ausgang / 0 = Interrupt-Eingang)&lt;br /&gt;
 d... = (Valid Data Indicator). Definiert die Geschwindigkeit, mit der bestimmt wird, ob ein Signal korrekt ist, oder nicht.&lt;br /&gt;
        (00=schnell / 01=mittel / 10=langsam / 11=immer an). Je nach eingestellter Variante werden&lt;br /&gt;
        unterschiedliche Hardware- und Software-Kombinationen genuzt.&lt;br /&gt;
        Fast:  CR_Lock  OR  DQD  ... Medium:  CR_Lock  AND ( DRSSI  OR  DQD ) ... &lt;br /&gt;
        SLOW: R/S FlipFlop aus (SET)  DRSSI  OR  DQD  OR  CR_Lock  und (CLR)  DRSSI  AND  DQD  AND  CR_Lock .&lt;br /&gt;
 i... = Bestimmt die Bandbreite des Empfängers in KHz (KiloHertz).&lt;br /&gt;
        (000=Reserviert / 001=400 / 010=340 / 011=270 / 100=200 / 101=134 / 110=67 / 111=Reserviert)&lt;br /&gt;
 g... = (LNA-Gain) Verstärkungsfaktor des Rauscharmen-Eingangs-Signal-Verstärkers (LNA Low Noise Amplifier).&lt;br /&gt;
        Werte in dBm (Dezibel [Grösse: Milliwatt]) Mögliche Werte sind: 0 / -6 / -14 / -20&lt;br /&gt;
 r... = (DRSSI = Digital Received Signal Strength Indication) Minimale Empfangssignalfeldstärke.&lt;br /&gt;
        6 dBm pro Schritt: (000=-103 / 001=-97 / 010=-91 / ...)&lt;br /&gt;
&lt;br /&gt;
=== Synchron Pattern ===&lt;br /&gt;
 Hex = ce &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 11001110 | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0&lt;br /&gt;
 b... = Legt den Wert fest, der als Synchronisations-Byte für die Datenfilterung verwendet werden soll.&lt;br /&gt;
&lt;br /&gt;
=== Data Filter ===&lt;br /&gt;
 Hex = c2 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 11000010 | al | ml | -unknow- (1) | s | -unknow- (1) | f2 | f1 | f0&lt;br /&gt;
 al = Baudratenregenerator schaltet automatisch in den langsamen Modus, &lt;br /&gt;
      sobald er einen Takt erkannt hat.&lt;br /&gt;
 ml = schneller/langsamer Modus&lt;br /&gt;
 -unknown- (1) = ??? (Standard = 1) (Auch im Datenblatt von IA4420 so beschrieben)&lt;br /&gt;
 s = (DataFilter) Typ des Datenfilters (0=DigitalFilter / 1=AnalogFilter).&lt;br /&gt;
     Bei Nutzung des Analog-Filters kann kein FIFO sowie kein ClockRecovery genuzt werden.&lt;br /&gt;
 -unknown- (1) = ??? (Standard = 1) (Auch im Datenblatt von IA4420 so beschrieben)&lt;br /&gt;
 f... = (DQD Threshold) Bestimmt den Schwellwert, ab dem ein Signal als gut empfunden wird,&lt;br /&gt;
         und der Empfänger dieses weiterverarbeiten soll.&lt;br /&gt;
         DQD (data quality detection) zählt die &amp;quot;Spikes&amp;quot; des ungefilterten Signals, und bestimmt darüber die Qualität der Daten.&lt;br /&gt;
&lt;br /&gt;
=== FIFO und RESET-Mode ===&lt;br /&gt;
 Hex = ca &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 11001010 | f3 | f2 | f1 | f0 | sp | al | ff | dr&lt;br /&gt;
 f... = (FIFO interrupt Level) Anzahl der bits im FIFO, die einen Interrupt auslösen sollen&lt;br /&gt;
 sp = (Sync-Pattern length) Legt die Länge des Synchron-Patterns fest&lt;br /&gt;
      (0 = 2Byte / 1 = 1Byte)&lt;br /&gt;
 al = (FIFO Fill Condition) Legt den Wert fest, ab dem das Füllen des FIFOs beginnt.&lt;br /&gt;
      (0=Synchron / 1=Ständig). Bei Nutzung des Synchron-Modus, werden erst dann Daten in den FIFO geschrieben,&lt;br /&gt;
      wenn eine definierte 8-Bit od. 16-Bit lange Datenfolge empfangen wurde (Standard ist Hex: 2dd4,&lt;br /&gt;
      das LSB kann geändert werden und stellt das 8-Bit Synchron-Pattern dar).&lt;br /&gt;
 ff = (FIFO Fill) Startet das Einlesen der empfangenen Daten in den FIFO-Puffer.&lt;br /&gt;
      Wenn al (FIFO Fill Condition) auf synchron steht, dann startet das Setzen dieses Bits die Synchronisation-Bit-Erkennung.&lt;br /&gt;
 dr = (Sens Reset Mode) Wenn dieses Bit auf 0 steht, wird bei einer Schwankung von 200mV auf&lt;br /&gt;
      der VCC-Leitung (Spannungsversorgung des Chips), ein System-Reset ausgelöst.&lt;br /&gt;
&lt;br /&gt;
=== Automatic Frequency Control ===&lt;br /&gt;
 Hex = c4 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 11000100 | a1 | a0 | rl1 | rl0 | st | fi | oe | en&lt;br /&gt;
 a... = Modus der AFC-Schaltung, 0=Auto off, 1=einmalig nach Einschalten, 2=Solange VDI low ist, 3=unabhängig von VDI&lt;br /&gt;
 r... = (Range Limit) Frequenzraster (00=KeineBegrenzung / 01=+15 &amp;gt; -16 / 10=+7 &amp;gt; -8 / 11=+3 &amp;gt; -4)&lt;br /&gt;
 st = Berechneten Offset-Wert übernehmen&lt;br /&gt;
 fi = Genauer Berechnungsmodus (besser aber lansgamer)&lt;br /&gt;
 oe = AFC-Offset freischalten&lt;br /&gt;
 en = AFC-Berechnung aktivieren&lt;br /&gt;
&lt;br /&gt;
=== TX Configuration Control ===&lt;br /&gt;
&lt;br /&gt;
* Hex = 98xx (99xx, da nur die 7 MSB fix sind)&lt;br /&gt;
&lt;br /&gt;
Bit-Syntax:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| POR || 0x9 || 0x8 || 0x0 || 0x0 &lt;br /&gt;
|-&lt;br /&gt;
| Nilbbes || 1001 || 100 mp || m3 m2 m1 m0 || 0 p2 p1 p0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Bitfelder:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| mp || Modulation Polarity || Bestimmt die Richtung der FSK-Erzeugung (invertiert das Spektrum).&lt;br /&gt;
|-&lt;br /&gt;
| m&#039;&#039;n&#039;&#039; || frequency deviation || Bestimmt den Frequenzabstand des High- und Low-Wertes bei der Übertragung im FSK-Betrieb. Basis ist der mp-Wert.&lt;br /&gt;
|-&lt;br /&gt;
| 0 || unknown || immer 0 (Auch im Datenblatt von IA4420 so beschrieben)&lt;br /&gt;
|-&lt;br /&gt;
| p&#039;&#039;n&#039;&#039; || relative output power || Bestimmt die relative Ausgangsleistung des Senders anhand des dBm-Wertes (Dezibel [Grösse: Milliwat]) 3-dBm-Schritte. (000=0 / 001=-3 / 010=-6 .. 111=-21 dBm). Der Wert steht im Zusammenhang mit der angeschlossenen Antennen-Impedanz.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Wake-Up Timer ===&lt;br /&gt;
 Bestimmt die Zeitperiode der zyklischen Einschaltung des WakeUp-Timers.&lt;br /&gt;
 Nach Ablauf der Zeitperiode erfolgt ein WKUP interrupt, der zB. zum Aufwecken eines Mikrocontrollers verwendet werden kann.  &lt;br /&gt;
 Hex = e &amp;amp; xxx&lt;br /&gt;
 Bit-Syntax: 111 | R4 | R3 | R2 | R1 | R0 | M7 | M6 | M5 | M4 | M3 | M2 | M1 | M0&lt;br /&gt;
 R = Exponent der Zeit&lt;br /&gt;
 M = Zeit&lt;br /&gt;
&lt;br /&gt;
=== Low Duty-Cycle ===&lt;br /&gt;
&lt;br /&gt;
 Hiermit kann der Empfänger, cyklisch ein- bzw ausgeschaltet werden. Er kann damit die eingestellte Frequenz &amp;quot;überwachen&amp;quot;.&lt;br /&gt;
 Dies wirkt sich stark auf die Stromaufnahme des Moduls bei Batteriebetrieb aus.&lt;br /&gt;
 Mit dem WakeUp Timer wird die Einschaltfrequenz des Empfängers eingestellt (zB. alle 500ms) und mit dem Low Duty Cycle&lt;br /&gt;
 wird bestimmt, wie lange  der Empfänger dann aktiv sein soll (zb. 30% von 500ms = 150ms.&lt;br /&gt;
 Werden während der On-Periode gültige Daten empfangen, bleibt der Empfänger bis zum Ende der Aussendung aktiv.&lt;br /&gt;
 Der WakeUp Timer muß zur Nutzung des Low Duty Cycles weder aktiviert sein, noch muss er in jedem Zyklus zurückgesetzt werden.    &lt;br /&gt;
&lt;br /&gt;
 hex = 6400 + Bits&lt;br /&gt;
 Bit-Syntax: 11001000 | d6 | d5 | d4 | d3 | d2 | d1 | d0 | en&lt;br /&gt;
 d... = Einschaltdauer während der zyklischen Einschaltung&lt;br /&gt;
 en = zyklische Einschaltung aktivieren&lt;br /&gt;
&lt;br /&gt;
=== RX FIFO Read ===&lt;br /&gt;
 Hex = b000&lt;br /&gt;
 Bit-Syntax: 1011000000000000&lt;br /&gt;
&lt;br /&gt;
Dieses Kommando löst die Rückgabe eines Datenbytes (synchron mit dem 8. Bit) aus. Es ist nötig, dass das ef-Bit (RX-FIFO) im Configuration Setting gesetzt wurde, um diese Funktion nutzen zu können!&lt;br /&gt;
&lt;br /&gt;
=== TX Register Write ===&lt;br /&gt;
Dieses Kommando schreibt Daten in den TX-Puffer. Wenn der Sender aktiv ist, wird dieses sofort gesendet. el (TX-Register) muss im Configuration-Setting-Kommando aktiv sein.&lt;br /&gt;
 Hex = b8 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 10111000 | DataByteToSend&lt;br /&gt;
 DataByteToSend = Das Datenbyte, welches gesendet werden soll.&lt;br /&gt;
&lt;br /&gt;
(Senden Funktioniert nur wenn zuvor der Status abgefragt wurde)&lt;br /&gt;
&lt;br /&gt;
=== Status Read ===&lt;br /&gt;
Dieses Kommando löst die Rückgabe des Statusregisters aus, welches nach der ersten 0 im ersten Bit synchron übertragen wird.&lt;br /&gt;
 Hex = 0000&lt;br /&gt;
 Bit-Syntax: 0000000000000000&amp;lt;000&amp;gt;&lt;br /&gt;
 Rückgabe-Syntax: x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | x10 | x11 | x12 | x13 | x14 | x15 | x16 | x17 | x18&lt;br /&gt;
 x0 -&amp;gt; x5 = Interrupt bits&lt;br /&gt;
 x6 -&amp;gt; x15 = Status Bits&lt;br /&gt;
 x16 -&amp;gt; x18 = FIFO&lt;br /&gt;
 x0 = FFIT / RGIT (RGIT = TX-Register ist bereit neue Daten zu senden ... kann mit dem TX-Register gelöscht werden)&lt;br /&gt;
     (FFIT = Die Anzahl der Datenbits im FIFO-Puffer hat das eingestellte Limit erreicht.&lt;br /&gt;
      Kann mit einer der FIFO-Lesemethoden gelöscht werden)&lt;br /&gt;
 x1 = POR (PowerOnReset)&lt;br /&gt;
 x2 = FFOV / RGUR (RGUR = Der Datenstrom beim Senden ist abgerissen, da nicht schnell genug Daten nachgeladen wurden)&lt;br /&gt;
      (FFOV = Der RX-FIFO ist übergelaufen)&lt;br /&gt;
 x3 = WKUP&lt;br /&gt;
 x4 = EXT (Externer IRq vom nINT-Pin)&lt;br /&gt;
 x5 = LBD (Low Battery Detected)&lt;br /&gt;
 x6 = FFEM (Der FIFO-Puffer ist leer/EMpty)&lt;br /&gt;
 x7 = RSSI/ATS (ATS = )(RSSI = Die Signalstärke ist über dem eingestelltem Limit)&lt;br /&gt;
 x8 = DQD&lt;br /&gt;
 x9 = CRL&lt;br /&gt;
 x10 = ATGL&lt;br /&gt;
 x11 = OFFS_6 (sign of offset)&lt;br /&gt;
 x12 = OFFS_3&lt;br /&gt;
 x13 = OFFS_2&lt;br /&gt;
 x14 = OFFS_1&lt;br /&gt;
 x15 = OFFS_0&lt;br /&gt;
 x16 = FO&lt;br /&gt;
 x17 = FO+1&lt;br /&gt;
 x18 = FO+2&lt;br /&gt;
&lt;br /&gt;
== Einstellungen für maximale Reichweite ==&lt;br /&gt;
&lt;br /&gt;
Für eine maximale Reichweite eignen sich folgende Einstellungen:&lt;br /&gt;
* Bitrate: 2k - 10kbit/s.&lt;br /&gt;
* Receiver Baseband Bandwidth: 134kHz&lt;br /&gt;
* RSSI Threshold: -97dBm&lt;br /&gt;
* LNA gain: 0dB. Falls in der Gegend Störer im gleichen Frequenzbereich sind, dann -6dB, ansonsten kann die Eingangsstufe übersteuern.&lt;br /&gt;
* FSK frequency deviation: +/-90kHz&lt;br /&gt;
* Output Power: 0dB&lt;br /&gt;
&lt;br /&gt;
Und vor allem: Eine gute (Richt-) Antenne.&lt;br /&gt;
&lt;br /&gt;
== Quarzfrequenz ändern==&lt;br /&gt;
Im Datenblatt wird die Verwendung eines 10 MHz-Quarzes empfohlen. Man darf die Frequenz aber nach oben und unten variieren, wie Messungen mit einem DDS-Generators anstelle des Quarzes zeigen: [[Media:PLL-Rastbereich_log.pdf|PLL-Einrast-Tabelle]]. Eine [[Media:RFM12Quarz.pdf|Tabelle: Quarzfrequenzen von 8,5-11 MHz]] zeigt die damit erreichbaren Frequenzen. Quarze für 3. oder auch 5.Oberton sollten auch auf ihrer Grundfrequenz verwendbar sein, dafür bieten sich u.a. CB-Funk- und 10m-Amateurbandquarze an. &lt;br /&gt;
&lt;br /&gt;
Den Einfluß der vier unteren Bits im Configuration Setting Register und des mp-Bits (Modulations-Polarität?) auf die PLL-Frequenz zeigt diese [[Media:Varicap_RFM12.pdf|Kapazitäts-Tabelle]]. Pro Stufe sind es hier etwa 4 kHz, das kann je nach Quarz schwanken. Möglicherweise ist so auch Schmalband-FSK möglich, ohne Änderung des PLL-Teilers.&lt;br /&gt;
&lt;br /&gt;
Was können wir damit anfangen? Neben dem regulären Einsatz auf den beiden zugelassenen Bändern 433 und 868 MHz sind das unter anderem (bitte weitere Ideen einfügen):&lt;br /&gt;
&lt;br /&gt;
* Packet-Radio mit 9600 Baud im 70cm-Amateurband 430-440 MHz. Die einfachste Möglichkeit ist das Programm [http://www.baycom.org/~tom/ham/soundmodem/ Soundmodem], das für Windows und Linux existiert. Wer es komfortabler haben will findet [http://www.dj4uf.de/funktechnik/soundmodem/soundmodem.htm hier] eine Beschreibung wie Soundmodem mit den Programmen [http://www.flexnet.info/ Flexnet] und [http://www.paxon.de Paxon] zusammenarbeitet. Eine Karte der Packet-Radio-Digipeater im 70cm-Band kann man mittels [http://www.hammap.de Hammap] erstellen. Leider werden die Daten in den letzten Jahren nicht mehr sehr gepflegt, es dürften einige Karteileichen enthalten sein.&lt;br /&gt;
&lt;br /&gt;
* Empfang der [http://www.adacom.org/projekte/funkruf/ POCSAG-Funkrufsender] am oberen Ende des Amateurbandes auf  439,9875 MHz 2-FSK mit 4kHz Hub und 1200 bit/s im POCSAG Radio Paging Code 1 [http://home.arcor.de/norbert_n/samsfaq/sams.txt (Liste der Sender, Stand 18.09.07)]. Zur Decodierung existieren mehrere Programme, aufbauend auf [http://www.baycom.org/~tom/ham/linux/multimon.html Multimon] die Weiterentwicklungen [http://www.monitor.mgrohmann.de/ Monitor] und [http://monitord.de/ MonitorD]. Im Prinzip könnte man damit auch die verschlüsselten Wettermeldungen auf 466,23 MHz mitschreiben, aber nicht decodieren.&lt;br /&gt;
&lt;br /&gt;
* Empfang der [http://www.darc.de/vus/digital.html D-Star-Relais]. Das ist eine patentierte digitale Sprach- und Datenübertragung, deren Eigentümer dafür sorgt, dass kein käufliches oder Selbstbaufunkgerät ohne den &amp;quot;AMBE&amp;quot;-Modemchip D-Star senden und empfangen darf. Es gibt eine kleine Ausnahme, das [http://www.darc.de/vus/down/dstar_decode_v02a.zip Programm r00t&#039;s D-Star Decoder V0.2a] für die Soundkarte, das nur Rufzeichen und Datentelegramme der beteiligten Funkamateure darstellt.&lt;br /&gt;
&lt;br /&gt;
* Panoramaempfänger (die Bezeichnung Spektrumanalysator wäre etwas übertrieben) unter Verwendung des analogen RSSI Ausgangs (Anschluß am Kondensator in der Ecke). Damit ließe sich z.&amp;amp;nbsp;B. auch die Bandbelegung im PMR-Bereich 446,0-446,2 MHz oder im Mobilfunkband um 900 MHz anzeigen.&lt;br /&gt;
&lt;br /&gt;
* Pegelanzeige für Mobilfunksender. Im 900 MHz Mobilfunkbereich könnte man mit dem RSSI-Ausgang die umliegenden Funkmasten anpeilen und ihre Pegel anzeigen. Laut Datenblatt nur ein Anzeigeumfang von 35 dB, aber mit umschaltbarem Grundpegel.&lt;br /&gt;
&lt;br /&gt;
* In Verbindung mit einem Frequenzumsetzer lassen sich weitere Frequenzbereiche erschließen, z.&amp;amp;nbsp;B. Packet-Radio im 23cm- (1240-1200 MHz)  und 13cm- (2320-2450 MHz) Amateurband. Leider liegt die Zwischenfrequenz der Satellitentuner (479,5 MHz) schon am oberen Ende des PLL-VCO-Einrastbereiches. Damit wäre ein preiswerter Konverter für 23cm möglich, meistens schon mit I2C-Bus PLL.&lt;br /&gt;
&lt;br /&gt;
* Local Oscillator für einen Empfänger. Mir den ca. 5 Milliwatt des RFM12 läßt sich ein [http://www.mini-circuits.com/products/fm_sm_main.html passiver Diodenringmischer] ansteuern. Damit kann man einen Überlagerungsempfänger oder -sender mit hoher erster Zwischenfrequenz bauen.&lt;br /&gt;
&lt;br /&gt;
== Antennen-Anpaßnetzwerk==&lt;br /&gt;
[[Image:Antennenanpassung.png|thumb|right|400px|Antennen-Anpassnetzwerk im Datenblatt]]&lt;br /&gt;
Soll das RFM12 auf anderen Frequenzen betrieben werden, ist nur eine Änderung des Antennennetzwerks nötig. Das Datenblatt bietet knappe aber ausreichende Informationen.  &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zwischen Pin 12 und 13 liegt eine Spannungsquelle, die ihre maximale Sendeleistung in eine komplexe Last nach der Tabelle &amp;quot;Note4&amp;quot; abgibt. Das bedeutet, ihr Innenwiderstand ist konjugiert-komplex zu dieser Last, also dieselben Zahlenwerte, nur mit Minuszeichen vor dem &amp;quot;j&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Anpassnetzwerk läßt sich auf zwei Bauteile reduzieren: von der Antenne ausgehend, die als reeller 50Ω- Widerstand angenommen wird, ist ein Kondensator in Reihe geschaltet. C8 und C9 (in der Tabelle C9 und C10 bezeichnet) liegen in Reihe und sind gleich groß, dürfen also in einem Kondensator mit der halben Kapazität zusammengefasst werden. Dann liegt noch L1 parallel zur Quelle, L3 hat mehr als den 20-fachen Wert und kann vernachlässigt werden.&lt;br /&gt;
Das ganze läßt sich im Smith-Diagramm gut darstellen.&lt;br /&gt;
&lt;br /&gt;
[[Image:SmithDiagramm.png|thumb|right|400px|Anpassnetzwerk im Smith-Diagramm]]&lt;br /&gt;
&lt;br /&gt;
Von der Antenne im Mittelpunkt ausgehend bewegen wir uns mit dem Serien-C Cs auf einem Kreisbogen nach unten (kapazitive Halbebene) auf den Punkt &amp;quot;Unendlich&amp;quot; rechts außen zu. Ungefähr senkrecht unter dem Zielpunkt, hier für 433 MHz gezeichnet, biegen wir ab auf eine Kreisbahn für die Parallelinduktivität Lp. Sie führt in die obere (induktive) Halbebene auf den Nullpunkt links zu. Der genaue Schnittpunkt beider Kreise kann &amp;quot;mit Zirkel und Lineal&amp;quot; oder einem der [http://www.mikrocontroller.net/articles/Schaltungssimulation#Hochfrequenztechnik Hochfrequenz-Berechnungsprogramme] ermittelt werden.&lt;br /&gt;
&lt;br /&gt;
Die Kreise für Lp oder Cp sind im Smith-Diagramm nicht eingezeichnet , um die Übersicht zu wahren. Man könnte ein gespiegeltes Diagramm darüberlegen, aber stattdessen spiegelt man die Kurve am Diagramm-Mittelpunkt (dünne blaue Kurven). Am Rand kann man jetzt die auf 50Ω (bzw. 1/50Ω für die gespiegelte Kurve) normierten Blindwiderstände ablesen. Für Cs lesen wir eine Differenz zwischen Start und Zielpunkt von etwa Xc=(3,2-0) * 50Ω ab, für Lp sind es (0,25 +0,32) = 0,57*(1/50Ω). Damit erhalten wir Cs=1/(2*Pi*f*Xc)=2,3 pF das war wie gesagt die halbe Kapazität der beiden hintereinandergeschalteten Kondensatoren, Tabellenwert ist 4,7pF und Lp=1/(2*Pi*f*0,57*(1/50))= 32,2 nH, der Tabellenwert ist 27nH.&lt;br /&gt;
&lt;br /&gt;
[[Image:Antennenanpassung_RF12.png|thumb|right|400px|Anpassnetzwerk im Datenblatt zu RF12]]&lt;br /&gt;
[[Image:Smith-Diagramm-RF12.png|thumb|right|400px|Smith-Diagramm zum RF12]]&lt;br /&gt;
Im RF12 wird ein um zwei Bauteile (im Bild C2 und L1 genannt) erweitertes Netzwerk empfohlen, das macht man um eine breitbandigere Anpassung zu erreichen.&lt;br /&gt;
&lt;br /&gt;
== Betriebsspannung==&lt;br /&gt;
Achtung nicht alle Module sind für 5V geeignet, alle Typen mit &amp;quot;B&amp;quot; am Ende sind nur für 3,3V. Man muß dann entweder den Mikrocontroller ebenfalls mit 3,3V betreiben, oder [http://www.mikrocontroller.net/articles/Pegelwandler Pegelwandler] verwenden.&lt;br /&gt;
&lt;br /&gt;
== Messungen ==&lt;br /&gt;
Drei Messungen am RFM12 zeigen den Einfluß von Eingangpegel, Frequenzhub und Mittenfrequenz auf das Ausgangssignal, gemessen am Filterkondensator CFIL. Zwei weitere Kurven zeigen die ARSSI-Spannung (Anschluß am Kondensator in der Ecke) und die damit gemessene Filterkurve.&lt;br /&gt;
[[Image:RFM12_Eingangspegel.png|thumb|right|800px|Messungen am RFM12 Änderung des Eingangspegels]]&lt;br /&gt;
[[Image:RFM12_Frequenzhub.png|thumb|right|800px|Messungen am RFM12 Änderung des Frequenzhubs]]&lt;br /&gt;
[[Image:RFM12_Mittenfrequenz.png|thumb|right|800px|Messungen am RFM12 Änderung der Mittenfrequenz]]&lt;br /&gt;
[[Image:RFM12_ARSSI_und_Filterkurve.png|thumb|right|200px|Messungen am RFM12 ARSSI_und_Filterkurve]]&lt;br /&gt;
&lt;br /&gt;
Was folgt aus diesen Messungen?&lt;br /&gt;
* Der ARRSI-Anschluß zeigt uns über mehr als 100 kHz ein Sendesignal an. Decodierbar ist es aber nur im Abstand von weniger als 5 kHz von der Mittenfrequenz. Ohne Abgleich von Sender und Empfänger ist also die AFC unverzichtbar.&lt;br /&gt;
* Das &amp;quot;Loch&amp;quot; in der Mitte der Durchlaßkurve stammt von dem im Datenblatt gezeigten Hochpass &amp;quot;&amp;gt; 7 kHz&amp;quot;. Für ein unmoduliertes Sendesignal geht die ARSSI-Spannung fast auf den Rauschpegel herunter, hier wurde mit +/-15kHz moduliert. &lt;br /&gt;
* Damit läßt sich der Empfänger abgleichen. Man braucht dazu nur ein unmoduliertes Sendesignal auf der Sollfrequenz. Das kann ein mittels Frequenzzähler abgeglichenes zweites RFM12 sein. Der Empfängerquarz wird mit den 4 Bit für die Oszillatorkapazität genau auf dieses &amp;quot;Loch&amp;quot; der ARRSI-Spannung eingestellt.&lt;br /&gt;
&lt;br /&gt;
Die AFC-Messdauer ist im Datenblatt nicht genannt, eine schnelle Abfrage des ATGL-Bit im Statusregister im &amp;quot;Auto-AFC&amp;quot; - Modus liefert minimale Pulsbreiten von ca. 250..270 µsec, entsprechend einer Messfolgefrequenz von 4 kHz - leider nicht ausreichend um 9600 Baud Schmalband-FM zu demodulieren. Im Auto-Modus werden zwei Messungen zusammengefasst, damit beträgt die Updaterate sogar nur 2 kHz. Weitere Messung : ab etwa +/-10 kHz Hub synchronisiert sich das ATGL-Bit auf der Mittenfrequenz mit einem bis zu 1,8...2 kHz FM-modulierten Signal.&lt;br /&gt;
&lt;br /&gt;
Neue Idee: &amp;quot;Dithering und FM-Flankendemodulator&amp;quot;: &amp;lt;br&amp;gt; &lt;br /&gt;
Wenn das Empfangssignal nicht weit genug FM-moduliert ist, müssen wir eben den Empfänger modulieren. Im Timer-Interrupt wird die Quarzkapazität oder die PLL z.&amp;amp;nbsp;B. mit 38,4 oder 76,8 kHz und mindestens +/-15kHz Hub umgeschaltet, sodaß bei Empfang eines unmodulierten Signals am CFIL-Ausgang ein symmetrisches Rechteck dieser Frequenz erscheint. Ist das Empfangssignal schmalbandig FM-moduliert, und man stimmt den Empfänger leicht daneben ab, so sollte das CFIL-Signal mit dieser Modulation PWM-moduliert sein. Ein Tiefpass filtert die Dithering-Frequenz weg und übrig bleibt (wenns funktioniert) die Modulation, vielleicht sogar analoger Sprechfunk...&lt;br /&gt;
Motto &amp;quot;Engineering is the art of making what you want from things you can get.&amp;quot; (von http://www.dsprelated.com)&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen ==&lt;br /&gt;
* [[Elektronikversender#csd-electronics|csd-electronics]]&lt;br /&gt;
* [[Elektronikversender#IT-WNS|IT-WNS]]&lt;br /&gt;
* [[Elektronikversender#Pollin_Electronic|Pollin Electronic]]&lt;br /&gt;
* [[Elektronikversender#RS_Components|RS Components]]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [[AVR RFM12]]&lt;br /&gt;
* [[RFM12 Protokoll Stack]]&lt;br /&gt;
* [[RF_SOAP]]&lt;br /&gt;
* [[ Pollin_Funk-AVR-Evaluationsboard]]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/93801 Bezugsquellen]&lt;br /&gt;
* [http://www.das-labor.org/wiki/RFM12_library Library zur Ansteuerung des RFM12]&lt;br /&gt;
* [http://www.compotron.com/daten/any/IA4420.pdf Datenblatt des Chipherstellers Integration IA4420.pdf]&lt;br /&gt;
* [https://www.silabs.com/Support%20Documents/TechnicalDocs/Si4420.pdf Silabs hat Integration im Juni 2008 gekauft, Chipbezeichnung jetzt Si4420]&lt;br /&gt;
Folgende Links sind mit Vorsicht zu genießen, da die Datenblätter teilweise  fehlerbehaftet sind. Es empfiehlt sich, direkt mit dem Datenblatt des RF12 (das ist das IC auf dem Modul) zu arbeiten. Dieses ist so gut wie fehlerfrei.&lt;br /&gt;
&lt;br /&gt;
* [http://www.hoperf.com/upload/rf/RF12.pdf Datenblatt des ICs RF12] (PDF)&lt;br /&gt;
* [http://www.hoperf.com/upload/rf/RFM12.pdf Datenblatt des Moduls RFM12] (PDF)&lt;br /&gt;
* [http://www.hoperf.com/upload/rf/RF12_code.pdf Programming Guide] (PDF)&lt;br /&gt;
* [http://www.hoperf.com/upload/rf/RF12TOOLS.pdf Demo Kit User Manual] (PDF)&lt;br /&gt;
* [http://www.pollin.de/shop/downloads/D810047S.ZIP Beispielprogramm von Pollin] (ZIP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Bauteile]]&lt;br /&gt;
[[Kategorie:RFM12| ]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=USB&amp;diff=65133</id>
		<title>USB</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=USB&amp;diff=65133"/>
		<updated>2012-03-21T14:38:24Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Spezielle USB-µC */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;U&#039;&#039;&#039;niversal &#039;&#039;&#039;S&#039;&#039;&#039;erial &#039;&#039;&#039;B&#039;&#039;&#039;us.&lt;br /&gt;
&lt;br /&gt;
Serieller Bus, der heutzutage an jedem neuen PC zu finden ist und langsam aber sicher die RS-232- und Parallelport-Anschlüsse ersetzt.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Übertragungsgeschwindigkeiten:&lt;br /&gt;
* Low Speed: 1,5 MBit/s (USB 1.1 und 2.0)&lt;br /&gt;
* Full Speed: 12 MBit/s (USB 1.1 und 2.0)&lt;br /&gt;
* High Speed: 480 MBit/s (nur USB 2.0)&lt;br /&gt;
* SuperSpeed: 5 GBit/s (nur USB 3.0)&lt;br /&gt;
Die in Datenblättern oder Verpackungen gern verwendete Angabe &amp;quot;USB 2.0 Full Speed&amp;quot; darf man also nicht wörtlich verstehen, das sind trotz USB 2.0 nur 12 Mbit/s.&lt;br /&gt;
&lt;br /&gt;
Zu beachten ist, dass es bei USB im Gegensatz zu [[RS-232]] zwei Arten von Controllern gibt: Host- und Devicecontroller. Host bezeichnet dabei die steuernde Seite und ist z.&amp;amp;nbsp;B. in PCs zu finden; Devices sind die USB-Geräte, z.&amp;amp;nbsp;B. USB-Webcams. Diese Unterscheidung ist ziemlich wichtig, weil die meisten USB-Lösungen für [[Mikrocontroller]] USB-Devices darstellen und man deswegen dort weder Webcams noch USB-Speichersticks anschliessen kann. Mit der letzten Ergänzung des Standards (USB On-The-Go) gibt es die begrenzte Möglichkeit, dass Geräte Host-Funktionalität zur Kommunikation mit ausgewählten Peripheriegeräten erhalten.&lt;br /&gt;
&lt;br /&gt;
Benutzt man ein USB-Device am PC, dann braucht man auch noch passende Treiber. Die aktuellen Betriebssysteme bringen meist eine Reihe von Treibern für Standardanwendungen (z.&amp;amp;nbsp;B. USB-Festplatte) mit. Gibt es keinen passenden Standardtreiber, dann muss man eben einen erstellen. Dazu werden bei manchen Chips kostenlose Treiber mitgeliefert, bei anderen muss man sie kaufen oder (aufwendig) selbst erstellen.&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Informationen ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.usb.org/home USB-Hauptseite] Die Homepage des USB Implementers Forum, Inc., creators of USB technology.&lt;br /&gt;
* [http://libusb.sourceforge.net/ libusb] Allgemein ist die Treiberprogrammierung für USB das Hauptproblem. Die plattformübergreifende libusb ([http://libusb-win32.sourceforge.net/ Win32-Port (nicht Vista!)]) ermöglicht die Kommunikation mit USB-Geräten unter Verwendung eines Universaltreibers. Ein deutschsprachiges Projekt, erstellt von [http://www.weinga-unity.at.tt Weichinger Klaus], das libusb verwendet, findet man unter [http://www.ime.jku.at/tusb/] (Programmiersprache C mit MINGW; Dokumentation, Sourcecode und Binärdateien).&lt;br /&gt;
* [http://halvar.at/elektronik/usb/arnold_da.pdf Diplomarbeit von Eik Arnold] Viele Informationen über USB (Vergleich mit anderen Bussystemen, Elektrisches Interface, Transferarten, Übersicht über die verschiedenen USB Chips, ...)&lt;br /&gt;
* [http://www.beyondlogic.org/usbnutshell/usb1.htm USB in a NutShell] Eine kleine Wanderung durch die USB-Spezifikation&lt;br /&gt;
* [http://www.b-redemann.de Steuern und Messen mit USB - FT232, 245 und 2232] Das aktuelle Buch zu den USB-Controllern von FTDI. Viele Beispielprogramme in C, zwei Projektbeschreibungen: I2C-Bus mit LM75A und ein Web-Projekt. Bauteilesatz und USB-Modul mit dem FT2232 zum schnellen Einstieg in die Thematik. Buch / Teilesatz über Segor oder dieser Seite erhältlich.&lt;br /&gt;
&lt;br /&gt;
== USB-Hostcontroller ==&lt;br /&gt;
=== Host-Controller im Mikrocontroller ===&lt;br /&gt;
Es gibt eine erfreuliche Anzahl geeigneter Schaltkreise, nur für den Amateur unschön beschaffbar. Entsprechend der USB-Spezifikation kann jeder Full-Speed-Hostcontroller auch mit Low-Speed arbeiten.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;sortable&amp;quot; id=&amp;quot;usb_controller&amp;quot; style=&amp;quot;border-collapse:collapse;&amp;quot;&lt;br /&gt;
!Hersteller&lt;br /&gt;
!IC&lt;br /&gt;
!Speed&lt;br /&gt;
!Pins&lt;br /&gt;
!Ucc/Uio&lt;br /&gt;
!CPU&lt;br /&gt;
!Takt&lt;br /&gt;
!Flash&lt;br /&gt;
!RAM&lt;br /&gt;
!ADU&lt;br /&gt;
!DAU/PWM&lt;br /&gt;
!Async&lt;br /&gt;
!Sync&lt;br /&gt;
!Extras&lt;br /&gt;
!Bezug&lt;br /&gt;
|-&lt;br /&gt;
| [http://mcu.emea.fujitsu.com/ Fujitsu]&lt;br /&gt;
| MB96F338U&lt;br /&gt;
| Full&lt;br /&gt;
| 144&lt;br /&gt;
| 3-5 V&lt;br /&gt;
| 16bit / 16FX Core&lt;br /&gt;
| 4 MHz extern&lt;br /&gt;
| 544Kbyte &lt;br /&gt;
| 32Kbyte &lt;br /&gt;
| 36x10bit&lt;br /&gt;
| 20xPWM, 12xOCU&lt;br /&gt;
| 8&lt;br /&gt;
| 8&lt;br /&gt;
| 3xCAN, 2xI²C&lt;br /&gt;
| [http://www.glyn.de/ Glyn], [http://www.ebv.com/ EBV]&lt;br /&gt;
|-&lt;br /&gt;
| [http://mcu.emea.fujitsu.com/ Fujitsu]&lt;br /&gt;
| MB90F334&lt;br /&gt;
| Full&lt;br /&gt;
| 120&lt;br /&gt;
| 3,3 V&lt;br /&gt;
| 16bit / 16LX Core&lt;br /&gt;
| 4 MHz extern&lt;br /&gt;
| 384Kbyte &lt;br /&gt;
| 24Kbyte &lt;br /&gt;
| 16x10bit&lt;br /&gt;
| 6xPWM, 4xOCU&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 3xI²C&lt;br /&gt;
| Glyn, EBV&lt;br /&gt;
|-&lt;br /&gt;
| [http://mcu.emea.fujitsu.com/ Fujitsu]&lt;br /&gt;
| MB90F337&lt;br /&gt;
| Full&lt;br /&gt;
| 64&lt;br /&gt;
| 3,3 V&lt;br /&gt;
| 16bit / 16LX Core&lt;br /&gt;
| 4 MHz extern&lt;br /&gt;
| 64Kbyte &lt;br /&gt;
|  4Kbyte &lt;br /&gt;
| -&lt;br /&gt;
| 4xPWM&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 1xI²C&lt;br /&gt;
| Glyn, EBV&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.cypress.com/ Cypress]&lt;br /&gt;
| CY7C67300&lt;br /&gt;
| Full&lt;br /&gt;
| 100&lt;br /&gt;
| 3,3 V&lt;br /&gt;
| 16bit RISC&lt;br /&gt;
| 48 MHz&lt;br /&gt;
| 4K x 16bit OTP&lt;br /&gt;
| 8K x 16bit&lt;br /&gt;
| -&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| IDE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.atmel.com/ Atmel]&lt;br /&gt;
| AT90USB647&lt;br /&gt;
| Full&lt;br /&gt;
| 64&lt;br /&gt;
| 3,3 - 5 V&lt;br /&gt;
| AVR&lt;br /&gt;
| 16 MHz&lt;br /&gt;
| 64 K&lt;br /&gt;
| 4 K&lt;br /&gt;
| 8 x 10 bit&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [http://de.farnell.com Farnell] ca. 11,42 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.atmel.com/ Atmel]&lt;br /&gt;
| AT32UC3B0128&lt;br /&gt;
| Full/OTG&lt;br /&gt;
| 64 (40)&lt;br /&gt;
| 3,3 V&lt;br /&gt;
| AVR32&lt;br /&gt;
| 60 MHz&lt;br /&gt;
| 128 K&lt;br /&gt;
| 32 K&lt;br /&gt;
| 8 x 10 bit&lt;br /&gt;
| (7+6) x PWM&lt;br /&gt;
| 2 (1x full)&lt;br /&gt;
| I²C, SPI, SSC&lt;br /&gt;
| Kernspannungsregler 1,8 V&lt;br /&gt;
| [http://de.farnell.com Farnell] ca. 6 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.microchip.com/ Microchip]&lt;br /&gt;
| PIC24FJ256GB106&lt;br /&gt;
| Full&lt;br /&gt;
| 64&lt;br /&gt;
| 3,3V/5V&lt;br /&gt;
| PIC24&lt;br /&gt;
| 16 MHz&lt;br /&gt;
| 64 KB&lt;br /&gt;
| 16 KB&lt;br /&gt;
| 10bit&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|&lt;br /&gt;
| Spannungsregler&lt;br /&gt;
| [http://de.farnell.com Farnell] ca. 5,70 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.microchip.com/ Microchip]&lt;br /&gt;
| PIC32MX420FxxxH&lt;br /&gt;
| Full&lt;br /&gt;
| 64&lt;br /&gt;
| 3,3V/5V&lt;br /&gt;
| MIPS32&lt;br /&gt;
| 80 MHz&lt;br /&gt;
| ab 32 KB&lt;br /&gt;
| 8 - 32 KB&lt;br /&gt;
| 16 x 10bit&lt;br /&gt;
| -&lt;br /&gt;
| 1 mit IRDA&lt;br /&gt;
|&lt;br /&gt;
| Spannungsregler, JTAG&lt;br /&gt;
| [http://de.farnell.com Farnell] ca. 4,83 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.nxp.com/ Philips/NXP]&lt;br /&gt;
| LPC2388&lt;br /&gt;
| Full&lt;br /&gt;
| 144&lt;br /&gt;
| 3,3V/5V&lt;br /&gt;
| ARM7&lt;br /&gt;
| 72MHz&lt;br /&gt;
| 512KB&lt;br /&gt;
| 32KB&lt;br /&gt;
| 8 x 10bit&lt;br /&gt;
| 1 x 10bit, 6 PWM&lt;br /&gt;
| 2 USART, 2 CAN&lt;br /&gt;
| SPI, I²C, SSC&lt;br /&gt;
| SD/MMC, Ethernet 10 Mbit, Businterface, JTAG&lt;br /&gt;
| [http://de.digikey.com/ Digikey] ca. 8 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.st.com/ ST]&lt;br /&gt;
| STM32F10x&lt;br /&gt;
| Full&lt;br /&gt;
| 36..144&lt;br /&gt;
| 3,3V/5V&lt;br /&gt;
| Cortex-M3&lt;br /&gt;
| 72MHz&lt;br /&gt;
| 512KB&lt;br /&gt;
| 64KB&lt;br /&gt;
| 21 x 12bit&lt;br /&gt;
| 2 x 12bit, 32 PWM&lt;br /&gt;
| 5 USART, 1 CAN&lt;br /&gt;
| SPI, I²C, SSC&lt;br /&gt;
| Siehe Artikel [[STM32]]&lt;br /&gt;
| [http://de.farnell.com/ Farnell] ab ca. 5 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.st.com/ ST]&lt;br /&gt;
| STM32F4xx&lt;br /&gt;
| Full + Hi&lt;br /&gt;
| 64..176&lt;br /&gt;
| 3,3V/5V&lt;br /&gt;
| Cortex-M4&lt;br /&gt;
| 168MHz&lt;br /&gt;
| 1024KB&lt;br /&gt;
| 192KB&lt;br /&gt;
| 24 x 12bit&lt;br /&gt;
| 2 x 12bit, 32 PWM&lt;br /&gt;
| 6 USART, 2 CAN&lt;br /&gt;
| SPI, I²C, SSC&lt;br /&gt;
| Siehe Artikel [[STM32]]&lt;br /&gt;
| [http://de.mouser.com/ Mouser] ab ca. 7 €&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Alle mit „USB OTG“ beworbenen Schaltkreise sind als Host-Controller&lt;br /&gt;
&#039;&#039;und&#039;&#039; Device-Controller verwendbar. Mikrocontroller mit High-Speed-USB sind selten.&lt;br /&gt;
&lt;br /&gt;
=== Implementierung in Software auf Atmel AVR ===&lt;br /&gt;
Solche Hostcontroller sind nur für Low-Speed-Geräte geeignet, in der Regel Tastaturen, Mäuse und ggf. Joysticks oder ähnliche HID-Geräte.&lt;br /&gt;
&lt;br /&gt;
* [http://www.asahi-net.or.jp/~qx5k-iskw/robot/usbhost.html Reine Softwarelösung, kann nur USB Low Speed] (Seite auf japanisch, mit [http://babelfish.altavista.com/ Babelfish] übersetzen lassen). &lt;br /&gt;
* [http://instruct1.cit.cornell.edu/courses/ee476/FinalProjects/s2007/blh36_cdl28_dct23/blh36_cdl28_dct23/index.html SIAM32 USB HC] - Software Implemented Atmel Mega32 Universal Serial Bus Host Controller (Atmega32, GPL)&lt;br /&gt;
&amp;lt;!-- * [http://obdev.at/products/avrusb/index-de.html OpenSource Lösung] OpenSource Lösung auf http://obdev.at (Nur USB Device, kein USB Host) --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Software-Implementierungen auf anderen Mikrocontrollern scheitern wegen zu geringer Taktfrequenzen bzw. Durchsatzraten (speziell interessant wäre MSP430 gewesen), oder – bei leistungsstärkeren Controllern – wegen Sinnlosigkeit durch Verfügbarkeit von Mikrocontrollern mit USB (siehe oben).&lt;br /&gt;
&lt;br /&gt;
=== Spezielle Schaltkreise ===&lt;br /&gt;
&lt;br /&gt;
USB-Schaltkreise, die vorzugsweise für den Anschluss an ein „Externes Businterface“ eines Mikrocontrollers oder per [[SPI]] vorgesehen sind.&lt;br /&gt;
&lt;br /&gt;
* [http://www.nxp.com/products/connectivity/usb/products/index.html#hostc Produkte von NXP] (ehem.Philips), bspw. ISP1760&lt;br /&gt;
* [http://www.cypress.com/ Cypress]  &amp;lt;tt&amp;gt;SL811HST&amp;lt;/tt&amp;gt; (Host/Device/OTG möglich)&lt;br /&gt;
* VNC1L von [http://www.vinculum.com/ Vinculum]&lt;br /&gt;
* [http://www.maxim-ic.com/quick_view2.cfm/qv_pk/3639 MAX3421E] z.&amp;amp;nbsp;B. verwendet im [http://www.circuitsathome.com/category/mcu/arduino/usb-shield Arduino USB Host Shield] von Circuits@Home&lt;br /&gt;
&lt;br /&gt;
Es gibt eine Reihe Schaltkreise, die einen PCI-Bus haben. Diese sind für Mikrocontrollerprojekte in der Regel nicht zu gebrauchen.&lt;br /&gt;
&lt;br /&gt;
Dazu gibt es:&lt;br /&gt;
&lt;br /&gt;
* [http://www.embedded-projects.net/usbport Freier USB-Stack für Embedded Systeme] (LGPL)&lt;br /&gt;
&lt;br /&gt;
=== Fertige Module mit einem USB-Host ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.vinculum.com/prd_vdip1.html VDIP1] von FTDI (UART, SPI und parallel)&lt;br /&gt;
* [http://www.elv.de/output/controller.aspx?cid=74&amp;amp;detail=10&amp;amp;detail2=20659 STI 100] von elv (UART und SPI)&lt;br /&gt;
* [http://rz-robotics.de/z-usb.html Z-USB] von rz-robotics (UART und SPI, kann auch stehend montiert werden)&lt;br /&gt;
* [http://www.fischl.de/usbsticklogger/ USBStickLogger] OpenSource-Projekt, Bausatz verfügbar (UART)&lt;br /&gt;
&lt;br /&gt;
== USB-Devices ==&lt;br /&gt;
&lt;br /&gt;
===Implementierung in Software===&lt;br /&gt;
* [http://www.cesko.host.sk/IgorPlugUSB/IgorPlug-USB%20(AVR)_eng.htm IgorPlug-USB - Reine Softwarelösung. Kann nur USB Low Speed (theoretisch 1.5Mbit/s).]&lt;br /&gt;
* [http://www.obdev.at/vusb/ V-USB] - gleiches Prinzip wie IgorPlug, aber Entwickler-Schnittstellen in C, englisch kommentierter Code. Projekt von [http://www.obdev.at/ Objective Development]. Viele Folgeprojekte. Beispielsweise:&lt;br /&gt;
** [http://www.recursion.jp/avrcdc/ AVR-CDC] – Ein USB-RS232C-Interface mittels CDC-Protokoll (Communication Device Class) bspw. mit ATtiny45. Kein Treiber erforderlich, nur .INF-Datei. Von Osamu Tamura.&lt;br /&gt;
** [http://www.recursion.jp/avrcdc/ CDC-IO] Ein experimentelles 18-bit Parallelport mittels AVR-Mikrocontroller (ATmega8/48/88). Von Osamu Tamura.&lt;br /&gt;
** [http://1010.co.uk/avrhid.html AVR-HID] - Low budget USB sensor input into Pure Data/Supercollider and other free softwares based around the ATmega8 microcontroller. This allows for very fast, multiple sensor input at high resolutions on a range of platforms (GNU/Linux, MAC OS X, Windows). Based on workshops with Derek Holzer.&lt;br /&gt;
* [http://www.xs4all.nl/~dicks/avr/usbtiny/ USBtiny] - Programmiergerät für AVR, Lizenz: GPL&lt;br /&gt;
* [http://www.elektor.de/Default.aspx?tabid=27&amp;amp;art=5551005&amp;amp;PN=On AVR steuert USB] und [http://www.elektor.de/Default.aspx?tabid=27&amp;amp;art=5551006&amp;amp;PN=On Universeller USB-Treiber] in der Zeitschrift [http://www.elektor.de Elektor] März 2007. Reine Softwarelösung für ein USB-I/O-Board mit einem ATmega32 und einem [http://libusb-win32.sourceforge.net/ &#039;&#039;open source&#039;&#039; USB Treiber].&lt;br /&gt;
* [http://www.sprut.de/electronic/pic/projekte/usb4all/usb4all.htm USB Client für universelle Steuerungsaufgaben mit PIC18F2455 oder PIC18F2550]&lt;br /&gt;
&lt;br /&gt;
===Spezielle USB-µC===&lt;br /&gt;
&lt;br /&gt;
* Diverse µCs von [http://www.cypress.com/ Cypress], siehe unten&lt;br /&gt;
* TUSBxxxx-Serie von [http://www.ti.com/ Texas Instruments] ebenfalls mit [[8051]]-kompatiblem Mikrocontroller ([http://www.ime.jku.at/tusb/ Beispiel Projekt] von [http://www.weinga-unity.at.tt Weichinger Klaus] (EXPL_DHTML.C  Virus ?))&lt;br /&gt;
* PIC18F2455/2550/4455/4550/67J50/67J55/87J50/87J55 sowie alle PIC24FXXXGBXXX von [http://www.microchip.com/ Microchip], &amp;amp;uuml;ppig ausgestattet mit USB, seriellem Port (RS232/SPI), PWM-Ausg&amp;amp;auml;ngen, A/D-Wandler und vielen IO-Pins&lt;br /&gt;
* [http://www.freescale.com/ Freescale]&lt;br /&gt;
** 69HC908JB8 - 20 Pin DIP . . . MC6&#039;&#039;&#039;8&#039;&#039;&#039;HC908JB8 ?&lt;br /&gt;
** 69HC908JB16 - Mehr Peripherie u.a. RS232&lt;br /&gt;
** 69HC908JG16 - Mit A/D wandler&lt;br /&gt;
** 69HC908JW32 - Mehr Speicher, mehr Ports&lt;br /&gt;
* [[LPC2000]]/3000-Reihe von NXP (LPC2888: High Speed USB 480Mbps)&lt;br /&gt;
* C8051F320 &amp;amp; C8051F340 von Silicon Laboratories (USB, UART, SPI, SMBus, 10-Bit-ADC, Komperator, integr. Spannungsregler &amp;amp; Oszillator)&lt;br /&gt;
* [[AT91SAM]] Familie von Atmel, ARM7-basiert, nicht OTG-fähig&lt;br /&gt;
* [[AVR32]] ([http://www.atmel.com/products/avr/uc3.asp?category_id=163&amp;amp;family_id=607 AT32UC3]A/B) Familie von Atmel mit AVR32-Kern ohne MMU für einfachere Firmware, OTG-fähig, auch High-Speed, Externes Businterface, Ethernet. Alle AT32UC3A or -B&#039;s haben vorprogrammierten USB Device Firmware Upgrade (DFU) bootloader.&amp;lt;ref&amp;gt;http://www.atmel.com/dyn/resources/prod_documents/doc7818.pdf&amp;lt;/ref&amp;gt; &lt;br /&gt;
* [http://www.atmel.com/dyn/products/devices.asp?family_id=607#1761 AT90USB Familie] von Atmel. &lt;br /&gt;
** Eine Experimentierplatine und eine [http://www.ssalewski.de/Misc.html.de GPL Library für den AT90USB1287] gibt es von Dr. Stefan Salewski. Siehe auch Forenbeitrag [http://www.mikrocontroller.net/topic/61499#483966 Anwendersoftware (Generic HID Demo) für den AT90USBKEY].&lt;br /&gt;
** [http://www.fourwalledcubicle.com/LUFA.php LUFA] (Lightweight USB Framework for AVRs) is an open source USB library for the USB-enabled AVR microcontrollers. It is written from scratch and provides an easy to use, clean interface for rapid firmware development (MIT). Alter Name: MyUSB&lt;br /&gt;
** [http://freaklabs.org/index.php/FreakUSB-Open-Source-USB-Device-Stack.html FreakUSB Open Source USB Device Stack] (mod. BSD Lizenz)&lt;br /&gt;
&lt;br /&gt;
Alle hier genannten Mikrocontroller haben keinen USB-Host (nur Client)!&lt;br /&gt;
&lt;br /&gt;
Eine Auswahl:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;sortable&amp;quot; id=&amp;quot;usb_controller&amp;quot; style=&amp;quot;border-collapse:collapse;&amp;quot;&lt;br /&gt;
! Hersteller&lt;br /&gt;
! IC&lt;br /&gt;
! Speed&lt;br /&gt;
! Pins&lt;br /&gt;
! Ucc/Uio&lt;br /&gt;
| CPU Takt&lt;br /&gt;
! Quarz&lt;br /&gt;
! Flash&lt;br /&gt;
! RAM&lt;br /&gt;
! ADU&lt;br /&gt;
! DAU/PWM&lt;br /&gt;
! Async&lt;br /&gt;
! Sync&lt;br /&gt;
! Extras&lt;br /&gt;
! Bezug&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.cypress.com/ Cypress]&lt;br /&gt;
| AN2131&amp;lt;br&amp;gt;AN2135&lt;br /&gt;
| Full&lt;br /&gt;
| 44&lt;br /&gt;
| 3,3V/5V&lt;br /&gt;
| 8051 24MHz&lt;br /&gt;
| 12MHz&lt;br /&gt;
| 0&lt;br /&gt;
| 4KB&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| UART&lt;br /&gt;
| I²C&lt;br /&gt;
|&lt;br /&gt;
| &#039;&#039;&#039;veraltet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.cypress.com/ Cypress]&lt;br /&gt;
| CY7C68013A&lt;br /&gt;
| High&lt;br /&gt;
| 56,100,128&lt;br /&gt;
| 3,3V/5V&lt;br /&gt;
| 8051 48MHz&lt;br /&gt;
| 24MHz Grundton&lt;br /&gt;
| 0&lt;br /&gt;
| 16KB&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| 2 UART&amp;lt;br&amp;gt;(ab 100 Pin)&lt;br /&gt;
| I²C&lt;br /&gt;
| GPIF (State Machine)&lt;br /&gt;
| [http://de.digikey.com/ Digikey] ca. 11,28 €, [http://www.trade-shop.de/catalog/index.php?cPath=72_173 Air Electronics] ca. 9 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.cypress.com/ Cypress]&lt;br /&gt;
| CYUSB3014&lt;br /&gt;
| Super&lt;br /&gt;
| 121 (BGA)&lt;br /&gt;
| 1,8V&lt;br /&gt;
| ARM9&lt;br /&gt;
| ?&lt;br /&gt;
| 0&lt;br /&gt;
| 256KB?&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| 2 UART&lt;br /&gt;
| I²C&lt;br /&gt;
| GPIF II (State Machine)&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| Microchip&lt;br /&gt;
| PIC18F2550&lt;br /&gt;
| Full&lt;br /&gt;
| 28&lt;br /&gt;
|&lt;br /&gt;
| PIC&lt;br /&gt;
| 12MHz&lt;br /&gt;
| 16K x 16bit&lt;br /&gt;
| 2KB&lt;br /&gt;
| 8 x 10bit&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [http://www.reichelt.de/ Reichelt] ca. 7,95 €&lt;br /&gt;
|-&lt;br /&gt;
| Atmel&lt;br /&gt;
| AT91SAM7S64&lt;br /&gt;
| Full&lt;br /&gt;
| 64&lt;br /&gt;
| 3,3V/5V&lt;br /&gt;
| ARM7 55MHz&lt;br /&gt;
| für Bootloader: 18,432MHz&lt;br /&gt;
| 64KB&lt;br /&gt;
| 16KB&lt;br /&gt;
| -&lt;br /&gt;
| 4 PWM&lt;br /&gt;
| 2 USART&lt;br /&gt;
| SPI, I²C, SSC&lt;br /&gt;
| größere Chips auch mit Ethernet&lt;br /&gt;
| [http://www.reichelt.de/ Reichelt] ca. 6,25 €&lt;br /&gt;
|-&lt;br /&gt;
| Philips/NXP&lt;br /&gt;
| LPC2378&lt;br /&gt;
| Full&lt;br /&gt;
| 144&lt;br /&gt;
| 3,3V/5V&lt;br /&gt;
| ARM7 72MHz&lt;br /&gt;
| bspw. 12MHz&lt;br /&gt;
| 512KB&lt;br /&gt;
| 32KB&lt;br /&gt;
| 8 x 10bit&lt;br /&gt;
| 1 x 10bit, 6 PWM&lt;br /&gt;
| 2 USART, 2 CAN&lt;br /&gt;
| SPI, I²C, SSC&lt;br /&gt;
| SD/MMC, Ethernet 10 Mbit, Businterface&lt;br /&gt;
| [http://de.digikey.com/ Digikey] ca. 7,85 €&lt;br /&gt;
|-&lt;br /&gt;
| Texas Instruments&lt;br /&gt;
| MSP430F55xx&lt;br /&gt;
| Full&lt;br /&gt;
| bis 80&lt;br /&gt;
| 3,3V&lt;br /&gt;
| MSP430 25MHz&lt;br /&gt;
| bspw. 24MHz&lt;br /&gt;
| bis 128KB&lt;br /&gt;
| bis 8+2KB&lt;br /&gt;
| 8 x 12bit&lt;br /&gt;
| PWM&lt;br /&gt;
| 2 USART&lt;br /&gt;
| SPI, I²C&lt;br /&gt;
| verschiedene Ausbaustufen&lt;br /&gt;
| [http://www.ti.com/ TI] zurzeit als Muster&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.st.com/ ST]&lt;br /&gt;
| STM32F10x&lt;br /&gt;
| Full&lt;br /&gt;
| 36..144&lt;br /&gt;
| 3,3V/5V&lt;br /&gt;
| Cortex-M3&lt;br /&gt;
| 72MHz&lt;br /&gt;
| 512KB&lt;br /&gt;
| 64KB&lt;br /&gt;
| 21 x 12bit&lt;br /&gt;
| 2 x 12bit, 32 PWM&lt;br /&gt;
| 5 USART, 1 CAN&lt;br /&gt;
| SPI, I²C, SSC&lt;br /&gt;
| Siehe Artikel [[STM32]]&lt;br /&gt;
| [http://de.farnell.com/ Farnell] ab ca. 5 €&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Ucc/Uio&#039;&#039;&#039; gibt die maximale Betriebsspannung und die maximale Eingangsspannung an Eingabeports an. 3,3V/3,3V heißt: nicht 5V-verträglich!&lt;br /&gt;
* &#039;&#039;&#039;Takt:&#039;&#039;&#039; CPU-Taktfrequenz, bei Microchip ehrlicherweise durch 4 geteilt&lt;br /&gt;
* &#039;&#039;&#039;Async:&#039;&#039;&#039; Anzahl und Art der asynchron-seriellen Schnittstellen (also mit Startbit operierend)&lt;br /&gt;
* &#039;&#039;&#039;Sync:&#039;&#039;&#039; Anzahl und Art der synchron-seriellen Schnittstellen (also mit einer Taktleitung, also auch I²C)&lt;br /&gt;
* &#039;&#039;&#039;SSC:&#039;&#039;&#039; Serielles Interface besonders für Audiochips, verschiedene Namen bei den Mikrocontroller-Herstellern&lt;br /&gt;
&lt;br /&gt;
===Via µC ansteuerbare USB-Controller===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;sortable&amp;quot; id=&amp;quot;usb_controller&amp;quot; style=&amp;quot;border-collapse:collapse;&amp;quot;&lt;br /&gt;
! IC&lt;br /&gt;
! Hersteller&lt;br /&gt;
! Host oder Device&lt;br /&gt;
! IC-Pins&lt;br /&gt;
! Interface&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Bezugs-Quelle(n)&lt;br /&gt;
! Sonstiges&lt;br /&gt;
|-&lt;br /&gt;
| FT232&amp;lt;br&amp;gt;FT245&lt;br /&gt;
| [http://www.ftdichip.com/ FTDI]&lt;br /&gt;
| Device&lt;br /&gt;
| 28-32&lt;br /&gt;
| RS232&amp;lt;br&amp;gt;parallel 8 bit &lt;br /&gt;
| 1 bidirektionale FIFO **&lt;br /&gt;
| [[Elektronikversender#Reichelt|Reichelt]], ab 1,95 €&lt;br /&gt;
| [http://www.intra2net.com/de/produkte/opensource/ftdi/ libftdi] - &#039;&#039;FTDI (bitbang) software collection&#039;&#039; von Intra2net (Opensource)&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| FT232R&lt;br /&gt;
| [http://www.ftdichip.com/ FTDI]&lt;br /&gt;
| Device&lt;br /&gt;
| 28-32&lt;br /&gt;
| RS232/Bitbang/CBUS&lt;br /&gt;
| 1 bidirektionale FIFO **&lt;br /&gt;
| [[Elektronikversender#Reichelt|Reichelt]], ab 3,15 €&lt;br /&gt;
| [http://www.intra2net.com/de/produkte/opensource/ftdi/ libftdi] - &#039;&#039;FTDI (bitbang) software collection&#039;&#039; von Intra2net (Opensource)&lt;br /&gt;
|-&lt;br /&gt;
| FT2232D&lt;br /&gt;
| [http://www.ftdichip.com/ FTDI]&lt;br /&gt;
| Device&lt;br /&gt;
| 48&lt;br /&gt;
| RS232 / parallel 8 bit / I2C, SPI, JTAG&lt;br /&gt;
| 2 bidirektionale FIFOs **&lt;br /&gt;
| [[Elektronikversender#csd-electronics|csd-electronics]] [[Elektronikversender#Watterott electronic|Watterott electronic]]&lt;br /&gt;
| [http://www.intra2net.com/de/produkte/opensource/ftdi/ libftdi] - &#039;&#039;FTDI (bitbang) software collection&#039;&#039; von Intra2net (Opensource)&lt;br /&gt;
|-&lt;br /&gt;
| FT2232H&lt;br /&gt;
| [http://www.ftdichip.com/ FTDI]&lt;br /&gt;
| Device&lt;br /&gt;
| 64&lt;br /&gt;
| RS232 / (synchron/asynchron) parallel 8 bit / I2C, SPI, JTAG&lt;br /&gt;
| 2 bidirektionale FIFOs, HS **&lt;br /&gt;
| &lt;br /&gt;
| [http://www.intra2net.com/de/produkte/opensource/ftdi/ libftdi] - &#039;&#039;FTDI (bitbang) software collection&#039;&#039; von Intra2net (Opensource)&lt;br /&gt;
|-&lt;br /&gt;
| FT4232H&lt;br /&gt;
| [http://www.ftdichip.com/ FTDI]&lt;br /&gt;
| Device&lt;br /&gt;
| 64&lt;br /&gt;
| RS232 / I2C, SPI, JTAG (2 Kanäle)&lt;br /&gt;
| 4 bidirektionale FIFOs, HS **&lt;br /&gt;
| &lt;br /&gt;
| [http://www.intra2net.com/de/produkte/opensource/ftdi/ libftdi] - &#039;&#039;FTDI (bitbang) software collection&#039;&#039; von Intra2net (Opensource)&lt;br /&gt;
|-&lt;br /&gt;
| FT232H&lt;br /&gt;
| [http://www.ftdichip.com/ FTDI]&lt;br /&gt;
| Device&lt;br /&gt;
| 48&lt;br /&gt;
| RS232 / (synchron/asynchron) parallel 8 bit /I2C, SPI, JTAG/CBUS&lt;br /&gt;
| 1 bidirektionale FIFOs, HS **&lt;br /&gt;
| [[Elektronikversender#Reichelt|Reichelt]], ab 3,20 €&lt;br /&gt;
| [http://www.intra2net.com/de/produkte/opensource/ftdi/ libftdi] - &#039;&#039;FTDI (bitbang) software collection&#039;&#039; von Intra2net (Opensource)&lt;br /&gt;
|-&lt;br /&gt;
| PDIUSBD11&lt;br /&gt;
| [http://www.semiconductors.philips.com Philips]&lt;br /&gt;
| Device&lt;br /&gt;
|&lt;br /&gt;
| I²C&lt;br /&gt;
| USB-Device Controller&lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;b&amp;gt;abgekündigt&amp;lt;/b&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PDIUSBD12&lt;br /&gt;
| [http://www.semiconductors.philips.com Philips]&lt;br /&gt;
| Device&lt;br /&gt;
| 28&lt;br /&gt;
| parallel 8 bit&lt;br /&gt;
| 1 bidirektionale FIFO **&lt;br /&gt;
| [[Elektronikversender#Reichelt|Reichelt]], ab 2,65 €&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| MAX3420E&lt;br /&gt;
| [http://www.maxim-ic.com Maxim]&lt;br /&gt;
| Device&lt;br /&gt;
| 24-32&lt;br /&gt;
| SPI&lt;br /&gt;
| Fullspeed-Controller, 4 Endpoints&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [[USBN960x]]&lt;br /&gt;
| National&lt;br /&gt;
| Device&lt;br /&gt;
| 28&lt;br /&gt;
| Datenbus 8 bit, SPI&lt;br /&gt;
| Fullspeed-Controller, 7 Endpoints, 3,3-V-Längsregler enthalten&lt;br /&gt;
| [[Elektronikversender#Reichelt|Reichelt]], ab 4,65 €&lt;br /&gt;
| Siehe [[USBN960x]], &amp;lt;b&amp;gt;NRND&amp;lt;/b&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.silabs.com/tgwWebApp/public/web_content/products/Microcontrollers/Interface/en/interface_documentation.htm CP210x]&lt;br /&gt;
| [http://www.silabs.com Silabs]&lt;br /&gt;
| Device&lt;br /&gt;
|&lt;br /&gt;
| UART&lt;br /&gt;
| USB2.0 kompatibler (arbeitet Fullspeed) UART-USB Umsetzer.&lt;br /&gt;
| &lt;br /&gt;
| Sehr kompakt, Intel MAC OSX: [http://www.mikrocontroller.net/topic/67398#542129 Forenbeitrag] beachten&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.silabs.com/products/interface/usbtouart/Pages/usb-to-uart-bridge.aspx CP2110]&lt;br /&gt;
| [http://www.silabs.com Silabs]&lt;br /&gt;
| Device&lt;br /&gt;
| 24-28&lt;br /&gt;
| UART&lt;br /&gt;
| UART-USB ohne Treiber (HID-Klasse)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.silabs.com/products/interface/usbtouart/Pages/HID-USB-to-SMBus-Bridge.aspx CP2112]&lt;br /&gt;
|[http://www.silabs.com Silabs]&lt;br /&gt;
|Device&lt;br /&gt;
|24&lt;br /&gt;
|SMBUS&lt;br /&gt;
|SMBUS-USB HID&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.prolific.com.tw/eng/Products.asp?ID=59 PL2303]&lt;br /&gt;
| [http://www.prolific.com.tw/ Prolific]&lt;br /&gt;
| Device&lt;br /&gt;
| 28&lt;br /&gt;
| RS232&lt;br /&gt;
| „USB CDC 1.1“-konform&lt;br /&gt;
| &lt;br /&gt;
| Im Gegensatz zum FT232 sollte kein Treiber erforderlich sein: Von wegen!&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.oti.com.tw/oti-6858.html OTI-6858]&lt;br /&gt;
| [http://www.oti.com.tw/ Ours Technology Inc.]&lt;br /&gt;
| Device&lt;br /&gt;
| 28&lt;br /&gt;
| UART&lt;br /&gt;
| USB to RS232 Bridge Controller - USB2.0 bis 12MB&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.arkmicro.com/en/products/view.php?id=10 ARK3116T]&lt;br /&gt;
| [http://www.arkmicro.com/ Arkmicro]&lt;br /&gt;
| Device&lt;br /&gt;
|&lt;br /&gt;
| UART&lt;br /&gt;
| USB-to-UART Controller - USB2 bis 3MB)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| TUSB3410&lt;br /&gt;
| [http://focus.ti.com/ Texas Instruments]&lt;br /&gt;
| Device&lt;br /&gt;
| &lt;br /&gt;
| UART&lt;br /&gt;
| USB to Serial Port Controller &lt;br /&gt;
| [[Elektronikversender#Digi-Key|Digi-Key]], ca. 5,60 €&lt;br /&gt;
| USB 2.0 full Speed, Basis 8052 µC&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.vinculum.com/prd_vnc1l.html VNC1L]&lt;br /&gt;
| [http://www.vinculum.com/ Vinculum]&lt;br /&gt;
| 2x Host&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| Dual USB Host-Controller&lt;br /&gt;
| [[Elektronikversender#Watterott electronic|Watterott electronic]]&lt;br /&gt;
| [http://freshmeat.net/projects/lvprog/?branch_id=71957&amp;amp;release_id=265079 LVProg] is an (X11/Qt)application for programming a ROM file into a Vinculum USB host controller from FTDI. (GPL v2)&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
[[USB-Stick am Mikrocontroller]]&lt;br /&gt;
|-&lt;br /&gt;
| SL811HST&lt;br /&gt;
| [http://www.cypress.com/ Cypress]&lt;br /&gt;
| 1x beides&lt;br /&gt;
| 48&lt;br /&gt;
| Datenbus 8 bit&lt;br /&gt;
| Controller 1 Port&lt;br /&gt;
| [[Elektronikversender#Digikey|Digikey]], [http://www.trade-shop.de/catalog/index.php?cPath=72_173 Air Electronics] ca. 8 €&lt;br /&gt;
| für OTG viel Außenbeschaltung erforderlich&lt;br /&gt;
|-&lt;br /&gt;
| ISP1160&lt;br /&gt;
| [http://www.nxp.com/ Philips/NXP]&lt;br /&gt;
| 2x Host&lt;br /&gt;
| 64&lt;br /&gt;
| Datenbus 16 bit&lt;br /&gt;
| Host-Controller 2 Ports&lt;br /&gt;
| [[Elektronikversender#Reichelt|Reichelt]], ca. 6,85 €&lt;br /&gt;
| für ATmega unzweckmäßig, eher für ARM-Prozessoren&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Reine FIFO-Schaltkreise sind nicht für benutzerspezifische&lt;br /&gt;
Deskriptoren geeignet.&lt;br /&gt;
Damit lassen sich nahezu keine klassenspezifische Geräte-Interfaces&lt;br /&gt;
realisieren.&lt;br /&gt;
Folglich kann man damit bspw. kein HID-Gerät bauen.&lt;br /&gt;
&lt;br /&gt;
NRND = Not recommended for new designs = wird alsbald abgekündigt&lt;br /&gt;
&lt;br /&gt;
UART: Gemeint sind die Signale RxD und TxD sowie Flusskontrolle /RTS und /CTS&lt;br /&gt;
&lt;br /&gt;
RS232: Gemeint ist eine UART mit den 4 Modemsteuersignalen /DTR, /DSR, /DCD und /RI&lt;br /&gt;
&lt;br /&gt;
Tipp: USB-Handy-Datenkabel arbeiten oft mit FT232-ähnlichen Chips!&lt;br /&gt;
&lt;br /&gt;
===USB-Transceiver===&lt;br /&gt;
USB-Transceiver können nur verwendet werden für:&lt;br /&gt;
* speziell dafür ausgelegte Mikrocontroller (PIC 18F2455/2550/4455/4550 u.ä.)&lt;br /&gt;
* FPGAs (wenn diese nicht selbst geeignete Portpins verfügen)&lt;br /&gt;
* [http://www.obdev.at/vusb/ V-USB] (Software-Anpassungen erforderlich)&lt;br /&gt;
Vorteil: Zwischen Transceiver und Mikrocontroller kann eine galvanische Trennstufe angeordnet werden.&lt;br /&gt;
&lt;br /&gt;
Heutzutage ist es besser, einen seriell ansteuerbaren USB-Controller (siehe oben) zu verwenden und dazwischen eine maßgeschneiderte galvanische Trennung.&lt;br /&gt;
Daher sind Transceiver heutzutage eher obsolet.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;sortable&amp;quot; id=&amp;quot;usb_controller&amp;quot; style=&amp;quot;border-collapse:collapse;&amp;quot;&lt;br /&gt;
! IC&lt;br /&gt;
! Hersteller&lt;br /&gt;
! Speed&lt;br /&gt;
! IC-Pins&lt;br /&gt;
! Interface&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Bezugs-Quelle(n)&lt;br /&gt;
|-&lt;br /&gt;
| MAX345xE&lt;br /&gt;
| [http://www.maxim-ic.com Maxim]&lt;br /&gt;
| ?&lt;br /&gt;
| 14-16&lt;br /&gt;
| -&lt;br /&gt;
| Transceiver&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| ISP1106&lt;br /&gt;
| [http://www.nxp.com Philips/NXP]&lt;br /&gt;
| Low, Full&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| Transceiver&lt;br /&gt;
| [[Elektronikversender#Reichelt|Reichelt]], ca. 1,15 €&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Tipps + Tricks ==&lt;br /&gt;
* Selbstgebastelte USB-Hardware an den PC nur über einen anständig konstruierten self-powered Hub anschließen - [http://www.mikrocontroller.net/topic/97331#841881 Forumbeitrag von Rufus t. Firefly]&lt;br /&gt;
* Eine [[Galvanische Trennung | galvanische Trennung]] von USB ist SEHR aufwändig, weil&lt;br /&gt;
** das USB-Signal bidirektional ist&lt;br /&gt;
** USB keine Steuerleitungen hat, man kann nur aus der vollständigen Dekodierung der Daten erfahren, in welche Richtung die Daten jetzt gehen müssen. Dieses Problem betrifft V-USB-basierte Projekte nicht, eine solche Leitung lässt sich leicht nachrüsten.&lt;br /&gt;
** es sehr kurze Antwortzeiten von den USB-ICs verlangt (im Bereich von ~10 Bitzeiten!)&lt;br /&gt;
*Es gibt auf dem Markt einige wenige, aufwändige und damit teure Lösungen. Wer also ein galvanisch getrennte Schnittstelle braucht, sollte &#039;&#039;&#039;nicht&#039;&#039;&#039; USB nehmen. Allerdings ist es leicht möglich, einen USB-RS232/RS485 Wandler galvanisch auf der RS232/RS485 Seite zu trennen. &amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;border: 1px solid black;&amp;quot;&amp;gt;[http://i55.tinypic.com/rsbwoy.png http://i51.tinypic.com/2eq5kcx.png]&amp;lt;/div&amp;gt;Variante mit FT232&amp;lt;/div&amp;gt;&lt;br /&gt;
*Eine einfache Lösung wäre einen FT232 zu verwenden und diesen auf der TTL-Seite mit Optokopplern zu trennen.&lt;br /&gt;
*Die zur Zeit einfachste und kostengünstigste Möglichkeit zur galvanischen Trennung ist der ADUM3160BRWZ oder der ADuM4160 von Analog Devices.&lt;br /&gt;
**Einschränkungen: nur Full- und Low-Speed, keine automatische Erkennung der Übertragungsrate.&lt;br /&gt;
** ADuM3160 im AD Newsletter: [http://www.analog.com/en/interface/digital-isolators/adum3160/products/product.html]&lt;br /&gt;
** [https://www.it-wns.de/themes/kategorie/detail.php?artikelid=979&amp;amp;kategorieid=53&amp;amp;source=1 Leerplatine] für AD4160 im IT-WNS Webshop&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/114555?goto=2065917#2065236 Forumsbeitrag] mit Eagle 3D Bild und Schaltplan&lt;br /&gt;
* [http://www.mikrocontroller.net/search?query=%2BUSB+%2Bgalvanisch&amp;amp;forums%5B%5D=1&amp;amp;forums%5B%5D=19&amp;amp;forums%5B%5D=9&amp;amp;forums%5B%5D=10&amp;amp;forums%5B%5D=2&amp;amp;forums%5B%5D=4&amp;amp;forums%5B%5D=3&amp;amp;forums%5B%5D=6&amp;amp;forums%5B%5D=17&amp;amp;forums%5B%5D=11&amp;amp;forums%5B%5D=8&amp;amp;forums%5B%5D=14&amp;amp;forums%5B%5D=12&amp;amp;forums%5B%5D=7&amp;amp;forums%5B%5D=5&amp;amp;forums%5B%5D=18&amp;amp;forums%5B%5D=15&amp;amp;forums%5B%5D=13&amp;amp;forums%5B%5D=16&amp;amp;max_age=-&amp;amp;sort_by_date=0 Suche nach USB und galvanischer Trennung im Forum]&lt;br /&gt;
&lt;br /&gt;
== Analysetools ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.pcausa.com/Utilities/UsbSnoop/default.htm Sniff USB] - USB Sniffer - freeware - Windows&lt;br /&gt;
* [http://www.openvizsla.org/ OpenVizsla] ([http://www.kickstarter.com/projects/bushing/openvizsla-open-source-usb-protocol-analyzer/posts/62083 OpenVizsla auf kickstarter.com]) - OpenSource USB sniffer, basierend auf XMOS und FPGA (under dev. right now)&lt;br /&gt;
* [http://www.wireshark.org/ Wireshark] - Eigentlich Netzwerk Sniffer, kann aber in neueren Versionen auch USB (insbesondere unter Linux)  [http://wiki.wireshark.org/CaptureSetup/USB Wireshark Wiki, USB]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.lvr.com/usbchips.htm Links to USB Host and Device Controller Chips] by Jan Axelson.&lt;br /&gt;
* [http://replay.waybackmachine.org/20090210000605/http://g.fondeville.free.fr/usb_host_en.html Mass storage host USB example] - The purpose of this article is to introduce a host USB Full Speed implementation. This host is designed to control MASS storage peripherals like USB key, cameras, hard drive... ([[PIC]]18F452, Cypress SL811HS)&lt;br /&gt;
* [http://chaosradio.ccc.de/cre086.html ChaosradioExpress #86 USB] - Der Universal Serial Bus im Detail. Podcast mit Tim Pritlove (Moderation) und Daniel Mack &lt;br /&gt;
* [http://hackaday.com/2008/11/19/how-to-the-bus-pirate-universal-serial-interface/ Bus Pirate (hackaday.com)] - How-to: The Bus Pirate, universal serial interface USB &amp;lt;-&amp;gt; [[I2C]], [[SPI]], Async. Seriell [[UART]]. Firmware-Update für die [http://hackaday.com/2008/12/01/bus-pirate-firmware-update-v0c-jtag-and-more/ Ergänzung] u.a. für [[JTAG]]. Das Herzstück ist ein PIC24FJ64GA002.&lt;br /&gt;
* [http://www.sourceforge.net/projects/easyusb EasyUSB] - Generischer USB Treiber für Windows&lt;br /&gt;
* [http://www.embedded24.net AHID.DLL] - Noch ein generischer USB Treiber für Windows (C++/C#/VB/MinGW/wxWidgets)&lt;br /&gt;
* [http://www.embedded.com/design/219400265 Simple circuit prevents USB current overshoot during insertion] von Luciano Bordogna (MAXIM) auf www.embedded.com&lt;br /&gt;
* [http://www.circuitsathome.com/mcu/usb/usb-isolator USB-Isolator]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:USB| ]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=USB&amp;diff=65131</id>
		<title>USB</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=USB&amp;diff=65131"/>
		<updated>2012-03-21T14:35:39Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Spezielle USB-µC */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;U&#039;&#039;&#039;niversal &#039;&#039;&#039;S&#039;&#039;&#039;erial &#039;&#039;&#039;B&#039;&#039;&#039;us.&lt;br /&gt;
&lt;br /&gt;
Serieller Bus, der heutzutage an jedem neuen PC zu finden ist und langsam aber sicher die RS-232- und Parallelport-Anschlüsse ersetzt.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Übertragungsgeschwindigkeiten:&lt;br /&gt;
* Low Speed: 1,5 MBit/s (USB 1.1 und 2.0)&lt;br /&gt;
* Full Speed: 12 MBit/s (USB 1.1 und 2.0)&lt;br /&gt;
* High Speed: 480 MBit/s (nur USB 2.0)&lt;br /&gt;
* SuperSpeed: 5 GBit/s (nur USB 3.0)&lt;br /&gt;
Die in Datenblättern oder Verpackungen gern verwendete Angabe &amp;quot;USB 2.0 Full Speed&amp;quot; darf man also nicht wörtlich verstehen, das sind trotz USB 2.0 nur 12 Mbit/s.&lt;br /&gt;
&lt;br /&gt;
Zu beachten ist, dass es bei USB im Gegensatz zu [[RS-232]] zwei Arten von Controllern gibt: Host- und Devicecontroller. Host bezeichnet dabei die steuernde Seite und ist z.&amp;amp;nbsp;B. in PCs zu finden; Devices sind die USB-Geräte, z.&amp;amp;nbsp;B. USB-Webcams. Diese Unterscheidung ist ziemlich wichtig, weil die meisten USB-Lösungen für [[Mikrocontroller]] USB-Devices darstellen und man deswegen dort weder Webcams noch USB-Speichersticks anschliessen kann. Mit der letzten Ergänzung des Standards (USB On-The-Go) gibt es die begrenzte Möglichkeit, dass Geräte Host-Funktionalität zur Kommunikation mit ausgewählten Peripheriegeräten erhalten.&lt;br /&gt;
&lt;br /&gt;
Benutzt man ein USB-Device am PC, dann braucht man auch noch passende Treiber. Die aktuellen Betriebssysteme bringen meist eine Reihe von Treibern für Standardanwendungen (z.&amp;amp;nbsp;B. USB-Festplatte) mit. Gibt es keinen passenden Standardtreiber, dann muss man eben einen erstellen. Dazu werden bei manchen Chips kostenlose Treiber mitgeliefert, bei anderen muss man sie kaufen oder (aufwendig) selbst erstellen.&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Informationen ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.usb.org/home USB-Hauptseite] Die Homepage des USB Implementers Forum, Inc., creators of USB technology.&lt;br /&gt;
* [http://libusb.sourceforge.net/ libusb] Allgemein ist die Treiberprogrammierung für USB das Hauptproblem. Die plattformübergreifende libusb ([http://libusb-win32.sourceforge.net/ Win32-Port (nicht Vista!)]) ermöglicht die Kommunikation mit USB-Geräten unter Verwendung eines Universaltreibers. Ein deutschsprachiges Projekt, erstellt von [http://www.weinga-unity.at.tt Weichinger Klaus], das libusb verwendet, findet man unter [http://www.ime.jku.at/tusb/] (Programmiersprache C mit MINGW; Dokumentation, Sourcecode und Binärdateien).&lt;br /&gt;
* [http://halvar.at/elektronik/usb/arnold_da.pdf Diplomarbeit von Eik Arnold] Viele Informationen über USB (Vergleich mit anderen Bussystemen, Elektrisches Interface, Transferarten, Übersicht über die verschiedenen USB Chips, ...)&lt;br /&gt;
* [http://www.beyondlogic.org/usbnutshell/usb1.htm USB in a NutShell] Eine kleine Wanderung durch die USB-Spezifikation&lt;br /&gt;
* [http://www.b-redemann.de Steuern und Messen mit USB - FT232, 245 und 2232] Das aktuelle Buch zu den USB-Controllern von FTDI. Viele Beispielprogramme in C, zwei Projektbeschreibungen: I2C-Bus mit LM75A und ein Web-Projekt. Bauteilesatz und USB-Modul mit dem FT2232 zum schnellen Einstieg in die Thematik. Buch / Teilesatz über Segor oder dieser Seite erhältlich.&lt;br /&gt;
&lt;br /&gt;
== USB-Hostcontroller ==&lt;br /&gt;
=== Host-Controller im Mikrocontroller ===&lt;br /&gt;
Es gibt eine erfreuliche Anzahl geeigneter Schaltkreise, nur für den Amateur unschön beschaffbar. Entsprechend der USB-Spezifikation kann jeder Full-Speed-Hostcontroller auch mit Low-Speed arbeiten.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;sortable&amp;quot; id=&amp;quot;usb_controller&amp;quot; style=&amp;quot;border-collapse:collapse;&amp;quot;&lt;br /&gt;
!Hersteller&lt;br /&gt;
!IC&lt;br /&gt;
!Speed&lt;br /&gt;
!Pins&lt;br /&gt;
!Ucc/Uio&lt;br /&gt;
!CPU&lt;br /&gt;
!Takt&lt;br /&gt;
!Flash&lt;br /&gt;
!RAM&lt;br /&gt;
!ADU&lt;br /&gt;
!DAU/PWM&lt;br /&gt;
!Async&lt;br /&gt;
!Sync&lt;br /&gt;
!Extras&lt;br /&gt;
!Bezug&lt;br /&gt;
|-&lt;br /&gt;
| [http://mcu.emea.fujitsu.com/ Fujitsu]&lt;br /&gt;
| MB96F338U&lt;br /&gt;
| Full&lt;br /&gt;
| 144&lt;br /&gt;
| 3-5 V&lt;br /&gt;
| 16bit / 16FX Core&lt;br /&gt;
| 4 MHz extern&lt;br /&gt;
| 544Kbyte &lt;br /&gt;
| 32Kbyte &lt;br /&gt;
| 36x10bit&lt;br /&gt;
| 20xPWM, 12xOCU&lt;br /&gt;
| 8&lt;br /&gt;
| 8&lt;br /&gt;
| 3xCAN, 2xI²C&lt;br /&gt;
| [http://www.glyn.de/ Glyn], [http://www.ebv.com/ EBV]&lt;br /&gt;
|-&lt;br /&gt;
| [http://mcu.emea.fujitsu.com/ Fujitsu]&lt;br /&gt;
| MB90F334&lt;br /&gt;
| Full&lt;br /&gt;
| 120&lt;br /&gt;
| 3,3 V&lt;br /&gt;
| 16bit / 16LX Core&lt;br /&gt;
| 4 MHz extern&lt;br /&gt;
| 384Kbyte &lt;br /&gt;
| 24Kbyte &lt;br /&gt;
| 16x10bit&lt;br /&gt;
| 6xPWM, 4xOCU&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 3xI²C&lt;br /&gt;
| Glyn, EBV&lt;br /&gt;
|-&lt;br /&gt;
| [http://mcu.emea.fujitsu.com/ Fujitsu]&lt;br /&gt;
| MB90F337&lt;br /&gt;
| Full&lt;br /&gt;
| 64&lt;br /&gt;
| 3,3 V&lt;br /&gt;
| 16bit / 16LX Core&lt;br /&gt;
| 4 MHz extern&lt;br /&gt;
| 64Kbyte &lt;br /&gt;
|  4Kbyte &lt;br /&gt;
| -&lt;br /&gt;
| 4xPWM&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 1xI²C&lt;br /&gt;
| Glyn, EBV&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.cypress.com/ Cypress]&lt;br /&gt;
| CY7C67300&lt;br /&gt;
| Full&lt;br /&gt;
| 100&lt;br /&gt;
| 3,3 V&lt;br /&gt;
| 16bit RISC&lt;br /&gt;
| 48 MHz&lt;br /&gt;
| 4K x 16bit OTP&lt;br /&gt;
| 8K x 16bit&lt;br /&gt;
| -&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| IDE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.atmel.com/ Atmel]&lt;br /&gt;
| AT90USB647&lt;br /&gt;
| Full&lt;br /&gt;
| 64&lt;br /&gt;
| 3,3 - 5 V&lt;br /&gt;
| AVR&lt;br /&gt;
| 16 MHz&lt;br /&gt;
| 64 K&lt;br /&gt;
| 4 K&lt;br /&gt;
| 8 x 10 bit&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [http://de.farnell.com Farnell] ca. 11,42 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.atmel.com/ Atmel]&lt;br /&gt;
| AT32UC3B0128&lt;br /&gt;
| Full/OTG&lt;br /&gt;
| 64 (40)&lt;br /&gt;
| 3,3 V&lt;br /&gt;
| AVR32&lt;br /&gt;
| 60 MHz&lt;br /&gt;
| 128 K&lt;br /&gt;
| 32 K&lt;br /&gt;
| 8 x 10 bit&lt;br /&gt;
| (7+6) x PWM&lt;br /&gt;
| 2 (1x full)&lt;br /&gt;
| I²C, SPI, SSC&lt;br /&gt;
| Kernspannungsregler 1,8 V&lt;br /&gt;
| [http://de.farnell.com Farnell] ca. 6 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.microchip.com/ Microchip]&lt;br /&gt;
| PIC24FJ256GB106&lt;br /&gt;
| Full&lt;br /&gt;
| 64&lt;br /&gt;
| 3,3V/5V&lt;br /&gt;
| PIC24&lt;br /&gt;
| 16 MHz&lt;br /&gt;
| 64 KB&lt;br /&gt;
| 16 KB&lt;br /&gt;
| 10bit&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|&lt;br /&gt;
| Spannungsregler&lt;br /&gt;
| [http://de.farnell.com Farnell] ca. 5,70 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.microchip.com/ Microchip]&lt;br /&gt;
| PIC32MX420FxxxH&lt;br /&gt;
| Full&lt;br /&gt;
| 64&lt;br /&gt;
| 3,3V/5V&lt;br /&gt;
| MIPS32&lt;br /&gt;
| 80 MHz&lt;br /&gt;
| ab 32 KB&lt;br /&gt;
| 8 - 32 KB&lt;br /&gt;
| 16 x 10bit&lt;br /&gt;
| -&lt;br /&gt;
| 1 mit IRDA&lt;br /&gt;
|&lt;br /&gt;
| Spannungsregler, JTAG&lt;br /&gt;
| [http://de.farnell.com Farnell] ca. 4,83 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.nxp.com/ Philips/NXP]&lt;br /&gt;
| LPC2388&lt;br /&gt;
| Full&lt;br /&gt;
| 144&lt;br /&gt;
| 3,3V/5V&lt;br /&gt;
| ARM7&lt;br /&gt;
| 72MHz&lt;br /&gt;
| 512KB&lt;br /&gt;
| 32KB&lt;br /&gt;
| 8 x 10bit&lt;br /&gt;
| 1 x 10bit, 6 PWM&lt;br /&gt;
| 2 USART, 2 CAN&lt;br /&gt;
| SPI, I²C, SSC&lt;br /&gt;
| SD/MMC, Ethernet 10 Mbit, Businterface, JTAG&lt;br /&gt;
| [http://de.digikey.com/ Digikey] ca. 8 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.st.com/ ST]&lt;br /&gt;
| STM32F10x&lt;br /&gt;
| Full&lt;br /&gt;
| 36..144&lt;br /&gt;
| 3,3V/5V&lt;br /&gt;
| Cortex-M3&lt;br /&gt;
| 72MHz&lt;br /&gt;
| 512KB&lt;br /&gt;
| 64KB&lt;br /&gt;
| 21 x 12bit&lt;br /&gt;
| 2 x 12bit, 32 PWM&lt;br /&gt;
| 5 USART, 1 CAN&lt;br /&gt;
| SPI, I²C, SSC&lt;br /&gt;
| Siehe Artikel [[STM32]]&lt;br /&gt;
| [http://de.farnell.com/ Farnell] ab ca. 5 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.st.com/ ST]&lt;br /&gt;
| STM32F4xx&lt;br /&gt;
| Full + Hi&lt;br /&gt;
| 64..176&lt;br /&gt;
| 3,3V/5V&lt;br /&gt;
| Cortex-M4&lt;br /&gt;
| 168MHz&lt;br /&gt;
| 1024KB&lt;br /&gt;
| 192KB&lt;br /&gt;
| 24 x 12bit&lt;br /&gt;
| 2 x 12bit, 32 PWM&lt;br /&gt;
| 6 USART, 2 CAN&lt;br /&gt;
| SPI, I²C, SSC&lt;br /&gt;
| Siehe Artikel [[STM32]]&lt;br /&gt;
| [http://de.mouser.com/ Mouser] ab ca. 7 €&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Alle mit „USB OTG“ beworbenen Schaltkreise sind als Host-Controller&lt;br /&gt;
&#039;&#039;und&#039;&#039; Device-Controller verwendbar. Mikrocontroller mit High-Speed-USB sind selten.&lt;br /&gt;
&lt;br /&gt;
=== Implementierung in Software auf Atmel AVR ===&lt;br /&gt;
Solche Hostcontroller sind nur für Low-Speed-Geräte geeignet, in der Regel Tastaturen, Mäuse und ggf. Joysticks oder ähnliche HID-Geräte.&lt;br /&gt;
&lt;br /&gt;
* [http://www.asahi-net.or.jp/~qx5k-iskw/robot/usbhost.html Reine Softwarelösung, kann nur USB Low Speed] (Seite auf japanisch, mit [http://babelfish.altavista.com/ Babelfish] übersetzen lassen). &lt;br /&gt;
* [http://instruct1.cit.cornell.edu/courses/ee476/FinalProjects/s2007/blh36_cdl28_dct23/blh36_cdl28_dct23/index.html SIAM32 USB HC] - Software Implemented Atmel Mega32 Universal Serial Bus Host Controller (Atmega32, GPL)&lt;br /&gt;
&amp;lt;!-- * [http://obdev.at/products/avrusb/index-de.html OpenSource Lösung] OpenSource Lösung auf http://obdev.at (Nur USB Device, kein USB Host) --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Software-Implementierungen auf anderen Mikrocontrollern scheitern wegen zu geringer Taktfrequenzen bzw. Durchsatzraten (speziell interessant wäre MSP430 gewesen), oder – bei leistungsstärkeren Controllern – wegen Sinnlosigkeit durch Verfügbarkeit von Mikrocontrollern mit USB (siehe oben).&lt;br /&gt;
&lt;br /&gt;
=== Spezielle Schaltkreise ===&lt;br /&gt;
&lt;br /&gt;
USB-Schaltkreise, die vorzugsweise für den Anschluss an ein „Externes Businterface“ eines Mikrocontrollers oder per [[SPI]] vorgesehen sind.&lt;br /&gt;
&lt;br /&gt;
* [http://www.nxp.com/products/connectivity/usb/products/index.html#hostc Produkte von NXP] (ehem.Philips), bspw. ISP1760&lt;br /&gt;
* [http://www.cypress.com/ Cypress]  &amp;lt;tt&amp;gt;SL811HST&amp;lt;/tt&amp;gt; (Host/Device/OTG möglich)&lt;br /&gt;
* VNC1L von [http://www.vinculum.com/ Vinculum]&lt;br /&gt;
* [http://www.maxim-ic.com/quick_view2.cfm/qv_pk/3639 MAX3421E] z.&amp;amp;nbsp;B. verwendet im [http://www.circuitsathome.com/category/mcu/arduino/usb-shield Arduino USB Host Shield] von Circuits@Home&lt;br /&gt;
&lt;br /&gt;
Es gibt eine Reihe Schaltkreise, die einen PCI-Bus haben. Diese sind für Mikrocontrollerprojekte in der Regel nicht zu gebrauchen.&lt;br /&gt;
&lt;br /&gt;
Dazu gibt es:&lt;br /&gt;
&lt;br /&gt;
* [http://www.embedded-projects.net/usbport Freier USB-Stack für Embedded Systeme] (LGPL)&lt;br /&gt;
&lt;br /&gt;
=== Fertige Module mit einem USB-Host ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.vinculum.com/prd_vdip1.html VDIP1] von FTDI (UART, SPI und parallel)&lt;br /&gt;
* [http://www.elv.de/output/controller.aspx?cid=74&amp;amp;detail=10&amp;amp;detail2=20659 STI 100] von elv (UART und SPI)&lt;br /&gt;
* [http://rz-robotics.de/z-usb.html Z-USB] von rz-robotics (UART und SPI, kann auch stehend montiert werden)&lt;br /&gt;
* [http://www.fischl.de/usbsticklogger/ USBStickLogger] OpenSource-Projekt, Bausatz verfügbar (UART)&lt;br /&gt;
&lt;br /&gt;
== USB-Devices ==&lt;br /&gt;
&lt;br /&gt;
===Implementierung in Software===&lt;br /&gt;
* [http://www.cesko.host.sk/IgorPlugUSB/IgorPlug-USB%20(AVR)_eng.htm IgorPlug-USB - Reine Softwarelösung. Kann nur USB Low Speed (theoretisch 1.5Mbit/s).]&lt;br /&gt;
* [http://www.obdev.at/vusb/ V-USB] - gleiches Prinzip wie IgorPlug, aber Entwickler-Schnittstellen in C, englisch kommentierter Code. Projekt von [http://www.obdev.at/ Objective Development]. Viele Folgeprojekte. Beispielsweise:&lt;br /&gt;
** [http://www.recursion.jp/avrcdc/ AVR-CDC] – Ein USB-RS232C-Interface mittels CDC-Protokoll (Communication Device Class) bspw. mit ATtiny45. Kein Treiber erforderlich, nur .INF-Datei. Von Osamu Tamura.&lt;br /&gt;
** [http://www.recursion.jp/avrcdc/ CDC-IO] Ein experimentelles 18-bit Parallelport mittels AVR-Mikrocontroller (ATmega8/48/88). Von Osamu Tamura.&lt;br /&gt;
** [http://1010.co.uk/avrhid.html AVR-HID] - Low budget USB sensor input into Pure Data/Supercollider and other free softwares based around the ATmega8 microcontroller. This allows for very fast, multiple sensor input at high resolutions on a range of platforms (GNU/Linux, MAC OS X, Windows). Based on workshops with Derek Holzer.&lt;br /&gt;
* [http://www.xs4all.nl/~dicks/avr/usbtiny/ USBtiny] - Programmiergerät für AVR, Lizenz: GPL&lt;br /&gt;
* [http://www.elektor.de/Default.aspx?tabid=27&amp;amp;art=5551005&amp;amp;PN=On AVR steuert USB] und [http://www.elektor.de/Default.aspx?tabid=27&amp;amp;art=5551006&amp;amp;PN=On Universeller USB-Treiber] in der Zeitschrift [http://www.elektor.de Elektor] März 2007. Reine Softwarelösung für ein USB-I/O-Board mit einem ATmega32 und einem [http://libusb-win32.sourceforge.net/ &#039;&#039;open source&#039;&#039; USB Treiber].&lt;br /&gt;
* [http://www.sprut.de/electronic/pic/projekte/usb4all/usb4all.htm USB Client für universelle Steuerungsaufgaben mit PIC18F2455 oder PIC18F2550]&lt;br /&gt;
&lt;br /&gt;
===Spezielle USB-µC===&lt;br /&gt;
&lt;br /&gt;
* Diverse µCs von [http://www.cypress.com/ Cypress], siehe unten&lt;br /&gt;
* TUSBxxxx-Serie von [http://www.ti.com/ Texas Instruments] ebenfalls mit [[8051]]-kompatiblem Mikrocontroller ([http://www.ime.jku.at/tusb/ Beispiel Projekt] von [http://www.weinga-unity.at.tt Weichinger Klaus] (EXPL_DHTML.C  Virus ?))&lt;br /&gt;
* PIC18F2455/2550/4455/4550/67J50/67J55/87J50/87J55 sowie alle PIC24FXXXGBXXX von [http://www.microchip.com/ Microchip], &amp;amp;uuml;ppig ausgestattet mit USB, seriellem Port (RS232/SPI), PWM-Ausg&amp;amp;auml;ngen, A/D-Wandler und vielen IO-Pins&lt;br /&gt;
* [http://www.freescale.com/ Freescale]&lt;br /&gt;
** 69HC908JB8 - 20 Pin DIP . . . MC6&#039;&#039;&#039;8&#039;&#039;&#039;HC908JB8 ?&lt;br /&gt;
** 69HC908JB16 - Mehr Peripherie u.a. RS232&lt;br /&gt;
** 69HC908JG16 - Mit A/D wandler&lt;br /&gt;
** 69HC908JW32 - Mehr Speicher, mehr Ports&lt;br /&gt;
* [[LPC2000]]/3000-Reihe von NXP (LPC2888: High Speed USB 480Mbps)&lt;br /&gt;
* C8051F320 &amp;amp; C8051F340 von Silicon Laboratories (USB, UART, SPI, SMBus, 10-Bit-ADC, Komperator, integr. Spannungsregler &amp;amp; Oszillator)&lt;br /&gt;
* [[AT91SAM]] Familie von Atmel, ARM7-basiert, nicht OTG-fähig&lt;br /&gt;
* [[AVR32]] ([http://www.atmel.com/products/avr/uc3.asp?category_id=163&amp;amp;family_id=607 AT32UC3]A/B) Familie von Atmel mit AVR32-Kern ohne MMU für einfachere Firmware, OTG-fähig, auch High-Speed, Externes Businterface, Ethernet. Alle AT32UC3A or -B&#039;s haben vorprogrammierten USB Device Firmware Upgrade (DFU) bootloader.&amp;lt;ref&amp;gt;http://www.atmel.com/dyn/resources/prod_documents/doc7818.pdf&amp;lt;/ref&amp;gt; &lt;br /&gt;
* [http://www.atmel.com/dyn/products/devices.asp?family_id=607#1761 AT90USB Familie] von Atmel. &lt;br /&gt;
** Eine Experimentierplatine und eine [http://www.ssalewski.de/Misc.html.de GPL Library für den AT90USB1287] gibt es von Dr. Stefan Salewski. Siehe auch Forenbeitrag [http://www.mikrocontroller.net/topic/61499#483966 Anwendersoftware (Generic HID Demo) für den AT90USBKEY].&lt;br /&gt;
** [http://www.fourwalledcubicle.com/LUFA.php LUFA] (Lightweight USB Framework for AVRs) is an open source USB library for the USB-enabled AVR microcontrollers. It is written from scratch and provides an easy to use, clean interface for rapid firmware development (MIT). Alter Name: MyUSB&lt;br /&gt;
** [http://freaklabs.org/index.php/FreakUSB-Open-Source-USB-Device-Stack.html FreakUSB Open Source USB Device Stack] (mod. BSD Lizenz)&lt;br /&gt;
&lt;br /&gt;
Alle hier genannten Mikrocontroller haben keinen USB-Host (nur Client)!&lt;br /&gt;
&lt;br /&gt;
Eine Auswahl:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;sortable&amp;quot; id=&amp;quot;usb_controller&amp;quot; style=&amp;quot;border-collapse:collapse;&amp;quot;&lt;br /&gt;
! Hersteller&lt;br /&gt;
! IC&lt;br /&gt;
! Speed&lt;br /&gt;
! Pins&lt;br /&gt;
! Ucc/Uio&lt;br /&gt;
| CPU Takt&lt;br /&gt;
! Quarz&lt;br /&gt;
! Flash&lt;br /&gt;
! RAM&lt;br /&gt;
! ADU&lt;br /&gt;
! DAU/PWM&lt;br /&gt;
! Async&lt;br /&gt;
! Sync&lt;br /&gt;
! Extras&lt;br /&gt;
! Bezug&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.cypress.com/ Cypress]&lt;br /&gt;
| AN2131&amp;lt;br&amp;gt;AN2135&lt;br /&gt;
| Full&lt;br /&gt;
| 44&lt;br /&gt;
| 3,3V/5V&lt;br /&gt;
| 8051 24MHz&lt;br /&gt;
| 12MHz&lt;br /&gt;
| 0&lt;br /&gt;
| 4KB&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| UART&lt;br /&gt;
| I²C&lt;br /&gt;
|&lt;br /&gt;
| &#039;&#039;&#039;veraltet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.cypress.com/ Cypress]&lt;br /&gt;
| CY7C68013A&lt;br /&gt;
| High&lt;br /&gt;
| 56,100,128&lt;br /&gt;
| 3,3V/5V&lt;br /&gt;
| 8051 48MHz&lt;br /&gt;
| 24MHz Grundton&lt;br /&gt;
| 0&lt;br /&gt;
| 16KB&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| 2 UART&amp;lt;br&amp;gt;(ab 100 Pin)&lt;br /&gt;
| I²C&lt;br /&gt;
| GPIF (State Machine)&lt;br /&gt;
| [http://de.digikey.com/ Digikey] ca. 11,28 €, [http://www.trade-shop.de/catalog/index.php?cPath=72_173 Air Electronics] ca. 9 €&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.cypress.com/ Cypress]&lt;br /&gt;
| CYUSB3014&lt;br /&gt;
| Super&lt;br /&gt;
| ?&lt;br /&gt;
| 1,8V&lt;br /&gt;
| ARM9&lt;br /&gt;
| ?&lt;br /&gt;
| 0&lt;br /&gt;
| 256KB?&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| 2 UART&lt;br /&gt;
| I²C&lt;br /&gt;
| GPIF II (State Machine)&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| Microchip&lt;br /&gt;
| PIC18F2550&lt;br /&gt;
| Full&lt;br /&gt;
| 28&lt;br /&gt;
|&lt;br /&gt;
| PIC&lt;br /&gt;
| 12MHz&lt;br /&gt;
| 16K x 16bit&lt;br /&gt;
| 2KB&lt;br /&gt;
| 8 x 10bit&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [http://www.reichelt.de/ Reichelt] ca. 7,95 €&lt;br /&gt;
|-&lt;br /&gt;
| Atmel&lt;br /&gt;
| AT91SAM7S64&lt;br /&gt;
| Full&lt;br /&gt;
| 64&lt;br /&gt;
| 3,3V/5V&lt;br /&gt;
| ARM7 55MHz&lt;br /&gt;
| für Bootloader: 18,432MHz&lt;br /&gt;
| 64KB&lt;br /&gt;
| 16KB&lt;br /&gt;
| -&lt;br /&gt;
| 4 PWM&lt;br /&gt;
| 2 USART&lt;br /&gt;
| SPI, I²C, SSC&lt;br /&gt;
| größere Chips auch mit Ethernet&lt;br /&gt;
| [http://www.reichelt.de/ Reichelt] ca. 6,25 €&lt;br /&gt;
|-&lt;br /&gt;
| Philips/NXP&lt;br /&gt;
| LPC2378&lt;br /&gt;
| Full&lt;br /&gt;
| 144&lt;br /&gt;
| 3,3V/5V&lt;br /&gt;
| ARM7 72MHz&lt;br /&gt;
| bspw. 12MHz&lt;br /&gt;
| 512KB&lt;br /&gt;
| 32KB&lt;br /&gt;
| 8 x 10bit&lt;br /&gt;
| 1 x 10bit, 6 PWM&lt;br /&gt;
| 2 USART, 2 CAN&lt;br /&gt;
| SPI, I²C, SSC&lt;br /&gt;
| SD/MMC, Ethernet 10 Mbit, Businterface&lt;br /&gt;
| [http://de.digikey.com/ Digikey] ca. 7,85 €&lt;br /&gt;
|-&lt;br /&gt;
| Texas Instruments&lt;br /&gt;
| MSP430F55xx&lt;br /&gt;
| Full&lt;br /&gt;
| bis 80&lt;br /&gt;
| 3,3V&lt;br /&gt;
| MSP430 25MHz&lt;br /&gt;
| bspw. 24MHz&lt;br /&gt;
| bis 128KB&lt;br /&gt;
| bis 8+2KB&lt;br /&gt;
| 8 x 12bit&lt;br /&gt;
| PWM&lt;br /&gt;
| 2 USART&lt;br /&gt;
| SPI, I²C&lt;br /&gt;
| verschiedene Ausbaustufen&lt;br /&gt;
| [http://www.ti.com/ TI] zurzeit als Muster&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.st.com/ ST]&lt;br /&gt;
| STM32F10x&lt;br /&gt;
| Full&lt;br /&gt;
| 36..144&lt;br /&gt;
| 3,3V/5V&lt;br /&gt;
| Cortex-M3&lt;br /&gt;
| 72MHz&lt;br /&gt;
| 512KB&lt;br /&gt;
| 64KB&lt;br /&gt;
| 21 x 12bit&lt;br /&gt;
| 2 x 12bit, 32 PWM&lt;br /&gt;
| 5 USART, 1 CAN&lt;br /&gt;
| SPI, I²C, SSC&lt;br /&gt;
| Siehe Artikel [[STM32]]&lt;br /&gt;
| [http://de.farnell.com/ Farnell] ab ca. 5 €&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Ucc/Uio&#039;&#039;&#039; gibt die maximale Betriebsspannung und die maximale Eingangsspannung an Eingabeports an. 3,3V/3,3V heißt: nicht 5V-verträglich!&lt;br /&gt;
* &#039;&#039;&#039;Takt:&#039;&#039;&#039; CPU-Taktfrequenz, bei Microchip ehrlicherweise durch 4 geteilt&lt;br /&gt;
* &#039;&#039;&#039;Async:&#039;&#039;&#039; Anzahl und Art der asynchron-seriellen Schnittstellen (also mit Startbit operierend)&lt;br /&gt;
* &#039;&#039;&#039;Sync:&#039;&#039;&#039; Anzahl und Art der synchron-seriellen Schnittstellen (also mit einer Taktleitung, also auch I²C)&lt;br /&gt;
* &#039;&#039;&#039;SSC:&#039;&#039;&#039; Serielles Interface besonders für Audiochips, verschiedene Namen bei den Mikrocontroller-Herstellern&lt;br /&gt;
&lt;br /&gt;
===Via µC ansteuerbare USB-Controller===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;sortable&amp;quot; id=&amp;quot;usb_controller&amp;quot; style=&amp;quot;border-collapse:collapse;&amp;quot;&lt;br /&gt;
! IC&lt;br /&gt;
! Hersteller&lt;br /&gt;
! Host oder Device&lt;br /&gt;
! IC-Pins&lt;br /&gt;
! Interface&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Bezugs-Quelle(n)&lt;br /&gt;
! Sonstiges&lt;br /&gt;
|-&lt;br /&gt;
| FT232&amp;lt;br&amp;gt;FT245&lt;br /&gt;
| [http://www.ftdichip.com/ FTDI]&lt;br /&gt;
| Device&lt;br /&gt;
| 28-32&lt;br /&gt;
| RS232&amp;lt;br&amp;gt;parallel 8 bit &lt;br /&gt;
| 1 bidirektionale FIFO **&lt;br /&gt;
| [[Elektronikversender#Reichelt|Reichelt]], ab 1,95 €&lt;br /&gt;
| [http://www.intra2net.com/de/produkte/opensource/ftdi/ libftdi] - &#039;&#039;FTDI (bitbang) software collection&#039;&#039; von Intra2net (Opensource)&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| FT232R&lt;br /&gt;
| [http://www.ftdichip.com/ FTDI]&lt;br /&gt;
| Device&lt;br /&gt;
| 28-32&lt;br /&gt;
| RS232/Bitbang/CBUS&lt;br /&gt;
| 1 bidirektionale FIFO **&lt;br /&gt;
| [[Elektronikversender#Reichelt|Reichelt]], ab 3,15 €&lt;br /&gt;
| [http://www.intra2net.com/de/produkte/opensource/ftdi/ libftdi] - &#039;&#039;FTDI (bitbang) software collection&#039;&#039; von Intra2net (Opensource)&lt;br /&gt;
|-&lt;br /&gt;
| FT2232D&lt;br /&gt;
| [http://www.ftdichip.com/ FTDI]&lt;br /&gt;
| Device&lt;br /&gt;
| 48&lt;br /&gt;
| RS232 / parallel 8 bit / I2C, SPI, JTAG&lt;br /&gt;
| 2 bidirektionale FIFOs **&lt;br /&gt;
| [[Elektronikversender#csd-electronics|csd-electronics]] [[Elektronikversender#Watterott electronic|Watterott electronic]]&lt;br /&gt;
| [http://www.intra2net.com/de/produkte/opensource/ftdi/ libftdi] - &#039;&#039;FTDI (bitbang) software collection&#039;&#039; von Intra2net (Opensource)&lt;br /&gt;
|-&lt;br /&gt;
| FT2232H&lt;br /&gt;
| [http://www.ftdichip.com/ FTDI]&lt;br /&gt;
| Device&lt;br /&gt;
| 64&lt;br /&gt;
| RS232 / (synchron/asynchron) parallel 8 bit / I2C, SPI, JTAG&lt;br /&gt;
| 2 bidirektionale FIFOs, HS **&lt;br /&gt;
| &lt;br /&gt;
| [http://www.intra2net.com/de/produkte/opensource/ftdi/ libftdi] - &#039;&#039;FTDI (bitbang) software collection&#039;&#039; von Intra2net (Opensource)&lt;br /&gt;
|-&lt;br /&gt;
| FT4232H&lt;br /&gt;
| [http://www.ftdichip.com/ FTDI]&lt;br /&gt;
| Device&lt;br /&gt;
| 64&lt;br /&gt;
| RS232 / I2C, SPI, JTAG (2 Kanäle)&lt;br /&gt;
| 4 bidirektionale FIFOs, HS **&lt;br /&gt;
| &lt;br /&gt;
| [http://www.intra2net.com/de/produkte/opensource/ftdi/ libftdi] - &#039;&#039;FTDI (bitbang) software collection&#039;&#039; von Intra2net (Opensource)&lt;br /&gt;
|-&lt;br /&gt;
| FT232H&lt;br /&gt;
| [http://www.ftdichip.com/ FTDI]&lt;br /&gt;
| Device&lt;br /&gt;
| 48&lt;br /&gt;
| RS232 / (synchron/asynchron) parallel 8 bit /I2C, SPI, JTAG/CBUS&lt;br /&gt;
| 1 bidirektionale FIFOs, HS **&lt;br /&gt;
| [[Elektronikversender#Reichelt|Reichelt]], ab 3,20 €&lt;br /&gt;
| [http://www.intra2net.com/de/produkte/opensource/ftdi/ libftdi] - &#039;&#039;FTDI (bitbang) software collection&#039;&#039; von Intra2net (Opensource)&lt;br /&gt;
|-&lt;br /&gt;
| PDIUSBD11&lt;br /&gt;
| [http://www.semiconductors.philips.com Philips]&lt;br /&gt;
| Device&lt;br /&gt;
|&lt;br /&gt;
| I²C&lt;br /&gt;
| USB-Device Controller&lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;b&amp;gt;abgekündigt&amp;lt;/b&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PDIUSBD12&lt;br /&gt;
| [http://www.semiconductors.philips.com Philips]&lt;br /&gt;
| Device&lt;br /&gt;
| 28&lt;br /&gt;
| parallel 8 bit&lt;br /&gt;
| 1 bidirektionale FIFO **&lt;br /&gt;
| [[Elektronikversender#Reichelt|Reichelt]], ab 2,65 €&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| MAX3420E&lt;br /&gt;
| [http://www.maxim-ic.com Maxim]&lt;br /&gt;
| Device&lt;br /&gt;
| 24-32&lt;br /&gt;
| SPI&lt;br /&gt;
| Fullspeed-Controller, 4 Endpoints&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [[USBN960x]]&lt;br /&gt;
| National&lt;br /&gt;
| Device&lt;br /&gt;
| 28&lt;br /&gt;
| Datenbus 8 bit, SPI&lt;br /&gt;
| Fullspeed-Controller, 7 Endpoints, 3,3-V-Längsregler enthalten&lt;br /&gt;
| [[Elektronikversender#Reichelt|Reichelt]], ab 4,65 €&lt;br /&gt;
| Siehe [[USBN960x]], &amp;lt;b&amp;gt;NRND&amp;lt;/b&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.silabs.com/tgwWebApp/public/web_content/products/Microcontrollers/Interface/en/interface_documentation.htm CP210x]&lt;br /&gt;
| [http://www.silabs.com Silabs]&lt;br /&gt;
| Device&lt;br /&gt;
|&lt;br /&gt;
| UART&lt;br /&gt;
| USB2.0 kompatibler (arbeitet Fullspeed) UART-USB Umsetzer.&lt;br /&gt;
| &lt;br /&gt;
| Sehr kompakt, Intel MAC OSX: [http://www.mikrocontroller.net/topic/67398#542129 Forenbeitrag] beachten&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.silabs.com/products/interface/usbtouart/Pages/usb-to-uart-bridge.aspx CP2110]&lt;br /&gt;
| [http://www.silabs.com Silabs]&lt;br /&gt;
| Device&lt;br /&gt;
| 24-28&lt;br /&gt;
| UART&lt;br /&gt;
| UART-USB ohne Treiber (HID-Klasse)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.silabs.com/products/interface/usbtouart/Pages/HID-USB-to-SMBus-Bridge.aspx CP2112]&lt;br /&gt;
|[http://www.silabs.com Silabs]&lt;br /&gt;
|Device&lt;br /&gt;
|24&lt;br /&gt;
|SMBUS&lt;br /&gt;
|SMBUS-USB HID&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.prolific.com.tw/eng/Products.asp?ID=59 PL2303]&lt;br /&gt;
| [http://www.prolific.com.tw/ Prolific]&lt;br /&gt;
| Device&lt;br /&gt;
| 28&lt;br /&gt;
| RS232&lt;br /&gt;
| „USB CDC 1.1“-konform&lt;br /&gt;
| &lt;br /&gt;
| Im Gegensatz zum FT232 sollte kein Treiber erforderlich sein: Von wegen!&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.oti.com.tw/oti-6858.html OTI-6858]&lt;br /&gt;
| [http://www.oti.com.tw/ Ours Technology Inc.]&lt;br /&gt;
| Device&lt;br /&gt;
| 28&lt;br /&gt;
| UART&lt;br /&gt;
| USB to RS232 Bridge Controller - USB2.0 bis 12MB&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.arkmicro.com/en/products/view.php?id=10 ARK3116T]&lt;br /&gt;
| [http://www.arkmicro.com/ Arkmicro]&lt;br /&gt;
| Device&lt;br /&gt;
|&lt;br /&gt;
| UART&lt;br /&gt;
| USB-to-UART Controller - USB2 bis 3MB)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| TUSB3410&lt;br /&gt;
| [http://focus.ti.com/ Texas Instruments]&lt;br /&gt;
| Device&lt;br /&gt;
| &lt;br /&gt;
| UART&lt;br /&gt;
| USB to Serial Port Controller &lt;br /&gt;
| [[Elektronikversender#Digi-Key|Digi-Key]], ca. 5,60 €&lt;br /&gt;
| USB 2.0 full Speed, Basis 8052 µC&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.vinculum.com/prd_vnc1l.html VNC1L]&lt;br /&gt;
| [http://www.vinculum.com/ Vinculum]&lt;br /&gt;
| 2x Host&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| Dual USB Host-Controller&lt;br /&gt;
| [[Elektronikversender#Watterott electronic|Watterott electronic]]&lt;br /&gt;
| [http://freshmeat.net/projects/lvprog/?branch_id=71957&amp;amp;release_id=265079 LVProg] is an (X11/Qt)application for programming a ROM file into a Vinculum USB host controller from FTDI. (GPL v2)&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
[[USB-Stick am Mikrocontroller]]&lt;br /&gt;
|-&lt;br /&gt;
| SL811HST&lt;br /&gt;
| [http://www.cypress.com/ Cypress]&lt;br /&gt;
| 1x beides&lt;br /&gt;
| 48&lt;br /&gt;
| Datenbus 8 bit&lt;br /&gt;
| Controller 1 Port&lt;br /&gt;
| [[Elektronikversender#Digikey|Digikey]], [http://www.trade-shop.de/catalog/index.php?cPath=72_173 Air Electronics] ca. 8 €&lt;br /&gt;
| für OTG viel Außenbeschaltung erforderlich&lt;br /&gt;
|-&lt;br /&gt;
| ISP1160&lt;br /&gt;
| [http://www.nxp.com/ Philips/NXP]&lt;br /&gt;
| 2x Host&lt;br /&gt;
| 64&lt;br /&gt;
| Datenbus 16 bit&lt;br /&gt;
| Host-Controller 2 Ports&lt;br /&gt;
| [[Elektronikversender#Reichelt|Reichelt]], ca. 6,85 €&lt;br /&gt;
| für ATmega unzweckmäßig, eher für ARM-Prozessoren&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Reine FIFO-Schaltkreise sind nicht für benutzerspezifische&lt;br /&gt;
Deskriptoren geeignet.&lt;br /&gt;
Damit lassen sich nahezu keine klassenspezifische Geräte-Interfaces&lt;br /&gt;
realisieren.&lt;br /&gt;
Folglich kann man damit bspw. kein HID-Gerät bauen.&lt;br /&gt;
&lt;br /&gt;
NRND = Not recommended for new designs = wird alsbald abgekündigt&lt;br /&gt;
&lt;br /&gt;
UART: Gemeint sind die Signale RxD und TxD sowie Flusskontrolle /RTS und /CTS&lt;br /&gt;
&lt;br /&gt;
RS232: Gemeint ist eine UART mit den 4 Modemsteuersignalen /DTR, /DSR, /DCD und /RI&lt;br /&gt;
&lt;br /&gt;
Tipp: USB-Handy-Datenkabel arbeiten oft mit FT232-ähnlichen Chips!&lt;br /&gt;
&lt;br /&gt;
===USB-Transceiver===&lt;br /&gt;
USB-Transceiver können nur verwendet werden für:&lt;br /&gt;
* speziell dafür ausgelegte Mikrocontroller (PIC 18F2455/2550/4455/4550 u.ä.)&lt;br /&gt;
* FPGAs (wenn diese nicht selbst geeignete Portpins verfügen)&lt;br /&gt;
* [http://www.obdev.at/vusb/ V-USB] (Software-Anpassungen erforderlich)&lt;br /&gt;
Vorteil: Zwischen Transceiver und Mikrocontroller kann eine galvanische Trennstufe angeordnet werden.&lt;br /&gt;
&lt;br /&gt;
Heutzutage ist es besser, einen seriell ansteuerbaren USB-Controller (siehe oben) zu verwenden und dazwischen eine maßgeschneiderte galvanische Trennung.&lt;br /&gt;
Daher sind Transceiver heutzutage eher obsolet.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;sortable&amp;quot; id=&amp;quot;usb_controller&amp;quot; style=&amp;quot;border-collapse:collapse;&amp;quot;&lt;br /&gt;
! IC&lt;br /&gt;
! Hersteller&lt;br /&gt;
! Speed&lt;br /&gt;
! IC-Pins&lt;br /&gt;
! Interface&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Bezugs-Quelle(n)&lt;br /&gt;
|-&lt;br /&gt;
| MAX345xE&lt;br /&gt;
| [http://www.maxim-ic.com Maxim]&lt;br /&gt;
| ?&lt;br /&gt;
| 14-16&lt;br /&gt;
| -&lt;br /&gt;
| Transceiver&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| ISP1106&lt;br /&gt;
| [http://www.nxp.com Philips/NXP]&lt;br /&gt;
| Low, Full&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| Transceiver&lt;br /&gt;
| [[Elektronikversender#Reichelt|Reichelt]], ca. 1,15 €&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Tipps + Tricks ==&lt;br /&gt;
* Selbstgebastelte USB-Hardware an den PC nur über einen anständig konstruierten self-powered Hub anschließen - [http://www.mikrocontroller.net/topic/97331#841881 Forumbeitrag von Rufus t. Firefly]&lt;br /&gt;
* Eine [[Galvanische Trennung | galvanische Trennung]] von USB ist SEHR aufwändig, weil&lt;br /&gt;
** das USB-Signal bidirektional ist&lt;br /&gt;
** USB keine Steuerleitungen hat, man kann nur aus der vollständigen Dekodierung der Daten erfahren, in welche Richtung die Daten jetzt gehen müssen. Dieses Problem betrifft V-USB-basierte Projekte nicht, eine solche Leitung lässt sich leicht nachrüsten.&lt;br /&gt;
** es sehr kurze Antwortzeiten von den USB-ICs verlangt (im Bereich von ~10 Bitzeiten!)&lt;br /&gt;
*Es gibt auf dem Markt einige wenige, aufwändige und damit teure Lösungen. Wer also ein galvanisch getrennte Schnittstelle braucht, sollte &#039;&#039;&#039;nicht&#039;&#039;&#039; USB nehmen. Allerdings ist es leicht möglich, einen USB-RS232/RS485 Wandler galvanisch auf der RS232/RS485 Seite zu trennen. &amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;border: 1px solid black;&amp;quot;&amp;gt;[http://i55.tinypic.com/rsbwoy.png http://i51.tinypic.com/2eq5kcx.png]&amp;lt;/div&amp;gt;Variante mit FT232&amp;lt;/div&amp;gt;&lt;br /&gt;
*Eine einfache Lösung wäre einen FT232 zu verwenden und diesen auf der TTL-Seite mit Optokopplern zu trennen.&lt;br /&gt;
*Die zur Zeit einfachste und kostengünstigste Möglichkeit zur galvanischen Trennung ist der ADUM3160BRWZ oder der ADuM4160 von Analog Devices.&lt;br /&gt;
**Einschränkungen: nur Full- und Low-Speed, keine automatische Erkennung der Übertragungsrate.&lt;br /&gt;
** ADuM3160 im AD Newsletter: [http://www.analog.com/en/interface/digital-isolators/adum3160/products/product.html]&lt;br /&gt;
** [https://www.it-wns.de/themes/kategorie/detail.php?artikelid=979&amp;amp;kategorieid=53&amp;amp;source=1 Leerplatine] für AD4160 im IT-WNS Webshop&lt;br /&gt;
** [http://www.mikrocontroller.net/topic/114555?goto=2065917#2065236 Forumsbeitrag] mit Eagle 3D Bild und Schaltplan&lt;br /&gt;
* [http://www.mikrocontroller.net/search?query=%2BUSB+%2Bgalvanisch&amp;amp;forums%5B%5D=1&amp;amp;forums%5B%5D=19&amp;amp;forums%5B%5D=9&amp;amp;forums%5B%5D=10&amp;amp;forums%5B%5D=2&amp;amp;forums%5B%5D=4&amp;amp;forums%5B%5D=3&amp;amp;forums%5B%5D=6&amp;amp;forums%5B%5D=17&amp;amp;forums%5B%5D=11&amp;amp;forums%5B%5D=8&amp;amp;forums%5B%5D=14&amp;amp;forums%5B%5D=12&amp;amp;forums%5B%5D=7&amp;amp;forums%5B%5D=5&amp;amp;forums%5B%5D=18&amp;amp;forums%5B%5D=15&amp;amp;forums%5B%5D=13&amp;amp;forums%5B%5D=16&amp;amp;max_age=-&amp;amp;sort_by_date=0 Suche nach USB und galvanischer Trennung im Forum]&lt;br /&gt;
&lt;br /&gt;
== Analysetools ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.pcausa.com/Utilities/UsbSnoop/default.htm Sniff USB] - USB Sniffer - freeware - Windows&lt;br /&gt;
* [http://www.openvizsla.org/ OpenVizsla] ([http://www.kickstarter.com/projects/bushing/openvizsla-open-source-usb-protocol-analyzer/posts/62083 OpenVizsla auf kickstarter.com]) - OpenSource USB sniffer, basierend auf XMOS und FPGA (under dev. right now)&lt;br /&gt;
* [http://www.wireshark.org/ Wireshark] - Eigentlich Netzwerk Sniffer, kann aber in neueren Versionen auch USB (insbesondere unter Linux)  [http://wiki.wireshark.org/CaptureSetup/USB Wireshark Wiki, USB]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.lvr.com/usbchips.htm Links to USB Host and Device Controller Chips] by Jan Axelson.&lt;br /&gt;
* [http://replay.waybackmachine.org/20090210000605/http://g.fondeville.free.fr/usb_host_en.html Mass storage host USB example] - The purpose of this article is to introduce a host USB Full Speed implementation. This host is designed to control MASS storage peripherals like USB key, cameras, hard drive... ([[PIC]]18F452, Cypress SL811HS)&lt;br /&gt;
* [http://chaosradio.ccc.de/cre086.html ChaosradioExpress #86 USB] - Der Universal Serial Bus im Detail. Podcast mit Tim Pritlove (Moderation) und Daniel Mack &lt;br /&gt;
* [http://hackaday.com/2008/11/19/how-to-the-bus-pirate-universal-serial-interface/ Bus Pirate (hackaday.com)] - How-to: The Bus Pirate, universal serial interface USB &amp;lt;-&amp;gt; [[I2C]], [[SPI]], Async. Seriell [[UART]]. Firmware-Update für die [http://hackaday.com/2008/12/01/bus-pirate-firmware-update-v0c-jtag-and-more/ Ergänzung] u.a. für [[JTAG]]. Das Herzstück ist ein PIC24FJ64GA002.&lt;br /&gt;
* [http://www.sourceforge.net/projects/easyusb EasyUSB] - Generischer USB Treiber für Windows&lt;br /&gt;
* [http://www.embedded24.net AHID.DLL] - Noch ein generischer USB Treiber für Windows (C++/C#/VB/MinGW/wxWidgets)&lt;br /&gt;
* [http://www.embedded.com/design/219400265 Simple circuit prevents USB current overshoot during insertion] von Luciano Bordogna (MAXIM) auf www.embedded.com&lt;br /&gt;
* [http://www.circuitsathome.com/mcu/usb/usb-isolator USB-Isolator]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:USB| ]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Controller_an_230V&amp;diff=63132</id>
		<title>Controller an 230V</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Controller_an_230V&amp;diff=63132"/>
		<updated>2012-01-06T13:47:27Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Besser: Querregler */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Lupin]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Da immer wieder mal die Frage aufkommt, wie man eine eigene Schaltung direkt am Netz betreiben kann soll hier ein Artikel entstehen, welcher die Möglichkeiten zur Erzeugung einer angemessenen Gleichspannung aufzeigt.&lt;br /&gt;
&lt;br /&gt;
Aber zuerst eine Warnung die ernst genommen werden sollte (!!!):&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Arbeiten an Netzspannung ist lebensgefährlich!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Deshalb sollte man nie direkt an Netzspannung arbeiten, wenn überhaupt nur mit entsprechenden Schutzeinrichtungen (z.&amp;amp;nbsp;B. Trenntrafo) und dann auch nur wenn man über die nötige Erfahrung verfügt. Aber grundsätzlich ist Vorsicht geboten.&lt;br /&gt;
&lt;br /&gt;
Wer nicht ganz genau weiss womit er es zu tun hat sollte lieber eine sichere Lösung verwenden wie z.&amp;amp;nbsp;B. die Stromversorgung aus einem VDE zugelassenen Trafo oder fertige Steckernetzteile.&lt;br /&gt;
&lt;br /&gt;
== Stecker(schalt)netzteil ==&lt;br /&gt;
&lt;br /&gt;
Die sicherste Lösung ist die Verwendung eines Steckernetzteils welches eine galvanisch getrennte Gleichspannung bereit stellt. Wer ganz auf Nummer Sicher gehen will achtet auf das GS (Geprüfte Sicherheit) Kennzeichen auf dem Netzteil:&lt;br /&gt;
&lt;br /&gt;
[[Bild:SteckerNetzteile.jpg|500px]]&lt;br /&gt;
&lt;br /&gt;
Zwei Steckernetzteile. Das Linke hat eine ungeregelte Ausgangsspannung (Trafo-&amp;gt;Gleichrichtung-&amp;gt;Siebung). Das Rechte hat eine nachgeschaltete Regelung mit einstellbarer Ausgangsspannung.&lt;br /&gt;
&lt;br /&gt;
Die Spannung wird meist über Hohlstecker zur Schaltung geführt.&lt;br /&gt;
&lt;br /&gt;
Billige Steckernetzteile geben eine ungeregelte Spannung aus, sie verändert sich mit der Last. In diesem Falle ist keine direkte Versorgung der Schaltung möglich und die Eingangsspannung sollte mit einen Spannungsregler geregelt werden:&lt;br /&gt;
&lt;br /&gt;
[[Bild:V_Regler.gif]]&lt;br /&gt;
&lt;br /&gt;
== Trafonetzteil ==&lt;br /&gt;
&lt;br /&gt;
Ein Trafonetzteil besteht aus einem Netztrafo, einer Gleichrichtung, einer Siebung und einer Regelung.&lt;br /&gt;
&lt;br /&gt;
* Der Netztrafo stellt eine galvanisch getrennte Wechselspannung am Ausgang bereit, diese Spannungs ist bedeutend kleiner als die Eingangsspannung.&lt;br /&gt;
&lt;br /&gt;
* Die Gleichrichtung wandelt diese Wechselspannung in eine Gleichspannung. Die Siebung entfernt die restlichen Wechselspannungsanteile (nach einer Vollbrückengleichrichtung beträgt die Wechselspannungsfrequenz 100 Hz).&lt;br /&gt;
&lt;br /&gt;
* Die Regelung kann u.U. auch weggelassen werden, wenn keine genaue Ausgangsspannung gefordert ist. Aber ohne Regelung würde die Ausgangsspannung je nach Belastung schwanken. Die Regelung sorgt dafür, dass unabhängig von der Belastung des Netzteils die gewünschte Ausgangsspannung konstant am Ausgang anliegt.&lt;br /&gt;
&lt;br /&gt;
Die Ausgangsspannung des Trafos ist immer höher als die Ausgangsspannung des Reglers, da der Regler einen gewissen Arbeitsbereich benötigt, die sogenannte Dropout-Spannung. &lt;br /&gt;
&lt;br /&gt;
Die Leistung, die durch den Regler in Wärme umgesetzt wird errechnet sich wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;P_{Verlust}=(U_{Ein}-U_{Aus}) \cdot I_{Aus}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei 10 Volt am Eingang des Spannungsreglers, einer Ausgangsspannung von 5 Volt und einem Strom von 1 Ampere ergibt das eine Verlustleistung von 5 Watt. Hört sich nicht viel an, allerdings beträgt die Ausgangsleistung auch nur 5 Watt. Das Ergibt einen Wirkungsgrad von 50%. Dazu kommen aber noch Verluste welche im Transformator entstehen. Der Spannungsregler braucht dann einen [[Kühlkörper]].&lt;br /&gt;
&lt;br /&gt;
[[Bild:Trafont.gif]]&lt;br /&gt;
&lt;br /&gt;
Ein Trafonetzteil hat auch den Nachteil, daß es durch den schweren Eisenkern nicht sehr handlich ist.&lt;br /&gt;
&lt;br /&gt;
Es gibt Printtransformatoren, welche sich auf die Leiterplatte löten lassen. So ist es möglich das Netzteil in die eigene Schaltung zu integrieren. Der Anschluss der 230V Netzspannung birgt allerdings eine Gefahr.&lt;br /&gt;
&lt;br /&gt;
=== Sparsames Trafonetzteil für Dauerbetrieb ===&lt;br /&gt;
&lt;br /&gt;
Möchte man eine besonders sparsame Stromversorgung aufbauen, welche eine sehr kleine, sparsame Schaltung das ganze Jahr über betreiben soll, empfiehlt es sich, neben der Beachtung der Konzepte zum Stromsparen per [[Sleep Mode]] und [[Ultra low power]], von den bekannten Minitrafos mit nur 0,5-1VA zwei statt einem zu nutzen. Dabei werden jeweils Primär- und Sekundärwicklung in Reihe geschaltet. Warum?&lt;br /&gt;
&lt;br /&gt;
Weil diese Trafos auf Kante dimensioniert sind, um Material und Bauvolumen zu sparen, und bei Nennspannung schon ordentlich in die magnetische Sättigung gehen. Dabei entstehen große Verluste durch Stromspitzen auf der Primärseite. Eine genauere Erklärung findet man im Artikel [[Transformatoren und Spulen]]. Bei der Reihenschaltung sieht jeder Trafo nur die halbe Spannung, damit kommt er nicht so stark in die Sättigung und es wird deutlich weniger Energie sinnlos verbraucht. Dazu noch einen stromsparenden Spannungsregler ala LP2950 und das Ganze braucht weniger als 0,5W.&lt;br /&gt;
&lt;br /&gt;
In diesem [http://www.mikrocontroller.net/topic/191871#1875697 Forumsbeitrag] wure exemplarisch ein solcher Trafo vermessen.&lt;br /&gt;
&lt;br /&gt;
*Kanal 1 Eingangsstrom&lt;br /&gt;
*Kanal 2 Eingangsspannung&lt;br /&gt;
*Kanal M Leistung&lt;br /&gt;
&lt;br /&gt;
Einmal mit 120V Eingangsspannung (163mW) und einmal mit 230V (1550mW), die Unterschiede sind immens. Selbst wenn man die Verluste bei 120V bei der Reihenschaltung von zwei Stück verdoppelt, erreicht man in Summe eine Verringerung der Leerlaufverluste um den Faktor fünf!&lt;br /&gt;
&lt;br /&gt;
== Versorgung über Vorwiderstand/Kondensator ==&lt;br /&gt;
&lt;br /&gt;
Wenn nur sehr kleine Ausgangsströme benötigt werden, so kommt die Verwendung eines einfachen Netzteils in Frage, welches einen Vorwiderstand verwendet um die Netzspannung herabzusetzen. Da es sich bei der Netzspannung um eine Wechselspannung handelt, eignen sich neben rein ohmschen Widerständen auch Kondensatoren und Spulen als Vorwiderstand. Praktisch werden Spulen jedoch nie verwendet, weil diese zu groß wären. Da aus Energiegründen meist Kondensatoren verwendet werden, spricht man auch umgangssprachlich vom Kondensatornetzteil.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Capnt.gif | framed | ohne | 5V / 10mA Kondensatornetzteil]]&lt;br /&gt;
&lt;br /&gt;
Der Kondensator C1 bildet hier den kapazitiven Vorwiderstand für unser Kondensatornetzteil, seine Impedanz bestimmt den Strom. Der Vorteil gegenüber einem Widerstand ist, dass keine Wirkleistung erzeugt wird, sprich es entsteht keine Wärme. Wenn wir alle Spannungsabfälle durch die übrigen Bauteile vernachlässigen, können wir einfach mit...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathrm{X_{C}= {1 \over {2 \pi \cdot f \cdot C}} }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathrm{X_{C1}= {1 \over {2 \pi \cdot 50Hz \cdot C}} }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...die Impedanz des Kondensators an 50 Hz Wechselspannung errechnen (wir vernachlässigen den ohmschen Reihenwiderstand des Kodensators und betrachten seinen Blindwiderstand als Impedanz).&lt;br /&gt;
&lt;br /&gt;
Für 10 mA bei 230V brauchen wir einen Ersatzwiderstand von:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathrm{R_{Ersatz}= {230V - 12V \over 10mA} = {22k \Omega} }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das ergibt nach Gleichsetzen von X(C1) = 22 kΩ und Umstellen nach C eine rechnerische Kapazität von 145 nF. Eine Kapazität von 150nF würde gut passen und ist als Standardwert verfügbar. Mit der Wahl eines etwas größeren Kondensators kommen wir rechnerisch über 10mA und haben dadurch ein wenig mehr Luft nach oben. Der Kondensator als kapazitiver Vorwiderstand erzeugt keine Wärme, nur etwas Phasenverschiebung zwischen Strom und Spannung. Ein 22-kΩ-Widerstand würde 2,2 W Verlustleistung als Wärme erzeugen. Der Rest der Schaltung erklärt sich relativ einfach.&lt;br /&gt;
&lt;br /&gt;
* Sicherung F1 soll vor möglichen Schwelbränden im Falle eines Kurzschlusses schützen. Brandsichere Widerstände R1 und R2 erfüllen den gleichen Zweck.&lt;br /&gt;
* R1 und R2 begrenzen zusammen den Einschaltstrom, sollte die Schaltung beim Sinusscheitelpunkt angeschlossen werden (Eingangsspannung kurzzeitig 325V). Es wurden zwei Widerstände verwendet, damit sich der Spannungsfall über beide Widerstände aufteilt, denn normale Widerstände sind nur bis 200 V belastbar. Der kurzzeitig hohe Ladestrom, der nur von diesen Widerständen begrenzt wird, wird von C2 und D1 aufgenommen.&lt;br /&gt;
* R3 und R4 dienen als Entladewiderstände für C1, damit nach Trennen vom Netz keine gefährliche Ladung im Kondensator verbleibt. Auch hier werden zwecks Spannungsaufteilung zwei Widerstände verwendet.&lt;br /&gt;
* Der Brückengleichrichter B1 richtet die Wechselspannung in eine Gleichspannung.&lt;br /&gt;
* Die [[Diode#Z-Diode | Z-Diode]] D1 begrenzt die maximale Eingangsspannung für IC1. Sie muss lediglich so gewählt werden, dass der Spannungsregler noch sauber arbeiten kann.&lt;br /&gt;
* Die Eingangsspannung für IC1 wird durch C2 und C3 gepuffert. Die Wechselspannungsanteile der gleichgerichteten Spannung sind dadurch sehr gering.&lt;br /&gt;
* IC1 ist der Spannungsregler, er erzeugt die 5V Ausgangsspannung. C4 soll ein Schwingen des Reglers verhindern.&lt;br /&gt;
* IC1 kann alternativ auch mit einem stromsparenden Regler wie z.B LP2950 bestückt werden, dadurch stehen 3..5mA mehr für die Schaltung zur Verfügung, welche sonst vom 7805 verbraucht werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung!&#039;&#039;&#039; Es ist wichtig zu wissen, daß zwischen den Punkten &amp;quot;+5V&amp;quot; und &amp;quot;GND&amp;quot; im Normalfall nur ein Potential von 5 Volt anliegt und der Strom auch durch die Schaltung begrenzt wird. Aber das Potential gegen Erde ist immer noch lebensgefährlich, da bei dieser Netzteilart keine galvanische Trennung stattfindet. Solch eine Schaltung &#039;&#039;&#039;muss&#039;&#039;&#039; man in ein Gehäuse verbauen, welches vor Berührung mit leitfähigen Teilen schützt (Schutzklasse I oder II).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;WARNUNG!!! Wirklich niemals (!) leitfähige Teile einer Schaltung berühren, die vom Stromnetz nicht galvanisch getrennt sind!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ein halbwegs sicherer Umgang mit der Schaltung ist dann möglich, wenn man über einen Trenntrafo eine galvanische Trennung zum Netz herstellt und hinter dem Trenntrafo mit der Schaltung arbeitet.&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.grosse-elektronik.de/das-elko/trlosestr/index.html Stromversorgung über Vorwiderstand oder Kondensator ausführlich erklärt]&lt;br /&gt;
* [http://www.elektronik-kompendium.de/public/schaerer/cpowsup.htm Direkte 230V Versorgung im ELKO]&lt;br /&gt;
* [http://www.trifolium.de/netzteil/kap13.html Auschnitt auch &amp;quot;Das Netzteil- und Konverterbuch&amp;quot;]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/192090?goto=new#new Forenbeitrag: Weitbereichslinearregler mit kleinem Ausgangsstrom]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/194814#new Forenbeitrag: Weitbereichslinearregler mit kleinem Ausgangsstrom, weitere Vorschläge]&lt;br /&gt;
&lt;br /&gt;
=== Besser: Querregler ===&lt;br /&gt;
[http://commons.wikimedia.org/wiki/File%3ACapacitive_Power_Supply.png]&lt;br /&gt;
Die Verwendung von &#039;&#039;Längsreglern&#039;&#039; (etwa 78L05) ist bei dieser Netzteilart ungünstig, da eine Vorregelung per Zener-Diode erforderlich ist.&lt;br /&gt;
Besser ist die Verwendung eines &#039;&#039;Querreglers&#039;&#039; (etwa TL431). Dessen Vorwiderstand wird so dimensioniert, dass die Spannungsschwankungen am Ladekondensator bei maximalem Entnahmestrom gerade ausgeglichen werden können. In diesem Fall erscheinen 150 Ω angemessen, für 1,5 V Ripplespannung an C2. Auf diese Weise erhält man einen Low-Drop-Spannungsregler mit – ohnehin erforderlichem – konstanten Stromverbrauch.&lt;br /&gt;
&lt;br /&gt;
Merke: Die Wirkleistungsaufnahme solcher Netzteilschaltungen ist proportional zur Ladespannung am Elko C2. Daher ist diese möglichst niedrig anzusetzen.&lt;br /&gt;
Kondensatornetzteile sind eher &#039;&#039;Stromquellen&#039;&#039; als &#039;&#039;Spannungsquellen&#039;&#039;, was bei der Schaltungsdimensionierung zu beachten bzw. auszunutzen ist.&lt;br /&gt;
&lt;br /&gt;
=== Relais-Schaltungen ===&lt;br /&gt;
Derartige Netzteile werden gern zur Ansteuerung von Relais eingesetzt. Um die Stromaufnahme und damit den Kondensator C1 möglichst klein zu halten (Kostenfaktor), werden gern 24-V-Typen benutzt, die sich mit 10 .. 20 mA Anzugstrom begnügen. Das ergibt aber trotzdem 0,25 .. 0,5 W Leistungsaufnahme, die von einem Konstantspannungsnetzteil permanent zur Verfügung gestellt wird und damit stets irgendwo verheizt wird, auch wenn das Relais nicht arbeitet.&lt;br /&gt;
&lt;br /&gt;
Eine Lösung des Problems ist die Umschaltung der Ausgangsspannung an C2. Damit kann die Relaisspule parallel zu C2 betrieben werden und wird zum Ausschalten durch einen Transistor mit Z-Diode am Kollektor gebrückt (ein selbstleitender SFET oder MOSFET liegt da nahe). Hauptsache, das Relais fällt bei – angenommen – 4 V auch tatsächlich ab. Die Freilaufdiode entfällt. Die Steuerschaltung (angenommen für 3 V) wird in diesem Fall mit einem Low-Drop-Längsregler mit genügend großem Eingangsspannungsbereich versorgt.&lt;br /&gt;
&lt;br /&gt;
[http://commons.wikimedia.org/wiki/File:Capacitive_power_supply_%2B_relay.png]&lt;br /&gt;
Eine andere Lösung verwendet eine Reihenschaltung sogar mehrerer Relaiswicklungen, die jeweils per Überbrückung abgeschaltet werden. In diesem Fall hat C2 bei höherer Spannungsfestigkeit eine vergleichsweise kleine Kapazität, da das Ripple größer ausfallen darf, da die Selbstinduktivität der Relaiswicklung(en) für Konstantstrom sorgt und C2 „leersaugt“.&lt;br /&gt;
&lt;br /&gt;
== Schaltnetzteil ==&lt;br /&gt;
&lt;br /&gt;
Schaltnetzteile sind heutzutage weit verbreitet, da sie gegenüber konventionellen Netzteilen eine kompaktere Bauweise, einen höheren Wirkungsgrad und geringere Produktionskosten aufweisen.&lt;br /&gt;
&lt;br /&gt;
Zur Versorgung einer eigenen Schaltung eignen sich am besten Steckernetzteile (auch &amp;quot;Wandwarzen&amp;quot; genannt :)) welche eine mehr oder weniger gut geregelte Ausgangsspannung bereit stellen.&lt;br /&gt;
&lt;br /&gt;
Um das Schaltnetzteil direkt in eine eigene Schaltung zu integrieren, ist die einzige Möglichkeit die Verwendung von fertigen AC/DC Modulen welche meist relativ teuer sind (im Vergleich zu Steckernetzteilen). Dafür bieten Fertigmodule meist gut spezifizierte Betriebsparameter und sind bei namhaften Herstellern auch über mehrere Jahre hinweg lieferbar. Ausserdem sind die leicht anwendbar, man muss kein Schaltnetzteilprofi sein.&lt;br /&gt;
&lt;br /&gt;
Als Alternative zum Kauf von fertigen Schaltnetzteilen soll im folgenden ein 230VAC-&amp;gt;5VDC Netzteil vorgestellt werden. Allerdings rate ich davon ab solch ein Netzteil in Umlauf zu bringen. Das Ganze dient eher als proof of concept und natürlich wurde das Netzteil nicht nach den geltenden Sicherheits- und EMV-Bestimmungen geprüft. Die Schaltung ist ausschließlich für eigene Experimente/Schaltungen gedacht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Download&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hier die ZIP Datei mit der EAGLE .brd- und .sch-Datei:&lt;br /&gt;
[http://www.mikrocontroller.net/wikifiles/9/94/Tiny_SMPS_eagle.zip Eagle Dateien downloaden]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spezifikation&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Eingangsspannung 85VAC bis 265VAC @ 50-400 Hz&lt;br /&gt;
* Ausgangsspannung 5 Volt / 1 Ampere&lt;br /&gt;
&lt;br /&gt;
TODO: Ein paar mehr Messungen durchführen...&lt;br /&gt;
&lt;br /&gt;
Eingangsspannung kann auch unter 85VAC liegen (siehe Anmerkungen).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Smps5v_sch.gif]]&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan im Detail (von links nach rechts):&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Primärseite&#039;&#039;&lt;br /&gt;
* F2 ist eine träge Sicherung (1 Ampere). Sie sichert die Schaltung ab, sollte auf der Primärseite ein Kurzschlussstrom fließen&lt;br /&gt;
* Der Brückengleichrichter richtet die Netzspannung gleich&lt;br /&gt;
* C9, L1, C2 bilden einen Pi-Filter. Über den Kondensatoren liegt bei 230VAC Eingangsspannung eine Spannung von ungefähr 310 Volt an&lt;br /&gt;
* C5, R1, D3 bilden ein [[Snubber]]-Netzwerk (Klemmschaltung) - dieses Netzwerk &amp;quot;verbrät&amp;quot; die Leistung welche beim Abschalten des Leistungstransistors in die Primärwicklung induziert wird (da sich die Spannungsverhältnisse umkehren)&lt;br /&gt;
* Der Regler-IC ohne Bezeichnung ist ein TNY264 - er integriert eine fortschrittliche [[PWM]]-Regelung (dabei handelt es sich um eine PWM mit variabler Frequenz und Frequenz-Jitter), eine primärseitige Strombegrenzung, einen Fehlereingang und die Erzeugung seiner eigenen Betriebsspannung aus der Netzspannung&lt;br /&gt;
* Der Trafo T1 ist ein Sperrwandlertrafo mit Luftspalt (Kern E16)&lt;br /&gt;
* C8 unterdrückt hochfrequente EMV Störungen - Wichtig: Der Kondensator muss der Klasse Y1 entsprechen um die Sicherheit zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Sekundärseite&#039;&#039;&lt;br /&gt;
* D2 dient als Gleichrichterdiode&lt;br /&gt;
* C4, L2, C3 bilden einen weiteren Pi-Filter zur Filterung der Ausgangsspannung&lt;br /&gt;
* Über [[Diode#Z-Diode | Zener Diode]] D1, R2 und Optokoppler OK1 wird die Ausgangsspannung zum Regler IC zurück gekoppelt. Der Regler versucht einen konstanten Strom durch den Transistor in OK1 fließen zu lassen, dadurch wird auf der Sekundärseite eine konstante Ausgangsspannung erzeugt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkungen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Zwischen L und N hätte man auch noch einen Varistor zur Überspannungsbegrenzung und einen X Kondensator (nach der Sicherung!) zur Unterdrückung von HF schalten können&lt;br /&gt;
* Zur Verbesserung der EMV hätte man auch noch eine Netzdoppeldrossel verwenden können. Diese Drossel würde Gegentaktstörungen verringern. Allerdings lässt sich auch mit einer einfachen Drossel eine ausreichende EMV erreichen (ob das bei dieser Schaltung der Fall ist weiss ich nicht und würde ich bezweifeln)&lt;br /&gt;
* Bei Versuchen am Labornetzteil stellte sich heraus, dass das Netzteil schon bei 50VDC Versorgung funktioniert. Einen Belastungstest habe ich bei dieser Spannung nicht durchgeführt, aber dadurch hat man die Möglichkeit das Netzteil gefahrlos zu erproben.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Layout&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Smps5v_brd.gif]]&lt;br /&gt;
&lt;br /&gt;
Zum Layout gibt es nicht viel zu sagen. Abstände wurden so groß wie möglich gehalten und der größte Teil des Layouts wurde mit großzügigen Kupferflächen realisiert, um eine gute Wärmeableitung und eine niederohmige Anbindung zu erhalten. Ob das Layout VDE-konform ist kann ich nicht sagen. Der Abstand zwischen Primär- und Sekundärseite sollte allerdings groß genug sein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stückliste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Netzteil wurde so gestaltet, dass alle Bauteile bei Farnell bestellt werden können. Nur die Platine muss man sich natürlich selbst ätzen.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;sortable&amp;quot; id=&amp;quot;stueckliste&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Stromlauf&lt;br /&gt;
! Bestellnummer&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (1 Stück)&lt;br /&gt;
|-&lt;br /&gt;
| F2&lt;br /&gt;
| 3030076&lt;br /&gt;
| Sicherung - 1A, Flink&lt;br /&gt;
| 0,62 €&lt;br /&gt;
|-&lt;br /&gt;
| B1&lt;br /&gt;
| 1467468&lt;br /&gt;
| DF04M Brückengleichrichter - 1.5A, 400V&lt;br /&gt;
| 0,21 €&lt;br /&gt;
|-&lt;br /&gt;
| C9 C2&lt;br /&gt;
| 1165626&lt;br /&gt;
| Kondensator Vishay - 4.7µF, 400V&lt;br /&gt;
| 0,23 €&lt;br /&gt;
|-&lt;br /&gt;
| L1&lt;br /&gt;
| 1077038&lt;br /&gt;
| Drossel - 2.2mH&lt;br /&gt;
| 1,25 €&lt;br /&gt;
|-&lt;br /&gt;
| IC1&lt;br /&gt;
| 9921320&lt;br /&gt;
| TNY264PN&lt;br /&gt;
| 1,65 €&lt;br /&gt;
|-&lt;br /&gt;
| D3&lt;br /&gt;
| 1299306&lt;br /&gt;
| SF18G Diode - 1A, 600V&lt;br /&gt;
| 0,23 €&lt;br /&gt;
|-&lt;br /&gt;
| C5&lt;br /&gt;
| 1141794&lt;br /&gt;
| Kondensator Vishay - 2.2nF, 1kV&lt;br /&gt;
| 0,22 €&lt;br /&gt;
|-&lt;br /&gt;
| R1&lt;br /&gt;
| &lt;br /&gt;
| Widerstand - 1/4W, 200k Ohm&lt;br /&gt;
| 0,05 €&lt;br /&gt;
|-&lt;br /&gt;
| C8&lt;br /&gt;
| 3531971&lt;br /&gt;
| Kondensator X1/Y1 Murata - 1nF, 4kV&lt;br /&gt;
| 0,31 €&lt;br /&gt;
|-&lt;br /&gt;
| T1&lt;br /&gt;
| 1214650&lt;br /&gt;
| Trafo Myrra 74094&lt;br /&gt;
| 4,20 €&lt;br /&gt;
|-&lt;br /&gt;
| D2&lt;br /&gt;
| 9907637&lt;br /&gt;
| Schottky Diode STPS2L60 - 2A&lt;br /&gt;
| 0,30 €&lt;br /&gt;
|-&lt;br /&gt;
| C4 C3&lt;br /&gt;
| 1219462&lt;br /&gt;
| Kondensator Panasonic - 470µF, 16V&lt;br /&gt;
| 0,37 €&lt;br /&gt;
|-&lt;br /&gt;
| L2&lt;br /&gt;
| 1077049&lt;br /&gt;
| Drossel - 10µH&lt;br /&gt;
| 1,25 €&lt;br /&gt;
|-&lt;br /&gt;
| D1&lt;br /&gt;
| 1097231&lt;br /&gt;
| Zener BZX79-C3V9 - 3.9 Volt, 500mW&lt;br /&gt;
| 0,11 €&lt;br /&gt;
|-&lt;br /&gt;
| R2&lt;br /&gt;
| &lt;br /&gt;
| Widerstand - 1/4W, 100Ω&lt;br /&gt;
| 0,05 €&lt;br /&gt;
|-&lt;br /&gt;
| OK1&lt;br /&gt;
| 9707700&lt;br /&gt;
| Optokoppler PC817&lt;br /&gt;
| 0,36 €&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Macht zusammen 11,88€. Das steht im grunde im keinen Verhältnis zu einem gekauften 5V/1A Netzteil, denn das kostet in etwa das Gleiche und ist bereits fertig aufgebaut und nach gültigen Normen geprüft. Die Eigenentwicklung solcher Netzteile lohnt sich nur in sehr großen Stückzahlen von 10.000 Stück und mehr und wenn man auf dem Gebiet viel Erfahrung hat. &lt;br /&gt;
&lt;br /&gt;
[[Category:1. Wettbewerb]]&lt;br /&gt;
[[Category:Spannungsversorgung und Energiequellen]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Controller_an_230V&amp;diff=63131</id>
		<title>Controller an 230V</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Controller_an_230V&amp;diff=63131"/>
		<updated>2012-01-06T13:46:59Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Relais-Schaltungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Lupin]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Da immer wieder mal die Frage aufkommt, wie man eine eigene Schaltung direkt am Netz betreiben kann soll hier ein Artikel entstehen, welcher die Möglichkeiten zur Erzeugung einer angemessenen Gleichspannung aufzeigt.&lt;br /&gt;
&lt;br /&gt;
Aber zuerst eine Warnung die ernst genommen werden sollte (!!!):&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Arbeiten an Netzspannung ist lebensgefährlich!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Deshalb sollte man nie direkt an Netzspannung arbeiten, wenn überhaupt nur mit entsprechenden Schutzeinrichtungen (z.&amp;amp;nbsp;B. Trenntrafo) und dann auch nur wenn man über die nötige Erfahrung verfügt. Aber grundsätzlich ist Vorsicht geboten.&lt;br /&gt;
&lt;br /&gt;
Wer nicht ganz genau weiss womit er es zu tun hat sollte lieber eine sichere Lösung verwenden wie z.&amp;amp;nbsp;B. die Stromversorgung aus einem VDE zugelassenen Trafo oder fertige Steckernetzteile.&lt;br /&gt;
&lt;br /&gt;
== Stecker(schalt)netzteil ==&lt;br /&gt;
&lt;br /&gt;
Die sicherste Lösung ist die Verwendung eines Steckernetzteils welches eine galvanisch getrennte Gleichspannung bereit stellt. Wer ganz auf Nummer Sicher gehen will achtet auf das GS (Geprüfte Sicherheit) Kennzeichen auf dem Netzteil:&lt;br /&gt;
&lt;br /&gt;
[[Bild:SteckerNetzteile.jpg|500px]]&lt;br /&gt;
&lt;br /&gt;
Zwei Steckernetzteile. Das Linke hat eine ungeregelte Ausgangsspannung (Trafo-&amp;gt;Gleichrichtung-&amp;gt;Siebung). Das Rechte hat eine nachgeschaltete Regelung mit einstellbarer Ausgangsspannung.&lt;br /&gt;
&lt;br /&gt;
Die Spannung wird meist über Hohlstecker zur Schaltung geführt.&lt;br /&gt;
&lt;br /&gt;
Billige Steckernetzteile geben eine ungeregelte Spannung aus, sie verändert sich mit der Last. In diesem Falle ist keine direkte Versorgung der Schaltung möglich und die Eingangsspannung sollte mit einen Spannungsregler geregelt werden:&lt;br /&gt;
&lt;br /&gt;
[[Bild:V_Regler.gif]]&lt;br /&gt;
&lt;br /&gt;
== Trafonetzteil ==&lt;br /&gt;
&lt;br /&gt;
Ein Trafonetzteil besteht aus einem Netztrafo, einer Gleichrichtung, einer Siebung und einer Regelung.&lt;br /&gt;
&lt;br /&gt;
* Der Netztrafo stellt eine galvanisch getrennte Wechselspannung am Ausgang bereit, diese Spannungs ist bedeutend kleiner als die Eingangsspannung.&lt;br /&gt;
&lt;br /&gt;
* Die Gleichrichtung wandelt diese Wechselspannung in eine Gleichspannung. Die Siebung entfernt die restlichen Wechselspannungsanteile (nach einer Vollbrückengleichrichtung beträgt die Wechselspannungsfrequenz 100 Hz).&lt;br /&gt;
&lt;br /&gt;
* Die Regelung kann u.U. auch weggelassen werden, wenn keine genaue Ausgangsspannung gefordert ist. Aber ohne Regelung würde die Ausgangsspannung je nach Belastung schwanken. Die Regelung sorgt dafür, dass unabhängig von der Belastung des Netzteils die gewünschte Ausgangsspannung konstant am Ausgang anliegt.&lt;br /&gt;
&lt;br /&gt;
Die Ausgangsspannung des Trafos ist immer höher als die Ausgangsspannung des Reglers, da der Regler einen gewissen Arbeitsbereich benötigt, die sogenannte Dropout-Spannung. &lt;br /&gt;
&lt;br /&gt;
Die Leistung, die durch den Regler in Wärme umgesetzt wird errechnet sich wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;P_{Verlust}=(U_{Ein}-U_{Aus}) \cdot I_{Aus}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei 10 Volt am Eingang des Spannungsreglers, einer Ausgangsspannung von 5 Volt und einem Strom von 1 Ampere ergibt das eine Verlustleistung von 5 Watt. Hört sich nicht viel an, allerdings beträgt die Ausgangsleistung auch nur 5 Watt. Das Ergibt einen Wirkungsgrad von 50%. Dazu kommen aber noch Verluste welche im Transformator entstehen. Der Spannungsregler braucht dann einen [[Kühlkörper]].&lt;br /&gt;
&lt;br /&gt;
[[Bild:Trafont.gif]]&lt;br /&gt;
&lt;br /&gt;
Ein Trafonetzteil hat auch den Nachteil, daß es durch den schweren Eisenkern nicht sehr handlich ist.&lt;br /&gt;
&lt;br /&gt;
Es gibt Printtransformatoren, welche sich auf die Leiterplatte löten lassen. So ist es möglich das Netzteil in die eigene Schaltung zu integrieren. Der Anschluss der 230V Netzspannung birgt allerdings eine Gefahr.&lt;br /&gt;
&lt;br /&gt;
=== Sparsames Trafonetzteil für Dauerbetrieb ===&lt;br /&gt;
&lt;br /&gt;
Möchte man eine besonders sparsame Stromversorgung aufbauen, welche eine sehr kleine, sparsame Schaltung das ganze Jahr über betreiben soll, empfiehlt es sich, neben der Beachtung der Konzepte zum Stromsparen per [[Sleep Mode]] und [[Ultra low power]], von den bekannten Minitrafos mit nur 0,5-1VA zwei statt einem zu nutzen. Dabei werden jeweils Primär- und Sekundärwicklung in Reihe geschaltet. Warum?&lt;br /&gt;
&lt;br /&gt;
Weil diese Trafos auf Kante dimensioniert sind, um Material und Bauvolumen zu sparen, und bei Nennspannung schon ordentlich in die magnetische Sättigung gehen. Dabei entstehen große Verluste durch Stromspitzen auf der Primärseite. Eine genauere Erklärung findet man im Artikel [[Transformatoren und Spulen]]. Bei der Reihenschaltung sieht jeder Trafo nur die halbe Spannung, damit kommt er nicht so stark in die Sättigung und es wird deutlich weniger Energie sinnlos verbraucht. Dazu noch einen stromsparenden Spannungsregler ala LP2950 und das Ganze braucht weniger als 0,5W.&lt;br /&gt;
&lt;br /&gt;
In diesem [http://www.mikrocontroller.net/topic/191871#1875697 Forumsbeitrag] wure exemplarisch ein solcher Trafo vermessen.&lt;br /&gt;
&lt;br /&gt;
*Kanal 1 Eingangsstrom&lt;br /&gt;
*Kanal 2 Eingangsspannung&lt;br /&gt;
*Kanal M Leistung&lt;br /&gt;
&lt;br /&gt;
Einmal mit 120V Eingangsspannung (163mW) und einmal mit 230V (1550mW), die Unterschiede sind immens. Selbst wenn man die Verluste bei 120V bei der Reihenschaltung von zwei Stück verdoppelt, erreicht man in Summe eine Verringerung der Leerlaufverluste um den Faktor fünf!&lt;br /&gt;
&lt;br /&gt;
== Versorgung über Vorwiderstand/Kondensator ==&lt;br /&gt;
&lt;br /&gt;
Wenn nur sehr kleine Ausgangsströme benötigt werden, so kommt die Verwendung eines einfachen Netzteils in Frage, welches einen Vorwiderstand verwendet um die Netzspannung herabzusetzen. Da es sich bei der Netzspannung um eine Wechselspannung handelt, eignen sich neben rein ohmschen Widerständen auch Kondensatoren und Spulen als Vorwiderstand. Praktisch werden Spulen jedoch nie verwendet, weil diese zu groß wären. Da aus Energiegründen meist Kondensatoren verwendet werden, spricht man auch umgangssprachlich vom Kondensatornetzteil.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Capnt.gif | framed | ohne | 5V / 10mA Kondensatornetzteil]]&lt;br /&gt;
&lt;br /&gt;
Der Kondensator C1 bildet hier den kapazitiven Vorwiderstand für unser Kondensatornetzteil, seine Impedanz bestimmt den Strom. Der Vorteil gegenüber einem Widerstand ist, dass keine Wirkleistung erzeugt wird, sprich es entsteht keine Wärme. Wenn wir alle Spannungsabfälle durch die übrigen Bauteile vernachlässigen, können wir einfach mit...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathrm{X_{C}= {1 \over {2 \pi \cdot f \cdot C}} }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathrm{X_{C1}= {1 \over {2 \pi \cdot 50Hz \cdot C}} }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...die Impedanz des Kondensators an 50 Hz Wechselspannung errechnen (wir vernachlässigen den ohmschen Reihenwiderstand des Kodensators und betrachten seinen Blindwiderstand als Impedanz).&lt;br /&gt;
&lt;br /&gt;
Für 10 mA bei 230V brauchen wir einen Ersatzwiderstand von:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathrm{R_{Ersatz}= {230V - 12V \over 10mA} = {22k \Omega} }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das ergibt nach Gleichsetzen von X(C1) = 22 kΩ und Umstellen nach C eine rechnerische Kapazität von 145 nF. Eine Kapazität von 150nF würde gut passen und ist als Standardwert verfügbar. Mit der Wahl eines etwas größeren Kondensators kommen wir rechnerisch über 10mA und haben dadurch ein wenig mehr Luft nach oben. Der Kondensator als kapazitiver Vorwiderstand erzeugt keine Wärme, nur etwas Phasenverschiebung zwischen Strom und Spannung. Ein 22-kΩ-Widerstand würde 2,2 W Verlustleistung als Wärme erzeugen. Der Rest der Schaltung erklärt sich relativ einfach.&lt;br /&gt;
&lt;br /&gt;
* Sicherung F1 soll vor möglichen Schwelbränden im Falle eines Kurzschlusses schützen. Brandsichere Widerstände R1 und R2 erfüllen den gleichen Zweck.&lt;br /&gt;
* R1 und R2 begrenzen zusammen den Einschaltstrom, sollte die Schaltung beim Sinusscheitelpunkt angeschlossen werden (Eingangsspannung kurzzeitig 325V). Es wurden zwei Widerstände verwendet, damit sich der Spannungsfall über beide Widerstände aufteilt, denn normale Widerstände sind nur bis 200 V belastbar. Der kurzzeitig hohe Ladestrom, der nur von diesen Widerständen begrenzt wird, wird von C2 und D1 aufgenommen.&lt;br /&gt;
* R3 und R4 dienen als Entladewiderstände für C1, damit nach Trennen vom Netz keine gefährliche Ladung im Kondensator verbleibt. Auch hier werden zwecks Spannungsaufteilung zwei Widerstände verwendet.&lt;br /&gt;
* Der Brückengleichrichter B1 richtet die Wechselspannung in eine Gleichspannung.&lt;br /&gt;
* Die [[Diode#Z-Diode | Z-Diode]] D1 begrenzt die maximale Eingangsspannung für IC1. Sie muss lediglich so gewählt werden, dass der Spannungsregler noch sauber arbeiten kann.&lt;br /&gt;
* Die Eingangsspannung für IC1 wird durch C2 und C3 gepuffert. Die Wechselspannungsanteile der gleichgerichteten Spannung sind dadurch sehr gering.&lt;br /&gt;
* IC1 ist der Spannungsregler, er erzeugt die 5V Ausgangsspannung. C4 soll ein Schwingen des Reglers verhindern.&lt;br /&gt;
* IC1 kann alternativ auch mit einem stromsparenden Regler wie z.B LP2950 bestückt werden, dadurch stehen 3..5mA mehr für die Schaltung zur Verfügung, welche sonst vom 7805 verbraucht werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung!&#039;&#039;&#039; Es ist wichtig zu wissen, daß zwischen den Punkten &amp;quot;+5V&amp;quot; und &amp;quot;GND&amp;quot; im Normalfall nur ein Potential von 5 Volt anliegt und der Strom auch durch die Schaltung begrenzt wird. Aber das Potential gegen Erde ist immer noch lebensgefährlich, da bei dieser Netzteilart keine galvanische Trennung stattfindet. Solch eine Schaltung &#039;&#039;&#039;muss&#039;&#039;&#039; man in ein Gehäuse verbauen, welches vor Berührung mit leitfähigen Teilen schützt (Schutzklasse I oder II).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;WARNUNG!!! Wirklich niemals (!) leitfähige Teile einer Schaltung berühren, die vom Stromnetz nicht galvanisch getrennt sind!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ein halbwegs sicherer Umgang mit der Schaltung ist dann möglich, wenn man über einen Trenntrafo eine galvanische Trennung zum Netz herstellt und hinter dem Trenntrafo mit der Schaltung arbeitet.&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.grosse-elektronik.de/das-elko/trlosestr/index.html Stromversorgung über Vorwiderstand oder Kondensator ausführlich erklärt]&lt;br /&gt;
* [http://www.elektronik-kompendium.de/public/schaerer/cpowsup.htm Direkte 230V Versorgung im ELKO]&lt;br /&gt;
* [http://www.trifolium.de/netzteil/kap13.html Auschnitt auch &amp;quot;Das Netzteil- und Konverterbuch&amp;quot;]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/192090?goto=new#new Forenbeitrag: Weitbereichslinearregler mit kleinem Ausgangsstrom]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/194814#new Forenbeitrag: Weitbereichslinearregler mit kleinem Ausgangsstrom, weitere Vorschläge]&lt;br /&gt;
&lt;br /&gt;
=== Besser: Querregler ===&lt;br /&gt;
[[http://commons.wikimedia.org/wiki/File%3ACapacitive_Power_Supply.png]]&lt;br /&gt;
Die Verwendung von &#039;&#039;Längsreglern&#039;&#039; (etwa 78L05) ist bei dieser Netzteilart ungünstig, da eine Vorregelung per Zener-Diode erforderlich ist.&lt;br /&gt;
Besser ist die Verwendung eines &#039;&#039;Querreglers&#039;&#039; (etwa TL431). Dessen Vorwiderstand wird so dimensioniert, dass die Spannungsschwankungen am Ladekondensator bei maximalem Entnahmestrom gerade ausgeglichen werden können. In diesem Fall erscheinen 150 Ω angemessen, für 1,5 V Ripplespannung an C2. Auf diese Weise erhält man einen Low-Drop-Spannungsregler mit – ohnehin erforderlichem – konstanten Stromverbrauch.&lt;br /&gt;
&lt;br /&gt;
Merke: Die Wirkleistungsaufnahme solcher Netzteilschaltungen ist proportional zur Ladespannung am Elko C2. Daher ist diese möglichst niedrig anzusetzen.&lt;br /&gt;
Kondensatornetzteile sind eher &#039;&#039;Stromquellen&#039;&#039; als &#039;&#039;Spannungsquellen&#039;&#039;, was bei der Schaltungsdimensionierung zu beachten bzw. auszunutzen ist.&lt;br /&gt;
&lt;br /&gt;
=== Relais-Schaltungen ===&lt;br /&gt;
Derartige Netzteile werden gern zur Ansteuerung von Relais eingesetzt. Um die Stromaufnahme und damit den Kondensator C1 möglichst klein zu halten (Kostenfaktor), werden gern 24-V-Typen benutzt, die sich mit 10 .. 20 mA Anzugstrom begnügen. Das ergibt aber trotzdem 0,25 .. 0,5 W Leistungsaufnahme, die von einem Konstantspannungsnetzteil permanent zur Verfügung gestellt wird und damit stets irgendwo verheizt wird, auch wenn das Relais nicht arbeitet.&lt;br /&gt;
&lt;br /&gt;
Eine Lösung des Problems ist die Umschaltung der Ausgangsspannung an C2. Damit kann die Relaisspule parallel zu C2 betrieben werden und wird zum Ausschalten durch einen Transistor mit Z-Diode am Kollektor gebrückt (ein selbstleitender SFET oder MOSFET liegt da nahe). Hauptsache, das Relais fällt bei – angenommen – 4 V auch tatsächlich ab. Die Freilaufdiode entfällt. Die Steuerschaltung (angenommen für 3 V) wird in diesem Fall mit einem Low-Drop-Längsregler mit genügend großem Eingangsspannungsbereich versorgt.&lt;br /&gt;
&lt;br /&gt;
[http://commons.wikimedia.org/wiki/File:Capacitive_power_supply_%2B_relay.png]&lt;br /&gt;
Eine andere Lösung verwendet eine Reihenschaltung sogar mehrerer Relaiswicklungen, die jeweils per Überbrückung abgeschaltet werden. In diesem Fall hat C2 bei höherer Spannungsfestigkeit eine vergleichsweise kleine Kapazität, da das Ripple größer ausfallen darf, da die Selbstinduktivität der Relaiswicklung(en) für Konstantstrom sorgt und C2 „leersaugt“.&lt;br /&gt;
&lt;br /&gt;
== Schaltnetzteil ==&lt;br /&gt;
&lt;br /&gt;
Schaltnetzteile sind heutzutage weit verbreitet, da sie gegenüber konventionellen Netzteilen eine kompaktere Bauweise, einen höheren Wirkungsgrad und geringere Produktionskosten aufweisen.&lt;br /&gt;
&lt;br /&gt;
Zur Versorgung einer eigenen Schaltung eignen sich am besten Steckernetzteile (auch &amp;quot;Wandwarzen&amp;quot; genannt :)) welche eine mehr oder weniger gut geregelte Ausgangsspannung bereit stellen.&lt;br /&gt;
&lt;br /&gt;
Um das Schaltnetzteil direkt in eine eigene Schaltung zu integrieren, ist die einzige Möglichkeit die Verwendung von fertigen AC/DC Modulen welche meist relativ teuer sind (im Vergleich zu Steckernetzteilen). Dafür bieten Fertigmodule meist gut spezifizierte Betriebsparameter und sind bei namhaften Herstellern auch über mehrere Jahre hinweg lieferbar. Ausserdem sind die leicht anwendbar, man muss kein Schaltnetzteilprofi sein.&lt;br /&gt;
&lt;br /&gt;
Als Alternative zum Kauf von fertigen Schaltnetzteilen soll im folgenden ein 230VAC-&amp;gt;5VDC Netzteil vorgestellt werden. Allerdings rate ich davon ab solch ein Netzteil in Umlauf zu bringen. Das Ganze dient eher als proof of concept und natürlich wurde das Netzteil nicht nach den geltenden Sicherheits- und EMV-Bestimmungen geprüft. Die Schaltung ist ausschließlich für eigene Experimente/Schaltungen gedacht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Download&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hier die ZIP Datei mit der EAGLE .brd- und .sch-Datei:&lt;br /&gt;
[http://www.mikrocontroller.net/wikifiles/9/94/Tiny_SMPS_eagle.zip Eagle Dateien downloaden]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spezifikation&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Eingangsspannung 85VAC bis 265VAC @ 50-400 Hz&lt;br /&gt;
* Ausgangsspannung 5 Volt / 1 Ampere&lt;br /&gt;
&lt;br /&gt;
TODO: Ein paar mehr Messungen durchführen...&lt;br /&gt;
&lt;br /&gt;
Eingangsspannung kann auch unter 85VAC liegen (siehe Anmerkungen).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Smps5v_sch.gif]]&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan im Detail (von links nach rechts):&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Primärseite&#039;&#039;&lt;br /&gt;
* F2 ist eine träge Sicherung (1 Ampere). Sie sichert die Schaltung ab, sollte auf der Primärseite ein Kurzschlussstrom fließen&lt;br /&gt;
* Der Brückengleichrichter richtet die Netzspannung gleich&lt;br /&gt;
* C9, L1, C2 bilden einen Pi-Filter. Über den Kondensatoren liegt bei 230VAC Eingangsspannung eine Spannung von ungefähr 310 Volt an&lt;br /&gt;
* C5, R1, D3 bilden ein [[Snubber]]-Netzwerk (Klemmschaltung) - dieses Netzwerk &amp;quot;verbrät&amp;quot; die Leistung welche beim Abschalten des Leistungstransistors in die Primärwicklung induziert wird (da sich die Spannungsverhältnisse umkehren)&lt;br /&gt;
* Der Regler-IC ohne Bezeichnung ist ein TNY264 - er integriert eine fortschrittliche [[PWM]]-Regelung (dabei handelt es sich um eine PWM mit variabler Frequenz und Frequenz-Jitter), eine primärseitige Strombegrenzung, einen Fehlereingang und die Erzeugung seiner eigenen Betriebsspannung aus der Netzspannung&lt;br /&gt;
* Der Trafo T1 ist ein Sperrwandlertrafo mit Luftspalt (Kern E16)&lt;br /&gt;
* C8 unterdrückt hochfrequente EMV Störungen - Wichtig: Der Kondensator muss der Klasse Y1 entsprechen um die Sicherheit zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Sekundärseite&#039;&#039;&lt;br /&gt;
* D2 dient als Gleichrichterdiode&lt;br /&gt;
* C4, L2, C3 bilden einen weiteren Pi-Filter zur Filterung der Ausgangsspannung&lt;br /&gt;
* Über [[Diode#Z-Diode | Zener Diode]] D1, R2 und Optokoppler OK1 wird die Ausgangsspannung zum Regler IC zurück gekoppelt. Der Regler versucht einen konstanten Strom durch den Transistor in OK1 fließen zu lassen, dadurch wird auf der Sekundärseite eine konstante Ausgangsspannung erzeugt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkungen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Zwischen L und N hätte man auch noch einen Varistor zur Überspannungsbegrenzung und einen X Kondensator (nach der Sicherung!) zur Unterdrückung von HF schalten können&lt;br /&gt;
* Zur Verbesserung der EMV hätte man auch noch eine Netzdoppeldrossel verwenden können. Diese Drossel würde Gegentaktstörungen verringern. Allerdings lässt sich auch mit einer einfachen Drossel eine ausreichende EMV erreichen (ob das bei dieser Schaltung der Fall ist weiss ich nicht und würde ich bezweifeln)&lt;br /&gt;
* Bei Versuchen am Labornetzteil stellte sich heraus, dass das Netzteil schon bei 50VDC Versorgung funktioniert. Einen Belastungstest habe ich bei dieser Spannung nicht durchgeführt, aber dadurch hat man die Möglichkeit das Netzteil gefahrlos zu erproben.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Layout&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Smps5v_brd.gif]]&lt;br /&gt;
&lt;br /&gt;
Zum Layout gibt es nicht viel zu sagen. Abstände wurden so groß wie möglich gehalten und der größte Teil des Layouts wurde mit großzügigen Kupferflächen realisiert, um eine gute Wärmeableitung und eine niederohmige Anbindung zu erhalten. Ob das Layout VDE-konform ist kann ich nicht sagen. Der Abstand zwischen Primär- und Sekundärseite sollte allerdings groß genug sein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stückliste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Netzteil wurde so gestaltet, dass alle Bauteile bei Farnell bestellt werden können. Nur die Platine muss man sich natürlich selbst ätzen.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;sortable&amp;quot; id=&amp;quot;stueckliste&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Stromlauf&lt;br /&gt;
! Bestellnummer&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (1 Stück)&lt;br /&gt;
|-&lt;br /&gt;
| F2&lt;br /&gt;
| 3030076&lt;br /&gt;
| Sicherung - 1A, Flink&lt;br /&gt;
| 0,62 €&lt;br /&gt;
|-&lt;br /&gt;
| B1&lt;br /&gt;
| 1467468&lt;br /&gt;
| DF04M Brückengleichrichter - 1.5A, 400V&lt;br /&gt;
| 0,21 €&lt;br /&gt;
|-&lt;br /&gt;
| C9 C2&lt;br /&gt;
| 1165626&lt;br /&gt;
| Kondensator Vishay - 4.7µF, 400V&lt;br /&gt;
| 0,23 €&lt;br /&gt;
|-&lt;br /&gt;
| L1&lt;br /&gt;
| 1077038&lt;br /&gt;
| Drossel - 2.2mH&lt;br /&gt;
| 1,25 €&lt;br /&gt;
|-&lt;br /&gt;
| IC1&lt;br /&gt;
| 9921320&lt;br /&gt;
| TNY264PN&lt;br /&gt;
| 1,65 €&lt;br /&gt;
|-&lt;br /&gt;
| D3&lt;br /&gt;
| 1299306&lt;br /&gt;
| SF18G Diode - 1A, 600V&lt;br /&gt;
| 0,23 €&lt;br /&gt;
|-&lt;br /&gt;
| C5&lt;br /&gt;
| 1141794&lt;br /&gt;
| Kondensator Vishay - 2.2nF, 1kV&lt;br /&gt;
| 0,22 €&lt;br /&gt;
|-&lt;br /&gt;
| R1&lt;br /&gt;
| &lt;br /&gt;
| Widerstand - 1/4W, 200k Ohm&lt;br /&gt;
| 0,05 €&lt;br /&gt;
|-&lt;br /&gt;
| C8&lt;br /&gt;
| 3531971&lt;br /&gt;
| Kondensator X1/Y1 Murata - 1nF, 4kV&lt;br /&gt;
| 0,31 €&lt;br /&gt;
|-&lt;br /&gt;
| T1&lt;br /&gt;
| 1214650&lt;br /&gt;
| Trafo Myrra 74094&lt;br /&gt;
| 4,20 €&lt;br /&gt;
|-&lt;br /&gt;
| D2&lt;br /&gt;
| 9907637&lt;br /&gt;
| Schottky Diode STPS2L60 - 2A&lt;br /&gt;
| 0,30 €&lt;br /&gt;
|-&lt;br /&gt;
| C4 C3&lt;br /&gt;
| 1219462&lt;br /&gt;
| Kondensator Panasonic - 470µF, 16V&lt;br /&gt;
| 0,37 €&lt;br /&gt;
|-&lt;br /&gt;
| L2&lt;br /&gt;
| 1077049&lt;br /&gt;
| Drossel - 10µH&lt;br /&gt;
| 1,25 €&lt;br /&gt;
|-&lt;br /&gt;
| D1&lt;br /&gt;
| 1097231&lt;br /&gt;
| Zener BZX79-C3V9 - 3.9 Volt, 500mW&lt;br /&gt;
| 0,11 €&lt;br /&gt;
|-&lt;br /&gt;
| R2&lt;br /&gt;
| &lt;br /&gt;
| Widerstand - 1/4W, 100Ω&lt;br /&gt;
| 0,05 €&lt;br /&gt;
|-&lt;br /&gt;
| OK1&lt;br /&gt;
| 9707700&lt;br /&gt;
| Optokoppler PC817&lt;br /&gt;
| 0,36 €&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Macht zusammen 11,88€. Das steht im grunde im keinen Verhältnis zu einem gekauften 5V/1A Netzteil, denn das kostet in etwa das Gleiche und ist bereits fertig aufgebaut und nach gültigen Normen geprüft. Die Eigenentwicklung solcher Netzteile lohnt sich nur in sehr großen Stückzahlen von 10.000 Stück und mehr und wenn man auf dem Gebiet viel Erfahrung hat. &lt;br /&gt;
&lt;br /&gt;
[[Category:1. Wettbewerb]]&lt;br /&gt;
[[Category:Spannungsversorgung und Energiequellen]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Controller_an_230V&amp;diff=63129</id>
		<title>Controller an 230V</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Controller_an_230V&amp;diff=63129"/>
		<updated>2012-01-06T13:21:55Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Besser: Querregler */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Lupin]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Da immer wieder mal die Frage aufkommt, wie man eine eigene Schaltung direkt am Netz betreiben kann soll hier ein Artikel entstehen, welcher die Möglichkeiten zur Erzeugung einer angemessenen Gleichspannung aufzeigt.&lt;br /&gt;
&lt;br /&gt;
Aber zuerst eine Warnung die ernst genommen werden sollte (!!!):&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Arbeiten an Netzspannung ist lebensgefährlich!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Deshalb sollte man nie direkt an Netzspannung arbeiten, wenn überhaupt nur mit entsprechenden Schutzeinrichtungen (z.&amp;amp;nbsp;B. Trenntrafo) und dann auch nur wenn man über die nötige Erfahrung verfügt. Aber grundsätzlich ist Vorsicht geboten.&lt;br /&gt;
&lt;br /&gt;
Wer nicht ganz genau weiss womit er es zu tun hat sollte lieber eine sichere Lösung verwenden wie z.&amp;amp;nbsp;B. die Stromversorgung aus einem VDE zugelassenen Trafo oder fertige Steckernetzteile.&lt;br /&gt;
&lt;br /&gt;
== Stecker(schalt)netzteil ==&lt;br /&gt;
&lt;br /&gt;
Die sicherste Lösung ist die Verwendung eines Steckernetzteils welches eine galvanisch getrennte Gleichspannung bereit stellt. Wer ganz auf Nummer Sicher gehen will achtet auf das GS (Geprüfte Sicherheit) Kennzeichen auf dem Netzteil:&lt;br /&gt;
&lt;br /&gt;
[[Bild:SteckerNetzteile.jpg|500px]]&lt;br /&gt;
&lt;br /&gt;
Zwei Steckernetzteile. Das Linke hat eine ungeregelte Ausgangsspannung (Trafo-&amp;gt;Gleichrichtung-&amp;gt;Siebung). Das Rechte hat eine nachgeschaltete Regelung mit einstellbarer Ausgangsspannung.&lt;br /&gt;
&lt;br /&gt;
Die Spannung wird meist über Hohlstecker zur Schaltung geführt.&lt;br /&gt;
&lt;br /&gt;
Billige Steckernetzteile geben eine ungeregelte Spannung aus, sie verändert sich mit der Last. In diesem Falle ist keine direkte Versorgung der Schaltung möglich und die Eingangsspannung sollte mit einen Spannungsregler geregelt werden:&lt;br /&gt;
&lt;br /&gt;
[[Bild:V_Regler.gif]]&lt;br /&gt;
&lt;br /&gt;
== Trafonetzteil ==&lt;br /&gt;
&lt;br /&gt;
Ein Trafonetzteil besteht aus einem Netztrafo, einer Gleichrichtung, einer Siebung und einer Regelung.&lt;br /&gt;
&lt;br /&gt;
* Der Netztrafo stellt eine galvanisch getrennte Wechselspannung am Ausgang bereit, diese Spannungs ist bedeutend kleiner als die Eingangsspannung.&lt;br /&gt;
&lt;br /&gt;
* Die Gleichrichtung wandelt diese Wechselspannung in eine Gleichspannung. Die Siebung entfernt die restlichen Wechselspannungsanteile (nach einer Vollbrückengleichrichtung beträgt die Wechselspannungsfrequenz 100 Hz).&lt;br /&gt;
&lt;br /&gt;
* Die Regelung kann u.U. auch weggelassen werden, wenn keine genaue Ausgangsspannung gefordert ist. Aber ohne Regelung würde die Ausgangsspannung je nach Belastung schwanken. Die Regelung sorgt dafür, dass unabhängig von der Belastung des Netzteils die gewünschte Ausgangsspannung konstant am Ausgang anliegt.&lt;br /&gt;
&lt;br /&gt;
Die Ausgangsspannung des Trafos ist immer höher als die Ausgangsspannung des Reglers, da der Regler einen gewissen Arbeitsbereich benötigt, die sogenannte Dropout-Spannung. &lt;br /&gt;
&lt;br /&gt;
Die Leistung, die durch den Regler in Wärme umgesetzt wird errechnet sich wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;P_{Verlust}=(U_{Ein}-U_{Aus}) \cdot I_{Aus}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei 10 Volt am Eingang des Spannungsreglers, einer Ausgangsspannung von 5 Volt und einem Strom von 1 Ampere ergibt das eine Verlustleistung von 5 Watt. Hört sich nicht viel an, allerdings beträgt die Ausgangsleistung auch nur 5 Watt. Das Ergibt einen Wirkungsgrad von 50%. Dazu kommen aber noch Verluste welche im Transformator entstehen. Der Spannungsregler braucht dann einen [[Kühlkörper]].&lt;br /&gt;
&lt;br /&gt;
[[Bild:Trafont.gif]]&lt;br /&gt;
&lt;br /&gt;
Ein Trafonetzteil hat auch den Nachteil, daß es durch den schweren Eisenkern nicht sehr handlich ist.&lt;br /&gt;
&lt;br /&gt;
Es gibt Printtransformatoren, welche sich auf die Leiterplatte löten lassen. So ist es möglich das Netzteil in die eigene Schaltung zu integrieren. Der Anschluss der 230V Netzspannung birgt allerdings eine Gefahr.&lt;br /&gt;
&lt;br /&gt;
=== Sparsames Trafonetzteil für Dauerbetrieb ===&lt;br /&gt;
&lt;br /&gt;
Möchte man eine besonders sparsame Stromversorgung aufbauen, welche eine sehr kleine, sparsame Schaltung das ganze Jahr über betreiben soll, empfiehlt es sich, neben der Beachtung der Konzepte zum Stromsparen per [[Sleep Mode]] und [[Ultra low power]], von den bekannten Minitrafos mit nur 0,5-1VA zwei statt einem zu nutzen. Dabei werden jeweils Primär- und Sekundärwicklung in Reihe geschaltet. Warum?&lt;br /&gt;
&lt;br /&gt;
Weil diese Trafos auf Kante dimensioniert sind, um Material und Bauvolumen zu sparen, und bei Nennspannung schon ordentlich in die magnetische Sättigung gehen. Dabei entstehen große Verluste durch Stromspitzen auf der Primärseite. Eine genauere Erklärung findet man im Artikel [[Transformatoren und Spulen]]. Bei der Reihenschaltung sieht jeder Trafo nur die halbe Spannung, damit kommt er nicht so stark in die Sättigung und es wird deutlich weniger Energie sinnlos verbraucht. Dazu noch einen stromsparenden Spannungsregler ala LP2950 und das Ganze braucht weniger als 0,5W.&lt;br /&gt;
&lt;br /&gt;
In diesem [http://www.mikrocontroller.net/topic/191871#1875697 Forumsbeitrag] wure exemplarisch ein solcher Trafo vermessen.&lt;br /&gt;
&lt;br /&gt;
*Kanal 1 Eingangsstrom&lt;br /&gt;
*Kanal 2 Eingangsspannung&lt;br /&gt;
*Kanal M Leistung&lt;br /&gt;
&lt;br /&gt;
Einmal mit 120V Eingangsspannung (163mW) und einmal mit 230V (1550mW), die Unterschiede sind immens. Selbst wenn man die Verluste bei 120V bei der Reihenschaltung von zwei Stück verdoppelt, erreicht man in Summe eine Verringerung der Leerlaufverluste um den Faktor fünf!&lt;br /&gt;
&lt;br /&gt;
== Versorgung über Vorwiderstand/Kondensator ==&lt;br /&gt;
&lt;br /&gt;
Wenn nur sehr kleine Ausgangsströme benötigt werden, so kommt die Verwendung eines einfachen Netzteils in Frage, welches einen Vorwiderstand verwendet um die Netzspannung herabzusetzen. Da es sich bei der Netzspannung um eine Wechselspannung handelt, eignen sich neben rein ohmschen Widerständen auch Kondensatoren und Spulen als Vorwiderstand. Praktisch werden Spulen jedoch nie verwendet, weil diese zu groß wären. Da aus Energiegründen meist Kondensatoren verwendet werden, spricht man auch umgangssprachlich vom Kondensatornetzteil.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Capnt.gif | framed | ohne | 5V / 10mA Kondensatornetzteil]]&lt;br /&gt;
&lt;br /&gt;
Der Kondensator C1 bildet hier den kapazitiven Vorwiderstand für unser Kondensatornetzteil, seine Impedanz bestimmt den Strom. Der Vorteil gegenüber einem Widerstand ist, dass keine Wirkleistung erzeugt wird, sprich es entsteht keine Wärme. Wenn wir alle Spannungsabfälle durch die übrigen Bauteile vernachlässigen, können wir einfach mit...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathrm{X_{C}= {1 \over {2 \pi \cdot f \cdot C}} }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathrm{X_{C1}= {1 \over {2 \pi \cdot 50Hz \cdot C}} }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...die Impedanz des Kondensators an 50 Hz Wechselspannung errechnen (wir vernachlässigen den ohmschen Reihenwiderstand des Kodensators und betrachten seinen Blindwiderstand als Impedanz).&lt;br /&gt;
&lt;br /&gt;
Für 10 mA bei 230V brauchen wir einen Ersatzwiderstand von:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathrm{R_{Ersatz}= {230V - 12V \over 10mA} = {22k \Omega} }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das ergibt nach Gleichsetzen von X(C1) = 22 kΩ und Umstellen nach C eine rechnerische Kapazität von 145 nF. Eine Kapazität von 150nF würde gut passen und ist als Standardwert verfügbar. Mit der Wahl eines etwas größeren Kondensators kommen wir rechnerisch über 10mA und haben dadurch ein wenig mehr Luft nach oben. Der Kondensator als kapazitiver Vorwiderstand erzeugt keine Wärme, nur etwas Phasenverschiebung zwischen Strom und Spannung. Ein 22-kΩ-Widerstand würde 2,2 W Verlustleistung als Wärme erzeugen. Der Rest der Schaltung erklärt sich relativ einfach.&lt;br /&gt;
&lt;br /&gt;
* Sicherung F1 soll vor möglichen Schwelbränden im Falle eines Kurzschlusses schützen. Brandsichere Widerstände R1 und R2 erfüllen den gleichen Zweck.&lt;br /&gt;
* R1 und R2 begrenzen zusammen den Einschaltstrom, sollte die Schaltung beim Sinusscheitelpunkt angeschlossen werden (Eingangsspannung kurzzeitig 325V). Es wurden zwei Widerstände verwendet, damit sich der Spannungsfall über beide Widerstände aufteilt, denn normale Widerstände sind nur bis 200 V belastbar. Der kurzzeitig hohe Ladestrom, der nur von diesen Widerständen begrenzt wird, wird von C2 und D1 aufgenommen.&lt;br /&gt;
* R3 und R4 dienen als Entladewiderstände für C1, damit nach Trennen vom Netz keine gefährliche Ladung im Kondensator verbleibt. Auch hier werden zwecks Spannungsaufteilung zwei Widerstände verwendet.&lt;br /&gt;
* Der Brückengleichrichter B1 richtet die Wechselspannung in eine Gleichspannung.&lt;br /&gt;
* Die [[Diode#Z-Diode | Z-Diode]] D1 begrenzt die maximale Eingangsspannung für IC1. Sie muss lediglich so gewählt werden, dass der Spannungsregler noch sauber arbeiten kann.&lt;br /&gt;
* Die Eingangsspannung für IC1 wird durch C2 und C3 gepuffert. Die Wechselspannungsanteile der gleichgerichteten Spannung sind dadurch sehr gering.&lt;br /&gt;
* IC1 ist der Spannungsregler, er erzeugt die 5V Ausgangsspannung. C4 soll ein Schwingen des Reglers verhindern.&lt;br /&gt;
* IC1 kann alternativ auch mit einem stromsparenden Regler wie z.B LP2950 bestückt werden, dadurch stehen 3..5mA mehr für die Schaltung zur Verfügung, welche sonst vom 7805 verbraucht werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung!&#039;&#039;&#039; Es ist wichtig zu wissen, daß zwischen den Punkten &amp;quot;+5V&amp;quot; und &amp;quot;GND&amp;quot; im Normalfall nur ein Potential von 5 Volt anliegt und der Strom auch durch die Schaltung begrenzt wird. Aber das Potential gegen Erde ist immer noch lebensgefährlich, da bei dieser Netzteilart keine galvanische Trennung stattfindet. Solch eine Schaltung &#039;&#039;&#039;muss&#039;&#039;&#039; man in ein Gehäuse verbauen, welches vor Berührung mit leitfähigen Teilen schützt (Schutzklasse I oder II).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;WARNUNG!!! Wirklich niemals (!) leitfähige Teile einer Schaltung berühren, die vom Stromnetz nicht galvanisch getrennt sind!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ein halbwegs sicherer Umgang mit der Schaltung ist dann möglich, wenn man über einen Trenntrafo eine galvanische Trennung zum Netz herstellt und hinter dem Trenntrafo mit der Schaltung arbeitet.&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.grosse-elektronik.de/das-elko/trlosestr/index.html Stromversorgung über Vorwiderstand oder Kondensator ausführlich erklärt]&lt;br /&gt;
* [http://www.elektronik-kompendium.de/public/schaerer/cpowsup.htm Direkte 230V Versorgung im ELKO]&lt;br /&gt;
* [http://www.trifolium.de/netzteil/kap13.html Auschnitt auch &amp;quot;Das Netzteil- und Konverterbuch&amp;quot;]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/192090?goto=new#new Forenbeitrag: Weitbereichslinearregler mit kleinem Ausgangsstrom]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/194814#new Forenbeitrag: Weitbereichslinearregler mit kleinem Ausgangsstrom, weitere Vorschläge]&lt;br /&gt;
&lt;br /&gt;
=== Besser: Querregler ===&lt;br /&gt;
[[http://commons.wikimedia.org/wiki/File%3ACapacitive_Power_Supply.png]]&lt;br /&gt;
Die Verwendung von &#039;&#039;Längsreglern&#039;&#039; (etwa 78L05) ist bei dieser Netzteilart ungünstig, da eine Vorregelung per Zener-Diode erforderlich ist.&lt;br /&gt;
Besser ist die Verwendung eines &#039;&#039;Querreglers&#039;&#039; (etwa TL431). Dessen Vorwiderstand wird so dimensioniert, dass die Spannungsschwankungen am Ladekondensator bei maximalem Entnahmestrom gerade ausgeglichen werden können. In diesem Fall erscheinen 150 Ω angemessen, für 1,5 V Ripplespannung an C2. Auf diese Weise erhält man einen Low-Drop-Spannungsregler mit – ohnehin erforderlichem – konstanten Stromverbrauch.&lt;br /&gt;
&lt;br /&gt;
Merke: Die Wirkleistungsaufnahme solcher Netzteilschaltungen ist proportional zur Ladespannung am Elko C2. Daher ist diese möglichst niedrig anzusetzen.&lt;br /&gt;
Kondensatornetzteile sind eher &#039;&#039;Stromquellen&#039;&#039; als &#039;&#039;Spannungsquellen&#039;&#039;, was bei der Schaltungsdimensionierung zu beachten bzw. auszunutzen ist.&lt;br /&gt;
&lt;br /&gt;
=== Relais-Schaltungen ===&lt;br /&gt;
&lt;br /&gt;
Derartige Netzteile werden gern zur Ansteuerung von Relais eingesetzt. Um die Stromaufnahme und damit den Kondensator C1 möglichst klein zu halten (Kostenfaktor), werden gern 24-V-Typen benutzt, die sich mit 10 .. 20 mA Anzugstrom begnügen. Das ergibt aber trotzdem 0,25 .. 0,5 W Leistungsaufnahme, die von einem Konstantspannungsnetzteil permanent zur Verfügung gestellt wird und damit stets irgendwo verheizt wird, auch wenn das Relais nicht arbeitet.&lt;br /&gt;
&lt;br /&gt;
Eine Lösung des Problems ist die Umschaltung der Ausgangsspannung an C2. Damit kann die Relaisspule parallel zu C2 betrieben werden und wird zum Ausschalten durch einen Transistor mit Z-Diode am Kollektor gebrückt (ein selbstleitender SFET oder MOSFET liegt da nahe). Hauptsache, das Relais fällt bei – angenommen – 4 V auch tatsächlich ab. Die Freilaufdiode entfällt. Die Steuerschaltung (angenommen für 3 V) wird in diesem Fall mit einem Low-Drop-Längsregler mit genügend großem Eingangsspannungsbereich versorgt.&lt;br /&gt;
&lt;br /&gt;
Eine andere Lösung verwendet eine Reihenschaltung sogar mehrerer Relaiswicklungen, die jeweils per Überbrückung abgeschaltet werden. In diesem Fall hat C2 bei höherer Spannungsfestigkeit eine vergleichsweise kleine Kapazität, da das Ripple größer ausfallen darf, da die Selbstinduktivität der Relaiswicklung(en) für Konstantstrom sorgt und C2 „leersaugt“.&lt;br /&gt;
&lt;br /&gt;
== Schaltnetzteil ==&lt;br /&gt;
&lt;br /&gt;
Schaltnetzteile sind heutzutage weit verbreitet, da sie gegenüber konventionellen Netzteilen eine kompaktere Bauweise, einen höheren Wirkungsgrad und geringere Produktionskosten aufweisen.&lt;br /&gt;
&lt;br /&gt;
Zur Versorgung einer eigenen Schaltung eignen sich am besten Steckernetzteile (auch &amp;quot;Wandwarzen&amp;quot; genannt :)) welche eine mehr oder weniger gut geregelte Ausgangsspannung bereit stellen.&lt;br /&gt;
&lt;br /&gt;
Um das Schaltnetzteil direkt in eine eigene Schaltung zu integrieren, ist die einzige Möglichkeit die Verwendung von fertigen AC/DC Modulen welche meist relativ teuer sind (im Vergleich zu Steckernetzteilen). Dafür bieten Fertigmodule meist gut spezifizierte Betriebsparameter und sind bei namhaften Herstellern auch über mehrere Jahre hinweg lieferbar. Ausserdem sind die leicht anwendbar, man muss kein Schaltnetzteilprofi sein.&lt;br /&gt;
&lt;br /&gt;
Als Alternative zum Kauf von fertigen Schaltnetzteilen soll im folgenden ein 230VAC-&amp;gt;5VDC Netzteil vorgestellt werden. Allerdings rate ich davon ab solch ein Netzteil in Umlauf zu bringen. Das Ganze dient eher als proof of concept und natürlich wurde das Netzteil nicht nach den geltenden Sicherheits- und EMV-Bestimmungen geprüft. Die Schaltung ist ausschließlich für eigene Experimente/Schaltungen gedacht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Download&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hier die ZIP Datei mit der EAGLE .brd- und .sch-Datei:&lt;br /&gt;
[http://www.mikrocontroller.net/wikifiles/9/94/Tiny_SMPS_eagle.zip Eagle Dateien downloaden]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spezifikation&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Eingangsspannung 85VAC bis 265VAC @ 50-400 Hz&lt;br /&gt;
* Ausgangsspannung 5 Volt / 1 Ampere&lt;br /&gt;
&lt;br /&gt;
TODO: Ein paar mehr Messungen durchführen...&lt;br /&gt;
&lt;br /&gt;
Eingangsspannung kann auch unter 85VAC liegen (siehe Anmerkungen).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Smps5v_sch.gif]]&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan im Detail (von links nach rechts):&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Primärseite&#039;&#039;&lt;br /&gt;
* F2 ist eine träge Sicherung (1 Ampere). Sie sichert die Schaltung ab, sollte auf der Primärseite ein Kurzschlussstrom fließen&lt;br /&gt;
* Der Brückengleichrichter richtet die Netzspannung gleich&lt;br /&gt;
* C9, L1, C2 bilden einen Pi-Filter. Über den Kondensatoren liegt bei 230VAC Eingangsspannung eine Spannung von ungefähr 310 Volt an&lt;br /&gt;
* C5, R1, D3 bilden ein [[Snubber]]-Netzwerk (Klemmschaltung) - dieses Netzwerk &amp;quot;verbrät&amp;quot; die Leistung welche beim Abschalten des Leistungstransistors in die Primärwicklung induziert wird (da sich die Spannungsverhältnisse umkehren)&lt;br /&gt;
* Der Regler-IC ohne Bezeichnung ist ein TNY264 - er integriert eine fortschrittliche [[PWM]]-Regelung (dabei handelt es sich um eine PWM mit variabler Frequenz und Frequenz-Jitter), eine primärseitige Strombegrenzung, einen Fehlereingang und die Erzeugung seiner eigenen Betriebsspannung aus der Netzspannung&lt;br /&gt;
* Der Trafo T1 ist ein Sperrwandlertrafo mit Luftspalt (Kern E16)&lt;br /&gt;
* C8 unterdrückt hochfrequente EMV Störungen - Wichtig: Der Kondensator muss der Klasse Y1 entsprechen um die Sicherheit zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Sekundärseite&#039;&#039;&lt;br /&gt;
* D2 dient als Gleichrichterdiode&lt;br /&gt;
* C4, L2, C3 bilden einen weiteren Pi-Filter zur Filterung der Ausgangsspannung&lt;br /&gt;
* Über [[Diode#Z-Diode | Zener Diode]] D1, R2 und Optokoppler OK1 wird die Ausgangsspannung zum Regler IC zurück gekoppelt. Der Regler versucht einen konstanten Strom durch den Transistor in OK1 fließen zu lassen, dadurch wird auf der Sekundärseite eine konstante Ausgangsspannung erzeugt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkungen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Zwischen L und N hätte man auch noch einen Varistor zur Überspannungsbegrenzung und einen X Kondensator (nach der Sicherung!) zur Unterdrückung von HF schalten können&lt;br /&gt;
* Zur Verbesserung der EMV hätte man auch noch eine Netzdoppeldrossel verwenden können. Diese Drossel würde Gegentaktstörungen verringern. Allerdings lässt sich auch mit einer einfachen Drossel eine ausreichende EMV erreichen (ob das bei dieser Schaltung der Fall ist weiss ich nicht und würde ich bezweifeln)&lt;br /&gt;
* Bei Versuchen am Labornetzteil stellte sich heraus, dass das Netzteil schon bei 50VDC Versorgung funktioniert. Einen Belastungstest habe ich bei dieser Spannung nicht durchgeführt, aber dadurch hat man die Möglichkeit das Netzteil gefahrlos zu erproben.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Layout&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Smps5v_brd.gif]]&lt;br /&gt;
&lt;br /&gt;
Zum Layout gibt es nicht viel zu sagen. Abstände wurden so groß wie möglich gehalten und der größte Teil des Layouts wurde mit großzügigen Kupferflächen realisiert, um eine gute Wärmeableitung und eine niederohmige Anbindung zu erhalten. Ob das Layout VDE-konform ist kann ich nicht sagen. Der Abstand zwischen Primär- und Sekundärseite sollte allerdings groß genug sein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stückliste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Netzteil wurde so gestaltet, dass alle Bauteile bei Farnell bestellt werden können. Nur die Platine muss man sich natürlich selbst ätzen.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;sortable&amp;quot; id=&amp;quot;stueckliste&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Stromlauf&lt;br /&gt;
! Bestellnummer&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (1 Stück)&lt;br /&gt;
|-&lt;br /&gt;
| F2&lt;br /&gt;
| 3030076&lt;br /&gt;
| Sicherung - 1A, Flink&lt;br /&gt;
| 0,62 €&lt;br /&gt;
|-&lt;br /&gt;
| B1&lt;br /&gt;
| 1467468&lt;br /&gt;
| DF04M Brückengleichrichter - 1.5A, 400V&lt;br /&gt;
| 0,21 €&lt;br /&gt;
|-&lt;br /&gt;
| C9 C2&lt;br /&gt;
| 1165626&lt;br /&gt;
| Kondensator Vishay - 4.7µF, 400V&lt;br /&gt;
| 0,23 €&lt;br /&gt;
|-&lt;br /&gt;
| L1&lt;br /&gt;
| 1077038&lt;br /&gt;
| Drossel - 2.2mH&lt;br /&gt;
| 1,25 €&lt;br /&gt;
|-&lt;br /&gt;
| IC1&lt;br /&gt;
| 9921320&lt;br /&gt;
| TNY264PN&lt;br /&gt;
| 1,65 €&lt;br /&gt;
|-&lt;br /&gt;
| D3&lt;br /&gt;
| 1299306&lt;br /&gt;
| SF18G Diode - 1A, 600V&lt;br /&gt;
| 0,23 €&lt;br /&gt;
|-&lt;br /&gt;
| C5&lt;br /&gt;
| 1141794&lt;br /&gt;
| Kondensator Vishay - 2.2nF, 1kV&lt;br /&gt;
| 0,22 €&lt;br /&gt;
|-&lt;br /&gt;
| R1&lt;br /&gt;
| &lt;br /&gt;
| Widerstand - 1/4W, 200k Ohm&lt;br /&gt;
| 0,05 €&lt;br /&gt;
|-&lt;br /&gt;
| C8&lt;br /&gt;
| 3531971&lt;br /&gt;
| Kondensator X1/Y1 Murata - 1nF, 4kV&lt;br /&gt;
| 0,31 €&lt;br /&gt;
|-&lt;br /&gt;
| T1&lt;br /&gt;
| 1214650&lt;br /&gt;
| Trafo Myrra 74094&lt;br /&gt;
| 4,20 €&lt;br /&gt;
|-&lt;br /&gt;
| D2&lt;br /&gt;
| 9907637&lt;br /&gt;
| Schottky Diode STPS2L60 - 2A&lt;br /&gt;
| 0,30 €&lt;br /&gt;
|-&lt;br /&gt;
| C4 C3&lt;br /&gt;
| 1219462&lt;br /&gt;
| Kondensator Panasonic - 470µF, 16V&lt;br /&gt;
| 0,37 €&lt;br /&gt;
|-&lt;br /&gt;
| L2&lt;br /&gt;
| 1077049&lt;br /&gt;
| Drossel - 10µH&lt;br /&gt;
| 1,25 €&lt;br /&gt;
|-&lt;br /&gt;
| D1&lt;br /&gt;
| 1097231&lt;br /&gt;
| Zener BZX79-C3V9 - 3.9 Volt, 500mW&lt;br /&gt;
| 0,11 €&lt;br /&gt;
|-&lt;br /&gt;
| R2&lt;br /&gt;
| &lt;br /&gt;
| Widerstand - 1/4W, 100Ω&lt;br /&gt;
| 0,05 €&lt;br /&gt;
|-&lt;br /&gt;
| OK1&lt;br /&gt;
| 9707700&lt;br /&gt;
| Optokoppler PC817&lt;br /&gt;
| 0,36 €&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Macht zusammen 11,88€. Das steht im grunde im keinen Verhältnis zu einem gekauften 5V/1A Netzteil, denn das kostet in etwa das Gleiche und ist bereits fertig aufgebaut und nach gültigen Normen geprüft. Die Eigenentwicklung solcher Netzteile lohnt sich nur in sehr großen Stückzahlen von 10.000 Stück und mehr und wenn man auf dem Gebiet viel Erfahrung hat. &lt;br /&gt;
&lt;br /&gt;
[[Category:1. Wettbewerb]]&lt;br /&gt;
[[Category:Spannungsversorgung und Energiequellen]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Controller_an_230V&amp;diff=63091</id>
		<title>Controller an 230V</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Controller_an_230V&amp;diff=63091"/>
		<updated>2012-01-05T11:24:55Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Anmerkung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Lupin]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Da immer wieder mal die Frage aufkommt, wie man eine eigene Schaltung direkt am Netz betreiben kann soll hier ein Artikel entstehen, welcher die Möglichkeiten zur Erzeugung einer angemessenen Gleichspannung aufzeigt.&lt;br /&gt;
&lt;br /&gt;
Aber zuerst eine Warnung die ernst genommen werden sollte (!!!):&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Arbeiten an Netzspannung ist lebensgefährlich!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Deshalb sollte man nie direkt an Netzspannung arbeiten, wenn überhaupt nur mit entsprechenden Schutzeinrichtungen (z.&amp;amp;nbsp;B. Trenntrafo) und dann auch nur wenn man über die nötige Erfahrung verfügt. Aber grundsätzlich ist Vorsicht geboten.&lt;br /&gt;
&lt;br /&gt;
Wer nicht ganz genau weiss womit er es zu tun hat sollte lieber eine sichere Lösung verwenden wie z.&amp;amp;nbsp;B. die Stromversorgung aus einem VDE zugelassenen Trafo oder fertige Steckernetzteile.&lt;br /&gt;
&lt;br /&gt;
== Stecker(schalt)netzteil ==&lt;br /&gt;
&lt;br /&gt;
Die sicherste Lösung ist die Verwendung eines Steckernetzteils welches eine galvanisch getrennte Gleichspannung bereit stellt. Wer ganz auf Nummer Sicher gehen will achtet auf das GS (Geprüfte Sicherheit) Kennzeichen auf dem Netzteil:&lt;br /&gt;
&lt;br /&gt;
[[Bild:SteckerNetzteile.jpg|500px]]&lt;br /&gt;
&lt;br /&gt;
Zwei Steckernetzteile. Das Linke hat eine ungeregelte Ausgangsspannung (Trafo-&amp;gt;Gleichrichtung-&amp;gt;Siebung). Das Rechte hat eine nachgeschaltete Regelung mit einstellbarer Ausgangsspannung.&lt;br /&gt;
&lt;br /&gt;
Die Spannung wird meist über Hohlstecker zur Schaltung geführt.&lt;br /&gt;
&lt;br /&gt;
Billige Steckernetzteile geben eine ungeregelte Spannung aus, sie verändert sich mit der Last. In diesem Falle ist keine direkte Versorgung der Schaltung möglich und die Eingangsspannung sollte mit einen Spannungsregler geregelt werden:&lt;br /&gt;
&lt;br /&gt;
[[Bild:V_Regler.gif]]&lt;br /&gt;
&lt;br /&gt;
== Trafonetzteil ==&lt;br /&gt;
&lt;br /&gt;
Ein Trafonetzteil besteht aus einem Netztrafo, einer Gleichrichtung, einer Siebung und einer Regelung.&lt;br /&gt;
&lt;br /&gt;
* Der Netztrafo stellt eine galvanisch getrennte Wechselspannung am Ausgang bereit, diese Spannungs ist bedeutend kleiner als die Eingangsspannung.&lt;br /&gt;
&lt;br /&gt;
* Die Gleichrichtung wandelt diese Wechselspannung in eine Gleichspannung. Die Siebung entfernt die restlichen Wechselspannungsanteile (nach einer Vollbrückengleichrichtung beträgt die Wechselspannungsfrequenz 100 Hz).&lt;br /&gt;
&lt;br /&gt;
* Die Regelung kann u.U. auch weggelassen werden, wenn keine genaue Ausgangsspannung gefordert ist. Aber ohne Regelung würde die Ausgangsspannung je nach Belastung schwanken. Die Regelung sorgt dafür, dass unabhängig von der Belastung des Netzteils die gewünschte Ausgangsspannung konstant am Ausgang anliegt.&lt;br /&gt;
&lt;br /&gt;
Die Ausgangsspannung des Trafos ist immer höher als die Ausgangsspannung des Reglers, da der Regler einen gewissen Arbeitsbereich benötigt, die sogenannte Dropout-Spannung. &lt;br /&gt;
&lt;br /&gt;
Die Leistung, die durch den Regler in Wärme umgesetzt wird errechnet sich wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;P_{Verlust}=(U_{Ein}-U_{Aus}) \cdot I_{Aus}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei 10 Volt am Eingang des Spannungsreglers, einer Ausgangsspannung von 5 Volt und einem Strom von 1 Ampere ergibt das eine Verlustleistung von 5 Watt. Hört sich nicht viel an, allerdings beträgt die Ausgangsleistung auch nur 5 Watt. Das Ergibt einen Wirkungsgrad von 50%. Dazu kommen aber noch Verluste welche im Transformator entstehen. Der Spannungsregler braucht dann einen [[Kühlkörper]].&lt;br /&gt;
&lt;br /&gt;
[[Bild:Trafont.gif]]&lt;br /&gt;
&lt;br /&gt;
Ein Trafonetzteil hat auch den Nachteil, daß es durch den schweren Eisenkern nicht sehr handlich ist.&lt;br /&gt;
&lt;br /&gt;
Es gibt Printtransformatoren, welche sich auf die Leiterplatte löten lassen. So ist es möglich das Netzteil in die eigene Schaltung zu integrieren. Der Anschluss der 230V Netzspannung birgt allerdings eine Gefahr.&lt;br /&gt;
&lt;br /&gt;
=== Sparsames Trafonetzteil für Dauerbetrieb ===&lt;br /&gt;
&lt;br /&gt;
Möchte man eine besonders sparsame Stromversorgung aufbauen, welche eine sehr kleine, sparsame Schaltung das ganze Jahr über betreiben soll, empfiehlt es sich, neben der Beachtung der Konzepte zum Stromsparen per [[Sleep Mode]] und [[Ultra low power]], von den bekannten Minitrafos mit nur 0,5-1VA zwei statt einem zu nutzen. Dabei werden jeweils Primär- und Sekundärwicklung in Reihe geschaltet. Warum?&lt;br /&gt;
&lt;br /&gt;
Weil diese Trafos auf Kante dimensioniert sind, um Material und Bauvolumen zu sparen, und bei Nennspannung schon ordentlich in die magnetische Sättigung gehen. Dabei entstehen große Verluste durch Stromspitzen auf der Primärseite. Eine genauere Erklärung findet man im Artikel [[Transformatoren und Spulen]]. Bei der Reihenschaltung sieht jeder Trafo nur die halbe Spannung, damit kommt er nicht so stark in die Sättigung und es wird deutlich weniger Energie sinnlos verbraucht. Dazu noch einen stromsparenden Spannungsregler ala LP2950 und das Ganze braucht weniger als 0,5W.&lt;br /&gt;
&lt;br /&gt;
In diesem [http://www.mikrocontroller.net/topic/191871#1875697 Forumsbeitrag] wure exemplarisch ein solcher Trafo vermessen.&lt;br /&gt;
&lt;br /&gt;
*Kanal 1 Eingangsstrom&lt;br /&gt;
*Kanal 2 Eingangsspannung&lt;br /&gt;
*Kanal M Leistung&lt;br /&gt;
&lt;br /&gt;
Einmal mit 120V Eingangsspannung (163mW) und einmal mit 230V (1550mW), die Unterschiede sind immens. Selbst wenn man die Verluste bei 120V bei der Reihenschaltung von zwei Stück verdoppelt, erreicht man in Summe eine Verringerung der Leerlaufverluste um den Faktor fünf!&lt;br /&gt;
&lt;br /&gt;
== Versorgung über Vorwiderstand/Kondensator ==&lt;br /&gt;
&lt;br /&gt;
Wenn nur sehr kleine Ausgangsströme benötigt werden, so kommt die Verwendung eines einfachen Netzteils in Frage, welches einen Vorwiderstand verwendet um die Netzspannung herabzusetzen. Da es sich bei der Netzspannung um eine Wechselspannung handelt, eignen sich neben rein ohmschen Widerständen auch Kondensatoren und Spulen als Vorwiderstand. Praktisch werden Spulen jedoch nie verwendet, weil diese zu groß wären. Da aus Energiegründen meist Kondensatoren verwendet werden, spricht man auch umgangssprachlich vom Kondensatornetzteil.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Capnt.gif | framed | ohne | 5V / 10mA Kondensatornetzteil]]&lt;br /&gt;
&lt;br /&gt;
Der Kondensator C1 bildet hier den kapazitiven Vorwiderstand für unser Kondensatornetzteil, seine Impedanz bestimmt den Strom. Der Vorteil gegenüber einem Widerstand ist, dass keine Wirkleistung erzeugt wird, sprich es entsteht keine Wärme. Wenn wir alle Spannungsabfälle durch die übrigen Bauteile vernachlässigen, können wir einfach mit...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathrm{X_{C}= {1 \over {2 \pi \cdot f \cdot C}} }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathrm{X_{C1}= {1 \over {2 \pi \cdot 50Hz \cdot C}} }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...die Impedanz des Kondensators an 50 Hz Wechselspannung errechnen (wir vernachlässigen den ohmschen Reihenwiderstand des Kodensators und betrachten seinen Blindwiderstand als Impedanz).&lt;br /&gt;
&lt;br /&gt;
Für 10 mA bei 230V brauchen wir einen Ersatzwiderstand von:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathrm{R_{Ersatz}= {230V - 12V \over 10mA} = {22k \Omega} }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das ergibt nach Gleichsetzen von X(C1) = 22 kΩ und Umstellen nach C eine rechnerische Kapazität von 145 nF. Eine Kapazität von 150nF würde gut passen und ist als Standardwert verfügbar. Mit der Wahl eines etwas größeren Kondensators kommen wir rechnerisch über 10mA und haben dadurch ein wenig mehr Luft nach oben. Der Kondensator als kapazitiver Vorwiderstand erzeugt keine Wärme, nur etwas Phasenverschiebung zwischen Strom und Spannung. Ein 22-kΩ-Widerstand würde 2,2 W Verlustleistung als Wärme erzeugen. Der Rest der Schaltung erklärt sich relativ einfach.&lt;br /&gt;
&lt;br /&gt;
* Sicherung F1 soll vor möglichen Schwelbränden im Falle eines Kurzschlusses schützen. Brandsichere Widerstände R1 und R2 erfüllen den gleichen Zweck.&lt;br /&gt;
* R1 und R2 begrenzen zusammen den Einschaltstrom, sollte die Schaltung beim Sinusscheitelpunkt angeschlossen werden (Eingangsspannung kurzzeitig 325V). Es wurden zwei Widerstände verwendet, damit sich der Spannungsfall über beide Widerstände aufteilt, denn normale Widerstände sind nur bis 200 V belastbar. Der kurzzeitig hohe Ladestrom, der nur von diesen Widerständen begrenzt wird, wird von C2 und D1 aufgenommen.&lt;br /&gt;
* R3 und R4 dienen als Entladewiderstände für C1, damit nach Trennen vom Netz keine gefährliche Ladung im Kondensator verbleibt. Auch hier werden zwecks Spannungsaufteilung zwei Widerstände verwendet.&lt;br /&gt;
* Der Brückengleichrichter B1 richtet die Wechselspannung in eine Gleichspannung.&lt;br /&gt;
* Die [[Diode#Z-Diode | Z-Diode]] D1 begrenzt die maximale Eingangsspannung für IC1. Sie muss lediglich so gewählt werden, dass der Spannungsregler noch sauber arbeiten kann.&lt;br /&gt;
* Die Eingangsspannung für IC1 wird durch C2 und C3 gepuffert. Die Wechselspannungsanteile der gleichgerichteten Spannung sind dadurch sehr gering.&lt;br /&gt;
* IC1 ist der Spannungsregler, er erzeugt die 5V Ausgangsspannung. C4 soll ein Schwingen des Reglers verhindern.&lt;br /&gt;
* IC1 kann alternativ auch mit einem stromsparenden Regler wie z.B LP2950 bestückt werden, dadurch stehen 3..5mA mehr für die Schaltung zur Verfügung, welche sonst vom 7805 verbraucht werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung!&#039;&#039;&#039; Es ist wichtig zu wissen, daß zwischen den Punkten &amp;quot;+5V&amp;quot; und &amp;quot;GND&amp;quot; im Normalfall nur ein Potential von 5 Volt anliegt und der Strom auch durch die Schaltung begrenzt wird. Aber das Potential gegen Erde ist immer noch lebensgefährlich, da bei dieser Netzteilart keine galvanische Trennung stattfindet. Solch eine Schaltung &#039;&#039;&#039;muss&#039;&#039;&#039; man in ein Gehäuse verbauen, welches vor Berührung mit leitfähigen Teilen schützt (Schutzklasse I oder II).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;WARNUNG!!! Wirklich niemals (!) leitfähige Teile einer Schaltung berühren, die vom Stromnetz nicht galvanisch getrennt sind!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ein halbwegs sicherer Umgang mit der Schaltung ist dann möglich, wenn man über einen Trenntrafo eine galvanische Trennung zum Netz herstellt und hinter dem Trenntrafo mit der Schaltung arbeitet.&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.grosse-elektronik.de/das-elko/trlosestr/index.html Stromversorgung über Vorwiderstand oder Kondensator ausführlich erklärt]&lt;br /&gt;
* [http://www.elektronik-kompendium.de/public/schaerer/cpowsup.htm Direkte 230V Versorgung im ELKO]&lt;br /&gt;
* [http://www.trifolium.de/netzteil/kap13.html Auschnitt auch &amp;quot;Das Netzteil- und Konverterbuch&amp;quot;]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/192090?goto=new#new Forenbeitrag: Weitbereichslinearregler mit kleinem Ausgangsstrom]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/194814#new Forenbeitrag: Weitbereichslinearregler mit kleinem Ausgangsstrom, weitere Vorschläge]&lt;br /&gt;
&lt;br /&gt;
=== Besser: Querregler ===&lt;br /&gt;
&lt;br /&gt;
Die Verwendung von &#039;&#039;Längsreglern&#039;&#039; (etwa 78L05) ist bei dieser Netzteilart ungünstig, da eine Vorregelung per Zener-Diode erforderlich ist.&lt;br /&gt;
Besser ist die Verwendung eines &#039;&#039;Querreglers&#039;&#039; (etwa TL431). Dessen Vorwiderstand wird so dimensioniert, dass die Spannungsschwankungen am Ladekondensator bei maximalem Entnahmestrom gerade ausgeglichen werden können. In diesem Fall erscheinen 150 Ω angemessen, für 1,5 V Ripplespannung an C2. Auf diese Weise erhält man einen Low-Drop-Spannungsregler mit – ohnehin erforderlichem – konstanten Stromverbrauch.&lt;br /&gt;
&lt;br /&gt;
Merke: Die Wirkleistungsaufnahme solcher Netzteilschaltungen ist proportional zur Ladespannung am Elko C2. Daher ist diese möglichst niedrig anzusetzen.&lt;br /&gt;
Kondensatornetzteile sind eher &#039;&#039;Stromquellen&#039;&#039; als &#039;&#039;Spannungsquellen&#039;&#039;, was bei der Schaltungsdimensionierung zu beachten bzw. auszunutzen ist.&lt;br /&gt;
&lt;br /&gt;
=== Relais-Schaltungen ===&lt;br /&gt;
&lt;br /&gt;
Derartige Netzteile werden gern zur Ansteuerung von Relais eingesetzt. Um die Stromaufnahme und damit den Kondensator C1 möglichst klein zu halten (Kostenfaktor), werden gern 24-V-Typen benutzt, die sich mit 10 .. 20 mA Anzugstrom begnügen. Das ergibt aber trotzdem 0,25 .. 0,5 W Leistungsaufnahme, die von einem Konstantspannungsnetzteil permanent zur Verfügung gestellt wird und damit stets irgendwo verheizt wird, auch wenn das Relais nicht arbeitet.&lt;br /&gt;
&lt;br /&gt;
Eine Lösung des Problems ist die Umschaltung der Ausgangsspannung an C2. Damit kann die Relaisspule parallel zu C2 betrieben werden und wird zum Ausschalten durch einen Transistor mit Z-Diode am Kollektor gebrückt (ein selbstleitender SFET oder MOSFET liegt da nahe). Hauptsache, das Relais fällt bei – angenommen – 4 V auch tatsächlich ab. Die Freilaufdiode entfällt. Die Steuerschaltung (angenommen für 3 V) wird in diesem Fall mit einem Low-Drop-Längsregler mit genügend großem Eingangsspannungsbereich versorgt.&lt;br /&gt;
&lt;br /&gt;
Eine andere Lösung verwendet eine Reihenschaltung sogar mehrerer Relaiswicklungen, die jeweils per Überbrückung abgeschaltet werden. In diesem Fall hat C2 bei höherer Spannungsfestigkeit eine vergleichsweise kleine Kapazität, da das Ripple größer ausfallen darf, da die Selbstinduktivität der Relaiswicklung(en) für Konstantstrom sorgt und C2 „leersaugt“.&lt;br /&gt;
&lt;br /&gt;
== Schaltnetzteil ==&lt;br /&gt;
&lt;br /&gt;
Schaltnetzteile sind heutzutage weit verbreitet, da sie gegenüber konventionellen Netzteilen eine kompaktere Bauweise, einen höheren Wirkungsgrad und geringere Produktionskosten aufweisen.&lt;br /&gt;
&lt;br /&gt;
Zur Versorgung einer eigenen Schaltung eignen sich am besten Steckernetzteile (auch &amp;quot;Wandwarzen&amp;quot; genannt :)) welche eine mehr oder weniger gut geregelte Ausgangsspannung bereit stellen.&lt;br /&gt;
&lt;br /&gt;
Um das Schaltnetzteil direkt in eine eigene Schaltung zu integrieren, ist die einzige Möglichkeit die Verwendung von fertigen AC/DC Modulen welche meist relativ teuer sind (im Vergleich zu Steckernetzteilen). Dafür bieten Fertigmodule meist gut spezifizierte Betriebsparameter und sind bei namhaften Herstellern auch über mehrere Jahre hinweg lieferbar. Ausserdem sind die leicht anwendbar, man muss kein Schaltnetzteilprofi sein.&lt;br /&gt;
&lt;br /&gt;
Als Alternative zum Kauf von fertigen Schaltnetzteilen soll im folgenden ein 230VAC-&amp;gt;5VDC Netzteil vorgestellt werden. Allerdings rate ich davon ab solch ein Netzteil in Umlauf zu bringen. Das Ganze dient eher als proof of concept und natürlich wurde das Netzteil nicht nach den geltenden Sicherheits- und EMV-Bestimmungen geprüft. Die Schaltung ist ausschließlich für eigene Experimente/Schaltungen gedacht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Download&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hier die ZIP Datei mit der EAGLE .brd- und .sch-Datei:&lt;br /&gt;
[http://www.mikrocontroller.net/wikifiles/9/94/Tiny_SMPS_eagle.zip Eagle Dateien downloaden]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spezifikation&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Eingangsspannung 85VAC bis 265VAC @ 50-400 Hz&lt;br /&gt;
* Ausgangsspannung 5 Volt / 1 Ampere&lt;br /&gt;
&lt;br /&gt;
TODO: Ein paar mehr Messungen durchführen...&lt;br /&gt;
&lt;br /&gt;
Eingangsspannung kann auch unter 85VAC liegen (siehe Anmerkungen).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Smps5v_sch.gif]]&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan im Detail (von links nach rechts):&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Primärseite&#039;&#039;&lt;br /&gt;
* F2 ist eine träge Sicherung (1 Ampere). Sie sichert die Schaltung ab, sollte auf der Primärseite ein Kurzschlussstrom fließen&lt;br /&gt;
* Der Brückengleichrichter richtet die Netzspannung gleich&lt;br /&gt;
* C9, L1, C2 bilden einen Pi-Filter. Über den Kondensatoren liegt bei 230VAC Eingangsspannung eine Spannung von ungefähr 310 Volt an&lt;br /&gt;
* C5, R1, D3 bilden ein [[Snubber]]-Netzwerk (Klemmschaltung) - dieses Netzwerk &amp;quot;verbrät&amp;quot; die Leistung welche beim Abschalten des Leistungstransistors in die Primärwicklung induziert wird (da sich die Spannungsverhältnisse umkehren)&lt;br /&gt;
* Der Regler-IC ohne Bezeichnung ist ein TNY264 - er integriert eine fortschrittliche [[PWM]]-Regelung (dabei handelt es sich um eine PWM mit variabler Frequenz und Frequenz-Jitter), eine primärseitige Strombegrenzung, einen Fehlereingang und die Erzeugung seiner eigenen Betriebsspannung aus der Netzspannung&lt;br /&gt;
* Der Trafo T1 ist ein Sperrwandlertrafo mit Luftspalt (Kern E16)&lt;br /&gt;
* C8 unterdrückt hochfrequente EMV Störungen - Wichtig: Der Kondensator muss der Klasse Y1 entsprechen um die Sicherheit zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Sekundärseite&#039;&#039;&lt;br /&gt;
* D2 dient als Gleichrichterdiode&lt;br /&gt;
* C4, L2, C3 bilden einen weiteren Pi-Filter zur Filterung der Ausgangsspannung&lt;br /&gt;
* Über [[Diode#Z-Diode | Zener Diode]] D1, R2 und Optokoppler OK1 wird die Ausgangsspannung zum Regler IC zurück gekoppelt. Der Regler versucht einen konstanten Strom durch den Transistor in OK1 fließen zu lassen, dadurch wird auf der Sekundärseite eine konstante Ausgangsspannung erzeugt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkungen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Zwischen L und N hätte man auch noch einen Varistor zur Überspannungsbegrenzung und einen X Kondensator (nach der Sicherung!) zur Unterdrückung von HF schalten können&lt;br /&gt;
* Zur Verbesserung der EMV hätte man auch noch eine Netzdoppeldrossel verwenden können. Diese Drossel würde Gegentaktstörungen verringern. Allerdings lässt sich auch mit einer einfachen Drossel eine ausreichende EMV erreichen (ob das bei dieser Schaltung der Fall ist weiss ich nicht und würde ich bezweifeln)&lt;br /&gt;
* Bei Versuchen am Labornetzteil stellte sich heraus, dass das Netzteil schon bei 50VDC Versorgung funktioniert. Einen Belastungstest habe ich bei dieser Spannung nicht durchgeführt, aber dadurch hat man die Möglichkeit das Netzteil gefahrlos zu erproben.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Layout&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Smps5v_brd.gif]]&lt;br /&gt;
&lt;br /&gt;
Zum Layout gibt es nicht viel zu sagen. Abstände wurden so groß wie möglich gehalten und der größte Teil des Layouts wurde mit großzügigen Kupferflächen realisiert, um eine gute Wärmeableitung und eine niederohmige Anbindung zu erhalten. Ob das Layout VDE-konform ist kann ich nicht sagen. Der Abstand zwischen Primär- und Sekundärseite sollte allerdings groß genug sein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stückliste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Netzteil wurde so gestaltet, dass alle Bauteile bei Farnell bestellt werden können. Nur die Platine muss man sich natürlich selbst ätzen.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;sortable&amp;quot; id=&amp;quot;stueckliste&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Stromlauf&lt;br /&gt;
! Bestellnummer&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (1 Stück)&lt;br /&gt;
|-&lt;br /&gt;
| F2&lt;br /&gt;
| 3030076&lt;br /&gt;
| Sicherung - 1A, Flink&lt;br /&gt;
| 0,62 €&lt;br /&gt;
|-&lt;br /&gt;
| B1&lt;br /&gt;
| 1467468&lt;br /&gt;
| DF04M Brückengleichrichter - 1.5A, 400V&lt;br /&gt;
| 0,21 €&lt;br /&gt;
|-&lt;br /&gt;
| C9 C2&lt;br /&gt;
| 1165626&lt;br /&gt;
| Kondensator Vishay - 4.7µF, 400V&lt;br /&gt;
| 0,23 €&lt;br /&gt;
|-&lt;br /&gt;
| L1&lt;br /&gt;
| 1077038&lt;br /&gt;
| Drossel - 2.2mH&lt;br /&gt;
| 1,25 €&lt;br /&gt;
|-&lt;br /&gt;
| IC1&lt;br /&gt;
| 9921320&lt;br /&gt;
| TNY264PN&lt;br /&gt;
| 1,65 €&lt;br /&gt;
|-&lt;br /&gt;
| D3&lt;br /&gt;
| 1299306&lt;br /&gt;
| SF18G Diode - 1A, 600V&lt;br /&gt;
| 0,23 €&lt;br /&gt;
|-&lt;br /&gt;
| C5&lt;br /&gt;
| 1141794&lt;br /&gt;
| Kondensator Vishay - 2.2nF, 1kV&lt;br /&gt;
| 0,22 €&lt;br /&gt;
|-&lt;br /&gt;
| R1&lt;br /&gt;
| &lt;br /&gt;
| Widerstand - 1/4W, 200k Ohm&lt;br /&gt;
| 0,05 €&lt;br /&gt;
|-&lt;br /&gt;
| C8&lt;br /&gt;
| 3531971&lt;br /&gt;
| Kondensator X1/Y1 Murata - 1nF, 4kV&lt;br /&gt;
| 0,31 €&lt;br /&gt;
|-&lt;br /&gt;
| T1&lt;br /&gt;
| 1214650&lt;br /&gt;
| Trafo Myrra 74094&lt;br /&gt;
| 4,20 €&lt;br /&gt;
|-&lt;br /&gt;
| D2&lt;br /&gt;
| 9907637&lt;br /&gt;
| Schottky Diode STPS2L60 - 2A&lt;br /&gt;
| 0,30 €&lt;br /&gt;
|-&lt;br /&gt;
| C4 C3&lt;br /&gt;
| 1219462&lt;br /&gt;
| Kondensator Panasonic - 470µF, 16V&lt;br /&gt;
| 0,37 €&lt;br /&gt;
|-&lt;br /&gt;
| L2&lt;br /&gt;
| 1077049&lt;br /&gt;
| Drossel - 10µH&lt;br /&gt;
| 1,25 €&lt;br /&gt;
|-&lt;br /&gt;
| D1&lt;br /&gt;
| 1097231&lt;br /&gt;
| Zener BZX79-C3V9 - 3.9 Volt, 500mW&lt;br /&gt;
| 0,11 €&lt;br /&gt;
|-&lt;br /&gt;
| R2&lt;br /&gt;
| &lt;br /&gt;
| Widerstand - 1/4W, 100Ω&lt;br /&gt;
| 0,05 €&lt;br /&gt;
|-&lt;br /&gt;
| OK1&lt;br /&gt;
| 9707700&lt;br /&gt;
| Optokoppler PC817&lt;br /&gt;
| 0,36 €&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Macht zusammen 11,88€. Das steht im grunde im keinen Verhältnis zu einem gekauften 5V/1A Netzteil, denn das kostet in etwa das Gleiche und ist bereits fertig aufgebaut und nach gültigen Normen geprüft. Die Eigenentwicklung solcher Netzteile lohnt sich nur in sehr großen Stückzahlen von 10.000 Stück und mehr und wenn man auf dem Gebiet viel Erfahrung hat. &lt;br /&gt;
&lt;br /&gt;
[[Category:1. Wettbewerb]]&lt;br /&gt;
[[Category:Spannungsversorgung und Energiequellen]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Controller_an_230V&amp;diff=63087</id>
		<title>Controller an 230V</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Controller_an_230V&amp;diff=63087"/>
		<updated>2012-01-05T10:10:25Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Versorgung über Vorwiderstand/Kondensator */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Lupin]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Da immer wieder mal die Frage aufkommt, wie man eine eigene Schaltung direkt am Netz betreiben kann soll hier ein Artikel entstehen, welcher die Möglichkeiten zur Erzeugung einer angemessenen Gleichspannung aufzeigt.&lt;br /&gt;
&lt;br /&gt;
Aber zuerst eine Warnung die ernst genommen werden sollte (!!!):&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Arbeiten an Netzspannung ist lebensgefährlich!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Deshalb sollte man nie direkt an Netzspannung arbeiten, wenn überhaupt nur mit entsprechenden Schutzeinrichtungen (z.&amp;amp;nbsp;B. Trenntrafo) und dann auch nur wenn man über die nötige Erfahrung verfügt. Aber grundsätzlich ist Vorsicht geboten.&lt;br /&gt;
&lt;br /&gt;
Wer nicht ganz genau weiss womit er es zu tun hat sollte lieber eine sichere Lösung verwenden wie z.&amp;amp;nbsp;B. die Stromversorgung aus einem VDE zugelassenen Trafo oder fertige Steckernetzteile.&lt;br /&gt;
&lt;br /&gt;
== Stecker(schalt)netzteil ==&lt;br /&gt;
&lt;br /&gt;
Die sicherste Lösung ist die Verwendung eines Steckernetzteils welches eine galvanisch getrennte Gleichspannung bereit stellt. Wer ganz auf Nummer Sicher gehen will achtet auf das GS (Geprüfte Sicherheit) Kennzeichen auf dem Netzteil:&lt;br /&gt;
&lt;br /&gt;
[[Bild:SteckerNetzteile.jpg|500px]]&lt;br /&gt;
&lt;br /&gt;
Zwei Steckernetzteile. Das Linke hat eine ungeregelte Ausgangsspannung (Trafo-&amp;gt;Gleichrichtung-&amp;gt;Siebung). Das Rechte hat eine nachgeschaltete Regelung mit einstellbarer Ausgangsspannung.&lt;br /&gt;
&lt;br /&gt;
Die Spannung wird meist über Hohlstecker zur Schaltung geführt.&lt;br /&gt;
&lt;br /&gt;
Billige Steckernetzteile geben eine ungeregelte Spannung aus, sie verändert sich mit der Last. In diesem Falle ist keine direkte Versorgung der Schaltung möglich und die Eingangsspannung sollte mit einen Spannungsregler geregelt werden:&lt;br /&gt;
&lt;br /&gt;
[[Bild:V_Regler.gif]]&lt;br /&gt;
&lt;br /&gt;
== Trafonetzteil ==&lt;br /&gt;
&lt;br /&gt;
Ein Trafonetzteil besteht aus einem Netztrafo, einer Gleichrichtung, einer Siebung und einer Regelung.&lt;br /&gt;
&lt;br /&gt;
* Der Netztrafo stellt eine galvanisch getrennte Wechselspannung am Ausgang bereit, diese Spannungs ist bedeutend kleiner als die Eingangsspannung.&lt;br /&gt;
&lt;br /&gt;
* Die Gleichrichtung wandelt diese Wechselspannung in eine Gleichspannung. Die Siebung entfernt die restlichen Wechselspannungsanteile (nach einer Vollbrückengleichrichtung beträgt die Wechselspannungsfrequenz 100 Hz).&lt;br /&gt;
&lt;br /&gt;
* Die Regelung kann u.U. auch weggelassen werden, wenn keine genaue Ausgangsspannung gefordert ist. Aber ohne Regelung würde die Ausgangsspannung je nach Belastung schwanken. Die Regelung sorgt dafür, dass unabhängig von der Belastung des Netzteils die gewünschte Ausgangsspannung konstant am Ausgang anliegt.&lt;br /&gt;
&lt;br /&gt;
Die Ausgangsspannung des Trafos ist immer höher als die Ausgangsspannung des Reglers, da der Regler einen gewissen Arbeitsbereich benötigt, die sogenannte Dropout-Spannung. &lt;br /&gt;
&lt;br /&gt;
Die Leistung, die durch den Regler in Wärme umgesetzt wird errechnet sich wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;P_{Verlust}=(U_{Ein}-U_{Aus}) \cdot I_{Aus}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei 10 Volt am Eingang des Spannungsreglers, einer Ausgangsspannung von 5 Volt und einem Strom von 1 Ampere ergibt das eine Verlustleistung von 5 Watt. Hört sich nicht viel an, allerdings beträgt die Ausgangsleistung auch nur 5 Watt. Das Ergibt einen Wirkungsgrad von 50%. Dazu kommen aber noch Verluste welche im Transformator entstehen. Der Spannungsregler braucht dann einen [[Kühlkörper]].&lt;br /&gt;
&lt;br /&gt;
[[Bild:Trafont.gif]]&lt;br /&gt;
&lt;br /&gt;
Ein Trafonetzteil hat auch den Nachteil, daß es durch den schweren Eisenkern nicht sehr handlich ist.&lt;br /&gt;
&lt;br /&gt;
Es gibt Printtransformatoren, welche sich auf die Leiterplatte löten lassen. So ist es möglich das Netzteil in die eigene Schaltung zu integrieren. Der Anschluss der 230V Netzspannung birgt allerdings eine Gefahr.&lt;br /&gt;
&lt;br /&gt;
=== Sparsames Trafonetzteil für Dauerbetrieb ===&lt;br /&gt;
&lt;br /&gt;
Möchte man eine besonders sparsame Stromversorgung aufbauen, welche eine sehr kleine, sparsame Schaltung das ganze Jahr über betreiben soll, empfiehlt es sich, neben der Beachtung der Konzepte zum Stromsparen per [[Sleep Mode]] und [[Ultra low power]], von den bekannten Minitrafos mit nur 0,5-1VA zwei statt einem zu nutzen. Dabei werden jeweils Primär- und Sekundärwicklung in Reihe geschaltet. Warum?&lt;br /&gt;
&lt;br /&gt;
Weil diese Trafos auf Kante dimensioniert sind, um Material und Bauvolumen zu sparen, und bei Nennspannung schon ordentlich in die magnetische Sättigung gehen. Dabei entstehen große Verluste durch Stromspitzen auf der Primärseite. Eine genauere Erklärung findet man im Artikel [[Transformatoren und Spulen]]. Bei der Reihenschaltung sieht jeder Trafo nur die halbe Spannung, damit kommt er nicht so stark in die Sättigung und es wird deutlich weniger Energie sinnlos verbraucht. Dazu noch einen stromsparenden Spannungsregler ala LP2950 und das Ganze braucht weniger als 0,5W.&lt;br /&gt;
&lt;br /&gt;
In diesem [http://www.mikrocontroller.net/topic/191871#1875697 Forumsbeitrag] wure exemplarisch ein solcher Trafo vermessen.&lt;br /&gt;
&lt;br /&gt;
*Kanal 1 Eingangsstrom&lt;br /&gt;
*Kanal 2 Eingangsspannung&lt;br /&gt;
*Kanal M Leistung&lt;br /&gt;
&lt;br /&gt;
Einmal mit 120V Eingangsspannung (163mW) und einmal mit 230V (1550mW), die Unterschiede sind immens. Selbst wenn man die Verluste bei 120V bei der Reihenschaltung von zwei Stück verdoppelt, erreicht man in Summe eine Verringerung der Leerlaufverluste um den Faktor fünf!&lt;br /&gt;
&lt;br /&gt;
== Versorgung über Vorwiderstand/Kondensator ==&lt;br /&gt;
&lt;br /&gt;
Wenn nur sehr kleine Ausgangsströme benötigt werden, so kommt die Verwendung eines einfachen Netzteils in Frage, welches einen Vorwiderstand verwendet um die Netzspannung herabzusetzen. Da es sich bei der Netzspannung um eine Wechselspannung handelt, eignen sich neben rein ohmschen Widerständen auch Kondensatoren und Spulen als Vorwiderstand. Praktisch werden Spulen jedoch nie verwendet, weil diese zu groß wären. Da aus Energiegründen meist Kondensatoren verwendet werden, spricht man auch umgangssprachlich vom Kondensatornetzteil.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Capnt.gif | framed | ohne | 5V / 10mA Kondensatornetzteil]]&lt;br /&gt;
&lt;br /&gt;
Der Kondensator C1 bildet hier den kapazitiven Vorwiderstand für unser Kondensatornetzteil, seine Impedanz bestimmt den Strom. Der Vorteil gegenüber einem Widerstand ist, dass keine Wirkleistung erzeugt wird, sprich es entsteht keine Wärme. Wenn wir alle Spannungsabfälle durch die übrigen Bauteile vernachlässigen, können wir einfach mit...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathrm{X_{C}= {1 \over {2 \pi \cdot f \cdot C}} }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathrm{X_{C1}= {1 \over {2 \pi \cdot 50Hz \cdot C}} }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...die Impedanz des Kondensators an 50 Hz Wechselspannung errechnen (wir vernachlässigen den ohmschen Reihenwiderstand des Kodensators und betrachten seinen Blindwiderstand als Impedanz).&lt;br /&gt;
&lt;br /&gt;
Für 10 mA bei 230V brauchen wir einen Ersatzwiderstand von:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathrm{R_{Ersatz}= {230V - 12V \over 10mA} = {22k \Omega} }&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das ergibt nach Gleichsetzen von X(C1) = 22 kΩ und Umstellen nach C eine rechnerische Kapazität von 145 nF. Eine Kapazität von 150nF würde gut passen und ist als Standardwert verfügbar. Mit der Wahl eines etwas größeren Kondensators kommen wir rechnerisch über 10mA und haben dadurch ein wenig mehr Luft nach oben. Der Kondensator als kapazitiver Vorwiderstand erzeugt keine Wärme, nur etwas Phasenverschiebung zwischen Strom und Spannung. Ein 22-kΩ-Widerstand würde 2,2 W Verlustleistung als Wärme erzeugen. Der Rest der Schaltung erklärt sich relativ einfach.&lt;br /&gt;
&lt;br /&gt;
* Sicherung F1 soll vor möglichen Schwelbränden im Falle eines Kurzschlusses schützen. Brandsichere Widerstände R1 und R2 erfüllen den gleichen Zweck.&lt;br /&gt;
* R1 und R2 begrenzen zusammen den Einschaltstrom, sollte die Schaltung beim Sinusscheitelpunkt angeschlossen werden (Eingangsspannung kurzzeitig 325V). Es wurden zwei Widerstände verwendet, damit sich der Spannungsfall über beide Widerstände aufteilt, denn normale Widerstände sind nur bis 200 V belastbar. Der kurzzeitig hohe Ladestrom, der nur von diesen Widerständen begrenzt wird, wird von C2 und D1 aufgenommen.&lt;br /&gt;
* R3 und R4 dienen als Entladewiderstände für C1, damit nach Trennen vom Netz keine gefährliche Ladung im Kondensator verbleibt. Auch hier werden zwecks Spannungsaufteilung zwei Widerstände verwendet.&lt;br /&gt;
* Der Brückengleichrichter B1 richtet die Wechselspannung in eine Gleichspannung.&lt;br /&gt;
* Die [[Diode#Z-Diode | Z-Diode]] D1 begrenzt die maximale Eingangsspannung für IC1. Sie muss lediglich so gewählt werden, dass der Spannungsregler noch sauber arbeiten kann.&lt;br /&gt;
* Die Eingangsspannung für IC1 wird durch C2 und C3 gepuffert. Die Wechselspannungsanteile der gleichgerichteten Spannung sind dadurch sehr gering.&lt;br /&gt;
* IC1 ist der Spannungsregler, er erzeugt die 5V Ausgangsspannung. C4 soll ein Schwingen des Reglers verhindern.&lt;br /&gt;
* IC1 kann alternativ auch mit einem stromsparenden Regler wie z.B LP2950 bestückt werden, dadurch stehen 3..5mA mehr für die Schaltung zur Verfügung, welche sonst vom 7805 verbraucht werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung!&#039;&#039;&#039; Es ist wichtig zu wissen, daß zwischen den Punkten &amp;quot;+5V&amp;quot; und &amp;quot;GND&amp;quot; im Normalfall nur ein Potential von 5 Volt anliegt und der Strom auch durch die Schaltung begrenzt wird. Aber das Potential gegen Erde ist immer noch lebensgefährlich, da bei dieser Netzteilart keine galvanische Trennung stattfindet. Solch eine Schaltung &#039;&#039;&#039;muss&#039;&#039;&#039; man in ein Gehäuse verbauen, welches vor Berührung mit leitfähigen Teilen schützt (Schutzklasse I oder II).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;WARNUNG!!! Wirklich niemals (!) leitfähige Teile einer Schaltung berühren, die vom Stromnetz nicht galvanisch getrennt sind!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ein halbwegs sicherer Umgang mit der Schaltung ist dann möglich, wenn man über einen Trenntrafo eine galvanische Trennung zum Netz herstellt und hinter dem Trenntrafo mit der Schaltung arbeitet.&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.grosse-elektronik.de/das-elko/trlosestr/index.html Stromversorgung über Vorwiderstand oder Kondensator ausführlich erklärt]&lt;br /&gt;
* [http://www.elektronik-kompendium.de/public/schaerer/cpowsup.htm Direkte 230V Versorgung im ELKO]&lt;br /&gt;
* [http://www.trifolium.de/netzteil/kap13.html Auschnitt auch &amp;quot;Das Netzteil- und Konverterbuch&amp;quot;]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/192090?goto=new#new Forenbeitrag: Weitbereichslinearregler mit kleinem Ausgangsstrom]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/194814#new Forenbeitrag: Weitbereichslinearregler mit kleinem Ausgangsstrom, weitere Vorschläge]&lt;br /&gt;
&lt;br /&gt;
=== Anmerkung ===&lt;br /&gt;
&lt;br /&gt;
Die Verwendung von &#039;&#039;Längsreglern&#039;&#039; (etwa 78L05) ist bei dieser Netzteilart ungünstig, da eine Vorregelung per Zener-Diode erforderlich ist.&lt;br /&gt;
Besser ist die Verwendung eines &#039;&#039;Querreglers&#039;&#039; (etwa TL431). Dessen Vorwiderstand wird so dimensioniert, dass die Spannungsschwankungen am Ladekondensator bei maximalem Entnahmestrom gerade ausgeglichen werden können. In diesem Fall erscheinen 150 Ω angemessen, für 1,5 V Ripplespannung an C2. Auf diese Weise erhält man einen Low-Drop-Spannungsregler mit – ohnehin erforderlichem – konstanten Stromverbrauch.&lt;br /&gt;
&lt;br /&gt;
Merke: Die Wirkleistungsaufnahme solcher Netzteilschaltungen ist proportional zur Ladespannung am Elko C2. Daher ist diese möglichst niedrig anzusetzen.&lt;br /&gt;
Kondensatornetzteile sind eher &#039;&#039;Stromquellen&#039;&#039; als &#039;&#039;Spannungsquellen&#039;&#039;, was bei der Schaltungsdimensionierung zu beachten bzw. auszunutzen ist.&lt;br /&gt;
&lt;br /&gt;
=== Relais-Schaltungen ===&lt;br /&gt;
&lt;br /&gt;
Derartige Netzteile werden gern zur Ansteuerung von Relais eingesetzt. Um die Stromaufnahme und damit den Kondensator C1 möglichst klein zu halten (Kostenfaktor), werden gern 24-V-Typen benutzt, die sich mit 10 .. 20 mA Anzugstrom begnügen. Das ergibt aber trotzdem 0,25 .. 0,5 W Leistungsaufnahme, die von einem Konstantspannungsnetzteil permanent zur Verfügung gestellt wird und damit stets irgendwo verheizt wird, auch wenn das Relais nicht arbeitet.&lt;br /&gt;
&lt;br /&gt;
Eine Lösung des Problems ist die Umschaltung der Ausgangsspannung an C2. Damit kann die Relaisspule parallel zu C2 betrieben werden und wird zum Ausschalten durch einen Transistor mit Z-Diode am Kollektor gebrückt (ein selbstleitender SFET oder MOSFET liegt da nahe). Hauptsache, das Relais fällt bei – angenommen – 4 V auch tatsächlich ab. Die Freilaufdiode entfällt. Die Steuerschaltung (angenommen für 3 V) wird in diesem Fall mit einem Low-Drop-Längsregler mit genügend großem Eingangsspannungsbereich versorgt.&lt;br /&gt;
&lt;br /&gt;
Eine andere Lösung verwendet eine Reihenschaltung sogar mehrerer Relaiswicklungen, die jeweils per Überbrückung abgeschaltet werden. In diesem Fall hat C2 bei höherer Spannungsfestigkeit eine vergleichsweise kleine Kapazität, da das Ripple größer ausfallen darf, da die Selbstinduktivität der Relaiswicklung(en) für Konstantstrom sorgt und C2 „leersaugt“.&lt;br /&gt;
&lt;br /&gt;
== Schaltnetzteil ==&lt;br /&gt;
&lt;br /&gt;
Schaltnetzteile sind heutzutage weit verbreitet, da sie gegenüber konventionellen Netzteilen eine kompaktere Bauweise, einen höheren Wirkungsgrad und geringere Produktionskosten aufweisen.&lt;br /&gt;
&lt;br /&gt;
Zur Versorgung einer eigenen Schaltung eignen sich am besten Steckernetzteile (auch &amp;quot;Wandwarzen&amp;quot; genannt :)) welche eine mehr oder weniger gut geregelte Ausgangsspannung bereit stellen.&lt;br /&gt;
&lt;br /&gt;
Um das Schaltnetzteil direkt in eine eigene Schaltung zu integrieren, ist die einzige Möglichkeit die Verwendung von fertigen AC/DC Modulen welche meist relativ teuer sind (im Vergleich zu Steckernetzteilen). Dafür bieten Fertigmodule meist gut spezifizierte Betriebsparameter und sind bei namhaften Herstellern auch über mehrere Jahre hinweg lieferbar. Ausserdem sind die leicht anwendbar, man muss kein Schaltnetzteilprofi sein.&lt;br /&gt;
&lt;br /&gt;
Als Alternative zum Kauf von fertigen Schaltnetzteilen soll im folgenden ein 230VAC-&amp;gt;5VDC Netzteil vorgestellt werden. Allerdings rate ich davon ab solch ein Netzteil in Umlauf zu bringen. Das Ganze dient eher als proof of concept und natürlich wurde das Netzteil nicht nach den geltenden Sicherheits- und EMV-Bestimmungen geprüft. Die Schaltung ist ausschließlich für eigene Experimente/Schaltungen gedacht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Download&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hier die ZIP Datei mit der EAGLE .brd- und .sch-Datei:&lt;br /&gt;
[http://www.mikrocontroller.net/wikifiles/9/94/Tiny_SMPS_eagle.zip Eagle Dateien downloaden]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spezifikation&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Eingangsspannung 85VAC bis 265VAC @ 50-400 Hz&lt;br /&gt;
* Ausgangsspannung 5 Volt / 1 Ampere&lt;br /&gt;
&lt;br /&gt;
TODO: Ein paar mehr Messungen durchführen...&lt;br /&gt;
&lt;br /&gt;
Eingangsspannung kann auch unter 85VAC liegen (siehe Anmerkungen).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltplan&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Smps5v_sch.gif]]&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan im Detail (von links nach rechts):&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Primärseite&#039;&#039;&lt;br /&gt;
* F2 ist eine träge Sicherung (1 Ampere). Sie sichert die Schaltung ab, sollte auf der Primärseite ein Kurzschlussstrom fließen&lt;br /&gt;
* Der Brückengleichrichter richtet die Netzspannung gleich&lt;br /&gt;
* C9, L1, C2 bilden einen Pi-Filter. Über den Kondensatoren liegt bei 230VAC Eingangsspannung eine Spannung von ungefähr 310 Volt an&lt;br /&gt;
* C5, R1, D3 bilden ein [[Snubber]]-Netzwerk (Klemmschaltung) - dieses Netzwerk &amp;quot;verbrät&amp;quot; die Leistung welche beim Abschalten des Leistungstransistors in die Primärwicklung induziert wird (da sich die Spannungsverhältnisse umkehren)&lt;br /&gt;
* Der Regler-IC ohne Bezeichnung ist ein TNY264 - er integriert eine fortschrittliche [[PWM]]-Regelung (dabei handelt es sich um eine PWM mit variabler Frequenz und Frequenz-Jitter), eine primärseitige Strombegrenzung, einen Fehlereingang und die Erzeugung seiner eigenen Betriebsspannung aus der Netzspannung&lt;br /&gt;
* Der Trafo T1 ist ein Sperrwandlertrafo mit Luftspalt (Kern E16)&lt;br /&gt;
* C8 unterdrückt hochfrequente EMV Störungen - Wichtig: Der Kondensator muss der Klasse Y1 entsprechen um die Sicherheit zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Sekundärseite&#039;&#039;&lt;br /&gt;
* D2 dient als Gleichrichterdiode&lt;br /&gt;
* C4, L2, C3 bilden einen weiteren Pi-Filter zur Filterung der Ausgangsspannung&lt;br /&gt;
* Über [[Diode#Z-Diode | Zener Diode]] D1, R2 und Optokoppler OK1 wird die Ausgangsspannung zum Regler IC zurück gekoppelt. Der Regler versucht einen konstanten Strom durch den Transistor in OK1 fließen zu lassen, dadurch wird auf der Sekundärseite eine konstante Ausgangsspannung erzeugt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkungen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Zwischen L und N hätte man auch noch einen Varistor zur Überspannungsbegrenzung und einen X Kondensator (nach der Sicherung!) zur Unterdrückung von HF schalten können&lt;br /&gt;
* Zur Verbesserung der EMV hätte man auch noch eine Netzdoppeldrossel verwenden können. Diese Drossel würde Gegentaktstörungen verringern. Allerdings lässt sich auch mit einer einfachen Drossel eine ausreichende EMV erreichen (ob das bei dieser Schaltung der Fall ist weiss ich nicht und würde ich bezweifeln)&lt;br /&gt;
* Bei Versuchen am Labornetzteil stellte sich heraus, dass das Netzteil schon bei 50VDC Versorgung funktioniert. Einen Belastungstest habe ich bei dieser Spannung nicht durchgeführt, aber dadurch hat man die Möglichkeit das Netzteil gefahrlos zu erproben.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Layout&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Smps5v_brd.gif]]&lt;br /&gt;
&lt;br /&gt;
Zum Layout gibt es nicht viel zu sagen. Abstände wurden so groß wie möglich gehalten und der größte Teil des Layouts wurde mit großzügigen Kupferflächen realisiert, um eine gute Wärmeableitung und eine niederohmige Anbindung zu erhalten. Ob das Layout VDE-konform ist kann ich nicht sagen. Der Abstand zwischen Primär- und Sekundärseite sollte allerdings groß genug sein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stückliste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Netzteil wurde so gestaltet, dass alle Bauteile bei Farnell bestellt werden können. Nur die Platine muss man sich natürlich selbst ätzen.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;sortable&amp;quot; id=&amp;quot;stueckliste&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Stromlauf&lt;br /&gt;
! Bestellnummer&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (1 Stück)&lt;br /&gt;
|-&lt;br /&gt;
| F2&lt;br /&gt;
| 3030076&lt;br /&gt;
| Sicherung - 1A, Flink&lt;br /&gt;
| 0,62 €&lt;br /&gt;
|-&lt;br /&gt;
| B1&lt;br /&gt;
| 1467468&lt;br /&gt;
| DF04M Brückengleichrichter - 1.5A, 400V&lt;br /&gt;
| 0,21 €&lt;br /&gt;
|-&lt;br /&gt;
| C9 C2&lt;br /&gt;
| 1165626&lt;br /&gt;
| Kondensator Vishay - 4.7µF, 400V&lt;br /&gt;
| 0,23 €&lt;br /&gt;
|-&lt;br /&gt;
| L1&lt;br /&gt;
| 1077038&lt;br /&gt;
| Drossel - 2.2mH&lt;br /&gt;
| 1,25 €&lt;br /&gt;
|-&lt;br /&gt;
| IC1&lt;br /&gt;
| 9921320&lt;br /&gt;
| TNY264PN&lt;br /&gt;
| 1,65 €&lt;br /&gt;
|-&lt;br /&gt;
| D3&lt;br /&gt;
| 1299306&lt;br /&gt;
| SF18G Diode - 1A, 600V&lt;br /&gt;
| 0,23 €&lt;br /&gt;
|-&lt;br /&gt;
| C5&lt;br /&gt;
| 1141794&lt;br /&gt;
| Kondensator Vishay - 2.2nF, 1kV&lt;br /&gt;
| 0,22 €&lt;br /&gt;
|-&lt;br /&gt;
| R1&lt;br /&gt;
| &lt;br /&gt;
| Widerstand - 1/4W, 200k Ohm&lt;br /&gt;
| 0,05 €&lt;br /&gt;
|-&lt;br /&gt;
| C8&lt;br /&gt;
| 3531971&lt;br /&gt;
| Kondensator X1/Y1 Murata - 1nF, 4kV&lt;br /&gt;
| 0,31 €&lt;br /&gt;
|-&lt;br /&gt;
| T1&lt;br /&gt;
| 1214650&lt;br /&gt;
| Trafo Myrra 74094&lt;br /&gt;
| 4,20 €&lt;br /&gt;
|-&lt;br /&gt;
| D2&lt;br /&gt;
| 9907637&lt;br /&gt;
| Schottky Diode STPS2L60 - 2A&lt;br /&gt;
| 0,30 €&lt;br /&gt;
|-&lt;br /&gt;
| C4 C3&lt;br /&gt;
| 1219462&lt;br /&gt;
| Kondensator Panasonic - 470µF, 16V&lt;br /&gt;
| 0,37 €&lt;br /&gt;
|-&lt;br /&gt;
| L2&lt;br /&gt;
| 1077049&lt;br /&gt;
| Drossel - 10µH&lt;br /&gt;
| 1,25 €&lt;br /&gt;
|-&lt;br /&gt;
| D1&lt;br /&gt;
| 1097231&lt;br /&gt;
| Zener BZX79-C3V9 - 3.9 Volt, 500mW&lt;br /&gt;
| 0,11 €&lt;br /&gt;
|-&lt;br /&gt;
| R2&lt;br /&gt;
| &lt;br /&gt;
| Widerstand - 1/4W, 100Ω&lt;br /&gt;
| 0,05 €&lt;br /&gt;
|-&lt;br /&gt;
| OK1&lt;br /&gt;
| 9707700&lt;br /&gt;
| Optokoppler PC817&lt;br /&gt;
| 0,36 €&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Macht zusammen 11,88€. Das steht im grunde im keinen Verhältnis zu einem gekauften 5V/1A Netzteil, denn das kostet in etwa das Gleiche und ist bereits fertig aufgebaut und nach gültigen Normen geprüft. Die Eigenentwicklung solcher Netzteile lohnt sich nur in sehr großen Stückzahlen von 10.000 Stück und mehr und wenn man auf dem Gebiet viel Erfahrung hat. &lt;br /&gt;
&lt;br /&gt;
[[Category:1. Wettbewerb]]&lt;br /&gt;
[[Category:Spannungsversorgung und Energiequellen]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=MSP430_Codebeispiele&amp;diff=61478</id>
		<title>MSP430 Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=MSP430_Codebeispiele&amp;diff=61478"/>
		<updated>2011-11-07T09:03:16Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Persistente Daten im Information Memory */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;MSP430 &amp;amp;#8211; Codebeispiele&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Einleitung:&#039;&#039;&#039;&lt;br /&gt;
Da der MSP430 eine sehr schöner Mikrocontroller für energiesparende Anwendungen ist, jedoch bei weitem nicht so verbreitet wie z.&amp;amp;nbsp;B. diverse 8051er, AVRs, PICs usw. ist, gibt es auch nicht all zu viele Codebeispiele aus Projekten für den/die Hobbybastler(in).&lt;br /&gt;
Aus diesem Grund werden hier Grundlagen der Initialisierung diverser Hardwarefeatures sowie grundlegende Softwareroutinen und dergleichen beschrieben, so dass für Anfänger auch ein einfaches Copy&amp;amp;Paste möglich ist.&lt;br /&gt;
Hierbei kommt der MSPGCC zum Einsatz, da eine professionelle unlimitierte Ausgabe des z.&amp;amp;nbsp;B. IAR für Bastler nahezu unbezahlbar ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Hardware =&lt;br /&gt;
&lt;br /&gt;
== Initializing/ Configuring UARTs ==&lt;br /&gt;
Von www.mathar.com stammt diese Routine zur initialisierung eines beliebigen UARTS. Zusätzlich müssen jedoch die Pins noch definiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void InitUSART(char USART0, char USART1, unsigned int baudrate1, unsigned int baudrate2, char IR0, char IR1)&lt;br /&gt;
{&lt;br /&gt;
  if (USART0) ME1 |= UTXE0 + URXE0;    // falls gesetzt, USART0 einschalten (TX- und RX-teil)&lt;br /&gt;
  if (USART1) ME2 |= UTXE1 + URXE1;    // falls gesetzt, USART1 einschalten (TX- und RX-teil)&lt;br /&gt;
  UCTL0 |= CHAR;                       // 8 data bits, 1 stop bit, no parity (8N1)&lt;br /&gt;
  UCTL1 |= CHAR;&lt;br /&gt;
  UTCTL0 |= SSEL1;                     // SMCLK als UCLK festlegen&lt;br /&gt;
  UTCTL1 |= SSEL1;&lt;br /&gt;
  if (baudrate1==19200)&lt;br /&gt;
  {&lt;br /&gt;
    UBR00 = 0xA0;                      // 19200 baud aus 8 MHz erzeugen&lt;br /&gt;
    UBR10 = 0x01;                      // siehe application note tabelle 1, seite 9&lt;br /&gt;
    UMCTL0 = 0x00;                     // keine korrektur der division noetig&lt;br /&gt;
  }&lt;br /&gt;
  if (baudrate2==19200)&lt;br /&gt;
  {&lt;br /&gt;
    UBR01 = 0xA0;                      // 19200 baud aus 8 MHz erzeugen&lt;br /&gt;
    UBR11 = 0x01;                      // siehe application note tabelle 1, seite 9&lt;br /&gt;
    UMCTL1 = 0x00;                     // keine korrektur der division noetig&lt;br /&gt;
  }&lt;br /&gt;
  if (USART0) UCTL0 &amp;amp;= ~SWRST;         // USART freigeben&lt;br /&gt;
  if (USART1) UCTL1 &amp;amp;= ~SWRST;&lt;br /&gt;
  if (IR0==0) IE1 |= URXIE0;           // IR0: 0 -&amp;gt; nur RX-interrupt anschalten&lt;br /&gt;
  if (IR0==1) IE1 |= UTXIE0;           //      1 -&amp;gt; nur TX-interrupt anschalten&lt;br /&gt;
  if (IR0==2) IE1 |= URXIE0 + UTXIE0;  //      2 -&amp;gt; TX- und RX-interrupt anschalten&lt;br /&gt;
  if (IR1==1||IR1==2) IFG1 &amp;amp;= ~UTXIFG0;  // initales interrupt-flag loeschen&lt;br /&gt;
  if (IR1==0) IE2 |= URXIE1;           // IR1: 0 -&amp;gt; nur RX-interrupt anschalten&lt;br /&gt;
  if (IR1==1) IE2 |= UTXIE1;           //      1 -&amp;gt; nur TX-interrupt anschalten&lt;br /&gt;
  if (IR1==2) IE2 |= URXIE1 + UTXIE1;  //      2 -&amp;gt; TX- und RX-interrupt anschalten&lt;br /&gt;
  if (IR1==1||IR1==2) IFG1 &amp;amp;= ~UTXIFG1;  // initales interrupt-flag loeschen&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialization/configuration of USART (SPI and I2C/TWI) ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_spi(void)&lt;br /&gt;
{&lt;br /&gt;
  ME1 |= USPIE0;                        // Enable USART0 SPI mode&lt;br /&gt;
  UTCTL0 = CKPH+SSEL1+SSEL0+STC;        // SMCLK, 3-pin mode&lt;br /&gt;
  UCTL0 = CHAR+SYNC+MM;                 // 8-bit SPI Master **SWRST**&lt;br /&gt;
  UBR00 = 0x02;                         // UCLK/2 &lt;br /&gt;
  UBR10 = 0x00;                         // 0&lt;br /&gt;
  UMCTL0 = 0x00;                        // no modulation&lt;br /&gt;
  P3SEL |= 0x0E;                        // P3.1-3 SPI option select&lt;br /&gt;
  P3DIR |= 0x01;                        // P3.0 output direction&lt;br /&gt;
  _EINT();                              // Enable interrupts&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void init_i2c(unsigned char slave)&lt;br /&gt;
{&lt;br /&gt;
  P3SEL |= 0x0a;                            // Assign I2C pins to module&lt;br /&gt;
  U0CTL |= I2C + SYNC;                      // Switch USART0 to I2C mode&lt;br /&gt;
  U0CTL &amp;amp;= ~I2CEN;                          // Recommended I2C init procedure&lt;br /&gt;
  I2CTCTL = I2CSSEL_2;                      // SMCLK&lt;br /&gt;
  I2CSCLH = 0x03;                           // High period of SCL&lt;br /&gt;
  I2CSCLL = 0x03;                           // Low period of SCL&lt;br /&gt;
  I2CNDAT = 0x01;                           // Transmit one byte&lt;br /&gt;
  I2CSA = slave;                             // Slave address&lt;br /&gt;
  U0CTL |= I2CEN;                           // Enable I2C, 7 bit addr,&lt;br /&gt;
  I2CIE = RXRDYIE;                          // I2C receive ready interrupt enable&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung der Quarze ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_XT2(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned int i;&lt;br /&gt;
  WDTCTL = WDTPW + WDTHOLD;             // Stop WDT&lt;br /&gt;
  BCSCTL1 &amp;amp;= ~XT2OFF;                   // XT2 = HF XTAL&lt;br /&gt;
  do &lt;br /&gt;
  {&lt;br /&gt;
    IFG1 &amp;amp;= ~OFIFG;                       // Clear OSCFault flag&lt;br /&gt;
    for (i = 0xFF; i &amp;gt; 0; i--);           // Time for flag to set&lt;br /&gt;
  }&lt;br /&gt;
  while ((IFG1 &amp;amp; OFIFG) != 0);          // OSCFault flag still set?                &lt;br /&gt;
  BCSCTL2 |= SELM1;                     // MCLK = XT2 (safe)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_XT(void) // high frequenz resonators ( 455 kHz - 8MhZ )&lt;br /&gt;
{&lt;br /&gt;
  unsigned int i;&lt;br /&gt;
  WDTCTL = WDTPW + WDTHOLD;             // Stop WDT&lt;br /&gt;
  BCSCTL1 |= XTS;                       // ACLK = LFXT1 = HF XTAL&lt;br /&gt;
  do &lt;br /&gt;
  {&lt;br /&gt;
    IFG1 &amp;amp;= ~OFIFG;                       // Clear OSCFault flag&lt;br /&gt;
    for (i = 0xFF; i &amp;gt; 0; i--);           // Time for flag to set&lt;br /&gt;
  }&lt;br /&gt;
  while ((IFG1 &amp;amp; OFIFG) == OFIFG);      // OSCFault flag still set?                &lt;br /&gt;
  BCSCTL2 |= SELM1+SELM0;               // MCLK = LFXT1 (safe)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Bei den neueren MSP430F55xx nicht vergessen, dass bei CPU-Taktfrequenzen über 8 MHz vorher die Kernspannung erhöht werden muss, sonst drohen Abstürze oder „rätselhaftes“ Verhalten. Eins der TI-Beispiele (12 MHz) „vergisst“ das sogar.&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des ADCs ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_ADC(void)&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0 = ADC12ON;	// ADC12ON / reference on Avcc&lt;br /&gt;
  P6SEL |= 0x01;        // P6.0 ADC option select &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
unsigned int sampling_ADC(void)&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0 |= ADC12SC + ENC;   // Sampling open&lt;br /&gt;
  ADC12CTL0 &amp;amp;= ~ADC12SC;        // Sampling closed, start conversion&lt;br /&gt;
  while ((ADC12CTL1 &amp;amp; ADC12BUSY) == 1);   // ADC12BUSY?&lt;br /&gt;
  return(ADC12MEM0);	// return the value read from ADC P6.0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des DACs ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void init_DAC(void)&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0 = REF2_5V + REFON;              // Internal 2.5V ref on&lt;br /&gt;
  DAC12_0CTL = DAC12IR + DAC12AMP_5 + DAC12ENC;   // Internal ref gain &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void write_DAC(unsigned int val)&lt;br /&gt;
{&lt;br /&gt;
  DAC12_0DAT = val;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des Timers A ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_TimerA(unsigned int cycles )&lt;br /&gt;
{&lt;br /&gt;
  TACTL = TASSEL1 + TACLR;              // SMCLK, clear TAR&lt;br /&gt;
  CCTL0 = CCIE;                         // CCR0 interrupt enabled&lt;br /&gt;
  CCR0 = cycles;&lt;br /&gt;
  TACTL |= MC_2;                         // Start Timer_A in continuous mode&lt;br /&gt;
  _EINT();                              // interrupt enable&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Timer A0 interrupt service routine&lt;br /&gt;
interrupt (TIMERA0_VECTOR) Timer_A(void)&lt;br /&gt;
{&lt;br /&gt;
  P1OUT ^= 0x01;                        // Toggle P1.0&lt;br /&gt;
  CCR0 += 50000;                        // Add Offset to CCR0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des Timers B ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_TimerB(unsigned int cycles)&lt;br /&gt;
{&lt;br /&gt;
  TBCTL = TBSSEL1 + TBCLR;              // SMCLK, clear TAR&lt;br /&gt;
  TBCCTL0 = CCIE;                       // CCR0 interrupt enabled&lt;br /&gt;
  TBCCR0 = cycles;&lt;br /&gt;
  TBCTL |= MC_2;                         // Start Timer_B in continuous mode&lt;br /&gt;
  _EINT();                              // interrupt enable&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Timer B0 interrupt service routine&lt;br /&gt;
interrupt (TIMERB0_VECTOR) Timer_B(void)&lt;br /&gt;
{&lt;br /&gt;
  P1OUT ^= 0x01;                        // Toggle P1.0&lt;br /&gt;
  TBCCR0 += 50000;                      // Add Offset to CCR0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des Watchdogs ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_wdt(void)&lt;br /&gt;
{&lt;br /&gt;
  WDTCTL = WDT_MDLY_32;                 // Set Watchdog Timer interval to ~30ms&lt;br /&gt;
  IE1 |= WDTIE;                         // Enable WDT interrupt&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Watchdog Timer interrupt service routine&lt;br /&gt;
interrupt (WDT_VECTOR) watchdog_timer(void)&lt;br /&gt;
{&lt;br /&gt;
  // do this, in an case of an interrupt&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  WDTCTL = WDTPW + WDTHOLD;	// Watchdog anhalten&lt;br /&gt;
  P1DIR |= 0x01;		// P1.0 als Ausgang&lt;br /&gt;
&lt;br /&gt;
  for (;;)&lt;br /&gt;
  {&lt;br /&gt;
    volatile unsigned i;	// volatile, sonst wird die Warteschleife „wegoptimiert“&lt;br /&gt;
    P1OUT ^= 0x01;		// P1.0 umschalten mit Exklusiv-ODER&lt;br /&gt;
&lt;br /&gt;
    i = 10000;			// Warteschleife in Software&lt;br /&gt;
    do; while (--i);		// (CPU-Leistung „verheizen“)&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung der GPIO ==&lt;br /&gt;
Die Ein/Ausgabeleitungen haben beim MSP430, je nach Ausbaustufe, folgende Fähigkeiten:&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Einzeln (bitweise) programmierbare Ein/Ausgabe (&amp;lt;b&amp;gt;PxDIR&amp;lt;/b&amp;gt;, &amp;lt;b&amp;gt;PxOUT&amp;lt;/b&amp;gt;)&lt;br /&gt;
&amp;lt;li&amp;gt;Unabhängige Lese-Adresse (&amp;lt;b&amp;gt;PxIN&amp;lt;/b&amp;gt;)&lt;br /&gt;
&amp;lt;li&amp;gt;Ansprechbar als 8-Bit-Ports oder je paarweise als 16-bit-Port, bspw. P1 + P2 = PA usw.&lt;br /&gt;
&amp;lt;li&amp;gt;Interrupt auf Pegelwechsel einzelner Portpins (nur P1 und P2) (&amp;lt;b&amp;gt;PxIES&amp;lt;/b&amp;gt;)&lt;br /&gt;
&amp;lt;li&amp;gt;Pull-Up, Pull-Down oder kein Widerstand auswählbar (&amp;lt;b&amp;gt;PxREN&amp;lt;/b&amp;gt;, PxOUT)&lt;br /&gt;
&amp;lt;li&amp;gt;Einstellbare Treiberstärke (reduziert und voll) (&amp;lt;b&amp;gt;PxDS&amp;lt;/b&amp;gt;)&lt;br /&gt;
&amp;lt;li&amp;gt;Ein bis zwei Peripheriefunktionen pro Pin (&amp;lt;b&amp;gt;PxSEL&amp;lt;/b&amp;gt;), auswählbar mittels PxDIR (d.h. bei zwei Peripheriefunktionen ist eine Ausgang und die andere Eingang)&lt;br /&gt;
&amp;lt;li&amp;gt;Das JTAG-Port (4 Pins) und das USB-Port (2 Pins) ist standardmäßig ein E/A-Port (MSP430F55xx)&lt;br /&gt;
&amp;lt;li&amp;gt;Erweiterte Peripheriezuordnung bei P4 (MSP430F55xx) mittels Port Mapping Controller&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Nicht 5-V-verträglich!!&amp;lt;/b&amp;gt; Keinem Portpin darf ohne genügend großen Vorwiderstand 5 V angeboten werden. Ableitströme dürfen nicht zum Ansteigen der Speisespannung führen!&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Manche Portpins haben ein gemeinsames PxSEL, etwa:&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;das JTAG-Port (entweder alle 4 oder kein Pin zugeordnet)&lt;br /&gt;
&amp;lt;li&amp;gt;das USB-Port (entweder Portpin oder USB D+ und D–)&lt;br /&gt;
&amp;lt;li&amp;gt;die Quarz-Anschlüsse (das niederwertige PxSEL schaltet beide Portpins)&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle Portpins sind beim Einschalten (PUC) wie folgt initialisiert:&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Eingang ohne Pull-Up oder Pull-Down&lt;br /&gt;
&amp;lt;li&amp;gt;Reduzierte Treiberstärke&lt;br /&gt;
&amp;lt;li&amp;gt;Kein Pegelwechsel-Interrupt&lt;br /&gt;
&amp;lt;li&amp;gt;Keine Peripherie-Zuordnung&lt;br /&gt;
&amp;lt;li&amp;gt;Der Inhalt des Ausgaberegisters &amp;lt;b&amp;gt;PxOUT&amp;lt;/b&amp;gt; ist undefiniert!&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Alle ungenutzten Anschlüsse sollten per PullDown (&amp;lt;b&amp;gt;PxREN&amp;lt;/b&amp;gt; und &amp;lt;b&amp;gt;PxOUT&amp;lt;/b&amp;gt;) festgelegt werden.&lt;br /&gt;
&lt;br /&gt;
Kein MSP430 hat einen herausgeführten Busanschluss, etwa um mehr RAM anzubinden.&lt;br /&gt;
&lt;br /&gt;
== Initialisierung von PWM ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_PWM_TimerA(void)&lt;br /&gt;
{&lt;br /&gt;
  TACTL = TASSEL1 + TACLR;              // SMCLK, Clear Tar&lt;br /&gt;
  CCR0 = 512-1;                         // PWM Period&lt;br /&gt;
  CCTL1 = OUTMOD_7;                     // CCR1 reset/set&lt;br /&gt;
  P1DIR |= 0x04;                        // P1.2 PWM output&lt;br /&gt;
  P1SEL |= 0x04;                        // P1.2 and TA1/2 otions&lt;br /&gt;
  TACTL |= MC0;                         // Start Timer_A in up mode&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void set_PWM_duty_cycle(unsigned char duty)&lt;br /&gt;
{&lt;br /&gt;
  CCR1 = duty;                           // CCR1 PWM duty cycle &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Persistente Daten im Information Memory ==&lt;br /&gt;
Kodebeispiel für &#039;&#039;&#039;mspgcc&#039;&#039;&#039; und MSP430F1610&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// Eine INFOMEM-Struktur und deren Vorbelegung&lt;br /&gt;
struct PERSISTENT {&lt;br /&gt;
 int a,b;		// Man achte sinnfälligerweise auf korrekte Ausrichtung, um späteren Portierungsproblemen vorzubeugen!&lt;br /&gt;
 long c,d;		// mspgcc legt die Daten in little-endian ab&lt;br /&gt;
 char e,f;		// hier beispielhaft 14 Bytes insgesamt&lt;br /&gt;
}epersistent __attribute__((section(&amp;quot;.infomem&amp;quot;)))={&lt;br /&gt;
 1,2, 3,4, 5,6};&lt;br /&gt;
&lt;br /&gt;
// RAM-Kopie derselben Struktur (für gehäuften Schreibzugriff)&lt;br /&gt;
struct PERSISTENT persistent;&lt;br /&gt;
&lt;br /&gt;
// Initialisierungskode&lt;br /&gt;
 FCTL2 = 0xA549;		// Flash-Takt festlegen, bspw. MCLK = 4,6 MHz, ÷ 10 = 460 kHz&lt;br /&gt;
 persistent=epersistent;	// svw. memcpy&lt;br /&gt;
&lt;br /&gt;
// Rückschreib-Kode (im Flash, ohne &amp;lt;mspgcc/flash.h&amp;gt;, gelegentlich aufrufen):&lt;br /&gt;
// Das Flash-Schreiben blockiert den Prozessor!&lt;br /&gt;
 if (memcmp(epersistent,persistent,sizeof(epersistent))) {&lt;br /&gt;
  FCTL3 = 0xA500;		// LOCK entfernen&lt;br /&gt;
  FCTL1 = 0xA502;		// ERASE setzen&lt;br /&gt;
  epersistent.a = 0xFFFF;	// Segment löschen (≈ 10 ms)&lt;br /&gt;
  FCTL1 = 0xA540;		// SCHREIBEN setzen&lt;br /&gt;
  epersistent=persistent;	// svw. memcpy, byteweise in Flash schreiben (≈ 1 ms)&lt;br /&gt;
  FCTL1 = 0xA500;		// SCHREIBEN sperren&lt;br /&gt;
  FCTL3 = 0xA510;		// LOCK setzen&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
// Mit &amp;lt;mspgcc/flash.h&amp;gt;:&lt;br /&gt;
#include &amp;lt;mspgcc/flash.h&amp;gt;&lt;br /&gt;
 if (memcmp(epersistent,persistent,sizeof(epersistent))) {&lt;br /&gt;
  flash_lock_segmentA(0);&lt;br /&gt;
  flash_erase_segment(&amp;amp;epersistent);	// Segment löschen (≈ 10 ms)&lt;br /&gt;
  flash_write(epersistent,persistent,sizeof(epersistent)); //schreiben (≈ 1 ms)&lt;br /&gt;
  flash_lock_segmentA(1);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Ganz so komfortabel wie der EEPROM-Bereich der AVR-Controller ist der MSP430 Information Memory nicht, da dieser nur als Ganzes gelöscht werden kann und alle Lösch- und Schreiboperationen den Prozessor blockieren, es sei denn, der Schreibkode liegt im RAM.&lt;br /&gt;
&lt;br /&gt;
Weil das Speichern von ein paar Konfigurationsdaten eher nebenbei zum normalen Programmablauf erfolgen wird, lohnt sich die Mühe zumeist nicht, den Schreib-Kode in den RAM auszulagern. Der Flash-Zugriff erleichtert sich dadurch erheblich, und wie man im Beispiel „ohne &amp;lt;mspgcc/flash.h&amp;gt;“ sieht, ist auch nicht viel zu tun. Ein einfaches &#039;&#039;&#039;memcpy&#039;&#039;&#039; oder jeder andere Schreibzugriff genügt zum Beschreiben.&lt;br /&gt;
&lt;br /&gt;
Ist nicht CPU-blockierender Schreibzugriff erwünscht, können IMHO keine Interrupts währenddessen verwendet werden. &#039;&#039;Sämtlicher&#039;&#039; aktiver Kode muss sich im RAM befinden, etwa, um eine serielle Schnittstelle abzufragen.&lt;br /&gt;
&lt;br /&gt;
Einige MSP430-Derivate enthalten in ihrem Information Memory ein paar Konfigurationsdaten, die man retten und wiederherstellen sollte, oder man benutzt einen anderen Speicherblock! (Wie?)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= Interrupts: =&lt;br /&gt;
&lt;br /&gt;
== UARTs ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// z. B. ein Echo mit dem MSPGCC-Compiler:&lt;br /&gt;
interrupt (UART0RX_VECTOR) usart0_rx(void)&lt;br /&gt;
{&lt;br /&gt;
   TXBUF0=RXBUF0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// z. B. ein Echo mit dem ImageCraft ICC430-Compiler:&lt;br /&gt;
#pragma interrupt_handler usart0_rx:UART0RX_VECTOR&lt;br /&gt;
void usart0_rx(void)&lt;br /&gt;
{&lt;br /&gt;
   TXBUF0=RXBUF0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Die Funktionen selbst können natürlich auch anders genannt werden.&lt;br /&gt;
&lt;br /&gt;
== Timer ==&lt;br /&gt;
&lt;br /&gt;
== IOs ==&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= Softwareroutinen: =&lt;br /&gt;
&lt;br /&gt;
== I2C/TWI in Software ==&lt;br /&gt;
Diese Routinen wurden ursprünglich für einen MSP430F149 geschrieben. Es werden ausschließlich IOs benutzt. Da Code in C geschrieben wurde sollte er sich einfach auf alle MSP430s ohne (aber auch mit I²C) portieren lassen. Der ist zwar nicht ganz schön, aber er funktioniert soweit ganz gut. Auch ein Beispiel ist dabei.&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/attachment.php/324877/soft-i2c.zip&lt;br /&gt;
&lt;br /&gt;
== PWM ==&lt;br /&gt;
&lt;br /&gt;
Untenstehender Code ist nur mit msp320-gcc getestet.&lt;br /&gt;
&lt;br /&gt;
Folgende Routine initialisiert den Timer als Up-Counter mit der Clock-Quelle SMCLK und einem Teiler von 8. Zudem wird der Interrupt aktiviert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void timerA_init(void)&lt;br /&gt;
{&lt;br /&gt;
	TACTL =  TASSEL_SMCLK | TACLR | ID_DIV8 | TAIE;&lt;br /&gt;
	TACTL |= MC_UPTO_CCR0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um den Timer zu starten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void timerA_start(int timing[2], int mode)&lt;br /&gt;
{&lt;br /&gt;
	TACCTL0 = mode;&lt;br /&gt;
	TACCTL0 |= CCIE ;                // enable interrupt&lt;br /&gt;
	TACCTL1 = mode;&lt;br /&gt;
	TACCR0 = timing[0];&lt;br /&gt;
	TACCR1 = timing[1];&lt;br /&gt;
	TAR = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktion wird normalerweise mit &#039;mode&#039; 3 aufgerufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
timerA_start(timing, OUTMOD_SET_RESET);&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
timing[0] enthaelt die komplette Zyklendauer einer PWM-Phase (H und L)&lt;br /&gt;
Beispiel: Um eine Pulsfrequenz von 125 Hz bei einem SMCLK von 1.0 MHz zu erhalten, gilt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;timing_0 = 1.0e6 / 8 / 125 = 1000&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
timing[1] schliesslich enthält die Zyklendauer des H-Pulses und ist immer kleiner als timing[0]. Bei einem &#039;duty cycle&#039; (Tastverhältnis) 50% gilt also&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;timing_1 = 500&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zu beachten ist, dass der Timerkanal 0 bei manchen Modi (wie dem obenstehenden) für die PWM nicht genutzt wird, &amp;quot;TACCTL0 = mode&amp;quot; keinen speziellen Effekt zeigt (siehe auch Manual).&lt;br /&gt;
&lt;br /&gt;
Deswegen wird das PWM-Signal auch an TA1 abgegriffen, nicht an TA0.&lt;br /&gt;
&lt;br /&gt;
Schlussendlich muss der entsprechende Ausgangspin für TA1 konfiguriert werden. Beim F2013 z.&amp;amp;nbsp;B. geschieht dies für P1.2 per&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	P1SEL |= 0x04;  // Enable primary peripheral&lt;br /&gt;
	P1DIR |= 0x04;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was war nun mit dem Interrupt? Falls wir z.&amp;amp;nbsp;B. die Zyklen zählen wollen, definieren wir einen Interrupt-Handler:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;signal.h&amp;gt; // &#039;interrupt&#039; makro&lt;br /&gt;
interrupt (TIMERA0_VECTOR) timera0_isr(void)&lt;br /&gt;
{&lt;br /&gt;
	g_count++;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Schlussendlich müssen wir noch die Interrupts im Initialisierungscode aktivieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
_EINT();&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Senden eines Bytes ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void SendUSART0c(char c)             // ein einzelnes zeichen über die serielle schnittstelle (USART0) senden&lt;br /&gt;
                                     // FJG: Obacht: x12xx : IFG1 =&amp;gt; IFG2 !&lt;br /&gt;
{&lt;br /&gt;
  while (!(IFG1 &amp;amp; UTXIFG0));           // warten, bis USART0 TX-buffer sendebereit&lt;br /&gt;
  TXBUF0 = c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SendUSART1c(char c)             // ein einzelnes zeichen über die serielle schnittstelle (USART1) senden&lt;br /&gt;
{&lt;br /&gt;
  while (!(IFG2 &amp;amp; UTXIFG1));           // warten, bis USART1 TX-buffer sendebereit&lt;br /&gt;
  TXBUF1 = c;&lt;br /&gt;
}     &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Senden eines Strings ==&lt;br /&gt;
Nullterminierte Strings; zugehörige Interrupts dürfen nicht aktiviert sein&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void SendUSART0(const char* str)	// einen String über die serielle Schnittstelle (USART0) senden&lt;br /&gt;
{&lt;br /&gt;
  while (*str != 0)&lt;br /&gt;
  {&lt;br /&gt;
    while (!(IFG1 &amp;amp; UTXIFG0));		// warten bis USART0 TX-Puffer frei (leer)&lt;br /&gt;
    TXBUF0 = *str++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SendUSART1(const char* str)	// einen String über die serielle Schnittstelle (USART1) senden&lt;br /&gt;
{&lt;br /&gt;
  while (*str)&lt;br /&gt;
  {&lt;br /&gt;
    while (!(IFG2 &amp;amp; UTXIFG1));		// warten bis USART1 TX-Puffer frei (leer)&lt;br /&gt;
    TXBUF1 = *str++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Binärdaten mittels DMA (hier: DMA-Kanal 0 an UART1)&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void send(const void*buf, unsigned len) {&lt;br /&gt;
// könnte globaler Initialisierungskode sein:&lt;br /&gt;
 DMACTL0 = 0x000A;		// DMA-Kanal 0 dem UART1-TxD zuordnen&lt;br /&gt;
// genauer: DMACTL0 = DMACTL0 &amp;amp; 0xFFF0 | 0x000A;&lt;br /&gt;
 DMA0DA  = (unsigned)&amp;amp;U1TXBUF;	// Zieladresse ist der Sendepuffer&lt;br /&gt;
// hier aufrufspezifischer Kode:&lt;br /&gt;
 DMA0SA  = (unsigned)buf;	// Quelladresse sind die Sendedaten&lt;br /&gt;
 DMA0SZ  = len;			// Anzahl der Byte-Transfers&lt;br /&gt;
 DMA0CTL = 0x03F0;		// Start des Single-DMA-Transfers, byte-weise mit steigender Quelladresse&lt;br /&gt;
// Abwarten aufs Ende, könnte man vorteilhaft asynchron erledigen.&lt;br /&gt;
// In so einem Fall muss der Aufrufer &amp;lt;buf&amp;gt; beibehalten bis der DMA-Transfer beendet ist&lt;br /&gt;
 while (!(DMA0CTL&amp;amp;DMAIFG));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Beachte: Die Interruptfreigabe des UART priorisiert Interruptverarbeitung über DMA! Das kann man auch gezielt ausnutzen, um mal Interrupt- und mal DMA-Betrieb zu realisieren.&lt;br /&gt;
&lt;br /&gt;
Anmerkung: Der MSP430, insbesondere die F1xxx-Serie, hat für einen sonst AVR-verwöhnten Anwender vergleichsweise &#039;&#039;&#039;starke&#039;&#039;&#039; Peripherie und eine &#039;&#039;&#039;schwache&#039;&#039;&#039; CPU. Deshalb ist die Benutzung von DMA und eines günstigen Binärdatenübertragungsprotokolls essentiell für Hochgeschwindigkeitsanwendungen, bei denen man beim AVR noch gut mit Interrupts zurecht kam.&lt;br /&gt;
&lt;br /&gt;
== Empfangen eines Bytes (interruptgesteuert)  // Receiving a byte-&amp;gt; Interrupt controlled ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/*Hab diese Interrupt Funktion für meine I²C Kommunikation verwendet&lt;br /&gt;
Startcondition wird erkannt, aber nicht Stop, da man die Flanken(die den&lt;br /&gt;
interrupt auslösen) umkehren müsste, aber dann keine Startkondition erkannt werden kann.&lt;br /&gt;
&lt;br /&gt;
Hab mir jetzt nicht die mühe gemacht alles rauszupicken was ihr nicht braucht.&lt;br /&gt;
Wer sich auskennt, kann das auch selber machen.&lt;br /&gt;
&lt;br /&gt;
Das Busy wird fürs stretching verwendet(CLK wird auf low gezogen)&lt;br /&gt;
*/  &lt;br /&gt;
&lt;br /&gt;
#pragma vector = PORT1_VECTOR           // Port 1 - Interrupt-Funktions-&amp;quot;Alias&amp;quot;&lt;br /&gt;
__interrupt void Interrupt_Port1()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
//  I2CTransfer = 0;&lt;br /&gt;
&lt;br /&gt;
    TACTL |= TACLR;&lt;br /&gt;
    TACTL |= TAIE;&lt;br /&gt;
#ifdef WD&lt;br /&gt;
    WDTCTL = WDTPW + WDTCNTCL;&lt;br /&gt;
#endif&lt;br /&gt;
    &lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
  if ((P1IFG &amp;amp; 0x04) &amp;amp;&amp;amp; !(I2CCLK)) { //if startdataimpuls but clk low is detected --return--&lt;br /&gt;
    P1IFG &amp;amp;= ~0x0C;&lt;br /&gt;
    return;}&lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
//    P1IE &amp;amp;= ~0x0C;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
  if ((P1IFG &amp;amp; 0x04) &amp;amp;&amp;amp; I2CCLK)   //Start Condition       (I2CStart)&lt;br /&gt;
    {&lt;br /&gt;
      P1IFG &amp;amp;= ~0x0C;&lt;br /&gt;
      &lt;br /&gt;
//    I2CTransfer = 1;&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
        P1IE &amp;amp;= ~0x0C;&lt;br /&gt;
//        TACTL |= TACLR;&lt;br /&gt;
//        TACTL |= TAIE;&lt;br /&gt;
//        _EINT();&lt;br /&gt;
&lt;br /&gt;
      &lt;br /&gt;
/*#ifdef Debug&lt;br /&gt;
      P2OUT |= 0x04;&lt;br /&gt;
      P2DIR |= 0x04; &lt;br /&gt;
#endif*/&lt;br /&gt;
      &lt;br /&gt;
//      Wait(10);&lt;br /&gt;
//      while(I2CCLK)  {CheckTimer;}&lt;br /&gt;
&lt;br /&gt;
//      set_Busy;&lt;br /&gt;
  &lt;br /&gt;
      BitCnt = 0x01;&lt;br /&gt;
      ByteCnt = 0;&lt;br /&gt;
//      I2CByte = 0;&lt;br /&gt;
      StartCondition = 1;&lt;br /&gt;
//      CRCByte = 0x00;&lt;br /&gt;
      GetData = 0;&lt;br /&gt;
      I2CTransfer = 0;&lt;br /&gt;
    &lt;br /&gt;
//    clr_Busy;&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
        _DINT();&lt;br /&gt;
        P1IE |= 0x0C;&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
  P1IFG &amp;amp;= ~0x0C;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
    TACTL |= TACLR;&lt;br /&gt;
    _EINT();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
  if (I2CCLK)&lt;br /&gt;
  {&lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
      TACTL |= TAIE;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    I2CByte &amp;lt;&amp;lt;= 1; &lt;br /&gt;
    if (I2CDAT){&lt;br /&gt;
      I2CByte += 0x01;&lt;br /&gt;
     }&lt;br /&gt;
    I2CTransfer = 1;&lt;br /&gt;
    while(I2CCLK) {CheckTimer;}&lt;br /&gt;
    set_Busy;&lt;br /&gt;
    BitCnt &amp;lt;&amp;lt;= 1;&lt;br /&gt;
  &lt;br /&gt;
    if(!(BitCnt == 0x00))&lt;br /&gt;
    {&lt;br /&gt;
      clr_Busy;  &lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      _NOP();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
  }&lt;br /&gt;
//----------------------------------------------------------------------------  &lt;br /&gt;
&lt;br /&gt;
P1DIR &amp;amp;= ~0x0C;&lt;br /&gt;
P1IFG = 0x00;&lt;br /&gt;
P1IE |= 0x0C;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ermitteln der Temperatur ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// von FJG info@aqua-sun.net :&lt;br /&gt;
// ---------------   Temperatur des Chips   ---------------------&lt;br /&gt;
&lt;br /&gt;
#define T_Faktor_a1000       ((long)103)     // REF 1,5V&lt;br /&gt;
#define T_Faktor_b1000       ((long)172)     // REF 2,5V&lt;br /&gt;
#define T_Faktor_c1000       ((long)278000)&lt;br /&gt;
&lt;br /&gt;
int Hole_Temp(void)	// Temperatur ch 10&lt;br /&gt;
{			// Temp = N* 0,17193 -278  1000Temp = N*172 -278000 bei 2,5V&lt;br /&gt;
  long Temp_L;&lt;br /&gt;
  int  Temp , Delta ;&lt;br /&gt;
&lt;br /&gt;
  Start_AD();&lt;br /&gt;
&lt;br /&gt;
  Temp_L = ((long)ADC12MEM10 * T_Faktor_a1000) - T_Faktor_c1000 ;&lt;br /&gt;
  Temp   = (int)( Temp_L / 1000);&lt;br /&gt;
&lt;br /&gt;
  Delta = Read_EEPROM( EPROM_INTERN_BL1_R_ADR,DELTA_TEMP_ADR );	   // falls Temp Messung&lt;br /&gt;
  if( Delta &amp;lt;= 120 &amp;amp;&amp;amp; Delta &amp;gt;= 80 ) Delta -= 100 ; else Delta = 0; // ungenau war&lt;br /&gt;
                                                                   // siehe dazu TI&lt;br /&gt;
  return (Temp + Delta);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// INIT AD&lt;br /&gt;
// AD muss angestoßen werden mit :   Start_AD()&lt;br /&gt;
&lt;br /&gt;
// #define ADC12TL0WERT15	(SHT1_8 + SHT0_3 + MSC + REFON + ADC12ON)&lt;br /&gt;
#define ADC12TL0WERT15		(SHT1_3 + SHT0_3 + MSC + REFON + ADC12ON)&lt;br /&gt;
#define ADC12TL0WERT25		(SHT1_3 + SHT0_3 + MSC + +REF2_5V + REFON + ADC12ON)&lt;br /&gt;
&lt;br /&gt;
//                        Start CH0 , ADC12SCBIT , SampleT , F/2 , MCLK , Sequenze of CH&lt;br /&gt;
#define ADC12CTL1WERT   ( CSTARTADD_0 + SHS_0 + SHP + ADC12DIV_1 + ADC12SSEL_2 + CONSEQ_1 )&lt;br /&gt;
&lt;br /&gt;
void adc12_init()	// ADC12CTL0 modifizieren nur mit ENC = 0&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0   = 0x00;&lt;br /&gt;
  ADC12CTL1   = ADC12CTL1WERT ;&lt;br /&gt;
&lt;br /&gt;
  ADC12MCTL0  = INCH_0;                  &lt;br /&gt;
  ADC12MCTL1  = INCH_1;                  &lt;br /&gt;
  ADC12MCTL2  = INCH_2;&lt;br /&gt;
  ADC12MCTL3  = INCH_3;&lt;br /&gt;
  ADC12MCTL4  = INCH_4;&lt;br /&gt;
  ADC12MCTL5  = INCH_5;&lt;br /&gt;
  ADC12MCTL6  = INCH_6;&lt;br /&gt;
  ADC12MCTL7  = INCH_7;                  &lt;br /&gt;
  ADC12MCTL8  = INCH_8;		// VeREF+&lt;br /&gt;
  ADC12MCTL9  = INCH_9;		// VeREF-&lt;br /&gt;
&lt;br /&gt;
  ADC12MCTL10 = INCH_10 + SREF_1 ;&lt;br /&gt;
  ADC12MCTL11 = INCH_11 + SREF_1 +EOS;&lt;br /&gt;
&lt;br /&gt;
  ADC12IE     = 0x00;&lt;br /&gt;
  ADC12CTL0   = ADC12TL0WERT15 ;&lt;br /&gt;
  ADC12CTL0  |= 0x0003;		// ENC + ADC12SC = Enable Conversation + StartConversation&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------   Diverses AD_Wandler   --------------------&lt;br /&gt;
&lt;br /&gt;
void Start_AD(void)&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0 &amp;amp;= ~ENC;&lt;br /&gt;
  ADC12CTL0 |= (ADC12SC+ENC);&lt;br /&gt;
  NOP();&lt;br /&gt;
  NOP();&lt;br /&gt;
  ADC12CTL0 &amp;amp;=~ADC12SC;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#ifndef TEST_AD&lt;br /&gt;
#define Ist_AD_Busy()        ( ADC12CTL1 &amp;amp; ADC12BUSY )&lt;br /&gt;
#else&lt;br /&gt;
int Ist_AD_Busy()&lt;br /&gt;
{&lt;br /&gt;
  if (ADC12CTL1 &amp;amp; ADC12BUSY)&lt;br /&gt;
  {&lt;br /&gt;
     printf(&amp;quot;\n\r... BUSY ...&amp;quot;); &lt;br /&gt;
     delay_ms(500);&lt;br /&gt;
     return(1);&lt;br /&gt;
  }&lt;br /&gt;
  return(0);&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ansteuerung eines LCD &amp;amp;#8211; Zeichendisplays // Controlling the LCD character==&lt;br /&gt;
&lt;br /&gt;
Der folgende Quelltext-Schnipsel ist für Siebensegmentanzeigen gedacht,&lt;br /&gt;
&#039;&#039;nicht&#039;&#039; für die mit dem HD44780-kompatiblen Controller.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
  // hier nun der vollständige Code 14 Jan 08&lt;br /&gt;
  // von mir seinerseits entwickelt, ich hoffe, er ist eine Hilfe&lt;br /&gt;
 &lt;br /&gt;
  // Aquasun Germany  Remscheid  Franz-Josef Günther&lt;br /&gt;
  // Development info@aqua-sun.net&lt;br /&gt;
&lt;br /&gt;
  // LCD.h Header für Allgemeines zum LCD ab 02.12.04 Aquasun GUE&lt;br /&gt;
  // C-Compiler ICC&lt;br /&gt;
&lt;br /&gt;
  // -------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
  // Beispiel :&lt;br /&gt;
&lt;br /&gt;
int Aepfel = 8;&lt;br /&gt;
&lt;br /&gt;
print_LCD(&amp;quot;\nRotkaepchen hat %d Aepfel im Korb&amp;quot;,Aepfel);&lt;br /&gt;
&lt;br /&gt;
  // -------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;_const.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdarg.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt; STRING.H&amp;gt;&lt;br /&gt;
#include &amp;lt; stdio.h &amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LCD_MAX          8&lt;br /&gt;
#define Mem_LCD         16&lt;br /&gt;
&lt;br /&gt;
#ifndef Mem_LCD&lt;br /&gt;
#define Mem_LCD 20&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
    Header für 8 x 7 Segmentanzeigen 2 MUX MSP430 x4xx&lt;br /&gt;
&lt;br /&gt;
    V3 = V1 (VDD) , V5 = 0 ,&lt;br /&gt;
&lt;br /&gt;
    für : LCD siehe TI Info dazu,&lt;br /&gt;
    für : LED&#039;s :&lt;br /&gt;
&lt;br /&gt;
    LED mit gemeinsamer Kathode, SP über Buffer 74HC245 (8x) o.ä.&lt;br /&gt;
    /G=L , DIR=H A ==&amp;gt; B an 5V , COM mit Emitterfolger PNP ViL=0,8V ViH=2V&lt;br /&gt;
&lt;br /&gt;
    LED mit gemeinsamer Anode, COM über PNP Transistor invertiert&lt;br /&gt;
    und SP über ULN2804(8x) getrieben&lt;br /&gt;
            _   ___   ___   ___&lt;br /&gt;
    COM0 :   |_|   |_|   |_|&lt;br /&gt;
            ____   ___   ___&lt;br /&gt;
    COM1 :      |_|   |_|   |_|&lt;br /&gt;
             __    __    __&lt;br /&gt;
    SPon :  |  |__|  |__|  |__| mit COM0&lt;br /&gt;
&lt;br /&gt;
    SPin :   0  1  2  3  4  5  6  7    8  9 10 11 12 13 14 15&lt;br /&gt;
    COM0 :  1a 1b 1c 1d 1e 1f 1g 1h   2a 2b 2c 2d 2e 2f 2g 2h&lt;br /&gt;
    COM1 :  5a 5b 5c 5d 5e 5f 5g 5h   6a 6b 6c 6d 6e 6f 6g 6h&lt;br /&gt;
&lt;br /&gt;
    SPin :  16 17 18 19 20 21 22 23   24 25 26 27 28 29 30 31&lt;br /&gt;
    COM0 :  3a 3b 3c 3d 3e 3f 3g 3h   4a 4b 4c 4d 4e 4f 4g 4h&lt;br /&gt;
    COM1 :  7a 7b 7c 7d 7e 7f 7g 7h   8a 8b 8c 8d 8e 8f 8g 8h&lt;br /&gt;
&lt;br /&gt;
    COM        3 2   1  0   3 2   1  0&lt;br /&gt;
    MAP 0A0    - -   8h 4h  - -   8g 4g&lt;br /&gt;
        09F    - -   8f 4f  - -   8e 4e&lt;br /&gt;
        09E    - -   8d 4d  - -   8c 4c&lt;br /&gt;
        09D    - -   8b 4b  - -   8a 4a&lt;br /&gt;
&lt;br /&gt;
        09C    - -   7h 3h  - -   7g 3g&lt;br /&gt;
        09B    - -   7f 3f  - -   7e 3e&lt;br /&gt;
        09A    - -   7d 3d  - -   7c 3c&lt;br /&gt;
        099    - -   7b 3b  - -   7a 3a&lt;br /&gt;
&lt;br /&gt;
        098    - -   6h 2h  - -   6g 2g&lt;br /&gt;
        097    - -   6f 2f  - -   6e 2e&lt;br /&gt;
        096    - -   6d 2d  - -   6c 2c&lt;br /&gt;
        095    - -   6b 2b  - -   6a 2a&lt;br /&gt;
&lt;br /&gt;
        094    - -   5h 1h  - -   5g 1g&lt;br /&gt;
        093    - -   5f 1f  - -   5e 1e&lt;br /&gt;
        092    - -   5d 1d  - -   5c 1c&lt;br /&gt;
        091    - -   5b 1b  - -   5a 1a&lt;br /&gt;
&lt;br /&gt;
             ---a----&lt;br /&gt;
            |        |&lt;br /&gt;
          f |        | b&lt;br /&gt;
            |        |&lt;br /&gt;
             ---g----&lt;br /&gt;
            |        |&lt;br /&gt;
          e |        | c&lt;br /&gt;
            |        |    _&lt;br /&gt;
              ---d---    | | h&lt;br /&gt;
                          -&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
#define a0      0x01  // Char durch rechtsschiften &amp;amp; 0x..&lt;br /&gt;
#define b0      0x10&lt;br /&gt;
#define c0      0x02&lt;br /&gt;
#define d0      0x20&lt;br /&gt;
#define e0      0x04&lt;br /&gt;
#define f0      0x40&lt;br /&gt;
#define g0      0x08&lt;br /&gt;
#define h0      0x80&lt;br /&gt;
&lt;br /&gt;
#define ch_0    ( e0+f0+a0+b0+c0+d0 )&lt;br /&gt;
#define ch_1    ( b0+c0 )&lt;br /&gt;
#define ch_2    ( a0+b0+g0+e0+d0 )&lt;br /&gt;
#define ch_3    ( a0+b0+g0+c0+d0 )&lt;br /&gt;
#define ch_4    ( f0+g0+b0+c0 )&lt;br /&gt;
#define ch_5    ( a0+f0+g0+c0+d0 )&lt;br /&gt;
#define ch_6    ( a0+f0+c0+d0+e0+g0 )&lt;br /&gt;
#define ch_7    ( a0+b0+c0 )&lt;br /&gt;
#define ch_8    ( a0+b0+c0+d0+e0+f0+g0 )&lt;br /&gt;
#define ch_9    ( a0+b0+c0+f0+g0 )&lt;br /&gt;
&lt;br /&gt;
#define ch_a    ( a0+b0+c0+d0+e0+g0 )&lt;br /&gt;
#define ch_A    ( e0+f0+a0+b0+c0+g0 )&lt;br /&gt;
#define ch_B    ( a0+b0+c0+d0+e0+f0+g0 )&lt;br /&gt;
#define ch_b    ( f0+e0+d0+c0+g0 )&lt;br /&gt;
#define ch_c    ( g0+e0+d0 )&lt;br /&gt;
#define ch_C    ( a0+f0+e0+d0 )&lt;br /&gt;
#define ch_d    ( b0+c0+d0+e0+g0 )&lt;br /&gt;
#define ch_D    ( e0+f0+a0+b0+c0+d0 )&lt;br /&gt;
#define ch_e    ( f0+e0+d0+a0+b0+g0 )&lt;br /&gt;
#define ch_E    ( a0+f0+g0+d0+e0 )&lt;br /&gt;
#define ch_F    ( a0+f0+g0+e0 )&lt;br /&gt;
#define ch_G    ( a0+f0+c0+d0+e0+g0 )&lt;br /&gt;
#define ch_g    ( a0+b0+c0+d0+f0+g0 )&lt;br /&gt;
#define ch_h    ( f0+c0+e0+g0 )&lt;br /&gt;
#define ch_H    ( f0+c0+e0+g0+b0 )&lt;br /&gt;
#define ch_I    ( f0+e0 )&lt;br /&gt;
#define ch_i    ( e0 )&lt;br /&gt;
#define ch_k    ( b0+e0+f0+g0 )&lt;br /&gt;
#define ch_L    ( f0+e0+d0 )&lt;br /&gt;
#define ch_l    ( b0+c0 )&lt;br /&gt;
#define ch_M    ( c0+b0+e0+f0 )&lt;br /&gt;
&lt;br /&gt;
#define ch_n    ( e0+g0+c0 )&lt;br /&gt;
#define ch_N    ( a0+b0+c0+e0+f0 )&lt;br /&gt;
#define ch_o    ( e0+g0+c0+d0 )&lt;br /&gt;
#define ch_O    ( e0+f0+a0+b0+c0+d0 )&lt;br /&gt;
#define ch_P    ( e0+f0+a0+b0+g0 )&lt;br /&gt;
#define ch_r    ( g0+e0 )&lt;br /&gt;
#define ch_S    ( a0+f0+g0+c0+d0 )&lt;br /&gt;
#define ch_T    ( a0+f0+e0 )&lt;br /&gt;
#define ch_U    ( f0+e0+d0+c0+b0 )&lt;br /&gt;
#define ch_u    ( e0+d0+c0 )&lt;br /&gt;
#define ch_X    ( b0+g0+e0 )&lt;br /&gt;
#define ch_Y    ( f0+g0+b0+c0+d0 )&lt;br /&gt;
#define ch_Z    ( a0+b0+g0+e0+d0 )&lt;br /&gt;
#define ch_Blank  0&lt;br /&gt;
#define Unter_  ( d0 )&lt;br /&gt;
#define DP_Pkt  ( h0 )&lt;br /&gt;
#define Minus   ( g0 )&lt;br /&gt;
#define Tilde   ( a0+g0+d0 )&lt;br /&gt;
#define GLEICH  ( g0+d0 )&lt;br /&gt;
#define FRAGE   ( a0+f0+g0+c0+d0+h0 )&lt;br /&gt;
&lt;br /&gt;
// #define Digi_X1ste         LCDM17       // die erste freie LCD_Mem_Stelle 18,19,20&lt;br /&gt;
                                           // in lcd_init() auf 0&lt;br /&gt;
&lt;br /&gt;
// extern unsigned int Digi_X;             // für LCD&lt;br /&gt;
&lt;br /&gt;
const char  letter[] = &amp;quot;0123456789 _.-~?=AaBbCcDdEeFGgHhIiKkLlMmNnOoPRrSsTtUuxXYyZz&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
const int hex_Wert[] = {&lt;br /&gt;
      ch_0,    ch_1, ch_2, ch_3, ch_4, ch_5, ch_6, ch_7, ch_8, ch_9,&lt;br /&gt;
      ch_Blank, Unter_, DP_Pkt, Minus, Tilde, FRAGE , GLEICH ,&lt;br /&gt;
      ch_A, ch_a, ch_B, ch_b, ch_C, ch_c, ch_D, ch_d, ch_E, ch_e, ch_F, ch_G, ch_g,&lt;br /&gt;
      ch_H, ch_h, ch_I, ch_i, ch_k, ch_k, ch_L, ch_l , ch_M, ch_M, ch_N, ch_n, ch_O, ch_o,&lt;br /&gt;
      ch_P, ch_r, ch_r, ch_S, ch_S, ch_T, ch_T, ch_U, ch_u, ch_X, ch_X,&lt;br /&gt;
      ch_Y, ch_Y, ch_Z , ch_Z  };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void All_LCD(void);&lt;br /&gt;
void Clear_LCD_M(void);                     // Clears LCD memory&lt;br /&gt;
void Clear_LCD(void);&lt;br /&gt;
void lcd_init(void); in ini&lt;br /&gt;
void Write_LCD_Hex(int Digit_n , int HEX_Zeichen);&lt;br /&gt;
void SetzeDP( int welches_Displ);&lt;br /&gt;
int putchar_LCD(char);&lt;br /&gt;
int print_LCD(CONST char *fmt, ...)  ;      // LCD 1-7 Digit nur realisiert sonst 1...11&lt;br /&gt;
extern int _print(void (*_put)(char), const char *fmt, va_list va);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void Clear_LCD_M(void)&lt;br /&gt;
{&lt;br /&gt;
    int i;&lt;br /&gt;
    for (i =0; i&amp;lt;Mem_LCD; i++) LCDMEM[i] = 0;   // Mem_LCD extern , abhängig vom Display&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void Clear_LCD(void)&lt;br /&gt;
{&lt;br /&gt;
      print_LCD(&amp;quot;\n_&amp;quot;);                     // beim Cursor wird DIGIT_X nicht weitergezählt&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void All_LCD(void)                          // alle = 8888..&lt;br /&gt;
{&lt;br /&gt;
    int i;&lt;br /&gt;
    for (i=0; i&amp;lt;Mem_LCD; i++) LCDMEM[i] = 0xFF;   // Mem_LCD extern , abhängig vom Display&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
int putchar_LCD(char c_in)&lt;br /&gt;
{&lt;br /&gt;
                                            //  Digi_X  == LCDM17&lt;br /&gt;
    int i, leng;&lt;br /&gt;
    char c = c_in;&lt;br /&gt;
    leng = strlen(letter);                  // Länge ohne /0 , 1..&lt;br /&gt;
&lt;br /&gt;
      if( (c==&#039;\n&#039;) || (c==&#039;\r&#039;))           // nichts gefunden =&amp;gt; CLR_Displ&lt;br /&gt;
        {&lt;br /&gt;
          Digi_X =1;  Clear_LCD_M(); return c;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    for(i=0;i&amp;lt;leng;i++) { if( c == letter[i] ) break; }        // Char gefunden&lt;br /&gt;
&lt;br /&gt;
    if(i == leng)&lt;br /&gt;
      {&lt;br /&gt;
        for(i=0;i&amp;lt;leng;i++) { if( &#039; &#039; == letter[i] ) break; }  // Char &#039; &#039; als Ersatz&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    if(i&amp;lt;leng)                              // es gibt &#039;.&#039; als Ersatz&lt;br /&gt;
      {&lt;br /&gt;
        Write_LCD_Hex((int)Digi_X , i);     // Digi beschreiben oder löschen&lt;br /&gt;
                                            // if(Digi_X) Write_LCD_Hex(Digi_X , i);&lt;br /&gt;
        if(C != &#039;_&#039;)Digi_X++;&lt;br /&gt;
        if(Digi_X &amp;gt; LCD_MAX) Digi_X =1;     // if(Digi_X &amp;gt;= Mem_LCD) Digi_X =1;&lt;br /&gt;
      }&lt;br /&gt;
    return c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
int print_LCD(CONST char *fmt, ...)&lt;br /&gt;
{&lt;br /&gt;
    va_list va;&lt;br /&gt;
    int val;&lt;br /&gt;
&lt;br /&gt;
    va_start(va, fmt);&lt;br /&gt;
    val = _print((void (*)(char))putchar_LCD, fmt, va);&lt;br /&gt;
    va_end(va);&lt;br /&gt;
&lt;br /&gt;
    return val;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
   // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void lcd_init(void)             // LCD init&lt;br /&gt;
{&lt;br /&gt;
 LCDCTL=0xAD;                   // LCDM567.2,LCDM567.0,LCDM234.1,LCDM234.0,LCDM0&lt;br /&gt;
 LCDM1 =0x00;                   // 0xAD = 101 01 101&lt;br /&gt;
 LCDM2 =0x00;                   // 101 = LCDP2 ,0, LCDP0 =&amp;gt; S0..S31&lt;br /&gt;
 LCDM3 =0x00;                   //  01 = LCDMX1,LCDMX0   =&amp;gt; 2-mux&lt;br /&gt;
 LCDM4 =0x00;                   // 101 = LCDSON,x,LCDON Segments ON ,x,LCD ON&lt;br /&gt;
 LCDM5 =0x00;&lt;br /&gt;
 LCDM6 =0x00; LCDM7 =0x00; LCDM8 =0x00; LCDM9 =0x00; LCDM10 =0x00;LCDM11 =0x00;&lt;br /&gt;
 LCDM12=0x00; LCDM13=0x00; LCDM14=0x00; LCDM15=0x00; LCDM16=0x00; LCDM17=0x00;&lt;br /&gt;
 LCDM18=0x00; LCDM19=0x00; LCDM20=0x00;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
   // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void Write_LCD_Hex(int Digit_n , int char_Nr)   // Digit1 bis 4 und 5 bis 8&lt;br /&gt;
{&lt;br /&gt;
  int i ,i_End , ch , Maske_loesch , Maske_setz ;&lt;br /&gt;
&lt;br /&gt;
  if((Digit_n == 0 ) || (Digit_n &amp;gt; LCD_MAX))&lt;br /&gt;
    {&lt;br /&gt;
        Clear_LCD_M(); i=0;&lt;br /&gt;
    }&lt;br /&gt;
   else i= (Digit_n - 1);                   // Startadresse = Digit_n x4 siehe unten&lt;br /&gt;
&lt;br /&gt;
  if(Digit_n &amp;lt; (LCD_MAX/2+1))               // Digit 1 ... 4 , i 0...3&lt;br /&gt;
    {&lt;br /&gt;
        Maske_setz   = 0x0011;&lt;br /&gt;
        Maske_loesch = 0x00FF - Maske_setz ;&lt;br /&gt;
        ch           = hex_Wert[char_Nr];&lt;br /&gt;
    } else                                  // Digit 5 ... 8&lt;br /&gt;
    {&lt;br /&gt;
        Maske_setz   = 0x0022;&lt;br /&gt;
        Maske_loesch = 0x00FF - Maske_setz ;&lt;br /&gt;
        ch           = hex_Wert[char_Nr] &amp;lt;&amp;lt; 1;&lt;br /&gt;
        i           -= (LCD_MAX/2) ;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  i &amp;lt;&amp;lt;= 2; i_End = i +4;                    // Berechnung der Start- und End -adresse&lt;br /&gt;
&lt;br /&gt;
  for(; i &amp;lt; i_End;i++)&lt;br /&gt;
    {&lt;br /&gt;
       LCDMEM[i] &amp;amp;= Maske_loesch;&lt;br /&gt;
       LCDMEM[i] |= ( ch &amp;amp; Maske_setz );&lt;br /&gt;
       ch &amp;gt;&amp;gt;=1;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
  // -----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
void SetzeDP( int welches_Displ)          // Displ 8 , 7 , 6 ...&lt;br /&gt;
{&lt;br /&gt;
  int i , i1;&lt;br /&gt;
    for (i=0,i1=1;i&amp;lt;8;i++,i1 &amp;lt;&amp;lt;=1)&lt;br /&gt;
      {&lt;br /&gt;
        if(welches_Displ &amp;amp; i1)&lt;br /&gt;
        switch(i)&lt;br /&gt;
         {&lt;br /&gt;
           case 0 : LCDM4  |= 0x10; break;&lt;br /&gt;
           case 1 : LCDM8  |= 0x10; break;&lt;br /&gt;
           case 2 : LCDM12 |= 0x10; break;&lt;br /&gt;
           case 3 : LCDM16 |= 0x10; break;&lt;br /&gt;
           case 4 : LCDM4  |= 0x20; break;&lt;br /&gt;
           case 5 : LCDM8  |= 0x20; break;&lt;br /&gt;
           case 6 : LCDM12 |= 0x20; break;&lt;br /&gt;
           case 7 : LCDM16 |= 0x20; break;&lt;br /&gt;
           default: break;&lt;br /&gt;
         }&lt;br /&gt;
      }  // for&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
  // ------------------  ENDE  ----------------------&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
[[Kategorie:MSP430]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=MSP430_Codebeispiele&amp;diff=61477</id>
		<title>MSP430 Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=MSP430_Codebeispiele&amp;diff=61477"/>
		<updated>2011-11-07T09:01:51Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Persistente Daten im Information Memory */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;MSP430 &amp;amp;#8211; Codebeispiele&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Einleitung:&#039;&#039;&#039;&lt;br /&gt;
Da der MSP430 eine sehr schöner Mikrocontroller für energiesparende Anwendungen ist, jedoch bei weitem nicht so verbreitet wie z.&amp;amp;nbsp;B. diverse 8051er, AVRs, PICs usw. ist, gibt es auch nicht all zu viele Codebeispiele aus Projekten für den/die Hobbybastler(in).&lt;br /&gt;
Aus diesem Grund werden hier Grundlagen der Initialisierung diverser Hardwarefeatures sowie grundlegende Softwareroutinen und dergleichen beschrieben, so dass für Anfänger auch ein einfaches Copy&amp;amp;Paste möglich ist.&lt;br /&gt;
Hierbei kommt der MSPGCC zum Einsatz, da eine professionelle unlimitierte Ausgabe des z.&amp;amp;nbsp;B. IAR für Bastler nahezu unbezahlbar ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Hardware =&lt;br /&gt;
&lt;br /&gt;
== Initializing/ Configuring UARTs ==&lt;br /&gt;
Von www.mathar.com stammt diese Routine zur initialisierung eines beliebigen UARTS. Zusätzlich müssen jedoch die Pins noch definiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void InitUSART(char USART0, char USART1, unsigned int baudrate1, unsigned int baudrate2, char IR0, char IR1)&lt;br /&gt;
{&lt;br /&gt;
  if (USART0) ME1 |= UTXE0 + URXE0;    // falls gesetzt, USART0 einschalten (TX- und RX-teil)&lt;br /&gt;
  if (USART1) ME2 |= UTXE1 + URXE1;    // falls gesetzt, USART1 einschalten (TX- und RX-teil)&lt;br /&gt;
  UCTL0 |= CHAR;                       // 8 data bits, 1 stop bit, no parity (8N1)&lt;br /&gt;
  UCTL1 |= CHAR;&lt;br /&gt;
  UTCTL0 |= SSEL1;                     // SMCLK als UCLK festlegen&lt;br /&gt;
  UTCTL1 |= SSEL1;&lt;br /&gt;
  if (baudrate1==19200)&lt;br /&gt;
  {&lt;br /&gt;
    UBR00 = 0xA0;                      // 19200 baud aus 8 MHz erzeugen&lt;br /&gt;
    UBR10 = 0x01;                      // siehe application note tabelle 1, seite 9&lt;br /&gt;
    UMCTL0 = 0x00;                     // keine korrektur der division noetig&lt;br /&gt;
  }&lt;br /&gt;
  if (baudrate2==19200)&lt;br /&gt;
  {&lt;br /&gt;
    UBR01 = 0xA0;                      // 19200 baud aus 8 MHz erzeugen&lt;br /&gt;
    UBR11 = 0x01;                      // siehe application note tabelle 1, seite 9&lt;br /&gt;
    UMCTL1 = 0x00;                     // keine korrektur der division noetig&lt;br /&gt;
  }&lt;br /&gt;
  if (USART0) UCTL0 &amp;amp;= ~SWRST;         // USART freigeben&lt;br /&gt;
  if (USART1) UCTL1 &amp;amp;= ~SWRST;&lt;br /&gt;
  if (IR0==0) IE1 |= URXIE0;           // IR0: 0 -&amp;gt; nur RX-interrupt anschalten&lt;br /&gt;
  if (IR0==1) IE1 |= UTXIE0;           //      1 -&amp;gt; nur TX-interrupt anschalten&lt;br /&gt;
  if (IR0==2) IE1 |= URXIE0 + UTXIE0;  //      2 -&amp;gt; TX- und RX-interrupt anschalten&lt;br /&gt;
  if (IR1==1||IR1==2) IFG1 &amp;amp;= ~UTXIFG0;  // initales interrupt-flag loeschen&lt;br /&gt;
  if (IR1==0) IE2 |= URXIE1;           // IR1: 0 -&amp;gt; nur RX-interrupt anschalten&lt;br /&gt;
  if (IR1==1) IE2 |= UTXIE1;           //      1 -&amp;gt; nur TX-interrupt anschalten&lt;br /&gt;
  if (IR1==2) IE2 |= URXIE1 + UTXIE1;  //      2 -&amp;gt; TX- und RX-interrupt anschalten&lt;br /&gt;
  if (IR1==1||IR1==2) IFG1 &amp;amp;= ~UTXIFG1;  // initales interrupt-flag loeschen&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialization/configuration of USART (SPI and I2C/TWI) ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_spi(void)&lt;br /&gt;
{&lt;br /&gt;
  ME1 |= USPIE0;                        // Enable USART0 SPI mode&lt;br /&gt;
  UTCTL0 = CKPH+SSEL1+SSEL0+STC;        // SMCLK, 3-pin mode&lt;br /&gt;
  UCTL0 = CHAR+SYNC+MM;                 // 8-bit SPI Master **SWRST**&lt;br /&gt;
  UBR00 = 0x02;                         // UCLK/2 &lt;br /&gt;
  UBR10 = 0x00;                         // 0&lt;br /&gt;
  UMCTL0 = 0x00;                        // no modulation&lt;br /&gt;
  P3SEL |= 0x0E;                        // P3.1-3 SPI option select&lt;br /&gt;
  P3DIR |= 0x01;                        // P3.0 output direction&lt;br /&gt;
  _EINT();                              // Enable interrupts&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void init_i2c(unsigned char slave)&lt;br /&gt;
{&lt;br /&gt;
  P3SEL |= 0x0a;                            // Assign I2C pins to module&lt;br /&gt;
  U0CTL |= I2C + SYNC;                      // Switch USART0 to I2C mode&lt;br /&gt;
  U0CTL &amp;amp;= ~I2CEN;                          // Recommended I2C init procedure&lt;br /&gt;
  I2CTCTL = I2CSSEL_2;                      // SMCLK&lt;br /&gt;
  I2CSCLH = 0x03;                           // High period of SCL&lt;br /&gt;
  I2CSCLL = 0x03;                           // Low period of SCL&lt;br /&gt;
  I2CNDAT = 0x01;                           // Transmit one byte&lt;br /&gt;
  I2CSA = slave;                             // Slave address&lt;br /&gt;
  U0CTL |= I2CEN;                           // Enable I2C, 7 bit addr,&lt;br /&gt;
  I2CIE = RXRDYIE;                          // I2C receive ready interrupt enable&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung der Quarze ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_XT2(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned int i;&lt;br /&gt;
  WDTCTL = WDTPW + WDTHOLD;             // Stop WDT&lt;br /&gt;
  BCSCTL1 &amp;amp;= ~XT2OFF;                   // XT2 = HF XTAL&lt;br /&gt;
  do &lt;br /&gt;
  {&lt;br /&gt;
    IFG1 &amp;amp;= ~OFIFG;                       // Clear OSCFault flag&lt;br /&gt;
    for (i = 0xFF; i &amp;gt; 0; i--);           // Time for flag to set&lt;br /&gt;
  }&lt;br /&gt;
  while ((IFG1 &amp;amp; OFIFG) != 0);          // OSCFault flag still set?                &lt;br /&gt;
  BCSCTL2 |= SELM1;                     // MCLK = XT2 (safe)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_XT(void) // high frequenz resonators ( 455 kHz - 8MhZ )&lt;br /&gt;
{&lt;br /&gt;
  unsigned int i;&lt;br /&gt;
  WDTCTL = WDTPW + WDTHOLD;             // Stop WDT&lt;br /&gt;
  BCSCTL1 |= XTS;                       // ACLK = LFXT1 = HF XTAL&lt;br /&gt;
  do &lt;br /&gt;
  {&lt;br /&gt;
    IFG1 &amp;amp;= ~OFIFG;                       // Clear OSCFault flag&lt;br /&gt;
    for (i = 0xFF; i &amp;gt; 0; i--);           // Time for flag to set&lt;br /&gt;
  }&lt;br /&gt;
  while ((IFG1 &amp;amp; OFIFG) == OFIFG);      // OSCFault flag still set?                &lt;br /&gt;
  BCSCTL2 |= SELM1+SELM0;               // MCLK = LFXT1 (safe)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Bei den neueren MSP430F55xx nicht vergessen, dass bei CPU-Taktfrequenzen über 8 MHz vorher die Kernspannung erhöht werden muss, sonst drohen Abstürze oder „rätselhaftes“ Verhalten. Eins der TI-Beispiele (12 MHz) „vergisst“ das sogar.&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des ADCs ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_ADC(void)&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0 = ADC12ON;	// ADC12ON / reference on Avcc&lt;br /&gt;
  P6SEL |= 0x01;        // P6.0 ADC option select &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
unsigned int sampling_ADC(void)&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0 |= ADC12SC + ENC;   // Sampling open&lt;br /&gt;
  ADC12CTL0 &amp;amp;= ~ADC12SC;        // Sampling closed, start conversion&lt;br /&gt;
  while ((ADC12CTL1 &amp;amp; ADC12BUSY) == 1);   // ADC12BUSY?&lt;br /&gt;
  return(ADC12MEM0);	// return the value read from ADC P6.0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des DACs ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void init_DAC(void)&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0 = REF2_5V + REFON;              // Internal 2.5V ref on&lt;br /&gt;
  DAC12_0CTL = DAC12IR + DAC12AMP_5 + DAC12ENC;   // Internal ref gain &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void write_DAC(unsigned int val)&lt;br /&gt;
{&lt;br /&gt;
  DAC12_0DAT = val;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des Timers A ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_TimerA(unsigned int cycles )&lt;br /&gt;
{&lt;br /&gt;
  TACTL = TASSEL1 + TACLR;              // SMCLK, clear TAR&lt;br /&gt;
  CCTL0 = CCIE;                         // CCR0 interrupt enabled&lt;br /&gt;
  CCR0 = cycles;&lt;br /&gt;
  TACTL |= MC_2;                         // Start Timer_A in continuous mode&lt;br /&gt;
  _EINT();                              // interrupt enable&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Timer A0 interrupt service routine&lt;br /&gt;
interrupt (TIMERA0_VECTOR) Timer_A(void)&lt;br /&gt;
{&lt;br /&gt;
  P1OUT ^= 0x01;                        // Toggle P1.0&lt;br /&gt;
  CCR0 += 50000;                        // Add Offset to CCR0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des Timers B ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_TimerB(unsigned int cycles)&lt;br /&gt;
{&lt;br /&gt;
  TBCTL = TBSSEL1 + TBCLR;              // SMCLK, clear TAR&lt;br /&gt;
  TBCCTL0 = CCIE;                       // CCR0 interrupt enabled&lt;br /&gt;
  TBCCR0 = cycles;&lt;br /&gt;
  TBCTL |= MC_2;                         // Start Timer_B in continuous mode&lt;br /&gt;
  _EINT();                              // interrupt enable&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Timer B0 interrupt service routine&lt;br /&gt;
interrupt (TIMERB0_VECTOR) Timer_B(void)&lt;br /&gt;
{&lt;br /&gt;
  P1OUT ^= 0x01;                        // Toggle P1.0&lt;br /&gt;
  TBCCR0 += 50000;                      // Add Offset to CCR0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des Watchdogs ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_wdt(void)&lt;br /&gt;
{&lt;br /&gt;
  WDTCTL = WDT_MDLY_32;                 // Set Watchdog Timer interval to ~30ms&lt;br /&gt;
  IE1 |= WDTIE;                         // Enable WDT interrupt&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Watchdog Timer interrupt service routine&lt;br /&gt;
interrupt (WDT_VECTOR) watchdog_timer(void)&lt;br /&gt;
{&lt;br /&gt;
  // do this, in an case of an interrupt&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  WDTCTL = WDTPW + WDTHOLD;	// Watchdog anhalten&lt;br /&gt;
  P1DIR |= 0x01;		// P1.0 als Ausgang&lt;br /&gt;
&lt;br /&gt;
  for (;;)&lt;br /&gt;
  {&lt;br /&gt;
    volatile unsigned i;	// volatile, sonst wird die Warteschleife „wegoptimiert“&lt;br /&gt;
    P1OUT ^= 0x01;		// P1.0 umschalten mit Exklusiv-ODER&lt;br /&gt;
&lt;br /&gt;
    i = 10000;			// Warteschleife in Software&lt;br /&gt;
    do; while (--i);		// (CPU-Leistung „verheizen“)&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung der GPIO ==&lt;br /&gt;
Die Ein/Ausgabeleitungen haben beim MSP430, je nach Ausbaustufe, folgende Fähigkeiten:&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Einzeln (bitweise) programmierbare Ein/Ausgabe (&amp;lt;b&amp;gt;PxDIR&amp;lt;/b&amp;gt;, &amp;lt;b&amp;gt;PxOUT&amp;lt;/b&amp;gt;)&lt;br /&gt;
&amp;lt;li&amp;gt;Unabhängige Lese-Adresse (&amp;lt;b&amp;gt;PxIN&amp;lt;/b&amp;gt;)&lt;br /&gt;
&amp;lt;li&amp;gt;Ansprechbar als 8-Bit-Ports oder je paarweise als 16-bit-Port, bspw. P1 + P2 = PA usw.&lt;br /&gt;
&amp;lt;li&amp;gt;Interrupt auf Pegelwechsel einzelner Portpins (nur P1 und P2) (&amp;lt;b&amp;gt;PxIES&amp;lt;/b&amp;gt;)&lt;br /&gt;
&amp;lt;li&amp;gt;Pull-Up, Pull-Down oder kein Widerstand auswählbar (&amp;lt;b&amp;gt;PxREN&amp;lt;/b&amp;gt;, PxOUT)&lt;br /&gt;
&amp;lt;li&amp;gt;Einstellbare Treiberstärke (reduziert und voll) (&amp;lt;b&amp;gt;PxDS&amp;lt;/b&amp;gt;)&lt;br /&gt;
&amp;lt;li&amp;gt;Ein bis zwei Peripheriefunktionen pro Pin (&amp;lt;b&amp;gt;PxSEL&amp;lt;/b&amp;gt;), auswählbar mittels PxDIR (d.h. bei zwei Peripheriefunktionen ist eine Ausgang und die andere Eingang)&lt;br /&gt;
&amp;lt;li&amp;gt;Das JTAG-Port (4 Pins) und das USB-Port (2 Pins) ist standardmäßig ein E/A-Port (MSP430F55xx)&lt;br /&gt;
&amp;lt;li&amp;gt;Erweiterte Peripheriezuordnung bei P4 (MSP430F55xx) mittels Port Mapping Controller&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Nicht 5-V-verträglich!!&amp;lt;/b&amp;gt; Keinem Portpin darf ohne genügend großen Vorwiderstand 5 V angeboten werden. Ableitströme dürfen nicht zum Ansteigen der Speisespannung führen!&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Manche Portpins haben ein gemeinsames PxSEL, etwa:&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;das JTAG-Port (entweder alle 4 oder kein Pin zugeordnet)&lt;br /&gt;
&amp;lt;li&amp;gt;das USB-Port (entweder Portpin oder USB D+ und D–)&lt;br /&gt;
&amp;lt;li&amp;gt;die Quarz-Anschlüsse (das niederwertige PxSEL schaltet beide Portpins)&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle Portpins sind beim Einschalten (PUC) wie folgt initialisiert:&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Eingang ohne Pull-Up oder Pull-Down&lt;br /&gt;
&amp;lt;li&amp;gt;Reduzierte Treiberstärke&lt;br /&gt;
&amp;lt;li&amp;gt;Kein Pegelwechsel-Interrupt&lt;br /&gt;
&amp;lt;li&amp;gt;Keine Peripherie-Zuordnung&lt;br /&gt;
&amp;lt;li&amp;gt;Der Inhalt des Ausgaberegisters &amp;lt;b&amp;gt;PxOUT&amp;lt;/b&amp;gt; ist undefiniert!&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Alle ungenutzten Anschlüsse sollten per PullDown (&amp;lt;b&amp;gt;PxREN&amp;lt;/b&amp;gt; und &amp;lt;b&amp;gt;PxOUT&amp;lt;/b&amp;gt;) festgelegt werden.&lt;br /&gt;
&lt;br /&gt;
Kein MSP430 hat einen herausgeführten Busanschluss, etwa um mehr RAM anzubinden.&lt;br /&gt;
&lt;br /&gt;
== Initialisierung von PWM ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_PWM_TimerA(void)&lt;br /&gt;
{&lt;br /&gt;
  TACTL = TASSEL1 + TACLR;              // SMCLK, Clear Tar&lt;br /&gt;
  CCR0 = 512-1;                         // PWM Period&lt;br /&gt;
  CCTL1 = OUTMOD_7;                     // CCR1 reset/set&lt;br /&gt;
  P1DIR |= 0x04;                        // P1.2 PWM output&lt;br /&gt;
  P1SEL |= 0x04;                        // P1.2 and TA1/2 otions&lt;br /&gt;
  TACTL |= MC0;                         // Start Timer_A in up mode&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void set_PWM_duty_cycle(unsigned char duty)&lt;br /&gt;
{&lt;br /&gt;
  CCR1 = duty;                           // CCR1 PWM duty cycle &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Persistente Daten im Information Memory ==&lt;br /&gt;
Kodebeispiel für &#039;&#039;&#039;mspgcc&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// Eine INFOMEM-Struktur und deren Vorbelegung&lt;br /&gt;
struct PERSISTENT {&lt;br /&gt;
 int a,b;		// Man achte sinnfälligerweise auf korrekte Ausrichtung, um späteren Portierungsproblemen vorzubeugen!&lt;br /&gt;
 long c,d;		// mspgcc legt die Daten in little-endian ab&lt;br /&gt;
 char e,f;		// hier beispielhaft 14 Bytes insgesamt&lt;br /&gt;
}epersistent __attribute__((section(&amp;quot;.infomem&amp;quot;)))={&lt;br /&gt;
 1,2, 3,4, 5,6};&lt;br /&gt;
&lt;br /&gt;
// RAM-Kopie derselben Struktur (für gehäuften Schreibzugriff)&lt;br /&gt;
struct PERSISTENT persistent;&lt;br /&gt;
&lt;br /&gt;
// Initialisierungskode&lt;br /&gt;
 FCTL2 = 0xA549;		// Flash-Takt festlegen, bspw. MCLK = 4,6 MHz, ÷ 10 = 460 kHz&lt;br /&gt;
 persistent=epersistent;	// svw. memcpy&lt;br /&gt;
&lt;br /&gt;
// Rückschreib-Kode (im Flash, ohne &amp;lt;mspgcc/flash.h&amp;gt;, gelegentlich aufrufen):&lt;br /&gt;
// Das Flash-Schreiben blockiert den Prozessor!&lt;br /&gt;
 if (memcmp(epersistent,persistent,sizeof(epersistent))) {&lt;br /&gt;
  FCTL3 = 0xA500;		// LOCK entfernen&lt;br /&gt;
  FCTL1 = 0xA502;		// ERASE setzen&lt;br /&gt;
  epersistent.a = 0xFFFF;	// Segment löschen (≈ 10 ms)&lt;br /&gt;
  FCTL1 = 0xA540;		// SCHREIBEN setzen&lt;br /&gt;
  epersistent=persistent;	// svw. memcpy, byteweise in Flash schreiben (≈ 1 ms)&lt;br /&gt;
  FCTL1 = 0xA500;		// SCHREIBEN sperren&lt;br /&gt;
  FCTL3 = 0xA510;		// LOCK setzen&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
// Mit &amp;lt;mspgcc/flash.h&amp;gt;:&lt;br /&gt;
#include &amp;lt;mspgcc/flash.h&amp;gt;&lt;br /&gt;
 if (memcmp(epersistent,persistent,sizeof(epersistent))) {&lt;br /&gt;
  flash_lock_segmentA(0);&lt;br /&gt;
  flash_erase_segment(&amp;amp;epersistent);	// Segment löschen (≈ 10 ms)&lt;br /&gt;
  flash_write(epersistent,persistent,sizeof(epersistent)); //schreiben (≈ 1 ms)&lt;br /&gt;
  flash_lock_segmentA(1);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Ganz so komfortabel wie der EEPROM-Bereich der AVR-Controller ist der MSP430 Information Memory nicht, da dieser nur als Ganzes gelöscht werden kann und alle Lösch- und Schreiboperationen den Prozessor blockieren, es sei denn, der Schreibkode liegt im RAM.&lt;br /&gt;
&lt;br /&gt;
Weil das Speichern von ein paar Konfigurationsdaten eher nebenbei zum normalen Programmablauf erfolgen wird, lohnt sich die Mühe zumeist nicht, den Schreib-Kode in den RAM auszulagern. Der Flash-Zugriff erleichtert sich dadurch erheblich, und wie man im Beispiel „ohne &amp;lt;mspgcc/flash.h&amp;gt;“ sieht, ist auch nicht viel zu tun. Ein einfaches &#039;&#039;&#039;memcpy&#039;&#039;&#039; oder jeder andere Schreibzugriff genügt zum Beschreiben.&lt;br /&gt;
&lt;br /&gt;
Ist nicht CPU-blockierender Schreibzugriff erwünscht, können IMHO keine Interrupts währenddessen verwendet werden. &#039;&#039;Sämtlicher&#039;&#039; aktiver Kode muss sich im RAM befinden, etwa, um eine serielle Schnittstelle abzufragen.&lt;br /&gt;
&lt;br /&gt;
Einige MSP430-Derivate enthalten in ihrem Information Memory ein paar Konfigurationsdaten, die man retten und wiederherstellen sollte, oder man benutzt einen anderen Speicherblock! (Wie?)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= Interrupts: =&lt;br /&gt;
&lt;br /&gt;
== UARTs ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// z. B. ein Echo mit dem MSPGCC-Compiler:&lt;br /&gt;
interrupt (UART0RX_VECTOR) usart0_rx(void)&lt;br /&gt;
{&lt;br /&gt;
   TXBUF0=RXBUF0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// z. B. ein Echo mit dem ImageCraft ICC430-Compiler:&lt;br /&gt;
#pragma interrupt_handler usart0_rx:UART0RX_VECTOR&lt;br /&gt;
void usart0_rx(void)&lt;br /&gt;
{&lt;br /&gt;
   TXBUF0=RXBUF0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Die Funktionen selbst können natürlich auch anders genannt werden.&lt;br /&gt;
&lt;br /&gt;
== Timer ==&lt;br /&gt;
&lt;br /&gt;
== IOs ==&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= Softwareroutinen: =&lt;br /&gt;
&lt;br /&gt;
== I2C/TWI in Software ==&lt;br /&gt;
Diese Routinen wurden ursprünglich für einen MSP430F149 geschrieben. Es werden ausschließlich IOs benutzt. Da Code in C geschrieben wurde sollte er sich einfach auf alle MSP430s ohne (aber auch mit I²C) portieren lassen. Der ist zwar nicht ganz schön, aber er funktioniert soweit ganz gut. Auch ein Beispiel ist dabei.&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/attachment.php/324877/soft-i2c.zip&lt;br /&gt;
&lt;br /&gt;
== PWM ==&lt;br /&gt;
&lt;br /&gt;
Untenstehender Code ist nur mit msp320-gcc getestet.&lt;br /&gt;
&lt;br /&gt;
Folgende Routine initialisiert den Timer als Up-Counter mit der Clock-Quelle SMCLK und einem Teiler von 8. Zudem wird der Interrupt aktiviert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void timerA_init(void)&lt;br /&gt;
{&lt;br /&gt;
	TACTL =  TASSEL_SMCLK | TACLR | ID_DIV8 | TAIE;&lt;br /&gt;
	TACTL |= MC_UPTO_CCR0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um den Timer zu starten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void timerA_start(int timing[2], int mode)&lt;br /&gt;
{&lt;br /&gt;
	TACCTL0 = mode;&lt;br /&gt;
	TACCTL0 |= CCIE ;                // enable interrupt&lt;br /&gt;
	TACCTL1 = mode;&lt;br /&gt;
	TACCR0 = timing[0];&lt;br /&gt;
	TACCR1 = timing[1];&lt;br /&gt;
	TAR = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktion wird normalerweise mit &#039;mode&#039; 3 aufgerufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
timerA_start(timing, OUTMOD_SET_RESET);&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
timing[0] enthaelt die komplette Zyklendauer einer PWM-Phase (H und L)&lt;br /&gt;
Beispiel: Um eine Pulsfrequenz von 125 Hz bei einem SMCLK von 1.0 MHz zu erhalten, gilt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;timing_0 = 1.0e6 / 8 / 125 = 1000&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
timing[1] schliesslich enthält die Zyklendauer des H-Pulses und ist immer kleiner als timing[0]. Bei einem &#039;duty cycle&#039; (Tastverhältnis) 50% gilt also&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;timing_1 = 500&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zu beachten ist, dass der Timerkanal 0 bei manchen Modi (wie dem obenstehenden) für die PWM nicht genutzt wird, &amp;quot;TACCTL0 = mode&amp;quot; keinen speziellen Effekt zeigt (siehe auch Manual).&lt;br /&gt;
&lt;br /&gt;
Deswegen wird das PWM-Signal auch an TA1 abgegriffen, nicht an TA0.&lt;br /&gt;
&lt;br /&gt;
Schlussendlich muss der entsprechende Ausgangspin für TA1 konfiguriert werden. Beim F2013 z.&amp;amp;nbsp;B. geschieht dies für P1.2 per&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	P1SEL |= 0x04;  // Enable primary peripheral&lt;br /&gt;
	P1DIR |= 0x04;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was war nun mit dem Interrupt? Falls wir z.&amp;amp;nbsp;B. die Zyklen zählen wollen, definieren wir einen Interrupt-Handler:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;signal.h&amp;gt; // &#039;interrupt&#039; makro&lt;br /&gt;
interrupt (TIMERA0_VECTOR) timera0_isr(void)&lt;br /&gt;
{&lt;br /&gt;
	g_count++;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Schlussendlich müssen wir noch die Interrupts im Initialisierungscode aktivieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
_EINT();&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Senden eines Bytes ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void SendUSART0c(char c)             // ein einzelnes zeichen über die serielle schnittstelle (USART0) senden&lt;br /&gt;
                                     // FJG: Obacht: x12xx : IFG1 =&amp;gt; IFG2 !&lt;br /&gt;
{&lt;br /&gt;
  while (!(IFG1 &amp;amp; UTXIFG0));           // warten, bis USART0 TX-buffer sendebereit&lt;br /&gt;
  TXBUF0 = c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SendUSART1c(char c)             // ein einzelnes zeichen über die serielle schnittstelle (USART1) senden&lt;br /&gt;
{&lt;br /&gt;
  while (!(IFG2 &amp;amp; UTXIFG1));           // warten, bis USART1 TX-buffer sendebereit&lt;br /&gt;
  TXBUF1 = c;&lt;br /&gt;
}     &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Senden eines Strings ==&lt;br /&gt;
Nullterminierte Strings; zugehörige Interrupts dürfen nicht aktiviert sein&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void SendUSART0(const char* str)	// einen String über die serielle Schnittstelle (USART0) senden&lt;br /&gt;
{&lt;br /&gt;
  while (*str != 0)&lt;br /&gt;
  {&lt;br /&gt;
    while (!(IFG1 &amp;amp; UTXIFG0));		// warten bis USART0 TX-Puffer frei (leer)&lt;br /&gt;
    TXBUF0 = *str++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SendUSART1(const char* str)	// einen String über die serielle Schnittstelle (USART1) senden&lt;br /&gt;
{&lt;br /&gt;
  while (*str)&lt;br /&gt;
  {&lt;br /&gt;
    while (!(IFG2 &amp;amp; UTXIFG1));		// warten bis USART1 TX-Puffer frei (leer)&lt;br /&gt;
    TXBUF1 = *str++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Binärdaten mittels DMA (hier: DMA-Kanal 0 an UART1)&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void send(const void*buf, unsigned len) {&lt;br /&gt;
// könnte globaler Initialisierungskode sein:&lt;br /&gt;
 DMACTL0 = 0x000A;		// DMA-Kanal 0 dem UART1-TxD zuordnen&lt;br /&gt;
// genauer: DMACTL0 = DMACTL0 &amp;amp; 0xFFF0 | 0x000A;&lt;br /&gt;
 DMA0DA  = (unsigned)&amp;amp;U1TXBUF;	// Zieladresse ist der Sendepuffer&lt;br /&gt;
// hier aufrufspezifischer Kode:&lt;br /&gt;
 DMA0SA  = (unsigned)buf;	// Quelladresse sind die Sendedaten&lt;br /&gt;
 DMA0SZ  = len;			// Anzahl der Byte-Transfers&lt;br /&gt;
 DMA0CTL = 0x03F0;		// Start des Single-DMA-Transfers, byte-weise mit steigender Quelladresse&lt;br /&gt;
// Abwarten aufs Ende, könnte man vorteilhaft asynchron erledigen.&lt;br /&gt;
// In so einem Fall muss der Aufrufer &amp;lt;buf&amp;gt; beibehalten bis der DMA-Transfer beendet ist&lt;br /&gt;
 while (!(DMA0CTL&amp;amp;DMAIFG));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Beachte: Die Interruptfreigabe des UART priorisiert Interruptverarbeitung über DMA! Das kann man auch gezielt ausnutzen, um mal Interrupt- und mal DMA-Betrieb zu realisieren.&lt;br /&gt;
&lt;br /&gt;
Anmerkung: Der MSP430, insbesondere die F1xxx-Serie, hat für einen sonst AVR-verwöhnten Anwender vergleichsweise &#039;&#039;&#039;starke&#039;&#039;&#039; Peripherie und eine &#039;&#039;&#039;schwache&#039;&#039;&#039; CPU. Deshalb ist die Benutzung von DMA und eines günstigen Binärdatenübertragungsprotokolls essentiell für Hochgeschwindigkeitsanwendungen, bei denen man beim AVR noch gut mit Interrupts zurecht kam.&lt;br /&gt;
&lt;br /&gt;
== Empfangen eines Bytes (interruptgesteuert)  // Receiving a byte-&amp;gt; Interrupt controlled ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/*Hab diese Interrupt Funktion für meine I²C Kommunikation verwendet&lt;br /&gt;
Startcondition wird erkannt, aber nicht Stop, da man die Flanken(die den&lt;br /&gt;
interrupt auslösen) umkehren müsste, aber dann keine Startkondition erkannt werden kann.&lt;br /&gt;
&lt;br /&gt;
Hab mir jetzt nicht die mühe gemacht alles rauszupicken was ihr nicht braucht.&lt;br /&gt;
Wer sich auskennt, kann das auch selber machen.&lt;br /&gt;
&lt;br /&gt;
Das Busy wird fürs stretching verwendet(CLK wird auf low gezogen)&lt;br /&gt;
*/  &lt;br /&gt;
&lt;br /&gt;
#pragma vector = PORT1_VECTOR           // Port 1 - Interrupt-Funktions-&amp;quot;Alias&amp;quot;&lt;br /&gt;
__interrupt void Interrupt_Port1()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
//  I2CTransfer = 0;&lt;br /&gt;
&lt;br /&gt;
    TACTL |= TACLR;&lt;br /&gt;
    TACTL |= TAIE;&lt;br /&gt;
#ifdef WD&lt;br /&gt;
    WDTCTL = WDTPW + WDTCNTCL;&lt;br /&gt;
#endif&lt;br /&gt;
    &lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
  if ((P1IFG &amp;amp; 0x04) &amp;amp;&amp;amp; !(I2CCLK)) { //if startdataimpuls but clk low is detected --return--&lt;br /&gt;
    P1IFG &amp;amp;= ~0x0C;&lt;br /&gt;
    return;}&lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
//    P1IE &amp;amp;= ~0x0C;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
  if ((P1IFG &amp;amp; 0x04) &amp;amp;&amp;amp; I2CCLK)   //Start Condition       (I2CStart)&lt;br /&gt;
    {&lt;br /&gt;
      P1IFG &amp;amp;= ~0x0C;&lt;br /&gt;
      &lt;br /&gt;
//    I2CTransfer = 1;&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
        P1IE &amp;amp;= ~0x0C;&lt;br /&gt;
//        TACTL |= TACLR;&lt;br /&gt;
//        TACTL |= TAIE;&lt;br /&gt;
//        _EINT();&lt;br /&gt;
&lt;br /&gt;
      &lt;br /&gt;
/*#ifdef Debug&lt;br /&gt;
      P2OUT |= 0x04;&lt;br /&gt;
      P2DIR |= 0x04; &lt;br /&gt;
#endif*/&lt;br /&gt;
      &lt;br /&gt;
//      Wait(10);&lt;br /&gt;
//      while(I2CCLK)  {CheckTimer;}&lt;br /&gt;
&lt;br /&gt;
//      set_Busy;&lt;br /&gt;
  &lt;br /&gt;
      BitCnt = 0x01;&lt;br /&gt;
      ByteCnt = 0;&lt;br /&gt;
//      I2CByte = 0;&lt;br /&gt;
      StartCondition = 1;&lt;br /&gt;
//      CRCByte = 0x00;&lt;br /&gt;
      GetData = 0;&lt;br /&gt;
      I2CTransfer = 0;&lt;br /&gt;
    &lt;br /&gt;
//    clr_Busy;&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
        _DINT();&lt;br /&gt;
        P1IE |= 0x0C;&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
  P1IFG &amp;amp;= ~0x0C;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
    TACTL |= TACLR;&lt;br /&gt;
    _EINT();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
  if (I2CCLK)&lt;br /&gt;
  {&lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
      TACTL |= TAIE;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    I2CByte &amp;lt;&amp;lt;= 1; &lt;br /&gt;
    if (I2CDAT){&lt;br /&gt;
      I2CByte += 0x01;&lt;br /&gt;
     }&lt;br /&gt;
    I2CTransfer = 1;&lt;br /&gt;
    while(I2CCLK) {CheckTimer;}&lt;br /&gt;
    set_Busy;&lt;br /&gt;
    BitCnt &amp;lt;&amp;lt;= 1;&lt;br /&gt;
  &lt;br /&gt;
    if(!(BitCnt == 0x00))&lt;br /&gt;
    {&lt;br /&gt;
      clr_Busy;  &lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      _NOP();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
  }&lt;br /&gt;
//----------------------------------------------------------------------------  &lt;br /&gt;
&lt;br /&gt;
P1DIR &amp;amp;= ~0x0C;&lt;br /&gt;
P1IFG = 0x00;&lt;br /&gt;
P1IE |= 0x0C;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ermitteln der Temperatur ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// von FJG info@aqua-sun.net :&lt;br /&gt;
// ---------------   Temperatur des Chips   ---------------------&lt;br /&gt;
&lt;br /&gt;
#define T_Faktor_a1000       ((long)103)     // REF 1,5V&lt;br /&gt;
#define T_Faktor_b1000       ((long)172)     // REF 2,5V&lt;br /&gt;
#define T_Faktor_c1000       ((long)278000)&lt;br /&gt;
&lt;br /&gt;
int Hole_Temp(void)	// Temperatur ch 10&lt;br /&gt;
{			// Temp = N* 0,17193 -278  1000Temp = N*172 -278000 bei 2,5V&lt;br /&gt;
  long Temp_L;&lt;br /&gt;
  int  Temp , Delta ;&lt;br /&gt;
&lt;br /&gt;
  Start_AD();&lt;br /&gt;
&lt;br /&gt;
  Temp_L = ((long)ADC12MEM10 * T_Faktor_a1000) - T_Faktor_c1000 ;&lt;br /&gt;
  Temp   = (int)( Temp_L / 1000);&lt;br /&gt;
&lt;br /&gt;
  Delta = Read_EEPROM( EPROM_INTERN_BL1_R_ADR,DELTA_TEMP_ADR );	   // falls Temp Messung&lt;br /&gt;
  if( Delta &amp;lt;= 120 &amp;amp;&amp;amp; Delta &amp;gt;= 80 ) Delta -= 100 ; else Delta = 0; // ungenau war&lt;br /&gt;
                                                                   // siehe dazu TI&lt;br /&gt;
  return (Temp + Delta);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// INIT AD&lt;br /&gt;
// AD muss angestoßen werden mit :   Start_AD()&lt;br /&gt;
&lt;br /&gt;
// #define ADC12TL0WERT15	(SHT1_8 + SHT0_3 + MSC + REFON + ADC12ON)&lt;br /&gt;
#define ADC12TL0WERT15		(SHT1_3 + SHT0_3 + MSC + REFON + ADC12ON)&lt;br /&gt;
#define ADC12TL0WERT25		(SHT1_3 + SHT0_3 + MSC + +REF2_5V + REFON + ADC12ON)&lt;br /&gt;
&lt;br /&gt;
//                        Start CH0 , ADC12SCBIT , SampleT , F/2 , MCLK , Sequenze of CH&lt;br /&gt;
#define ADC12CTL1WERT   ( CSTARTADD_0 + SHS_0 + SHP + ADC12DIV_1 + ADC12SSEL_2 + CONSEQ_1 )&lt;br /&gt;
&lt;br /&gt;
void adc12_init()	// ADC12CTL0 modifizieren nur mit ENC = 0&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0   = 0x00;&lt;br /&gt;
  ADC12CTL1   = ADC12CTL1WERT ;&lt;br /&gt;
&lt;br /&gt;
  ADC12MCTL0  = INCH_0;                  &lt;br /&gt;
  ADC12MCTL1  = INCH_1;                  &lt;br /&gt;
  ADC12MCTL2  = INCH_2;&lt;br /&gt;
  ADC12MCTL3  = INCH_3;&lt;br /&gt;
  ADC12MCTL4  = INCH_4;&lt;br /&gt;
  ADC12MCTL5  = INCH_5;&lt;br /&gt;
  ADC12MCTL6  = INCH_6;&lt;br /&gt;
  ADC12MCTL7  = INCH_7;                  &lt;br /&gt;
  ADC12MCTL8  = INCH_8;		// VeREF+&lt;br /&gt;
  ADC12MCTL9  = INCH_9;		// VeREF-&lt;br /&gt;
&lt;br /&gt;
  ADC12MCTL10 = INCH_10 + SREF_1 ;&lt;br /&gt;
  ADC12MCTL11 = INCH_11 + SREF_1 +EOS;&lt;br /&gt;
&lt;br /&gt;
  ADC12IE     = 0x00;&lt;br /&gt;
  ADC12CTL0   = ADC12TL0WERT15 ;&lt;br /&gt;
  ADC12CTL0  |= 0x0003;		// ENC + ADC12SC = Enable Conversation + StartConversation&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------   Diverses AD_Wandler   --------------------&lt;br /&gt;
&lt;br /&gt;
void Start_AD(void)&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0 &amp;amp;= ~ENC;&lt;br /&gt;
  ADC12CTL0 |= (ADC12SC+ENC);&lt;br /&gt;
  NOP();&lt;br /&gt;
  NOP();&lt;br /&gt;
  ADC12CTL0 &amp;amp;=~ADC12SC;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#ifndef TEST_AD&lt;br /&gt;
#define Ist_AD_Busy()        ( ADC12CTL1 &amp;amp; ADC12BUSY )&lt;br /&gt;
#else&lt;br /&gt;
int Ist_AD_Busy()&lt;br /&gt;
{&lt;br /&gt;
  if (ADC12CTL1 &amp;amp; ADC12BUSY)&lt;br /&gt;
  {&lt;br /&gt;
     printf(&amp;quot;\n\r... BUSY ...&amp;quot;); &lt;br /&gt;
     delay_ms(500);&lt;br /&gt;
     return(1);&lt;br /&gt;
  }&lt;br /&gt;
  return(0);&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ansteuerung eines LCD &amp;amp;#8211; Zeichendisplays // Controlling the LCD character==&lt;br /&gt;
&lt;br /&gt;
Der folgende Quelltext-Schnipsel ist für Siebensegmentanzeigen gedacht,&lt;br /&gt;
&#039;&#039;nicht&#039;&#039; für die mit dem HD44780-kompatiblen Controller.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
  // hier nun der vollständige Code 14 Jan 08&lt;br /&gt;
  // von mir seinerseits entwickelt, ich hoffe, er ist eine Hilfe&lt;br /&gt;
 &lt;br /&gt;
  // Aquasun Germany  Remscheid  Franz-Josef Günther&lt;br /&gt;
  // Development info@aqua-sun.net&lt;br /&gt;
&lt;br /&gt;
  // LCD.h Header für Allgemeines zum LCD ab 02.12.04 Aquasun GUE&lt;br /&gt;
  // C-Compiler ICC&lt;br /&gt;
&lt;br /&gt;
  // -------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
  // Beispiel :&lt;br /&gt;
&lt;br /&gt;
int Aepfel = 8;&lt;br /&gt;
&lt;br /&gt;
print_LCD(&amp;quot;\nRotkaepchen hat %d Aepfel im Korb&amp;quot;,Aepfel);&lt;br /&gt;
&lt;br /&gt;
  // -------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;_const.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdarg.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt; STRING.H&amp;gt;&lt;br /&gt;
#include &amp;lt; stdio.h &amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LCD_MAX          8&lt;br /&gt;
#define Mem_LCD         16&lt;br /&gt;
&lt;br /&gt;
#ifndef Mem_LCD&lt;br /&gt;
#define Mem_LCD 20&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
    Header für 8 x 7 Segmentanzeigen 2 MUX MSP430 x4xx&lt;br /&gt;
&lt;br /&gt;
    V3 = V1 (VDD) , V5 = 0 ,&lt;br /&gt;
&lt;br /&gt;
    für : LCD siehe TI Info dazu,&lt;br /&gt;
    für : LED&#039;s :&lt;br /&gt;
&lt;br /&gt;
    LED mit gemeinsamer Kathode, SP über Buffer 74HC245 (8x) o.ä.&lt;br /&gt;
    /G=L , DIR=H A ==&amp;gt; B an 5V , COM mit Emitterfolger PNP ViL=0,8V ViH=2V&lt;br /&gt;
&lt;br /&gt;
    LED mit gemeinsamer Anode, COM über PNP Transistor invertiert&lt;br /&gt;
    und SP über ULN2804(8x) getrieben&lt;br /&gt;
            _   ___   ___   ___&lt;br /&gt;
    COM0 :   |_|   |_|   |_|&lt;br /&gt;
            ____   ___   ___&lt;br /&gt;
    COM1 :      |_|   |_|   |_|&lt;br /&gt;
             __    __    __&lt;br /&gt;
    SPon :  |  |__|  |__|  |__| mit COM0&lt;br /&gt;
&lt;br /&gt;
    SPin :   0  1  2  3  4  5  6  7    8  9 10 11 12 13 14 15&lt;br /&gt;
    COM0 :  1a 1b 1c 1d 1e 1f 1g 1h   2a 2b 2c 2d 2e 2f 2g 2h&lt;br /&gt;
    COM1 :  5a 5b 5c 5d 5e 5f 5g 5h   6a 6b 6c 6d 6e 6f 6g 6h&lt;br /&gt;
&lt;br /&gt;
    SPin :  16 17 18 19 20 21 22 23   24 25 26 27 28 29 30 31&lt;br /&gt;
    COM0 :  3a 3b 3c 3d 3e 3f 3g 3h   4a 4b 4c 4d 4e 4f 4g 4h&lt;br /&gt;
    COM1 :  7a 7b 7c 7d 7e 7f 7g 7h   8a 8b 8c 8d 8e 8f 8g 8h&lt;br /&gt;
&lt;br /&gt;
    COM        3 2   1  0   3 2   1  0&lt;br /&gt;
    MAP 0A0    - -   8h 4h  - -   8g 4g&lt;br /&gt;
        09F    - -   8f 4f  - -   8e 4e&lt;br /&gt;
        09E    - -   8d 4d  - -   8c 4c&lt;br /&gt;
        09D    - -   8b 4b  - -   8a 4a&lt;br /&gt;
&lt;br /&gt;
        09C    - -   7h 3h  - -   7g 3g&lt;br /&gt;
        09B    - -   7f 3f  - -   7e 3e&lt;br /&gt;
        09A    - -   7d 3d  - -   7c 3c&lt;br /&gt;
        099    - -   7b 3b  - -   7a 3a&lt;br /&gt;
&lt;br /&gt;
        098    - -   6h 2h  - -   6g 2g&lt;br /&gt;
        097    - -   6f 2f  - -   6e 2e&lt;br /&gt;
        096    - -   6d 2d  - -   6c 2c&lt;br /&gt;
        095    - -   6b 2b  - -   6a 2a&lt;br /&gt;
&lt;br /&gt;
        094    - -   5h 1h  - -   5g 1g&lt;br /&gt;
        093    - -   5f 1f  - -   5e 1e&lt;br /&gt;
        092    - -   5d 1d  - -   5c 1c&lt;br /&gt;
        091    - -   5b 1b  - -   5a 1a&lt;br /&gt;
&lt;br /&gt;
             ---a----&lt;br /&gt;
            |        |&lt;br /&gt;
          f |        | b&lt;br /&gt;
            |        |&lt;br /&gt;
             ---g----&lt;br /&gt;
            |        |&lt;br /&gt;
          e |        | c&lt;br /&gt;
            |        |    _&lt;br /&gt;
              ---d---    | | h&lt;br /&gt;
                          -&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
#define a0      0x01  // Char durch rechtsschiften &amp;amp; 0x..&lt;br /&gt;
#define b0      0x10&lt;br /&gt;
#define c0      0x02&lt;br /&gt;
#define d0      0x20&lt;br /&gt;
#define e0      0x04&lt;br /&gt;
#define f0      0x40&lt;br /&gt;
#define g0      0x08&lt;br /&gt;
#define h0      0x80&lt;br /&gt;
&lt;br /&gt;
#define ch_0    ( e0+f0+a0+b0+c0+d0 )&lt;br /&gt;
#define ch_1    ( b0+c0 )&lt;br /&gt;
#define ch_2    ( a0+b0+g0+e0+d0 )&lt;br /&gt;
#define ch_3    ( a0+b0+g0+c0+d0 )&lt;br /&gt;
#define ch_4    ( f0+g0+b0+c0 )&lt;br /&gt;
#define ch_5    ( a0+f0+g0+c0+d0 )&lt;br /&gt;
#define ch_6    ( a0+f0+c0+d0+e0+g0 )&lt;br /&gt;
#define ch_7    ( a0+b0+c0 )&lt;br /&gt;
#define ch_8    ( a0+b0+c0+d0+e0+f0+g0 )&lt;br /&gt;
#define ch_9    ( a0+b0+c0+f0+g0 )&lt;br /&gt;
&lt;br /&gt;
#define ch_a    ( a0+b0+c0+d0+e0+g0 )&lt;br /&gt;
#define ch_A    ( e0+f0+a0+b0+c0+g0 )&lt;br /&gt;
#define ch_B    ( a0+b0+c0+d0+e0+f0+g0 )&lt;br /&gt;
#define ch_b    ( f0+e0+d0+c0+g0 )&lt;br /&gt;
#define ch_c    ( g0+e0+d0 )&lt;br /&gt;
#define ch_C    ( a0+f0+e0+d0 )&lt;br /&gt;
#define ch_d    ( b0+c0+d0+e0+g0 )&lt;br /&gt;
#define ch_D    ( e0+f0+a0+b0+c0+d0 )&lt;br /&gt;
#define ch_e    ( f0+e0+d0+a0+b0+g0 )&lt;br /&gt;
#define ch_E    ( a0+f0+g0+d0+e0 )&lt;br /&gt;
#define ch_F    ( a0+f0+g0+e0 )&lt;br /&gt;
#define ch_G    ( a0+f0+c0+d0+e0+g0 )&lt;br /&gt;
#define ch_g    ( a0+b0+c0+d0+f0+g0 )&lt;br /&gt;
#define ch_h    ( f0+c0+e0+g0 )&lt;br /&gt;
#define ch_H    ( f0+c0+e0+g0+b0 )&lt;br /&gt;
#define ch_I    ( f0+e0 )&lt;br /&gt;
#define ch_i    ( e0 )&lt;br /&gt;
#define ch_k    ( b0+e0+f0+g0 )&lt;br /&gt;
#define ch_L    ( f0+e0+d0 )&lt;br /&gt;
#define ch_l    ( b0+c0 )&lt;br /&gt;
#define ch_M    ( c0+b0+e0+f0 )&lt;br /&gt;
&lt;br /&gt;
#define ch_n    ( e0+g0+c0 )&lt;br /&gt;
#define ch_N    ( a0+b0+c0+e0+f0 )&lt;br /&gt;
#define ch_o    ( e0+g0+c0+d0 )&lt;br /&gt;
#define ch_O    ( e0+f0+a0+b0+c0+d0 )&lt;br /&gt;
#define ch_P    ( e0+f0+a0+b0+g0 )&lt;br /&gt;
#define ch_r    ( g0+e0 )&lt;br /&gt;
#define ch_S    ( a0+f0+g0+c0+d0 )&lt;br /&gt;
#define ch_T    ( a0+f0+e0 )&lt;br /&gt;
#define ch_U    ( f0+e0+d0+c0+b0 )&lt;br /&gt;
#define ch_u    ( e0+d0+c0 )&lt;br /&gt;
#define ch_X    ( b0+g0+e0 )&lt;br /&gt;
#define ch_Y    ( f0+g0+b0+c0+d0 )&lt;br /&gt;
#define ch_Z    ( a0+b0+g0+e0+d0 )&lt;br /&gt;
#define ch_Blank  0&lt;br /&gt;
#define Unter_  ( d0 )&lt;br /&gt;
#define DP_Pkt  ( h0 )&lt;br /&gt;
#define Minus   ( g0 )&lt;br /&gt;
#define Tilde   ( a0+g0+d0 )&lt;br /&gt;
#define GLEICH  ( g0+d0 )&lt;br /&gt;
#define FRAGE   ( a0+f0+g0+c0+d0+h0 )&lt;br /&gt;
&lt;br /&gt;
// #define Digi_X1ste         LCDM17       // die erste freie LCD_Mem_Stelle 18,19,20&lt;br /&gt;
                                           // in lcd_init() auf 0&lt;br /&gt;
&lt;br /&gt;
// extern unsigned int Digi_X;             // für LCD&lt;br /&gt;
&lt;br /&gt;
const char  letter[] = &amp;quot;0123456789 _.-~?=AaBbCcDdEeFGgHhIiKkLlMmNnOoPRrSsTtUuxXYyZz&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
const int hex_Wert[] = {&lt;br /&gt;
      ch_0,    ch_1, ch_2, ch_3, ch_4, ch_5, ch_6, ch_7, ch_8, ch_9,&lt;br /&gt;
      ch_Blank, Unter_, DP_Pkt, Minus, Tilde, FRAGE , GLEICH ,&lt;br /&gt;
      ch_A, ch_a, ch_B, ch_b, ch_C, ch_c, ch_D, ch_d, ch_E, ch_e, ch_F, ch_G, ch_g,&lt;br /&gt;
      ch_H, ch_h, ch_I, ch_i, ch_k, ch_k, ch_L, ch_l , ch_M, ch_M, ch_N, ch_n, ch_O, ch_o,&lt;br /&gt;
      ch_P, ch_r, ch_r, ch_S, ch_S, ch_T, ch_T, ch_U, ch_u, ch_X, ch_X,&lt;br /&gt;
      ch_Y, ch_Y, ch_Z , ch_Z  };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void All_LCD(void);&lt;br /&gt;
void Clear_LCD_M(void);                     // Clears LCD memory&lt;br /&gt;
void Clear_LCD(void);&lt;br /&gt;
void lcd_init(void); in ini&lt;br /&gt;
void Write_LCD_Hex(int Digit_n , int HEX_Zeichen);&lt;br /&gt;
void SetzeDP( int welches_Displ);&lt;br /&gt;
int putchar_LCD(char);&lt;br /&gt;
int print_LCD(CONST char *fmt, ...)  ;      // LCD 1-7 Digit nur realisiert sonst 1...11&lt;br /&gt;
extern int _print(void (*_put)(char), const char *fmt, va_list va);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void Clear_LCD_M(void)&lt;br /&gt;
{&lt;br /&gt;
    int i;&lt;br /&gt;
    for (i =0; i&amp;lt;Mem_LCD; i++) LCDMEM[i] = 0;   // Mem_LCD extern , abhängig vom Display&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void Clear_LCD(void)&lt;br /&gt;
{&lt;br /&gt;
      print_LCD(&amp;quot;\n_&amp;quot;);                     // beim Cursor wird DIGIT_X nicht weitergezählt&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void All_LCD(void)                          // alle = 8888..&lt;br /&gt;
{&lt;br /&gt;
    int i;&lt;br /&gt;
    for (i=0; i&amp;lt;Mem_LCD; i++) LCDMEM[i] = 0xFF;   // Mem_LCD extern , abhängig vom Display&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
int putchar_LCD(char c_in)&lt;br /&gt;
{&lt;br /&gt;
                                            //  Digi_X  == LCDM17&lt;br /&gt;
    int i, leng;&lt;br /&gt;
    char c = c_in;&lt;br /&gt;
    leng = strlen(letter);                  // Länge ohne /0 , 1..&lt;br /&gt;
&lt;br /&gt;
      if( (c==&#039;\n&#039;) || (c==&#039;\r&#039;))           // nichts gefunden =&amp;gt; CLR_Displ&lt;br /&gt;
        {&lt;br /&gt;
          Digi_X =1;  Clear_LCD_M(); return c;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    for(i=0;i&amp;lt;leng;i++) { if( c == letter[i] ) break; }        // Char gefunden&lt;br /&gt;
&lt;br /&gt;
    if(i == leng)&lt;br /&gt;
      {&lt;br /&gt;
        for(i=0;i&amp;lt;leng;i++) { if( &#039; &#039; == letter[i] ) break; }  // Char &#039; &#039; als Ersatz&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    if(i&amp;lt;leng)                              // es gibt &#039;.&#039; als Ersatz&lt;br /&gt;
      {&lt;br /&gt;
        Write_LCD_Hex((int)Digi_X , i);     // Digi beschreiben oder löschen&lt;br /&gt;
                                            // if(Digi_X) Write_LCD_Hex(Digi_X , i);&lt;br /&gt;
        if(C != &#039;_&#039;)Digi_X++;&lt;br /&gt;
        if(Digi_X &amp;gt; LCD_MAX) Digi_X =1;     // if(Digi_X &amp;gt;= Mem_LCD) Digi_X =1;&lt;br /&gt;
      }&lt;br /&gt;
    return c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
int print_LCD(CONST char *fmt, ...)&lt;br /&gt;
{&lt;br /&gt;
    va_list va;&lt;br /&gt;
    int val;&lt;br /&gt;
&lt;br /&gt;
    va_start(va, fmt);&lt;br /&gt;
    val = _print((void (*)(char))putchar_LCD, fmt, va);&lt;br /&gt;
    va_end(va);&lt;br /&gt;
&lt;br /&gt;
    return val;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
   // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void lcd_init(void)             // LCD init&lt;br /&gt;
{&lt;br /&gt;
 LCDCTL=0xAD;                   // LCDM567.2,LCDM567.0,LCDM234.1,LCDM234.0,LCDM0&lt;br /&gt;
 LCDM1 =0x00;                   // 0xAD = 101 01 101&lt;br /&gt;
 LCDM2 =0x00;                   // 101 = LCDP2 ,0, LCDP0 =&amp;gt; S0..S31&lt;br /&gt;
 LCDM3 =0x00;                   //  01 = LCDMX1,LCDMX0   =&amp;gt; 2-mux&lt;br /&gt;
 LCDM4 =0x00;                   // 101 = LCDSON,x,LCDON Segments ON ,x,LCD ON&lt;br /&gt;
 LCDM5 =0x00;&lt;br /&gt;
 LCDM6 =0x00; LCDM7 =0x00; LCDM8 =0x00; LCDM9 =0x00; LCDM10 =0x00;LCDM11 =0x00;&lt;br /&gt;
 LCDM12=0x00; LCDM13=0x00; LCDM14=0x00; LCDM15=0x00; LCDM16=0x00; LCDM17=0x00;&lt;br /&gt;
 LCDM18=0x00; LCDM19=0x00; LCDM20=0x00;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
   // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void Write_LCD_Hex(int Digit_n , int char_Nr)   // Digit1 bis 4 und 5 bis 8&lt;br /&gt;
{&lt;br /&gt;
  int i ,i_End , ch , Maske_loesch , Maske_setz ;&lt;br /&gt;
&lt;br /&gt;
  if((Digit_n == 0 ) || (Digit_n &amp;gt; LCD_MAX))&lt;br /&gt;
    {&lt;br /&gt;
        Clear_LCD_M(); i=0;&lt;br /&gt;
    }&lt;br /&gt;
   else i= (Digit_n - 1);                   // Startadresse = Digit_n x4 siehe unten&lt;br /&gt;
&lt;br /&gt;
  if(Digit_n &amp;lt; (LCD_MAX/2+1))               // Digit 1 ... 4 , i 0...3&lt;br /&gt;
    {&lt;br /&gt;
        Maske_setz   = 0x0011;&lt;br /&gt;
        Maske_loesch = 0x00FF - Maske_setz ;&lt;br /&gt;
        ch           = hex_Wert[char_Nr];&lt;br /&gt;
    } else                                  // Digit 5 ... 8&lt;br /&gt;
    {&lt;br /&gt;
        Maske_setz   = 0x0022;&lt;br /&gt;
        Maske_loesch = 0x00FF - Maske_setz ;&lt;br /&gt;
        ch           = hex_Wert[char_Nr] &amp;lt;&amp;lt; 1;&lt;br /&gt;
        i           -= (LCD_MAX/2) ;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  i &amp;lt;&amp;lt;= 2; i_End = i +4;                    // Berechnung der Start- und End -adresse&lt;br /&gt;
&lt;br /&gt;
  for(; i &amp;lt; i_End;i++)&lt;br /&gt;
    {&lt;br /&gt;
       LCDMEM[i] &amp;amp;= Maske_loesch;&lt;br /&gt;
       LCDMEM[i] |= ( ch &amp;amp; Maske_setz );&lt;br /&gt;
       ch &amp;gt;&amp;gt;=1;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
  // -----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
void SetzeDP( int welches_Displ)          // Displ 8 , 7 , 6 ...&lt;br /&gt;
{&lt;br /&gt;
  int i , i1;&lt;br /&gt;
    for (i=0,i1=1;i&amp;lt;8;i++,i1 &amp;lt;&amp;lt;=1)&lt;br /&gt;
      {&lt;br /&gt;
        if(welches_Displ &amp;amp; i1)&lt;br /&gt;
        switch(i)&lt;br /&gt;
         {&lt;br /&gt;
           case 0 : LCDM4  |= 0x10; break;&lt;br /&gt;
           case 1 : LCDM8  |= 0x10; break;&lt;br /&gt;
           case 2 : LCDM12 |= 0x10; break;&lt;br /&gt;
           case 3 : LCDM16 |= 0x10; break;&lt;br /&gt;
           case 4 : LCDM4  |= 0x20; break;&lt;br /&gt;
           case 5 : LCDM8  |= 0x20; break;&lt;br /&gt;
           case 6 : LCDM12 |= 0x20; break;&lt;br /&gt;
           case 7 : LCDM16 |= 0x20; break;&lt;br /&gt;
           default: break;&lt;br /&gt;
         }&lt;br /&gt;
      }  // for&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
  // ------------------  ENDE  ----------------------&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
[[Kategorie:MSP430]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=MSP430_Codebeispiele&amp;diff=61475</id>
		<title>MSP430 Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=MSP430_Codebeispiele&amp;diff=61475"/>
		<updated>2011-11-07T08:53:58Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;MSP430 &amp;amp;#8211; Codebeispiele&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Einleitung:&#039;&#039;&#039;&lt;br /&gt;
Da der MSP430 eine sehr schöner Mikrocontroller für energiesparende Anwendungen ist, jedoch bei weitem nicht so verbreitet wie z.&amp;amp;nbsp;B. diverse 8051er, AVRs, PICs usw. ist, gibt es auch nicht all zu viele Codebeispiele aus Projekten für den/die Hobbybastler(in).&lt;br /&gt;
Aus diesem Grund werden hier Grundlagen der Initialisierung diverser Hardwarefeatures sowie grundlegende Softwareroutinen und dergleichen beschrieben, so dass für Anfänger auch ein einfaches Copy&amp;amp;Paste möglich ist.&lt;br /&gt;
Hierbei kommt der MSPGCC zum Einsatz, da eine professionelle unlimitierte Ausgabe des z.&amp;amp;nbsp;B. IAR für Bastler nahezu unbezahlbar ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Hardware =&lt;br /&gt;
&lt;br /&gt;
== Initializing/ Configuring UARTs ==&lt;br /&gt;
Von www.mathar.com stammt diese Routine zur initialisierung eines beliebigen UARTS. Zusätzlich müssen jedoch die Pins noch definiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void InitUSART(char USART0, char USART1, unsigned int baudrate1, unsigned int baudrate2, char IR0, char IR1)&lt;br /&gt;
{&lt;br /&gt;
  if (USART0) ME1 |= UTXE0 + URXE0;    // falls gesetzt, USART0 einschalten (TX- und RX-teil)&lt;br /&gt;
  if (USART1) ME2 |= UTXE1 + URXE1;    // falls gesetzt, USART1 einschalten (TX- und RX-teil)&lt;br /&gt;
  UCTL0 |= CHAR;                       // 8 data bits, 1 stop bit, no parity (8N1)&lt;br /&gt;
  UCTL1 |= CHAR;&lt;br /&gt;
  UTCTL0 |= SSEL1;                     // SMCLK als UCLK festlegen&lt;br /&gt;
  UTCTL1 |= SSEL1;&lt;br /&gt;
  if (baudrate1==19200)&lt;br /&gt;
  {&lt;br /&gt;
    UBR00 = 0xA0;                      // 19200 baud aus 8 MHz erzeugen&lt;br /&gt;
    UBR10 = 0x01;                      // siehe application note tabelle 1, seite 9&lt;br /&gt;
    UMCTL0 = 0x00;                     // keine korrektur der division noetig&lt;br /&gt;
  }&lt;br /&gt;
  if (baudrate2==19200)&lt;br /&gt;
  {&lt;br /&gt;
    UBR01 = 0xA0;                      // 19200 baud aus 8 MHz erzeugen&lt;br /&gt;
    UBR11 = 0x01;                      // siehe application note tabelle 1, seite 9&lt;br /&gt;
    UMCTL1 = 0x00;                     // keine korrektur der division noetig&lt;br /&gt;
  }&lt;br /&gt;
  if (USART0) UCTL0 &amp;amp;= ~SWRST;         // USART freigeben&lt;br /&gt;
  if (USART1) UCTL1 &amp;amp;= ~SWRST;&lt;br /&gt;
  if (IR0==0) IE1 |= URXIE0;           // IR0: 0 -&amp;gt; nur RX-interrupt anschalten&lt;br /&gt;
  if (IR0==1) IE1 |= UTXIE0;           //      1 -&amp;gt; nur TX-interrupt anschalten&lt;br /&gt;
  if (IR0==2) IE1 |= URXIE0 + UTXIE0;  //      2 -&amp;gt; TX- und RX-interrupt anschalten&lt;br /&gt;
  if (IR1==1||IR1==2) IFG1 &amp;amp;= ~UTXIFG0;  // initales interrupt-flag loeschen&lt;br /&gt;
  if (IR1==0) IE2 |= URXIE1;           // IR1: 0 -&amp;gt; nur RX-interrupt anschalten&lt;br /&gt;
  if (IR1==1) IE2 |= UTXIE1;           //      1 -&amp;gt; nur TX-interrupt anschalten&lt;br /&gt;
  if (IR1==2) IE2 |= URXIE1 + UTXIE1;  //      2 -&amp;gt; TX- und RX-interrupt anschalten&lt;br /&gt;
  if (IR1==1||IR1==2) IFG1 &amp;amp;= ~UTXIFG1;  // initales interrupt-flag loeschen&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialization/configuration of USART (SPI and I2C/TWI) ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_spi(void)&lt;br /&gt;
{&lt;br /&gt;
  ME1 |= USPIE0;                        // Enable USART0 SPI mode&lt;br /&gt;
  UTCTL0 = CKPH+SSEL1+SSEL0+STC;        // SMCLK, 3-pin mode&lt;br /&gt;
  UCTL0 = CHAR+SYNC+MM;                 // 8-bit SPI Master **SWRST**&lt;br /&gt;
  UBR00 = 0x02;                         // UCLK/2 &lt;br /&gt;
  UBR10 = 0x00;                         // 0&lt;br /&gt;
  UMCTL0 = 0x00;                        // no modulation&lt;br /&gt;
  P3SEL |= 0x0E;                        // P3.1-3 SPI option select&lt;br /&gt;
  P3DIR |= 0x01;                        // P3.0 output direction&lt;br /&gt;
  _EINT();                              // Enable interrupts&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void init_i2c(unsigned char slave)&lt;br /&gt;
{&lt;br /&gt;
  P3SEL |= 0x0a;                            // Assign I2C pins to module&lt;br /&gt;
  U0CTL |= I2C + SYNC;                      // Switch USART0 to I2C mode&lt;br /&gt;
  U0CTL &amp;amp;= ~I2CEN;                          // Recommended I2C init procedure&lt;br /&gt;
  I2CTCTL = I2CSSEL_2;                      // SMCLK&lt;br /&gt;
  I2CSCLH = 0x03;                           // High period of SCL&lt;br /&gt;
  I2CSCLL = 0x03;                           // Low period of SCL&lt;br /&gt;
  I2CNDAT = 0x01;                           // Transmit one byte&lt;br /&gt;
  I2CSA = slave;                             // Slave address&lt;br /&gt;
  U0CTL |= I2CEN;                           // Enable I2C, 7 bit addr,&lt;br /&gt;
  I2CIE = RXRDYIE;                          // I2C receive ready interrupt enable&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung der Quarze ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_XT2(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned int i;&lt;br /&gt;
  WDTCTL = WDTPW + WDTHOLD;             // Stop WDT&lt;br /&gt;
  BCSCTL1 &amp;amp;= ~XT2OFF;                   // XT2 = HF XTAL&lt;br /&gt;
  do &lt;br /&gt;
  {&lt;br /&gt;
    IFG1 &amp;amp;= ~OFIFG;                       // Clear OSCFault flag&lt;br /&gt;
    for (i = 0xFF; i &amp;gt; 0; i--);           // Time for flag to set&lt;br /&gt;
  }&lt;br /&gt;
  while ((IFG1 &amp;amp; OFIFG) != 0);          // OSCFault flag still set?                &lt;br /&gt;
  BCSCTL2 |= SELM1;                     // MCLK = XT2 (safe)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_XT(void) // high frequenz resonators ( 455 kHz - 8MhZ )&lt;br /&gt;
{&lt;br /&gt;
  unsigned int i;&lt;br /&gt;
  WDTCTL = WDTPW + WDTHOLD;             // Stop WDT&lt;br /&gt;
  BCSCTL1 |= XTS;                       // ACLK = LFXT1 = HF XTAL&lt;br /&gt;
  do &lt;br /&gt;
  {&lt;br /&gt;
    IFG1 &amp;amp;= ~OFIFG;                       // Clear OSCFault flag&lt;br /&gt;
    for (i = 0xFF; i &amp;gt; 0; i--);           // Time for flag to set&lt;br /&gt;
  }&lt;br /&gt;
  while ((IFG1 &amp;amp; OFIFG) == OFIFG);      // OSCFault flag still set?                &lt;br /&gt;
  BCSCTL2 |= SELM1+SELM0;               // MCLK = LFXT1 (safe)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Bei den neueren MSP430F55xx nicht vergessen, dass bei CPU-Taktfrequenzen über 8 MHz vorher die Kernspannung erhöht werden muss, sonst drohen Abstürze oder „rätselhaftes“ Verhalten. Eins der TI-Beispiele (12 MHz) „vergisst“ das sogar.&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des ADCs ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_ADC(void)&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0 = ADC12ON;	// ADC12ON / reference on Avcc&lt;br /&gt;
  P6SEL |= 0x01;        // P6.0 ADC option select &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
unsigned int sampling_ADC(void)&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0 |= ADC12SC + ENC;   // Sampling open&lt;br /&gt;
  ADC12CTL0 &amp;amp;= ~ADC12SC;        // Sampling closed, start conversion&lt;br /&gt;
  while ((ADC12CTL1 &amp;amp; ADC12BUSY) == 1);   // ADC12BUSY?&lt;br /&gt;
  return(ADC12MEM0);	// return the value read from ADC P6.0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des DACs ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void init_DAC(void)&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0 = REF2_5V + REFON;              // Internal 2.5V ref on&lt;br /&gt;
  DAC12_0CTL = DAC12IR + DAC12AMP_5 + DAC12ENC;   // Internal ref gain &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void write_DAC(unsigned int val)&lt;br /&gt;
{&lt;br /&gt;
  DAC12_0DAT = val;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des Timers A ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_TimerA(unsigned int cycles )&lt;br /&gt;
{&lt;br /&gt;
  TACTL = TASSEL1 + TACLR;              // SMCLK, clear TAR&lt;br /&gt;
  CCTL0 = CCIE;                         // CCR0 interrupt enabled&lt;br /&gt;
  CCR0 = cycles;&lt;br /&gt;
  TACTL |= MC_2;                         // Start Timer_A in continuous mode&lt;br /&gt;
  _EINT();                              // interrupt enable&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Timer A0 interrupt service routine&lt;br /&gt;
interrupt (TIMERA0_VECTOR) Timer_A(void)&lt;br /&gt;
{&lt;br /&gt;
  P1OUT ^= 0x01;                        // Toggle P1.0&lt;br /&gt;
  CCR0 += 50000;                        // Add Offset to CCR0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des Timers B ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_TimerB(unsigned int cycles)&lt;br /&gt;
{&lt;br /&gt;
  TBCTL = TBSSEL1 + TBCLR;              // SMCLK, clear TAR&lt;br /&gt;
  TBCCTL0 = CCIE;                       // CCR0 interrupt enabled&lt;br /&gt;
  TBCCR0 = cycles;&lt;br /&gt;
  TBCTL |= MC_2;                         // Start Timer_B in continuous mode&lt;br /&gt;
  _EINT();                              // interrupt enable&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Timer B0 interrupt service routine&lt;br /&gt;
interrupt (TIMERB0_VECTOR) Timer_B(void)&lt;br /&gt;
{&lt;br /&gt;
  P1OUT ^= 0x01;                        // Toggle P1.0&lt;br /&gt;
  TBCCR0 += 50000;                      // Add Offset to CCR0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des Watchdogs ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_wdt(void)&lt;br /&gt;
{&lt;br /&gt;
  WDTCTL = WDT_MDLY_32;                 // Set Watchdog Timer interval to ~30ms&lt;br /&gt;
  IE1 |= WDTIE;                         // Enable WDT interrupt&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Watchdog Timer interrupt service routine&lt;br /&gt;
interrupt (WDT_VECTOR) watchdog_timer(void)&lt;br /&gt;
{&lt;br /&gt;
  // do this, in an case of an interrupt&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  WDTCTL = WDTPW + WDTHOLD;	// Watchdog anhalten&lt;br /&gt;
  P1DIR |= 0x01;		// P1.0 als Ausgang&lt;br /&gt;
&lt;br /&gt;
  for (;;)&lt;br /&gt;
  {&lt;br /&gt;
    volatile unsigned i;	// volatile, sonst wird die Warteschleife „wegoptimiert“&lt;br /&gt;
    P1OUT ^= 0x01;		// P1.0 umschalten mit Exklusiv-ODER&lt;br /&gt;
&lt;br /&gt;
    i = 10000;			// Warteschleife in Software&lt;br /&gt;
    do; while (--i);		// (CPU-Leistung „verheizen“)&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung der GPIO ==&lt;br /&gt;
Die Ein/Ausgabeleitungen haben beim MSP430, je nach Ausbaustufe, folgende Fähigkeiten:&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Einzeln (bitweise) programmierbare Ein/Ausgabe (&amp;lt;b&amp;gt;PxDIR&amp;lt;/b&amp;gt;, &amp;lt;b&amp;gt;PxOUT&amp;lt;/b&amp;gt;)&lt;br /&gt;
&amp;lt;li&amp;gt;Unabhängige Lese-Adresse (&amp;lt;b&amp;gt;PxIN&amp;lt;/b&amp;gt;)&lt;br /&gt;
&amp;lt;li&amp;gt;Ansprechbar als 8-Bit-Ports oder je paarweise als 16-bit-Port, bspw. P1 + P2 = PA usw.&lt;br /&gt;
&amp;lt;li&amp;gt;Interrupt auf Pegelwechsel einzelner Portpins (nur P1 und P2) (&amp;lt;b&amp;gt;PxIES&amp;lt;/b&amp;gt;)&lt;br /&gt;
&amp;lt;li&amp;gt;Pull-Up, Pull-Down oder kein Widerstand auswählbar (&amp;lt;b&amp;gt;PxREN&amp;lt;/b&amp;gt;, PxOUT)&lt;br /&gt;
&amp;lt;li&amp;gt;Einstellbare Treiberstärke (reduziert und voll) (&amp;lt;b&amp;gt;PxDS&amp;lt;/b&amp;gt;)&lt;br /&gt;
&amp;lt;li&amp;gt;Ein bis zwei Peripheriefunktionen pro Pin (&amp;lt;b&amp;gt;PxSEL&amp;lt;/b&amp;gt;), auswählbar mittels PxDIR (d.h. bei zwei Peripheriefunktionen ist eine Ausgang und die andere Eingang)&lt;br /&gt;
&amp;lt;li&amp;gt;Das JTAG-Port (4 Pins) und das USB-Port (2 Pins) ist standardmäßig ein E/A-Port (MSP430F55xx)&lt;br /&gt;
&amp;lt;li&amp;gt;Erweiterte Peripheriezuordnung bei P4 (MSP430F55xx) mittels Port Mapping Controller&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Nicht 5-V-verträglich!!&amp;lt;/b&amp;gt; Keinem Portpin darf ohne genügend großen Vorwiderstand 5 V angeboten werden. Ableitströme dürfen nicht zum Ansteigen der Speisespannung führen!&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Manche Portpins haben ein gemeinsames PxSEL, etwa:&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;das JTAG-Port (entweder alle 4 oder kein Pin zugeordnet)&lt;br /&gt;
&amp;lt;li&amp;gt;das USB-Port (entweder Portpin oder USB D+ und D–)&lt;br /&gt;
&amp;lt;li&amp;gt;die Quarz-Anschlüsse (das niederwertige PxSEL schaltet beide Portpins)&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle Portpins sind beim Einschalten (PUC) wie folgt initialisiert:&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Eingang ohne Pull-Up oder Pull-Down&lt;br /&gt;
&amp;lt;li&amp;gt;Reduzierte Treiberstärke&lt;br /&gt;
&amp;lt;li&amp;gt;Kein Pegelwechsel-Interrupt&lt;br /&gt;
&amp;lt;li&amp;gt;Keine Peripherie-Zuordnung&lt;br /&gt;
&amp;lt;li&amp;gt;Der Inhalt des Ausgaberegisters &amp;lt;b&amp;gt;PxOUT&amp;lt;/b&amp;gt; ist undefiniert!&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Alle ungenutzten Anschlüsse sollten per PullDown (&amp;lt;b&amp;gt;PxREN&amp;lt;/b&amp;gt; und &amp;lt;b&amp;gt;PxOUT&amp;lt;/b&amp;gt;) festgelegt werden.&lt;br /&gt;
&lt;br /&gt;
Kein MSP430 hat einen herausgeführten Busanschluss, etwa um mehr RAM anzubinden.&lt;br /&gt;
&lt;br /&gt;
== Initialisierung von PWM ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_PWM_TimerA(void)&lt;br /&gt;
{&lt;br /&gt;
  TACTL = TASSEL1 + TACLR;              // SMCLK, Clear Tar&lt;br /&gt;
  CCR0 = 512-1;                         // PWM Period&lt;br /&gt;
  CCTL1 = OUTMOD_7;                     // CCR1 reset/set&lt;br /&gt;
  P1DIR |= 0x04;                        // P1.2 PWM output&lt;br /&gt;
  P1SEL |= 0x04;                        // P1.2 and TA1/2 otions&lt;br /&gt;
  TACTL |= MC0;                         // Start Timer_A in up mode&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void set_PWM_duty_cycle(unsigned char duty)&lt;br /&gt;
{&lt;br /&gt;
  CCR1 = duty;                           // CCR1 PWM duty cycle &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Persistente Daten im Information Memory ==&lt;br /&gt;
Kodebeispiel für &#039;&#039;&#039;mspgcc&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// Eine INFOMEM-Struktur und deren Vorbelegung&lt;br /&gt;
struct PERSISTENT {&lt;br /&gt;
 int a,b;		// Man achte sinnfälligerweise auf korrekte Ausrichtung, um späteren Portierungsproblemen vorzubeugen!&lt;br /&gt;
 long c,d;		// mspgcc legt die Daten in little-endian ab&lt;br /&gt;
 char e,f;		// hier beispielhaft 14 Bytes insgesamt&lt;br /&gt;
}epersistent __attribute__((section(&amp;quot;.infomem&amp;quot;)))={&lt;br /&gt;
 1,2, 3,4, 5,6};&lt;br /&gt;
&lt;br /&gt;
// RAM-Kopie derselben Struktur (für gehäuften Schreibzugriff)&lt;br /&gt;
struct PERSISTENT persistent;&lt;br /&gt;
&lt;br /&gt;
// Initialisierungskode&lt;br /&gt;
 FCTL2 = 0xA549;		// Flash-Takt festlegen, bspw. MCLK = 4,6 MHz, ÷ 10 = 460 kHz&lt;br /&gt;
 persistent=epersistent;	// svw. memcpy&lt;br /&gt;
&lt;br /&gt;
// Rückschreib-Kode (im Flash, ohne &amp;lt;mspgcc/flash.h&amp;gt;, gelegentlich aufrufen):&lt;br /&gt;
// Das Flash-Schreiben blockiert den Prozessor!&lt;br /&gt;
 if (memcmp(epersistent,persistent,sizeof(epersistent))) {&lt;br /&gt;
  FCTL3 = 0xA500;		// LOCK entfernen&lt;br /&gt;
  FCTL1 = 0xA502;		// ERASE setzen&lt;br /&gt;
  epersistent.a = 0xFFFF;	// Segment löschen (≈ 10 ms)&lt;br /&gt;
  FCTL1 = 0xA540;		// SCHREIBEN setzen&lt;br /&gt;
  epersistent=persistent;	// svw. memcpy, byteweise in Flash schreiben (≈ 1 ms)&lt;br /&gt;
  FCTL1 = 0xA500;		// SCHREIBEN sperren&lt;br /&gt;
  FCTL3 = 0xA510;		// LOCK setzen&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
// Mit &amp;lt;mspgcc/flash.h&amp;gt;:&lt;br /&gt;
#include &amp;lt;mspgcc/flash.h&amp;gt;&lt;br /&gt;
 if (memcmp(epersistent,persistent,sizeof(epersistent))) {&lt;br /&gt;
  flash_lock_segmentA(0);&lt;br /&gt;
  flash_erase_segment(&amp;amp;epersistent);	// Segment löschen (≈ 10 ms)&lt;br /&gt;
  flash_write(epersistent,persistent,sizeof(epersistent)); //schreiben (≈ 1 ms)&lt;br /&gt;
  flash_lock_segmentA(1);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Ganz so komfortabel wie der EEPROM-Bereich der AVR-Controller ist der MSP430 Information Memory nicht, da dieser nur als Ganzes gelöscht werden kann und alle Lösch- und Schreiboperationen den Prozessor blockieren, es sei denn, der Schreibkode liegt im RAM.&lt;br /&gt;
&lt;br /&gt;
Weil das Speichern von ein paar Konfigurationsdaten eher nebenbei zum normalen Programmablauf erfolgen wird, lohnt sich die Mühe nicht, den Schreib-Kode in den RAM auszulagern. Der Flash-Zugriff erleichtert sich dadurch erheblich, und wie man im Beispiel „ohne &amp;lt;mspgcc/flash.h&amp;gt;“ sieht, ist auch nicht viel zu tun. Ein einfaches memcpy oder jeder andere Schreibzugriff genügt zum Beschreiben.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= Interrupts: =&lt;br /&gt;
&lt;br /&gt;
== UARTs ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// z. B. ein Echo mit dem MSPGCC-Compiler:&lt;br /&gt;
interrupt (UART0RX_VECTOR) usart0_rx(void)&lt;br /&gt;
{&lt;br /&gt;
   TXBUF0=RXBUF0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// z. B. ein Echo mit dem ImageCraft ICC430-Compiler:&lt;br /&gt;
#pragma interrupt_handler usart0_rx:UART0RX_VECTOR&lt;br /&gt;
void usart0_rx(void)&lt;br /&gt;
{&lt;br /&gt;
   TXBUF0=RXBUF0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Die Funktionen selbst können natürlich auch anders genannt werden.&lt;br /&gt;
&lt;br /&gt;
== Timer ==&lt;br /&gt;
&lt;br /&gt;
== IOs ==&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= Softwareroutinen: =&lt;br /&gt;
&lt;br /&gt;
== I2C/TWI in Software ==&lt;br /&gt;
Diese Routinen wurden ursprünglich für einen MSP430F149 geschrieben. Es werden ausschließlich IOs benutzt. Da Code in C geschrieben wurde sollte er sich einfach auf alle MSP430s ohne (aber auch mit I²C) portieren lassen. Der ist zwar nicht ganz schön, aber er funktioniert soweit ganz gut. Auch ein Beispiel ist dabei.&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/attachment.php/324877/soft-i2c.zip&lt;br /&gt;
&lt;br /&gt;
== PWM ==&lt;br /&gt;
&lt;br /&gt;
Untenstehender Code ist nur mit msp320-gcc getestet.&lt;br /&gt;
&lt;br /&gt;
Folgende Routine initialisiert den Timer als Up-Counter mit der Clock-Quelle SMCLK und einem Teiler von 8. Zudem wird der Interrupt aktiviert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void timerA_init(void)&lt;br /&gt;
{&lt;br /&gt;
	TACTL =  TASSEL_SMCLK | TACLR | ID_DIV8 | TAIE;&lt;br /&gt;
	TACTL |= MC_UPTO_CCR0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um den Timer zu starten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void timerA_start(int timing[2], int mode)&lt;br /&gt;
{&lt;br /&gt;
	TACCTL0 = mode;&lt;br /&gt;
	TACCTL0 |= CCIE ;                // enable interrupt&lt;br /&gt;
	TACCTL1 = mode;&lt;br /&gt;
	TACCR0 = timing[0];&lt;br /&gt;
	TACCR1 = timing[1];&lt;br /&gt;
	TAR = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktion wird normalerweise mit &#039;mode&#039; 3 aufgerufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
timerA_start(timing, OUTMOD_SET_RESET);&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
timing[0] enthaelt die komplette Zyklendauer einer PWM-Phase (H und L)&lt;br /&gt;
Beispiel: Um eine Pulsfrequenz von 125 Hz bei einem SMCLK von 1.0 MHz zu erhalten, gilt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;timing_0 = 1.0e6 / 8 / 125 = 1000&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
timing[1] schliesslich enthält die Zyklendauer des H-Pulses und ist immer kleiner als timing[0]. Bei einem &#039;duty cycle&#039; (Tastverhältnis) 50% gilt also&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;timing_1 = 500&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zu beachten ist, dass der Timerkanal 0 bei manchen Modi (wie dem obenstehenden) für die PWM nicht genutzt wird, &amp;quot;TACCTL0 = mode&amp;quot; keinen speziellen Effekt zeigt (siehe auch Manual).&lt;br /&gt;
&lt;br /&gt;
Deswegen wird das PWM-Signal auch an TA1 abgegriffen, nicht an TA0.&lt;br /&gt;
&lt;br /&gt;
Schlussendlich muss der entsprechende Ausgangspin für TA1 konfiguriert werden. Beim F2013 z.&amp;amp;nbsp;B. geschieht dies für P1.2 per&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	P1SEL |= 0x04;  // Enable primary peripheral&lt;br /&gt;
	P1DIR |= 0x04;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was war nun mit dem Interrupt? Falls wir z.&amp;amp;nbsp;B. die Zyklen zählen wollen, definieren wir einen Interrupt-Handler:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;signal.h&amp;gt; // &#039;interrupt&#039; makro&lt;br /&gt;
interrupt (TIMERA0_VECTOR) timera0_isr(void)&lt;br /&gt;
{&lt;br /&gt;
	g_count++;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Schlussendlich müssen wir noch die Interrupts im Initialisierungscode aktivieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
_EINT();&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Senden eines Bytes ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void SendUSART0c(char c)             // ein einzelnes zeichen über die serielle schnittstelle (USART0) senden&lt;br /&gt;
                                     // FJG: Obacht: x12xx : IFG1 =&amp;gt; IFG2 !&lt;br /&gt;
{&lt;br /&gt;
  while (!(IFG1 &amp;amp; UTXIFG0));           // warten, bis USART0 TX-buffer sendebereit&lt;br /&gt;
  TXBUF0 = c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SendUSART1c(char c)             // ein einzelnes zeichen über die serielle schnittstelle (USART1) senden&lt;br /&gt;
{&lt;br /&gt;
  while (!(IFG2 &amp;amp; UTXIFG1));           // warten, bis USART1 TX-buffer sendebereit&lt;br /&gt;
  TXBUF1 = c;&lt;br /&gt;
}     &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Senden eines Strings ==&lt;br /&gt;
Nullterminierte Strings; zugehörige Interrupts dürfen nicht aktiviert sein&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void SendUSART0(const char* str)	// einen String über die serielle Schnittstelle (USART0) senden&lt;br /&gt;
{&lt;br /&gt;
  while (*str != 0)&lt;br /&gt;
  {&lt;br /&gt;
    while (!(IFG1 &amp;amp; UTXIFG0));		// warten bis USART0 TX-Puffer frei (leer)&lt;br /&gt;
    TXBUF0 = *str++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SendUSART1(const char* str)	// einen String über die serielle Schnittstelle (USART1) senden&lt;br /&gt;
{&lt;br /&gt;
  while (*str)&lt;br /&gt;
  {&lt;br /&gt;
    while (!(IFG2 &amp;amp; UTXIFG1));		// warten bis USART1 TX-Puffer frei (leer)&lt;br /&gt;
    TXBUF1 = *str++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Binärdaten mittels DMA (hier: DMA-Kanal 0 an UART1)&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void send(const void*buf, unsigned len) {&lt;br /&gt;
// könnte globaler Initialisierungskode sein:&lt;br /&gt;
 DMACTL0 = 0x000A;		// DMA-Kanal 0 dem UART1-TxD zuordnen&lt;br /&gt;
// genauer: DMACTL0 = DMACTL0 &amp;amp; 0xFFF0 | 0x000A;&lt;br /&gt;
 DMA0DA  = (unsigned)&amp;amp;U1TXBUF;	// Zieladresse ist der Sendepuffer&lt;br /&gt;
// hier aufrufspezifischer Kode:&lt;br /&gt;
 DMA0SA  = (unsigned)buf;	// Quelladresse sind die Sendedaten&lt;br /&gt;
 DMA0SZ  = len;			// Anzahl der Byte-Transfers&lt;br /&gt;
 DMA0CTL = 0x03F0;		// Start des Single-DMA-Transfers, byte-weise mit steigender Quelladresse&lt;br /&gt;
// Abwarten aufs Ende, könnte man vorteilhaft asynchron erledigen.&lt;br /&gt;
// In so einem Fall muss der Aufrufer &amp;lt;buf&amp;gt; beibehalten bis der DMA-Transfer beendet ist&lt;br /&gt;
 while (!(DMA0CTL&amp;amp;DMAIFG));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Beachte: Die Interruptfreigabe des UART priorisiert Interruptverarbeitung über DMA! Das kann man auch gezielt ausnutzen, um mal Interrupt- und mal DMA-Betrieb zu realisieren.&lt;br /&gt;
&lt;br /&gt;
Anmerkung: Der MSP430, insbesondere die F1xxx-Serie, hat für einen sonst AVR-verwöhnten Anwender vergleichsweise &#039;&#039;&#039;starke&#039;&#039;&#039; Peripherie und eine &#039;&#039;&#039;schwache&#039;&#039;&#039; CPU. Deshalb ist die Benutzung von DMA und eines günstigen Binärdatenübertragungsprotokolls essentiell für Hochgeschwindigkeitsanwendungen, bei denen man beim AVR noch gut mit Interrupts zurecht kam.&lt;br /&gt;
&lt;br /&gt;
== Empfangen eines Bytes (interruptgesteuert)  // Receiving a byte-&amp;gt; Interrupt controlled ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/*Hab diese Interrupt Funktion für meine I²C Kommunikation verwendet&lt;br /&gt;
Startcondition wird erkannt, aber nicht Stop, da man die Flanken(die den&lt;br /&gt;
interrupt auslösen) umkehren müsste, aber dann keine Startkondition erkannt werden kann.&lt;br /&gt;
&lt;br /&gt;
Hab mir jetzt nicht die mühe gemacht alles rauszupicken was ihr nicht braucht.&lt;br /&gt;
Wer sich auskennt, kann das auch selber machen.&lt;br /&gt;
&lt;br /&gt;
Das Busy wird fürs stretching verwendet(CLK wird auf low gezogen)&lt;br /&gt;
*/  &lt;br /&gt;
&lt;br /&gt;
#pragma vector = PORT1_VECTOR           // Port 1 - Interrupt-Funktions-&amp;quot;Alias&amp;quot;&lt;br /&gt;
__interrupt void Interrupt_Port1()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
//  I2CTransfer = 0;&lt;br /&gt;
&lt;br /&gt;
    TACTL |= TACLR;&lt;br /&gt;
    TACTL |= TAIE;&lt;br /&gt;
#ifdef WD&lt;br /&gt;
    WDTCTL = WDTPW + WDTCNTCL;&lt;br /&gt;
#endif&lt;br /&gt;
    &lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
  if ((P1IFG &amp;amp; 0x04) &amp;amp;&amp;amp; !(I2CCLK)) { //if startdataimpuls but clk low is detected --return--&lt;br /&gt;
    P1IFG &amp;amp;= ~0x0C;&lt;br /&gt;
    return;}&lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
//    P1IE &amp;amp;= ~0x0C;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
  if ((P1IFG &amp;amp; 0x04) &amp;amp;&amp;amp; I2CCLK)   //Start Condition       (I2CStart)&lt;br /&gt;
    {&lt;br /&gt;
      P1IFG &amp;amp;= ~0x0C;&lt;br /&gt;
      &lt;br /&gt;
//    I2CTransfer = 1;&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
        P1IE &amp;amp;= ~0x0C;&lt;br /&gt;
//        TACTL |= TACLR;&lt;br /&gt;
//        TACTL |= TAIE;&lt;br /&gt;
//        _EINT();&lt;br /&gt;
&lt;br /&gt;
      &lt;br /&gt;
/*#ifdef Debug&lt;br /&gt;
      P2OUT |= 0x04;&lt;br /&gt;
      P2DIR |= 0x04; &lt;br /&gt;
#endif*/&lt;br /&gt;
      &lt;br /&gt;
//      Wait(10);&lt;br /&gt;
//      while(I2CCLK)  {CheckTimer;}&lt;br /&gt;
&lt;br /&gt;
//      set_Busy;&lt;br /&gt;
  &lt;br /&gt;
      BitCnt = 0x01;&lt;br /&gt;
      ByteCnt = 0;&lt;br /&gt;
//      I2CByte = 0;&lt;br /&gt;
      StartCondition = 1;&lt;br /&gt;
//      CRCByte = 0x00;&lt;br /&gt;
      GetData = 0;&lt;br /&gt;
      I2CTransfer = 0;&lt;br /&gt;
    &lt;br /&gt;
//    clr_Busy;&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
        _DINT();&lt;br /&gt;
        P1IE |= 0x0C;&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
  P1IFG &amp;amp;= ~0x0C;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
    TACTL |= TACLR;&lt;br /&gt;
    _EINT();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
  if (I2CCLK)&lt;br /&gt;
  {&lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
      TACTL |= TAIE;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    I2CByte &amp;lt;&amp;lt;= 1; &lt;br /&gt;
    if (I2CDAT){&lt;br /&gt;
      I2CByte += 0x01;&lt;br /&gt;
     }&lt;br /&gt;
    I2CTransfer = 1;&lt;br /&gt;
    while(I2CCLK) {CheckTimer;}&lt;br /&gt;
    set_Busy;&lt;br /&gt;
    BitCnt &amp;lt;&amp;lt;= 1;&lt;br /&gt;
  &lt;br /&gt;
    if(!(BitCnt == 0x00))&lt;br /&gt;
    {&lt;br /&gt;
      clr_Busy;  &lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      _NOP();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
  }&lt;br /&gt;
//----------------------------------------------------------------------------  &lt;br /&gt;
&lt;br /&gt;
P1DIR &amp;amp;= ~0x0C;&lt;br /&gt;
P1IFG = 0x00;&lt;br /&gt;
P1IE |= 0x0C;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ermitteln der Temperatur ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// von FJG info@aqua-sun.net :&lt;br /&gt;
// ---------------   Temperatur des Chips   ---------------------&lt;br /&gt;
&lt;br /&gt;
#define T_Faktor_a1000       ((long)103)     // REF 1,5V&lt;br /&gt;
#define T_Faktor_b1000       ((long)172)     // REF 2,5V&lt;br /&gt;
#define T_Faktor_c1000       ((long)278000)&lt;br /&gt;
&lt;br /&gt;
int Hole_Temp(void)	// Temperatur ch 10&lt;br /&gt;
{			// Temp = N* 0,17193 -278  1000Temp = N*172 -278000 bei 2,5V&lt;br /&gt;
  long Temp_L;&lt;br /&gt;
  int  Temp , Delta ;&lt;br /&gt;
&lt;br /&gt;
  Start_AD();&lt;br /&gt;
&lt;br /&gt;
  Temp_L = ((long)ADC12MEM10 * T_Faktor_a1000) - T_Faktor_c1000 ;&lt;br /&gt;
  Temp   = (int)( Temp_L / 1000);&lt;br /&gt;
&lt;br /&gt;
  Delta = Read_EEPROM( EPROM_INTERN_BL1_R_ADR,DELTA_TEMP_ADR );	   // falls Temp Messung&lt;br /&gt;
  if( Delta &amp;lt;= 120 &amp;amp;&amp;amp; Delta &amp;gt;= 80 ) Delta -= 100 ; else Delta = 0; // ungenau war&lt;br /&gt;
                                                                   // siehe dazu TI&lt;br /&gt;
  return (Temp + Delta);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// INIT AD&lt;br /&gt;
// AD muss angestoßen werden mit :   Start_AD()&lt;br /&gt;
&lt;br /&gt;
// #define ADC12TL0WERT15	(SHT1_8 + SHT0_3 + MSC + REFON + ADC12ON)&lt;br /&gt;
#define ADC12TL0WERT15		(SHT1_3 + SHT0_3 + MSC + REFON + ADC12ON)&lt;br /&gt;
#define ADC12TL0WERT25		(SHT1_3 + SHT0_3 + MSC + +REF2_5V + REFON + ADC12ON)&lt;br /&gt;
&lt;br /&gt;
//                        Start CH0 , ADC12SCBIT , SampleT , F/2 , MCLK , Sequenze of CH&lt;br /&gt;
#define ADC12CTL1WERT   ( CSTARTADD_0 + SHS_0 + SHP + ADC12DIV_1 + ADC12SSEL_2 + CONSEQ_1 )&lt;br /&gt;
&lt;br /&gt;
void adc12_init()	// ADC12CTL0 modifizieren nur mit ENC = 0&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0   = 0x00;&lt;br /&gt;
  ADC12CTL1   = ADC12CTL1WERT ;&lt;br /&gt;
&lt;br /&gt;
  ADC12MCTL0  = INCH_0;                  &lt;br /&gt;
  ADC12MCTL1  = INCH_1;                  &lt;br /&gt;
  ADC12MCTL2  = INCH_2;&lt;br /&gt;
  ADC12MCTL3  = INCH_3;&lt;br /&gt;
  ADC12MCTL4  = INCH_4;&lt;br /&gt;
  ADC12MCTL5  = INCH_5;&lt;br /&gt;
  ADC12MCTL6  = INCH_6;&lt;br /&gt;
  ADC12MCTL7  = INCH_7;                  &lt;br /&gt;
  ADC12MCTL8  = INCH_8;		// VeREF+&lt;br /&gt;
  ADC12MCTL9  = INCH_9;		// VeREF-&lt;br /&gt;
&lt;br /&gt;
  ADC12MCTL10 = INCH_10 + SREF_1 ;&lt;br /&gt;
  ADC12MCTL11 = INCH_11 + SREF_1 +EOS;&lt;br /&gt;
&lt;br /&gt;
  ADC12IE     = 0x00;&lt;br /&gt;
  ADC12CTL0   = ADC12TL0WERT15 ;&lt;br /&gt;
  ADC12CTL0  |= 0x0003;		// ENC + ADC12SC = Enable Conversation + StartConversation&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------   Diverses AD_Wandler   --------------------&lt;br /&gt;
&lt;br /&gt;
void Start_AD(void)&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0 &amp;amp;= ~ENC;&lt;br /&gt;
  ADC12CTL0 |= (ADC12SC+ENC);&lt;br /&gt;
  NOP();&lt;br /&gt;
  NOP();&lt;br /&gt;
  ADC12CTL0 &amp;amp;=~ADC12SC;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#ifndef TEST_AD&lt;br /&gt;
#define Ist_AD_Busy()        ( ADC12CTL1 &amp;amp; ADC12BUSY )&lt;br /&gt;
#else&lt;br /&gt;
int Ist_AD_Busy()&lt;br /&gt;
{&lt;br /&gt;
  if (ADC12CTL1 &amp;amp; ADC12BUSY)&lt;br /&gt;
  {&lt;br /&gt;
     printf(&amp;quot;\n\r... BUSY ...&amp;quot;); &lt;br /&gt;
     delay_ms(500);&lt;br /&gt;
     return(1);&lt;br /&gt;
  }&lt;br /&gt;
  return(0);&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ansteuerung eines LCD &amp;amp;#8211; Zeichendisplays // Controlling the LCD character==&lt;br /&gt;
&lt;br /&gt;
Der folgende Quelltext-Schnipsel ist für Siebensegmentanzeigen gedacht,&lt;br /&gt;
&#039;&#039;nicht&#039;&#039; für die mit dem HD44780-kompatiblen Controller.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
  // hier nun der vollständige Code 14 Jan 08&lt;br /&gt;
  // von mir seinerseits entwickelt, ich hoffe, er ist eine Hilfe&lt;br /&gt;
 &lt;br /&gt;
  // Aquasun Germany  Remscheid  Franz-Josef Günther&lt;br /&gt;
  // Development info@aqua-sun.net&lt;br /&gt;
&lt;br /&gt;
  // LCD.h Header für Allgemeines zum LCD ab 02.12.04 Aquasun GUE&lt;br /&gt;
  // C-Compiler ICC&lt;br /&gt;
&lt;br /&gt;
  // -------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
  // Beispiel :&lt;br /&gt;
&lt;br /&gt;
int Aepfel = 8;&lt;br /&gt;
&lt;br /&gt;
print_LCD(&amp;quot;\nRotkaepchen hat %d Aepfel im Korb&amp;quot;,Aepfel);&lt;br /&gt;
&lt;br /&gt;
  // -------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;_const.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdarg.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt; STRING.H&amp;gt;&lt;br /&gt;
#include &amp;lt; stdio.h &amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LCD_MAX          8&lt;br /&gt;
#define Mem_LCD         16&lt;br /&gt;
&lt;br /&gt;
#ifndef Mem_LCD&lt;br /&gt;
#define Mem_LCD 20&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
    Header für 8 x 7 Segmentanzeigen 2 MUX MSP430 x4xx&lt;br /&gt;
&lt;br /&gt;
    V3 = V1 (VDD) , V5 = 0 ,&lt;br /&gt;
&lt;br /&gt;
    für : LCD siehe TI Info dazu,&lt;br /&gt;
    für : LED&#039;s :&lt;br /&gt;
&lt;br /&gt;
    LED mit gemeinsamer Kathode, SP über Buffer 74HC245 (8x) o.ä.&lt;br /&gt;
    /G=L , DIR=H A ==&amp;gt; B an 5V , COM mit Emitterfolger PNP ViL=0,8V ViH=2V&lt;br /&gt;
&lt;br /&gt;
    LED mit gemeinsamer Anode, COM über PNP Transistor invertiert&lt;br /&gt;
    und SP über ULN2804(8x) getrieben&lt;br /&gt;
            _   ___   ___   ___&lt;br /&gt;
    COM0 :   |_|   |_|   |_|&lt;br /&gt;
            ____   ___   ___&lt;br /&gt;
    COM1 :      |_|   |_|   |_|&lt;br /&gt;
             __    __    __&lt;br /&gt;
    SPon :  |  |__|  |__|  |__| mit COM0&lt;br /&gt;
&lt;br /&gt;
    SPin :   0  1  2  3  4  5  6  7    8  9 10 11 12 13 14 15&lt;br /&gt;
    COM0 :  1a 1b 1c 1d 1e 1f 1g 1h   2a 2b 2c 2d 2e 2f 2g 2h&lt;br /&gt;
    COM1 :  5a 5b 5c 5d 5e 5f 5g 5h   6a 6b 6c 6d 6e 6f 6g 6h&lt;br /&gt;
&lt;br /&gt;
    SPin :  16 17 18 19 20 21 22 23   24 25 26 27 28 29 30 31&lt;br /&gt;
    COM0 :  3a 3b 3c 3d 3e 3f 3g 3h   4a 4b 4c 4d 4e 4f 4g 4h&lt;br /&gt;
    COM1 :  7a 7b 7c 7d 7e 7f 7g 7h   8a 8b 8c 8d 8e 8f 8g 8h&lt;br /&gt;
&lt;br /&gt;
    COM        3 2   1  0   3 2   1  0&lt;br /&gt;
    MAP 0A0    - -   8h 4h  - -   8g 4g&lt;br /&gt;
        09F    - -   8f 4f  - -   8e 4e&lt;br /&gt;
        09E    - -   8d 4d  - -   8c 4c&lt;br /&gt;
        09D    - -   8b 4b  - -   8a 4a&lt;br /&gt;
&lt;br /&gt;
        09C    - -   7h 3h  - -   7g 3g&lt;br /&gt;
        09B    - -   7f 3f  - -   7e 3e&lt;br /&gt;
        09A    - -   7d 3d  - -   7c 3c&lt;br /&gt;
        099    - -   7b 3b  - -   7a 3a&lt;br /&gt;
&lt;br /&gt;
        098    - -   6h 2h  - -   6g 2g&lt;br /&gt;
        097    - -   6f 2f  - -   6e 2e&lt;br /&gt;
        096    - -   6d 2d  - -   6c 2c&lt;br /&gt;
        095    - -   6b 2b  - -   6a 2a&lt;br /&gt;
&lt;br /&gt;
        094    - -   5h 1h  - -   5g 1g&lt;br /&gt;
        093    - -   5f 1f  - -   5e 1e&lt;br /&gt;
        092    - -   5d 1d  - -   5c 1c&lt;br /&gt;
        091    - -   5b 1b  - -   5a 1a&lt;br /&gt;
&lt;br /&gt;
             ---a----&lt;br /&gt;
            |        |&lt;br /&gt;
          f |        | b&lt;br /&gt;
            |        |&lt;br /&gt;
             ---g----&lt;br /&gt;
            |        |&lt;br /&gt;
          e |        | c&lt;br /&gt;
            |        |    _&lt;br /&gt;
              ---d---    | | h&lt;br /&gt;
                          -&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
#define a0      0x01  // Char durch rechtsschiften &amp;amp; 0x..&lt;br /&gt;
#define b0      0x10&lt;br /&gt;
#define c0      0x02&lt;br /&gt;
#define d0      0x20&lt;br /&gt;
#define e0      0x04&lt;br /&gt;
#define f0      0x40&lt;br /&gt;
#define g0      0x08&lt;br /&gt;
#define h0      0x80&lt;br /&gt;
&lt;br /&gt;
#define ch_0    ( e0+f0+a0+b0+c0+d0 )&lt;br /&gt;
#define ch_1    ( b0+c0 )&lt;br /&gt;
#define ch_2    ( a0+b0+g0+e0+d0 )&lt;br /&gt;
#define ch_3    ( a0+b0+g0+c0+d0 )&lt;br /&gt;
#define ch_4    ( f0+g0+b0+c0 )&lt;br /&gt;
#define ch_5    ( a0+f0+g0+c0+d0 )&lt;br /&gt;
#define ch_6    ( a0+f0+c0+d0+e0+g0 )&lt;br /&gt;
#define ch_7    ( a0+b0+c0 )&lt;br /&gt;
#define ch_8    ( a0+b0+c0+d0+e0+f0+g0 )&lt;br /&gt;
#define ch_9    ( a0+b0+c0+f0+g0 )&lt;br /&gt;
&lt;br /&gt;
#define ch_a    ( a0+b0+c0+d0+e0+g0 )&lt;br /&gt;
#define ch_A    ( e0+f0+a0+b0+c0+g0 )&lt;br /&gt;
#define ch_B    ( a0+b0+c0+d0+e0+f0+g0 )&lt;br /&gt;
#define ch_b    ( f0+e0+d0+c0+g0 )&lt;br /&gt;
#define ch_c    ( g0+e0+d0 )&lt;br /&gt;
#define ch_C    ( a0+f0+e0+d0 )&lt;br /&gt;
#define ch_d    ( b0+c0+d0+e0+g0 )&lt;br /&gt;
#define ch_D    ( e0+f0+a0+b0+c0+d0 )&lt;br /&gt;
#define ch_e    ( f0+e0+d0+a0+b0+g0 )&lt;br /&gt;
#define ch_E    ( a0+f0+g0+d0+e0 )&lt;br /&gt;
#define ch_F    ( a0+f0+g0+e0 )&lt;br /&gt;
#define ch_G    ( a0+f0+c0+d0+e0+g0 )&lt;br /&gt;
#define ch_g    ( a0+b0+c0+d0+f0+g0 )&lt;br /&gt;
#define ch_h    ( f0+c0+e0+g0 )&lt;br /&gt;
#define ch_H    ( f0+c0+e0+g0+b0 )&lt;br /&gt;
#define ch_I    ( f0+e0 )&lt;br /&gt;
#define ch_i    ( e0 )&lt;br /&gt;
#define ch_k    ( b0+e0+f0+g0 )&lt;br /&gt;
#define ch_L    ( f0+e0+d0 )&lt;br /&gt;
#define ch_l    ( b0+c0 )&lt;br /&gt;
#define ch_M    ( c0+b0+e0+f0 )&lt;br /&gt;
&lt;br /&gt;
#define ch_n    ( e0+g0+c0 )&lt;br /&gt;
#define ch_N    ( a0+b0+c0+e0+f0 )&lt;br /&gt;
#define ch_o    ( e0+g0+c0+d0 )&lt;br /&gt;
#define ch_O    ( e0+f0+a0+b0+c0+d0 )&lt;br /&gt;
#define ch_P    ( e0+f0+a0+b0+g0 )&lt;br /&gt;
#define ch_r    ( g0+e0 )&lt;br /&gt;
#define ch_S    ( a0+f0+g0+c0+d0 )&lt;br /&gt;
#define ch_T    ( a0+f0+e0 )&lt;br /&gt;
#define ch_U    ( f0+e0+d0+c0+b0 )&lt;br /&gt;
#define ch_u    ( e0+d0+c0 )&lt;br /&gt;
#define ch_X    ( b0+g0+e0 )&lt;br /&gt;
#define ch_Y    ( f0+g0+b0+c0+d0 )&lt;br /&gt;
#define ch_Z    ( a0+b0+g0+e0+d0 )&lt;br /&gt;
#define ch_Blank  0&lt;br /&gt;
#define Unter_  ( d0 )&lt;br /&gt;
#define DP_Pkt  ( h0 )&lt;br /&gt;
#define Minus   ( g0 )&lt;br /&gt;
#define Tilde   ( a0+g0+d0 )&lt;br /&gt;
#define GLEICH  ( g0+d0 )&lt;br /&gt;
#define FRAGE   ( a0+f0+g0+c0+d0+h0 )&lt;br /&gt;
&lt;br /&gt;
// #define Digi_X1ste         LCDM17       // die erste freie LCD_Mem_Stelle 18,19,20&lt;br /&gt;
                                           // in lcd_init() auf 0&lt;br /&gt;
&lt;br /&gt;
// extern unsigned int Digi_X;             // für LCD&lt;br /&gt;
&lt;br /&gt;
const char  letter[] = &amp;quot;0123456789 _.-~?=AaBbCcDdEeFGgHhIiKkLlMmNnOoPRrSsTtUuxXYyZz&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
const int hex_Wert[] = {&lt;br /&gt;
      ch_0,    ch_1, ch_2, ch_3, ch_4, ch_5, ch_6, ch_7, ch_8, ch_9,&lt;br /&gt;
      ch_Blank, Unter_, DP_Pkt, Minus, Tilde, FRAGE , GLEICH ,&lt;br /&gt;
      ch_A, ch_a, ch_B, ch_b, ch_C, ch_c, ch_D, ch_d, ch_E, ch_e, ch_F, ch_G, ch_g,&lt;br /&gt;
      ch_H, ch_h, ch_I, ch_i, ch_k, ch_k, ch_L, ch_l , ch_M, ch_M, ch_N, ch_n, ch_O, ch_o,&lt;br /&gt;
      ch_P, ch_r, ch_r, ch_S, ch_S, ch_T, ch_T, ch_U, ch_u, ch_X, ch_X,&lt;br /&gt;
      ch_Y, ch_Y, ch_Z , ch_Z  };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void All_LCD(void);&lt;br /&gt;
void Clear_LCD_M(void);                     // Clears LCD memory&lt;br /&gt;
void Clear_LCD(void);&lt;br /&gt;
void lcd_init(void); in ini&lt;br /&gt;
void Write_LCD_Hex(int Digit_n , int HEX_Zeichen);&lt;br /&gt;
void SetzeDP( int welches_Displ);&lt;br /&gt;
int putchar_LCD(char);&lt;br /&gt;
int print_LCD(CONST char *fmt, ...)  ;      // LCD 1-7 Digit nur realisiert sonst 1...11&lt;br /&gt;
extern int _print(void (*_put)(char), const char *fmt, va_list va);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void Clear_LCD_M(void)&lt;br /&gt;
{&lt;br /&gt;
    int i;&lt;br /&gt;
    for (i =0; i&amp;lt;Mem_LCD; i++) LCDMEM[i] = 0;   // Mem_LCD extern , abhängig vom Display&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void Clear_LCD(void)&lt;br /&gt;
{&lt;br /&gt;
      print_LCD(&amp;quot;\n_&amp;quot;);                     // beim Cursor wird DIGIT_X nicht weitergezählt&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void All_LCD(void)                          // alle = 8888..&lt;br /&gt;
{&lt;br /&gt;
    int i;&lt;br /&gt;
    for (i=0; i&amp;lt;Mem_LCD; i++) LCDMEM[i] = 0xFF;   // Mem_LCD extern , abhängig vom Display&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
int putchar_LCD(char c_in)&lt;br /&gt;
{&lt;br /&gt;
                                            //  Digi_X  == LCDM17&lt;br /&gt;
    int i, leng;&lt;br /&gt;
    char c = c_in;&lt;br /&gt;
    leng = strlen(letter);                  // Länge ohne /0 , 1..&lt;br /&gt;
&lt;br /&gt;
      if( (c==&#039;\n&#039;) || (c==&#039;\r&#039;))           // nichts gefunden =&amp;gt; CLR_Displ&lt;br /&gt;
        {&lt;br /&gt;
          Digi_X =1;  Clear_LCD_M(); return c;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    for(i=0;i&amp;lt;leng;i++) { if( c == letter[i] ) break; }        // Char gefunden&lt;br /&gt;
&lt;br /&gt;
    if(i == leng)&lt;br /&gt;
      {&lt;br /&gt;
        for(i=0;i&amp;lt;leng;i++) { if( &#039; &#039; == letter[i] ) break; }  // Char &#039; &#039; als Ersatz&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    if(i&amp;lt;leng)                              // es gibt &#039;.&#039; als Ersatz&lt;br /&gt;
      {&lt;br /&gt;
        Write_LCD_Hex((int)Digi_X , i);     // Digi beschreiben oder löschen&lt;br /&gt;
                                            // if(Digi_X) Write_LCD_Hex(Digi_X , i);&lt;br /&gt;
        if(C != &#039;_&#039;)Digi_X++;&lt;br /&gt;
        if(Digi_X &amp;gt; LCD_MAX) Digi_X =1;     // if(Digi_X &amp;gt;= Mem_LCD) Digi_X =1;&lt;br /&gt;
      }&lt;br /&gt;
    return c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
int print_LCD(CONST char *fmt, ...)&lt;br /&gt;
{&lt;br /&gt;
    va_list va;&lt;br /&gt;
    int val;&lt;br /&gt;
&lt;br /&gt;
    va_start(va, fmt);&lt;br /&gt;
    val = _print((void (*)(char))putchar_LCD, fmt, va);&lt;br /&gt;
    va_end(va);&lt;br /&gt;
&lt;br /&gt;
    return val;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
   // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void lcd_init(void)             // LCD init&lt;br /&gt;
{&lt;br /&gt;
 LCDCTL=0xAD;                   // LCDM567.2,LCDM567.0,LCDM234.1,LCDM234.0,LCDM0&lt;br /&gt;
 LCDM1 =0x00;                   // 0xAD = 101 01 101&lt;br /&gt;
 LCDM2 =0x00;                   // 101 = LCDP2 ,0, LCDP0 =&amp;gt; S0..S31&lt;br /&gt;
 LCDM3 =0x00;                   //  01 = LCDMX1,LCDMX0   =&amp;gt; 2-mux&lt;br /&gt;
 LCDM4 =0x00;                   // 101 = LCDSON,x,LCDON Segments ON ,x,LCD ON&lt;br /&gt;
 LCDM5 =0x00;&lt;br /&gt;
 LCDM6 =0x00; LCDM7 =0x00; LCDM8 =0x00; LCDM9 =0x00; LCDM10 =0x00;LCDM11 =0x00;&lt;br /&gt;
 LCDM12=0x00; LCDM13=0x00; LCDM14=0x00; LCDM15=0x00; LCDM16=0x00; LCDM17=0x00;&lt;br /&gt;
 LCDM18=0x00; LCDM19=0x00; LCDM20=0x00;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
   // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void Write_LCD_Hex(int Digit_n , int char_Nr)   // Digit1 bis 4 und 5 bis 8&lt;br /&gt;
{&lt;br /&gt;
  int i ,i_End , ch , Maske_loesch , Maske_setz ;&lt;br /&gt;
&lt;br /&gt;
  if((Digit_n == 0 ) || (Digit_n &amp;gt; LCD_MAX))&lt;br /&gt;
    {&lt;br /&gt;
        Clear_LCD_M(); i=0;&lt;br /&gt;
    }&lt;br /&gt;
   else i= (Digit_n - 1);                   // Startadresse = Digit_n x4 siehe unten&lt;br /&gt;
&lt;br /&gt;
  if(Digit_n &amp;lt; (LCD_MAX/2+1))               // Digit 1 ... 4 , i 0...3&lt;br /&gt;
    {&lt;br /&gt;
        Maske_setz   = 0x0011;&lt;br /&gt;
        Maske_loesch = 0x00FF - Maske_setz ;&lt;br /&gt;
        ch           = hex_Wert[char_Nr];&lt;br /&gt;
    } else                                  // Digit 5 ... 8&lt;br /&gt;
    {&lt;br /&gt;
        Maske_setz   = 0x0022;&lt;br /&gt;
        Maske_loesch = 0x00FF - Maske_setz ;&lt;br /&gt;
        ch           = hex_Wert[char_Nr] &amp;lt;&amp;lt; 1;&lt;br /&gt;
        i           -= (LCD_MAX/2) ;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  i &amp;lt;&amp;lt;= 2; i_End = i +4;                    // Berechnung der Start- und End -adresse&lt;br /&gt;
&lt;br /&gt;
  for(; i &amp;lt; i_End;i++)&lt;br /&gt;
    {&lt;br /&gt;
       LCDMEM[i] &amp;amp;= Maske_loesch;&lt;br /&gt;
       LCDMEM[i] |= ( ch &amp;amp; Maske_setz );&lt;br /&gt;
       ch &amp;gt;&amp;gt;=1;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
  // -----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
void SetzeDP( int welches_Displ)          // Displ 8 , 7 , 6 ...&lt;br /&gt;
{&lt;br /&gt;
  int i , i1;&lt;br /&gt;
    for (i=0,i1=1;i&amp;lt;8;i++,i1 &amp;lt;&amp;lt;=1)&lt;br /&gt;
      {&lt;br /&gt;
        if(welches_Displ &amp;amp; i1)&lt;br /&gt;
        switch(i)&lt;br /&gt;
         {&lt;br /&gt;
           case 0 : LCDM4  |= 0x10; break;&lt;br /&gt;
           case 1 : LCDM8  |= 0x10; break;&lt;br /&gt;
           case 2 : LCDM12 |= 0x10; break;&lt;br /&gt;
           case 3 : LCDM16 |= 0x10; break;&lt;br /&gt;
           case 4 : LCDM4  |= 0x20; break;&lt;br /&gt;
           case 5 : LCDM8  |= 0x20; break;&lt;br /&gt;
           case 6 : LCDM12 |= 0x20; break;&lt;br /&gt;
           case 7 : LCDM16 |= 0x20; break;&lt;br /&gt;
           default: break;&lt;br /&gt;
         }&lt;br /&gt;
      }  // for&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
  // ------------------  ENDE  ----------------------&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
[[Kategorie:MSP430]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=MSP430_Codebeispiele&amp;diff=61404</id>
		<title>MSP430 Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=MSP430_Codebeispiele&amp;diff=61404"/>
		<updated>2011-11-03T09:59:41Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Senden eines Strings */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;MSP430 &amp;amp;#8211; Codebeispiele&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Einleitung:&#039;&#039;&#039;&lt;br /&gt;
Da der MSP430 eine sehr schöner Mikrocontroller für energiesparende Anwendungen ist, jedoch bei weitem nicht so verbreitet wie z.&amp;amp;nbsp;B. diverse 8051er, AVRs, PICs usw. ist, gibt es auch nicht all zu viele Codebeispiele aus Projekten für den/die Hobbybastler(in).&lt;br /&gt;
Aus diesem Grund werden hier Grundlagen der Initialisierung diverser Hardwarefeatures sowie grundlegende Softwareroutinen und dergleichen beschrieben, so dass für Anfänger auch ein einfaches Copy&amp;amp;Paste möglich ist.&lt;br /&gt;
Hierbei kommt der MSPGCC zum Einsatz, da eine professionelle unlimitierte Ausgabe des z.&amp;amp;nbsp;B. IAR für Bastler nahezu unbezahlbar ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Hardware =&lt;br /&gt;
&lt;br /&gt;
== Initializing/ Configuring UARTs ==&lt;br /&gt;
Von www.mathar.com stammt diese Routine zur initialisierung eines beliebigen UARTS. Zusätzlich müssen jedoch die Pins noch definiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void InitUSART(char USART0, char USART1, unsigned int baudrate1, unsigned int baudrate2, char IR0, char IR1)&lt;br /&gt;
{&lt;br /&gt;
  if (USART0) ME1 |= UTXE0 + URXE0;    // falls gesetzt, USART0 einschalten (TX- und RX-teil)&lt;br /&gt;
  if (USART1) ME2 |= UTXE1 + URXE1;    // falls gesetzt, USART1 einschalten (TX- und RX-teil)&lt;br /&gt;
  UCTL0 |= CHAR;                       // 8 data bits, 1 stop bit, no parity (8N1)&lt;br /&gt;
  UCTL1 |= CHAR;&lt;br /&gt;
  UTCTL0 |= SSEL1;                     // SMCLK als UCLK festlegen&lt;br /&gt;
  UTCTL1 |= SSEL1;&lt;br /&gt;
  if (baudrate1==19200)&lt;br /&gt;
  {&lt;br /&gt;
    UBR00 = 0xA0;                      // 19200 baud aus 8 MHz erzeugen&lt;br /&gt;
    UBR10 = 0x01;                      // siehe application note tabelle 1, seite 9&lt;br /&gt;
    UMCTL0 = 0x00;                     // keine korrektur der division noetig&lt;br /&gt;
  }&lt;br /&gt;
  if (baudrate2==19200)&lt;br /&gt;
  {&lt;br /&gt;
    UBR01 = 0xA0;                      // 19200 baud aus 8 MHz erzeugen&lt;br /&gt;
    UBR11 = 0x01;                      // siehe application note tabelle 1, seite 9&lt;br /&gt;
    UMCTL1 = 0x00;                     // keine korrektur der division noetig&lt;br /&gt;
  }&lt;br /&gt;
  if (USART0) UCTL0 &amp;amp;= ~SWRST;         // USART freigeben&lt;br /&gt;
  if (USART1) UCTL1 &amp;amp;= ~SWRST;&lt;br /&gt;
  if (IR0==0) IE1 |= URXIE0;           // IR0: 0 -&amp;gt; nur RX-interrupt anschalten&lt;br /&gt;
  if (IR0==1) IE1 |= UTXIE0;           //      1 -&amp;gt; nur TX-interrupt anschalten&lt;br /&gt;
  if (IR0==2) IE1 |= URXIE0 + UTXIE0;  //      2 -&amp;gt; TX- und RX-interrupt anschalten&lt;br /&gt;
  if (IR1==1||IR1==2) IFG1 &amp;amp;= ~UTXIFG0;  // initales interrupt-flag loeschen&lt;br /&gt;
  if (IR1==0) IE2 |= URXIE1;           // IR1: 0 -&amp;gt; nur RX-interrupt anschalten&lt;br /&gt;
  if (IR1==1) IE2 |= UTXIE1;           //      1 -&amp;gt; nur TX-interrupt anschalten&lt;br /&gt;
  if (IR1==2) IE2 |= URXIE1 + UTXIE1;  //      2 -&amp;gt; TX- und RX-interrupt anschalten&lt;br /&gt;
  if (IR1==1||IR1==2) IFG1 &amp;amp;= ~UTXIFG1;  // initales interrupt-flag loeschen&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialization/configuration of USART (SPI and I2C/TWI) ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_spi(void)&lt;br /&gt;
{&lt;br /&gt;
  ME1 |= USPIE0;                        // Enable USART0 SPI mode&lt;br /&gt;
  UTCTL0 = CKPH+SSEL1+SSEL0+STC;        // SMCLK, 3-pin mode&lt;br /&gt;
  UCTL0 = CHAR+SYNC+MM;                 // 8-bit SPI Master **SWRST**&lt;br /&gt;
  UBR00 = 0x02;                         // UCLK/2 &lt;br /&gt;
  UBR10 = 0x00;                         // 0&lt;br /&gt;
  UMCTL0 = 0x00;                        // no modulation&lt;br /&gt;
  P3SEL |= 0x0E;                        // P3.1-3 SPI option select&lt;br /&gt;
  P3DIR |= 0x01;                        // P3.0 output direction&lt;br /&gt;
  _EINT();                              // Enable interrupts&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void init_i2c(unsigned char slave)&lt;br /&gt;
{&lt;br /&gt;
  P3SEL |= 0x0a;                            // Assign I2C pins to module&lt;br /&gt;
  U0CTL |= I2C + SYNC;                      // Switch USART0 to I2C mode&lt;br /&gt;
  U0CTL &amp;amp;= ~I2CEN;                          // Recommended I2C init procedure&lt;br /&gt;
  I2CTCTL = I2CSSEL_2;                      // SMCLK&lt;br /&gt;
  I2CSCLH = 0x03;                           // High period of SCL&lt;br /&gt;
  I2CSCLL = 0x03;                           // Low period of SCL&lt;br /&gt;
  I2CNDAT = 0x01;                           // Transmit one byte&lt;br /&gt;
  I2CSA = slave;                             // Slave address&lt;br /&gt;
  U0CTL |= I2CEN;                           // Enable I2C, 7 bit addr,&lt;br /&gt;
  I2CIE = RXRDYIE;                          // I2C receive ready interrupt enable&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung der Quarze ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_XT2(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned int i;&lt;br /&gt;
  WDTCTL = WDTPW + WDTHOLD;             // Stop WDT&lt;br /&gt;
  BCSCTL1 &amp;amp;= ~XT2OFF;                   // XT2 = HF XTAL&lt;br /&gt;
  do &lt;br /&gt;
  {&lt;br /&gt;
    IFG1 &amp;amp;= ~OFIFG;                       // Clear OSCFault flag&lt;br /&gt;
    for (i = 0xFF; i &amp;gt; 0; i--);           // Time for flag to set&lt;br /&gt;
  }&lt;br /&gt;
  while ((IFG1 &amp;amp; OFIFG) != 0);          // OSCFault flag still set?                &lt;br /&gt;
  BCSCTL2 |= SELM1;                     // MCLK = XT2 (safe)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_XT(void) // high frequenz resonators ( 455 kHz - 8MhZ )&lt;br /&gt;
{&lt;br /&gt;
  unsigned int i;&lt;br /&gt;
  WDTCTL = WDTPW + WDTHOLD;             // Stop WDT&lt;br /&gt;
  BCSCTL1 |= XTS;                       // ACLK = LFXT1 = HF XTAL&lt;br /&gt;
  do &lt;br /&gt;
  {&lt;br /&gt;
    IFG1 &amp;amp;= ~OFIFG;                       // Clear OSCFault flag&lt;br /&gt;
    for (i = 0xFF; i &amp;gt; 0; i--);           // Time for flag to set&lt;br /&gt;
  }&lt;br /&gt;
  while ((IFG1 &amp;amp; OFIFG) == OFIFG);      // OSCFault flag still set?                &lt;br /&gt;
  BCSCTL2 |= SELM1+SELM0;               // MCLK = LFXT1 (safe)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Bei den neueren MSP430F55xx nicht vergessen, dass bei CPU-Taktfrequenzen über 8 MHz vorher die Kernspannung erhöht werden muss, sonst drohen Abstürze oder „rätselhaftes“ Verhalten. Eins der TI-Beispiele (12 MHz) „vergisst“ das sogar.&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des ADCs ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_ADC(void)&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0 = ADC12ON;	// ADC12ON / reference on Avcc&lt;br /&gt;
  P6SEL |= 0x01;        // P6.0 ADC option select &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
unsigned int sampling_ADC(void)&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0 |= ADC12SC + ENC;   // Sampling open&lt;br /&gt;
  ADC12CTL0 &amp;amp;= ~ADC12SC;        // Sampling closed, start conversion&lt;br /&gt;
  while ((ADC12CTL1 &amp;amp; ADC12BUSY) == 1);   // ADC12BUSY?&lt;br /&gt;
  return(ADC12MEM0);	// return the value read from ADC P6.0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des DACs ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void init_DAC(void)&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0 = REF2_5V + REFON;              // Internal 2.5V ref on&lt;br /&gt;
  DAC12_0CTL = DAC12IR + DAC12AMP_5 + DAC12ENC;   // Internal ref gain &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void write_DAC(unsigned int val)&lt;br /&gt;
{&lt;br /&gt;
  DAC12_0DAT = val;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des Timers A ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_TimerA(unsigned int cycles )&lt;br /&gt;
{&lt;br /&gt;
  TACTL = TASSEL1 + TACLR;              // SMCLK, clear TAR&lt;br /&gt;
  CCTL0 = CCIE;                         // CCR0 interrupt enabled&lt;br /&gt;
  CCR0 = cycles;&lt;br /&gt;
  TACTL |= MC_2;                         // Start Timer_A in continuous mode&lt;br /&gt;
  _EINT();                              // interrupt enable&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Timer A0 interrupt service routine&lt;br /&gt;
interrupt (TIMERA0_VECTOR) Timer_A(void)&lt;br /&gt;
{&lt;br /&gt;
  P1OUT ^= 0x01;                        // Toggle P1.0&lt;br /&gt;
  CCR0 += 50000;                        // Add Offset to CCR0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des Timers B ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_TimerB(unsigned int cycles)&lt;br /&gt;
{&lt;br /&gt;
  TBCTL = TBSSEL1 + TBCLR;              // SMCLK, clear TAR&lt;br /&gt;
  TBCCTL0 = CCIE;                       // CCR0 interrupt enabled&lt;br /&gt;
  TBCCR0 = cycles;&lt;br /&gt;
  TBCTL |= MC_2;                         // Start Timer_B in continuous mode&lt;br /&gt;
  _EINT();                              // interrupt enable&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Timer B0 interrupt service routine&lt;br /&gt;
interrupt (TIMERB0_VECTOR) Timer_B(void)&lt;br /&gt;
{&lt;br /&gt;
  P1OUT ^= 0x01;                        // Toggle P1.0&lt;br /&gt;
  TBCCR0 += 50000;                      // Add Offset to CCR0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des Watchdogs ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_wdt(void)&lt;br /&gt;
{&lt;br /&gt;
  WDTCTL = WDT_MDLY_32;                 // Set Watchdog Timer interval to ~30ms&lt;br /&gt;
  IE1 |= WDTIE;                         // Enable WDT interrupt&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Watchdog Timer interrupt service routine&lt;br /&gt;
interrupt (WDT_VECTOR) watchdog_timer(void)&lt;br /&gt;
{&lt;br /&gt;
  // do this, in an case of an interrupt&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  WDTCTL = WDTPW + WDTHOLD;	// Watchdog anhalten&lt;br /&gt;
  P1DIR |= 0x01;		// P1.0 als Ausgang&lt;br /&gt;
&lt;br /&gt;
  for (;;)&lt;br /&gt;
  {&lt;br /&gt;
    volatile unsigned i;	// volatile, sonst wird die Warteschleife „wegoptimiert“&lt;br /&gt;
    P1OUT ^= 0x01;		// P1.0 umschalten mit Exklusiv-ODER&lt;br /&gt;
&lt;br /&gt;
    i = 10000;			// Warteschleife in Software&lt;br /&gt;
    do; while (--i);		// (CPU-Leistung „verheizen“)&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung der GPIO ==&lt;br /&gt;
Die Ein/Ausgabeleitungen haben beim MSP430, je nach Ausbaustufe, folgende Fähigkeiten:&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Einzeln (bitweise) programmierbare Ein/Ausgabe (&amp;lt;b&amp;gt;PxDIR&amp;lt;/b&amp;gt;, &amp;lt;b&amp;gt;PxOUT&amp;lt;/b&amp;gt;)&lt;br /&gt;
&amp;lt;li&amp;gt;Unabhängige Lese-Adresse (&amp;lt;b&amp;gt;PxIN&amp;lt;/b&amp;gt;)&lt;br /&gt;
&amp;lt;li&amp;gt;Ansprechbar als 8-Bit-Ports oder je paarweise als 16-bit-Port, bspw. P1 + P2 = PA usw.&lt;br /&gt;
&amp;lt;li&amp;gt;Interrupt auf Pegelwechsel einzelner Portpins (nur P1 und P2) (&amp;lt;b&amp;gt;PxIES&amp;lt;/b&amp;gt;)&lt;br /&gt;
&amp;lt;li&amp;gt;Pull-Up, Pull-Down oder kein Widerstand auswählbar (&amp;lt;b&amp;gt;PxREN&amp;lt;/b&amp;gt;, PxOUT)&lt;br /&gt;
&amp;lt;li&amp;gt;Einstellbare Treiberstärke (reduziert und voll) (&amp;lt;b&amp;gt;PxDS&amp;lt;/b&amp;gt;)&lt;br /&gt;
&amp;lt;li&amp;gt;Ein bis zwei Peripheriefunktionen pro Pin (&amp;lt;b&amp;gt;PxSEL&amp;lt;/b&amp;gt;), auswählbar mittels PxDIR (d.h. bei zwei Peripheriefunktionen ist eine Ausgang und die andere Eingang)&lt;br /&gt;
&amp;lt;li&amp;gt;Das JTAG-Port (4 Pins) und das USB-Port (2 Pins) ist standardmäßig ein E/A-Port (MSP430F55xx)&lt;br /&gt;
&amp;lt;li&amp;gt;Erweiterte Peripheriezuordnung bei P4 (MSP430F55xx) mittels Port Mapping Controller&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Nicht 5-V-verträglich!!&amp;lt;/b&amp;gt; Keinem Portpin darf ohne genügend großen Vorwiderstand 5 V angeboten werden. Ableitströme dürfen nicht zum Ansteigen der Speisespannung führen!&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Manche Portpins haben ein gemeinsames PxSEL, etwa:&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;das JTAG-Port (entweder alle 4 oder kein Pin zugeordnet)&lt;br /&gt;
&amp;lt;li&amp;gt;das USB-Port (entweder Portpin oder USB D+ und D–)&lt;br /&gt;
&amp;lt;li&amp;gt;die Quarz-Anschlüsse (das niederwertige PxSEL schaltet beide Portpins)&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle Portpins sind beim Einschalten (PUC) wie folgt initialisiert:&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Eingang ohne Pull-Up oder Pull-Down&lt;br /&gt;
&amp;lt;li&amp;gt;Reduzierte Treiberstärke&lt;br /&gt;
&amp;lt;li&amp;gt;Kein Pegelwechsel-Interrupt&lt;br /&gt;
&amp;lt;li&amp;gt;Keine Peripherie-Zuordnung&lt;br /&gt;
&amp;lt;li&amp;gt;Der Inhalt des Ausgaberegisters &amp;lt;b&amp;gt;PxOUT&amp;lt;/b&amp;gt; ist undefiniert!&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Alle ungenutzten Anschlüsse sollten per PullDown (&amp;lt;b&amp;gt;PxREN&amp;lt;/b&amp;gt; und &amp;lt;b&amp;gt;PxOUT&amp;lt;/b&amp;gt;) festgelegt werden.&lt;br /&gt;
&lt;br /&gt;
Kein MSP430 hat einen herausgeführten Busanschluss, etwa um mehr RAM anzubinden.&lt;br /&gt;
&lt;br /&gt;
== Initialisierung von PWM ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_PWM_TimerA(void)&lt;br /&gt;
{&lt;br /&gt;
  TACTL = TASSEL1 + TACLR;              // SMCLK, Clear Tar&lt;br /&gt;
  CCR0 = 512-1;                         // PWM Period&lt;br /&gt;
  CCTL1 = OUTMOD_7;                     // CCR1 reset/set&lt;br /&gt;
  P1DIR |= 0x04;                        // P1.2 PWM output&lt;br /&gt;
  P1SEL |= 0x04;                        // P1.2 and TA1/2 otions&lt;br /&gt;
  TACTL |= MC0;                         // Start Timer_A in up mode&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void set_PWM_duty_cycle(unsigned char duty)&lt;br /&gt;
{&lt;br /&gt;
  CCR1 = duty;                           // CCR1 PWM duty cycle &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= Interrupts: =&lt;br /&gt;
&lt;br /&gt;
== UARTs ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// z. B. ein Echo mit dem MSPGCC-Compiler:&lt;br /&gt;
interrupt (UART0RX_VECTOR) usart0_rx(void)&lt;br /&gt;
{&lt;br /&gt;
   TXBUF0=RXBUF0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// z. B. ein Echo mit dem ImageCraft ICC430-Compiler:&lt;br /&gt;
#pragma interrupt_handler usart0_rx:UART0RX_VECTOR&lt;br /&gt;
void usart0_rx(void)&lt;br /&gt;
{&lt;br /&gt;
   TXBUF0=RXBUF0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Die Funktionen selbst können natürlich auch anders genannt werden.&lt;br /&gt;
&lt;br /&gt;
== Timer ==&lt;br /&gt;
&lt;br /&gt;
== IOs ==&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= Softwareroutinen: =&lt;br /&gt;
&lt;br /&gt;
== I2C/TWI in Software ==&lt;br /&gt;
Diese Routinen wurden ursprünglich für einen MSP430F149 geschrieben. Es werden ausschließlich IOs benutzt. Da Code in C geschrieben wurde sollte er sich einfach auf alle MSP430s ohne (aber auch mit I²C) portieren lassen. Der ist zwar nicht ganz schön, aber er funktioniert soweit ganz gut. Auch ein Beispiel ist dabei.&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/attachment.php/324877/soft-i2c.zip&lt;br /&gt;
&lt;br /&gt;
== PWM ==&lt;br /&gt;
&lt;br /&gt;
Untenstehender Code ist nur mit msp320-gcc getestet.&lt;br /&gt;
&lt;br /&gt;
Folgende Routine initialisiert den Timer als Up-Counter mit der Clock-Quelle SMCLK und einem Teiler von 8. Zudem wird der Interrupt aktiviert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void timerA_init(void)&lt;br /&gt;
{&lt;br /&gt;
	TACTL =  TASSEL_SMCLK | TACLR | ID_DIV8 | TAIE;&lt;br /&gt;
	TACTL |= MC_UPTO_CCR0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um den Timer zu starten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void timerA_start(int timing[2], int mode)&lt;br /&gt;
{&lt;br /&gt;
	TACCTL0 = mode;&lt;br /&gt;
	TACCTL0 |= CCIE ;                // enable interrupt&lt;br /&gt;
	TACCTL1 = mode;&lt;br /&gt;
	TACCR0 = timing[0];&lt;br /&gt;
	TACCR1 = timing[1];&lt;br /&gt;
	TAR = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktion wird normalerweise mit &#039;mode&#039; 3 aufgerufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
timerA_start(timing, OUTMOD_SET_RESET);&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
timing[0] enthaelt die komplette Zyklendauer einer PWM-Phase (H und L)&lt;br /&gt;
Beispiel: Um eine Pulsfrequenz von 125 Hz bei einem SMCLK von 1.0 MHz zu erhalten, gilt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;timing_0 = 1.0e6 / 8 / 125 = 1000&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
timing[1] schliesslich enthält die Zyklendauer des H-Pulses und ist immer kleiner als timing[0]. Bei einem &#039;duty cycle&#039; (Tastverhältnis) 50% gilt also&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;timing_1 = 500&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zu beachten ist, dass der Timerkanal 0 bei manchen Modi (wie dem obenstehenden) für die PWM nicht genutzt wird, &amp;quot;TACCTL0 = mode&amp;quot; keinen speziellen Effekt zeigt (siehe auch Manual).&lt;br /&gt;
&lt;br /&gt;
Deswegen wird das PWM-Signal auch an TA1 abgegriffen, nicht an TA0.&lt;br /&gt;
&lt;br /&gt;
Schlussendlich muss der entsprechende Ausgangspin für TA1 konfiguriert werden. Beim F2013 z.&amp;amp;nbsp;B. geschieht dies für P1.2 per&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	P1SEL |= 0x04;  // Enable primary peripheral&lt;br /&gt;
	P1DIR |= 0x04;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was war nun mit dem Interrupt? Falls wir z.&amp;amp;nbsp;B. die Zyklen zählen wollen, definieren wir einen Interrupt-Handler:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;signal.h&amp;gt; // &#039;interrupt&#039; makro&lt;br /&gt;
interrupt (TIMERA0_VECTOR) timera0_isr(void)&lt;br /&gt;
{&lt;br /&gt;
	g_count++;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Schlussendlich müssen wir noch die Interrupts im Initialisierungscode aktivieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
_EINT();&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Senden eines Bytes ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void SendUSART0c(char c)             // ein einzelnes zeichen über die serielle schnittstelle (USART0) senden&lt;br /&gt;
                                     // FJG: Obacht: x12xx : IFG1 =&amp;gt; IFG2 !&lt;br /&gt;
{&lt;br /&gt;
  while (!(IFG1 &amp;amp; UTXIFG0));           // warten, bis USART0 TX-buffer sendebereit&lt;br /&gt;
  TXBUF0 = c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SendUSART1c(char c)             // ein einzelnes zeichen über die serielle schnittstelle (USART1) senden&lt;br /&gt;
{&lt;br /&gt;
  while (!(IFG2 &amp;amp; UTXIFG1));           // warten, bis USART1 TX-buffer sendebereit&lt;br /&gt;
  TXBUF1 = c;&lt;br /&gt;
}     &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Senden eines Strings ==&lt;br /&gt;
Nullterminierte Strings; zugehörige Interrupts dürfen nicht aktiviert sein&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void SendUSART0(const char* str)	// einen String über die serielle Schnittstelle (USART0) senden&lt;br /&gt;
{&lt;br /&gt;
  while (*str != 0)&lt;br /&gt;
  {&lt;br /&gt;
    while (!(IFG1 &amp;amp; UTXIFG0));		// warten bis USART0 TX-Puffer frei (leer)&lt;br /&gt;
    TXBUF0 = *str++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SendUSART1(const char* str)	// einen String über die serielle Schnittstelle (USART1) senden&lt;br /&gt;
{&lt;br /&gt;
  while (*str)&lt;br /&gt;
  {&lt;br /&gt;
    while (!(IFG2 &amp;amp; UTXIFG1));		// warten bis USART1 TX-Puffer frei (leer)&lt;br /&gt;
    TXBUF1 = *str++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Binärdaten mittels DMA (hier: DMA-Kanal 0 an UART1)&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void send(const void*buf, unsigned len) {&lt;br /&gt;
// könnte globaler Initialisierungskode sein:&lt;br /&gt;
 DMACTL0 = 0x000A;		// DMA-Kanal 0 dem UART1-TxD zuordnen&lt;br /&gt;
// genauer: DMACTL0 = DMACTL0 &amp;amp; 0xFFF0 | 0x000A;&lt;br /&gt;
 DMA0DA  = (unsigned)&amp;amp;U1TXBUF;	// Zieladresse ist der Sendepuffer&lt;br /&gt;
// hier aufrufspezifischer Kode:&lt;br /&gt;
 DMA0SA  = (unsigned)buf;	// Quelladresse sind die Sendedaten&lt;br /&gt;
 DMA0SZ  = len;			// Anzahl der Byte-Transfers&lt;br /&gt;
 DMA0CTL = 0x03F0;		// Start des Single-DMA-Transfers, byte-weise mit steigender Quelladresse&lt;br /&gt;
// Abwarten aufs Ende, könnte man vorteilhaft asynchron erledigen.&lt;br /&gt;
// In so einem Fall muss der Aufrufer &amp;lt;buf&amp;gt; beibehalten bis der DMA-Transfer beendet ist&lt;br /&gt;
 while (!(DMA0CTL&amp;amp;DMAIFG));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Beachte: Die Interruptfreigabe des UART priorisiert Interruptverarbeitung über DMA! Das kann man auch gezielt ausnutzen, um mal Interrupt- und mal DMA-Betrieb zu realisieren.&lt;br /&gt;
&lt;br /&gt;
Anmerkung: Der MSP430, insbesondere die F1xxx-Serie, hat für einen sonst AVR-verwöhnten Anwender vergleichsweise &#039;&#039;&#039;starke&#039;&#039;&#039; Peripherie und eine &#039;&#039;&#039;schwache&#039;&#039;&#039; CPU. Deshalb ist die Benutzung von DMA und eines günstigen Binärdatenübertragungsprotokolls essentiell für Hochgeschwindigkeitsanwendungen, bei denen man beim AVR noch gut mit Interrupts zurecht kam.&lt;br /&gt;
&lt;br /&gt;
== Empfangen eines Bytes (interruptgesteuert)  // Receiving a byte-&amp;gt; Interrupt controlled ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/*Hab diese Interrupt Funktion für meine I²C Kommunikation verwendet&lt;br /&gt;
Startcondition wird erkannt, aber nicht Stop, da man die Flanken(die den&lt;br /&gt;
interrupt auslösen) umkehren müsste, aber dann keine Startkondition erkannt werden kann.&lt;br /&gt;
&lt;br /&gt;
Hab mir jetzt nicht die mühe gemacht alles rauszupicken was ihr nicht braucht.&lt;br /&gt;
Wer sich auskennt, kann das auch selber machen.&lt;br /&gt;
&lt;br /&gt;
Das Busy wird fürs stretching verwendet(CLK wird auf low gezogen)&lt;br /&gt;
*/  &lt;br /&gt;
&lt;br /&gt;
#pragma vector = PORT1_VECTOR           // Port 1 - Interrupt-Funktions-&amp;quot;Alias&amp;quot;&lt;br /&gt;
__interrupt void Interrupt_Port1()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
//  I2CTransfer = 0;&lt;br /&gt;
&lt;br /&gt;
    TACTL |= TACLR;&lt;br /&gt;
    TACTL |= TAIE;&lt;br /&gt;
#ifdef WD&lt;br /&gt;
    WDTCTL = WDTPW + WDTCNTCL;&lt;br /&gt;
#endif&lt;br /&gt;
    &lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
  if ((P1IFG &amp;amp; 0x04) &amp;amp;&amp;amp; !(I2CCLK)) { //if startdataimpuls but clk low is detected --return--&lt;br /&gt;
    P1IFG &amp;amp;= ~0x0C;&lt;br /&gt;
    return;}&lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
//    P1IE &amp;amp;= ~0x0C;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
  if ((P1IFG &amp;amp; 0x04) &amp;amp;&amp;amp; I2CCLK)   //Start Condition       (I2CStart)&lt;br /&gt;
    {&lt;br /&gt;
      P1IFG &amp;amp;= ~0x0C;&lt;br /&gt;
      &lt;br /&gt;
//    I2CTransfer = 1;&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
        P1IE &amp;amp;= ~0x0C;&lt;br /&gt;
//        TACTL |= TACLR;&lt;br /&gt;
//        TACTL |= TAIE;&lt;br /&gt;
//        _EINT();&lt;br /&gt;
&lt;br /&gt;
      &lt;br /&gt;
/*#ifdef Debug&lt;br /&gt;
      P2OUT |= 0x04;&lt;br /&gt;
      P2DIR |= 0x04; &lt;br /&gt;
#endif*/&lt;br /&gt;
      &lt;br /&gt;
//      Wait(10);&lt;br /&gt;
//      while(I2CCLK)  {CheckTimer;}&lt;br /&gt;
&lt;br /&gt;
//      set_Busy;&lt;br /&gt;
  &lt;br /&gt;
      BitCnt = 0x01;&lt;br /&gt;
      ByteCnt = 0;&lt;br /&gt;
//      I2CByte = 0;&lt;br /&gt;
      StartCondition = 1;&lt;br /&gt;
//      CRCByte = 0x00;&lt;br /&gt;
      GetData = 0;&lt;br /&gt;
      I2CTransfer = 0;&lt;br /&gt;
    &lt;br /&gt;
//    clr_Busy;&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
        _DINT();&lt;br /&gt;
        P1IE |= 0x0C;&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
  P1IFG &amp;amp;= ~0x0C;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
    TACTL |= TACLR;&lt;br /&gt;
    _EINT();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
  if (I2CCLK)&lt;br /&gt;
  {&lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
      TACTL |= TAIE;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    I2CByte &amp;lt;&amp;lt;= 1; &lt;br /&gt;
    if (I2CDAT){&lt;br /&gt;
      I2CByte += 0x01;&lt;br /&gt;
     }&lt;br /&gt;
    I2CTransfer = 1;&lt;br /&gt;
    while(I2CCLK) {CheckTimer;}&lt;br /&gt;
    set_Busy;&lt;br /&gt;
    BitCnt &amp;lt;&amp;lt;= 1;&lt;br /&gt;
  &lt;br /&gt;
    if(!(BitCnt == 0x00))&lt;br /&gt;
    {&lt;br /&gt;
      clr_Busy;  &lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      _NOP();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
  }&lt;br /&gt;
//----------------------------------------------------------------------------  &lt;br /&gt;
&lt;br /&gt;
P1DIR &amp;amp;= ~0x0C;&lt;br /&gt;
P1IFG = 0x00;&lt;br /&gt;
P1IE |= 0x0C;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ermitteln der Temperatur ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// von FJG info@aqua-sun.net :&lt;br /&gt;
// ---------------   Temperatur des Chips   ---------------------&lt;br /&gt;
&lt;br /&gt;
#define T_Faktor_a1000       ((long)103)     // REF 1,5V&lt;br /&gt;
#define T_Faktor_b1000       ((long)172)     // REF 2,5V&lt;br /&gt;
#define T_Faktor_c1000       ((long)278000)&lt;br /&gt;
&lt;br /&gt;
int Hole_Temp(void)	// Temperatur ch 10&lt;br /&gt;
{			// Temp = N* 0,17193 -278  1000Temp = N*172 -278000 bei 2,5V&lt;br /&gt;
  long Temp_L;&lt;br /&gt;
  int  Temp , Delta ;&lt;br /&gt;
&lt;br /&gt;
  Start_AD();&lt;br /&gt;
&lt;br /&gt;
  Temp_L = ((long)ADC12MEM10 * T_Faktor_a1000) - T_Faktor_c1000 ;&lt;br /&gt;
  Temp   = (int)( Temp_L / 1000);&lt;br /&gt;
&lt;br /&gt;
  Delta = Read_EEPROM( EPROM_INTERN_BL1_R_ADR,DELTA_TEMP_ADR );	   // falls Temp Messung&lt;br /&gt;
  if( Delta &amp;lt;= 120 &amp;amp;&amp;amp; Delta &amp;gt;= 80 ) Delta -= 100 ; else Delta = 0; // ungenau war&lt;br /&gt;
                                                                   // siehe dazu TI&lt;br /&gt;
  return (Temp + Delta);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// INIT AD&lt;br /&gt;
// AD muss angestoßen werden mit :   Start_AD()&lt;br /&gt;
&lt;br /&gt;
// #define ADC12TL0WERT15	(SHT1_8 + SHT0_3 + MSC + REFON + ADC12ON)&lt;br /&gt;
#define ADC12TL0WERT15		(SHT1_3 + SHT0_3 + MSC + REFON + ADC12ON)&lt;br /&gt;
#define ADC12TL0WERT25		(SHT1_3 + SHT0_3 + MSC + +REF2_5V + REFON + ADC12ON)&lt;br /&gt;
&lt;br /&gt;
//                        Start CH0 , ADC12SCBIT , SampleT , F/2 , MCLK , Sequenze of CH&lt;br /&gt;
#define ADC12CTL1WERT   ( CSTARTADD_0 + SHS_0 + SHP + ADC12DIV_1 + ADC12SSEL_2 + CONSEQ_1 )&lt;br /&gt;
&lt;br /&gt;
void adc12_init()	// ADC12CTL0 modifizieren nur mit ENC = 0&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0   = 0x00;&lt;br /&gt;
  ADC12CTL1   = ADC12CTL1WERT ;&lt;br /&gt;
&lt;br /&gt;
  ADC12MCTL0  = INCH_0;                  &lt;br /&gt;
  ADC12MCTL1  = INCH_1;                  &lt;br /&gt;
  ADC12MCTL2  = INCH_2;&lt;br /&gt;
  ADC12MCTL3  = INCH_3;&lt;br /&gt;
  ADC12MCTL4  = INCH_4;&lt;br /&gt;
  ADC12MCTL5  = INCH_5;&lt;br /&gt;
  ADC12MCTL6  = INCH_6;&lt;br /&gt;
  ADC12MCTL7  = INCH_7;                  &lt;br /&gt;
  ADC12MCTL8  = INCH_8;		// VeREF+&lt;br /&gt;
  ADC12MCTL9  = INCH_9;		// VeREF-&lt;br /&gt;
&lt;br /&gt;
  ADC12MCTL10 = INCH_10 + SREF_1 ;&lt;br /&gt;
  ADC12MCTL11 = INCH_11 + SREF_1 +EOS;&lt;br /&gt;
&lt;br /&gt;
  ADC12IE     = 0x00;&lt;br /&gt;
  ADC12CTL0   = ADC12TL0WERT15 ;&lt;br /&gt;
  ADC12CTL0  |= 0x0003;		// ENC + ADC12SC = Enable Conversation + StartConversation&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------   Diverses AD_Wandler   --------------------&lt;br /&gt;
&lt;br /&gt;
void Start_AD(void)&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0 &amp;amp;= ~ENC;&lt;br /&gt;
  ADC12CTL0 |= (ADC12SC+ENC);&lt;br /&gt;
  NOP();&lt;br /&gt;
  NOP();&lt;br /&gt;
  ADC12CTL0 &amp;amp;=~ADC12SC;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#ifndef TEST_AD&lt;br /&gt;
#define Ist_AD_Busy()        ( ADC12CTL1 &amp;amp; ADC12BUSY )&lt;br /&gt;
#else&lt;br /&gt;
int Ist_AD_Busy()&lt;br /&gt;
{&lt;br /&gt;
  if (ADC12CTL1 &amp;amp; ADC12BUSY)&lt;br /&gt;
  {&lt;br /&gt;
     printf(&amp;quot;\n\r... BUSY ...&amp;quot;); &lt;br /&gt;
     delay_ms(500);&lt;br /&gt;
     return(1);&lt;br /&gt;
  }&lt;br /&gt;
  return(0);&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ansteuerung eines LCD &amp;amp;#8211; Zeichendisplays // Controlling the LCD character==&lt;br /&gt;
&lt;br /&gt;
Der folgende Quelltext-Schnipsel ist für Siebensegmentanzeigen gedacht,&lt;br /&gt;
&#039;&#039;nicht&#039;&#039; für die mit dem HD44780-kompatiblen Controller.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
  // hier nun der vollständige Code 14 Jan 08&lt;br /&gt;
  // von mir seinerseits entwickelt, ich hoffe, er ist eine Hilfe&lt;br /&gt;
 &lt;br /&gt;
  // Aquasun Germany  Remscheid  Franz-Josef Günther&lt;br /&gt;
  // Development info@aqua-sun.net&lt;br /&gt;
&lt;br /&gt;
  // LCD.h Header für Allgemeines zum LCD ab 02.12.04 Aquasun GUE&lt;br /&gt;
  // C-Compiler ICC&lt;br /&gt;
&lt;br /&gt;
  // -------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
  // Beispiel :&lt;br /&gt;
&lt;br /&gt;
int Aepfel = 8;&lt;br /&gt;
&lt;br /&gt;
print_LCD(&amp;quot;\nRotkaepchen hat %d Aepfel im Korb&amp;quot;,Aepfel);&lt;br /&gt;
&lt;br /&gt;
  // -------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;_const.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdarg.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt; STRING.H&amp;gt;&lt;br /&gt;
#include &amp;lt; stdio.h &amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LCD_MAX          8&lt;br /&gt;
#define Mem_LCD         16&lt;br /&gt;
&lt;br /&gt;
#ifndef Mem_LCD&lt;br /&gt;
#define Mem_LCD 20&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
    Header für 8 x 7 Segmentanzeigen 2 MUX MSP430 x4xx&lt;br /&gt;
&lt;br /&gt;
    V3 = V1 (VDD) , V5 = 0 ,&lt;br /&gt;
&lt;br /&gt;
    für : LCD siehe TI Info dazu,&lt;br /&gt;
    für : LED&#039;s :&lt;br /&gt;
&lt;br /&gt;
    LED mit gemeinsamer Kathode, SP über Buffer 74HC245 (8x) o.ä.&lt;br /&gt;
    /G=L , DIR=H A ==&amp;gt; B an 5V , COM mit Emitterfolger PNP ViL=0,8V ViH=2V&lt;br /&gt;
&lt;br /&gt;
    LED mit gemeinsamer Anode, COM über PNP Transistor invertiert&lt;br /&gt;
    und SP über ULN2804(8x) getrieben&lt;br /&gt;
            _   ___   ___   ___&lt;br /&gt;
    COM0 :   |_|   |_|   |_|&lt;br /&gt;
            ____   ___   ___&lt;br /&gt;
    COM1 :      |_|   |_|   |_|&lt;br /&gt;
             __    __    __&lt;br /&gt;
    SPon :  |  |__|  |__|  |__| mit COM0&lt;br /&gt;
&lt;br /&gt;
    SPin :   0  1  2  3  4  5  6  7    8  9 10 11 12 13 14 15&lt;br /&gt;
    COM0 :  1a 1b 1c 1d 1e 1f 1g 1h   2a 2b 2c 2d 2e 2f 2g 2h&lt;br /&gt;
    COM1 :  5a 5b 5c 5d 5e 5f 5g 5h   6a 6b 6c 6d 6e 6f 6g 6h&lt;br /&gt;
&lt;br /&gt;
    SPin :  16 17 18 19 20 21 22 23   24 25 26 27 28 29 30 31&lt;br /&gt;
    COM0 :  3a 3b 3c 3d 3e 3f 3g 3h   4a 4b 4c 4d 4e 4f 4g 4h&lt;br /&gt;
    COM1 :  7a 7b 7c 7d 7e 7f 7g 7h   8a 8b 8c 8d 8e 8f 8g 8h&lt;br /&gt;
&lt;br /&gt;
    COM        3 2   1  0   3 2   1  0&lt;br /&gt;
    MAP 0A0    - -   8h 4h  - -   8g 4g&lt;br /&gt;
        09F    - -   8f 4f  - -   8e 4e&lt;br /&gt;
        09E    - -   8d 4d  - -   8c 4c&lt;br /&gt;
        09D    - -   8b 4b  - -   8a 4a&lt;br /&gt;
&lt;br /&gt;
        09C    - -   7h 3h  - -   7g 3g&lt;br /&gt;
        09B    - -   7f 3f  - -   7e 3e&lt;br /&gt;
        09A    - -   7d 3d  - -   7c 3c&lt;br /&gt;
        099    - -   7b 3b  - -   7a 3a&lt;br /&gt;
&lt;br /&gt;
        098    - -   6h 2h  - -   6g 2g&lt;br /&gt;
        097    - -   6f 2f  - -   6e 2e&lt;br /&gt;
        096    - -   6d 2d  - -   6c 2c&lt;br /&gt;
        095    - -   6b 2b  - -   6a 2a&lt;br /&gt;
&lt;br /&gt;
        094    - -   5h 1h  - -   5g 1g&lt;br /&gt;
        093    - -   5f 1f  - -   5e 1e&lt;br /&gt;
        092    - -   5d 1d  - -   5c 1c&lt;br /&gt;
        091    - -   5b 1b  - -   5a 1a&lt;br /&gt;
&lt;br /&gt;
             ---a----&lt;br /&gt;
            |        |&lt;br /&gt;
          f |        | b&lt;br /&gt;
            |        |&lt;br /&gt;
             ---g----&lt;br /&gt;
            |        |&lt;br /&gt;
          e |        | c&lt;br /&gt;
            |        |    _&lt;br /&gt;
              ---d---    | | h&lt;br /&gt;
                          -&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
#define a0      0x01  // Char durch rechtsschiften &amp;amp; 0x..&lt;br /&gt;
#define b0      0x10&lt;br /&gt;
#define c0      0x02&lt;br /&gt;
#define d0      0x20&lt;br /&gt;
#define e0      0x04&lt;br /&gt;
#define f0      0x40&lt;br /&gt;
#define g0      0x08&lt;br /&gt;
#define h0      0x80&lt;br /&gt;
&lt;br /&gt;
#define ch_0    ( e0+f0+a0+b0+c0+d0 )&lt;br /&gt;
#define ch_1    ( b0+c0 )&lt;br /&gt;
#define ch_2    ( a0+b0+g0+e0+d0 )&lt;br /&gt;
#define ch_3    ( a0+b0+g0+c0+d0 )&lt;br /&gt;
#define ch_4    ( f0+g0+b0+c0 )&lt;br /&gt;
#define ch_5    ( a0+f0+g0+c0+d0 )&lt;br /&gt;
#define ch_6    ( a0+f0+c0+d0+e0+g0 )&lt;br /&gt;
#define ch_7    ( a0+b0+c0 )&lt;br /&gt;
#define ch_8    ( a0+b0+c0+d0+e0+f0+g0 )&lt;br /&gt;
#define ch_9    ( a0+b0+c0+f0+g0 )&lt;br /&gt;
&lt;br /&gt;
#define ch_a    ( a0+b0+c0+d0+e0+g0 )&lt;br /&gt;
#define ch_A    ( e0+f0+a0+b0+c0+g0 )&lt;br /&gt;
#define ch_B    ( a0+b0+c0+d0+e0+f0+g0 )&lt;br /&gt;
#define ch_b    ( f0+e0+d0+c0+g0 )&lt;br /&gt;
#define ch_c    ( g0+e0+d0 )&lt;br /&gt;
#define ch_C    ( a0+f0+e0+d0 )&lt;br /&gt;
#define ch_d    ( b0+c0+d0+e0+g0 )&lt;br /&gt;
#define ch_D    ( e0+f0+a0+b0+c0+d0 )&lt;br /&gt;
#define ch_e    ( f0+e0+d0+a0+b0+g0 )&lt;br /&gt;
#define ch_E    ( a0+f0+g0+d0+e0 )&lt;br /&gt;
#define ch_F    ( a0+f0+g0+e0 )&lt;br /&gt;
#define ch_G    ( a0+f0+c0+d0+e0+g0 )&lt;br /&gt;
#define ch_g    ( a0+b0+c0+d0+f0+g0 )&lt;br /&gt;
#define ch_h    ( f0+c0+e0+g0 )&lt;br /&gt;
#define ch_H    ( f0+c0+e0+g0+b0 )&lt;br /&gt;
#define ch_I    ( f0+e0 )&lt;br /&gt;
#define ch_i    ( e0 )&lt;br /&gt;
#define ch_k    ( b0+e0+f0+g0 )&lt;br /&gt;
#define ch_L    ( f0+e0+d0 )&lt;br /&gt;
#define ch_l    ( b0+c0 )&lt;br /&gt;
#define ch_M    ( c0+b0+e0+f0 )&lt;br /&gt;
&lt;br /&gt;
#define ch_n    ( e0+g0+c0 )&lt;br /&gt;
#define ch_N    ( a0+b0+c0+e0+f0 )&lt;br /&gt;
#define ch_o    ( e0+g0+c0+d0 )&lt;br /&gt;
#define ch_O    ( e0+f0+a0+b0+c0+d0 )&lt;br /&gt;
#define ch_P    ( e0+f0+a0+b0+g0 )&lt;br /&gt;
#define ch_r    ( g0+e0 )&lt;br /&gt;
#define ch_S    ( a0+f0+g0+c0+d0 )&lt;br /&gt;
#define ch_T    ( a0+f0+e0 )&lt;br /&gt;
#define ch_U    ( f0+e0+d0+c0+b0 )&lt;br /&gt;
#define ch_u    ( e0+d0+c0 )&lt;br /&gt;
#define ch_X    ( b0+g0+e0 )&lt;br /&gt;
#define ch_Y    ( f0+g0+b0+c0+d0 )&lt;br /&gt;
#define ch_Z    ( a0+b0+g0+e0+d0 )&lt;br /&gt;
#define ch_Blank  0&lt;br /&gt;
#define Unter_  ( d0 )&lt;br /&gt;
#define DP_Pkt  ( h0 )&lt;br /&gt;
#define Minus   ( g0 )&lt;br /&gt;
#define Tilde   ( a0+g0+d0 )&lt;br /&gt;
#define GLEICH  ( g0+d0 )&lt;br /&gt;
#define FRAGE   ( a0+f0+g0+c0+d0+h0 )&lt;br /&gt;
&lt;br /&gt;
// #define Digi_X1ste         LCDM17       // die erste freie LCD_Mem_Stelle 18,19,20&lt;br /&gt;
                                           // in lcd_init() auf 0&lt;br /&gt;
&lt;br /&gt;
// extern unsigned int Digi_X;             // für LCD&lt;br /&gt;
&lt;br /&gt;
const char  letter[] = &amp;quot;0123456789 _.-~?=AaBbCcDdEeFGgHhIiKkLlMmNnOoPRrSsTtUuxXYyZz&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
const int hex_Wert[] = {&lt;br /&gt;
      ch_0,    ch_1, ch_2, ch_3, ch_4, ch_5, ch_6, ch_7, ch_8, ch_9,&lt;br /&gt;
      ch_Blank, Unter_, DP_Pkt, Minus, Tilde, FRAGE , GLEICH ,&lt;br /&gt;
      ch_A, ch_a, ch_B, ch_b, ch_C, ch_c, ch_D, ch_d, ch_E, ch_e, ch_F, ch_G, ch_g,&lt;br /&gt;
      ch_H, ch_h, ch_I, ch_i, ch_k, ch_k, ch_L, ch_l , ch_M, ch_M, ch_N, ch_n, ch_O, ch_o,&lt;br /&gt;
      ch_P, ch_r, ch_r, ch_S, ch_S, ch_T, ch_T, ch_U, ch_u, ch_X, ch_X,&lt;br /&gt;
      ch_Y, ch_Y, ch_Z , ch_Z  };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void All_LCD(void);&lt;br /&gt;
void Clear_LCD_M(void);                     // Clears LCD memory&lt;br /&gt;
void Clear_LCD(void);&lt;br /&gt;
void lcd_init(void); in ini&lt;br /&gt;
void Write_LCD_Hex(int Digit_n , int HEX_Zeichen);&lt;br /&gt;
void SetzeDP( int welches_Displ);&lt;br /&gt;
int putchar_LCD(char);&lt;br /&gt;
int print_LCD(CONST char *fmt, ...)  ;      // LCD 1-7 Digit nur realisiert sonst 1...11&lt;br /&gt;
extern int _print(void (*_put)(char), const char *fmt, va_list va);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void Clear_LCD_M(void)&lt;br /&gt;
{&lt;br /&gt;
    int i;&lt;br /&gt;
    for (i =0; i&amp;lt;Mem_LCD; i++) LCDMEM[i] = 0;   // Mem_LCD extern , abhängig vom Display&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void Clear_LCD(void)&lt;br /&gt;
{&lt;br /&gt;
      print_LCD(&amp;quot;\n_&amp;quot;);                     // beim Cursor wird DIGIT_X nicht weitergezählt&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void All_LCD(void)                          // alle = 8888..&lt;br /&gt;
{&lt;br /&gt;
    int i;&lt;br /&gt;
    for (i=0; i&amp;lt;Mem_LCD; i++) LCDMEM[i] = 0xFF;   // Mem_LCD extern , abhängig vom Display&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
int putchar_LCD(char c_in)&lt;br /&gt;
{&lt;br /&gt;
                                            //  Digi_X  == LCDM17&lt;br /&gt;
    int i, leng;&lt;br /&gt;
    char c = c_in;&lt;br /&gt;
    leng = strlen(letter);                  // Länge ohne /0 , 1..&lt;br /&gt;
&lt;br /&gt;
      if( (c==&#039;\n&#039;) || (c==&#039;\r&#039;))           // nichts gefunden =&amp;gt; CLR_Displ&lt;br /&gt;
        {&lt;br /&gt;
          Digi_X =1;  Clear_LCD_M(); return c;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    for(i=0;i&amp;lt;leng;i++) { if( c == letter[i] ) break; }        // Char gefunden&lt;br /&gt;
&lt;br /&gt;
    if(i == leng)&lt;br /&gt;
      {&lt;br /&gt;
        for(i=0;i&amp;lt;leng;i++) { if( &#039; &#039; == letter[i] ) break; }  // Char &#039; &#039; als Ersatz&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    if(i&amp;lt;leng)                              // es gibt &#039;.&#039; als Ersatz&lt;br /&gt;
      {&lt;br /&gt;
        Write_LCD_Hex((int)Digi_X , i);     // Digi beschreiben oder löschen&lt;br /&gt;
                                            // if(Digi_X) Write_LCD_Hex(Digi_X , i);&lt;br /&gt;
        if(C != &#039;_&#039;)Digi_X++;&lt;br /&gt;
        if(Digi_X &amp;gt; LCD_MAX) Digi_X =1;     // if(Digi_X &amp;gt;= Mem_LCD) Digi_X =1;&lt;br /&gt;
      }&lt;br /&gt;
    return c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
int print_LCD(CONST char *fmt, ...)&lt;br /&gt;
{&lt;br /&gt;
    va_list va;&lt;br /&gt;
    int val;&lt;br /&gt;
&lt;br /&gt;
    va_start(va, fmt);&lt;br /&gt;
    val = _print((void (*)(char))putchar_LCD, fmt, va);&lt;br /&gt;
    va_end(va);&lt;br /&gt;
&lt;br /&gt;
    return val;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
   // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void lcd_init(void)             // LCD init&lt;br /&gt;
{&lt;br /&gt;
 LCDCTL=0xAD;                   // LCDM567.2,LCDM567.0,LCDM234.1,LCDM234.0,LCDM0&lt;br /&gt;
 LCDM1 =0x00;                   // 0xAD = 101 01 101&lt;br /&gt;
 LCDM2 =0x00;                   // 101 = LCDP2 ,0, LCDP0 =&amp;gt; S0..S31&lt;br /&gt;
 LCDM3 =0x00;                   //  01 = LCDMX1,LCDMX0   =&amp;gt; 2-mux&lt;br /&gt;
 LCDM4 =0x00;                   // 101 = LCDSON,x,LCDON Segments ON ,x,LCD ON&lt;br /&gt;
 LCDM5 =0x00;&lt;br /&gt;
 LCDM6 =0x00; LCDM7 =0x00; LCDM8 =0x00; LCDM9 =0x00; LCDM10 =0x00;LCDM11 =0x00;&lt;br /&gt;
 LCDM12=0x00; LCDM13=0x00; LCDM14=0x00; LCDM15=0x00; LCDM16=0x00; LCDM17=0x00;&lt;br /&gt;
 LCDM18=0x00; LCDM19=0x00; LCDM20=0x00;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
   // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void Write_LCD_Hex(int Digit_n , int char_Nr)   // Digit1 bis 4 und 5 bis 8&lt;br /&gt;
{&lt;br /&gt;
  int i ,i_End , ch , Maske_loesch , Maske_setz ;&lt;br /&gt;
&lt;br /&gt;
  if((Digit_n == 0 ) || (Digit_n &amp;gt; LCD_MAX))&lt;br /&gt;
    {&lt;br /&gt;
        Clear_LCD_M(); i=0;&lt;br /&gt;
    }&lt;br /&gt;
   else i= (Digit_n - 1);                   // Startadresse = Digit_n x4 siehe unten&lt;br /&gt;
&lt;br /&gt;
  if(Digit_n &amp;lt; (LCD_MAX/2+1))               // Digit 1 ... 4 , i 0...3&lt;br /&gt;
    {&lt;br /&gt;
        Maske_setz   = 0x0011;&lt;br /&gt;
        Maske_loesch = 0x00FF - Maske_setz ;&lt;br /&gt;
        ch           = hex_Wert[char_Nr];&lt;br /&gt;
    } else                                  // Digit 5 ... 8&lt;br /&gt;
    {&lt;br /&gt;
        Maske_setz   = 0x0022;&lt;br /&gt;
        Maske_loesch = 0x00FF - Maske_setz ;&lt;br /&gt;
        ch           = hex_Wert[char_Nr] &amp;lt;&amp;lt; 1;&lt;br /&gt;
        i           -= (LCD_MAX/2) ;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  i &amp;lt;&amp;lt;= 2; i_End = i +4;                    // Berechnung der Start- und End -adresse&lt;br /&gt;
&lt;br /&gt;
  for(; i &amp;lt; i_End;i++)&lt;br /&gt;
    {&lt;br /&gt;
       LCDMEM[i] &amp;amp;= Maske_loesch;&lt;br /&gt;
       LCDMEM[i] |= ( ch &amp;amp; Maske_setz );&lt;br /&gt;
       ch &amp;gt;&amp;gt;=1;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
  // -----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
void SetzeDP( int welches_Displ)          // Displ 8 , 7 , 6 ...&lt;br /&gt;
{&lt;br /&gt;
  int i , i1;&lt;br /&gt;
    for (i=0,i1=1;i&amp;lt;8;i++,i1 &amp;lt;&amp;lt;=1)&lt;br /&gt;
      {&lt;br /&gt;
        if(welches_Displ &amp;amp; i1)&lt;br /&gt;
        switch(i)&lt;br /&gt;
         {&lt;br /&gt;
           case 0 : LCDM4  |= 0x10; break;&lt;br /&gt;
           case 1 : LCDM8  |= 0x10; break;&lt;br /&gt;
           case 2 : LCDM12 |= 0x10; break;&lt;br /&gt;
           case 3 : LCDM16 |= 0x10; break;&lt;br /&gt;
           case 4 : LCDM4  |= 0x20; break;&lt;br /&gt;
           case 5 : LCDM8  |= 0x20; break;&lt;br /&gt;
           case 6 : LCDM12 |= 0x20; break;&lt;br /&gt;
           case 7 : LCDM16 |= 0x20; break;&lt;br /&gt;
           default: break;&lt;br /&gt;
         }&lt;br /&gt;
      }  // for&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
  // ------------------  ENDE  ----------------------&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
[[Kategorie:MSP430]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=MSP430_Codebeispiele&amp;diff=61403</id>
		<title>MSP430 Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=MSP430_Codebeispiele&amp;diff=61403"/>
		<updated>2011-11-03T09:53:17Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Senden eines Strings */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;MSP430 &amp;amp;#8211; Codebeispiele&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Einleitung:&#039;&#039;&#039;&lt;br /&gt;
Da der MSP430 eine sehr schöner Mikrocontroller für energiesparende Anwendungen ist, jedoch bei weitem nicht so verbreitet wie z.&amp;amp;nbsp;B. diverse 8051er, AVRs, PICs usw. ist, gibt es auch nicht all zu viele Codebeispiele aus Projekten für den/die Hobbybastler(in).&lt;br /&gt;
Aus diesem Grund werden hier Grundlagen der Initialisierung diverser Hardwarefeatures sowie grundlegende Softwareroutinen und dergleichen beschrieben, so dass für Anfänger auch ein einfaches Copy&amp;amp;Paste möglich ist.&lt;br /&gt;
Hierbei kommt der MSPGCC zum Einsatz, da eine professionelle unlimitierte Ausgabe des z.&amp;amp;nbsp;B. IAR für Bastler nahezu unbezahlbar ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Hardware =&lt;br /&gt;
&lt;br /&gt;
== Initializing/ Configuring UARTs ==&lt;br /&gt;
Von www.mathar.com stammt diese Routine zur initialisierung eines beliebigen UARTS. Zusätzlich müssen jedoch die Pins noch definiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void InitUSART(char USART0, char USART1, unsigned int baudrate1, unsigned int baudrate2, char IR0, char IR1)&lt;br /&gt;
{&lt;br /&gt;
  if (USART0) ME1 |= UTXE0 + URXE0;    // falls gesetzt, USART0 einschalten (TX- und RX-teil)&lt;br /&gt;
  if (USART1) ME2 |= UTXE1 + URXE1;    // falls gesetzt, USART1 einschalten (TX- und RX-teil)&lt;br /&gt;
  UCTL0 |= CHAR;                       // 8 data bits, 1 stop bit, no parity (8N1)&lt;br /&gt;
  UCTL1 |= CHAR;&lt;br /&gt;
  UTCTL0 |= SSEL1;                     // SMCLK als UCLK festlegen&lt;br /&gt;
  UTCTL1 |= SSEL1;&lt;br /&gt;
  if (baudrate1==19200)&lt;br /&gt;
  {&lt;br /&gt;
    UBR00 = 0xA0;                      // 19200 baud aus 8 MHz erzeugen&lt;br /&gt;
    UBR10 = 0x01;                      // siehe application note tabelle 1, seite 9&lt;br /&gt;
    UMCTL0 = 0x00;                     // keine korrektur der division noetig&lt;br /&gt;
  }&lt;br /&gt;
  if (baudrate2==19200)&lt;br /&gt;
  {&lt;br /&gt;
    UBR01 = 0xA0;                      // 19200 baud aus 8 MHz erzeugen&lt;br /&gt;
    UBR11 = 0x01;                      // siehe application note tabelle 1, seite 9&lt;br /&gt;
    UMCTL1 = 0x00;                     // keine korrektur der division noetig&lt;br /&gt;
  }&lt;br /&gt;
  if (USART0) UCTL0 &amp;amp;= ~SWRST;         // USART freigeben&lt;br /&gt;
  if (USART1) UCTL1 &amp;amp;= ~SWRST;&lt;br /&gt;
  if (IR0==0) IE1 |= URXIE0;           // IR0: 0 -&amp;gt; nur RX-interrupt anschalten&lt;br /&gt;
  if (IR0==1) IE1 |= UTXIE0;           //      1 -&amp;gt; nur TX-interrupt anschalten&lt;br /&gt;
  if (IR0==2) IE1 |= URXIE0 + UTXIE0;  //      2 -&amp;gt; TX- und RX-interrupt anschalten&lt;br /&gt;
  if (IR1==1||IR1==2) IFG1 &amp;amp;= ~UTXIFG0;  // initales interrupt-flag loeschen&lt;br /&gt;
  if (IR1==0) IE2 |= URXIE1;           // IR1: 0 -&amp;gt; nur RX-interrupt anschalten&lt;br /&gt;
  if (IR1==1) IE2 |= UTXIE1;           //      1 -&amp;gt; nur TX-interrupt anschalten&lt;br /&gt;
  if (IR1==2) IE2 |= URXIE1 + UTXIE1;  //      2 -&amp;gt; TX- und RX-interrupt anschalten&lt;br /&gt;
  if (IR1==1||IR1==2) IFG1 &amp;amp;= ~UTXIFG1;  // initales interrupt-flag loeschen&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialization/configuration of USART (SPI and I2C/TWI) ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_spi(void)&lt;br /&gt;
{&lt;br /&gt;
  ME1 |= USPIE0;                        // Enable USART0 SPI mode&lt;br /&gt;
  UTCTL0 = CKPH+SSEL1+SSEL0+STC;        // SMCLK, 3-pin mode&lt;br /&gt;
  UCTL0 = CHAR+SYNC+MM;                 // 8-bit SPI Master **SWRST**&lt;br /&gt;
  UBR00 = 0x02;                         // UCLK/2 &lt;br /&gt;
  UBR10 = 0x00;                         // 0&lt;br /&gt;
  UMCTL0 = 0x00;                        // no modulation&lt;br /&gt;
  P3SEL |= 0x0E;                        // P3.1-3 SPI option select&lt;br /&gt;
  P3DIR |= 0x01;                        // P3.0 output direction&lt;br /&gt;
  _EINT();                              // Enable interrupts&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void init_i2c(unsigned char slave)&lt;br /&gt;
{&lt;br /&gt;
  P3SEL |= 0x0a;                            // Assign I2C pins to module&lt;br /&gt;
  U0CTL |= I2C + SYNC;                      // Switch USART0 to I2C mode&lt;br /&gt;
  U0CTL &amp;amp;= ~I2CEN;                          // Recommended I2C init procedure&lt;br /&gt;
  I2CTCTL = I2CSSEL_2;                      // SMCLK&lt;br /&gt;
  I2CSCLH = 0x03;                           // High period of SCL&lt;br /&gt;
  I2CSCLL = 0x03;                           // Low period of SCL&lt;br /&gt;
  I2CNDAT = 0x01;                           // Transmit one byte&lt;br /&gt;
  I2CSA = slave;                             // Slave address&lt;br /&gt;
  U0CTL |= I2CEN;                           // Enable I2C, 7 bit addr,&lt;br /&gt;
  I2CIE = RXRDYIE;                          // I2C receive ready interrupt enable&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung der Quarze ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_XT2(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned int i;&lt;br /&gt;
  WDTCTL = WDTPW + WDTHOLD;             // Stop WDT&lt;br /&gt;
  BCSCTL1 &amp;amp;= ~XT2OFF;                   // XT2 = HF XTAL&lt;br /&gt;
  do &lt;br /&gt;
  {&lt;br /&gt;
    IFG1 &amp;amp;= ~OFIFG;                       // Clear OSCFault flag&lt;br /&gt;
    for (i = 0xFF; i &amp;gt; 0; i--);           // Time for flag to set&lt;br /&gt;
  }&lt;br /&gt;
  while ((IFG1 &amp;amp; OFIFG) != 0);          // OSCFault flag still set?                &lt;br /&gt;
  BCSCTL2 |= SELM1;                     // MCLK = XT2 (safe)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_XT(void) // high frequenz resonators ( 455 kHz - 8MhZ )&lt;br /&gt;
{&lt;br /&gt;
  unsigned int i;&lt;br /&gt;
  WDTCTL = WDTPW + WDTHOLD;             // Stop WDT&lt;br /&gt;
  BCSCTL1 |= XTS;                       // ACLK = LFXT1 = HF XTAL&lt;br /&gt;
  do &lt;br /&gt;
  {&lt;br /&gt;
    IFG1 &amp;amp;= ~OFIFG;                       // Clear OSCFault flag&lt;br /&gt;
    for (i = 0xFF; i &amp;gt; 0; i--);           // Time for flag to set&lt;br /&gt;
  }&lt;br /&gt;
  while ((IFG1 &amp;amp; OFIFG) == OFIFG);      // OSCFault flag still set?                &lt;br /&gt;
  BCSCTL2 |= SELM1+SELM0;               // MCLK = LFXT1 (safe)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Bei den neueren MSP430F55xx nicht vergessen, dass bei CPU-Taktfrequenzen über 8 MHz vorher die Kernspannung erhöht werden muss, sonst drohen Abstürze oder „rätselhaftes“ Verhalten. Eins der TI-Beispiele (12 MHz) „vergisst“ das sogar.&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des ADCs ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_ADC(void)&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0 = ADC12ON;	// ADC12ON / reference on Avcc&lt;br /&gt;
  P6SEL |= 0x01;        // P6.0 ADC option select &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
unsigned int sampling_ADC(void)&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0 |= ADC12SC + ENC;   // Sampling open&lt;br /&gt;
  ADC12CTL0 &amp;amp;= ~ADC12SC;        // Sampling closed, start conversion&lt;br /&gt;
  while ((ADC12CTL1 &amp;amp; ADC12BUSY) == 1);   // ADC12BUSY?&lt;br /&gt;
  return(ADC12MEM0);	// return the value read from ADC P6.0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des DACs ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void init_DAC(void)&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0 = REF2_5V + REFON;              // Internal 2.5V ref on&lt;br /&gt;
  DAC12_0CTL = DAC12IR + DAC12AMP_5 + DAC12ENC;   // Internal ref gain &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void write_DAC(unsigned int val)&lt;br /&gt;
{&lt;br /&gt;
  DAC12_0DAT = val;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des Timers A ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_TimerA(unsigned int cycles )&lt;br /&gt;
{&lt;br /&gt;
  TACTL = TASSEL1 + TACLR;              // SMCLK, clear TAR&lt;br /&gt;
  CCTL0 = CCIE;                         // CCR0 interrupt enabled&lt;br /&gt;
  CCR0 = cycles;&lt;br /&gt;
  TACTL |= MC_2;                         // Start Timer_A in continuous mode&lt;br /&gt;
  _EINT();                              // interrupt enable&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Timer A0 interrupt service routine&lt;br /&gt;
interrupt (TIMERA0_VECTOR) Timer_A(void)&lt;br /&gt;
{&lt;br /&gt;
  P1OUT ^= 0x01;                        // Toggle P1.0&lt;br /&gt;
  CCR0 += 50000;                        // Add Offset to CCR0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des Timers B ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_TimerB(unsigned int cycles)&lt;br /&gt;
{&lt;br /&gt;
  TBCTL = TBSSEL1 + TBCLR;              // SMCLK, clear TAR&lt;br /&gt;
  TBCCTL0 = CCIE;                       // CCR0 interrupt enabled&lt;br /&gt;
  TBCCR0 = cycles;&lt;br /&gt;
  TBCTL |= MC_2;                         // Start Timer_B in continuous mode&lt;br /&gt;
  _EINT();                              // interrupt enable&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Timer B0 interrupt service routine&lt;br /&gt;
interrupt (TIMERB0_VECTOR) Timer_B(void)&lt;br /&gt;
{&lt;br /&gt;
  P1OUT ^= 0x01;                        // Toggle P1.0&lt;br /&gt;
  TBCCR0 += 50000;                      // Add Offset to CCR0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des Watchdogs ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_wdt(void)&lt;br /&gt;
{&lt;br /&gt;
  WDTCTL = WDT_MDLY_32;                 // Set Watchdog Timer interval to ~30ms&lt;br /&gt;
  IE1 |= WDTIE;                         // Enable WDT interrupt&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Watchdog Timer interrupt service routine&lt;br /&gt;
interrupt (WDT_VECTOR) watchdog_timer(void)&lt;br /&gt;
{&lt;br /&gt;
  // do this, in an case of an interrupt&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  WDTCTL = WDTPW + WDTHOLD;	// Watchdog anhalten&lt;br /&gt;
  P1DIR |= 0x01;		// P1.0 als Ausgang&lt;br /&gt;
&lt;br /&gt;
  for (;;)&lt;br /&gt;
  {&lt;br /&gt;
    volatile unsigned i;	// volatile, sonst wird die Warteschleife „wegoptimiert“&lt;br /&gt;
    P1OUT ^= 0x01;		// P1.0 umschalten mit Exklusiv-ODER&lt;br /&gt;
&lt;br /&gt;
    i = 10000;			// Warteschleife in Software&lt;br /&gt;
    do; while (--i);		// (CPU-Leistung „verheizen“)&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung der GPIO ==&lt;br /&gt;
Die Ein/Ausgabeleitungen haben beim MSP430, je nach Ausbaustufe, folgende Fähigkeiten:&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Einzeln (bitweise) programmierbare Ein/Ausgabe (&amp;lt;b&amp;gt;PxDIR&amp;lt;/b&amp;gt;, &amp;lt;b&amp;gt;PxOUT&amp;lt;/b&amp;gt;)&lt;br /&gt;
&amp;lt;li&amp;gt;Unabhängige Lese-Adresse (&amp;lt;b&amp;gt;PxIN&amp;lt;/b&amp;gt;)&lt;br /&gt;
&amp;lt;li&amp;gt;Ansprechbar als 8-Bit-Ports oder je paarweise als 16-bit-Port, bspw. P1 + P2 = PA usw.&lt;br /&gt;
&amp;lt;li&amp;gt;Interrupt auf Pegelwechsel einzelner Portpins (nur P1 und P2) (&amp;lt;b&amp;gt;PxIES&amp;lt;/b&amp;gt;)&lt;br /&gt;
&amp;lt;li&amp;gt;Pull-Up, Pull-Down oder kein Widerstand auswählbar (&amp;lt;b&amp;gt;PxREN&amp;lt;/b&amp;gt;, PxOUT)&lt;br /&gt;
&amp;lt;li&amp;gt;Einstellbare Treiberstärke (reduziert und voll) (&amp;lt;b&amp;gt;PxDS&amp;lt;/b&amp;gt;)&lt;br /&gt;
&amp;lt;li&amp;gt;Ein bis zwei Peripheriefunktionen pro Pin (&amp;lt;b&amp;gt;PxSEL&amp;lt;/b&amp;gt;), auswählbar mittels PxDIR (d.h. bei zwei Peripheriefunktionen ist eine Ausgang und die andere Eingang)&lt;br /&gt;
&amp;lt;li&amp;gt;Das JTAG-Port (4 Pins) und das USB-Port (2 Pins) ist standardmäßig ein E/A-Port (MSP430F55xx)&lt;br /&gt;
&amp;lt;li&amp;gt;Erweiterte Peripheriezuordnung bei P4 (MSP430F55xx) mittels Port Mapping Controller&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Nicht 5-V-verträglich!!&amp;lt;/b&amp;gt; Keinem Portpin darf ohne genügend großen Vorwiderstand 5 V angeboten werden. Ableitströme dürfen nicht zum Ansteigen der Speisespannung führen!&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Manche Portpins haben ein gemeinsames PxSEL, etwa:&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;das JTAG-Port (entweder alle 4 oder kein Pin zugeordnet)&lt;br /&gt;
&amp;lt;li&amp;gt;das USB-Port (entweder Portpin oder USB D+ und D–)&lt;br /&gt;
&amp;lt;li&amp;gt;die Quarz-Anschlüsse (das niederwertige PxSEL schaltet beide Portpins)&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle Portpins sind beim Einschalten (PUC) wie folgt initialisiert:&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Eingang ohne Pull-Up oder Pull-Down&lt;br /&gt;
&amp;lt;li&amp;gt;Reduzierte Treiberstärke&lt;br /&gt;
&amp;lt;li&amp;gt;Kein Pegelwechsel-Interrupt&lt;br /&gt;
&amp;lt;li&amp;gt;Keine Peripherie-Zuordnung&lt;br /&gt;
&amp;lt;li&amp;gt;Der Inhalt des Ausgaberegisters &amp;lt;b&amp;gt;PxOUT&amp;lt;/b&amp;gt; ist undefiniert!&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Alle ungenutzten Anschlüsse sollten per PullDown (&amp;lt;b&amp;gt;PxREN&amp;lt;/b&amp;gt; und &amp;lt;b&amp;gt;PxOUT&amp;lt;/b&amp;gt;) festgelegt werden.&lt;br /&gt;
&lt;br /&gt;
Kein MSP430 hat einen herausgeführten Busanschluss, etwa um mehr RAM anzubinden.&lt;br /&gt;
&lt;br /&gt;
== Initialisierung von PWM ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_PWM_TimerA(void)&lt;br /&gt;
{&lt;br /&gt;
  TACTL = TASSEL1 + TACLR;              // SMCLK, Clear Tar&lt;br /&gt;
  CCR0 = 512-1;                         // PWM Period&lt;br /&gt;
  CCTL1 = OUTMOD_7;                     // CCR1 reset/set&lt;br /&gt;
  P1DIR |= 0x04;                        // P1.2 PWM output&lt;br /&gt;
  P1SEL |= 0x04;                        // P1.2 and TA1/2 otions&lt;br /&gt;
  TACTL |= MC0;                         // Start Timer_A in up mode&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void set_PWM_duty_cycle(unsigned char duty)&lt;br /&gt;
{&lt;br /&gt;
  CCR1 = duty;                           // CCR1 PWM duty cycle &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= Interrupts: =&lt;br /&gt;
&lt;br /&gt;
== UARTs ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// z. B. ein Echo mit dem MSPGCC-Compiler:&lt;br /&gt;
interrupt (UART0RX_VECTOR) usart0_rx(void)&lt;br /&gt;
{&lt;br /&gt;
   TXBUF0=RXBUF0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// z. B. ein Echo mit dem ImageCraft ICC430-Compiler:&lt;br /&gt;
#pragma interrupt_handler usart0_rx:UART0RX_VECTOR&lt;br /&gt;
void usart0_rx(void)&lt;br /&gt;
{&lt;br /&gt;
   TXBUF0=RXBUF0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Die Funktionen selbst können natürlich auch anders genannt werden.&lt;br /&gt;
&lt;br /&gt;
== Timer ==&lt;br /&gt;
&lt;br /&gt;
== IOs ==&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= Softwareroutinen: =&lt;br /&gt;
&lt;br /&gt;
== I2C/TWI in Software ==&lt;br /&gt;
Diese Routinen wurden ursprünglich für einen MSP430F149 geschrieben. Es werden ausschließlich IOs benutzt. Da Code in C geschrieben wurde sollte er sich einfach auf alle MSP430s ohne (aber auch mit I²C) portieren lassen. Der ist zwar nicht ganz schön, aber er funktioniert soweit ganz gut. Auch ein Beispiel ist dabei.&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/attachment.php/324877/soft-i2c.zip&lt;br /&gt;
&lt;br /&gt;
== PWM ==&lt;br /&gt;
&lt;br /&gt;
Untenstehender Code ist nur mit msp320-gcc getestet.&lt;br /&gt;
&lt;br /&gt;
Folgende Routine initialisiert den Timer als Up-Counter mit der Clock-Quelle SMCLK und einem Teiler von 8. Zudem wird der Interrupt aktiviert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void timerA_init(void)&lt;br /&gt;
{&lt;br /&gt;
	TACTL =  TASSEL_SMCLK | TACLR | ID_DIV8 | TAIE;&lt;br /&gt;
	TACTL |= MC_UPTO_CCR0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um den Timer zu starten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void timerA_start(int timing[2], int mode)&lt;br /&gt;
{&lt;br /&gt;
	TACCTL0 = mode;&lt;br /&gt;
	TACCTL0 |= CCIE ;                // enable interrupt&lt;br /&gt;
	TACCTL1 = mode;&lt;br /&gt;
	TACCR0 = timing[0];&lt;br /&gt;
	TACCR1 = timing[1];&lt;br /&gt;
	TAR = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktion wird normalerweise mit &#039;mode&#039; 3 aufgerufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
timerA_start(timing, OUTMOD_SET_RESET);&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
timing[0] enthaelt die komplette Zyklendauer einer PWM-Phase (H und L)&lt;br /&gt;
Beispiel: Um eine Pulsfrequenz von 125 Hz bei einem SMCLK von 1.0 MHz zu erhalten, gilt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;timing_0 = 1.0e6 / 8 / 125 = 1000&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
timing[1] schliesslich enthält die Zyklendauer des H-Pulses und ist immer kleiner als timing[0]. Bei einem &#039;duty cycle&#039; (Tastverhältnis) 50% gilt also&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;timing_1 = 500&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zu beachten ist, dass der Timerkanal 0 bei manchen Modi (wie dem obenstehenden) für die PWM nicht genutzt wird, &amp;quot;TACCTL0 = mode&amp;quot; keinen speziellen Effekt zeigt (siehe auch Manual).&lt;br /&gt;
&lt;br /&gt;
Deswegen wird das PWM-Signal auch an TA1 abgegriffen, nicht an TA0.&lt;br /&gt;
&lt;br /&gt;
Schlussendlich muss der entsprechende Ausgangspin für TA1 konfiguriert werden. Beim F2013 z.&amp;amp;nbsp;B. geschieht dies für P1.2 per&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	P1SEL |= 0x04;  // Enable primary peripheral&lt;br /&gt;
	P1DIR |= 0x04;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was war nun mit dem Interrupt? Falls wir z.&amp;amp;nbsp;B. die Zyklen zählen wollen, definieren wir einen Interrupt-Handler:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;signal.h&amp;gt; // &#039;interrupt&#039; makro&lt;br /&gt;
interrupt (TIMERA0_VECTOR) timera0_isr(void)&lt;br /&gt;
{&lt;br /&gt;
	g_count++;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Schlussendlich müssen wir noch die Interrupts im Initialisierungscode aktivieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
_EINT();&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Senden eines Bytes ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void SendUSART0c(char c)             // ein einzelnes zeichen über die serielle schnittstelle (USART0) senden&lt;br /&gt;
                                     // FJG: Obacht: x12xx : IFG1 =&amp;gt; IFG2 !&lt;br /&gt;
{&lt;br /&gt;
  while (!(IFG1 &amp;amp; UTXIFG0));           // warten, bis USART0 TX-buffer sendebereit&lt;br /&gt;
  TXBUF0 = c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SendUSART1c(char c)             // ein einzelnes zeichen über die serielle schnittstelle (USART1) senden&lt;br /&gt;
{&lt;br /&gt;
  while (!(IFG2 &amp;amp; UTXIFG1));           // warten, bis USART1 TX-buffer sendebereit&lt;br /&gt;
  TXBUF1 = c;&lt;br /&gt;
}     &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Senden eines Strings ==&lt;br /&gt;
Nullterminierte Strings; zugehörige Interrupts dürfen nicht aktiviert sein&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void SendUSART0(const char* str)	// einen String über die serielle Schnittstelle (USART0) senden&lt;br /&gt;
{&lt;br /&gt;
  while (*str != 0)&lt;br /&gt;
  {&lt;br /&gt;
    while (!(IFG1 &amp;amp; UTXIFG0));		// warten bis USART0 TX-Puffer frei (leer)&lt;br /&gt;
    TXBUF0 = *str++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SendUSART1(const char* str)	// einen String über die serielle Schnittstelle (USART1) senden&lt;br /&gt;
{&lt;br /&gt;
  while (*str)&lt;br /&gt;
  {&lt;br /&gt;
    while (!(IFG2 &amp;amp; UTXIFG1));		// warten bis USART1 TX-Puffer frei (leer)&lt;br /&gt;
    TXBUF1 = *str++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Binärdaten mittels DMA (hier: DMA-Kanal 0 an UART1)&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void send(const void*buf, unsigned len) {&lt;br /&gt;
// könnte globaler Initialisierungskode sein:&lt;br /&gt;
 DMACTL0 = 0x000A;		// DMA-Kanal 0 dem UART1-TxD zuordnen&lt;br /&gt;
// genauer: DMACTL0 = DMACTL0 &amp;amp; 0xFFF0 | 0x000A;&lt;br /&gt;
 DMA0DA  = (unsigned)&amp;amp;U1TXBUF;	// Zieladresse ist der Sendepuffer&lt;br /&gt;
// hier aufrufspezifischer Kode:&lt;br /&gt;
 DMA0SA  = (unsigned)buf;	// Quelladresse sind die Sendedaten&lt;br /&gt;
 DMA0SZ  = len;			// Anzahl der Byte-Transfers&lt;br /&gt;
 DMA0CTL = 0x03F0;		// Start des Single-DMA-Transfers, byte-weise mit steigender Quelladresse&lt;br /&gt;
// Abwarten aufs Ende, könnte man vorteilhaft asynchron erledigen.&lt;br /&gt;
// In so einem Fall muss der Aufrufer &amp;lt;buf&amp;gt; beibehalten bis der DMA-Transfer beendet ist&lt;br /&gt;
 while (!(DMA0CTL&amp;amp;DMAIFG));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Beachte: Die Interruptfreigabe des UART priorisiert Interruptverarbeitung über DMA! Das kann man auch gezielt ausnutzen, um mal Interrupt- und mal DMA-Betrieb zu realisieren.&lt;br /&gt;
&lt;br /&gt;
== Empfangen eines Bytes (interruptgesteuert)  // Receiving a byte-&amp;gt; Interrupt controlled ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/*Hab diese Interrupt Funktion für meine I²C Kommunikation verwendet&lt;br /&gt;
Startcondition wird erkannt, aber nicht Stop, da man die Flanken(die den&lt;br /&gt;
interrupt auslösen) umkehren müsste, aber dann keine Startkondition erkannt werden kann.&lt;br /&gt;
&lt;br /&gt;
Hab mir jetzt nicht die mühe gemacht alles rauszupicken was ihr nicht braucht.&lt;br /&gt;
Wer sich auskennt, kann das auch selber machen.&lt;br /&gt;
&lt;br /&gt;
Das Busy wird fürs stretching verwendet(CLK wird auf low gezogen)&lt;br /&gt;
*/  &lt;br /&gt;
&lt;br /&gt;
#pragma vector = PORT1_VECTOR           // Port 1 - Interrupt-Funktions-&amp;quot;Alias&amp;quot;&lt;br /&gt;
__interrupt void Interrupt_Port1()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
//  I2CTransfer = 0;&lt;br /&gt;
&lt;br /&gt;
    TACTL |= TACLR;&lt;br /&gt;
    TACTL |= TAIE;&lt;br /&gt;
#ifdef WD&lt;br /&gt;
    WDTCTL = WDTPW + WDTCNTCL;&lt;br /&gt;
#endif&lt;br /&gt;
    &lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
  if ((P1IFG &amp;amp; 0x04) &amp;amp;&amp;amp; !(I2CCLK)) { //if startdataimpuls but clk low is detected --return--&lt;br /&gt;
    P1IFG &amp;amp;= ~0x0C;&lt;br /&gt;
    return;}&lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
//    P1IE &amp;amp;= ~0x0C;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
  if ((P1IFG &amp;amp; 0x04) &amp;amp;&amp;amp; I2CCLK)   //Start Condition       (I2CStart)&lt;br /&gt;
    {&lt;br /&gt;
      P1IFG &amp;amp;= ~0x0C;&lt;br /&gt;
      &lt;br /&gt;
//    I2CTransfer = 1;&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
        P1IE &amp;amp;= ~0x0C;&lt;br /&gt;
//        TACTL |= TACLR;&lt;br /&gt;
//        TACTL |= TAIE;&lt;br /&gt;
//        _EINT();&lt;br /&gt;
&lt;br /&gt;
      &lt;br /&gt;
/*#ifdef Debug&lt;br /&gt;
      P2OUT |= 0x04;&lt;br /&gt;
      P2DIR |= 0x04; &lt;br /&gt;
#endif*/&lt;br /&gt;
      &lt;br /&gt;
//      Wait(10);&lt;br /&gt;
//      while(I2CCLK)  {CheckTimer;}&lt;br /&gt;
&lt;br /&gt;
//      set_Busy;&lt;br /&gt;
  &lt;br /&gt;
      BitCnt = 0x01;&lt;br /&gt;
      ByteCnt = 0;&lt;br /&gt;
//      I2CByte = 0;&lt;br /&gt;
      StartCondition = 1;&lt;br /&gt;
//      CRCByte = 0x00;&lt;br /&gt;
      GetData = 0;&lt;br /&gt;
      I2CTransfer = 0;&lt;br /&gt;
    &lt;br /&gt;
//    clr_Busy;&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
        _DINT();&lt;br /&gt;
        P1IE |= 0x0C;&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
  P1IFG &amp;amp;= ~0x0C;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
    TACTL |= TACLR;&lt;br /&gt;
    _EINT();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
  if (I2CCLK)&lt;br /&gt;
  {&lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
      TACTL |= TAIE;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    I2CByte &amp;lt;&amp;lt;= 1; &lt;br /&gt;
    if (I2CDAT){&lt;br /&gt;
      I2CByte += 0x01;&lt;br /&gt;
     }&lt;br /&gt;
    I2CTransfer = 1;&lt;br /&gt;
    while(I2CCLK) {CheckTimer;}&lt;br /&gt;
    set_Busy;&lt;br /&gt;
    BitCnt &amp;lt;&amp;lt;= 1;&lt;br /&gt;
  &lt;br /&gt;
    if(!(BitCnt == 0x00))&lt;br /&gt;
    {&lt;br /&gt;
      clr_Busy;  &lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      _NOP();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
  }&lt;br /&gt;
//----------------------------------------------------------------------------  &lt;br /&gt;
&lt;br /&gt;
P1DIR &amp;amp;= ~0x0C;&lt;br /&gt;
P1IFG = 0x00;&lt;br /&gt;
P1IE |= 0x0C;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ermitteln der Temperatur ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// von FJG info@aqua-sun.net :&lt;br /&gt;
// ---------------   Temperatur des Chips   ---------------------&lt;br /&gt;
&lt;br /&gt;
#define T_Faktor_a1000       ((long)103)     // REF 1,5V&lt;br /&gt;
#define T_Faktor_b1000       ((long)172)     // REF 2,5V&lt;br /&gt;
#define T_Faktor_c1000       ((long)278000)&lt;br /&gt;
&lt;br /&gt;
int Hole_Temp(void)	// Temperatur ch 10&lt;br /&gt;
{			// Temp = N* 0,17193 -278  1000Temp = N*172 -278000 bei 2,5V&lt;br /&gt;
  long Temp_L;&lt;br /&gt;
  int  Temp , Delta ;&lt;br /&gt;
&lt;br /&gt;
  Start_AD();&lt;br /&gt;
&lt;br /&gt;
  Temp_L = ((long)ADC12MEM10 * T_Faktor_a1000) - T_Faktor_c1000 ;&lt;br /&gt;
  Temp   = (int)( Temp_L / 1000);&lt;br /&gt;
&lt;br /&gt;
  Delta = Read_EEPROM( EPROM_INTERN_BL1_R_ADR,DELTA_TEMP_ADR );	   // falls Temp Messung&lt;br /&gt;
  if( Delta &amp;lt;= 120 &amp;amp;&amp;amp; Delta &amp;gt;= 80 ) Delta -= 100 ; else Delta = 0; // ungenau war&lt;br /&gt;
                                                                   // siehe dazu TI&lt;br /&gt;
  return (Temp + Delta);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// INIT AD&lt;br /&gt;
// AD muss angestoßen werden mit :   Start_AD()&lt;br /&gt;
&lt;br /&gt;
// #define ADC12TL0WERT15	(SHT1_8 + SHT0_3 + MSC + REFON + ADC12ON)&lt;br /&gt;
#define ADC12TL0WERT15		(SHT1_3 + SHT0_3 + MSC + REFON + ADC12ON)&lt;br /&gt;
#define ADC12TL0WERT25		(SHT1_3 + SHT0_3 + MSC + +REF2_5V + REFON + ADC12ON)&lt;br /&gt;
&lt;br /&gt;
//                        Start CH0 , ADC12SCBIT , SampleT , F/2 , MCLK , Sequenze of CH&lt;br /&gt;
#define ADC12CTL1WERT   ( CSTARTADD_0 + SHS_0 + SHP + ADC12DIV_1 + ADC12SSEL_2 + CONSEQ_1 )&lt;br /&gt;
&lt;br /&gt;
void adc12_init()	// ADC12CTL0 modifizieren nur mit ENC = 0&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0   = 0x00;&lt;br /&gt;
  ADC12CTL1   = ADC12CTL1WERT ;&lt;br /&gt;
&lt;br /&gt;
  ADC12MCTL0  = INCH_0;                  &lt;br /&gt;
  ADC12MCTL1  = INCH_1;                  &lt;br /&gt;
  ADC12MCTL2  = INCH_2;&lt;br /&gt;
  ADC12MCTL3  = INCH_3;&lt;br /&gt;
  ADC12MCTL4  = INCH_4;&lt;br /&gt;
  ADC12MCTL5  = INCH_5;&lt;br /&gt;
  ADC12MCTL6  = INCH_6;&lt;br /&gt;
  ADC12MCTL7  = INCH_7;                  &lt;br /&gt;
  ADC12MCTL8  = INCH_8;		// VeREF+&lt;br /&gt;
  ADC12MCTL9  = INCH_9;		// VeREF-&lt;br /&gt;
&lt;br /&gt;
  ADC12MCTL10 = INCH_10 + SREF_1 ;&lt;br /&gt;
  ADC12MCTL11 = INCH_11 + SREF_1 +EOS;&lt;br /&gt;
&lt;br /&gt;
  ADC12IE     = 0x00;&lt;br /&gt;
  ADC12CTL0   = ADC12TL0WERT15 ;&lt;br /&gt;
  ADC12CTL0  |= 0x0003;		// ENC + ADC12SC = Enable Conversation + StartConversation&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------   Diverses AD_Wandler   --------------------&lt;br /&gt;
&lt;br /&gt;
void Start_AD(void)&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0 &amp;amp;= ~ENC;&lt;br /&gt;
  ADC12CTL0 |= (ADC12SC+ENC);&lt;br /&gt;
  NOP();&lt;br /&gt;
  NOP();&lt;br /&gt;
  ADC12CTL0 &amp;amp;=~ADC12SC;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#ifndef TEST_AD&lt;br /&gt;
#define Ist_AD_Busy()        ( ADC12CTL1 &amp;amp; ADC12BUSY )&lt;br /&gt;
#else&lt;br /&gt;
int Ist_AD_Busy()&lt;br /&gt;
{&lt;br /&gt;
  if (ADC12CTL1 &amp;amp; ADC12BUSY)&lt;br /&gt;
  {&lt;br /&gt;
     printf(&amp;quot;\n\r... BUSY ...&amp;quot;); &lt;br /&gt;
     delay_ms(500);&lt;br /&gt;
     return(1);&lt;br /&gt;
  }&lt;br /&gt;
  return(0);&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ansteuerung eines LCD &amp;amp;#8211; Zeichendisplays // Controlling the LCD character==&lt;br /&gt;
&lt;br /&gt;
Der folgende Quelltext-Schnipsel ist für Siebensegmentanzeigen gedacht,&lt;br /&gt;
&#039;&#039;nicht&#039;&#039; für die mit dem HD44780-kompatiblen Controller.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
  // hier nun der vollständige Code 14 Jan 08&lt;br /&gt;
  // von mir seinerseits entwickelt, ich hoffe, er ist eine Hilfe&lt;br /&gt;
 &lt;br /&gt;
  // Aquasun Germany  Remscheid  Franz-Josef Günther&lt;br /&gt;
  // Development info@aqua-sun.net&lt;br /&gt;
&lt;br /&gt;
  // LCD.h Header für Allgemeines zum LCD ab 02.12.04 Aquasun GUE&lt;br /&gt;
  // C-Compiler ICC&lt;br /&gt;
&lt;br /&gt;
  // -------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
  // Beispiel :&lt;br /&gt;
&lt;br /&gt;
int Aepfel = 8;&lt;br /&gt;
&lt;br /&gt;
print_LCD(&amp;quot;\nRotkaepchen hat %d Aepfel im Korb&amp;quot;,Aepfel);&lt;br /&gt;
&lt;br /&gt;
  // -------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;_const.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdarg.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt; STRING.H&amp;gt;&lt;br /&gt;
#include &amp;lt; stdio.h &amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LCD_MAX          8&lt;br /&gt;
#define Mem_LCD         16&lt;br /&gt;
&lt;br /&gt;
#ifndef Mem_LCD&lt;br /&gt;
#define Mem_LCD 20&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
    Header für 8 x 7 Segmentanzeigen 2 MUX MSP430 x4xx&lt;br /&gt;
&lt;br /&gt;
    V3 = V1 (VDD) , V5 = 0 ,&lt;br /&gt;
&lt;br /&gt;
    für : LCD siehe TI Info dazu,&lt;br /&gt;
    für : LED&#039;s :&lt;br /&gt;
&lt;br /&gt;
    LED mit gemeinsamer Kathode, SP über Buffer 74HC245 (8x) o.ä.&lt;br /&gt;
    /G=L , DIR=H A ==&amp;gt; B an 5V , COM mit Emitterfolger PNP ViL=0,8V ViH=2V&lt;br /&gt;
&lt;br /&gt;
    LED mit gemeinsamer Anode, COM über PNP Transistor invertiert&lt;br /&gt;
    und SP über ULN2804(8x) getrieben&lt;br /&gt;
            _   ___   ___   ___&lt;br /&gt;
    COM0 :   |_|   |_|   |_|&lt;br /&gt;
            ____   ___   ___&lt;br /&gt;
    COM1 :      |_|   |_|   |_|&lt;br /&gt;
             __    __    __&lt;br /&gt;
    SPon :  |  |__|  |__|  |__| mit COM0&lt;br /&gt;
&lt;br /&gt;
    SPin :   0  1  2  3  4  5  6  7    8  9 10 11 12 13 14 15&lt;br /&gt;
    COM0 :  1a 1b 1c 1d 1e 1f 1g 1h   2a 2b 2c 2d 2e 2f 2g 2h&lt;br /&gt;
    COM1 :  5a 5b 5c 5d 5e 5f 5g 5h   6a 6b 6c 6d 6e 6f 6g 6h&lt;br /&gt;
&lt;br /&gt;
    SPin :  16 17 18 19 20 21 22 23   24 25 26 27 28 29 30 31&lt;br /&gt;
    COM0 :  3a 3b 3c 3d 3e 3f 3g 3h   4a 4b 4c 4d 4e 4f 4g 4h&lt;br /&gt;
    COM1 :  7a 7b 7c 7d 7e 7f 7g 7h   8a 8b 8c 8d 8e 8f 8g 8h&lt;br /&gt;
&lt;br /&gt;
    COM        3 2   1  0   3 2   1  0&lt;br /&gt;
    MAP 0A0    - -   8h 4h  - -   8g 4g&lt;br /&gt;
        09F    - -   8f 4f  - -   8e 4e&lt;br /&gt;
        09E    - -   8d 4d  - -   8c 4c&lt;br /&gt;
        09D    - -   8b 4b  - -   8a 4a&lt;br /&gt;
&lt;br /&gt;
        09C    - -   7h 3h  - -   7g 3g&lt;br /&gt;
        09B    - -   7f 3f  - -   7e 3e&lt;br /&gt;
        09A    - -   7d 3d  - -   7c 3c&lt;br /&gt;
        099    - -   7b 3b  - -   7a 3a&lt;br /&gt;
&lt;br /&gt;
        098    - -   6h 2h  - -   6g 2g&lt;br /&gt;
        097    - -   6f 2f  - -   6e 2e&lt;br /&gt;
        096    - -   6d 2d  - -   6c 2c&lt;br /&gt;
        095    - -   6b 2b  - -   6a 2a&lt;br /&gt;
&lt;br /&gt;
        094    - -   5h 1h  - -   5g 1g&lt;br /&gt;
        093    - -   5f 1f  - -   5e 1e&lt;br /&gt;
        092    - -   5d 1d  - -   5c 1c&lt;br /&gt;
        091    - -   5b 1b  - -   5a 1a&lt;br /&gt;
&lt;br /&gt;
             ---a----&lt;br /&gt;
            |        |&lt;br /&gt;
          f |        | b&lt;br /&gt;
            |        |&lt;br /&gt;
             ---g----&lt;br /&gt;
            |        |&lt;br /&gt;
          e |        | c&lt;br /&gt;
            |        |    _&lt;br /&gt;
              ---d---    | | h&lt;br /&gt;
                          -&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
#define a0      0x01  // Char durch rechtsschiften &amp;amp; 0x..&lt;br /&gt;
#define b0      0x10&lt;br /&gt;
#define c0      0x02&lt;br /&gt;
#define d0      0x20&lt;br /&gt;
#define e0      0x04&lt;br /&gt;
#define f0      0x40&lt;br /&gt;
#define g0      0x08&lt;br /&gt;
#define h0      0x80&lt;br /&gt;
&lt;br /&gt;
#define ch_0    ( e0+f0+a0+b0+c0+d0 )&lt;br /&gt;
#define ch_1    ( b0+c0 )&lt;br /&gt;
#define ch_2    ( a0+b0+g0+e0+d0 )&lt;br /&gt;
#define ch_3    ( a0+b0+g0+c0+d0 )&lt;br /&gt;
#define ch_4    ( f0+g0+b0+c0 )&lt;br /&gt;
#define ch_5    ( a0+f0+g0+c0+d0 )&lt;br /&gt;
#define ch_6    ( a0+f0+c0+d0+e0+g0 )&lt;br /&gt;
#define ch_7    ( a0+b0+c0 )&lt;br /&gt;
#define ch_8    ( a0+b0+c0+d0+e0+f0+g0 )&lt;br /&gt;
#define ch_9    ( a0+b0+c0+f0+g0 )&lt;br /&gt;
&lt;br /&gt;
#define ch_a    ( a0+b0+c0+d0+e0+g0 )&lt;br /&gt;
#define ch_A    ( e0+f0+a0+b0+c0+g0 )&lt;br /&gt;
#define ch_B    ( a0+b0+c0+d0+e0+f0+g0 )&lt;br /&gt;
#define ch_b    ( f0+e0+d0+c0+g0 )&lt;br /&gt;
#define ch_c    ( g0+e0+d0 )&lt;br /&gt;
#define ch_C    ( a0+f0+e0+d0 )&lt;br /&gt;
#define ch_d    ( b0+c0+d0+e0+g0 )&lt;br /&gt;
#define ch_D    ( e0+f0+a0+b0+c0+d0 )&lt;br /&gt;
#define ch_e    ( f0+e0+d0+a0+b0+g0 )&lt;br /&gt;
#define ch_E    ( a0+f0+g0+d0+e0 )&lt;br /&gt;
#define ch_F    ( a0+f0+g0+e0 )&lt;br /&gt;
#define ch_G    ( a0+f0+c0+d0+e0+g0 )&lt;br /&gt;
#define ch_g    ( a0+b0+c0+d0+f0+g0 )&lt;br /&gt;
#define ch_h    ( f0+c0+e0+g0 )&lt;br /&gt;
#define ch_H    ( f0+c0+e0+g0+b0 )&lt;br /&gt;
#define ch_I    ( f0+e0 )&lt;br /&gt;
#define ch_i    ( e0 )&lt;br /&gt;
#define ch_k    ( b0+e0+f0+g0 )&lt;br /&gt;
#define ch_L    ( f0+e0+d0 )&lt;br /&gt;
#define ch_l    ( b0+c0 )&lt;br /&gt;
#define ch_M    ( c0+b0+e0+f0 )&lt;br /&gt;
&lt;br /&gt;
#define ch_n    ( e0+g0+c0 )&lt;br /&gt;
#define ch_N    ( a0+b0+c0+e0+f0 )&lt;br /&gt;
#define ch_o    ( e0+g0+c0+d0 )&lt;br /&gt;
#define ch_O    ( e0+f0+a0+b0+c0+d0 )&lt;br /&gt;
#define ch_P    ( e0+f0+a0+b0+g0 )&lt;br /&gt;
#define ch_r    ( g0+e0 )&lt;br /&gt;
#define ch_S    ( a0+f0+g0+c0+d0 )&lt;br /&gt;
#define ch_T    ( a0+f0+e0 )&lt;br /&gt;
#define ch_U    ( f0+e0+d0+c0+b0 )&lt;br /&gt;
#define ch_u    ( e0+d0+c0 )&lt;br /&gt;
#define ch_X    ( b0+g0+e0 )&lt;br /&gt;
#define ch_Y    ( f0+g0+b0+c0+d0 )&lt;br /&gt;
#define ch_Z    ( a0+b0+g0+e0+d0 )&lt;br /&gt;
#define ch_Blank  0&lt;br /&gt;
#define Unter_  ( d0 )&lt;br /&gt;
#define DP_Pkt  ( h0 )&lt;br /&gt;
#define Minus   ( g0 )&lt;br /&gt;
#define Tilde   ( a0+g0+d0 )&lt;br /&gt;
#define GLEICH  ( g0+d0 )&lt;br /&gt;
#define FRAGE   ( a0+f0+g0+c0+d0+h0 )&lt;br /&gt;
&lt;br /&gt;
// #define Digi_X1ste         LCDM17       // die erste freie LCD_Mem_Stelle 18,19,20&lt;br /&gt;
                                           // in lcd_init() auf 0&lt;br /&gt;
&lt;br /&gt;
// extern unsigned int Digi_X;             // für LCD&lt;br /&gt;
&lt;br /&gt;
const char  letter[] = &amp;quot;0123456789 _.-~?=AaBbCcDdEeFGgHhIiKkLlMmNnOoPRrSsTtUuxXYyZz&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
const int hex_Wert[] = {&lt;br /&gt;
      ch_0,    ch_1, ch_2, ch_3, ch_4, ch_5, ch_6, ch_7, ch_8, ch_9,&lt;br /&gt;
      ch_Blank, Unter_, DP_Pkt, Minus, Tilde, FRAGE , GLEICH ,&lt;br /&gt;
      ch_A, ch_a, ch_B, ch_b, ch_C, ch_c, ch_D, ch_d, ch_E, ch_e, ch_F, ch_G, ch_g,&lt;br /&gt;
      ch_H, ch_h, ch_I, ch_i, ch_k, ch_k, ch_L, ch_l , ch_M, ch_M, ch_N, ch_n, ch_O, ch_o,&lt;br /&gt;
      ch_P, ch_r, ch_r, ch_S, ch_S, ch_T, ch_T, ch_U, ch_u, ch_X, ch_X,&lt;br /&gt;
      ch_Y, ch_Y, ch_Z , ch_Z  };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void All_LCD(void);&lt;br /&gt;
void Clear_LCD_M(void);                     // Clears LCD memory&lt;br /&gt;
void Clear_LCD(void);&lt;br /&gt;
void lcd_init(void); in ini&lt;br /&gt;
void Write_LCD_Hex(int Digit_n , int HEX_Zeichen);&lt;br /&gt;
void SetzeDP( int welches_Displ);&lt;br /&gt;
int putchar_LCD(char);&lt;br /&gt;
int print_LCD(CONST char *fmt, ...)  ;      // LCD 1-7 Digit nur realisiert sonst 1...11&lt;br /&gt;
extern int _print(void (*_put)(char), const char *fmt, va_list va);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void Clear_LCD_M(void)&lt;br /&gt;
{&lt;br /&gt;
    int i;&lt;br /&gt;
    for (i =0; i&amp;lt;Mem_LCD; i++) LCDMEM[i] = 0;   // Mem_LCD extern , abhängig vom Display&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void Clear_LCD(void)&lt;br /&gt;
{&lt;br /&gt;
      print_LCD(&amp;quot;\n_&amp;quot;);                     // beim Cursor wird DIGIT_X nicht weitergezählt&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void All_LCD(void)                          // alle = 8888..&lt;br /&gt;
{&lt;br /&gt;
    int i;&lt;br /&gt;
    for (i=0; i&amp;lt;Mem_LCD; i++) LCDMEM[i] = 0xFF;   // Mem_LCD extern , abhängig vom Display&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
int putchar_LCD(char c_in)&lt;br /&gt;
{&lt;br /&gt;
                                            //  Digi_X  == LCDM17&lt;br /&gt;
    int i, leng;&lt;br /&gt;
    char c = c_in;&lt;br /&gt;
    leng = strlen(letter);                  // Länge ohne /0 , 1..&lt;br /&gt;
&lt;br /&gt;
      if( (c==&#039;\n&#039;) || (c==&#039;\r&#039;))           // nichts gefunden =&amp;gt; CLR_Displ&lt;br /&gt;
        {&lt;br /&gt;
          Digi_X =1;  Clear_LCD_M(); return c;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    for(i=0;i&amp;lt;leng;i++) { if( c == letter[i] ) break; }        // Char gefunden&lt;br /&gt;
&lt;br /&gt;
    if(i == leng)&lt;br /&gt;
      {&lt;br /&gt;
        for(i=0;i&amp;lt;leng;i++) { if( &#039; &#039; == letter[i] ) break; }  // Char &#039; &#039; als Ersatz&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    if(i&amp;lt;leng)                              // es gibt &#039;.&#039; als Ersatz&lt;br /&gt;
      {&lt;br /&gt;
        Write_LCD_Hex((int)Digi_X , i);     // Digi beschreiben oder löschen&lt;br /&gt;
                                            // if(Digi_X) Write_LCD_Hex(Digi_X , i);&lt;br /&gt;
        if(C != &#039;_&#039;)Digi_X++;&lt;br /&gt;
        if(Digi_X &amp;gt; LCD_MAX) Digi_X =1;     // if(Digi_X &amp;gt;= Mem_LCD) Digi_X =1;&lt;br /&gt;
      }&lt;br /&gt;
    return c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
int print_LCD(CONST char *fmt, ...)&lt;br /&gt;
{&lt;br /&gt;
    va_list va;&lt;br /&gt;
    int val;&lt;br /&gt;
&lt;br /&gt;
    va_start(va, fmt);&lt;br /&gt;
    val = _print((void (*)(char))putchar_LCD, fmt, va);&lt;br /&gt;
    va_end(va);&lt;br /&gt;
&lt;br /&gt;
    return val;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
   // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void lcd_init(void)             // LCD init&lt;br /&gt;
{&lt;br /&gt;
 LCDCTL=0xAD;                   // LCDM567.2,LCDM567.0,LCDM234.1,LCDM234.0,LCDM0&lt;br /&gt;
 LCDM1 =0x00;                   // 0xAD = 101 01 101&lt;br /&gt;
 LCDM2 =0x00;                   // 101 = LCDP2 ,0, LCDP0 =&amp;gt; S0..S31&lt;br /&gt;
 LCDM3 =0x00;                   //  01 = LCDMX1,LCDMX0   =&amp;gt; 2-mux&lt;br /&gt;
 LCDM4 =0x00;                   // 101 = LCDSON,x,LCDON Segments ON ,x,LCD ON&lt;br /&gt;
 LCDM5 =0x00;&lt;br /&gt;
 LCDM6 =0x00; LCDM7 =0x00; LCDM8 =0x00; LCDM9 =0x00; LCDM10 =0x00;LCDM11 =0x00;&lt;br /&gt;
 LCDM12=0x00; LCDM13=0x00; LCDM14=0x00; LCDM15=0x00; LCDM16=0x00; LCDM17=0x00;&lt;br /&gt;
 LCDM18=0x00; LCDM19=0x00; LCDM20=0x00;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
   // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void Write_LCD_Hex(int Digit_n , int char_Nr)   // Digit1 bis 4 und 5 bis 8&lt;br /&gt;
{&lt;br /&gt;
  int i ,i_End , ch , Maske_loesch , Maske_setz ;&lt;br /&gt;
&lt;br /&gt;
  if((Digit_n == 0 ) || (Digit_n &amp;gt; LCD_MAX))&lt;br /&gt;
    {&lt;br /&gt;
        Clear_LCD_M(); i=0;&lt;br /&gt;
    }&lt;br /&gt;
   else i= (Digit_n - 1);                   // Startadresse = Digit_n x4 siehe unten&lt;br /&gt;
&lt;br /&gt;
  if(Digit_n &amp;lt; (LCD_MAX/2+1))               // Digit 1 ... 4 , i 0...3&lt;br /&gt;
    {&lt;br /&gt;
        Maske_setz   = 0x0011;&lt;br /&gt;
        Maske_loesch = 0x00FF - Maske_setz ;&lt;br /&gt;
        ch           = hex_Wert[char_Nr];&lt;br /&gt;
    } else                                  // Digit 5 ... 8&lt;br /&gt;
    {&lt;br /&gt;
        Maske_setz   = 0x0022;&lt;br /&gt;
        Maske_loesch = 0x00FF - Maske_setz ;&lt;br /&gt;
        ch           = hex_Wert[char_Nr] &amp;lt;&amp;lt; 1;&lt;br /&gt;
        i           -= (LCD_MAX/2) ;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  i &amp;lt;&amp;lt;= 2; i_End = i +4;                    // Berechnung der Start- und End -adresse&lt;br /&gt;
&lt;br /&gt;
  for(; i &amp;lt; i_End;i++)&lt;br /&gt;
    {&lt;br /&gt;
       LCDMEM[i] &amp;amp;= Maske_loesch;&lt;br /&gt;
       LCDMEM[i] |= ( ch &amp;amp; Maske_setz );&lt;br /&gt;
       ch &amp;gt;&amp;gt;=1;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
  // -----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
void SetzeDP( int welches_Displ)          // Displ 8 , 7 , 6 ...&lt;br /&gt;
{&lt;br /&gt;
  int i , i1;&lt;br /&gt;
    for (i=0,i1=1;i&amp;lt;8;i++,i1 &amp;lt;&amp;lt;=1)&lt;br /&gt;
      {&lt;br /&gt;
        if(welches_Displ &amp;amp; i1)&lt;br /&gt;
        switch(i)&lt;br /&gt;
         {&lt;br /&gt;
           case 0 : LCDM4  |= 0x10; break;&lt;br /&gt;
           case 1 : LCDM8  |= 0x10; break;&lt;br /&gt;
           case 2 : LCDM12 |= 0x10; break;&lt;br /&gt;
           case 3 : LCDM16 |= 0x10; break;&lt;br /&gt;
           case 4 : LCDM4  |= 0x20; break;&lt;br /&gt;
           case 5 : LCDM8  |= 0x20; break;&lt;br /&gt;
           case 6 : LCDM12 |= 0x20; break;&lt;br /&gt;
           case 7 : LCDM16 |= 0x20; break;&lt;br /&gt;
           default: break;&lt;br /&gt;
         }&lt;br /&gt;
      }  // for&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
  // ------------------  ENDE  ----------------------&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
[[Kategorie:MSP430]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=MSP430_Codebeispiele&amp;diff=61402</id>
		<title>MSP430 Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=MSP430_Codebeispiele&amp;diff=61402"/>
		<updated>2011-11-03T09:38:26Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Senden eines Strings */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;MSP430 &amp;amp;#8211; Codebeispiele&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Einleitung:&#039;&#039;&#039;&lt;br /&gt;
Da der MSP430 eine sehr schöner Mikrocontroller für energiesparende Anwendungen ist, jedoch bei weitem nicht so verbreitet wie z.&amp;amp;nbsp;B. diverse 8051er, AVRs, PICs usw. ist, gibt es auch nicht all zu viele Codebeispiele aus Projekten für den/die Hobbybastler(in).&lt;br /&gt;
Aus diesem Grund werden hier Grundlagen der Initialisierung diverser Hardwarefeatures sowie grundlegende Softwareroutinen und dergleichen beschrieben, so dass für Anfänger auch ein einfaches Copy&amp;amp;Paste möglich ist.&lt;br /&gt;
Hierbei kommt der MSPGCC zum Einsatz, da eine professionelle unlimitierte Ausgabe des z.&amp;amp;nbsp;B. IAR für Bastler nahezu unbezahlbar ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Hardware =&lt;br /&gt;
&lt;br /&gt;
== Initializing/ Configuring UARTs ==&lt;br /&gt;
Von www.mathar.com stammt diese Routine zur initialisierung eines beliebigen UARTS. Zusätzlich müssen jedoch die Pins noch definiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void InitUSART(char USART0, char USART1, unsigned int baudrate1, unsigned int baudrate2, char IR0, char IR1)&lt;br /&gt;
{&lt;br /&gt;
  if (USART0) ME1 |= UTXE0 + URXE0;    // falls gesetzt, USART0 einschalten (TX- und RX-teil)&lt;br /&gt;
  if (USART1) ME2 |= UTXE1 + URXE1;    // falls gesetzt, USART1 einschalten (TX- und RX-teil)&lt;br /&gt;
  UCTL0 |= CHAR;                       // 8 data bits, 1 stop bit, no parity (8N1)&lt;br /&gt;
  UCTL1 |= CHAR;&lt;br /&gt;
  UTCTL0 |= SSEL1;                     // SMCLK als UCLK festlegen&lt;br /&gt;
  UTCTL1 |= SSEL1;&lt;br /&gt;
  if (baudrate1==19200)&lt;br /&gt;
  {&lt;br /&gt;
    UBR00 = 0xA0;                      // 19200 baud aus 8 MHz erzeugen&lt;br /&gt;
    UBR10 = 0x01;                      // siehe application note tabelle 1, seite 9&lt;br /&gt;
    UMCTL0 = 0x00;                     // keine korrektur der division noetig&lt;br /&gt;
  }&lt;br /&gt;
  if (baudrate2==19200)&lt;br /&gt;
  {&lt;br /&gt;
    UBR01 = 0xA0;                      // 19200 baud aus 8 MHz erzeugen&lt;br /&gt;
    UBR11 = 0x01;                      // siehe application note tabelle 1, seite 9&lt;br /&gt;
    UMCTL1 = 0x00;                     // keine korrektur der division noetig&lt;br /&gt;
  }&lt;br /&gt;
  if (USART0) UCTL0 &amp;amp;= ~SWRST;         // USART freigeben&lt;br /&gt;
  if (USART1) UCTL1 &amp;amp;= ~SWRST;&lt;br /&gt;
  if (IR0==0) IE1 |= URXIE0;           // IR0: 0 -&amp;gt; nur RX-interrupt anschalten&lt;br /&gt;
  if (IR0==1) IE1 |= UTXIE0;           //      1 -&amp;gt; nur TX-interrupt anschalten&lt;br /&gt;
  if (IR0==2) IE1 |= URXIE0 + UTXIE0;  //      2 -&amp;gt; TX- und RX-interrupt anschalten&lt;br /&gt;
  if (IR1==1||IR1==2) IFG1 &amp;amp;= ~UTXIFG0;  // initales interrupt-flag loeschen&lt;br /&gt;
  if (IR1==0) IE2 |= URXIE1;           // IR1: 0 -&amp;gt; nur RX-interrupt anschalten&lt;br /&gt;
  if (IR1==1) IE2 |= UTXIE1;           //      1 -&amp;gt; nur TX-interrupt anschalten&lt;br /&gt;
  if (IR1==2) IE2 |= URXIE1 + UTXIE1;  //      2 -&amp;gt; TX- und RX-interrupt anschalten&lt;br /&gt;
  if (IR1==1||IR1==2) IFG1 &amp;amp;= ~UTXIFG1;  // initales interrupt-flag loeschen&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialization/configuration of USART (SPI and I2C/TWI) ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_spi(void)&lt;br /&gt;
{&lt;br /&gt;
  ME1 |= USPIE0;                        // Enable USART0 SPI mode&lt;br /&gt;
  UTCTL0 = CKPH+SSEL1+SSEL0+STC;        // SMCLK, 3-pin mode&lt;br /&gt;
  UCTL0 = CHAR+SYNC+MM;                 // 8-bit SPI Master **SWRST**&lt;br /&gt;
  UBR00 = 0x02;                         // UCLK/2 &lt;br /&gt;
  UBR10 = 0x00;                         // 0&lt;br /&gt;
  UMCTL0 = 0x00;                        // no modulation&lt;br /&gt;
  P3SEL |= 0x0E;                        // P3.1-3 SPI option select&lt;br /&gt;
  P3DIR |= 0x01;                        // P3.0 output direction&lt;br /&gt;
  _EINT();                              // Enable interrupts&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void init_i2c(unsigned char slave)&lt;br /&gt;
{&lt;br /&gt;
  P3SEL |= 0x0a;                            // Assign I2C pins to module&lt;br /&gt;
  U0CTL |= I2C + SYNC;                      // Switch USART0 to I2C mode&lt;br /&gt;
  U0CTL &amp;amp;= ~I2CEN;                          // Recommended I2C init procedure&lt;br /&gt;
  I2CTCTL = I2CSSEL_2;                      // SMCLK&lt;br /&gt;
  I2CSCLH = 0x03;                           // High period of SCL&lt;br /&gt;
  I2CSCLL = 0x03;                           // Low period of SCL&lt;br /&gt;
  I2CNDAT = 0x01;                           // Transmit one byte&lt;br /&gt;
  I2CSA = slave;                             // Slave address&lt;br /&gt;
  U0CTL |= I2CEN;                           // Enable I2C, 7 bit addr,&lt;br /&gt;
  I2CIE = RXRDYIE;                          // I2C receive ready interrupt enable&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung der Quarze ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_XT2(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned int i;&lt;br /&gt;
  WDTCTL = WDTPW + WDTHOLD;             // Stop WDT&lt;br /&gt;
  BCSCTL1 &amp;amp;= ~XT2OFF;                   // XT2 = HF XTAL&lt;br /&gt;
  do &lt;br /&gt;
  {&lt;br /&gt;
    IFG1 &amp;amp;= ~OFIFG;                       // Clear OSCFault flag&lt;br /&gt;
    for (i = 0xFF; i &amp;gt; 0; i--);           // Time for flag to set&lt;br /&gt;
  }&lt;br /&gt;
  while ((IFG1 &amp;amp; OFIFG) != 0);          // OSCFault flag still set?                &lt;br /&gt;
  BCSCTL2 |= SELM1;                     // MCLK = XT2 (safe)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_XT(void) // high frequenz resonators ( 455 kHz - 8MhZ )&lt;br /&gt;
{&lt;br /&gt;
  unsigned int i;&lt;br /&gt;
  WDTCTL = WDTPW + WDTHOLD;             // Stop WDT&lt;br /&gt;
  BCSCTL1 |= XTS;                       // ACLK = LFXT1 = HF XTAL&lt;br /&gt;
  do &lt;br /&gt;
  {&lt;br /&gt;
    IFG1 &amp;amp;= ~OFIFG;                       // Clear OSCFault flag&lt;br /&gt;
    for (i = 0xFF; i &amp;gt; 0; i--);           // Time for flag to set&lt;br /&gt;
  }&lt;br /&gt;
  while ((IFG1 &amp;amp; OFIFG) == OFIFG);      // OSCFault flag still set?                &lt;br /&gt;
  BCSCTL2 |= SELM1+SELM0;               // MCLK = LFXT1 (safe)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Bei den neueren MSP430F55xx nicht vergessen, dass bei CPU-Taktfrequenzen über 8 MHz vorher die Kernspannung erhöht werden muss, sonst drohen Abstürze oder „rätselhaftes“ Verhalten. Eins der TI-Beispiele (12 MHz) „vergisst“ das sogar.&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des ADCs ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_ADC(void)&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0 = ADC12ON;	// ADC12ON / reference on Avcc&lt;br /&gt;
  P6SEL |= 0x01;        // P6.0 ADC option select &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
unsigned int sampling_ADC(void)&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0 |= ADC12SC + ENC;   // Sampling open&lt;br /&gt;
  ADC12CTL0 &amp;amp;= ~ADC12SC;        // Sampling closed, start conversion&lt;br /&gt;
  while ((ADC12CTL1 &amp;amp; ADC12BUSY) == 1);   // ADC12BUSY?&lt;br /&gt;
  return(ADC12MEM0);	// return the value read from ADC P6.0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des DACs ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void init_DAC(void)&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0 = REF2_5V + REFON;              // Internal 2.5V ref on&lt;br /&gt;
  DAC12_0CTL = DAC12IR + DAC12AMP_5 + DAC12ENC;   // Internal ref gain &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void write_DAC(unsigned int val)&lt;br /&gt;
{&lt;br /&gt;
  DAC12_0DAT = val;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des Timers A ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_TimerA(unsigned int cycles )&lt;br /&gt;
{&lt;br /&gt;
  TACTL = TASSEL1 + TACLR;              // SMCLK, clear TAR&lt;br /&gt;
  CCTL0 = CCIE;                         // CCR0 interrupt enabled&lt;br /&gt;
  CCR0 = cycles;&lt;br /&gt;
  TACTL |= MC_2;                         // Start Timer_A in continuous mode&lt;br /&gt;
  _EINT();                              // interrupt enable&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Timer A0 interrupt service routine&lt;br /&gt;
interrupt (TIMERA0_VECTOR) Timer_A(void)&lt;br /&gt;
{&lt;br /&gt;
  P1OUT ^= 0x01;                        // Toggle P1.0&lt;br /&gt;
  CCR0 += 50000;                        // Add Offset to CCR0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des Timers B ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_TimerB(unsigned int cycles)&lt;br /&gt;
{&lt;br /&gt;
  TBCTL = TBSSEL1 + TBCLR;              // SMCLK, clear TAR&lt;br /&gt;
  TBCCTL0 = CCIE;                       // CCR0 interrupt enabled&lt;br /&gt;
  TBCCR0 = cycles;&lt;br /&gt;
  TBCTL |= MC_2;                         // Start Timer_B in continuous mode&lt;br /&gt;
  _EINT();                              // interrupt enable&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Timer B0 interrupt service routine&lt;br /&gt;
interrupt (TIMERB0_VECTOR) Timer_B(void)&lt;br /&gt;
{&lt;br /&gt;
  P1OUT ^= 0x01;                        // Toggle P1.0&lt;br /&gt;
  TBCCR0 += 50000;                      // Add Offset to CCR0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des Watchdogs ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_wdt(void)&lt;br /&gt;
{&lt;br /&gt;
  WDTCTL = WDT_MDLY_32;                 // Set Watchdog Timer interval to ~30ms&lt;br /&gt;
  IE1 |= WDTIE;                         // Enable WDT interrupt&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Watchdog Timer interrupt service routine&lt;br /&gt;
interrupt (WDT_VECTOR) watchdog_timer(void)&lt;br /&gt;
{&lt;br /&gt;
  // do this, in an case of an interrupt&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  WDTCTL = WDTPW + WDTHOLD;	// Watchdog anhalten&lt;br /&gt;
  P1DIR |= 0x01;		// P1.0 als Ausgang&lt;br /&gt;
&lt;br /&gt;
  for (;;)&lt;br /&gt;
  {&lt;br /&gt;
    volatile unsigned i;	// volatile, sonst wird die Warteschleife „wegoptimiert“&lt;br /&gt;
    P1OUT ^= 0x01;		// P1.0 umschalten mit Exklusiv-ODER&lt;br /&gt;
&lt;br /&gt;
    i = 10000;			// Warteschleife in Software&lt;br /&gt;
    do; while (--i);		// (CPU-Leistung „verheizen“)&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung der GPIO ==&lt;br /&gt;
Die Ein/Ausgabeleitungen haben beim MSP430, je nach Ausbaustufe, folgende Fähigkeiten:&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Einzeln (bitweise) programmierbare Ein/Ausgabe (&amp;lt;b&amp;gt;PxDIR&amp;lt;/b&amp;gt;, &amp;lt;b&amp;gt;PxOUT&amp;lt;/b&amp;gt;)&lt;br /&gt;
&amp;lt;li&amp;gt;Unabhängige Lese-Adresse (&amp;lt;b&amp;gt;PxIN&amp;lt;/b&amp;gt;)&lt;br /&gt;
&amp;lt;li&amp;gt;Ansprechbar als 8-Bit-Ports oder je paarweise als 16-bit-Port, bspw. P1 + P2 = PA usw.&lt;br /&gt;
&amp;lt;li&amp;gt;Interrupt auf Pegelwechsel einzelner Portpins (nur P1 und P2) (&amp;lt;b&amp;gt;PxIES&amp;lt;/b&amp;gt;)&lt;br /&gt;
&amp;lt;li&amp;gt;Pull-Up, Pull-Down oder kein Widerstand auswählbar (&amp;lt;b&amp;gt;PxREN&amp;lt;/b&amp;gt;, PxOUT)&lt;br /&gt;
&amp;lt;li&amp;gt;Einstellbare Treiberstärke (reduziert und voll) (&amp;lt;b&amp;gt;PxDS&amp;lt;/b&amp;gt;)&lt;br /&gt;
&amp;lt;li&amp;gt;Ein bis zwei Peripheriefunktionen pro Pin (&amp;lt;b&amp;gt;PxSEL&amp;lt;/b&amp;gt;), auswählbar mittels PxDIR (d.h. bei zwei Peripheriefunktionen ist eine Ausgang und die andere Eingang)&lt;br /&gt;
&amp;lt;li&amp;gt;Das JTAG-Port (4 Pins) und das USB-Port (2 Pins) ist standardmäßig ein E/A-Port (MSP430F55xx)&lt;br /&gt;
&amp;lt;li&amp;gt;Erweiterte Peripheriezuordnung bei P4 (MSP430F55xx) mittels Port Mapping Controller&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Nicht 5-V-verträglich!!&amp;lt;/b&amp;gt; Keinem Portpin darf ohne genügend großen Vorwiderstand 5 V angeboten werden. Ableitströme dürfen nicht zum Ansteigen der Speisespannung führen!&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Manche Portpins haben ein gemeinsames PxSEL, etwa:&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;das JTAG-Port (entweder alle 4 oder kein Pin zugeordnet)&lt;br /&gt;
&amp;lt;li&amp;gt;das USB-Port (entweder Portpin oder USB D+ und D–)&lt;br /&gt;
&amp;lt;li&amp;gt;die Quarz-Anschlüsse (das niederwertige PxSEL schaltet beide Portpins)&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle Portpins sind beim Einschalten (PUC) wie folgt initialisiert:&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Eingang ohne Pull-Up oder Pull-Down&lt;br /&gt;
&amp;lt;li&amp;gt;Reduzierte Treiberstärke&lt;br /&gt;
&amp;lt;li&amp;gt;Kein Pegelwechsel-Interrupt&lt;br /&gt;
&amp;lt;li&amp;gt;Keine Peripherie-Zuordnung&lt;br /&gt;
&amp;lt;li&amp;gt;Der Inhalt des Ausgaberegisters &amp;lt;b&amp;gt;PxOUT&amp;lt;/b&amp;gt; ist undefiniert!&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Alle ungenutzten Anschlüsse sollten per PullDown (&amp;lt;b&amp;gt;PxREN&amp;lt;/b&amp;gt; und &amp;lt;b&amp;gt;PxOUT&amp;lt;/b&amp;gt;) festgelegt werden.&lt;br /&gt;
&lt;br /&gt;
Kein MSP430 hat einen herausgeführten Busanschluss, etwa um mehr RAM anzubinden.&lt;br /&gt;
&lt;br /&gt;
== Initialisierung von PWM ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_PWM_TimerA(void)&lt;br /&gt;
{&lt;br /&gt;
  TACTL = TASSEL1 + TACLR;              // SMCLK, Clear Tar&lt;br /&gt;
  CCR0 = 512-1;                         // PWM Period&lt;br /&gt;
  CCTL1 = OUTMOD_7;                     // CCR1 reset/set&lt;br /&gt;
  P1DIR |= 0x04;                        // P1.2 PWM output&lt;br /&gt;
  P1SEL |= 0x04;                        // P1.2 and TA1/2 otions&lt;br /&gt;
  TACTL |= MC0;                         // Start Timer_A in up mode&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void set_PWM_duty_cycle(unsigned char duty)&lt;br /&gt;
{&lt;br /&gt;
  CCR1 = duty;                           // CCR1 PWM duty cycle &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= Interrupts: =&lt;br /&gt;
&lt;br /&gt;
== UARTs ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// z. B. ein Echo mit dem MSPGCC-Compiler:&lt;br /&gt;
interrupt (UART0RX_VECTOR) usart0_rx(void)&lt;br /&gt;
{&lt;br /&gt;
   TXBUF0=RXBUF0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// z. B. ein Echo mit dem ImageCraft ICC430-Compiler:&lt;br /&gt;
#pragma interrupt_handler usart0_rx:UART0RX_VECTOR&lt;br /&gt;
void usart0_rx(void)&lt;br /&gt;
{&lt;br /&gt;
   TXBUF0=RXBUF0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Die Funktionen selbst können natürlich auch anders genannt werden.&lt;br /&gt;
&lt;br /&gt;
== Timer ==&lt;br /&gt;
&lt;br /&gt;
== IOs ==&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= Softwareroutinen: =&lt;br /&gt;
&lt;br /&gt;
== I2C/TWI in Software ==&lt;br /&gt;
Diese Routinen wurden ursprünglich für einen MSP430F149 geschrieben. Es werden ausschließlich IOs benutzt. Da Code in C geschrieben wurde sollte er sich einfach auf alle MSP430s ohne (aber auch mit I²C) portieren lassen. Der ist zwar nicht ganz schön, aber er funktioniert soweit ganz gut. Auch ein Beispiel ist dabei.&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/attachment.php/324877/soft-i2c.zip&lt;br /&gt;
&lt;br /&gt;
== PWM ==&lt;br /&gt;
&lt;br /&gt;
Untenstehender Code ist nur mit msp320-gcc getestet.&lt;br /&gt;
&lt;br /&gt;
Folgende Routine initialisiert den Timer als Up-Counter mit der Clock-Quelle SMCLK und einem Teiler von 8. Zudem wird der Interrupt aktiviert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void timerA_init(void)&lt;br /&gt;
{&lt;br /&gt;
	TACTL =  TASSEL_SMCLK | TACLR | ID_DIV8 | TAIE;&lt;br /&gt;
	TACTL |= MC_UPTO_CCR0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um den Timer zu starten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void timerA_start(int timing[2], int mode)&lt;br /&gt;
{&lt;br /&gt;
	TACCTL0 = mode;&lt;br /&gt;
	TACCTL0 |= CCIE ;                // enable interrupt&lt;br /&gt;
	TACCTL1 = mode;&lt;br /&gt;
	TACCR0 = timing[0];&lt;br /&gt;
	TACCR1 = timing[1];&lt;br /&gt;
	TAR = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktion wird normalerweise mit &#039;mode&#039; 3 aufgerufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
timerA_start(timing, OUTMOD_SET_RESET);&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
timing[0] enthaelt die komplette Zyklendauer einer PWM-Phase (H und L)&lt;br /&gt;
Beispiel: Um eine Pulsfrequenz von 125 Hz bei einem SMCLK von 1.0 MHz zu erhalten, gilt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;timing_0 = 1.0e6 / 8 / 125 = 1000&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
timing[1] schliesslich enthält die Zyklendauer des H-Pulses und ist immer kleiner als timing[0]. Bei einem &#039;duty cycle&#039; (Tastverhältnis) 50% gilt also&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;timing_1 = 500&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zu beachten ist, dass der Timerkanal 0 bei manchen Modi (wie dem obenstehenden) für die PWM nicht genutzt wird, &amp;quot;TACCTL0 = mode&amp;quot; keinen speziellen Effekt zeigt (siehe auch Manual).&lt;br /&gt;
&lt;br /&gt;
Deswegen wird das PWM-Signal auch an TA1 abgegriffen, nicht an TA0.&lt;br /&gt;
&lt;br /&gt;
Schlussendlich muss der entsprechende Ausgangspin für TA1 konfiguriert werden. Beim F2013 z.&amp;amp;nbsp;B. geschieht dies für P1.2 per&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	P1SEL |= 0x04;  // Enable primary peripheral&lt;br /&gt;
	P1DIR |= 0x04;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was war nun mit dem Interrupt? Falls wir z.&amp;amp;nbsp;B. die Zyklen zählen wollen, definieren wir einen Interrupt-Handler:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;signal.h&amp;gt; // &#039;interrupt&#039; makro&lt;br /&gt;
interrupt (TIMERA0_VECTOR) timera0_isr(void)&lt;br /&gt;
{&lt;br /&gt;
	g_count++;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Schlussendlich müssen wir noch die Interrupts im Initialisierungscode aktivieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
_EINT();&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Senden eines Bytes ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void SendUSART0c(char c)             // ein einzelnes zeichen über die serielle schnittstelle (USART0) senden&lt;br /&gt;
                                     // FJG: Obacht: x12xx : IFG1 =&amp;gt; IFG2 !&lt;br /&gt;
{&lt;br /&gt;
  while (!(IFG1 &amp;amp; UTXIFG0));           // warten, bis USART0 TX-buffer sendebereit&lt;br /&gt;
  TXBUF0 = c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SendUSART1c(char c)             // ein einzelnes zeichen über die serielle schnittstelle (USART1) senden&lt;br /&gt;
{&lt;br /&gt;
  while (!(IFG2 &amp;amp; UTXIFG1));           // warten, bis USART1 TX-buffer sendebereit&lt;br /&gt;
  TXBUF1 = c;&lt;br /&gt;
}     &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Senden eines Strings ==&lt;br /&gt;
Nullterminierte Strings; zugehörige Interrupts dürfen nicht aktiviert sein&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void SendUSART0(char* str)	// einen String über die serielle Schnittstelle (USART0) senden&lt;br /&gt;
{&lt;br /&gt;
  while (*str != 0)&lt;br /&gt;
  {&lt;br /&gt;
    while (!(IFG1 &amp;amp; UTXIFG0));	// warten bis USART0 TX-Puffer frei (leer)&lt;br /&gt;
    TXBUF0 = *str++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SendUSART1(char* str)	// einen String über die serielle Schnittstelle (USART1) senden&lt;br /&gt;
{&lt;br /&gt;
  while (*str)&lt;br /&gt;
  {&lt;br /&gt;
    while (!(IFG2 &amp;amp; UTXIFG1));	// warten bis USART1 TX-Puffer frei (leer)&lt;br /&gt;
    TXBUF1 = *str++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Empfangen eines Bytes (interruptgesteuert)  // Receiving a byte-&amp;gt; Interrupt controlled ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/*Hab diese Interrupt Funktion für meine I²C Kommunikation verwendet&lt;br /&gt;
Startcondition wird erkannt, aber nicht Stop, da man die Flanken(die den&lt;br /&gt;
interrupt auslösen) umkehren müsste, aber dann keine Startkondition erkannt werden kann.&lt;br /&gt;
&lt;br /&gt;
Hab mir jetzt nicht die mühe gemacht alles rauszupicken was ihr nicht braucht.&lt;br /&gt;
Wer sich auskennt, kann das auch selber machen.&lt;br /&gt;
&lt;br /&gt;
Das Busy wird fürs stretching verwendet(CLK wird auf low gezogen)&lt;br /&gt;
*/  &lt;br /&gt;
&lt;br /&gt;
#pragma vector = PORT1_VECTOR           // Port 1 - Interrupt-Funktions-&amp;quot;Alias&amp;quot;&lt;br /&gt;
__interrupt void Interrupt_Port1()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
//  I2CTransfer = 0;&lt;br /&gt;
&lt;br /&gt;
    TACTL |= TACLR;&lt;br /&gt;
    TACTL |= TAIE;&lt;br /&gt;
#ifdef WD&lt;br /&gt;
    WDTCTL = WDTPW + WDTCNTCL;&lt;br /&gt;
#endif&lt;br /&gt;
    &lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
  if ((P1IFG &amp;amp; 0x04) &amp;amp;&amp;amp; !(I2CCLK)) { //if startdataimpuls but clk low is detected --return--&lt;br /&gt;
    P1IFG &amp;amp;= ~0x0C;&lt;br /&gt;
    return;}&lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
//    P1IE &amp;amp;= ~0x0C;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
  if ((P1IFG &amp;amp; 0x04) &amp;amp;&amp;amp; I2CCLK)   //Start Condition       (I2CStart)&lt;br /&gt;
    {&lt;br /&gt;
      P1IFG &amp;amp;= ~0x0C;&lt;br /&gt;
      &lt;br /&gt;
//    I2CTransfer = 1;&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
        P1IE &amp;amp;= ~0x0C;&lt;br /&gt;
//        TACTL |= TACLR;&lt;br /&gt;
//        TACTL |= TAIE;&lt;br /&gt;
//        _EINT();&lt;br /&gt;
&lt;br /&gt;
      &lt;br /&gt;
/*#ifdef Debug&lt;br /&gt;
      P2OUT |= 0x04;&lt;br /&gt;
      P2DIR |= 0x04; &lt;br /&gt;
#endif*/&lt;br /&gt;
      &lt;br /&gt;
//      Wait(10);&lt;br /&gt;
//      while(I2CCLK)  {CheckTimer;}&lt;br /&gt;
&lt;br /&gt;
//      set_Busy;&lt;br /&gt;
  &lt;br /&gt;
      BitCnt = 0x01;&lt;br /&gt;
      ByteCnt = 0;&lt;br /&gt;
//      I2CByte = 0;&lt;br /&gt;
      StartCondition = 1;&lt;br /&gt;
//      CRCByte = 0x00;&lt;br /&gt;
      GetData = 0;&lt;br /&gt;
      I2CTransfer = 0;&lt;br /&gt;
    &lt;br /&gt;
//    clr_Busy;&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
        _DINT();&lt;br /&gt;
        P1IE |= 0x0C;&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
  P1IFG &amp;amp;= ~0x0C;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
    TACTL |= TACLR;&lt;br /&gt;
    _EINT();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
  if (I2CCLK)&lt;br /&gt;
  {&lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
      TACTL |= TAIE;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    I2CByte &amp;lt;&amp;lt;= 1; &lt;br /&gt;
    if (I2CDAT){&lt;br /&gt;
      I2CByte += 0x01;&lt;br /&gt;
     }&lt;br /&gt;
    I2CTransfer = 1;&lt;br /&gt;
    while(I2CCLK) {CheckTimer;}&lt;br /&gt;
    set_Busy;&lt;br /&gt;
    BitCnt &amp;lt;&amp;lt;= 1;&lt;br /&gt;
  &lt;br /&gt;
    if(!(BitCnt == 0x00))&lt;br /&gt;
    {&lt;br /&gt;
      clr_Busy;  &lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      _NOP();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
  }&lt;br /&gt;
//----------------------------------------------------------------------------  &lt;br /&gt;
&lt;br /&gt;
P1DIR &amp;amp;= ~0x0C;&lt;br /&gt;
P1IFG = 0x00;&lt;br /&gt;
P1IE |= 0x0C;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ermitteln der Temperatur ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// von FJG info@aqua-sun.net :&lt;br /&gt;
// ---------------   Temperatur des Chips   ---------------------&lt;br /&gt;
&lt;br /&gt;
#define T_Faktor_a1000       ((long)103)     // REF 1,5V&lt;br /&gt;
#define T_Faktor_b1000       ((long)172)     // REF 2,5V&lt;br /&gt;
#define T_Faktor_c1000       ((long)278000)&lt;br /&gt;
&lt;br /&gt;
int Hole_Temp(void)	// Temperatur ch 10&lt;br /&gt;
{			// Temp = N* 0,17193 -278  1000Temp = N*172 -278000 bei 2,5V&lt;br /&gt;
  long Temp_L;&lt;br /&gt;
  int  Temp , Delta ;&lt;br /&gt;
&lt;br /&gt;
  Start_AD();&lt;br /&gt;
&lt;br /&gt;
  Temp_L = ((long)ADC12MEM10 * T_Faktor_a1000) - T_Faktor_c1000 ;&lt;br /&gt;
  Temp   = (int)( Temp_L / 1000);&lt;br /&gt;
&lt;br /&gt;
  Delta = Read_EEPROM( EPROM_INTERN_BL1_R_ADR,DELTA_TEMP_ADR );	   // falls Temp Messung&lt;br /&gt;
  if( Delta &amp;lt;= 120 &amp;amp;&amp;amp; Delta &amp;gt;= 80 ) Delta -= 100 ; else Delta = 0; // ungenau war&lt;br /&gt;
                                                                   // siehe dazu TI&lt;br /&gt;
  return (Temp + Delta);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// INIT AD&lt;br /&gt;
// AD muss angestoßen werden mit :   Start_AD()&lt;br /&gt;
&lt;br /&gt;
// #define ADC12TL0WERT15	(SHT1_8 + SHT0_3 + MSC + REFON + ADC12ON)&lt;br /&gt;
#define ADC12TL0WERT15		(SHT1_3 + SHT0_3 + MSC + REFON + ADC12ON)&lt;br /&gt;
#define ADC12TL0WERT25		(SHT1_3 + SHT0_3 + MSC + +REF2_5V + REFON + ADC12ON)&lt;br /&gt;
&lt;br /&gt;
//                        Start CH0 , ADC12SCBIT , SampleT , F/2 , MCLK , Sequenze of CH&lt;br /&gt;
#define ADC12CTL1WERT   ( CSTARTADD_0 + SHS_0 + SHP + ADC12DIV_1 + ADC12SSEL_2 + CONSEQ_1 )&lt;br /&gt;
&lt;br /&gt;
void adc12_init()	// ADC12CTL0 modifizieren nur mit ENC = 0&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0   = 0x00;&lt;br /&gt;
  ADC12CTL1   = ADC12CTL1WERT ;&lt;br /&gt;
&lt;br /&gt;
  ADC12MCTL0  = INCH_0;                  &lt;br /&gt;
  ADC12MCTL1  = INCH_1;                  &lt;br /&gt;
  ADC12MCTL2  = INCH_2;&lt;br /&gt;
  ADC12MCTL3  = INCH_3;&lt;br /&gt;
  ADC12MCTL4  = INCH_4;&lt;br /&gt;
  ADC12MCTL5  = INCH_5;&lt;br /&gt;
  ADC12MCTL6  = INCH_6;&lt;br /&gt;
  ADC12MCTL7  = INCH_7;                  &lt;br /&gt;
  ADC12MCTL8  = INCH_8;		// VeREF+&lt;br /&gt;
  ADC12MCTL9  = INCH_9;		// VeREF-&lt;br /&gt;
&lt;br /&gt;
  ADC12MCTL10 = INCH_10 + SREF_1 ;&lt;br /&gt;
  ADC12MCTL11 = INCH_11 + SREF_1 +EOS;&lt;br /&gt;
&lt;br /&gt;
  ADC12IE     = 0x00;&lt;br /&gt;
  ADC12CTL0   = ADC12TL0WERT15 ;&lt;br /&gt;
  ADC12CTL0  |= 0x0003;		// ENC + ADC12SC = Enable Conversation + StartConversation&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------   Diverses AD_Wandler   --------------------&lt;br /&gt;
&lt;br /&gt;
void Start_AD(void)&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0 &amp;amp;= ~ENC;&lt;br /&gt;
  ADC12CTL0 |= (ADC12SC+ENC);&lt;br /&gt;
  NOP();&lt;br /&gt;
  NOP();&lt;br /&gt;
  ADC12CTL0 &amp;amp;=~ADC12SC;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#ifndef TEST_AD&lt;br /&gt;
#define Ist_AD_Busy()        ( ADC12CTL1 &amp;amp; ADC12BUSY )&lt;br /&gt;
#else&lt;br /&gt;
int Ist_AD_Busy()&lt;br /&gt;
{&lt;br /&gt;
  if (ADC12CTL1 &amp;amp; ADC12BUSY)&lt;br /&gt;
  {&lt;br /&gt;
     printf(&amp;quot;\n\r... BUSY ...&amp;quot;); &lt;br /&gt;
     delay_ms(500);&lt;br /&gt;
     return(1);&lt;br /&gt;
  }&lt;br /&gt;
  return(0);&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ansteuerung eines LCD &amp;amp;#8211; Zeichendisplays // Controlling the LCD character==&lt;br /&gt;
&lt;br /&gt;
Der folgende Quelltext-Schnipsel ist für Siebensegmentanzeigen gedacht,&lt;br /&gt;
&#039;&#039;nicht&#039;&#039; für die mit dem HD44780-kompatiblen Controller.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
  // hier nun der vollständige Code 14 Jan 08&lt;br /&gt;
  // von mir seinerseits entwickelt, ich hoffe, er ist eine Hilfe&lt;br /&gt;
 &lt;br /&gt;
  // Aquasun Germany  Remscheid  Franz-Josef Günther&lt;br /&gt;
  // Development info@aqua-sun.net&lt;br /&gt;
&lt;br /&gt;
  // LCD.h Header für Allgemeines zum LCD ab 02.12.04 Aquasun GUE&lt;br /&gt;
  // C-Compiler ICC&lt;br /&gt;
&lt;br /&gt;
  // -------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
  // Beispiel :&lt;br /&gt;
&lt;br /&gt;
int Aepfel = 8;&lt;br /&gt;
&lt;br /&gt;
print_LCD(&amp;quot;\nRotkaepchen hat %d Aepfel im Korb&amp;quot;,Aepfel);&lt;br /&gt;
&lt;br /&gt;
  // -------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;_const.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdarg.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt; STRING.H&amp;gt;&lt;br /&gt;
#include &amp;lt; stdio.h &amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LCD_MAX          8&lt;br /&gt;
#define Mem_LCD         16&lt;br /&gt;
&lt;br /&gt;
#ifndef Mem_LCD&lt;br /&gt;
#define Mem_LCD 20&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
    Header für 8 x 7 Segmentanzeigen 2 MUX MSP430 x4xx&lt;br /&gt;
&lt;br /&gt;
    V3 = V1 (VDD) , V5 = 0 ,&lt;br /&gt;
&lt;br /&gt;
    für : LCD siehe TI Info dazu,&lt;br /&gt;
    für : LED&#039;s :&lt;br /&gt;
&lt;br /&gt;
    LED mit gemeinsamer Kathode, SP über Buffer 74HC245 (8x) o.ä.&lt;br /&gt;
    /G=L , DIR=H A ==&amp;gt; B an 5V , COM mit Emitterfolger PNP ViL=0,8V ViH=2V&lt;br /&gt;
&lt;br /&gt;
    LED mit gemeinsamer Anode, COM über PNP Transistor invertiert&lt;br /&gt;
    und SP über ULN2804(8x) getrieben&lt;br /&gt;
            _   ___   ___   ___&lt;br /&gt;
    COM0 :   |_|   |_|   |_|&lt;br /&gt;
            ____   ___   ___&lt;br /&gt;
    COM1 :      |_|   |_|   |_|&lt;br /&gt;
             __    __    __&lt;br /&gt;
    SPon :  |  |__|  |__|  |__| mit COM0&lt;br /&gt;
&lt;br /&gt;
    SPin :   0  1  2  3  4  5  6  7    8  9 10 11 12 13 14 15&lt;br /&gt;
    COM0 :  1a 1b 1c 1d 1e 1f 1g 1h   2a 2b 2c 2d 2e 2f 2g 2h&lt;br /&gt;
    COM1 :  5a 5b 5c 5d 5e 5f 5g 5h   6a 6b 6c 6d 6e 6f 6g 6h&lt;br /&gt;
&lt;br /&gt;
    SPin :  16 17 18 19 20 21 22 23   24 25 26 27 28 29 30 31&lt;br /&gt;
    COM0 :  3a 3b 3c 3d 3e 3f 3g 3h   4a 4b 4c 4d 4e 4f 4g 4h&lt;br /&gt;
    COM1 :  7a 7b 7c 7d 7e 7f 7g 7h   8a 8b 8c 8d 8e 8f 8g 8h&lt;br /&gt;
&lt;br /&gt;
    COM        3 2   1  0   3 2   1  0&lt;br /&gt;
    MAP 0A0    - -   8h 4h  - -   8g 4g&lt;br /&gt;
        09F    - -   8f 4f  - -   8e 4e&lt;br /&gt;
        09E    - -   8d 4d  - -   8c 4c&lt;br /&gt;
        09D    - -   8b 4b  - -   8a 4a&lt;br /&gt;
&lt;br /&gt;
        09C    - -   7h 3h  - -   7g 3g&lt;br /&gt;
        09B    - -   7f 3f  - -   7e 3e&lt;br /&gt;
        09A    - -   7d 3d  - -   7c 3c&lt;br /&gt;
        099    - -   7b 3b  - -   7a 3a&lt;br /&gt;
&lt;br /&gt;
        098    - -   6h 2h  - -   6g 2g&lt;br /&gt;
        097    - -   6f 2f  - -   6e 2e&lt;br /&gt;
        096    - -   6d 2d  - -   6c 2c&lt;br /&gt;
        095    - -   6b 2b  - -   6a 2a&lt;br /&gt;
&lt;br /&gt;
        094    - -   5h 1h  - -   5g 1g&lt;br /&gt;
        093    - -   5f 1f  - -   5e 1e&lt;br /&gt;
        092    - -   5d 1d  - -   5c 1c&lt;br /&gt;
        091    - -   5b 1b  - -   5a 1a&lt;br /&gt;
&lt;br /&gt;
             ---a----&lt;br /&gt;
            |        |&lt;br /&gt;
          f |        | b&lt;br /&gt;
            |        |&lt;br /&gt;
             ---g----&lt;br /&gt;
            |        |&lt;br /&gt;
          e |        | c&lt;br /&gt;
            |        |    _&lt;br /&gt;
              ---d---    | | h&lt;br /&gt;
                          -&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
#define a0      0x01  // Char durch rechtsschiften &amp;amp; 0x..&lt;br /&gt;
#define b0      0x10&lt;br /&gt;
#define c0      0x02&lt;br /&gt;
#define d0      0x20&lt;br /&gt;
#define e0      0x04&lt;br /&gt;
#define f0      0x40&lt;br /&gt;
#define g0      0x08&lt;br /&gt;
#define h0      0x80&lt;br /&gt;
&lt;br /&gt;
#define ch_0    ( e0+f0+a0+b0+c0+d0 )&lt;br /&gt;
#define ch_1    ( b0+c0 )&lt;br /&gt;
#define ch_2    ( a0+b0+g0+e0+d0 )&lt;br /&gt;
#define ch_3    ( a0+b0+g0+c0+d0 )&lt;br /&gt;
#define ch_4    ( f0+g0+b0+c0 )&lt;br /&gt;
#define ch_5    ( a0+f0+g0+c0+d0 )&lt;br /&gt;
#define ch_6    ( a0+f0+c0+d0+e0+g0 )&lt;br /&gt;
#define ch_7    ( a0+b0+c0 )&lt;br /&gt;
#define ch_8    ( a0+b0+c0+d0+e0+f0+g0 )&lt;br /&gt;
#define ch_9    ( a0+b0+c0+f0+g0 )&lt;br /&gt;
&lt;br /&gt;
#define ch_a    ( a0+b0+c0+d0+e0+g0 )&lt;br /&gt;
#define ch_A    ( e0+f0+a0+b0+c0+g0 )&lt;br /&gt;
#define ch_B    ( a0+b0+c0+d0+e0+f0+g0 )&lt;br /&gt;
#define ch_b    ( f0+e0+d0+c0+g0 )&lt;br /&gt;
#define ch_c    ( g0+e0+d0 )&lt;br /&gt;
#define ch_C    ( a0+f0+e0+d0 )&lt;br /&gt;
#define ch_d    ( b0+c0+d0+e0+g0 )&lt;br /&gt;
#define ch_D    ( e0+f0+a0+b0+c0+d0 )&lt;br /&gt;
#define ch_e    ( f0+e0+d0+a0+b0+g0 )&lt;br /&gt;
#define ch_E    ( a0+f0+g0+d0+e0 )&lt;br /&gt;
#define ch_F    ( a0+f0+g0+e0 )&lt;br /&gt;
#define ch_G    ( a0+f0+c0+d0+e0+g0 )&lt;br /&gt;
#define ch_g    ( a0+b0+c0+d0+f0+g0 )&lt;br /&gt;
#define ch_h    ( f0+c0+e0+g0 )&lt;br /&gt;
#define ch_H    ( f0+c0+e0+g0+b0 )&lt;br /&gt;
#define ch_I    ( f0+e0 )&lt;br /&gt;
#define ch_i    ( e0 )&lt;br /&gt;
#define ch_k    ( b0+e0+f0+g0 )&lt;br /&gt;
#define ch_L    ( f0+e0+d0 )&lt;br /&gt;
#define ch_l    ( b0+c0 )&lt;br /&gt;
#define ch_M    ( c0+b0+e0+f0 )&lt;br /&gt;
&lt;br /&gt;
#define ch_n    ( e0+g0+c0 )&lt;br /&gt;
#define ch_N    ( a0+b0+c0+e0+f0 )&lt;br /&gt;
#define ch_o    ( e0+g0+c0+d0 )&lt;br /&gt;
#define ch_O    ( e0+f0+a0+b0+c0+d0 )&lt;br /&gt;
#define ch_P    ( e0+f0+a0+b0+g0 )&lt;br /&gt;
#define ch_r    ( g0+e0 )&lt;br /&gt;
#define ch_S    ( a0+f0+g0+c0+d0 )&lt;br /&gt;
#define ch_T    ( a0+f0+e0 )&lt;br /&gt;
#define ch_U    ( f0+e0+d0+c0+b0 )&lt;br /&gt;
#define ch_u    ( e0+d0+c0 )&lt;br /&gt;
#define ch_X    ( b0+g0+e0 )&lt;br /&gt;
#define ch_Y    ( f0+g0+b0+c0+d0 )&lt;br /&gt;
#define ch_Z    ( a0+b0+g0+e0+d0 )&lt;br /&gt;
#define ch_Blank  0&lt;br /&gt;
#define Unter_  ( d0 )&lt;br /&gt;
#define DP_Pkt  ( h0 )&lt;br /&gt;
#define Minus   ( g0 )&lt;br /&gt;
#define Tilde   ( a0+g0+d0 )&lt;br /&gt;
#define GLEICH  ( g0+d0 )&lt;br /&gt;
#define FRAGE   ( a0+f0+g0+c0+d0+h0 )&lt;br /&gt;
&lt;br /&gt;
// #define Digi_X1ste         LCDM17       // die erste freie LCD_Mem_Stelle 18,19,20&lt;br /&gt;
                                           // in lcd_init() auf 0&lt;br /&gt;
&lt;br /&gt;
// extern unsigned int Digi_X;             // für LCD&lt;br /&gt;
&lt;br /&gt;
const char  letter[] = &amp;quot;0123456789 _.-~?=AaBbCcDdEeFGgHhIiKkLlMmNnOoPRrSsTtUuxXYyZz&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
const int hex_Wert[] = {&lt;br /&gt;
      ch_0,    ch_1, ch_2, ch_3, ch_4, ch_5, ch_6, ch_7, ch_8, ch_9,&lt;br /&gt;
      ch_Blank, Unter_, DP_Pkt, Minus, Tilde, FRAGE , GLEICH ,&lt;br /&gt;
      ch_A, ch_a, ch_B, ch_b, ch_C, ch_c, ch_D, ch_d, ch_E, ch_e, ch_F, ch_G, ch_g,&lt;br /&gt;
      ch_H, ch_h, ch_I, ch_i, ch_k, ch_k, ch_L, ch_l , ch_M, ch_M, ch_N, ch_n, ch_O, ch_o,&lt;br /&gt;
      ch_P, ch_r, ch_r, ch_S, ch_S, ch_T, ch_T, ch_U, ch_u, ch_X, ch_X,&lt;br /&gt;
      ch_Y, ch_Y, ch_Z , ch_Z  };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void All_LCD(void);&lt;br /&gt;
void Clear_LCD_M(void);                     // Clears LCD memory&lt;br /&gt;
void Clear_LCD(void);&lt;br /&gt;
void lcd_init(void); in ini&lt;br /&gt;
void Write_LCD_Hex(int Digit_n , int HEX_Zeichen);&lt;br /&gt;
void SetzeDP( int welches_Displ);&lt;br /&gt;
int putchar_LCD(char);&lt;br /&gt;
int print_LCD(CONST char *fmt, ...)  ;      // LCD 1-7 Digit nur realisiert sonst 1...11&lt;br /&gt;
extern int _print(void (*_put)(char), const char *fmt, va_list va);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void Clear_LCD_M(void)&lt;br /&gt;
{&lt;br /&gt;
    int i;&lt;br /&gt;
    for (i =0; i&amp;lt;Mem_LCD; i++) LCDMEM[i] = 0;   // Mem_LCD extern , abhängig vom Display&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void Clear_LCD(void)&lt;br /&gt;
{&lt;br /&gt;
      print_LCD(&amp;quot;\n_&amp;quot;);                     // beim Cursor wird DIGIT_X nicht weitergezählt&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void All_LCD(void)                          // alle = 8888..&lt;br /&gt;
{&lt;br /&gt;
    int i;&lt;br /&gt;
    for (i=0; i&amp;lt;Mem_LCD; i++) LCDMEM[i] = 0xFF;   // Mem_LCD extern , abhängig vom Display&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
int putchar_LCD(char c_in)&lt;br /&gt;
{&lt;br /&gt;
                                            //  Digi_X  == LCDM17&lt;br /&gt;
    int i, leng;&lt;br /&gt;
    char c = c_in;&lt;br /&gt;
    leng = strlen(letter);                  // Länge ohne /0 , 1..&lt;br /&gt;
&lt;br /&gt;
      if( (c==&#039;\n&#039;) || (c==&#039;\r&#039;))           // nichts gefunden =&amp;gt; CLR_Displ&lt;br /&gt;
        {&lt;br /&gt;
          Digi_X =1;  Clear_LCD_M(); return c;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    for(i=0;i&amp;lt;leng;i++) { if( c == letter[i] ) break; }        // Char gefunden&lt;br /&gt;
&lt;br /&gt;
    if(i == leng)&lt;br /&gt;
      {&lt;br /&gt;
        for(i=0;i&amp;lt;leng;i++) { if( &#039; &#039; == letter[i] ) break; }  // Char &#039; &#039; als Ersatz&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    if(i&amp;lt;leng)                              // es gibt &#039;.&#039; als Ersatz&lt;br /&gt;
      {&lt;br /&gt;
        Write_LCD_Hex((int)Digi_X , i);     // Digi beschreiben oder löschen&lt;br /&gt;
                                            // if(Digi_X) Write_LCD_Hex(Digi_X , i);&lt;br /&gt;
        if(C != &#039;_&#039;)Digi_X++;&lt;br /&gt;
        if(Digi_X &amp;gt; LCD_MAX) Digi_X =1;     // if(Digi_X &amp;gt;= Mem_LCD) Digi_X =1;&lt;br /&gt;
      }&lt;br /&gt;
    return c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
int print_LCD(CONST char *fmt, ...)&lt;br /&gt;
{&lt;br /&gt;
    va_list va;&lt;br /&gt;
    int val;&lt;br /&gt;
&lt;br /&gt;
    va_start(va, fmt);&lt;br /&gt;
    val = _print((void (*)(char))putchar_LCD, fmt, va);&lt;br /&gt;
    va_end(va);&lt;br /&gt;
&lt;br /&gt;
    return val;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
   // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void lcd_init(void)             // LCD init&lt;br /&gt;
{&lt;br /&gt;
 LCDCTL=0xAD;                   // LCDM567.2,LCDM567.0,LCDM234.1,LCDM234.0,LCDM0&lt;br /&gt;
 LCDM1 =0x00;                   // 0xAD = 101 01 101&lt;br /&gt;
 LCDM2 =0x00;                   // 101 = LCDP2 ,0, LCDP0 =&amp;gt; S0..S31&lt;br /&gt;
 LCDM3 =0x00;                   //  01 = LCDMX1,LCDMX0   =&amp;gt; 2-mux&lt;br /&gt;
 LCDM4 =0x00;                   // 101 = LCDSON,x,LCDON Segments ON ,x,LCD ON&lt;br /&gt;
 LCDM5 =0x00;&lt;br /&gt;
 LCDM6 =0x00; LCDM7 =0x00; LCDM8 =0x00; LCDM9 =0x00; LCDM10 =0x00;LCDM11 =0x00;&lt;br /&gt;
 LCDM12=0x00; LCDM13=0x00; LCDM14=0x00; LCDM15=0x00; LCDM16=0x00; LCDM17=0x00;&lt;br /&gt;
 LCDM18=0x00; LCDM19=0x00; LCDM20=0x00;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
   // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void Write_LCD_Hex(int Digit_n , int char_Nr)   // Digit1 bis 4 und 5 bis 8&lt;br /&gt;
{&lt;br /&gt;
  int i ,i_End , ch , Maske_loesch , Maske_setz ;&lt;br /&gt;
&lt;br /&gt;
  if((Digit_n == 0 ) || (Digit_n &amp;gt; LCD_MAX))&lt;br /&gt;
    {&lt;br /&gt;
        Clear_LCD_M(); i=0;&lt;br /&gt;
    }&lt;br /&gt;
   else i= (Digit_n - 1);                   // Startadresse = Digit_n x4 siehe unten&lt;br /&gt;
&lt;br /&gt;
  if(Digit_n &amp;lt; (LCD_MAX/2+1))               // Digit 1 ... 4 , i 0...3&lt;br /&gt;
    {&lt;br /&gt;
        Maske_setz   = 0x0011;&lt;br /&gt;
        Maske_loesch = 0x00FF - Maske_setz ;&lt;br /&gt;
        ch           = hex_Wert[char_Nr];&lt;br /&gt;
    } else                                  // Digit 5 ... 8&lt;br /&gt;
    {&lt;br /&gt;
        Maske_setz   = 0x0022;&lt;br /&gt;
        Maske_loesch = 0x00FF - Maske_setz ;&lt;br /&gt;
        ch           = hex_Wert[char_Nr] &amp;lt;&amp;lt; 1;&lt;br /&gt;
        i           -= (LCD_MAX/2) ;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  i &amp;lt;&amp;lt;= 2; i_End = i +4;                    // Berechnung der Start- und End -adresse&lt;br /&gt;
&lt;br /&gt;
  for(; i &amp;lt; i_End;i++)&lt;br /&gt;
    {&lt;br /&gt;
       LCDMEM[i] &amp;amp;= Maske_loesch;&lt;br /&gt;
       LCDMEM[i] |= ( ch &amp;amp; Maske_setz );&lt;br /&gt;
       ch &amp;gt;&amp;gt;=1;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
  // -----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
void SetzeDP( int welches_Displ)          // Displ 8 , 7 , 6 ...&lt;br /&gt;
{&lt;br /&gt;
  int i , i1;&lt;br /&gt;
    for (i=0,i1=1;i&amp;lt;8;i++,i1 &amp;lt;&amp;lt;=1)&lt;br /&gt;
      {&lt;br /&gt;
        if(welches_Displ &amp;amp; i1)&lt;br /&gt;
        switch(i)&lt;br /&gt;
         {&lt;br /&gt;
           case 0 : LCDM4  |= 0x10; break;&lt;br /&gt;
           case 1 : LCDM8  |= 0x10; break;&lt;br /&gt;
           case 2 : LCDM12 |= 0x10; break;&lt;br /&gt;
           case 3 : LCDM16 |= 0x10; break;&lt;br /&gt;
           case 4 : LCDM4  |= 0x20; break;&lt;br /&gt;
           case 5 : LCDM8  |= 0x20; break;&lt;br /&gt;
           case 6 : LCDM12 |= 0x20; break;&lt;br /&gt;
           case 7 : LCDM16 |= 0x20; break;&lt;br /&gt;
           default: break;&lt;br /&gt;
         }&lt;br /&gt;
      }  // for&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
  // ------------------  ENDE  ----------------------&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
[[Kategorie:MSP430]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=MSP430&amp;diff=61313</id>
		<title>MSP430</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=MSP430&amp;diff=61313"/>
		<updated>2011-10-26T11:07:24Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* seriell oder USB */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der MSP430 ist ein 16 Bit-Mikrocontroller von Texas Instruments (TI). Er wurde speziell für eine geringe Stromaufnahme entwickelt, so dass er besonders für batteriebetriebene Geräte geeignet ist. Es gibt verschiedene Typen mit 1-256 kB [[Flash-ROM]], 128-18432 Byte [[RAM]], teilweise mit Hardware-Multiplizierer, [[UART]], [[AD-Wandler]] oder LCD-Treiber, die meisten im [[SMD]]-Package mit 20 bis &amp;gt;100 Pins. Einige neuere aus der MSP430F2xxx-Serie gibt es auch im DIP-Package (Bezeichnung: MSPxxxx &#039;&#039;&#039;-N&#039;&#039;&#039;). Der MSP430F1121 zum Beispiel hat 4kB [[Flash-ROM]], 256B [[RAM]], 2 [[Timer]] und steckt in einem SO-20 Gehäuse. &lt;br /&gt;
&lt;br /&gt;
== Entwicklungshardware ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:launchpad-lcd.jpg|thumb|right|250px|Der &#039;&#039;Launchpad&#039;&#039; (ca. 5€) enthält neben dem per USB ansprechbaren Programmer auch das &amp;quot;Spy by Wire&amp;quot; Interface, mit dem der µC in der Schaltung emuliert werden kann (in Circuit emulation).]]&lt;br /&gt;
&lt;br /&gt;
Für den schnellen Einstieg stellt TI ein preisgünstiges Entwicklungssystem mit USB Schnittstelle zur Verfügung ([http://focus.ti.com/docs/toolsw/folders/print/ez430-f2013.html MSP430 USB Stick Development Tool]).&lt;br /&gt;
&lt;br /&gt;
Günstige Adapterplatinen und [[JTAG]]-Programmer für MSP430-Controller bekommt man bei [http://olimex.com/dev/ Olimex (Bulgarien)], in Deutschland bei http://shop.mikrocontroller.net und http://www.elektronikladen.de oder in Japan bei [http://passworld.co.jp/index.php?lang=GB&amp;amp;lieu=Soroban PassWorld].&lt;br /&gt;
&lt;br /&gt;
Einen einfachen Schaltplan für den [[JTAG]]-Programmer von TI bzw. Olimex gibt es [[Media:MSP430-JTAG-programmer.pdf|hier]]. Die Spannungsversorgung kommt im Gegensatz zum Original allerdings nicht vom Drucker-Port sondern muss extern (am besten vom MSP430 Board) bereitgestellt werden.&lt;br /&gt;
&lt;br /&gt;
Neben der JTAG-Programmierung bieten die MSP430-Controller auch die Möglichkeit, die Firmware über einen [[Bootloader]] einzuspielen. Die dafür erforderliche Hardware wird in der Application Note [http://focus.ti.com/docs/mcu/catalog/resources/appnoteabstract.jhtml?familyId=342&amp;amp;abstractName=slaa096d SLAA096d] von Texas Instruments beschrieben.&lt;br /&gt;
&lt;br /&gt;
Auf jeden Fall eine Überlegung wert wäre auch das neue &#039;&#039;Launchpad&#039;&#039; (Bezugsquellen: [https://estore.ti.com/MSP-EXP430G2-MSP430-LaunchPad-Value-Line-Development-kit-P2031.aspx] [http://search.digikey.com/scripts/DkSearch/dksus.dll?PName?Name=296-27570-ND] [http://www.watterott.com/de/MSP430-LaunchPad-MSP-EXP430G2]) für pinzahlmäßig kleinere MSP430 im DIL-Gehäuse.&lt;br /&gt;
&lt;br /&gt;
=== Stromversorgung ===&lt;br /&gt;
&lt;br /&gt;
Der MSP430 benötigt meistens eine Spannung zwischen 1,8 und 3,6 V. Es gibt einige wenige Derivate, die mit 0.9V auskommen (z.B. MSP430L092). Einfach erzeugen kann man diese z.&amp;amp;nbsp;B. mit der folgenden Schaltung:&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/images/lm317.png&lt;br /&gt;
&lt;br /&gt;
An den Eingang wird ein Steckernetzteil angeschlossen, die Ausgangsspannung lässt sich über das Potentiometer P1 einstellen.&lt;br /&gt;
Benutzt man für P1 einen 500Ω-Typ, kann man die Spannung in einem Bereich von 1,2 Volt und knapp 3,6 Volt einstellen. Dann kann man den MSP430 nicht durch zu hohe Versorgungsspannungen zerstören.&lt;br /&gt;
&lt;br /&gt;
Für den Batteriebetrieb eines MSP430 gibt es von TI eine fertige Lösung mit wenig Peripherie: [http://focus.ti.com/docs/prod/folders/print/tps61221.html TPS61221]&lt;br /&gt;
&lt;br /&gt;
Schaltung für 3,3V Versorgung: [http://focus.ti.com/lit/an/slva336/slva336.pdf]&lt;br /&gt;
&lt;br /&gt;
Die neue Generation mit USB, MSP430F55xx, enthält bereits einen Längsregler von 5 V auf 3,3 V für den Betrieb an der USB-Speisespannung.&lt;br /&gt;
Die Minimalausstattung für die Erstinbetriebnahme ist ein Quarz (bspw. 12 MHz), ein Widerstand 1,5 kΩ und eine Drahtbrücke.&lt;br /&gt;
&lt;br /&gt;
http://www-user.tu-chemnitz.de/~heha/mb-iwp/Schrittmotorsteuerung/MSP430V1.jpg&lt;br /&gt;
&lt;br /&gt;
Dabei meldet sich der Mikrocontroller (genauer: der enthaltene Bootloader) als HID-Gerät. Zum Füllen des Flash steht von Texas Instruments eine Software mit Quelltext zur Verfügung. Leider ist die API der DLL völlig missraten (total stümperhaft), und das Programm schluckt keine .HEX-Dateien (wie sonst üblich), sondern TI-spezifische .TXT-Dateien. {Da habe ich etwas nachprogrammiert, siehe: http://www-user.tu-chemnitz.de/~heha/hs_freeware/msp430-usbbsl.zip }&lt;br /&gt;
&lt;br /&gt;
== Programmieren und Debuggen ==&lt;br /&gt;
Zum Füllen des internen Flash-Programmspeichers und zum Verfolgen des Programmablaufs stehen üblicherweise drei Schnittstellen zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
* Das JTAG-Interface&lt;br /&gt;
* Der Spy-by-Wire-Anschluss&lt;br /&gt;
* Der Bootloader (seriell oder USB)&lt;br /&gt;
&lt;br /&gt;
=== Programmieren ===&lt;br /&gt;
&lt;br /&gt;
==== seriell oder USB ====&lt;br /&gt;
Wer fehlerarm programmieren kann und für jedwede Hilfsadapter zu geizig ist, benutzt am besten den eingebauten Bootloader. Dies ist auch der günstigste Weg bei der Serienfertigung.&lt;br /&gt;
&lt;br /&gt;
Zur Nutzung des seriellen Bootloaders ist es am günstigsten, [http://www.tu-chemnitz.de/~heha/iwp/Piezomess/Seriell wenn die fertige Schaltung bereits eine serielle Schnittstelle braucht].&lt;br /&gt;
Ungünstigerweise „hört“ der Bootloader nicht auf RxD und TxD, sondern zumeist auf P1.1 und P2.2 (siehe jeweiliges Datenblatt!). Daher behilft man sich mit festen oder trennbaren Brücken zwischen P1.1 und TxD sowie P2.2 und RxD.&lt;br /&gt;
Von den SubD-Pins 1+4+6 geht man via Serienwiderstand bspw. 33 kΩ auf /RESET,&lt;br /&gt;
von den SubD-Pins 7+8 ebenso via 33 kΩ auf TCK, fertig ist der On-Board-Programmieradapter.&lt;br /&gt;
&lt;br /&gt;
Richtig debuggen kann man mit der seriellen Schnittstelle nicht.&lt;br /&gt;
&lt;br /&gt;
MSP430 mit USB-Schnittstelle haben &#039;&#039;keinen&#039;&#039; seriellen Bootloader. Dieser ist durch den USB-Bootloader ersetzt worden. Zu seiner Verwendung werden keine ominösen Brücken verwendet; der USB-Anschluss (den wohl jede Anwendungsschaltung mit MSP430F55xx haben wird) ist sofort zum Herunterladen der Firmware geeignet. Clevererweise meldet sich der Bootloader als HID-Gerät, das erspart den Treiber. (Genau genommen gibt es extra für Firmware-Updates eine eigene USB-Geräteklasse.)&lt;br /&gt;
&lt;br /&gt;
==== JTAG ====&lt;br /&gt;
Komfortabel und dennoch preisgünstig ist der JTAG-Anschluss.&lt;br /&gt;
Leider benötigt dieser mindestens 5 Kontakte und damit Platz auf der Schaltung. Anschluss-Adapter für den Parallelport sind leicht zu bekommen und beinhalten im einfachsten Fall nur Schutzwiderstände.&lt;br /&gt;
Wer partout kein Parallelport hat (sollte ein Entwicklungsrechner &#039;&#039;immer&#039;&#039; haben) benötigt teure aber komfortable USB-JTAG-Adapter.&lt;br /&gt;
&lt;br /&gt;
==== Spy-by-Wire ====&lt;br /&gt;
Die TI-Erfindung Spy-by-Wire kommt mit nur 2 Leitungen aus.&lt;br /&gt;
(Nebenbei, die Konkurrenz kommt mit One-Wire mit &#039;&#039;einer&#039;&#039; Leitung aus.)&lt;br /&gt;
Hier sind nur spezielle USB-Adapter bekannt, die vom Hersteller zu beziehen und closed-source sind. Auf TI-Entwicklungsplatinen ist dieser Umsetzer bereits als ein weiterer Chip aufgelötet.&lt;br /&gt;
Eine Liste möglicher Adapter ist z.B. [[http://de.wikipedia.org/wiki/Msp430#Liste_der_FETs.2C_sehr_unvollst.C3.A4ndig hier]] einsehbar.&lt;br /&gt;
Die verfügbaren Adapter variieren teils sehr stark in ihrem Preis aber auch in ihrer Leistungsfähigkeit.&lt;br /&gt;
&lt;br /&gt;
Ein genereller Nachteil bei Spy-Bi-Wire ist die zum Teil erheblich reduzierte Geschwindigkeit bei der Datenübertragung. Dies liegt v.a. daran, dass die Daten, die vorher bei JTAG über 3 Leitungen übertragen wurden (TMS, TDI, TDO) nun über eine gemeinsame bidirektionale Leitung laufen. Es gibt jedoch auch Tools die diesen Nachteil weitestgehend ausgleichen können.&lt;br /&gt;
&lt;br /&gt;
Es bleibt daher zu überlegen, ob es nicht sinnvoll ist, lieber einen Chip in einem etwas größeren Gehäuse mit mehr Pins zu verwenden und dafür JTAG zu nutzen. v.a. in Sachen Selbstbaudebugger ist dies sinnvoll.&lt;br /&gt;
&lt;br /&gt;
== Dokumentation ==&lt;br /&gt;
&lt;br /&gt;
* TI&#039;s Website: http://www.msp430.com &lt;br /&gt;
*:Für jede MSP430 Familie (z.&amp;amp;nbsp;B. MSP430F1xxx) gibt es ein generelles &amp;quot;datasheet&amp;quot;    und einen detailierten &amp;quot;user guide&amp;quot;. Die im user guide verwendeten   Registerbezeichnungen (Ports, SFRs, etc.) findet man auch bei den meisten   Compilern wieder.&lt;br /&gt;
&lt;br /&gt;
* Buch: Mikrocontrollertechnik Am Beispiel der MSP430-Familie&lt;br /&gt;
*:Dieses Lehrbuch führt in die Grundlagen der Mikrorechentechnik ein. Es beschreibt sehr detailliert den Aufbau, die Funktion und die Handhabung von Mikrocontrollern am Beispiel des MSP430F1232. Programmbeispiele sind in Assembler und C enthalten. Ideal für Einsteiger mit geringen technischen Vorkenntnissen. Autor: Matthias Sturm ISBN:3-446-21800-9, Hanser Verlag&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
===Freie Tools===&lt;br /&gt;
====MSP-CCE430====&lt;br /&gt;
Dies ist die Entwicklungsumgebung von TI. Es gibt eine teure Pro-Version, aber eben auch eine Freeware-Version, die auf 16kB Codegrösse beschränkt ist. &lt;br /&gt;
&lt;br /&gt;
Dieser Entwicklungsumgebung liegt Eclipse zugrunde, wobei der C-Compiler und ein Debugger bereits eingebunden sind. Die Installation ist im Gegensatz zu MSPGCC kein Problem.&lt;br /&gt;
&lt;br /&gt;
* [http://focus.ti.com/docs/toolsw/folders/print/msp-cce430.html Download MSP-CCE430]&lt;br /&gt;
&lt;br /&gt;
====MSPGCC====&lt;br /&gt;
Man kann Programme für den MSP430 komplett mit freien Tools entwickeln. Mit dem C-Compiler [[MSPGCC]], dem Debugging-Programm [[GDB]]/Insight und einem beliebigen [[Texteditor]] kann man C-Programme schreiben, kompilieren, in den Controller programmieren und debuggen. In Kombination mit MSPGCC kann man auch die freie Entwicklungsumgebung Eclipse verwenden.&lt;br /&gt;
&lt;br /&gt;
Direkt mit Eclipse 3.6 Helios compilieren und debuggen&lt;br /&gt;
* [[MSP430_eclipse_helios_mspgcc4_gdb-proxy|Anleitung]] (06/2010)&lt;br /&gt;
&lt;br /&gt;
Weblinks:&lt;br /&gt;
* [http://msp430.ms.funpic.de/doku.php?id=msp430:entwicklungumgebung Eclipse+mspgcc+GDB-Proxy] (03/2009)&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Eclipse_und_MSPGCC_unter_Windows Eclipse und MSPGCC unter Windows] (03/2009)&lt;br /&gt;
* [http://matthias-hartmann.blogspot.com/ Use Eclipse and mspgcc - the easy way] (Windows 02/2009).&lt;br /&gt;
* [http://www.mikrocontroller.net/Eclipse%20und%20MSPGCC/ Eclipse und MSPGCC] (Windows 03/2006)&lt;br /&gt;
* [http://inf.ntb.ch/infoportal/help/index.jsp?topic=/ch.ntb.infoportal/embeddedSystems_MSP430.html/ Eclipse + MSPGCC + Installationsanleitung Deutsch] (Windows, Linux) (Link ist Tot! .. hat noch wer eine Version?)&lt;br /&gt;
* [http://kurt.on.ufanet.ru/ MSPFET - FREE MSP430 flash programming utility] (Windows)&lt;br /&gt;
* [http://xgoat.com/wp/2009/03/25/fetproxy-an-open-source-replacement-for-msp430-gdbproxy/ FetProxy - Ein funktionierender Open-Source-Ersatz für msp430-gdbproxy] (Unix, Linux)&lt;br /&gt;
* [http://mspgcc4.sourceforge.net mspgcc4 - GCC 4.x toolchain for Texas Instruments MSP430 MCUs]  (Linux, 2011)&lt;br /&gt;
&lt;br /&gt;
Achtung: Es gibt &#039;&#039;&#039;mspgcc&#039;&#039;&#039; und &#039;&#039;&#039;mspgcc4&#039;&#039;&#039;!&lt;br /&gt;
Ersterer unterstützt keine CPUX (moderner MSP430-Prozessorkern mit 20 Bit Adressierungs- und Verarbeitungsbreite, für 1 MByte Adressraum), so ist man praktisch auf 47 KByte Kode beschränkt, und ohne selbstgemachte Linker-Skripte kann man zurzeit keine MSP430F55xx programmieren.&lt;br /&gt;
Letzterer basiert häufig auf cygwin und ist deshalb nicht so leicht in Gang zu setzen, die Dokumentation noch spärlicher und ausschließlich auf &#039;&#039;&#039;man&#039;&#039;&#039; basierend.&lt;br /&gt;
&lt;br /&gt;
Update(09/2011): Das Projekt mspgcc4 wurde in das Projekt mspgcc übernommen und beinhaltet viele Verbesserungen und die Unterstützung für CPUX. Für Windows gibt es eine mingw32 Toolchain.&lt;br /&gt;
&lt;br /&gt;
====MSPDebug====&lt;br /&gt;
MSPDebug ist ein Programmier/- Debugwerkzeug für den [[MSP430]], ähnlich wie avrdude für die [[AVR]]s. Es beinhaltet auch einen gdb-server um in eclipse oder direkt mit msp430-gdb zu debuggen.&lt;br /&gt;
&lt;br /&gt;
Momentan (0.17) unterstütze Programmer/Debugger (aus der Hilfe übernommen):&lt;br /&gt;
* ez430-RF2500 z.B. der Programmieradapter von der ez430-Chronos&lt;br /&gt;
* Olimex MSP-JTAG-TINY / ISO&lt;br /&gt;
* TI FET430UIF und Kompatible (z.B. eZ430)&lt;br /&gt;
* TI FET430UIF bootloader&lt;br /&gt;
* Flash Bootloader&lt;br /&gt;
&lt;br /&gt;
Weblinks:&lt;br /&gt;
* [http://mspdebug.sourceforge.net/ Projekthomepage bei Sourceforge]&lt;br /&gt;
* [http://aur.archlinux.org/packages.php?ID=37648 AUR-Paket für Arch Linux]&lt;br /&gt;
&lt;br /&gt;
====MSP430 Instruction Set Simulator====&lt;br /&gt;
&lt;br /&gt;
Die Firma Lauterbach bietet unter der Artikelnummer LA-8815 einen Instruction Set Simulator für den MSP430 an. Die Demoversion ist zur Evaluierung kostenlos. Einschränkungen bestehen in der Anzahl der zu ladenen Debugsymbole, was jedoch für die meisten (teils auch kleineren) Hobbyanwendungen kein Problem darstellen sollte. &lt;br /&gt;
Der Simulator unterstützt alle gängigen MSP430 Derivate, d.h. beide Instruction Sets (16bit/20bit CPUs).&lt;br /&gt;
Der Simulator lädt alle gängigen Debugformate, wie die des IAR Compilers, des Code Composer Studios von TI oder des freien Tools MSPGCC.&lt;br /&gt;
&lt;br /&gt;
Zum Simulator gäbe es entsprechende zugehörige Debugtools für den MSP430, die käuflich zu erwerben sind.&lt;br /&gt;
&lt;br /&gt;
[[Datei:msp430_sim_la8815.jpg|thumb|left|130px| MSP430 Simulator]]&lt;br /&gt;
&lt;br /&gt;
* Screenshot:&lt;br /&gt;
&lt;br /&gt;
Der Screenshot zeigt ein Beispiel mit Quellcode (HLL/ASM mixed), Register/Stack Fenster, Breakpoint-Konfiguration, Variablenansicht, Stackframe und Darstellung des anfänglichen RAM Inhalts.&lt;br /&gt;
&lt;br /&gt;
* Weblinks:&lt;br /&gt;
** [http://www.lauterbach.com/frames.html?dwnload.html Downloadarea mit MSP430 Simulator]&lt;br /&gt;
** Handbuch (verfügbar in ca. 2 Wochen)&lt;br /&gt;
&lt;br /&gt;
=== Kommerzielle Compiler für MSP430 ===&lt;br /&gt;
* [http://www.imagecraft.com/devtools_MSP430.html ICC430]&lt;br /&gt;
*: 45-Tage Demo wird nach Ablauf auf 4 kByte Codegröße beschränkt&lt;br /&gt;
* [http://www.htsoft.com/products/msp430ccompiler.php HI-TECH MSP430 C]&lt;br /&gt;
*: 28-Tage Demo wird nach Ablauf unbrauchbar.&lt;br /&gt;
*: &#039;&#039;Die verlinkte Seite listet nur Compiler für PIC auf. Produkt eingestellt?&#039;&#039;&lt;br /&gt;
*: &#039;&#039;They are part of microchip now: [http://www.htsoft.com/HI-TECH%20Customer%20Letter_Final.pdf]&#039;&#039;&lt;br /&gt;
* [http://www.ide430.com/ IDE430]&lt;br /&gt;
*: &#039;&#039;Dieser Link ist tot. Gibt es das Produkt noch?&#039;&#039;&lt;br /&gt;
* [http://www.rowley.co.uk/msp430/index.htm CrossWorks for MSP430]&lt;br /&gt;
*: 30-Tage-Testversion nach Registrierung&lt;br /&gt;
* [http://www.quadravox.com/AQ430.htm Quadravox AQ430]&lt;br /&gt;
* [http://focus.ti.com/docs/toolsw/folders/print/msp-cce430.html?DCMP=MSP430_ccessentials&amp;amp;HQS=Other+PR+ccessentials CCEssentials (Eclipse)]&lt;br /&gt;
*: Mittlerweile: [http://processors.wiki.ti.com/index.php/CCSv4 Code Composer Studio 4]&amp;quot;, Microcontroller/&amp;quot;Core Edition&amp;quot; für MSP430 ist kostenlos. Download erfordert Registrierung und Exporterfassung. Dateiname &amp;quot;setup_CCS_MC_Core.zip&amp;quot;, ca. 360 MB.&lt;br /&gt;
*: Frei und auf 8 kByte Codegröße beschränkt, seit V3 bis 16kByte Code frei&lt;br /&gt;
* [http://www.iar.se/website1/1.0.1.0/675/1/index.php IAR Embedded Workbench for MSP430] &lt;br /&gt;
*: 30-Tage-Testversion&lt;br /&gt;
*: Freie auf 4 kByte (MSP430) oder 8 kByte (MSP430X) Codegröße beschränkte &amp;quot;KickStart&amp;quot;-Edition.&lt;br /&gt;
*: Kompatibel mit Windows7 7000 x64 (Stand: Februar 2009, Version 4.20.1)&lt;br /&gt;
&lt;br /&gt;
== Beispielanwendungen ==&lt;br /&gt;
&lt;br /&gt;
===Mathar.Com===&lt;br /&gt;
Auf http://www.mathar.com gibt es ein paar Beispiele (in C), was man so alles mit dem MSP430 anstellen kann. Dort hat der Autor einige Anwendungen näher erläutert. Angefangen mit simplen Aufgaben wie LEDs leuchten lassen geht es weiter über eine LCD- und GLCD-Ansteuerung (HD44780- und KS0108-kompatibel) sowie einigen Beispielen zur Verwendung des integrierten A/D-Wandlers, des USARTs, des Timers und vielem mehr ... Als weitere Codebeispiele sind dort auch eine I2C-Softwareimplementation und eine CAN-Library für den MSP430 zu finden.&lt;br /&gt;
&lt;br /&gt;
===Examples Ordner der freien Toolchain MSPGCC===&lt;br /&gt;
Der &amp;quot;examples&amp;quot;-Ordner bzw. &amp;quot;checkout&amp;quot; aus dem CVS vom [[MSPGCC]] ist auch sehr umfangreich: http://mspgcc.cvs.sourceforge.net/mspgcc/examples/&lt;br /&gt;
&lt;br /&gt;
===Codebeispiele auf Mikrokontroller.net===&lt;br /&gt;
Einige [[MSP430 Codebeispiele]] finden sich auch hier in der Artikelsammlung.&lt;br /&gt;
&lt;br /&gt;
===uIP Port auf Mikrokontroller.net===&lt;br /&gt;
Der Port des TCP/IP Stacks von Adam Dunkels [[MSP430_uIP_Port|uIP 1.0 für den MSP430 findet sich hier]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Launchpad interne Temp. Messung mit ADC und Anzeige auf LCD===&lt;br /&gt;
C Codebeispiel für Launchpad mit IAR Kickstartcompiler, interner ADc und LCD Ansteuerung. Vergleich Atmel 8 Bit AVR Controller und mit MSP Familie: [http://www.mikrocontroller.net/topic/222015#new]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/1/msp430 Beiträge zum MSP430 im Mikrocontroller.net Forum]&lt;br /&gt;
* [http://mspgcc.sourceforge.net/manual/c68.html An introduction to the TI MSP430 low-power microcontrollers]&lt;br /&gt;
* [http://tinymicros.com/embedded/MSP430/ The MSP430 Bugspray Database] - umfangreiche Datenbank für Bugs in MSP430-Controllern&lt;br /&gt;
* [http://www.mathar.com www.mathar.com] - Tutorial für Einsteiger und Fortgeschrittene: LCD, ADC, USART, I2C, CAN Programmierung in C&lt;br /&gt;
* [http://cnx.org/lenses/TexasInstruments/MSP430 Connexions - Texas Instruments MSP430] Tutorial (speziell für eZ430)&lt;br /&gt;
* [http://msp430.info MSP430.info] - Portalseite für MSP430; Info, Projekte, Paper, Entwicklungstools...&lt;br /&gt;
* [http://groups.yahoo.com/group/msp430 Yahoo group MSP430] - lebhaftes Forum mit vielen MSP430-Experten&lt;br /&gt;
* [http://www.thomas-wedemeyer.de/elektronik/msp430/msp430.html Thomas Wedemeyer&#039;s MSP430-Seiten] - Kleine Beispiel Applikationen und Tips zur Nutzung von MSPGCC mit der Dev-C++ Entwicklungsumgebung&lt;br /&gt;
* [http://homepage.hispeed.ch/py430/mspgcc/ msp430-gdb und Eclipse] - Eine Anleitung von Chris Liechti&lt;br /&gt;
* [http://passworld.co.jp/index.php?lang=GB&amp;amp;lieu=GPS MSP430 GPS] - [http://passworld.co.jp/index.php?lang=GB&amp;amp;lieu=Oximeter MSP430 Puls-Oximeter]&lt;br /&gt;
* [http://passworld.co.jp/ForumMSP430 MSP430 Forum]&lt;br /&gt;
* [http://develissimo.net/de/msp430entwicklung.html MSPGCC + Eclipse + msp430-gdbproxy / Linux / Debian / Ubuntu] - Anleitung / Tutorial zur Installation der MSPGCC Toolchain + Eclipse + msp430-gdbproxy für Linux / Debian / Ubuntu Lang=Deutsch und Englisch leider geht der link nicht mehr&lt;br /&gt;
* [http://www.sinelabore.com SinelaboreRT] - Generierung von Zustandsmaschinen in C speziell für kleine Low-Power Plattformen.&lt;br /&gt;
* [http://msp430.funpic.de msp430.funpic.de] - Wiki zum MSP430&lt;br /&gt;
* [http://mspsci.blogspot.com/2010/07/tutorial-01-getting-started.html Scientific Instruments Using the TI MSP430] - Tutorial speziell zum TI Launchpad.&lt;br /&gt;
* [http://43oh.com/ Four-Three-Oh!] - MSP430 News und Forum (en)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;br /&gt;
[[Kategorie:MSP430| ]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=MSP430&amp;diff=61312</id>
		<title>MSP430</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=MSP430&amp;diff=61312"/>
		<updated>2011-10-26T11:03:50Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* seriell oder USB */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der MSP430 ist ein 16 Bit-Mikrocontroller von Texas Instruments (TI). Er wurde speziell für eine geringe Stromaufnahme entwickelt, so dass er besonders für batteriebetriebene Geräte geeignet ist. Es gibt verschiedene Typen mit 1-256 kB [[Flash-ROM]], 128-18432 Byte [[RAM]], teilweise mit Hardware-Multiplizierer, [[UART]], [[AD-Wandler]] oder LCD-Treiber, die meisten im [[SMD]]-Package mit 20 bis &amp;gt;100 Pins. Einige neuere aus der MSP430F2xxx-Serie gibt es auch im DIP-Package (Bezeichnung: MSPxxxx &#039;&#039;&#039;-N&#039;&#039;&#039;). Der MSP430F1121 zum Beispiel hat 4kB [[Flash-ROM]], 256B [[RAM]], 2 [[Timer]] und steckt in einem SO-20 Gehäuse. &lt;br /&gt;
&lt;br /&gt;
== Entwicklungshardware ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:launchpad-lcd.jpg|thumb|right|250px|Der &#039;&#039;Launchpad&#039;&#039; (ca. 5€) enthält neben dem per USB ansprechbaren Programmer auch das &amp;quot;Spy by Wire&amp;quot; Interface, mit dem der µC in der Schaltung emuliert werden kann (in Circuit emulation).]]&lt;br /&gt;
&lt;br /&gt;
Für den schnellen Einstieg stellt TI ein preisgünstiges Entwicklungssystem mit USB Schnittstelle zur Verfügung ([http://focus.ti.com/docs/toolsw/folders/print/ez430-f2013.html MSP430 USB Stick Development Tool]).&lt;br /&gt;
&lt;br /&gt;
Günstige Adapterplatinen und [[JTAG]]-Programmer für MSP430-Controller bekommt man bei [http://olimex.com/dev/ Olimex (Bulgarien)], in Deutschland bei http://shop.mikrocontroller.net und http://www.elektronikladen.de oder in Japan bei [http://passworld.co.jp/index.php?lang=GB&amp;amp;lieu=Soroban PassWorld].&lt;br /&gt;
&lt;br /&gt;
Einen einfachen Schaltplan für den [[JTAG]]-Programmer von TI bzw. Olimex gibt es [[Media:MSP430-JTAG-programmer.pdf|hier]]. Die Spannungsversorgung kommt im Gegensatz zum Original allerdings nicht vom Drucker-Port sondern muss extern (am besten vom MSP430 Board) bereitgestellt werden.&lt;br /&gt;
&lt;br /&gt;
Neben der JTAG-Programmierung bieten die MSP430-Controller auch die Möglichkeit, die Firmware über einen [[Bootloader]] einzuspielen. Die dafür erforderliche Hardware wird in der Application Note [http://focus.ti.com/docs/mcu/catalog/resources/appnoteabstract.jhtml?familyId=342&amp;amp;abstractName=slaa096d SLAA096d] von Texas Instruments beschrieben.&lt;br /&gt;
&lt;br /&gt;
Auf jeden Fall eine Überlegung wert wäre auch das neue &#039;&#039;Launchpad&#039;&#039; (Bezugsquellen: [https://estore.ti.com/MSP-EXP430G2-MSP430-LaunchPad-Value-Line-Development-kit-P2031.aspx] [http://search.digikey.com/scripts/DkSearch/dksus.dll?PName?Name=296-27570-ND] [http://www.watterott.com/de/MSP430-LaunchPad-MSP-EXP430G2]) für pinzahlmäßig kleinere MSP430 im DIL-Gehäuse.&lt;br /&gt;
&lt;br /&gt;
=== Stromversorgung ===&lt;br /&gt;
&lt;br /&gt;
Der MSP430 benötigt meistens eine Spannung zwischen 1,8 und 3,6 V. Es gibt einige wenige Derivate, die mit 0.9V auskommen (z.B. MSP430L092). Einfach erzeugen kann man diese z.&amp;amp;nbsp;B. mit der folgenden Schaltung:&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/images/lm317.png&lt;br /&gt;
&lt;br /&gt;
An den Eingang wird ein Steckernetzteil angeschlossen, die Ausgangsspannung lässt sich über das Potentiometer P1 einstellen.&lt;br /&gt;
Benutzt man für P1 einen 500Ω-Typ, kann man die Spannung in einem Bereich von 1,2 Volt und knapp 3,6 Volt einstellen. Dann kann man den MSP430 nicht durch zu hohe Versorgungsspannungen zerstören.&lt;br /&gt;
&lt;br /&gt;
Für den Batteriebetrieb eines MSP430 gibt es von TI eine fertige Lösung mit wenig Peripherie: [http://focus.ti.com/docs/prod/folders/print/tps61221.html TPS61221]&lt;br /&gt;
&lt;br /&gt;
Schaltung für 3,3V Versorgung: [http://focus.ti.com/lit/an/slva336/slva336.pdf]&lt;br /&gt;
&lt;br /&gt;
Die neue Generation mit USB, MSP430F55xx, enthält bereits einen Längsregler von 5 V auf 3,3 V für den Betrieb an der USB-Speisespannung.&lt;br /&gt;
Die Minimalausstattung für die Erstinbetriebnahme ist ein Quarz (bspw. 12 MHz), ein Widerstand 1,5 kΩ und eine Drahtbrücke.&lt;br /&gt;
&lt;br /&gt;
http://www-user.tu-chemnitz.de/~heha/mb-iwp/Schrittmotorsteuerung/MSP430V1.jpg&lt;br /&gt;
&lt;br /&gt;
Dabei meldet sich der Mikrocontroller (genauer: der enthaltene Bootloader) als HID-Gerät. Zum Füllen des Flash steht von Texas Instruments eine Software mit Quelltext zur Verfügung. Leider ist die API der DLL völlig missraten (total stümperhaft), und das Programm schluckt keine .HEX-Dateien (wie sonst üblich), sondern TI-spezifische .TXT-Dateien. {Da habe ich etwas nachprogrammiert, siehe: http://www-user.tu-chemnitz.de/~heha/hs_freeware/msp430-usbbsl.zip }&lt;br /&gt;
&lt;br /&gt;
== Programmieren und Debuggen ==&lt;br /&gt;
Zum Füllen des internen Flash-Programmspeichers und zum Verfolgen des Programmablaufs stehen üblicherweise drei Schnittstellen zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
* Das JTAG-Interface&lt;br /&gt;
* Der Spy-by-Wire-Anschluss&lt;br /&gt;
* Der Bootloader (seriell oder USB)&lt;br /&gt;
&lt;br /&gt;
=== Programmieren ===&lt;br /&gt;
&lt;br /&gt;
==== seriell oder USB ====&lt;br /&gt;
Wer fehlerarm programmieren kann und für jedwede Hilfsadapter zu geizig ist, benutzt am besten den eingebauten Bootloader. Dies ist auch der günstigste Weg bei der Serienfertigung.&lt;br /&gt;
&lt;br /&gt;
Zur Nutzung des seriellen Bootloaders ist es am günstigsten, [http://www.tu-chemnitz.de/~heha/iwp/Piezomess/Seriell wenn die fertige Schaltung bereits eine serielle Schnittstelle braucht].&lt;br /&gt;
Ungünstigerweise „hört“ der Bootloader nicht auf RxD und TxD, sondern zumeist auf P1.1 und P2.2 (siehe jeweiliges Datenblatt!). Daher behilft man sich mit festen oder trennbaren Brücken zwischen P1.1 und TxD sowie P2.2 und RxD.&lt;br /&gt;
Von den SubD-Pins 1+4+6 geht man via Serienwiderstand bspw. 33 kΩ auf /RESET,&lt;br /&gt;
von den SubD-Pins 7+8 ebenso via 33 kΩ auf TCK, fertig ist der On-Board-Programmieradapter.&lt;br /&gt;
&lt;br /&gt;
Richtig debuggen kann man mit der seriellen Schnittstelle nicht.&lt;br /&gt;
&lt;br /&gt;
MSP430 mit USB-Schnittstelle haben &#039;&#039;keinen&#039;&#039; seriellen Bootloader. Dieser ist durch den USB-Bootloader ersetzt worden. Zu seiner Verwendung werden keine ominösen Brücken verwendet; der USB-Anschluss (den wohl jede Anwendungsschaltung mit MSP430F55xx haben wird) ist sofort zum Herunterladen der Firmware geeignet.&lt;br /&gt;
&lt;br /&gt;
==== JTAG ====&lt;br /&gt;
Komfortabel und dennoch preisgünstig ist der JTAG-Anschluss.&lt;br /&gt;
Leider benötigt dieser mindestens 5 Kontakte und damit Platz auf der Schaltung. Anschluss-Adapter für den Parallelport sind leicht zu bekommen und beinhalten im einfachsten Fall nur Schutzwiderstände.&lt;br /&gt;
Wer partout kein Parallelport hat (sollte ein Entwicklungsrechner &#039;&#039;immer&#039;&#039; haben) benötigt teure aber komfortable USB-JTAG-Adapter.&lt;br /&gt;
&lt;br /&gt;
==== Spy-by-Wire ====&lt;br /&gt;
Die TI-Erfindung Spy-by-Wire kommt mit nur 2 Leitungen aus.&lt;br /&gt;
(Nebenbei, die Konkurrenz kommt mit One-Wire mit &#039;&#039;einer&#039;&#039; Leitung aus.)&lt;br /&gt;
Hier sind nur spezielle USB-Adapter bekannt, die vom Hersteller zu beziehen und closed-source sind. Auf TI-Entwicklungsplatinen ist dieser Umsetzer bereits als ein weiterer Chip aufgelötet.&lt;br /&gt;
Eine Liste möglicher Adapter ist z.B. [[http://de.wikipedia.org/wiki/Msp430#Liste_der_FETs.2C_sehr_unvollst.C3.A4ndig hier]] einsehbar.&lt;br /&gt;
Die verfügbaren Adapter variieren teils sehr stark in ihrem Preis aber auch in ihrer Leistungsfähigkeit.&lt;br /&gt;
&lt;br /&gt;
Ein genereller Nachteil bei Spy-Bi-Wire ist die zum Teil erheblich reduzierte Geschwindigkeit bei der Datenübertragung. Dies liegt v.a. daran, dass die Daten, die vorher bei JTAG über 3 Leitungen übertragen wurden (TMS, TDI, TDO) nun über eine gemeinsame bidirektionale Leitung laufen. Es gibt jedoch auch Tools die diesen Nachteil weitestgehend ausgleichen können.&lt;br /&gt;
&lt;br /&gt;
Es bleibt daher zu überlegen, ob es nicht sinnvoll ist, lieber einen Chip in einem etwas größeren Gehäuse mit mehr Pins zu verwenden und dafür JTAG zu nutzen. v.a. in Sachen Selbstbaudebugger ist dies sinnvoll.&lt;br /&gt;
&lt;br /&gt;
== Dokumentation ==&lt;br /&gt;
&lt;br /&gt;
* TI&#039;s Website: http://www.msp430.com &lt;br /&gt;
*:Für jede MSP430 Familie (z.&amp;amp;nbsp;B. MSP430F1xxx) gibt es ein generelles &amp;quot;datasheet&amp;quot;    und einen detailierten &amp;quot;user guide&amp;quot;. Die im user guide verwendeten   Registerbezeichnungen (Ports, SFRs, etc.) findet man auch bei den meisten   Compilern wieder.&lt;br /&gt;
&lt;br /&gt;
* Buch: Mikrocontrollertechnik Am Beispiel der MSP430-Familie&lt;br /&gt;
*:Dieses Lehrbuch führt in die Grundlagen der Mikrorechentechnik ein. Es beschreibt sehr detailliert den Aufbau, die Funktion und die Handhabung von Mikrocontrollern am Beispiel des MSP430F1232. Programmbeispiele sind in Assembler und C enthalten. Ideal für Einsteiger mit geringen technischen Vorkenntnissen. Autor: Matthias Sturm ISBN:3-446-21800-9, Hanser Verlag&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
===Freie Tools===&lt;br /&gt;
====MSP-CCE430====&lt;br /&gt;
Dies ist die Entwicklungsumgebung von TI. Es gibt eine teure Pro-Version, aber eben auch eine Freeware-Version, die auf 16kB Codegrösse beschränkt ist. &lt;br /&gt;
&lt;br /&gt;
Dieser Entwicklungsumgebung liegt Eclipse zugrunde, wobei der C-Compiler und ein Debugger bereits eingebunden sind. Die Installation ist im Gegensatz zu MSPGCC kein Problem.&lt;br /&gt;
&lt;br /&gt;
* [http://focus.ti.com/docs/toolsw/folders/print/msp-cce430.html Download MSP-CCE430]&lt;br /&gt;
&lt;br /&gt;
====MSPGCC====&lt;br /&gt;
Man kann Programme für den MSP430 komplett mit freien Tools entwickeln. Mit dem C-Compiler [[MSPGCC]], dem Debugging-Programm [[GDB]]/Insight und einem beliebigen [[Texteditor]] kann man C-Programme schreiben, kompilieren, in den Controller programmieren und debuggen. In Kombination mit MSPGCC kann man auch die freie Entwicklungsumgebung Eclipse verwenden.&lt;br /&gt;
&lt;br /&gt;
Direkt mit Eclipse 3.6 Helios compilieren und debuggen&lt;br /&gt;
* [[MSP430_eclipse_helios_mspgcc4_gdb-proxy|Anleitung]] (06/2010)&lt;br /&gt;
&lt;br /&gt;
Weblinks:&lt;br /&gt;
* [http://msp430.ms.funpic.de/doku.php?id=msp430:entwicklungumgebung Eclipse+mspgcc+GDB-Proxy] (03/2009)&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Eclipse_und_MSPGCC_unter_Windows Eclipse und MSPGCC unter Windows] (03/2009)&lt;br /&gt;
* [http://matthias-hartmann.blogspot.com/ Use Eclipse and mspgcc - the easy way] (Windows 02/2009).&lt;br /&gt;
* [http://www.mikrocontroller.net/Eclipse%20und%20MSPGCC/ Eclipse und MSPGCC] (Windows 03/2006)&lt;br /&gt;
* [http://inf.ntb.ch/infoportal/help/index.jsp?topic=/ch.ntb.infoportal/embeddedSystems_MSP430.html/ Eclipse + MSPGCC + Installationsanleitung Deutsch] (Windows, Linux) (Link ist Tot! .. hat noch wer eine Version?)&lt;br /&gt;
* [http://kurt.on.ufanet.ru/ MSPFET - FREE MSP430 flash programming utility] (Windows)&lt;br /&gt;
* [http://xgoat.com/wp/2009/03/25/fetproxy-an-open-source-replacement-for-msp430-gdbproxy/ FetProxy - Ein funktionierender Open-Source-Ersatz für msp430-gdbproxy] (Unix, Linux)&lt;br /&gt;
* [http://mspgcc4.sourceforge.net mspgcc4 - GCC 4.x toolchain for Texas Instruments MSP430 MCUs]  (Linux, 2011)&lt;br /&gt;
&lt;br /&gt;
Achtung: Es gibt &#039;&#039;&#039;mspgcc&#039;&#039;&#039; und &#039;&#039;&#039;mspgcc4&#039;&#039;&#039;!&lt;br /&gt;
Ersterer unterstützt keine CPUX (moderner MSP430-Prozessorkern mit 20 Bit Adressierungs- und Verarbeitungsbreite, für 1 MByte Adressraum), so ist man praktisch auf 47 KByte Kode beschränkt, und ohne selbstgemachte Linker-Skripte kann man zurzeit keine MSP430F55xx programmieren.&lt;br /&gt;
Letzterer basiert häufig auf cygwin und ist deshalb nicht so leicht in Gang zu setzen, die Dokumentation noch spärlicher und ausschließlich auf &#039;&#039;&#039;man&#039;&#039;&#039; basierend.&lt;br /&gt;
&lt;br /&gt;
Update(09/2011): Das Projekt mspgcc4 wurde in das Projekt mspgcc übernommen und beinhaltet viele Verbesserungen und die Unterstützung für CPUX. Für Windows gibt es eine mingw32 Toolchain.&lt;br /&gt;
&lt;br /&gt;
====MSPDebug====&lt;br /&gt;
MSPDebug ist ein Programmier/- Debugwerkzeug für den [[MSP430]], ähnlich wie avrdude für die [[AVR]]s. Es beinhaltet auch einen gdb-server um in eclipse oder direkt mit msp430-gdb zu debuggen.&lt;br /&gt;
&lt;br /&gt;
Momentan (0.17) unterstütze Programmer/Debugger (aus der Hilfe übernommen):&lt;br /&gt;
* ez430-RF2500 z.B. der Programmieradapter von der ez430-Chronos&lt;br /&gt;
* Olimex MSP-JTAG-TINY / ISO&lt;br /&gt;
* TI FET430UIF und Kompatible (z.B. eZ430)&lt;br /&gt;
* TI FET430UIF bootloader&lt;br /&gt;
* Flash Bootloader&lt;br /&gt;
&lt;br /&gt;
Weblinks:&lt;br /&gt;
* [http://mspdebug.sourceforge.net/ Projekthomepage bei Sourceforge]&lt;br /&gt;
* [http://aur.archlinux.org/packages.php?ID=37648 AUR-Paket für Arch Linux]&lt;br /&gt;
&lt;br /&gt;
====MSP430 Instruction Set Simulator====&lt;br /&gt;
&lt;br /&gt;
Die Firma Lauterbach bietet unter der Artikelnummer LA-8815 einen Instruction Set Simulator für den MSP430 an. Die Demoversion ist zur Evaluierung kostenlos. Einschränkungen bestehen in der Anzahl der zu ladenen Debugsymbole, was jedoch für die meisten (teils auch kleineren) Hobbyanwendungen kein Problem darstellen sollte. &lt;br /&gt;
Der Simulator unterstützt alle gängigen MSP430 Derivate, d.h. beide Instruction Sets (16bit/20bit CPUs).&lt;br /&gt;
Der Simulator lädt alle gängigen Debugformate, wie die des IAR Compilers, des Code Composer Studios von TI oder des freien Tools MSPGCC.&lt;br /&gt;
&lt;br /&gt;
Zum Simulator gäbe es entsprechende zugehörige Debugtools für den MSP430, die käuflich zu erwerben sind.&lt;br /&gt;
&lt;br /&gt;
[[Datei:msp430_sim_la8815.jpg|thumb|left|130px| MSP430 Simulator]]&lt;br /&gt;
&lt;br /&gt;
* Screenshot:&lt;br /&gt;
&lt;br /&gt;
Der Screenshot zeigt ein Beispiel mit Quellcode (HLL/ASM mixed), Register/Stack Fenster, Breakpoint-Konfiguration, Variablenansicht, Stackframe und Darstellung des anfänglichen RAM Inhalts.&lt;br /&gt;
&lt;br /&gt;
* Weblinks:&lt;br /&gt;
** [http://www.lauterbach.com/frames.html?dwnload.html Downloadarea mit MSP430 Simulator]&lt;br /&gt;
** Handbuch (verfügbar in ca. 2 Wochen)&lt;br /&gt;
&lt;br /&gt;
=== Kommerzielle Compiler für MSP430 ===&lt;br /&gt;
* [http://www.imagecraft.com/devtools_MSP430.html ICC430]&lt;br /&gt;
*: 45-Tage Demo wird nach Ablauf auf 4 kByte Codegröße beschränkt&lt;br /&gt;
* [http://www.htsoft.com/products/msp430ccompiler.php HI-TECH MSP430 C]&lt;br /&gt;
*: 28-Tage Demo wird nach Ablauf unbrauchbar.&lt;br /&gt;
*: &#039;&#039;Die verlinkte Seite listet nur Compiler für PIC auf. Produkt eingestellt?&#039;&#039;&lt;br /&gt;
*: &#039;&#039;They are part of microchip now: [http://www.htsoft.com/HI-TECH%20Customer%20Letter_Final.pdf]&#039;&#039;&lt;br /&gt;
* [http://www.ide430.com/ IDE430]&lt;br /&gt;
*: &#039;&#039;Dieser Link ist tot. Gibt es das Produkt noch?&#039;&#039;&lt;br /&gt;
* [http://www.rowley.co.uk/msp430/index.htm CrossWorks for MSP430]&lt;br /&gt;
*: 30-Tage-Testversion nach Registrierung&lt;br /&gt;
* [http://www.quadravox.com/AQ430.htm Quadravox AQ430]&lt;br /&gt;
* [http://focus.ti.com/docs/toolsw/folders/print/msp-cce430.html?DCMP=MSP430_ccessentials&amp;amp;HQS=Other+PR+ccessentials CCEssentials (Eclipse)]&lt;br /&gt;
*: Mittlerweile: [http://processors.wiki.ti.com/index.php/CCSv4 Code Composer Studio 4]&amp;quot;, Microcontroller/&amp;quot;Core Edition&amp;quot; für MSP430 ist kostenlos. Download erfordert Registrierung und Exporterfassung. Dateiname &amp;quot;setup_CCS_MC_Core.zip&amp;quot;, ca. 360 MB.&lt;br /&gt;
*: Frei und auf 8 kByte Codegröße beschränkt, seit V3 bis 16kByte Code frei&lt;br /&gt;
* [http://www.iar.se/website1/1.0.1.0/675/1/index.php IAR Embedded Workbench for MSP430] &lt;br /&gt;
*: 30-Tage-Testversion&lt;br /&gt;
*: Freie auf 4 kByte (MSP430) oder 8 kByte (MSP430X) Codegröße beschränkte &amp;quot;KickStart&amp;quot;-Edition.&lt;br /&gt;
*: Kompatibel mit Windows7 7000 x64 (Stand: Februar 2009, Version 4.20.1)&lt;br /&gt;
&lt;br /&gt;
== Beispielanwendungen ==&lt;br /&gt;
&lt;br /&gt;
===Mathar.Com===&lt;br /&gt;
Auf http://www.mathar.com gibt es ein paar Beispiele (in C), was man so alles mit dem MSP430 anstellen kann. Dort hat der Autor einige Anwendungen näher erläutert. Angefangen mit simplen Aufgaben wie LEDs leuchten lassen geht es weiter über eine LCD- und GLCD-Ansteuerung (HD44780- und KS0108-kompatibel) sowie einigen Beispielen zur Verwendung des integrierten A/D-Wandlers, des USARTs, des Timers und vielem mehr ... Als weitere Codebeispiele sind dort auch eine I2C-Softwareimplementation und eine CAN-Library für den MSP430 zu finden.&lt;br /&gt;
&lt;br /&gt;
===Examples Ordner der freien Toolchain MSPGCC===&lt;br /&gt;
Der &amp;quot;examples&amp;quot;-Ordner bzw. &amp;quot;checkout&amp;quot; aus dem CVS vom [[MSPGCC]] ist auch sehr umfangreich: http://mspgcc.cvs.sourceforge.net/mspgcc/examples/&lt;br /&gt;
&lt;br /&gt;
===Codebeispiele auf Mikrokontroller.net===&lt;br /&gt;
Einige [[MSP430 Codebeispiele]] finden sich auch hier in der Artikelsammlung.&lt;br /&gt;
&lt;br /&gt;
===uIP Port auf Mikrokontroller.net===&lt;br /&gt;
Der Port des TCP/IP Stacks von Adam Dunkels [[MSP430_uIP_Port|uIP 1.0 für den MSP430 findet sich hier]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Launchpad interne Temp. Messung mit ADC und Anzeige auf LCD===&lt;br /&gt;
C Codebeispiel für Launchpad mit IAR Kickstartcompiler, interner ADc und LCD Ansteuerung. Vergleich Atmel 8 Bit AVR Controller und mit MSP Familie: [http://www.mikrocontroller.net/topic/222015#new]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/1/msp430 Beiträge zum MSP430 im Mikrocontroller.net Forum]&lt;br /&gt;
* [http://mspgcc.sourceforge.net/manual/c68.html An introduction to the TI MSP430 low-power microcontrollers]&lt;br /&gt;
* [http://tinymicros.com/embedded/MSP430/ The MSP430 Bugspray Database] - umfangreiche Datenbank für Bugs in MSP430-Controllern&lt;br /&gt;
* [http://www.mathar.com www.mathar.com] - Tutorial für Einsteiger und Fortgeschrittene: LCD, ADC, USART, I2C, CAN Programmierung in C&lt;br /&gt;
* [http://cnx.org/lenses/TexasInstruments/MSP430 Connexions - Texas Instruments MSP430] Tutorial (speziell für eZ430)&lt;br /&gt;
* [http://msp430.info MSP430.info] - Portalseite für MSP430; Info, Projekte, Paper, Entwicklungstools...&lt;br /&gt;
* [http://groups.yahoo.com/group/msp430 Yahoo group MSP430] - lebhaftes Forum mit vielen MSP430-Experten&lt;br /&gt;
* [http://www.thomas-wedemeyer.de/elektronik/msp430/msp430.html Thomas Wedemeyer&#039;s MSP430-Seiten] - Kleine Beispiel Applikationen und Tips zur Nutzung von MSPGCC mit der Dev-C++ Entwicklungsumgebung&lt;br /&gt;
* [http://homepage.hispeed.ch/py430/mspgcc/ msp430-gdb und Eclipse] - Eine Anleitung von Chris Liechti&lt;br /&gt;
* [http://passworld.co.jp/index.php?lang=GB&amp;amp;lieu=GPS MSP430 GPS] - [http://passworld.co.jp/index.php?lang=GB&amp;amp;lieu=Oximeter MSP430 Puls-Oximeter]&lt;br /&gt;
* [http://passworld.co.jp/ForumMSP430 MSP430 Forum]&lt;br /&gt;
* [http://develissimo.net/de/msp430entwicklung.html MSPGCC + Eclipse + msp430-gdbproxy / Linux / Debian / Ubuntu] - Anleitung / Tutorial zur Installation der MSPGCC Toolchain + Eclipse + msp430-gdbproxy für Linux / Debian / Ubuntu Lang=Deutsch und Englisch leider geht der link nicht mehr&lt;br /&gt;
* [http://www.sinelabore.com SinelaboreRT] - Generierung von Zustandsmaschinen in C speziell für kleine Low-Power Plattformen.&lt;br /&gt;
* [http://msp430.funpic.de msp430.funpic.de] - Wiki zum MSP430&lt;br /&gt;
* [http://mspsci.blogspot.com/2010/07/tutorial-01-getting-started.html Scientific Instruments Using the TI MSP430] - Tutorial speziell zum TI Launchpad.&lt;br /&gt;
* [http://43oh.com/ Four-Three-Oh!] - MSP430 News und Forum (en)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;br /&gt;
[[Kategorie:MSP430| ]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_Checkliste&amp;diff=61134</id>
		<title>AVR Checkliste</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_Checkliste&amp;diff=61134"/>
		<updated>2011-10-19T13:43:12Z</updated>

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

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

		<summary type="html">&lt;p&gt;134.109.9.176: /* TI OMAP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Anwendungsbeispiele ==&lt;br /&gt;
&lt;br /&gt;
* Modulation/Demodulation zur Datenübertragung (z.&amp;amp;nbsp;B. Telefonmodem, DSL, GSM) - &amp;quot;Software Defined Radio&amp;quot; (SDR)&lt;br /&gt;
* Multimediacodierung (MP3, DivX, JPEG)&lt;br /&gt;
* Bildverarbeitung (Mustererkennung)&lt;br /&gt;
* Echo- und Störgeräuschunterdrückung bei Telefonen, Sprechgarnituren (Headsets) und Hörgeräten&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
&lt;br /&gt;
Bücher:&lt;br /&gt;
* Oppenheim, Schaefer: &amp;quot;Discrete Time Signal Processing&amp;quot;, ISBN 0131988425&lt;br /&gt;
* Proakis: &amp;quot;Digital Signal Processing&amp;quot;, ISBN 0131873741&lt;br /&gt;
* Lyons: &amp;quot;Understanding Digital Signal Processing&amp;quot;, ISBN 0131089897&lt;br /&gt;
* Smith: &amp;quot;The Scientist and Engineer&#039;s Guide to Digital Signal Processing&amp;quot;, ISBN  075067444X (unter http://dspguide.com/ als PDF verfügbar)&lt;br /&gt;
* Sanjit K. Mitra: &amp;quot;Handbook for Digital Signal Processing&amp;quot; (1993,1312 Seiten), ISBN 0471619957&lt;br /&gt;
&lt;br /&gt;
Foren:&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/list-10-1.html DSP-Forum auf mikrocontroller.net (deutsch)]&lt;br /&gt;
* [http://groups.google.de/group/comp.dsp Newsgroup comp.dsp (Englisch)]&lt;br /&gt;
* [http://www.dsprelated.com/groups.php Discussion Groups (Englisch)]&lt;br /&gt;
&lt;br /&gt;
Webseiten:&lt;br /&gt;
* http://www.dspguru.com/ - FAQs, Infos, Beispielcode, ...&lt;br /&gt;
* http://docs.google.com/View?docid=dg2hppb_4gtgk89 - evtl. interessant als Rohmaterial für diesen Artikel&lt;br /&gt;
* http://www.dsprelated.com - Blogs, Jobs, Comp.DSP, ...&lt;br /&gt;
* http://www.unidsp56.de/ Eine Entwicklungsplattform für den Amateur&lt;br /&gt;
&lt;br /&gt;
== Verfahren ==&lt;br /&gt;
&lt;br /&gt;
=== FIR- und IIR-Filter ===&lt;br /&gt;
&lt;br /&gt;
Die häufigste Aufgabe in der DSV ist das Filtern, das heißt bestimmte Frequenzanteile zu unterdrücken, in der Phase zu verschieben oder zu verstärken. Man kann grundsätzlich zwischen zwei Filterarten unterscheiden:&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;FIR-Filter&#039;&#039;&#039;n (&#039;&#039;&#039;F&#039;&#039;&#039;inite &#039;&#039;&#039;I&#039;&#039;&#039;mpulse &#039;&#039;&#039;R&#039;&#039;&#039;esponse) wird jeder Ausgangswert aus unterschiedlich gewichteten und addierten früheren Eingangswerten zusammengesetzt. Dabei bezeichnet man die maximale Anzahl an vergangenen Werten die bei der Berechnung berücksichtigt werden als &#039;&#039;&#039;Ordnung&#039;&#039;&#039;. Je höher die Ordnung, desto besser die Eigenschaften des Filters (Ripple, Steilheit, Dämpfung), desto höher aber auch der Rechenaufwand.&lt;br /&gt;
&lt;br /&gt;
Merkmale von FIR-Filtern:&lt;br /&gt;
* immer stabil&lt;br /&gt;
* linearer Phasengang -&amp;gt; keine Phasenverzerrungen&lt;br /&gt;
* Ordnungen oft im zwei- bis dreistelligen Bereich&lt;br /&gt;
* problemlos realisierbar!&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zu FIR-Filtern werden bei &#039;&#039;&#039;IIR-Filter&#039;&#039;&#039;n (&#039;&#039;&#039;I&#039;&#039;&#039;nfinite &#039;&#039;&#039;I&#039;&#039;&#039;mpulse &#039;&#039;&#039;R&#039;&#039;&#039;esponse) auch frühere &#039;&#039;&#039;Ausgangs&#039;&#039;&#039;werte in die Berechnung des aktuellen Ausgangswertes mit einbezogen. Wie man sich leicht vorstellen kann, kann dadurch die Antwort auf einen Eingangsimpuls theoretisch unendlich lang werden, da jeder Ausgangswert auf den Eingang rückgekoppelt wird.&lt;br /&gt;
&lt;br /&gt;
Merkmale von IIR-Filtern:&lt;br /&gt;
* durch Rundungsfehler kann das Filter instabil werden -&amp;gt; &amp;quot;Aufschaukeln&amp;quot; durch Rückkopplung -&amp;gt; schwierigere Realisierung&lt;br /&gt;
* kein linearer Phasengang -&amp;gt; verschiedene Frequenzanteile werden durch den Filter unterschiedlich lange verzögert -&amp;gt; &amp;quot;Verzerrung&amp;quot;&lt;br /&gt;
* einziger Vorteil gegenüber FIR: Um einen gewünschten Frequenzgang zu erzielen ist eine sehr viel niedrigere Ordnung ausreichend -&amp;gt; weniger Rechenaufwand&lt;br /&gt;
* Ordnung üblicherweise &amp;lt; 10&lt;br /&gt;
&lt;br /&gt;
Viele nützliche Informationen zur Realisierung gibt es im [http://www.dspguru.com/info/faqs/ FIR- und IIR-FAQ auf dspguru.com] (der dort erwähnte Sourcecode FirAlgs.c kann [[Media:FirAlgs.c|hier]] direkt heruntergeladen werden).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Berechnungssoftware&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.filter-solutions.com/digital.html Beschreibung der Digitalfiltertypen], [http://www.nuhertz.com/download.html hier kostenlose Testversion Filter Free]&lt;br /&gt;
&lt;br /&gt;
=== FFT ===&lt;br /&gt;
&lt;br /&gt;
Die FFT (Fast Fourier Transform) ist ein schneller Algorithmus zur Berechnung der DFT (Discrete Fourier Transform). Damit bezeichnet man die Transformation eines Zeitsignals (= eine Abfolge von Samples) in den Frequenzbereich (= Frequenzbestandteile des Signals). Die Transformation kann auch ohne Verlust umgekehrt durchgeführt werden, also vom Frequenz- in den Zeitbereich (Inverse Discrete Fourier Transform, IDFT). Eine DFT wird praktisch immer mit dem FFT-Algorithmus realisiert, weshalb die Bezeichnungen FFT/DFT oft gleichwertig verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Die offensichtlichste Anwendung der FFT ist die Darstellung des Frequenzspektrums eines Signals. Aber das ist nur ein kleiner Teil der Anwendungsmöglichkeiten. Viele Verarbeitungen lassen sich im Frequenzbereich einfacher durchführen als im Zeitbereich, z.&amp;amp;nbsp;B. Korrelationen oder sehr lange FIR-Filter. Das zu verarbeitende Signal wird dazu in den Frequenzbereich transformiert, dort manipuliert, und wieder in den Zeitbereich zurücktransformiert. Das klingt vielleicht umständlich, kann aber in der Praxis sehr viel schneller sein als eine Realisierung im Zeitbereich.&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/25095 Diskussion: FFT auf dem AVR]&lt;br /&gt;
* [http://sourceforge.net/projects/kissfft/ Kiss FFT] - einfache FFT-Bibliothek, in C, Floating- und Fixed Point, BSD-Lizenz, geeignet für Mikrocontroller&lt;br /&gt;
* [http://www.fftw.org/ FFTW] - &#039;&#039;&#039;die&#039;&#039;&#039; Floating Point FFT-Bibliothek für PCs, GPL-Lizenz&lt;br /&gt;
*[http://www.sprut.de/electronic/pic/16bit/dsp/fft/fft.htm FFT - verständlich auch für Nichtakademiker (Deutsch)]&lt;br /&gt;
* [http://www.science.smith.edu/departments/Physics/fstaff/gfelder/ffteasy/ ffteasy - Einfache Routinen zur FFT]&lt;br /&gt;
&lt;br /&gt;
=== Goertzel-Algorithmus ===&lt;br /&gt;
&lt;br /&gt;
Liegt das Interesse nach der FFT nur auf bestimmten Frequenz-Linien, gibt es eine weniger rechenaufwendige Alternative in diesem Algorithmus.&lt;br /&gt;
&lt;br /&gt;
Das typische Anwendungsgebiet sind DTMF-Dekoder in Software.&lt;br /&gt;
Hierfür sind sogar die üblichen 8-bit-AVR-Controller ausreichend schnell.&lt;br /&gt;
&lt;br /&gt;
=== Signalerzeugung ===&lt;br /&gt;
&lt;br /&gt;
Rechteck-, Sägezahn- und Dreieckssignale lassen sich mit einfachen Zählern realisieren.&lt;br /&gt;
&lt;br /&gt;
Möchte man Sinus- oder beliebige andere Signalformen erzeugen, bietet es sich an vorausberechnete Funktionswerte im Speicher abzulegen und der Reihe nach auszugeben. Eine variable Frequenzeinstellung kann man durch die Methode der Direkten Digitalen Synthese (&#039;&#039;&#039;DDS&#039;&#039;&#039;) realisieren.&lt;br /&gt;
&lt;br /&gt;
* [[Digitaler Funktionsgenerator]] - ausführliche Erklärung des Verfahrens im PDF, Beispielcode für AVR&lt;br /&gt;
* http://www.myplace.nu/avr/minidds/ - noch ein AVR-Projekt&lt;br /&gt;
* http://www.hit.bme.hu/~papay/sci/DDS/start.htm - noch eine Erklärung&lt;br /&gt;
&lt;br /&gt;
Eine weitere Methode zur Realisierung von (mehr oder weniger beliebigen) Funktionen ist die &#039;&#039;&#039;Polynomapproximation&#039;&#039;&#039;. Dabei nähert man die zu erzeugende Funktion durch ein Polynom an und verwendet das Horner-Schema um die einzelnen Funktionswerte zu berechnen. Für ein Polynom der Ordnung N benötigt man damit pro Wert N+1 Multiplikationen (N ist üblicherweise &amp;lt;= 10).&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
Zur Entwicklung von Signalverarbeitungsverfahren gibt es eine ganze Reihe von Programmen. Neben kleinen Tools für Filterdesign und spezialisierten Bibliotheken zum Einbinden in eigene Programme gibt es mehrere Mathematikprogramme, mit denen sich Signale verarbeiten und darstellen lassen. Die drei wichtigsten sind Matlab, Octave und Scilab.&lt;br /&gt;
&lt;br /&gt;
=== MATLAB ===&lt;br /&gt;
&lt;br /&gt;
MATLAB ist das Standardprogramm für numerische Mathematik. In der digitalen Signalverarbeitung wird es häufig verwendet, um einen Algorithmus vor der Umsetzung in C-Code oder auf einen DSP zu entwickeln und zu testen. Zum schon recht hohen Preis der Grundsoftware muss man noch einige hundert Euro für diverse Toolboxes einplanen (Signal Processing, Filter Design, Image Processing). Die [http://www.mikrocontroller.net/link/isbn/0979223903 Studentenversion] kostet ca. 80 Euro (die Signal Processing Toolbox und ein paar andere sind bereits enthalten).&lt;br /&gt;
&lt;br /&gt;
MATLAB ist für Windows, Linux, Mac OS X, Solaris und HP-UX erhältlich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* http://users.ece.gatech.edu/%7Ebonnie/book/TUTORIAL/tutorial.html - Englischsprachiges MATLAB-Tutorial&lt;br /&gt;
* http://www.mathworks.com/access/helpdesk/help/techdoc/matlab.shtml - MATLAB-Referenz&lt;br /&gt;
* http://www.eng.auburn.edu/~sjreeves/Classes/DSP/DSP.html - MATLAB for DSP (allgemeine Tipps und Hinweise)&lt;br /&gt;
&lt;br /&gt;
=== Octave ===&lt;br /&gt;
&lt;br /&gt;
Das Open-Source-Programm Octave zeichnet sich durch einen hohen Grad an Matlab-Kompatibilität aus; das geht so weit, dass man problemlos die Matlab-Online-Hilfe und Matlab-Einführungen zum Lernen verwenden kann. In dem Zusatzpaket Octave-Forge sind auch viele Funktionen der Matlab-Toolboxes enthalten (z.&amp;amp;nbsp;B. Filterdesign, Signalverarbeitung). Octave ist ein reines Kommandozeilenprogramm, so dass man auf alle Annehmlichkeiten des Matlab-GUI verzichten muss. Zum Plotten wird gnuplot verwendet.&lt;br /&gt;
&lt;br /&gt;
Octave lässt sich auf praktisch jedem Unix kompilieren. Für Windows gibt es ein fertig kompiliertes Paket.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* http://octave.sourceforge.net/ - Übersicht über alle Funktionen von Octave/Octave-Forge&lt;br /&gt;
&lt;br /&gt;
=== Scilab / Scicos ===&lt;br /&gt;
&lt;br /&gt;
Auch das Open-Source-Programmpaket Scilab / Scicos, ähnlich leistungsfähig wie Matlab und seine Zusatzmodule, ist kostenlos und im Quelltext erhältlich. Während die Grundsyntax (Kontrollstrukturen, Ausdrücke) weitgehend Matlab-kompatibel ist, gibt es bei den Funktionen z.T. deutliche Abweichungen. Dafür bietet Scilab / Scicos verglichen mit Octave umfangreichere Möglichkeiten zur grafischen Darstellung, die über das 2D- und 3D-Plotten von Funktionen weit hinausgehen, z.&amp;amp;nbsp;B. lassen sich Linien, Kreise usw. zeichnen.&lt;br /&gt;
&lt;br /&gt;
Scilab / Scicos läuft unter Windows, Linux/Unix und Mac OS X. Für die wichtigsten Linux-Distributionen sind fertige, komplette Binärpakete (RPM, ...) zur einfachen Installation frei verfügbar. Für Windows gibt es ebenfalls ein einfach zu installierendes Komplettpaket.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.scilab.org/ Scilab Homepage (Universelles Wissenschaftlich-Technisches Mathematik-Paket)]&lt;br /&gt;
* [http://www.scicos.org/ Scicos Homepage (Modellations- und Simulations-Paket für Scilab, ist im Scilab-Download enthalten)]&lt;br /&gt;
* [http://www-rocq.inria.fr/scicos/scicosmodnum.html ModNum Digital communication toolbox zu Scicos]&lt;br /&gt;
* [http://www.scilab.org/publications/index_publications.php?page=freebooks Übersicht zur Literatur: Webtexte, Bücher und Zeitschriftenartikel]&lt;br /&gt;
&#039;&#039;&#039;Bücher&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.scicos.org/book.html Modeling and Simulation in Scilab/Scicos, (für Version 3.0, aktuell ist Version 4.1.2)]&lt;br /&gt;
&#039;&#039;&#039;Tutorials&#039;&#039;&#039;:&lt;br /&gt;
* [http://wiki.scilab.org/Tutorials?action=AttachFile&amp;amp;do=get&amp;amp;target=signal.pdf Signal Processing with Scilab (1998)], [http://wuarchive.wustl.edu/pub/aminet/misc/math/scilab-doc.lha Beispielfiles dazu lha-gepackt (1996)] [http://aminet.net/package/misc/math/scilab-doc oder hier], [http://viewvc.scilab.org/bin/cgi/viewvc.cgi/trunk/scilab_doc/signal/Nfigs_source/ hier auch einzeln erhältlich]&lt;br /&gt;
* [http://www.scilab.org/publications/delicado/scilab.pdf DSP-Tutorial in spanisch, teilweise aus dem englischen Tutorial entnommen]&lt;br /&gt;
* [http://www.neurotraces.com/scilab/scilab2/index.html Treatment of neurophysiological signals using Scilab, HTML-Texte mit Kapiteln zu Filtern, FFT usw.]&lt;br /&gt;
* [http://www.scilab.org/publications/TELECOM/ComNumSc.zip Digital-Kommunikation - französisches Tutorial, gezipptes Postscript]&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Ein DSP (&#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;S&#039;&#039;&#039;ignal &#039;&#039;&#039;P&#039;&#039;&#039;rocessor) ist eine spezielle CPU mit einem auf die Verarbeitung von Signalen optimierten Kern und Befehlssatz. Unterschieden wird hauptsächlich zwischen Gleitkomma- und Festkomma-DSPs.&lt;br /&gt;
&lt;br /&gt;
Charakteristisches Merkmal vieler DSPs ist eine VLIW-Architektur (&#039;&#039;&#039;V&#039;&#039;&#039;ery &#039;&#039;&#039;L&#039;&#039;&#039;ong &#039;&#039;&#039;I&#039;&#039;&#039;nstruction &#039;&#039;&#039;W&#039;&#039;&#039;ord). Dabei werden Anweisungen für mehrere parallele Ausführungseinheiten (Multiplizierer/Addierer/Akkumulatoren) und mehrere Lade-/Speicherbefehle in einem einzigen, langen Befehlswort kodiert, und in einem Takt ausgeführt. Dazu kommen häufig mehrere gleichzeitig adressierbare Speicherbänke, Unterstützung für Ringpuffer, Schleifen ohne Sprung-Overhead, Bit-Reverse-Adressierung (wichtig für FFT) und Arithmetik mit Sättigungs- statt Überlaufverhalten (wichtig für die Realisierung von IIR-Filtern).&lt;br /&gt;
&lt;br /&gt;
Seit ein paar Jahren beginnen die Grenzen zwischen Mikrocontrollern und DSPs etwas zu verschwimmen. Viele Mikrocontroller werden mit zusätzlichen DSP-Funktionen ausgestattet ([[PICCOLO]], [[dsPIC]], [[ARM]]), während DSPs zunehmend in Richtung der Aufgabenbereiche eines Mikrocontrollers oder Allround-Prozessors vordringen und immer öfter um Unterstützung für Betriebssysteme (MMU) oder I/O-Funktionen wie Ethernet oder USB erweitert werden ([[Blackfin]]).&lt;br /&gt;
&lt;br /&gt;
Eine noch größere DSP-Rechenleistung kann mit programmierbaren Logikbausteinen (&#039;&#039;&#039;[[FPGA]]&#039;&#039;&#039;s) erzielt werden, da die Anzahl gleichzeitig ausführbarer Rechenoperationen nur durch die Größe des FPGAs begrenzt wird. Nachteilig sind die gegenüber DSPs um ein vielfaches höheren Kosten, höherer Stromverbrauch und höherer Entwicklungsaufwand, weshalb FPGAs für Signalverarbeitung nur in sehr speziellen Anwendungen verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Aktuelle &#039;&#039;&#039;PC-Prozessoren&#039;&#039;&#039; sind sehr gut für Gleitkomma-Signalverarbeitung geeignet. Wenn keine besonderen Anforderungen an Echtzeitfähigkeit, Strom- oder Platzbedarf gestellt werden, hat ein normaler PC mit Abstand das beste Preis/Leistungsverhältnis. Der erste Schritt bei einem DSP-Projekt sollte somit eine Implementierung auf dem PC sein. Es macht wenig Sinn, ein Eval-Board für einen Signalprozessor zu kaufen und einfach loszulegen.&lt;br /&gt;
&lt;br /&gt;
=== Fest- oder Gleitkomma? ===&lt;br /&gt;
&lt;br /&gt;
Signalverarbeitung auf einem Gleitkomma- (Floating-Point-) Rechner ist grundsätzlich einfacher als auf einem Festkomma- (Fixed-Point-) Rechner. Da die Ungenauigkeiten bei der Rechnung mit Floating-Point-Zahlen in vielen Fällen vernachlässigbar sind, kann man einen Algorithmus i.d.R. 1:1 in Programmcode umsetzen. Hat man nur Festkomma-Rechenoperationen zur Verfügung wird es etwas ungemütlich. Man muss sich Gedanken um die Skalierung der Daten, die Reihenfolge von Rechenoperationen, Überläufe, Rundungsrauschen usw. machen. Da Gleitkomma-DSPs allerdings teurer sind und mehr Strom verbrauchen, werden für Massenprodukte fast ausschließlich Festkomma-DSPs bzw. ASICs mit Festkomma-Rechenwerken verwendet.&lt;br /&gt;
&lt;br /&gt;
=== TI C2000 ===&lt;br /&gt;
&lt;br /&gt;
Eine komplette 32-bit DSC Controller Familie vom low-cost ([http://www.ti.com/corp/docs/landing/f280xx-piccolo/index.htm PICCOLO]) bis high-end Controller mit FPU ([http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=mcu&amp;amp;sectionId=95&amp;amp;tabId=2108&amp;amp;familyId=1414&amp;amp;paramCriteria=no TMS320F28335]).&lt;br /&gt;
Die Peripherie umfasst Mehrkanal A/D Wandler mit 12-bit Aufloesung und bis zu 4 Megasamples Abtastrate. Die PWMs haben einen hochauflösenden Modus, der bis zu 150ps auflösen kann. Als Interface stehen CAN, I2C, schnelle generelle serielle Ports und Quadratureingänge für Drehgeber zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
=== TI C5000 ===&lt;br /&gt;
&lt;br /&gt;
DSP für Batterieapplikationen. Die gesamte Architektur wurde auf Stromverbrauch optimiert. Dazu werden spezielle Tools zur Verfügung gestellt, die zur Anwendung passende Optimierungslösungen generiert. [[TMS320VC5505 eZDSP USB Stick‎]] mit IDE als preisgünstiges Entwicklungssystem ( &amp;lt; 50€)&lt;br /&gt;
&lt;br /&gt;
=== TI C6000 ===&lt;br /&gt;
&lt;br /&gt;
DSP-Familie vom Marktführer Texas Instruments, enthält sowohl Fest- als auch Gleitkomma-DSPs.&lt;br /&gt;
&lt;br /&gt;
=== TI DM6400 (DaVinci) ===&lt;br /&gt;
&lt;br /&gt;
DSP für Videoanwendungen. Einige Derivate enthalten auch einen ARM9 als Co-Prozessor. Diese Familie wird unter dem Namen [http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=dsp&amp;amp;sectionId=2&amp;amp;tabId=1852&amp;amp;familyId=1300 DaVinci] vermarktet.&lt;br /&gt;
&lt;br /&gt;
=== TI OMAP ===&lt;br /&gt;
&lt;br /&gt;
Prozessor für mobile Geräte, enthält einen ARM-Kern und einen C6000-DSP. Ein interessantes und mit $149 sehr preisgünstiges Evalboard ist das [http://www.beagleboard.org Beagle Board]. Ein kostenloser Assembler für den DSP ist verfügbar.&lt;br /&gt;
&lt;br /&gt;
=== SHARC/TigerSHARC ===&lt;br /&gt;
&lt;br /&gt;
32 Bit Gleitkomma-DSP von Analog Devices.&lt;br /&gt;
&lt;br /&gt;
=== Blackfin ===&lt;br /&gt;
&lt;br /&gt;
Der Blackfin ist ein 16/32 Bit Festkomma-DSP von Analog Devices. Im Gegensatz zu den 16-bittigen Vorgängern ADSP-21xx, die häufig als Co-Prozessoren zur Signalverarbeitung zusammen mit einem Mikrocontroller verwendet werden, geht der Blackfin schon weit in den Einsatzbereich eines Allround-Prozessors hinein. So gibt es z.&amp;amp;nbsp;B. einen Linux-Port für Blackfin, Eval-Boards mit Ethernet, CAN, USB und vielen MB SDRAM. Dank der verbesserten Stromsparfunktionen der BF52x-Reihe ist diese eher neue Architektur vermehrt in mobilen Geräten (Kameras, Mediaplayer, etc.) anzutreffen.&lt;br /&gt;
&lt;br /&gt;
Wichtig für die Entwicklung ist zu wissen:&lt;br /&gt;
&lt;br /&gt;
* Kein Fließkomma-Support in Hardware&lt;br /&gt;
* Keine MMU, keine Unterstützung für virtuelles Memory (kein Unix fork(), etc.)&lt;br /&gt;
&lt;br /&gt;
Unterstützte Entwicklungswerkzeuge:&lt;br /&gt;
&lt;br /&gt;
* Visual DSP++: Hauseigenes Entwicklungstool von Analog Devices, kommerziell&lt;br /&gt;
* GCC: Freie GNU-Umgebung mit Assembler, Compiler, Linker, Debugger&lt;br /&gt;
* Eclipse für uClinux-Entwicklung wie auch &#039;standalone&#039; ohne OS&lt;br /&gt;
&lt;br /&gt;
Aufgrund der ausgereiften GNU-Toolchain ist der Blackfin eine der kostengünstigsten Plattformen für die Entwicklung. Die Tools laufen sowohl unter Windows32 als auch Linux, bevorzugt wird jedoch Linux eingesetzt. Für die Kernel-Entwicklung ist Linux unabdingbar.&lt;br /&gt;
Dank offener JTAG-Spezifikation existieren einige Tools von Drittherstellern zum Hardware-Debugging (In Circuit Emulation) und zur Programmierung:&lt;br /&gt;
&lt;br /&gt;
* [http://www.section5.ch/icebear ICEbear] JTAG: schneller USB-&amp;gt;JTAG adapter&lt;br /&gt;
* [http://www.ronetix.at/ PEEDI] High end JTAG, Ethernet&lt;br /&gt;
* [http://www.bluetechnix.at/rainbow2006/site/blackfin_family/__dev_tools/__gnice_jtag/409/gnice_jtag.aspx gnICE von Bluetechnix]&lt;br /&gt;
* [http://www.analog.com/en/processors-dsp/blackfin/emulator-100/processors/product.html JTAG-Adapter von Analog Devices]&lt;br /&gt;
&lt;br /&gt;
Beide Tools arbeiten auch mit ARM-Prozessoren.&lt;br /&gt;
&lt;br /&gt;
Weitere Links:&lt;br /&gt;
&lt;br /&gt;
* [http://www.analog.com/blackfin Herstellerwebsite]&lt;br /&gt;
* [http://blackfin.uclinux.org/ uClinux Port und GNU toolchain]&lt;br /&gt;
&lt;br /&gt;
=== dsPIC ===&lt;br /&gt;
&lt;br /&gt;
Der [[dsPIC]] ist ein kleiner 16 Bit-Mikrocontroller mit DSP-Funktionen. Mit dem klassischen PIC hat er außer dem Namen nichts gemeinsam.&lt;br /&gt;
&lt;br /&gt;
=== TriCore ===&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;TriCore&#039;&#039;&#039; von Infineon ist ein 32-Bit-Mikrocontroller mit DSP-Funktionen, mit derzeitigem Schwerpunkt im Bereich der High Performance Embedded Real-Time Systems für Industrie-  und Automobilanwendungen (Beispiele: Motorsteuerungen, Servomotoren, Solarinverter, Multi-Axis-Conrol) &lt;br /&gt;
&lt;br /&gt;
* [http://www.infineon.com/cgi-bin/ifx/portal/ep/channelView.do?channelId=-78991&amp;amp;channelPage=%2Fep%2Fchannel%2FleafNote.jsp&amp;amp;pageTypeId=17099  Übersicht über die &#039;&#039;&#039;TriCore&#039;&#039;&#039; Produktfamilie]&lt;br /&gt;
&lt;br /&gt;
=== Bezugsquellen für Starterkits/Evalboards ===&lt;br /&gt;
&lt;br /&gt;
* http://www.spectrumdigital.com - große Auswahl an Starterkits mit TI-DSPs, ab $300&lt;br /&gt;
* http://www.bluetechnix.com - Blackfin-Module ab € 150&lt;br /&gt;
* http://www.zbrain.ch/ - Blackfin-Modul, Preis: ?&lt;br /&gt;
* http://www.danvillesignal.com/ - ADSP-218x-Boards ab $200, Sharc-Boards ab $400&lt;br /&gt;
* http://docs.blackfin.uclinux.org/doku.php?id=buy_stuff - Blackfin BF533 STAMP $170 (keine analogen Schnittstellen, aber über Pfostenstecker leicht zu erweitern)&lt;br /&gt;
* http://www.sundance.com - High-End-Module mit TI C6000&lt;br /&gt;
* http://www.spectrumsignal.com/ - TMS320 und SHARC&lt;br /&gt;
* http://www.pentek.com/dspcentral/ - TMS430 und PowerPC&lt;br /&gt;
* http://www.bittware.com/ - SHARC und TigerSHARC&lt;br /&gt;
* http://www.hunteng.co.uk/ - C6000&lt;br /&gt;
* http://www.kanecomputing.co.uk&lt;br /&gt;
* http://www.dsp-systeme.net - DSP-Module mit DSP von TI und ADI&lt;br /&gt;
* http://search.digikey.com/scripts/DkSearch/dksus.dll?lang=de&amp;amp;site=DE&amp;amp;WT.z_homepage_link=hp_go_button&amp;amp;KeyWords=TMDX5505EZDSP&amp;amp;x=22&amp;amp;y=22  eZDSP  USB Stick , &amp;lt;50€&lt;br /&gt;
* http://www.dsp-weuffen.de  - TI C6727 Board und vielen Beispielen&lt;br /&gt;
* http://www.ehitex.de/artikel.php?xPD=131_132&amp;amp;kat_name= - Infineon TriCore Starter Kits&lt;br /&gt;
&lt;br /&gt;
== Artikel aus der Kategorie DSP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ncl style=compact maxdepth=2 headings=bullet headstart=2&lt;br /&gt;
      showcats=1 showarts=1&amp;gt;DSP&amp;lt;/ncl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:DSP| ]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Digitale_Signalverarbeitung&amp;diff=60861</id>
		<title>Digitale Signalverarbeitung</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Digitale_Signalverarbeitung&amp;diff=60861"/>
		<updated>2011-10-01T00:03:14Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Anwendungsbeispiele ==&lt;br /&gt;
&lt;br /&gt;
* Modulation/Demodulation zur Datenübertragung (z.&amp;amp;nbsp;B. Telefonmodem, DSL, GSM) - &amp;quot;Software Defined Radio&amp;quot; (SDR)&lt;br /&gt;
* Multimediacodierung (MP3, DivX, JPEG)&lt;br /&gt;
* Bildverarbeitung (Mustererkennung)&lt;br /&gt;
* Echo- und Störgeräuschunterdrückung bei Telefonen, Sprechgarnituren (Headsets) und Hörgeräten&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
&lt;br /&gt;
Bücher:&lt;br /&gt;
* Oppenheim, Schaefer: &amp;quot;Discrete Time Signal Processing&amp;quot;, ISBN 0131988425&lt;br /&gt;
* Proakis: &amp;quot;Digital Signal Processing&amp;quot;, ISBN 0131873741&lt;br /&gt;
* Lyons: &amp;quot;Understanding Digital Signal Processing&amp;quot;, ISBN 0131089897&lt;br /&gt;
* Smith: &amp;quot;The Scientist and Engineer&#039;s Guide to Digital Signal Processing&amp;quot;, ISBN  075067444X (unter http://dspguide.com/ als PDF verfügbar)&lt;br /&gt;
* Sanjit K. Mitra: &amp;quot;Handbook for Digital Signal Processing&amp;quot; (1993,1312 Seiten), ISBN 0471619957&lt;br /&gt;
&lt;br /&gt;
Foren:&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/list-10-1.html DSP-Forum auf mikrocontroller.net (deutsch)]&lt;br /&gt;
* [http://groups.google.de/group/comp.dsp Newsgroup comp.dsp (Englisch)]&lt;br /&gt;
* [http://www.dsprelated.com/groups.php Discussion Groups (Englisch)]&lt;br /&gt;
&lt;br /&gt;
Webseiten:&lt;br /&gt;
* http://www.dspguru.com/ - FAQs, Infos, Beispielcode, ...&lt;br /&gt;
* http://docs.google.com/View?docid=dg2hppb_4gtgk89 - evtl. interessant als Rohmaterial für diesen Artikel&lt;br /&gt;
* http://www.dsprelated.com - Blogs, Jobs, Comp.DSP, ...&lt;br /&gt;
* http://www.unidsp56.de/ Eine Entwicklungsplattform für den Amateur&lt;br /&gt;
&lt;br /&gt;
== Verfahren ==&lt;br /&gt;
&lt;br /&gt;
=== FIR- und IIR-Filter ===&lt;br /&gt;
&lt;br /&gt;
Die häufigste Aufgabe in der DSV ist das Filtern, das heißt bestimmte Frequenzanteile zu unterdrücken, in der Phase zu verschieben oder zu verstärken. Man kann grundsätzlich zwischen zwei Filterarten unterscheiden:&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;FIR-Filter&#039;&#039;&#039;n (&#039;&#039;&#039;F&#039;&#039;&#039;inite &#039;&#039;&#039;I&#039;&#039;&#039;mpulse &#039;&#039;&#039;R&#039;&#039;&#039;esponse) wird jeder Ausgangswert aus unterschiedlich gewichteten und addierten früheren Eingangswerten zusammengesetzt. Dabei bezeichnet man die maximale Anzahl an vergangenen Werten die bei der Berechnung berücksichtigt werden als &#039;&#039;&#039;Ordnung&#039;&#039;&#039;. Je höher die Ordnung, desto besser die Eigenschaften des Filters (Ripple, Steilheit, Dämpfung), desto höher aber auch der Rechenaufwand.&lt;br /&gt;
&lt;br /&gt;
Merkmale von FIR-Filtern:&lt;br /&gt;
* immer stabil&lt;br /&gt;
* linearer Phasengang -&amp;gt; keine Phasenverzerrungen&lt;br /&gt;
* Ordnungen oft im zwei- bis dreistelligen Bereich&lt;br /&gt;
* problemlos realisierbar!&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zu FIR-Filtern werden bei &#039;&#039;&#039;IIR-Filter&#039;&#039;&#039;n (&#039;&#039;&#039;I&#039;&#039;&#039;nfinite &#039;&#039;&#039;I&#039;&#039;&#039;mpulse &#039;&#039;&#039;R&#039;&#039;&#039;esponse) auch frühere &#039;&#039;&#039;Ausgangs&#039;&#039;&#039;werte in die Berechnung des aktuellen Ausgangswertes mit einbezogen. Wie man sich leicht vorstellen kann, kann dadurch die Antwort auf einen Eingangsimpuls theoretisch unendlich lang werden, da jeder Ausgangswert auf den Eingang rückgekoppelt wird.&lt;br /&gt;
&lt;br /&gt;
Merkmale von IIR-Filtern:&lt;br /&gt;
* durch Rundungsfehler kann das Filter instabil werden -&amp;gt; &amp;quot;Aufschaukeln&amp;quot; durch Rückkopplung -&amp;gt; schwierigere Realisierung&lt;br /&gt;
* kein linearer Phasengang -&amp;gt; verschiedene Frequenzanteile werden durch den Filter unterschiedlich lange verzögert -&amp;gt; &amp;quot;Verzerrung&amp;quot;&lt;br /&gt;
* einziger Vorteil gegenüber FIR: Um einen gewünschten Frequenzgang zu erzielen ist eine sehr viel niedrigere Ordnung ausreichend -&amp;gt; weniger Rechenaufwand&lt;br /&gt;
* Ordnung üblicherweise &amp;lt; 10&lt;br /&gt;
&lt;br /&gt;
Viele nützliche Informationen zur Realisierung gibt es im [http://www.dspguru.com/info/faqs/ FIR- und IIR-FAQ auf dspguru.com] (der dort erwähnte Sourcecode FirAlgs.c kann [[Media:FirAlgs.c|hier]] direkt heruntergeladen werden).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Berechnungssoftware&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.filter-solutions.com/digital.html Beschreibung der Digitalfiltertypen], [http://www.nuhertz.com/download.html hier kostenlose Testversion Filter Free]&lt;br /&gt;
&lt;br /&gt;
=== FFT ===&lt;br /&gt;
&lt;br /&gt;
Die FFT (Fast Fourier Transform) ist ein schneller Algorithmus zur Berechnung der DFT (Discrete Fourier Transform). Damit bezeichnet man die Transformation eines Zeitsignals (= eine Abfolge von Samples) in den Frequenzbereich (= Frequenzbestandteile des Signals). Die Transformation kann auch ohne Verlust umgekehrt durchgeführt werden, also vom Frequenz- in den Zeitbereich (Inverse Discrete Fourier Transform, IDFT). Eine DFT wird praktisch immer mit dem FFT-Algorithmus realisiert, weshalb die Bezeichnungen FFT/DFT oft gleichwertig verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Die offensichtlichste Anwendung der FFT ist die Darstellung des Frequenzspektrums eines Signals. Aber das ist nur ein kleiner Teil der Anwendungsmöglichkeiten. Viele Verarbeitungen lassen sich im Frequenzbereich einfacher durchführen als im Zeitbereich, z.&amp;amp;nbsp;B. Korrelationen oder sehr lange FIR-Filter. Das zu verarbeitende Signal wird dazu in den Frequenzbereich transformiert, dort manipuliert, und wieder in den Zeitbereich zurücktransformiert. Das klingt vielleicht umständlich, kann aber in der Praxis sehr viel schneller sein als eine Realisierung im Zeitbereich.&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/25095 Diskussion: FFT auf dem AVR]&lt;br /&gt;
* [http://sourceforge.net/projects/kissfft/ Kiss FFT] - einfache FFT-Bibliothek, in C, Floating- und Fixed Point, BSD-Lizenz, geeignet für Mikrocontroller&lt;br /&gt;
* [http://www.fftw.org/ FFTW] - &#039;&#039;&#039;die&#039;&#039;&#039; Floating Point FFT-Bibliothek für PCs, GPL-Lizenz&lt;br /&gt;
*[http://www.sprut.de/electronic/pic/16bit/dsp/fft/fft.htm FFT - verständlich auch für Nichtakademiker (Deutsch)]&lt;br /&gt;
* [http://www.science.smith.edu/departments/Physics/fstaff/gfelder/ffteasy/ ffteasy - Einfache Routinen zur FFT]&lt;br /&gt;
&lt;br /&gt;
=== Goertzel-Algorithmus ===&lt;br /&gt;
&lt;br /&gt;
Liegt das Interesse nach der FFT nur auf bestimmten Frequenz-Linien, gibt es eine weniger rechenaufwendige Alternative in diesem Algorithmus.&lt;br /&gt;
&lt;br /&gt;
Das typische Anwendungsgebiet sind DTMF-Dekoder in Software.&lt;br /&gt;
Hierfür sind sogar die üblichen 8-bit-AVR-Controller ausreichend schnell.&lt;br /&gt;
&lt;br /&gt;
=== Signalerzeugung ===&lt;br /&gt;
&lt;br /&gt;
Rechteck-, Sägezahn- und Dreieckssignale lassen sich mit einfachen Zählern realisieren.&lt;br /&gt;
&lt;br /&gt;
Möchte man Sinus- oder beliebige andere Signalformen erzeugen, bietet es sich an vorausberechnete Funktionswerte im Speicher abzulegen und der Reihe nach auszugeben. Eine variable Frequenzeinstellung kann man durch die Methode der Direkten Digitalen Synthese (&#039;&#039;&#039;DDS&#039;&#039;&#039;) realisieren.&lt;br /&gt;
&lt;br /&gt;
* [[Digitaler Funktionsgenerator]] - ausführliche Erklärung des Verfahrens im PDF, Beispielcode für AVR&lt;br /&gt;
* http://www.myplace.nu/avr/minidds/ - noch ein AVR-Projekt&lt;br /&gt;
* http://www.hit.bme.hu/~papay/sci/DDS/start.htm - noch eine Erklärung&lt;br /&gt;
&lt;br /&gt;
Eine weitere Methode zur Realisierung von (mehr oder weniger beliebigen) Funktionen ist die &#039;&#039;&#039;Polynomapproximation&#039;&#039;&#039;. Dabei nähert man die zu erzeugende Funktion durch ein Polynom an und verwendet das Horner-Schema um die einzelnen Funktionswerte zu berechnen. Für ein Polynom der Ordnung N benötigt man damit pro Wert N+1 Multiplikationen (N ist üblicherweise &amp;lt;= 10).&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
Zur Entwicklung von Signalverarbeitungsverfahren gibt es eine ganze Reihe von Programmen. Neben kleinen Tools für Filterdesign und spezialisierten Bibliotheken zum Einbinden in eigene Programme gibt es mehrere Mathematikprogramme, mit denen sich Signale verarbeiten und darstellen lassen. Die drei wichtigsten sind Matlab, Octave und Scilab.&lt;br /&gt;
&lt;br /&gt;
=== MATLAB ===&lt;br /&gt;
&lt;br /&gt;
MATLAB ist das Standardprogramm für numerische Mathematik. In der digitalen Signalverarbeitung wird es häufig verwendet, um einen Algorithmus vor der Umsetzung in C-Code oder auf einen DSP zu entwickeln und zu testen. Zum schon recht hohen Preis der Grundsoftware muss man noch einige hundert Euro für diverse Toolboxes einplanen (Signal Processing, Filter Design, Image Processing). Die [http://www.mikrocontroller.net/link/isbn/0979223903 Studentenversion] kostet ca. 80 Euro (die Signal Processing Toolbox und ein paar andere sind bereits enthalten).&lt;br /&gt;
&lt;br /&gt;
MATLAB ist für Windows, Linux, Mac OS X, Solaris und HP-UX erhältlich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* http://users.ece.gatech.edu/%7Ebonnie/book/TUTORIAL/tutorial.html - Englischsprachiges MATLAB-Tutorial&lt;br /&gt;
* http://www.mathworks.com/access/helpdesk/help/techdoc/matlab.shtml - MATLAB-Referenz&lt;br /&gt;
* http://www.eng.auburn.edu/~sjreeves/Classes/DSP/DSP.html - MATLAB for DSP (allgemeine Tipps und Hinweise)&lt;br /&gt;
&lt;br /&gt;
=== Octave ===&lt;br /&gt;
&lt;br /&gt;
Das Open-Source-Programm Octave zeichnet sich durch einen hohen Grad an Matlab-Kompatibilität aus; das geht so weit, dass man problemlos die Matlab-Online-Hilfe und Matlab-Einführungen zum Lernen verwenden kann. In dem Zusatzpaket Octave-Forge sind auch viele Funktionen der Matlab-Toolboxes enthalten (z.&amp;amp;nbsp;B. Filterdesign, Signalverarbeitung). Octave ist ein reines Kommandozeilenprogramm, so dass man auf alle Annehmlichkeiten des Matlab-GUI verzichten muss. Zum Plotten wird gnuplot verwendet.&lt;br /&gt;
&lt;br /&gt;
Octave lässt sich auf praktisch jedem Unix kompilieren. Für Windows gibt es ein fertig kompiliertes Paket.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* http://octave.sourceforge.net/ - Übersicht über alle Funktionen von Octave/Octave-Forge&lt;br /&gt;
&lt;br /&gt;
=== Scilab / Scicos ===&lt;br /&gt;
&lt;br /&gt;
Auch das Open-Source-Programmpaket Scilab / Scicos, ähnlich leistungsfähig wie Matlab und seine Zusatzmodule, ist kostenlos und im Quelltext erhältlich. Während die Grundsyntax (Kontrollstrukturen, Ausdrücke) weitgehend Matlab-kompatibel ist, gibt es bei den Funktionen z.T. deutliche Abweichungen. Dafür bietet Scilab / Scicos verglichen mit Octave umfangreichere Möglichkeiten zur grafischen Darstellung, die über das 2D- und 3D-Plotten von Funktionen weit hinausgehen, z.&amp;amp;nbsp;B. lassen sich Linien, Kreise usw. zeichnen.&lt;br /&gt;
&lt;br /&gt;
Scilab / Scicos läuft unter Windows, Linux/Unix und Mac OS X. Für die wichtigsten Linux-Distributionen sind fertige, komplette Binärpakete (RPM, ...) zur einfachen Installation frei verfügbar. Für Windows gibt es ebenfalls ein einfach zu installierendes Komplettpaket.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.scilab.org/ Scilab Homepage (Universelles Wissenschaftlich-Technisches Mathematik-Paket)]&lt;br /&gt;
* [http://www.scicos.org/ Scicos Homepage (Modellations- und Simulations-Paket für Scilab, ist im Scilab-Download enthalten)]&lt;br /&gt;
* [http://www-rocq.inria.fr/scicos/scicosmodnum.html ModNum Digital communication toolbox zu Scicos]&lt;br /&gt;
* [http://www.scilab.org/publications/index_publications.php?page=freebooks Übersicht zur Literatur: Webtexte, Bücher und Zeitschriftenartikel]&lt;br /&gt;
&#039;&#039;&#039;Bücher&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.scicos.org/book.html Modeling and Simulation in Scilab/Scicos, (für Version 3.0, aktuell ist Version 4.1.2)]&lt;br /&gt;
&#039;&#039;&#039;Tutorials&#039;&#039;&#039;:&lt;br /&gt;
* [http://wiki.scilab.org/Tutorials?action=AttachFile&amp;amp;do=get&amp;amp;target=signal.pdf Signal Processing with Scilab (1998)], [http://wuarchive.wustl.edu/pub/aminet/misc/math/scilab-doc.lha Beispielfiles dazu lha-gepackt (1996)] [http://aminet.net/package/misc/math/scilab-doc oder hier], [http://viewvc.scilab.org/bin/cgi/viewvc.cgi/trunk/scilab_doc/signal/Nfigs_source/ hier auch einzeln erhältlich]&lt;br /&gt;
* [http://www.scilab.org/publications/delicado/scilab.pdf DSP-Tutorial in spanisch, teilweise aus dem englischen Tutorial entnommen]&lt;br /&gt;
* [http://www.neurotraces.com/scilab/scilab2/index.html Treatment of neurophysiological signals using Scilab, HTML-Texte mit Kapiteln zu Filtern, FFT usw.]&lt;br /&gt;
* [http://www.scilab.org/publications/TELECOM/ComNumSc.zip Digital-Kommunikation - französisches Tutorial, gezipptes Postscript]&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Ein DSP (&#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;S&#039;&#039;&#039;ignal &#039;&#039;&#039;P&#039;&#039;&#039;rocessor) ist eine spezielle CPU mit einem auf die Verarbeitung von Signalen optimierten Kern und Befehlssatz. Unterschieden wird hauptsächlich zwischen Gleitkomma- und Festkomma-DSPs.&lt;br /&gt;
&lt;br /&gt;
Charakteristisches Merkmal vieler DSPs ist eine VLIW-Architektur (&#039;&#039;&#039;V&#039;&#039;&#039;ery &#039;&#039;&#039;L&#039;&#039;&#039;ong &#039;&#039;&#039;I&#039;&#039;&#039;nstruction &#039;&#039;&#039;W&#039;&#039;&#039;ord). Dabei werden Anweisungen für mehrere parallele Ausführungseinheiten (Multiplizierer/Addierer/Akkumulatoren) und mehrere Lade-/Speicherbefehle in einem einzigen, langen Befehlswort kodiert, und in einem Takt ausgeführt. Dazu kommen häufig mehrere gleichzeitig adressierbare Speicherbänke, Unterstützung für Ringpuffer, Schleifen ohne Sprung-Overhead, Bit-Reverse-Adressierung (wichtig für FFT) und Arithmetik mit Sättigungs- statt Überlaufverhalten (wichtig für die Realisierung von IIR-Filtern).&lt;br /&gt;
&lt;br /&gt;
Seit ein paar Jahren beginnen die Grenzen zwischen Mikrocontrollern und DSPs etwas zu verschwimmen. Viele Mikrocontroller werden mit zusätzlichen DSP-Funktionen ausgestattet ([[PICCOLO]], [[dsPIC]], [[ARM]]), während DSPs zunehmend in Richtung der Aufgabenbereiche eines Mikrocontrollers oder Allround-Prozessors vordringen und immer öfter um Unterstützung für Betriebssysteme (MMU) oder I/O-Funktionen wie Ethernet oder USB erweitert werden ([[Blackfin]]).&lt;br /&gt;
&lt;br /&gt;
Eine noch größere DSP-Rechenleistung kann mit programmierbaren Logikbausteinen (&#039;&#039;&#039;[[FPGA]]&#039;&#039;&#039;s) erzielt werden, da die Anzahl gleichzeitig ausführbarer Rechenoperationen nur durch die Größe des FPGAs begrenzt wird. Nachteilig sind die gegenüber DSPs um ein vielfaches höheren Kosten, höherer Stromverbrauch und höherer Entwicklungsaufwand, weshalb FPGAs für Signalverarbeitung nur in sehr speziellen Anwendungen verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Aktuelle &#039;&#039;&#039;PC-Prozessoren&#039;&#039;&#039; sind sehr gut für Gleitkomma-Signalverarbeitung geeignet. Wenn keine besonderen Anforderungen an Echtzeitfähigkeit, Strom- oder Platzbedarf gestellt werden, hat ein normaler PC mit Abstand das beste Preis/Leistungsverhältnis. Der erste Schritt bei einem DSP-Projekt sollte somit eine Implementierung auf dem PC sein. Es macht wenig Sinn, ein Eval-Board für einen Signalprozessor zu kaufen und einfach loszulegen.&lt;br /&gt;
&lt;br /&gt;
=== Fest- oder Gleitkomma? ===&lt;br /&gt;
&lt;br /&gt;
Signalverarbeitung auf einem Gleitkomma- (Floating-Point-) Rechner ist grundsätzlich einfacher als auf einem Festkomma- (Fixed-Point-) Rechner. Da die Ungenauigkeiten bei der Rechnung mit Floating-Point-Zahlen in vielen Fällen vernachlässigbar sind, kann man einen Algorithmus i.d.R. 1:1 in Programmcode umsetzen. Hat man nur Festkomma-Rechenoperationen zur Verfügung wird es etwas ungemütlich. Man muss sich Gedanken um die Skalierung der Daten, die Reihenfolge von Rechenoperationen, Überläufe, Rundungsrauschen usw. machen. Da Gleitkomma-DSPs allerdings teurer sind und mehr Strom verbrauchen, werden für Massenprodukte fast ausschließlich Festkomma-DSPs bzw. ASICs mit Festkomma-Rechenwerken verwendet.&lt;br /&gt;
&lt;br /&gt;
=== TI C2000 ===&lt;br /&gt;
&lt;br /&gt;
Eine komplette 32-bit DSC Controller Familie vom low-cost ([http://www.ti.com/corp/docs/landing/f280xx-piccolo/index.htm PICCOLO]) bis high-end Controller mit FPU ([http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=mcu&amp;amp;sectionId=95&amp;amp;tabId=2108&amp;amp;familyId=1414&amp;amp;paramCriteria=no TMS320F28335]).&lt;br /&gt;
Die Peripherie umfasst Mehrkanal A/D Wandler mit 12-bit Aufloesung und bis zu 4 Megasamples Abtastrate. Die PWMs haben einen hochauflösenden Modus, der bis zu 150ps auflösen kann. Als Interface stehen CAN, I2C, schnelle generelle serielle Ports und Quadratureingänge für Drehgeber zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
=== TI C5000 ===&lt;br /&gt;
&lt;br /&gt;
DSP für Batterieapplikationen. Die gesamte Architektur wurde auf Stromverbrauch optimiert. Dazu werden spezielle Tools zur Verfügung gestellt, die zur Anwendung passende Optimierungslösungen generiert. [[TMS320VC5505 eZDSP USB Stick‎]] mit IDE als preisgünstiges Entwicklungssystem ( &amp;lt; 50€)&lt;br /&gt;
&lt;br /&gt;
=== TI C6000 ===&lt;br /&gt;
&lt;br /&gt;
DSP-Familie vom Marktführer Texas Instruments, enthält sowohl Fest- als auch Gleitkomma-DSPs.&lt;br /&gt;
&lt;br /&gt;
=== TI DM6400 (DaVinci) ===&lt;br /&gt;
&lt;br /&gt;
DSP für Videoanwendungen. Einige Derivate enthalten auch einen ARM9 als Co-Prozessor. Diese Familie wird unter dem Namen [http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=dsp&amp;amp;sectionId=2&amp;amp;tabId=1852&amp;amp;familyId=1300 DaVinci] vermarktet.&lt;br /&gt;
&lt;br /&gt;
=== TI OMAP ===&lt;br /&gt;
&lt;br /&gt;
Prozessor für mobile Geraete, enthält einen ARM-Kern und einen C6000-DSP. Ein interessantes und mit $149 sehr preisguenstiges Evalboard ist das [http://www.beagleboard.org Beagle Board]. Ein kostenloser Assembler für den DSP ist verfuegbar.&lt;br /&gt;
&lt;br /&gt;
=== SHARC/TigerSHARC ===&lt;br /&gt;
&lt;br /&gt;
32 Bit Gleitkomma-DSP von Analog Devices.&lt;br /&gt;
&lt;br /&gt;
=== Blackfin ===&lt;br /&gt;
&lt;br /&gt;
Der Blackfin ist ein 16/32 Bit Festkomma-DSP von Analog Devices. Im Gegensatz zu den 16-bittigen Vorgängern ADSP-21xx, die häufig als Co-Prozessoren zur Signalverarbeitung zusammen mit einem Mikrocontroller verwendet werden, geht der Blackfin schon weit in den Einsatzbereich eines Allround-Prozessors hinein. So gibt es z.&amp;amp;nbsp;B. einen Linux-Port für Blackfin, Eval-Boards mit Ethernet, CAN, USB und vielen MB SDRAM. Dank der verbesserten Stromsparfunktionen der BF52x-Reihe ist diese eher neue Architektur vermehrt in mobilen Geräten (Kameras, Mediaplayer, etc.) anzutreffen.&lt;br /&gt;
&lt;br /&gt;
Wichtig für die Entwicklung ist zu wissen:&lt;br /&gt;
&lt;br /&gt;
* Kein Fließkomma-Support in Hardware&lt;br /&gt;
* Keine MMU, keine Unterstützung für virtuelles Memory (kein Unix fork(), etc.)&lt;br /&gt;
&lt;br /&gt;
Unterstützte Entwicklungswerkzeuge:&lt;br /&gt;
&lt;br /&gt;
* Visual DSP++: Hauseigenes Entwicklungstool von Analog Devices, kommerziell&lt;br /&gt;
* GCC: Freie GNU-Umgebung mit Assembler, Compiler, Linker, Debugger&lt;br /&gt;
* Eclipse für uClinux-Entwicklung wie auch &#039;standalone&#039; ohne OS&lt;br /&gt;
&lt;br /&gt;
Aufgrund der ausgereiften GNU-Toolchain ist der Blackfin eine der kostengünstigsten Plattformen für die Entwicklung. Die Tools laufen sowohl unter Windows32 als auch Linux, bevorzugt wird jedoch Linux eingesetzt. Für die Kernel-Entwicklung ist Linux unabdingbar.&lt;br /&gt;
Dank offener JTAG-Spezifikation existieren einige Tools von Drittherstellern zum Hardware-Debugging (In Circuit Emulation) und zur Programmierung:&lt;br /&gt;
&lt;br /&gt;
* [http://www.section5.ch/icebear ICEbear] JTAG: schneller USB-&amp;gt;JTAG adapter&lt;br /&gt;
* [http://www.ronetix.at/ PEEDI] High end JTAG, Ethernet&lt;br /&gt;
* [http://www.bluetechnix.at/rainbow2006/site/blackfin_family/__dev_tools/__gnice_jtag/409/gnice_jtag.aspx gnICE von Bluetechnix]&lt;br /&gt;
* [http://www.analog.com/en/processors-dsp/blackfin/emulator-100/processors/product.html JTAG-Adapter von Analog Devices]&lt;br /&gt;
&lt;br /&gt;
Beide Tools arbeiten auch mit ARM-Prozessoren.&lt;br /&gt;
&lt;br /&gt;
Weitere Links:&lt;br /&gt;
&lt;br /&gt;
* [http://www.analog.com/blackfin Herstellerwebsite]&lt;br /&gt;
* [http://blackfin.uclinux.org/ uClinux Port und GNU toolchain]&lt;br /&gt;
&lt;br /&gt;
=== dsPIC ===&lt;br /&gt;
&lt;br /&gt;
Der [[dsPIC]] ist ein kleiner 16 Bit-Mikrocontroller mit DSP-Funktionen. Mit dem klassischen PIC hat er außer dem Namen nichts gemeinsam.&lt;br /&gt;
&lt;br /&gt;
=== TriCore ===&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;TriCore&#039;&#039;&#039; von Infineon ist ein 32-Bit-Mikrocontroller mit DSP-Funktionen, mit derzeitigem Schwerpunkt im Bereich der High Performance Embedded Real-Time Systems für Industrie-  und Automobilanwendungen (Beispiele: Motorsteuerungen, Servomotoren, Solarinverter, Multi-Axis-Conrol) &lt;br /&gt;
&lt;br /&gt;
* [http://www.infineon.com/cgi-bin/ifx/portal/ep/channelView.do?channelId=-78991&amp;amp;channelPage=%2Fep%2Fchannel%2FleafNote.jsp&amp;amp;pageTypeId=17099  Übersicht über die &#039;&#039;&#039;TriCore&#039;&#039;&#039; Produktfamilie]&lt;br /&gt;
&lt;br /&gt;
=== Bezugsquellen für Starterkits/Evalboards ===&lt;br /&gt;
&lt;br /&gt;
* http://www.spectrumdigital.com - große Auswahl an Starterkits mit TI-DSPs, ab $300&lt;br /&gt;
* http://www.bluetechnix.com - Blackfin-Module ab € 150&lt;br /&gt;
* http://www.zbrain.ch/ - Blackfin-Modul, Preis: ?&lt;br /&gt;
* http://www.danvillesignal.com/ - ADSP-218x-Boards ab $200, Sharc-Boards ab $400&lt;br /&gt;
* http://docs.blackfin.uclinux.org/doku.php?id=buy_stuff - Blackfin BF533 STAMP $170 (keine analogen Schnittstellen, aber über Pfostenstecker leicht zu erweitern)&lt;br /&gt;
* http://www.sundance.com - High-End-Module mit TI C6000&lt;br /&gt;
* http://www.spectrumsignal.com/ - TMS320 und SHARC&lt;br /&gt;
* http://www.pentek.com/dspcentral/ - TMS430 und PowerPC&lt;br /&gt;
* http://www.bittware.com/ - SHARC und TigerSHARC&lt;br /&gt;
* http://www.hunteng.co.uk/ - C6000&lt;br /&gt;
* http://www.kanecomputing.co.uk&lt;br /&gt;
* http://www.dsp-systeme.net - DSP-Module mit DSP von TI und ADI&lt;br /&gt;
* http://search.digikey.com/scripts/DkSearch/dksus.dll?lang=de&amp;amp;site=DE&amp;amp;WT.z_homepage_link=hp_go_button&amp;amp;KeyWords=TMDX5505EZDSP&amp;amp;x=22&amp;amp;y=22  eZDSP  USB Stick , &amp;lt;50€&lt;br /&gt;
* http://www.dsp-weuffen.de  - TI C6727 Board und vielen Beispielen&lt;br /&gt;
* http://www.ehitex.de/artikel.php?xPD=131_132&amp;amp;kat_name= - Infineon TriCore Starter Kits&lt;br /&gt;
&lt;br /&gt;
== Artikel aus der Kategorie DSP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ncl style=compact maxdepth=2 headings=bullet headstart=2&lt;br /&gt;
      showcats=1 showarts=1&amp;gt;DSP&amp;lt;/ncl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:DSP| ]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Digitale_Signalverarbeitung&amp;diff=60860</id>
		<title>Digitale Signalverarbeitung</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Digitale_Signalverarbeitung&amp;diff=60860"/>
		<updated>2011-09-30T23:58:40Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Verfahren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Anwendungsbeispiele ==&lt;br /&gt;
&lt;br /&gt;
* Modulation/Demodulation zur Datenübertragung (z.&amp;amp;nbsp;B. Telefonmodem, DSL, GSM) - &amp;quot;Software Defined Radio&amp;quot; (SDR)&lt;br /&gt;
* Multimediacodierung (MP3, DivX, JPEG)&lt;br /&gt;
* Bildverarbeitung (Mustererkennung)&lt;br /&gt;
* Echo- und Störgeräuschunterdrückung bei Telefonen, Sprechgarnituren (Headsets) und Hörgeräten&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
&lt;br /&gt;
Bücher:&lt;br /&gt;
* Oppenheim, Schaefer: &amp;quot;Discrete Time Signal Processing&amp;quot;, ISBN 0131988425&lt;br /&gt;
* Proakis: &amp;quot;Digital Signal Processing&amp;quot;, ISBN 0131873741&lt;br /&gt;
* Lyons: &amp;quot;Understanding Digital Signal Processing&amp;quot;, ISBN 0131089897&lt;br /&gt;
* Smith: &amp;quot;The Scientist and Engineer&#039;s Guide to Digital Signal Processing&amp;quot;, ISBN  075067444X (unter http://dspguide.com/ als PDF verfügbar)&lt;br /&gt;
* Sanjit K. Mitra: &amp;quot;Handbook for Digital Signal Processing&amp;quot; (1993,1312 Seiten), ISBN 0471619957&lt;br /&gt;
&lt;br /&gt;
Foren:&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/list-10-1.html DSP-Forum auf mikrocontroller.net (deutsch)]&lt;br /&gt;
* [http://groups.google.de/group/comp.dsp Newsgroup comp.dsp (Englisch)]&lt;br /&gt;
* [http://www.dsprelated.com/groups.php Discussion Groups (Englisch)]&lt;br /&gt;
&lt;br /&gt;
Webseiten:&lt;br /&gt;
* http://www.dspguru.com/ - FAQs, Infos, Beispielcode, ...&lt;br /&gt;
* http://docs.google.com/View?docid=dg2hppb_4gtgk89 - evtl. interessant als Rohmaterial für diesen Artikel&lt;br /&gt;
* http://www.dsprelated.com - Blogs, Jobs, Comp.DSP, ...&lt;br /&gt;
* http://www.unidsp56.de/ Eine Entwicklungsplattform für den Amateur&lt;br /&gt;
&lt;br /&gt;
== Verfahren ==&lt;br /&gt;
&lt;br /&gt;
=== FIR- und IIR-Filter ===&lt;br /&gt;
&lt;br /&gt;
Die häufigste Aufgabe in der DSV ist das Filtern, das heißt bestimmte Frequenzanteile zu unterdrücken, in der Phase zu verschieben oder zu verstärken. Man kann grundsätzlich zwischen zwei Filterarten unterscheiden:&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;FIR-Filter&#039;&#039;&#039;n (&#039;&#039;&#039;F&#039;&#039;&#039;inite &#039;&#039;&#039;I&#039;&#039;&#039;mpulse &#039;&#039;&#039;R&#039;&#039;&#039;esponse) wird jeder Ausgangswert aus unterschiedlich gewichteten und addierten früheren Eingangswerten zusammengesetzt. Dabei bezeichnet man die maximale Anzahl an vergangenen Werten die bei der Berechnung berücksichtigt werden als &#039;&#039;&#039;Ordnung&#039;&#039;&#039;. Je höher die Ordnung, desto besser die Eigenschaften des Filters (Ripple, Steilheit, Dämpfung), desto höher aber auch der Rechenaufwand.&lt;br /&gt;
&lt;br /&gt;
Merkmale von FIR-Filtern:&lt;br /&gt;
* immer stabil&lt;br /&gt;
* linearer Phasengang -&amp;gt; keine Phasenverzerrungen&lt;br /&gt;
* Ordnungen oft im zwei- bis dreistelligen Bereich&lt;br /&gt;
* problemlos realisierbar!&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zu FIR-Filtern werden bei &#039;&#039;&#039;IIR-Filter&#039;&#039;&#039;n (&#039;&#039;&#039;I&#039;&#039;&#039;nfinite &#039;&#039;&#039;I&#039;&#039;&#039;mpulse &#039;&#039;&#039;R&#039;&#039;&#039;esponse) auch frühere &#039;&#039;&#039;Ausgangs&#039;&#039;&#039;werte in die Berechnung des aktuellen Ausgangswertes mit einbezogen. Wie man sich leicht vorstellen kann, kann dadurch die Antwort auf einen Eingangsimpuls theoretisch unendlich lang werden, da jeder Ausgangswert auf den Eingang rückgekoppelt wird.&lt;br /&gt;
&lt;br /&gt;
Merkmale von IIR-Filtern:&lt;br /&gt;
* durch Rundungsfehler kann das Filter instabil werden -&amp;gt; &amp;quot;Aufschaukeln&amp;quot; durch Rückkopplung -&amp;gt; schwierigere Realisierung&lt;br /&gt;
* kein linearer Phasengang -&amp;gt; verschiedene Frequenzanteile werden durch den Filter unterschiedlich lange verzögert -&amp;gt; &amp;quot;Verzerrung&amp;quot;&lt;br /&gt;
* einziger Vorteil gegenüber FIR: Um einen gewünschten Frequenzgang zu erzielen ist eine sehr viel niedrigere Ordnung ausreichend -&amp;gt; weniger Rechenaufwand&lt;br /&gt;
* Ordnung üblicherweise &amp;lt; 10&lt;br /&gt;
&lt;br /&gt;
Viele nützliche Informationen zur Realisierung gibt es im [http://www.dspguru.com/info/faqs/ FIR- und IIR-FAQ auf dspguru.com] (der dort erwähnte Sourcecode FirAlgs.c kann [[Media:FirAlgs.c|hier]] direkt heruntergeladen werden).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Berechnungssoftware&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.filter-solutions.com/digital.html Beschreibung der Digitalfiltertypen], [http://www.nuhertz.com/download.html hier kostenlose Testversion Filter Free]&lt;br /&gt;
&lt;br /&gt;
=== FFT ===&lt;br /&gt;
&lt;br /&gt;
Die FFT (Fast Fourier Transform) ist ein schneller Algorithmus zur Berechnung der DFT (Discrete Fourier Transform). Damit bezeichnet man die Transformation eines Zeitsignals (= eine Abfolge von Samples) in den Frequenzbereich (= Frequenzbestandteile des Signals). Die Transformation kann auch ohne Verlust umgekehrt durchgeführt werden, also vom Frequenz- in den Zeitbereich (Inverse Discrete Fourier Transform, IDFT). Eine DFT wird praktisch immer mit dem FFT-Algorithmus realisiert, weshalb die Bezeichnungen FFT/DFT oft gleichwertig verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Die offensichtlichste Anwendung der FFT ist die Darstellung des Frequenzspektrums eines Signals. Aber das ist nur ein kleiner Teil der Anwendungsmöglichkeiten. Viele Verarbeitungen lassen sich im Frequenzbereich einfacher durchführen als im Zeitbereich, z.&amp;amp;nbsp;B. Korrelationen oder sehr lange FIR-Filter. Das zu verarbeitende Signal wird dazu in den Frequenzbereich transformiert, dort manipuliert, und wieder in den Zeitbereich zurücktransformiert. Das klingt vielleicht umständlich, kann aber in der Praxis sehr viel schneller sein als eine Realisierung im Zeitbereich.&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/25095 Diskussion: FFT auf dem AVR]&lt;br /&gt;
* [http://sourceforge.net/projects/kissfft/ Kiss FFT] - einfache FFT-Bibliothek, in C, Floating- und Fixed Point, BSD-Lizenz, geeignet für Mikrocontroller&lt;br /&gt;
* [http://www.fftw.org/ FFTW] - &#039;&#039;&#039;die&#039;&#039;&#039; Floating Point FFT-Bibliothek für PCs, GPL-Lizenz&lt;br /&gt;
*[http://www.sprut.de/electronic/pic/16bit/dsp/fft/fft.htm FFT - verständlich auch für Nichtakademiker (Deutsch)]&lt;br /&gt;
* [http://www.science.smith.edu/departments/Physics/fstaff/gfelder/ffteasy/ ffteasy - Einfache Routinen zur FFT]&lt;br /&gt;
&lt;br /&gt;
=== Goertzel-Algorithmus ===&lt;br /&gt;
&lt;br /&gt;
Liegt das Interesse nach der FFT nur auf bestimmten Frequenz-Linien, gibt es eine weniger rechenaufwendige Alternative in diesem Algorithmus.&lt;br /&gt;
&lt;br /&gt;
Das typische Anwendungsgebiet sind DTMF-Dekoder in Software.&lt;br /&gt;
Hierfür sind sogar die üblichen 8-bit-AVR-Controller ausreichend schnell.&lt;br /&gt;
&lt;br /&gt;
=== Signalerzeugung ===&lt;br /&gt;
&lt;br /&gt;
Rechteck-, Sägezahn- und Dreieckssignale lassen sich mit einfachen Zählern realisieren.&lt;br /&gt;
&lt;br /&gt;
Möchte man Sinus- oder beliebige andere Signalformen erzeugen, bietet es sich an vorausberechnete Funktionswerte im Speicher abzulegen und der Reihe nach auszugeben. Eine variable Frequenzeinstellung kann man durch die Methode der Direkten Digitalen Synthese (&#039;&#039;&#039;DDS&#039;&#039;&#039;) realisieren.&lt;br /&gt;
&lt;br /&gt;
* [[Digitaler Funktionsgenerator]] - ausführliche Erklärung des Verfahrens im PDF, Beispielcode für AVR&lt;br /&gt;
* http://www.myplace.nu/avr/minidds/ - noch ein AVR-Projekt&lt;br /&gt;
* http://www.hit.bme.hu/~papay/sci/DDS/start.htm - noch eine Erklärung&lt;br /&gt;
&lt;br /&gt;
Eine weitere Methode zur Realisierung von (mehr oder weniger beliebigen) Funktionen ist die &#039;&#039;&#039;Polynomapproximation&#039;&#039;&#039;. Dabei nähert man die zu erzeugende Funktion durch ein Polynom an und verwendet das Horner-Schema um die einzelnen Funktionswerte zu berechnen. Für ein Polynom der Ordnung N benötigt man damit pro Wert N+1 Multiplikationen (N ist üblicherweise &amp;lt;= 10).&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
Zur Entwicklung von Signalverarbeitungsverfahren gibt es eine ganze Reihe von Programmen. Neben kleinen Tools für Filterdesign und spezialisierten Bibliotheken zum Einbinden in eigene Programme gibt es mehrere Mathematikprogramme, mit denen sich Signale verarbeiten und darstellen lassen. Die drei wichtigsten sind Matlab, Octave und Scilab.&lt;br /&gt;
&lt;br /&gt;
=== MATLAB ===&lt;br /&gt;
&lt;br /&gt;
MATLAB ist das Standardprogramm für numerische Mathematik. In der digitalen Signalverarbeitung wird es häufig verwendet, um einen Algorithmus vor der Umsetzung in C-Code oder auf einen DSP zu entwickeln und zu testen. Zum schon recht hohen Preis der Grundsoftware muss man noch einige hundert Euro für diverse Toolboxes einplanen (Signal Processing, Filter Design, Image Processing). Die [http://www.mikrocontroller.net/link/isbn/0979223903 Studentenversion] kostet ca. 80 Euro (die Signal Processing Toolbox und ein paar andere sind bereits enthalten).&lt;br /&gt;
&lt;br /&gt;
MATLAB ist für Windows, Linux, Mac OS X, Solaris und HP-UX erhältlich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* http://users.ece.gatech.edu/%7Ebonnie/book/TUTORIAL/tutorial.html - Englischsprachiges MATLAB-Tutorial&lt;br /&gt;
* http://www.mathworks.com/access/helpdesk/help/techdoc/matlab.shtml - MATLAB-Referenz&lt;br /&gt;
* http://www.eng.auburn.edu/~sjreeves/Classes/DSP/DSP.html - MATLAB for DSP (allgemeine Tipps und Hinweise)&lt;br /&gt;
&lt;br /&gt;
=== Octave ===&lt;br /&gt;
&lt;br /&gt;
Das Open-Source-Programm Octave zeichnet sich durch einen hohen Grad an Matlab-Kompatibilität aus; das geht so weit, dass man problemlos die Matlab-Online-Hilfe und Matlab-Einführungen zum Lernen verwenden kann. In dem Zusatzpaket Octave-Forge sind auch viele Funktionen der Matlab-Toolboxes enthalten (z.&amp;amp;nbsp;B. Filterdesign, Signalverarbeitung). Octave ist ein reines Kommandozeilenprogramm, so dass man auf alle Annehmlichkeiten des Matlab-GUI verzichten muss. Zum Plotten wird gnuplot verwendet.&lt;br /&gt;
&lt;br /&gt;
Octave lässt sich auf praktisch jedem Unix kompilieren. Für Windows gibt es ein fertig kompiliertes Paket.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* http://octave.sourceforge.net/ - Übersicht über alle Funktionen von Octave/Octave-Forge&lt;br /&gt;
&lt;br /&gt;
=== Scilab / Scicos ===&lt;br /&gt;
&lt;br /&gt;
Auch das Open-Source-Programmpaket Scilab / Scicos, ähnlich leistungsfähig wie Matlab und seine Zusatzmodule, ist kostenlos und im Quelltext erhältlich. Während die Grundsyntax (Kontrollstrukturen, Ausdrücke) weitgehend Matlab-kompatibel ist, gibt es bei den Funktionen z.T. deutliche Abweichungen. Dafür bietet Scilab / Scicos verglichen mit Octave umfangreichere Möglichkeiten zur grafischen Darstellung, die über das 2D- und 3D-Plotten von Funktionen weit hinausgehen, z.&amp;amp;nbsp;B. lassen sich Linien, Kreise usw. zeichnen.&lt;br /&gt;
&lt;br /&gt;
Scilab / Scicos läuft unter Windows, Linux/Unix und Mac OS X. Für die wichtigsten Linux-Distributionen sind fertige, komplette Binärpakete (RPM, ...) zur einfachen Installation frei verfügbar. Für Windows gibt es ebenfalls ein einfach zu installierendes Komplettpaket.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.scilab.org/ Scilab Homepage (Universelles Wissenschaftlich-Technisches Mathematik-Paket)]&lt;br /&gt;
* [http://www.scicos.org/ Scicos Homepage (Modellations- und Simulations-Paket für Scilab, ist im Scilab-Download enthalten)]&lt;br /&gt;
* [http://www-rocq.inria.fr/scicos/scicosmodnum.html ModNum Digital communication toolbox zu Scicos]&lt;br /&gt;
* [http://www.scilab.org/publications/index_publications.php?page=freebooks Übersicht zur Literatur: Webtexte, Bücher und Zeitschriftenartikel]&lt;br /&gt;
&#039;&#039;&#039;Bücher&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.scicos.org/book.html Modeling and Simulation in Scilab/Scicos, (für Version 3.0, aktuell ist Version 4.1.2)]&lt;br /&gt;
&#039;&#039;&#039;Tutorials&#039;&#039;&#039;:&lt;br /&gt;
* [http://wiki.scilab.org/Tutorials?action=AttachFile&amp;amp;do=get&amp;amp;target=signal.pdf Signal Processing with Scilab (1998)], [http://wuarchive.wustl.edu/pub/aminet/misc/math/scilab-doc.lha Beispielfiles dazu lha-gepackt (1996)] [http://aminet.net/package/misc/math/scilab-doc oder hier], [http://viewvc.scilab.org/bin/cgi/viewvc.cgi/trunk/scilab_doc/signal/Nfigs_source/ hier auch einzeln erhältlich]&lt;br /&gt;
* [http://www.scilab.org/publications/delicado/scilab.pdf DSP-Tutorial in spanisch, teilweise aus dem englischen Tutorial entnommen]&lt;br /&gt;
* [http://www.neurotraces.com/scilab/scilab2/index.html Treatment of neurophysiological signals using Scilab, HTML-Texte mit Kapiteln zu Filtern, FFT usw.]&lt;br /&gt;
* [http://www.scilab.org/publications/TELECOM/ComNumSc.zip Digital-Kommunikation - französisches Tutorial, gezipptes Postscript]&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Ein DSP (&#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;S&#039;&#039;&#039;ignal &#039;&#039;&#039;P&#039;&#039;&#039;rocessor) ist eine spezielle CPU mit einem auf die Verarbeitung von Signalen optimierten Kern und Befehlssatz. Unterschieden wird hauptsächlich zwischen Gleitkomma- und Festkomma-DSPs.&lt;br /&gt;
&lt;br /&gt;
Charakteristisches Merkmal vieler DSPs ist eine VLIW-Architektur (&#039;&#039;&#039;V&#039;&#039;&#039;ery &#039;&#039;&#039;L&#039;&#039;&#039;ong &#039;&#039;&#039;I&#039;&#039;&#039;nstruction &#039;&#039;&#039;W&#039;&#039;&#039;ord). Dabei werden Anweisungen für mehrere parallele Ausführungseinheiten (Multiplizierer/Addierer/Akkumulatoren) und mehrere Lade-/Speicherbefehle in einem einzigen, langen Befehlswort kodiert, und in einem Takt ausgeführt. Dazu kommen häufig mehrere gleichzeitig adressierbare Speicherbänke, Unterstützung für Ringpuffer, Schleifen ohne Sprung-Overhead, Bit-Reverse-Adressierung (wichtig für FFT) und Arithmetik mit Sättigungs- statt Überlaufverhalten (wichtig für die Realisierung von IIR-Filtern).&lt;br /&gt;
&lt;br /&gt;
Seit ein paar Jahren beginnen die Grenzen zwischen Mikrocontrollern und DSPs etwas zu verschwimmen. Viele Mikrocontroller werden mit zusätzlichen DSP-Funktionen ausgestattet ([[PICCOLO]], [[dsPIC]], [[ARM]]), während DSPs zunehmend in Richtung der Aufgabenbereiche eines Mikrocontrollers oder Allround-Prozessors vordringen und immer öfter um Unterstützung für Betriebssysteme (MMU) oder I/O-Funktionen wie Ethernet oder USB erweitert werden ([[Blackfin]]).&lt;br /&gt;
&lt;br /&gt;
Eine noch grössere DSP-Rechenleistung kann mit programmierbaren Logikbausteinen (&#039;&#039;&#039;[[FPGA]]&#039;&#039;&#039;s) erzielt werden, da die Anzahl gleichzeitig ausführbarer Rechenoperationen nur durch die Größe des FPGAs begrenzt wird. Nachteilig sind die gegenüber DSPs um ein vielfaches höheren Kosten, höherer Stromverbrauch und höherer Entwicklungsaufwand, weshalb FPGAs für Signalverarbeitung nur in sehr speziellen Anwendungen verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Aktuelle &#039;&#039;&#039;PC-Prozessoren&#039;&#039;&#039; sind sehr gut für Floating-Point-Signalverarbeitung geeignet. Wenn keine besonderen Anforderungen an Echtzeitfähigkeit, Strom- oder Platzbedarf gestellt werden, hat ein normaler PC mit Abstand das beste Preis/Leistungsverhältnis. Der erste Schritt bei einem DSP-Projekt sollte somit eine Implementierung auf dem PC sein. Es macht wenig Sinn ein Eval-Board für einen Signalprozessor zu kaufen und einfach loszulegen.&lt;br /&gt;
&lt;br /&gt;
=== Fest- oder Gleitkomma? ===&lt;br /&gt;
&lt;br /&gt;
Signalverarbeitung auf einem Gleitkomma- (Floating-Point-) Rechner ist grundsätzlich einfacher als auf einem Festkomma- (Fixed-Point-) Rechner. Da die Ungenauigkeiten bei der Rechnung mit Floating-Point-Zahlen in vielen Fällen vernachlässigbar sind, kann man einen Algorithmus i.d.R. 1:1 in Programmcode umsetzen. Hat man nur Festkomma-Rechenoperationen zur Verfügung wird es etwas ungemütlich. Man muss sich Gedanken um die Skalierung der Daten, die Reihenfolge von Rechenoperationen, Überläufe, Rundungsrauschen usw. machen. Da Gleitkomma-DSPs allerdings teurer sind und mehr Strom verbrauchen, werden für Massenprodukte fast ausschließlich Festkomma-DSPs bzw. ASICs mit Festkomma-Rechenwerken verwendet.&lt;br /&gt;
&lt;br /&gt;
=== TI C2000 ===&lt;br /&gt;
&lt;br /&gt;
Eine komplette 32-bit DSC Controller Familie vom low-cost ([http://www.ti.com/corp/docs/landing/f280xx-piccolo/index.htm PICCOLO]) bis high-end Controller mit FPU ([http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=mcu&amp;amp;sectionId=95&amp;amp;tabId=2108&amp;amp;familyId=1414&amp;amp;paramCriteria=no TMS320F28335]).&lt;br /&gt;
Die Peripherie umfasst Mehrkanal A/D Wandler mit 12-bit Aufloesung und bis zu 4 Megasamples Abtastrate. Die PWMs haben einen hochauflösenden Modus, der bis zu 150ps auflösen kann. Als Interface stehen CAN, I2C, schnelle generelle serielle Ports und Quadratureingänge für Drehgeber zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
=== TI C5000 ===&lt;br /&gt;
&lt;br /&gt;
DSP für Batterieapplikationen. Die gesamte Architektur wurde auf Stromverbrauch optimiert. Dazu werden spezielle Tools zur Verfügung gestellt, die zur Anwendung passende Optimierungslösungen generiert. [[TMS320VC5505 eZDSP USB Stick‎]] mit IDE als preisgünstiges Entwicklungssystem ( &amp;lt; 50€)&lt;br /&gt;
&lt;br /&gt;
=== TI C6000 ===&lt;br /&gt;
&lt;br /&gt;
DSP-Familie vom Marktführer Texas Instruments, enthält sowohl Fest- als auch Gleitkomma-DSPs.&lt;br /&gt;
&lt;br /&gt;
=== TI DM6400 (DaVinci) ===&lt;br /&gt;
&lt;br /&gt;
DSP für Videoanwendungen. Einige Derivate enthalten auch einen ARM9 als Co-Prozessor. Diese Familie wird unter dem Namen [http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=dsp&amp;amp;sectionId=2&amp;amp;tabId=1852&amp;amp;familyId=1300 DaVinci] vermarktet.&lt;br /&gt;
&lt;br /&gt;
=== TI OMAP ===&lt;br /&gt;
&lt;br /&gt;
Prozessor für mobile Geraete, enthält einen ARM-Kern und einen C6000-DSP. Ein interessantes und mit $149 sehr preisguenstiges Evalboard ist das [http://www.beagleboard.org Beagle Board]. Ein kostenloser Assembler für den DSP ist verfuegbar.&lt;br /&gt;
&lt;br /&gt;
=== SHARC/TigerSHARC ===&lt;br /&gt;
&lt;br /&gt;
32 Bit Gleitkomma-DSP von Analog Devices.&lt;br /&gt;
&lt;br /&gt;
=== Blackfin ===&lt;br /&gt;
&lt;br /&gt;
Der Blackfin ist ein 16/32 Bit Festkomma-DSP von Analog Devices. Im Gegensatz zu den 16-bittigen Vorgängern ADSP-21xx, die häufig als Co-Prozessoren zur Signalverarbeitung zusammen mit einem Mikrocontroller verwendet werden, geht der Blackfin schon weit in den Einsatzbereich eines Allround-Prozessors hinein. So gibt es z.&amp;amp;nbsp;B. einen Linux-Port für Blackfin, Eval-Boards mit Ethernet, CAN, USB und vielen MB SDRAM. Dank der verbesserten Stromsparfunktionen der BF52x-Reihe ist diese eher neue Architektur vermehrt in mobilen Geräten (Kameras, Mediaplayer, etc.) anzutreffen.&lt;br /&gt;
&lt;br /&gt;
Wichtig für die Entwicklung ist zu wissen:&lt;br /&gt;
&lt;br /&gt;
* Kein Fließkomma-Support in Hardware&lt;br /&gt;
* Keine MMU, keine Unterstützung für virtuelles Memory (kein Unix fork(), etc.)&lt;br /&gt;
&lt;br /&gt;
Unterstützte Entwicklungswerkzeuge:&lt;br /&gt;
&lt;br /&gt;
* Visual DSP++: Hauseigenes Entwicklungstool von Analog Devices, kommerziell&lt;br /&gt;
* GCC: Freie GNU-Umgebung mit Assembler, Compiler, Linker, Debugger&lt;br /&gt;
* Eclipse für uClinux-Entwicklung wie auch &#039;standalone&#039; ohne OS&lt;br /&gt;
&lt;br /&gt;
Aufgrund der ausgereiften GNU-Toolchain ist der Blackfin eine der kostengünstigsten Plattformen für die Entwicklung. Die Tools laufen sowohl unter Windows32 als auch Linux, bevorzugt wird jedoch Linux eingesetzt. Für die Kernel-Entwicklung ist Linux unabdingbar.&lt;br /&gt;
Dank offener JTAG-Spezifikation existieren einige Tools von Drittherstellern zum Hardware-Debugging (In Circuit Emulation) und zur Programmierung:&lt;br /&gt;
&lt;br /&gt;
* [http://www.section5.ch/icebear ICEbear] JTAG: schneller USB-&amp;gt;JTAG adapter&lt;br /&gt;
* [http://www.ronetix.at/ PEEDI] High end JTAG, Ethernet&lt;br /&gt;
* [http://www.bluetechnix.at/rainbow2006/site/blackfin_family/__dev_tools/__gnice_jtag/409/gnice_jtag.aspx gnICE von Bluetechnix]&lt;br /&gt;
* [http://www.analog.com/en/processors-dsp/blackfin/emulator-100/processors/product.html JTAG-Adapter von Analog Devices]&lt;br /&gt;
&lt;br /&gt;
Beide Tools arbeiten auch mit ARM-Prozessoren.&lt;br /&gt;
&lt;br /&gt;
Weitere Links:&lt;br /&gt;
&lt;br /&gt;
* [http://www.analog.com/blackfin Herstellerwebsite]&lt;br /&gt;
* [http://blackfin.uclinux.org/ uClinux Port und GNU toolchain]&lt;br /&gt;
&lt;br /&gt;
=== dsPIC ===&lt;br /&gt;
&lt;br /&gt;
Der [[dsPIC]] ist ein kleiner 16 Bit-Mikrocontroller mit DSP-Funktionen. Mit dem klassischen PIC hat er außer dem Namen nichts gemeinsam.&lt;br /&gt;
&lt;br /&gt;
=== TriCore ===&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;TriCore&#039;&#039;&#039; von Infineon ist ein 32-Bit-Mikrocontroller mit DSP-Funktionen, mit derzeitigem Schwerpunkt im Bereich der High Performance Embedded Real-Time Systems für Industrie-  und Automobilanwendungen (Beispiele: Motorsteuerungen, Servomotoren, Solarinverter, Multi-Axis-Conrol) &lt;br /&gt;
&lt;br /&gt;
* [http://www.infineon.com/cgi-bin/ifx/portal/ep/channelView.do?channelId=-78991&amp;amp;channelPage=%2Fep%2Fchannel%2FleafNote.jsp&amp;amp;pageTypeId=17099  Übersicht über die &#039;&#039;&#039;TriCore&#039;&#039;&#039; Produktfamilie]&lt;br /&gt;
&lt;br /&gt;
=== Bezugsquellen für Starterkits/Evalboards ===&lt;br /&gt;
&lt;br /&gt;
* http://www.spectrumdigital.com - große Auswahl an Starterkits mit TI-DSPs, ab $300&lt;br /&gt;
* http://www.bluetechnix.com - Blackfin-Module ab € 150&lt;br /&gt;
* http://www.zbrain.ch/ - Blackfin-Modul, Preis: ?&lt;br /&gt;
* http://www.danvillesignal.com/ - ADSP-218x-Boards ab $200, Sharc-Boards ab $400&lt;br /&gt;
* http://docs.blackfin.uclinux.org/doku.php?id=buy_stuff - Blackfin BF533 STAMP $170 (keine analogen Schnittstellen, aber über Pfostenstecker leicht zu erweitern)&lt;br /&gt;
* http://www.sundance.com - High-End-Module mit TI C6000&lt;br /&gt;
* http://www.spectrumsignal.com/ - TMS320 und SHARC&lt;br /&gt;
* http://www.pentek.com/dspcentral/ - TMS430 und PowerPC&lt;br /&gt;
* http://www.bittware.com/ - SHARC und TigerSHARC&lt;br /&gt;
* http://www.hunteng.co.uk/ - C6000&lt;br /&gt;
* http://www.kanecomputing.co.uk&lt;br /&gt;
* http://www.dsp-systeme.net - DSP-Module mit DSP von TI und ADI&lt;br /&gt;
* http://search.digikey.com/scripts/DkSearch/dksus.dll?lang=de&amp;amp;site=DE&amp;amp;WT.z_homepage_link=hp_go_button&amp;amp;KeyWords=TMDX5505EZDSP&amp;amp;x=22&amp;amp;y=22  eZDSP  USB Stick , &amp;lt;50€&lt;br /&gt;
* http://www.dsp-weuffen.de  - TI C6727 Board und vielen Beispielen&lt;br /&gt;
* http://www.ehitex.de/artikel.php?xPD=131_132&amp;amp;kat_name= - Infineon TriCore Starter Kits&lt;br /&gt;
&lt;br /&gt;
== Artikel aus der Kategorie DSP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ncl style=compact maxdepth=2 headings=bullet headstart=2&lt;br /&gt;
      showcats=1 showarts=1&amp;gt;DSP&amp;lt;/ncl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:DSP| ]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Digitale_Signalverarbeitung&amp;diff=60859</id>
		<title>Digitale Signalverarbeitung</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Digitale_Signalverarbeitung&amp;diff=60859"/>
		<updated>2011-09-30T23:54:14Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Anwendungsbeispiele */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Anwendungsbeispiele ==&lt;br /&gt;
&lt;br /&gt;
* Modulation/Demodulation zur Datenübertragung (z.&amp;amp;nbsp;B. Telefonmodem, DSL, GSM) - &amp;quot;Software Defined Radio&amp;quot; (SDR)&lt;br /&gt;
* Multimediacodierung (MP3, DivX, JPEG)&lt;br /&gt;
* Bildverarbeitung (Mustererkennung)&lt;br /&gt;
* Echo- und Störgeräuschunterdrückung bei Telefonen, Sprechgarnituren (Headsets) und Hörgeräten&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
&lt;br /&gt;
Bücher:&lt;br /&gt;
* Oppenheim, Schaefer: &amp;quot;Discrete Time Signal Processing&amp;quot;, ISBN 0131988425&lt;br /&gt;
* Proakis: &amp;quot;Digital Signal Processing&amp;quot;, ISBN 0131873741&lt;br /&gt;
* Lyons: &amp;quot;Understanding Digital Signal Processing&amp;quot;, ISBN 0131089897&lt;br /&gt;
* Smith: &amp;quot;The Scientist and Engineer&#039;s Guide to Digital Signal Processing&amp;quot;, ISBN  075067444X (unter http://dspguide.com/ als PDF verfügbar)&lt;br /&gt;
* Sanjit K. Mitra: &amp;quot;Handbook for Digital Signal Processing&amp;quot; (1993,1312 Seiten), ISBN 0471619957&lt;br /&gt;
&lt;br /&gt;
Foren:&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/list-10-1.html DSP-Forum auf mikrocontroller.net (deutsch)]&lt;br /&gt;
* [http://groups.google.de/group/comp.dsp Newsgroup comp.dsp (Englisch)]&lt;br /&gt;
* [http://www.dsprelated.com/groups.php Discussion Groups (Englisch)]&lt;br /&gt;
&lt;br /&gt;
Webseiten:&lt;br /&gt;
* http://www.dspguru.com/ - FAQs, Infos, Beispielcode, ...&lt;br /&gt;
* http://docs.google.com/View?docid=dg2hppb_4gtgk89 - evtl. interessant als Rohmaterial für diesen Artikel&lt;br /&gt;
* http://www.dsprelated.com - Blogs, Jobs, Comp.DSP, ...&lt;br /&gt;
* http://www.unidsp56.de/ Eine Entwicklungsplattform für den Amateur&lt;br /&gt;
&lt;br /&gt;
== Verfahren ==&lt;br /&gt;
&lt;br /&gt;
=== FIR- und IIR-Filter ===&lt;br /&gt;
&lt;br /&gt;
Die häufigste Aufgabe in der DSV ist das Filtern, das heißt bestimmte Frequenzanteile zu unterdrücken, in der Phase zu verschieben oder zu verstärken. Man kann grundsätzlich zwischen zwei Filterarten unterscheiden:&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;FIR-Filter&#039;&#039;&#039;n (&#039;&#039;&#039;F&#039;&#039;&#039;inite &#039;&#039;&#039;I&#039;&#039;&#039;mpulse &#039;&#039;&#039;R&#039;&#039;&#039;esponse) wird jeder Ausgangswert aus unterschiedlich gewichteten und addierten früheren Eingangswerten zusammengesetzt. Dabei bezeichnet man die maximale Anzahl an vergangenen Werten die bei der Berechnung berücksichtigt werden als &#039;&#039;&#039;Ordnung&#039;&#039;&#039;. Je höher die Ordnung, desto besser die Eigenschaften des Filters (Ripple, Steilheit, Dämpfung), desto höher aber auch der Rechenaufwand.&lt;br /&gt;
&lt;br /&gt;
Merkmale von FIR-Filtern:&lt;br /&gt;
* immer stabil&lt;br /&gt;
* linearer Phasengang -&amp;gt; keine Phasenverzerrungen&lt;br /&gt;
* Ordnungen oft im zwei- bis dreistelligen Bereich&lt;br /&gt;
* problemlos realisierbar!&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zu FIR-Filtern werden bei &#039;&#039;&#039;IIR-Filter&#039;&#039;&#039;n (&#039;&#039;&#039;I&#039;&#039;&#039;nfinite &#039;&#039;&#039;I&#039;&#039;&#039;mpulse &#039;&#039;&#039;R&#039;&#039;&#039;esponse) auch frühere &#039;&#039;&#039;Ausgangs&#039;&#039;&#039;werte in die Berechnung des aktuellen Ausgangswertes mit einbezogen. Wie man sich leicht vorstellen kann, kann dadurch die Antwort auf einen Eingangsimpuls theoretisch unendlich lang werden, da jeder Ausgangswert auf den Eingang rückgekoppelt wird.&lt;br /&gt;
&lt;br /&gt;
Merkmale von IIR-Filtern:&lt;br /&gt;
* durch Rundungsfehler kann das Filter instabil werden -&amp;gt; &amp;quot;Aufschaukeln&amp;quot; durch Rückkopplung -&amp;gt; schwierigere Realisierung&lt;br /&gt;
* kein linearer Phasengang -&amp;gt; verschiedene Frequenzanteile werden durch den Filter unterschiedlich lange verzögert -&amp;gt; &amp;quot;Verzerrung&amp;quot;&lt;br /&gt;
* einziger Vorteil gegenüber FIR: Um einen gewünschten Frequenzgang zu erzielen ist eine sehr viel niedrigere Ordnung ausreichend -&amp;gt; weniger Rechenaufwand&lt;br /&gt;
* Ordnung üblicherweise &amp;lt; 10&lt;br /&gt;
&lt;br /&gt;
Viele nützliche Informationen zur Realisierung gibt es im [http://www.dspguru.com/info/faqs/ FIR- und IIR-FAQ auf dspguru.com] (der dort erwähnte Sourcecode FirAlgs.c kann [[Media:FirAlgs.c|hier]] direkt heruntergeladen werden).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Berechnungssoftware&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.filter-solutions.com/digital.html Beschreibung der Digitalfiltertypen], [http://www.nuhertz.com/download.html hier kostenlose Testversion Filter Free]&lt;br /&gt;
&lt;br /&gt;
=== FFT ===&lt;br /&gt;
&lt;br /&gt;
Die FFT (Fast Fourier Transform) ist ein schneller Algorithmus zur Berechnung der DFT (Discrete Fourier Transform). Damit bezeichnet man die Transformation eines Zeitsignals (= eine Abfolge von Samples) in den Frequenzbereich (= Frequenzbestandteile des Signals). Die Transformation kann auch ohne Verlust umgekehrt durchgeführt werden, also vom Frequenz- in den Zeitbereich (Inverse Discrete Fourier Transform, IDFT). Eine DFT wird praktisch immer mit dem FFT-Algorithmus realisiert, weshalb die Bezeichnungen FFT/DFT oft gleichwertig verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Die offensichtlichste Anwendung der FFT ist die Darstellung des Frequenzspektrums eines Signals. Aber das ist nur ein kleiner Teil der Anwendungsmöglichkeiten. Viele Verarbeitungen lassen sich im Frequenzbereich einfacher durchführen als im Zeitbereich, z.&amp;amp;nbsp;B. Korrelationen oder sehr lange FIR-Filter. Das zu verarbeitende Signal wird dazu in den Frequenzbereich transformiert, dort manipuliert, und wieder in den Zeitbereich zurücktransformiert. Das klingt vielleicht umständlich, kann aber in der Praxis sehr viel schneller sein als eine Realisierung im Zeitbereich.&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/25095 Diskussion: FFT auf dem AVR]&lt;br /&gt;
* [http://sourceforge.net/projects/kissfft/ Kiss FFT] - einfache FFT-Bibliothek, in C, Floating- und Fixed Point, BSD-Lizenz, geeignet für Mikrocontroller&lt;br /&gt;
* [http://www.fftw.org/ FFTW] - &#039;&#039;&#039;die&#039;&#039;&#039; Floating Point FFT-Bibliothek für PCs, GPL-Lizenz&lt;br /&gt;
*[http://www.sprut.de/electronic/pic/16bit/dsp/fft/fft.htm FFT - verständlich auch für Nichtakademiker (Deutsch)]&lt;br /&gt;
* [http://www.science.smith.edu/departments/Physics/fstaff/gfelder/ffteasy/ ffteasy - Einfache Routinen zur FFT]&lt;br /&gt;
&lt;br /&gt;
=== Signalerzeugung ===&lt;br /&gt;
&lt;br /&gt;
Rechteck-, Sägezahn- und Dreieckssignale lassen sich mit einfachen Zählern realisieren.&lt;br /&gt;
&lt;br /&gt;
Möchte man Sinus- oder beliebige andere Signalformen erzeugen, bietet es sich an vorausberechnete Funktionswerte im Speicher abzulegen und der Reihe nach auszugeben. Eine variable Frequenzeinstellung kann man durch die Methode der Direkten Digitalen Synthese (&#039;&#039;&#039;DDS&#039;&#039;&#039;) realisieren.&lt;br /&gt;
&lt;br /&gt;
* [[Digitaler Funktionsgenerator]] - ausführliche Erklärung des Verfahrens im PDF, Beispielcode für AVR&lt;br /&gt;
* http://www.myplace.nu/avr/minidds/ - noch ein AVR-Projekt&lt;br /&gt;
* http://www.hit.bme.hu/~papay/sci/DDS/start.htm - noch eine Erklärung&lt;br /&gt;
&lt;br /&gt;
Eine weitere Methode zur Realisierung von (mehr oder weniger beliebigen) Funktionen ist die &#039;&#039;&#039;Polynomapproximation&#039;&#039;&#039;. Dabei nähert man die zu erzeugende Funktion durch ein Polynom an und verwendet das Horner-Schema um die einzelnen Funktionswerte zu berechnen. Für ein Polynom der Ordnung N benötigt man damit pro Wert N+1 Multiplikationen (N ist üblicherweise &amp;lt;= 10).&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
Zur Entwicklung von Signalverarbeitungsverfahren gibt es eine ganze Reihe von Programmen. Neben kleinen Tools für Filterdesign und spezialisierten Bibliotheken zum Einbinden in eigene Programme gibt es mehrere Mathematikprogramme, mit denen sich Signale verarbeiten und darstellen lassen. Die drei wichtigsten sind Matlab, Octave und Scilab.&lt;br /&gt;
&lt;br /&gt;
=== MATLAB ===&lt;br /&gt;
&lt;br /&gt;
MATLAB ist das Standardprogramm für numerische Mathematik. In der digitalen Signalverarbeitung wird es häufig verwendet, um einen Algorithmus vor der Umsetzung in C-Code oder auf einen DSP zu entwickeln und zu testen. Zum schon recht hohen Preis der Grundsoftware muss man noch einige hundert Euro für diverse Toolboxes einplanen (Signal Processing, Filter Design, Image Processing). Die [http://www.mikrocontroller.net/link/isbn/0979223903 Studentenversion] kostet ca. 80 Euro (die Signal Processing Toolbox und ein paar andere sind bereits enthalten).&lt;br /&gt;
&lt;br /&gt;
MATLAB ist für Windows, Linux, Mac OS X, Solaris und HP-UX erhältlich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* http://users.ece.gatech.edu/%7Ebonnie/book/TUTORIAL/tutorial.html - Englischsprachiges MATLAB-Tutorial&lt;br /&gt;
* http://www.mathworks.com/access/helpdesk/help/techdoc/matlab.shtml - MATLAB-Referenz&lt;br /&gt;
* http://www.eng.auburn.edu/~sjreeves/Classes/DSP/DSP.html - MATLAB for DSP (allgemeine Tipps und Hinweise)&lt;br /&gt;
&lt;br /&gt;
=== Octave ===&lt;br /&gt;
&lt;br /&gt;
Das Open-Source-Programm Octave zeichnet sich durch einen hohen Grad an Matlab-Kompatibilität aus; das geht so weit, dass man problemlos die Matlab-Online-Hilfe und Matlab-Einführungen zum Lernen verwenden kann. In dem Zusatzpaket Octave-Forge sind auch viele Funktionen der Matlab-Toolboxes enthalten (z.&amp;amp;nbsp;B. Filterdesign, Signalverarbeitung). Octave ist ein reines Kommandozeilenprogramm, so dass man auf alle Annehmlichkeiten des Matlab-GUI verzichten muss. Zum Plotten wird gnuplot verwendet.&lt;br /&gt;
&lt;br /&gt;
Octave lässt sich auf praktisch jedem Unix kompilieren. Für Windows gibt es ein fertig kompiliertes Paket.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* http://octave.sourceforge.net/ - Übersicht über alle Funktionen von Octave/Octave-Forge&lt;br /&gt;
&lt;br /&gt;
=== Scilab / Scicos ===&lt;br /&gt;
&lt;br /&gt;
Auch das Open-Source-Programmpaket Scilab / Scicos, ähnlich leistungsfähig wie Matlab und seine Zusatzmodule, ist kostenlos und im Quelltext erhältlich. Während die Grundsyntax (Kontrollstrukturen, Ausdrücke) weitgehend Matlab-kompatibel ist, gibt es bei den Funktionen z.T. deutliche Abweichungen. Dafür bietet Scilab / Scicos verglichen mit Octave umfangreichere Möglichkeiten zur grafischen Darstellung, die über das 2D- und 3D-Plotten von Funktionen weit hinausgehen, z.&amp;amp;nbsp;B. lassen sich Linien, Kreise usw. zeichnen.&lt;br /&gt;
&lt;br /&gt;
Scilab / Scicos läuft unter Windows, Linux/Unix und Mac OS X. Für die wichtigsten Linux-Distributionen sind fertige, komplette Binärpakete (RPM, ...) zur einfachen Installation frei verfügbar. Für Windows gibt es ebenfalls ein einfach zu installierendes Komplettpaket.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.scilab.org/ Scilab Homepage (Universelles Wissenschaftlich-Technisches Mathematik-Paket)]&lt;br /&gt;
* [http://www.scicos.org/ Scicos Homepage (Modellations- und Simulations-Paket für Scilab, ist im Scilab-Download enthalten)]&lt;br /&gt;
* [http://www-rocq.inria.fr/scicos/scicosmodnum.html ModNum Digital communication toolbox zu Scicos]&lt;br /&gt;
* [http://www.scilab.org/publications/index_publications.php?page=freebooks Übersicht zur Literatur: Webtexte, Bücher und Zeitschriftenartikel]&lt;br /&gt;
&#039;&#039;&#039;Bücher&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.scicos.org/book.html Modeling and Simulation in Scilab/Scicos, (für Version 3.0, aktuell ist Version 4.1.2)]&lt;br /&gt;
&#039;&#039;&#039;Tutorials&#039;&#039;&#039;:&lt;br /&gt;
* [http://wiki.scilab.org/Tutorials?action=AttachFile&amp;amp;do=get&amp;amp;target=signal.pdf Signal Processing with Scilab (1998)], [http://wuarchive.wustl.edu/pub/aminet/misc/math/scilab-doc.lha Beispielfiles dazu lha-gepackt (1996)] [http://aminet.net/package/misc/math/scilab-doc oder hier], [http://viewvc.scilab.org/bin/cgi/viewvc.cgi/trunk/scilab_doc/signal/Nfigs_source/ hier auch einzeln erhältlich]&lt;br /&gt;
* [http://www.scilab.org/publications/delicado/scilab.pdf DSP-Tutorial in spanisch, teilweise aus dem englischen Tutorial entnommen]&lt;br /&gt;
* [http://www.neurotraces.com/scilab/scilab2/index.html Treatment of neurophysiological signals using Scilab, HTML-Texte mit Kapiteln zu Filtern, FFT usw.]&lt;br /&gt;
* [http://www.scilab.org/publications/TELECOM/ComNumSc.zip Digital-Kommunikation - französisches Tutorial, gezipptes Postscript]&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Ein DSP (&#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;S&#039;&#039;&#039;ignal &#039;&#039;&#039;P&#039;&#039;&#039;rocessor) ist eine spezielle CPU mit einem auf die Verarbeitung von Signalen optimierten Kern und Befehlssatz. Unterschieden wird hauptsächlich zwischen Gleitkomma- und Festkomma-DSPs.&lt;br /&gt;
&lt;br /&gt;
Charakteristisches Merkmal vieler DSPs ist eine VLIW-Architektur (&#039;&#039;&#039;V&#039;&#039;&#039;ery &#039;&#039;&#039;L&#039;&#039;&#039;ong &#039;&#039;&#039;I&#039;&#039;&#039;nstruction &#039;&#039;&#039;W&#039;&#039;&#039;ord). Dabei werden Anweisungen für mehrere parallele Ausführungseinheiten (Multiplizierer/Addierer/Akkumulatoren) und mehrere Lade-/Speicherbefehle in einem einzigen, langen Befehlswort kodiert, und in einem Takt ausgeführt. Dazu kommen häufig mehrere gleichzeitig adressierbare Speicherbänke, Unterstützung für Ringpuffer, Schleifen ohne Sprung-Overhead, Bit-Reverse-Adressierung (wichtig für FFT) und Arithmetik mit Sättigungs- statt Überlaufverhalten (wichtig für die Realisierung von IIR-Filtern).&lt;br /&gt;
&lt;br /&gt;
Seit ein paar Jahren beginnen die Grenzen zwischen Mikrocontrollern und DSPs etwas zu verschwimmen. Viele Mikrocontroller werden mit zusätzlichen DSP-Funktionen ausgestattet ([[PICCOLO]], [[dsPIC]], [[ARM]]), während DSPs zunehmend in Richtung der Aufgabenbereiche eines Mikrocontrollers oder Allround-Prozessors vordringen und immer öfter um Unterstützung für Betriebssysteme (MMU) oder I/O-Funktionen wie Ethernet oder USB erweitert werden ([[Blackfin]]).&lt;br /&gt;
&lt;br /&gt;
Eine noch grössere DSP-Rechenleistung kann mit programmierbaren Logikbausteinen (&#039;&#039;&#039;[[FPGA]]&#039;&#039;&#039;s) erzielt werden, da die Anzahl gleichzeitig ausführbarer Rechenoperationen nur durch die Größe des FPGAs begrenzt wird. Nachteilig sind die gegenüber DSPs um ein vielfaches höheren Kosten, höherer Stromverbrauch und höherer Entwicklungsaufwand, weshalb FPGAs für Signalverarbeitung nur in sehr speziellen Anwendungen verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Aktuelle &#039;&#039;&#039;PC-Prozessoren&#039;&#039;&#039; sind sehr gut für Floating-Point-Signalverarbeitung geeignet. Wenn keine besonderen Anforderungen an Echtzeitfähigkeit, Strom- oder Platzbedarf gestellt werden, hat ein normaler PC mit Abstand das beste Preis/Leistungsverhältnis. Der erste Schritt bei einem DSP-Projekt sollte somit eine Implementierung auf dem PC sein. Es macht wenig Sinn ein Eval-Board für einen Signalprozessor zu kaufen und einfach loszulegen.&lt;br /&gt;
&lt;br /&gt;
=== Fest- oder Gleitkomma? ===&lt;br /&gt;
&lt;br /&gt;
Signalverarbeitung auf einem Gleitkomma- (Floating-Point-) Rechner ist grundsätzlich einfacher als auf einem Festkomma- (Fixed-Point-) Rechner. Da die Ungenauigkeiten bei der Rechnung mit Floating-Point-Zahlen in vielen Fällen vernachlässigbar sind, kann man einen Algorithmus i.d.R. 1:1 in Programmcode umsetzen. Hat man nur Festkomma-Rechenoperationen zur Verfügung wird es etwas ungemütlich. Man muss sich Gedanken um die Skalierung der Daten, die Reihenfolge von Rechenoperationen, Überläufe, Rundungsrauschen usw. machen. Da Gleitkomma-DSPs allerdings teurer sind und mehr Strom verbrauchen, werden für Massenprodukte fast ausschließlich Festkomma-DSPs bzw. ASICs mit Festkomma-Rechenwerken verwendet.&lt;br /&gt;
&lt;br /&gt;
=== TI C2000 ===&lt;br /&gt;
&lt;br /&gt;
Eine komplette 32-bit DSC Controller Familie vom low-cost ([http://www.ti.com/corp/docs/landing/f280xx-piccolo/index.htm PICCOLO]) bis high-end Controller mit FPU ([http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=mcu&amp;amp;sectionId=95&amp;amp;tabId=2108&amp;amp;familyId=1414&amp;amp;paramCriteria=no TMS320F28335]).&lt;br /&gt;
Die Peripherie umfasst Mehrkanal A/D Wandler mit 12-bit Aufloesung und bis zu 4 Megasamples Abtastrate. Die PWMs haben einen hochauflösenden Modus, der bis zu 150ps auflösen kann. Als Interface stehen CAN, I2C, schnelle generelle serielle Ports und Quadratureingänge für Drehgeber zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
=== TI C5000 ===&lt;br /&gt;
&lt;br /&gt;
DSP für Batterieapplikationen. Die gesamte Architektur wurde auf Stromverbrauch optimiert. Dazu werden spezielle Tools zur Verfügung gestellt, die zur Anwendung passende Optimierungslösungen generiert. [[TMS320VC5505 eZDSP USB Stick‎]] mit IDE als preisgünstiges Entwicklungssystem ( &amp;lt; 50€)&lt;br /&gt;
&lt;br /&gt;
=== TI C6000 ===&lt;br /&gt;
&lt;br /&gt;
DSP-Familie vom Marktführer Texas Instruments, enthält sowohl Fest- als auch Gleitkomma-DSPs.&lt;br /&gt;
&lt;br /&gt;
=== TI DM6400 (DaVinci) ===&lt;br /&gt;
&lt;br /&gt;
DSP für Videoanwendungen. Einige Derivate enthalten auch einen ARM9 als Co-Prozessor. Diese Familie wird unter dem Namen [http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=dsp&amp;amp;sectionId=2&amp;amp;tabId=1852&amp;amp;familyId=1300 DaVinci] vermarktet.&lt;br /&gt;
&lt;br /&gt;
=== TI OMAP ===&lt;br /&gt;
&lt;br /&gt;
Prozessor für mobile Geraete, enthält einen ARM-Kern und einen C6000-DSP. Ein interessantes und mit $149 sehr preisguenstiges Evalboard ist das [http://www.beagleboard.org Beagle Board]. Ein kostenloser Assembler für den DSP ist verfuegbar.&lt;br /&gt;
&lt;br /&gt;
=== SHARC/TigerSHARC ===&lt;br /&gt;
&lt;br /&gt;
32 Bit Gleitkomma-DSP von Analog Devices.&lt;br /&gt;
&lt;br /&gt;
=== Blackfin ===&lt;br /&gt;
&lt;br /&gt;
Der Blackfin ist ein 16/32 Bit Festkomma-DSP von Analog Devices. Im Gegensatz zu den 16-bittigen Vorgängern ADSP-21xx, die häufig als Co-Prozessoren zur Signalverarbeitung zusammen mit einem Mikrocontroller verwendet werden, geht der Blackfin schon weit in den Einsatzbereich eines Allround-Prozessors hinein. So gibt es z.&amp;amp;nbsp;B. einen Linux-Port für Blackfin, Eval-Boards mit Ethernet, CAN, USB und vielen MB SDRAM. Dank der verbesserten Stromsparfunktionen der BF52x-Reihe ist diese eher neue Architektur vermehrt in mobilen Geräten (Kameras, Mediaplayer, etc.) anzutreffen.&lt;br /&gt;
&lt;br /&gt;
Wichtig für die Entwicklung ist zu wissen:&lt;br /&gt;
&lt;br /&gt;
* Kein Fließkomma-Support in Hardware&lt;br /&gt;
* Keine MMU, keine Unterstützung für virtuelles Memory (kein Unix fork(), etc.)&lt;br /&gt;
&lt;br /&gt;
Unterstützte Entwicklungswerkzeuge:&lt;br /&gt;
&lt;br /&gt;
* Visual DSP++: Hauseigenes Entwicklungstool von Analog Devices, kommerziell&lt;br /&gt;
* GCC: Freie GNU-Umgebung mit Assembler, Compiler, Linker, Debugger&lt;br /&gt;
* Eclipse für uClinux-Entwicklung wie auch &#039;standalone&#039; ohne OS&lt;br /&gt;
&lt;br /&gt;
Aufgrund der ausgereiften GNU-Toolchain ist der Blackfin eine der kostengünstigsten Plattformen für die Entwicklung. Die Tools laufen sowohl unter Windows32 als auch Linux, bevorzugt wird jedoch Linux eingesetzt. Für die Kernel-Entwicklung ist Linux unabdingbar.&lt;br /&gt;
Dank offener JTAG-Spezifikation existieren einige Tools von Drittherstellern zum Hardware-Debugging (In Circuit Emulation) und zur Programmierung:&lt;br /&gt;
&lt;br /&gt;
* [http://www.section5.ch/icebear ICEbear] JTAG: schneller USB-&amp;gt;JTAG adapter&lt;br /&gt;
* [http://www.ronetix.at/ PEEDI] High end JTAG, Ethernet&lt;br /&gt;
* [http://www.bluetechnix.at/rainbow2006/site/blackfin_family/__dev_tools/__gnice_jtag/409/gnice_jtag.aspx gnICE von Bluetechnix]&lt;br /&gt;
* [http://www.analog.com/en/processors-dsp/blackfin/emulator-100/processors/product.html JTAG-Adapter von Analog Devices]&lt;br /&gt;
&lt;br /&gt;
Beide Tools arbeiten auch mit ARM-Prozessoren.&lt;br /&gt;
&lt;br /&gt;
Weitere Links:&lt;br /&gt;
&lt;br /&gt;
* [http://www.analog.com/blackfin Herstellerwebsite]&lt;br /&gt;
* [http://blackfin.uclinux.org/ uClinux Port und GNU toolchain]&lt;br /&gt;
&lt;br /&gt;
=== dsPIC ===&lt;br /&gt;
&lt;br /&gt;
Der [[dsPIC]] ist ein kleiner 16 Bit-Mikrocontroller mit DSP-Funktionen. Mit dem klassischen PIC hat er außer dem Namen nichts gemeinsam.&lt;br /&gt;
&lt;br /&gt;
=== TriCore ===&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;TriCore&#039;&#039;&#039; von Infineon ist ein 32-Bit-Mikrocontroller mit DSP-Funktionen, mit derzeitigem Schwerpunkt im Bereich der High Performance Embedded Real-Time Systems für Industrie-  und Automobilanwendungen (Beispiele: Motorsteuerungen, Servomotoren, Solarinverter, Multi-Axis-Conrol) &lt;br /&gt;
&lt;br /&gt;
* [http://www.infineon.com/cgi-bin/ifx/portal/ep/channelView.do?channelId=-78991&amp;amp;channelPage=%2Fep%2Fchannel%2FleafNote.jsp&amp;amp;pageTypeId=17099  Übersicht über die &#039;&#039;&#039;TriCore&#039;&#039;&#039; Produktfamilie]&lt;br /&gt;
&lt;br /&gt;
=== Bezugsquellen für Starterkits/Evalboards ===&lt;br /&gt;
&lt;br /&gt;
* http://www.spectrumdigital.com - große Auswahl an Starterkits mit TI-DSPs, ab $300&lt;br /&gt;
* http://www.bluetechnix.com - Blackfin-Module ab € 150&lt;br /&gt;
* http://www.zbrain.ch/ - Blackfin-Modul, Preis: ?&lt;br /&gt;
* http://www.danvillesignal.com/ - ADSP-218x-Boards ab $200, Sharc-Boards ab $400&lt;br /&gt;
* http://docs.blackfin.uclinux.org/doku.php?id=buy_stuff - Blackfin BF533 STAMP $170 (keine analogen Schnittstellen, aber über Pfostenstecker leicht zu erweitern)&lt;br /&gt;
* http://www.sundance.com - High-End-Module mit TI C6000&lt;br /&gt;
* http://www.spectrumsignal.com/ - TMS320 und SHARC&lt;br /&gt;
* http://www.pentek.com/dspcentral/ - TMS430 und PowerPC&lt;br /&gt;
* http://www.bittware.com/ - SHARC und TigerSHARC&lt;br /&gt;
* http://www.hunteng.co.uk/ - C6000&lt;br /&gt;
* http://www.kanecomputing.co.uk&lt;br /&gt;
* http://www.dsp-systeme.net - DSP-Module mit DSP von TI und ADI&lt;br /&gt;
* http://search.digikey.com/scripts/DkSearch/dksus.dll?lang=de&amp;amp;site=DE&amp;amp;WT.z_homepage_link=hp_go_button&amp;amp;KeyWords=TMDX5505EZDSP&amp;amp;x=22&amp;amp;y=22  eZDSP  USB Stick , &amp;lt;50€&lt;br /&gt;
* http://www.dsp-weuffen.de  - TI C6727 Board und vielen Beispielen&lt;br /&gt;
* http://www.ehitex.de/artikel.php?xPD=131_132&amp;amp;kat_name= - Infineon TriCore Starter Kits&lt;br /&gt;
&lt;br /&gt;
== Artikel aus der Kategorie DSP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ncl style=compact maxdepth=2 headings=bullet headstart=2&lt;br /&gt;
      showcats=1 showarts=1&amp;gt;DSP&amp;lt;/ncl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:DSP| ]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Digitale_Signalverarbeitung&amp;diff=60858</id>
		<title>Digitale Signalverarbeitung</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Digitale_Signalverarbeitung&amp;diff=60858"/>
		<updated>2011-09-30T23:54:03Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Anwendungsbeispiele */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Anwendungsbeispiele ==&lt;br /&gt;
&lt;br /&gt;
* Modulation/Demodulation zur Datenübertragung (z.&amp;amp;nbsp;B. Telefonmodem, DSL, GSM) - &amp;quot;Software Defined Radio&amp;quot; (SDR)&lt;br /&gt;
* Multimediacodierung (MP3, DivX, JPEG)&lt;br /&gt;
* Bildverarbeitung (Mustererkennung)&lt;br /&gt;
* Echo- und Störgeräuschunterdrückung bei Telefonen, Sprechgarnituren (Headsets) und Hörgeraeten&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
&lt;br /&gt;
Bücher:&lt;br /&gt;
* Oppenheim, Schaefer: &amp;quot;Discrete Time Signal Processing&amp;quot;, ISBN 0131988425&lt;br /&gt;
* Proakis: &amp;quot;Digital Signal Processing&amp;quot;, ISBN 0131873741&lt;br /&gt;
* Lyons: &amp;quot;Understanding Digital Signal Processing&amp;quot;, ISBN 0131089897&lt;br /&gt;
* Smith: &amp;quot;The Scientist and Engineer&#039;s Guide to Digital Signal Processing&amp;quot;, ISBN  075067444X (unter http://dspguide.com/ als PDF verfügbar)&lt;br /&gt;
* Sanjit K. Mitra: &amp;quot;Handbook for Digital Signal Processing&amp;quot; (1993,1312 Seiten), ISBN 0471619957&lt;br /&gt;
&lt;br /&gt;
Foren:&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/list-10-1.html DSP-Forum auf mikrocontroller.net (deutsch)]&lt;br /&gt;
* [http://groups.google.de/group/comp.dsp Newsgroup comp.dsp (Englisch)]&lt;br /&gt;
* [http://www.dsprelated.com/groups.php Discussion Groups (Englisch)]&lt;br /&gt;
&lt;br /&gt;
Webseiten:&lt;br /&gt;
* http://www.dspguru.com/ - FAQs, Infos, Beispielcode, ...&lt;br /&gt;
* http://docs.google.com/View?docid=dg2hppb_4gtgk89 - evtl. interessant als Rohmaterial für diesen Artikel&lt;br /&gt;
* http://www.dsprelated.com - Blogs, Jobs, Comp.DSP, ...&lt;br /&gt;
* http://www.unidsp56.de/ Eine Entwicklungsplattform für den Amateur&lt;br /&gt;
&lt;br /&gt;
== Verfahren ==&lt;br /&gt;
&lt;br /&gt;
=== FIR- und IIR-Filter ===&lt;br /&gt;
&lt;br /&gt;
Die häufigste Aufgabe in der DSV ist das Filtern, das heißt bestimmte Frequenzanteile zu unterdrücken, in der Phase zu verschieben oder zu verstärken. Man kann grundsätzlich zwischen zwei Filterarten unterscheiden:&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;FIR-Filter&#039;&#039;&#039;n (&#039;&#039;&#039;F&#039;&#039;&#039;inite &#039;&#039;&#039;I&#039;&#039;&#039;mpulse &#039;&#039;&#039;R&#039;&#039;&#039;esponse) wird jeder Ausgangswert aus unterschiedlich gewichteten und addierten früheren Eingangswerten zusammengesetzt. Dabei bezeichnet man die maximale Anzahl an vergangenen Werten die bei der Berechnung berücksichtigt werden als &#039;&#039;&#039;Ordnung&#039;&#039;&#039;. Je höher die Ordnung, desto besser die Eigenschaften des Filters (Ripple, Steilheit, Dämpfung), desto höher aber auch der Rechenaufwand.&lt;br /&gt;
&lt;br /&gt;
Merkmale von FIR-Filtern:&lt;br /&gt;
* immer stabil&lt;br /&gt;
* linearer Phasengang -&amp;gt; keine Phasenverzerrungen&lt;br /&gt;
* Ordnungen oft im zwei- bis dreistelligen Bereich&lt;br /&gt;
* problemlos realisierbar!&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zu FIR-Filtern werden bei &#039;&#039;&#039;IIR-Filter&#039;&#039;&#039;n (&#039;&#039;&#039;I&#039;&#039;&#039;nfinite &#039;&#039;&#039;I&#039;&#039;&#039;mpulse &#039;&#039;&#039;R&#039;&#039;&#039;esponse) auch frühere &#039;&#039;&#039;Ausgangs&#039;&#039;&#039;werte in die Berechnung des aktuellen Ausgangswertes mit einbezogen. Wie man sich leicht vorstellen kann, kann dadurch die Antwort auf einen Eingangsimpuls theoretisch unendlich lang werden, da jeder Ausgangswert auf den Eingang rückgekoppelt wird.&lt;br /&gt;
&lt;br /&gt;
Merkmale von IIR-Filtern:&lt;br /&gt;
* durch Rundungsfehler kann das Filter instabil werden -&amp;gt; &amp;quot;Aufschaukeln&amp;quot; durch Rückkopplung -&amp;gt; schwierigere Realisierung&lt;br /&gt;
* kein linearer Phasengang -&amp;gt; verschiedene Frequenzanteile werden durch den Filter unterschiedlich lange verzögert -&amp;gt; &amp;quot;Verzerrung&amp;quot;&lt;br /&gt;
* einziger Vorteil gegenüber FIR: Um einen gewünschten Frequenzgang zu erzielen ist eine sehr viel niedrigere Ordnung ausreichend -&amp;gt; weniger Rechenaufwand&lt;br /&gt;
* Ordnung üblicherweise &amp;lt; 10&lt;br /&gt;
&lt;br /&gt;
Viele nützliche Informationen zur Realisierung gibt es im [http://www.dspguru.com/info/faqs/ FIR- und IIR-FAQ auf dspguru.com] (der dort erwähnte Sourcecode FirAlgs.c kann [[Media:FirAlgs.c|hier]] direkt heruntergeladen werden).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Berechnungssoftware&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.filter-solutions.com/digital.html Beschreibung der Digitalfiltertypen], [http://www.nuhertz.com/download.html hier kostenlose Testversion Filter Free]&lt;br /&gt;
&lt;br /&gt;
=== FFT ===&lt;br /&gt;
&lt;br /&gt;
Die FFT (Fast Fourier Transform) ist ein schneller Algorithmus zur Berechnung der DFT (Discrete Fourier Transform). Damit bezeichnet man die Transformation eines Zeitsignals (= eine Abfolge von Samples) in den Frequenzbereich (= Frequenzbestandteile des Signals). Die Transformation kann auch ohne Verlust umgekehrt durchgeführt werden, also vom Frequenz- in den Zeitbereich (Inverse Discrete Fourier Transform, IDFT). Eine DFT wird praktisch immer mit dem FFT-Algorithmus realisiert, weshalb die Bezeichnungen FFT/DFT oft gleichwertig verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Die offensichtlichste Anwendung der FFT ist die Darstellung des Frequenzspektrums eines Signals. Aber das ist nur ein kleiner Teil der Anwendungsmöglichkeiten. Viele Verarbeitungen lassen sich im Frequenzbereich einfacher durchführen als im Zeitbereich, z.&amp;amp;nbsp;B. Korrelationen oder sehr lange FIR-Filter. Das zu verarbeitende Signal wird dazu in den Frequenzbereich transformiert, dort manipuliert, und wieder in den Zeitbereich zurücktransformiert. Das klingt vielleicht umständlich, kann aber in der Praxis sehr viel schneller sein als eine Realisierung im Zeitbereich.&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/25095 Diskussion: FFT auf dem AVR]&lt;br /&gt;
* [http://sourceforge.net/projects/kissfft/ Kiss FFT] - einfache FFT-Bibliothek, in C, Floating- und Fixed Point, BSD-Lizenz, geeignet für Mikrocontroller&lt;br /&gt;
* [http://www.fftw.org/ FFTW] - &#039;&#039;&#039;die&#039;&#039;&#039; Floating Point FFT-Bibliothek für PCs, GPL-Lizenz&lt;br /&gt;
*[http://www.sprut.de/electronic/pic/16bit/dsp/fft/fft.htm FFT - verständlich auch für Nichtakademiker (Deutsch)]&lt;br /&gt;
* [http://www.science.smith.edu/departments/Physics/fstaff/gfelder/ffteasy/ ffteasy - Einfache Routinen zur FFT]&lt;br /&gt;
&lt;br /&gt;
=== Signalerzeugung ===&lt;br /&gt;
&lt;br /&gt;
Rechteck-, Sägezahn- und Dreieckssignale lassen sich mit einfachen Zählern realisieren.&lt;br /&gt;
&lt;br /&gt;
Möchte man Sinus- oder beliebige andere Signalformen erzeugen, bietet es sich an vorausberechnete Funktionswerte im Speicher abzulegen und der Reihe nach auszugeben. Eine variable Frequenzeinstellung kann man durch die Methode der Direkten Digitalen Synthese (&#039;&#039;&#039;DDS&#039;&#039;&#039;) realisieren.&lt;br /&gt;
&lt;br /&gt;
* [[Digitaler Funktionsgenerator]] - ausführliche Erklärung des Verfahrens im PDF, Beispielcode für AVR&lt;br /&gt;
* http://www.myplace.nu/avr/minidds/ - noch ein AVR-Projekt&lt;br /&gt;
* http://www.hit.bme.hu/~papay/sci/DDS/start.htm - noch eine Erklärung&lt;br /&gt;
&lt;br /&gt;
Eine weitere Methode zur Realisierung von (mehr oder weniger beliebigen) Funktionen ist die &#039;&#039;&#039;Polynomapproximation&#039;&#039;&#039;. Dabei nähert man die zu erzeugende Funktion durch ein Polynom an und verwendet das Horner-Schema um die einzelnen Funktionswerte zu berechnen. Für ein Polynom der Ordnung N benötigt man damit pro Wert N+1 Multiplikationen (N ist üblicherweise &amp;lt;= 10).&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
Zur Entwicklung von Signalverarbeitungsverfahren gibt es eine ganze Reihe von Programmen. Neben kleinen Tools für Filterdesign und spezialisierten Bibliotheken zum Einbinden in eigene Programme gibt es mehrere Mathematikprogramme, mit denen sich Signale verarbeiten und darstellen lassen. Die drei wichtigsten sind Matlab, Octave und Scilab.&lt;br /&gt;
&lt;br /&gt;
=== MATLAB ===&lt;br /&gt;
&lt;br /&gt;
MATLAB ist das Standardprogramm für numerische Mathematik. In der digitalen Signalverarbeitung wird es häufig verwendet, um einen Algorithmus vor der Umsetzung in C-Code oder auf einen DSP zu entwickeln und zu testen. Zum schon recht hohen Preis der Grundsoftware muss man noch einige hundert Euro für diverse Toolboxes einplanen (Signal Processing, Filter Design, Image Processing). Die [http://www.mikrocontroller.net/link/isbn/0979223903 Studentenversion] kostet ca. 80 Euro (die Signal Processing Toolbox und ein paar andere sind bereits enthalten).&lt;br /&gt;
&lt;br /&gt;
MATLAB ist für Windows, Linux, Mac OS X, Solaris und HP-UX erhältlich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* http://users.ece.gatech.edu/%7Ebonnie/book/TUTORIAL/tutorial.html - Englischsprachiges MATLAB-Tutorial&lt;br /&gt;
* http://www.mathworks.com/access/helpdesk/help/techdoc/matlab.shtml - MATLAB-Referenz&lt;br /&gt;
* http://www.eng.auburn.edu/~sjreeves/Classes/DSP/DSP.html - MATLAB for DSP (allgemeine Tipps und Hinweise)&lt;br /&gt;
&lt;br /&gt;
=== Octave ===&lt;br /&gt;
&lt;br /&gt;
Das Open-Source-Programm Octave zeichnet sich durch einen hohen Grad an Matlab-Kompatibilität aus; das geht so weit, dass man problemlos die Matlab-Online-Hilfe und Matlab-Einführungen zum Lernen verwenden kann. In dem Zusatzpaket Octave-Forge sind auch viele Funktionen der Matlab-Toolboxes enthalten (z.&amp;amp;nbsp;B. Filterdesign, Signalverarbeitung). Octave ist ein reines Kommandozeilenprogramm, so dass man auf alle Annehmlichkeiten des Matlab-GUI verzichten muss. Zum Plotten wird gnuplot verwendet.&lt;br /&gt;
&lt;br /&gt;
Octave lässt sich auf praktisch jedem Unix kompilieren. Für Windows gibt es ein fertig kompiliertes Paket.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* http://octave.sourceforge.net/ - Übersicht über alle Funktionen von Octave/Octave-Forge&lt;br /&gt;
&lt;br /&gt;
=== Scilab / Scicos ===&lt;br /&gt;
&lt;br /&gt;
Auch das Open-Source-Programmpaket Scilab / Scicos, ähnlich leistungsfähig wie Matlab und seine Zusatzmodule, ist kostenlos und im Quelltext erhältlich. Während die Grundsyntax (Kontrollstrukturen, Ausdrücke) weitgehend Matlab-kompatibel ist, gibt es bei den Funktionen z.T. deutliche Abweichungen. Dafür bietet Scilab / Scicos verglichen mit Octave umfangreichere Möglichkeiten zur grafischen Darstellung, die über das 2D- und 3D-Plotten von Funktionen weit hinausgehen, z.&amp;amp;nbsp;B. lassen sich Linien, Kreise usw. zeichnen.&lt;br /&gt;
&lt;br /&gt;
Scilab / Scicos läuft unter Windows, Linux/Unix und Mac OS X. Für die wichtigsten Linux-Distributionen sind fertige, komplette Binärpakete (RPM, ...) zur einfachen Installation frei verfügbar. Für Windows gibt es ebenfalls ein einfach zu installierendes Komplettpaket.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weblinks&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.scilab.org/ Scilab Homepage (Universelles Wissenschaftlich-Technisches Mathematik-Paket)]&lt;br /&gt;
* [http://www.scicos.org/ Scicos Homepage (Modellations- und Simulations-Paket für Scilab, ist im Scilab-Download enthalten)]&lt;br /&gt;
* [http://www-rocq.inria.fr/scicos/scicosmodnum.html ModNum Digital communication toolbox zu Scicos]&lt;br /&gt;
* [http://www.scilab.org/publications/index_publications.php?page=freebooks Übersicht zur Literatur: Webtexte, Bücher und Zeitschriftenartikel]&lt;br /&gt;
&#039;&#039;&#039;Bücher&#039;&#039;&#039;:&lt;br /&gt;
* [http://www.scicos.org/book.html Modeling and Simulation in Scilab/Scicos, (für Version 3.0, aktuell ist Version 4.1.2)]&lt;br /&gt;
&#039;&#039;&#039;Tutorials&#039;&#039;&#039;:&lt;br /&gt;
* [http://wiki.scilab.org/Tutorials?action=AttachFile&amp;amp;do=get&amp;amp;target=signal.pdf Signal Processing with Scilab (1998)], [http://wuarchive.wustl.edu/pub/aminet/misc/math/scilab-doc.lha Beispielfiles dazu lha-gepackt (1996)] [http://aminet.net/package/misc/math/scilab-doc oder hier], [http://viewvc.scilab.org/bin/cgi/viewvc.cgi/trunk/scilab_doc/signal/Nfigs_source/ hier auch einzeln erhältlich]&lt;br /&gt;
* [http://www.scilab.org/publications/delicado/scilab.pdf DSP-Tutorial in spanisch, teilweise aus dem englischen Tutorial entnommen]&lt;br /&gt;
* [http://www.neurotraces.com/scilab/scilab2/index.html Treatment of neurophysiological signals using Scilab, HTML-Texte mit Kapiteln zu Filtern, FFT usw.]&lt;br /&gt;
* [http://www.scilab.org/publications/TELECOM/ComNumSc.zip Digital-Kommunikation - französisches Tutorial, gezipptes Postscript]&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Ein DSP (&#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;S&#039;&#039;&#039;ignal &#039;&#039;&#039;P&#039;&#039;&#039;rocessor) ist eine spezielle CPU mit einem auf die Verarbeitung von Signalen optimierten Kern und Befehlssatz. Unterschieden wird hauptsächlich zwischen Gleitkomma- und Festkomma-DSPs.&lt;br /&gt;
&lt;br /&gt;
Charakteristisches Merkmal vieler DSPs ist eine VLIW-Architektur (&#039;&#039;&#039;V&#039;&#039;&#039;ery &#039;&#039;&#039;L&#039;&#039;&#039;ong &#039;&#039;&#039;I&#039;&#039;&#039;nstruction &#039;&#039;&#039;W&#039;&#039;&#039;ord). Dabei werden Anweisungen für mehrere parallele Ausführungseinheiten (Multiplizierer/Addierer/Akkumulatoren) und mehrere Lade-/Speicherbefehle in einem einzigen, langen Befehlswort kodiert, und in einem Takt ausgeführt. Dazu kommen häufig mehrere gleichzeitig adressierbare Speicherbänke, Unterstützung für Ringpuffer, Schleifen ohne Sprung-Overhead, Bit-Reverse-Adressierung (wichtig für FFT) und Arithmetik mit Sättigungs- statt Überlaufverhalten (wichtig für die Realisierung von IIR-Filtern).&lt;br /&gt;
&lt;br /&gt;
Seit ein paar Jahren beginnen die Grenzen zwischen Mikrocontrollern und DSPs etwas zu verschwimmen. Viele Mikrocontroller werden mit zusätzlichen DSP-Funktionen ausgestattet ([[PICCOLO]], [[dsPIC]], [[ARM]]), während DSPs zunehmend in Richtung der Aufgabenbereiche eines Mikrocontrollers oder Allround-Prozessors vordringen und immer öfter um Unterstützung für Betriebssysteme (MMU) oder I/O-Funktionen wie Ethernet oder USB erweitert werden ([[Blackfin]]).&lt;br /&gt;
&lt;br /&gt;
Eine noch grössere DSP-Rechenleistung kann mit programmierbaren Logikbausteinen (&#039;&#039;&#039;[[FPGA]]&#039;&#039;&#039;s) erzielt werden, da die Anzahl gleichzeitig ausführbarer Rechenoperationen nur durch die Größe des FPGAs begrenzt wird. Nachteilig sind die gegenüber DSPs um ein vielfaches höheren Kosten, höherer Stromverbrauch und höherer Entwicklungsaufwand, weshalb FPGAs für Signalverarbeitung nur in sehr speziellen Anwendungen verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Aktuelle &#039;&#039;&#039;PC-Prozessoren&#039;&#039;&#039; sind sehr gut für Floating-Point-Signalverarbeitung geeignet. Wenn keine besonderen Anforderungen an Echtzeitfähigkeit, Strom- oder Platzbedarf gestellt werden, hat ein normaler PC mit Abstand das beste Preis/Leistungsverhältnis. Der erste Schritt bei einem DSP-Projekt sollte somit eine Implementierung auf dem PC sein. Es macht wenig Sinn ein Eval-Board für einen Signalprozessor zu kaufen und einfach loszulegen.&lt;br /&gt;
&lt;br /&gt;
=== Fest- oder Gleitkomma? ===&lt;br /&gt;
&lt;br /&gt;
Signalverarbeitung auf einem Gleitkomma- (Floating-Point-) Rechner ist grundsätzlich einfacher als auf einem Festkomma- (Fixed-Point-) Rechner. Da die Ungenauigkeiten bei der Rechnung mit Floating-Point-Zahlen in vielen Fällen vernachlässigbar sind, kann man einen Algorithmus i.d.R. 1:1 in Programmcode umsetzen. Hat man nur Festkomma-Rechenoperationen zur Verfügung wird es etwas ungemütlich. Man muss sich Gedanken um die Skalierung der Daten, die Reihenfolge von Rechenoperationen, Überläufe, Rundungsrauschen usw. machen. Da Gleitkomma-DSPs allerdings teurer sind und mehr Strom verbrauchen, werden für Massenprodukte fast ausschließlich Festkomma-DSPs bzw. ASICs mit Festkomma-Rechenwerken verwendet.&lt;br /&gt;
&lt;br /&gt;
=== TI C2000 ===&lt;br /&gt;
&lt;br /&gt;
Eine komplette 32-bit DSC Controller Familie vom low-cost ([http://www.ti.com/corp/docs/landing/f280xx-piccolo/index.htm PICCOLO]) bis high-end Controller mit FPU ([http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=mcu&amp;amp;sectionId=95&amp;amp;tabId=2108&amp;amp;familyId=1414&amp;amp;paramCriteria=no TMS320F28335]).&lt;br /&gt;
Die Peripherie umfasst Mehrkanal A/D Wandler mit 12-bit Aufloesung und bis zu 4 Megasamples Abtastrate. Die PWMs haben einen hochauflösenden Modus, der bis zu 150ps auflösen kann. Als Interface stehen CAN, I2C, schnelle generelle serielle Ports und Quadratureingänge für Drehgeber zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
=== TI C5000 ===&lt;br /&gt;
&lt;br /&gt;
DSP für Batterieapplikationen. Die gesamte Architektur wurde auf Stromverbrauch optimiert. Dazu werden spezielle Tools zur Verfügung gestellt, die zur Anwendung passende Optimierungslösungen generiert. [[TMS320VC5505 eZDSP USB Stick‎]] mit IDE als preisgünstiges Entwicklungssystem ( &amp;lt; 50€)&lt;br /&gt;
&lt;br /&gt;
=== TI C6000 ===&lt;br /&gt;
&lt;br /&gt;
DSP-Familie vom Marktführer Texas Instruments, enthält sowohl Fest- als auch Gleitkomma-DSPs.&lt;br /&gt;
&lt;br /&gt;
=== TI DM6400 (DaVinci) ===&lt;br /&gt;
&lt;br /&gt;
DSP für Videoanwendungen. Einige Derivate enthalten auch einen ARM9 als Co-Prozessor. Diese Familie wird unter dem Namen [http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=dsp&amp;amp;sectionId=2&amp;amp;tabId=1852&amp;amp;familyId=1300 DaVinci] vermarktet.&lt;br /&gt;
&lt;br /&gt;
=== TI OMAP ===&lt;br /&gt;
&lt;br /&gt;
Prozessor für mobile Geraete, enthält einen ARM-Kern und einen C6000-DSP. Ein interessantes und mit $149 sehr preisguenstiges Evalboard ist das [http://www.beagleboard.org Beagle Board]. Ein kostenloser Assembler für den DSP ist verfuegbar.&lt;br /&gt;
&lt;br /&gt;
=== SHARC/TigerSHARC ===&lt;br /&gt;
&lt;br /&gt;
32 Bit Gleitkomma-DSP von Analog Devices.&lt;br /&gt;
&lt;br /&gt;
=== Blackfin ===&lt;br /&gt;
&lt;br /&gt;
Der Blackfin ist ein 16/32 Bit Festkomma-DSP von Analog Devices. Im Gegensatz zu den 16-bittigen Vorgängern ADSP-21xx, die häufig als Co-Prozessoren zur Signalverarbeitung zusammen mit einem Mikrocontroller verwendet werden, geht der Blackfin schon weit in den Einsatzbereich eines Allround-Prozessors hinein. So gibt es z.&amp;amp;nbsp;B. einen Linux-Port für Blackfin, Eval-Boards mit Ethernet, CAN, USB und vielen MB SDRAM. Dank der verbesserten Stromsparfunktionen der BF52x-Reihe ist diese eher neue Architektur vermehrt in mobilen Geräten (Kameras, Mediaplayer, etc.) anzutreffen.&lt;br /&gt;
&lt;br /&gt;
Wichtig für die Entwicklung ist zu wissen:&lt;br /&gt;
&lt;br /&gt;
* Kein Fließkomma-Support in Hardware&lt;br /&gt;
* Keine MMU, keine Unterstützung für virtuelles Memory (kein Unix fork(), etc.)&lt;br /&gt;
&lt;br /&gt;
Unterstützte Entwicklungswerkzeuge:&lt;br /&gt;
&lt;br /&gt;
* Visual DSP++: Hauseigenes Entwicklungstool von Analog Devices, kommerziell&lt;br /&gt;
* GCC: Freie GNU-Umgebung mit Assembler, Compiler, Linker, Debugger&lt;br /&gt;
* Eclipse für uClinux-Entwicklung wie auch &#039;standalone&#039; ohne OS&lt;br /&gt;
&lt;br /&gt;
Aufgrund der ausgereiften GNU-Toolchain ist der Blackfin eine der kostengünstigsten Plattformen für die Entwicklung. Die Tools laufen sowohl unter Windows32 als auch Linux, bevorzugt wird jedoch Linux eingesetzt. Für die Kernel-Entwicklung ist Linux unabdingbar.&lt;br /&gt;
Dank offener JTAG-Spezifikation existieren einige Tools von Drittherstellern zum Hardware-Debugging (In Circuit Emulation) und zur Programmierung:&lt;br /&gt;
&lt;br /&gt;
* [http://www.section5.ch/icebear ICEbear] JTAG: schneller USB-&amp;gt;JTAG adapter&lt;br /&gt;
* [http://www.ronetix.at/ PEEDI] High end JTAG, Ethernet&lt;br /&gt;
* [http://www.bluetechnix.at/rainbow2006/site/blackfin_family/__dev_tools/__gnice_jtag/409/gnice_jtag.aspx gnICE von Bluetechnix]&lt;br /&gt;
* [http://www.analog.com/en/processors-dsp/blackfin/emulator-100/processors/product.html JTAG-Adapter von Analog Devices]&lt;br /&gt;
&lt;br /&gt;
Beide Tools arbeiten auch mit ARM-Prozessoren.&lt;br /&gt;
&lt;br /&gt;
Weitere Links:&lt;br /&gt;
&lt;br /&gt;
* [http://www.analog.com/blackfin Herstellerwebsite]&lt;br /&gt;
* [http://blackfin.uclinux.org/ uClinux Port und GNU toolchain]&lt;br /&gt;
&lt;br /&gt;
=== dsPIC ===&lt;br /&gt;
&lt;br /&gt;
Der [[dsPIC]] ist ein kleiner 16 Bit-Mikrocontroller mit DSP-Funktionen. Mit dem klassischen PIC hat er außer dem Namen nichts gemeinsam.&lt;br /&gt;
&lt;br /&gt;
=== TriCore ===&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;TriCore&#039;&#039;&#039; von Infineon ist ein 32-Bit-Mikrocontroller mit DSP-Funktionen, mit derzeitigem Schwerpunkt im Bereich der High Performance Embedded Real-Time Systems für Industrie-  und Automobilanwendungen (Beispiele: Motorsteuerungen, Servomotoren, Solarinverter, Multi-Axis-Conrol) &lt;br /&gt;
&lt;br /&gt;
* [http://www.infineon.com/cgi-bin/ifx/portal/ep/channelView.do?channelId=-78991&amp;amp;channelPage=%2Fep%2Fchannel%2FleafNote.jsp&amp;amp;pageTypeId=17099  Übersicht über die &#039;&#039;&#039;TriCore&#039;&#039;&#039; Produktfamilie]&lt;br /&gt;
&lt;br /&gt;
=== Bezugsquellen für Starterkits/Evalboards ===&lt;br /&gt;
&lt;br /&gt;
* http://www.spectrumdigital.com - große Auswahl an Starterkits mit TI-DSPs, ab $300&lt;br /&gt;
* http://www.bluetechnix.com - Blackfin-Module ab € 150&lt;br /&gt;
* http://www.zbrain.ch/ - Blackfin-Modul, Preis: ?&lt;br /&gt;
* http://www.danvillesignal.com/ - ADSP-218x-Boards ab $200, Sharc-Boards ab $400&lt;br /&gt;
* http://docs.blackfin.uclinux.org/doku.php?id=buy_stuff - Blackfin BF533 STAMP $170 (keine analogen Schnittstellen, aber über Pfostenstecker leicht zu erweitern)&lt;br /&gt;
* http://www.sundance.com - High-End-Module mit TI C6000&lt;br /&gt;
* http://www.spectrumsignal.com/ - TMS320 und SHARC&lt;br /&gt;
* http://www.pentek.com/dspcentral/ - TMS430 und PowerPC&lt;br /&gt;
* http://www.bittware.com/ - SHARC und TigerSHARC&lt;br /&gt;
* http://www.hunteng.co.uk/ - C6000&lt;br /&gt;
* http://www.kanecomputing.co.uk&lt;br /&gt;
* http://www.dsp-systeme.net - DSP-Module mit DSP von TI und ADI&lt;br /&gt;
* http://search.digikey.com/scripts/DkSearch/dksus.dll?lang=de&amp;amp;site=DE&amp;amp;WT.z_homepage_link=hp_go_button&amp;amp;KeyWords=TMDX5505EZDSP&amp;amp;x=22&amp;amp;y=22  eZDSP  USB Stick , &amp;lt;50€&lt;br /&gt;
* http://www.dsp-weuffen.de  - TI C6727 Board und vielen Beispielen&lt;br /&gt;
* http://www.ehitex.de/artikel.php?xPD=131_132&amp;amp;kat_name= - Infineon TriCore Starter Kits&lt;br /&gt;
&lt;br /&gt;
== Artikel aus der Kategorie DSP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ncl style=compact maxdepth=2 headings=bullet headstart=2&lt;br /&gt;
      showcats=1 showarts=1&amp;gt;DSP&amp;lt;/ncl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:DSP| ]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Bildformate&amp;diff=60857</id>
		<title>Bildformate</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Bildformate&amp;diff=60857"/>
		<updated>2011-09-30T23:30:18Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Eagle */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Das Problem ==&lt;br /&gt;
&lt;br /&gt;
Will man im Forum eine Antwort erhalten, dann sollte man es den anderen Forenteilnehmern so leicht wie möglich machen, sich die dazugehörigen Abbildungen anzusehen. Muss man die Dateien erst speichern oder gar ein Archiv entpacken und danach ein externes Programm benutzen, um die Dateien anzusehen, wird die Resonanz signifikant geringer sein, als hätte man einfach nur draufklicken müssen, um es gleich im Browser zu betrachen.&lt;br /&gt;
&lt;br /&gt;
Desweiteren kommt es immer wieder dazu, daß sich Forenteilnehmer &amp;quot;im Format vergreifen&amp;quot;. Da werden dann eigentlich kleine und mit wenig Farben ausgestattete Zeichnungen zu Dateimonstern von 1 MB und mehr. Das muss nicht sein, auch nicht im DSL-Zeitalter. Es gibt schon genug Datenmüll im Internet. Ausserdem sind immer noch eine gewisse Anzahl von Leuten per Modem im Internet unterwegs, an die sollte man auch ein klein wenig denken. Zu guter Letzt gilt &amp;quot;Klasse statt Masse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Vielleicht gar kein Bild? ==&lt;br /&gt;
&lt;br /&gt;
Manchmal ist es angebracht, überhaupt nichts anzuhängen. Beispielsweise ist das oft der Fall bei Datenblättern: Statt die möglicherweise hundertste Version des Datenblattes heraufzuladen, wäre ein Link deutlich angebrachter. Einerseits sind damit etwaige rechtliche Probleme schnell ausgeräumt, andererseits stolpert ein Leser in einiger Zeit nicht über ein womöglich bereits veraltetes Dokument.&lt;br /&gt;
&lt;br /&gt;
Für einen Leser kann es auch durchaus sinnvoll sein, zu wissen, woher ein Dokument stammt: etwa um weitergehende Recherche zu betreiben. Zumindest eine brauchbare Quellenangabe ist jedoch Pflicht, wenn schon Material von externen Seiten entnommen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Welches Format für welches Bild? ==&lt;br /&gt;
&lt;br /&gt;
=== Photos und Scans: JPG ===&lt;br /&gt;
&lt;br /&gt;
Photos sollten im &#039;&#039;&#039;JPG&#039;&#039;&#039;-Format abgespeichert werden. JPG bzw. JPEG (&#039;&#039;&#039;J&#039;&#039;&#039;oint &#039;&#039;&#039;P&#039;&#039;&#039;icture &#039;&#039;&#039;E&#039;&#039;&#039;xpert &#039;&#039;&#039;G&#039;&#039;&#039;roup) ist ein speziell für Echtfarbgrafiken (True Color) entwickeltes Bildformat. Es ermöglicht die Speicherung von Photos in 24 Bit Farbauflösung bei relativ geringem Speicherverbrauch. So hat z.&amp;amp;nbsp;B. ein Bild einer 2 Megapixel Digitalkamera (1600x1200 Punkte) einen Speicherbedarf von 6 MB ohne Kompression. Mit JPG und mittlerer Kompressionseinstellung sind es nur noch ca. 500 kB. Die Bilder werden dabei jedoch &#039;&#039;&#039;verlustbehaftet&#039;&#039;&#039; komprimiert. Das heißt sowohl Farben als auch Strukturen werden nicht eins zu eins abgespeichert, sondern mittels cleverer Mathematik soweit verarbeitet, dass speicherintensive Details rausfallen. Im Normalfall sieht man das nicht.&lt;br /&gt;
&lt;br /&gt;
Da jedoch 2 Megapixel heute eher zum alten Eisen gehören haben viele Leute Kameras mit 5 Megapixel und mehr. Und da man ja auch auf Qualität bedacht ist, ist meist auch nur eine geringe Kompression der Bilder eingestellt (hohe Qualität, Superfein etc.). &#039;&#039;&#039;Bitte solche Bilder nicht direkt im Forum posten.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Mit ein paar wenigen Handgriffen kann man die Bilder &#039;&#039;&#039;netztauglich&#039;&#039;&#039; machen. Dazu braucht man nur ein normales, kostenloses Bildbearbeitungsprogramm wie z.&amp;amp;nbsp;B. [http://www.irfanview.de/ Irfanview] oder [http://www.gimp.org/ GIMP].&lt;br /&gt;
&lt;br /&gt;
* Kompression erhöhen, einstellbar in den Speicheroptionen für JPG; 30% ist ein guter Kompromiss aus Qualität und Kompression&lt;br /&gt;
* Bildauschnitt auf das Wesentliche konzentrieren; ein kleiner IC der nur 1/10 der Bildfläche einnimmt, ist etwas &amp;quot;verloren&amp;quot;&lt;br /&gt;
* Auflösung reduzieren; niemand braucht 4000x3000 für die Art der hier geposteten Bilder; 1600x1200 oder weniger ist oft ausreichend&lt;br /&gt;
* Beim Fotografieren von ICs und Leiterplatten den Macromodus verwenden (meist ein Blumensymbol), damit werden kleine, nahe Objekte scharf abgebildet.&lt;br /&gt;
* Auf die Bildschärfe achten, völlig verwaschene Schatten nützen niemanden etwas&lt;br /&gt;
* Platinen kann man sehr gut mit einem Scanner abbilden&lt;br /&gt;
&lt;br /&gt;
=== Technische Zeichnungen: SVG oder PNG ===&lt;br /&gt;
&lt;br /&gt;
Zu Technischen Zeichnungen gehören&lt;br /&gt;
&lt;br /&gt;
*Schaltpläne&lt;br /&gt;
*Layouts&lt;br /&gt;
*Mechanische Zeichungen&lt;br /&gt;
*Screenshot&lt;br /&gt;
&lt;br /&gt;
Wesentliche Merkmale dieser Zeichungen sind&lt;br /&gt;
&lt;br /&gt;
*relativ wenig Farben&lt;br /&gt;
*feine Strukturen (Linien, Leiterbahnen)&lt;br /&gt;
&lt;br /&gt;
Werden solche Zeichnungen nun als JPG gespeichert kommt es zu sogenannten &#039;&#039;&#039;Kompressionsartefakten&#039;&#039;&#039; (verwaschene Kanten, &amp;quot;Pickel&amp;quot; in gleichmässigen Flächen, unscharfe Texte). Der Kompressionsalgorithmus von JPG ist darauf spezialisiert kleine Details &amp;quot;wegzuwischen&amp;quot;, um Speicher zu sparen. Das ist aber gerade hier kontraproduktiv! Technische Zeichnungen brauchen Details! Außerdem wird das Bild bei JPG immer mit 24 Bit Farbtiefe verarbeitet. Das ist Platzverschwendung, die meisten Technischen Zeichnungen kommen mit 16 oder 256 Farben bequem aus.&lt;br /&gt;
&lt;br /&gt;
Deshalb speichert man Technische Zeichnungen sinnvollerweise nur im &#039;&#039;&#039;PNG&#039;&#039;&#039;-Format (&#039;&#039;&#039;P&#039;&#039;&#039;ortable &#039;&#039;&#039;N&#039;&#039;&#039;etwork &#039;&#039;&#039;G&#039;&#039;&#039;raphic). PNG ist die Weiterentwicklung von &#039;&#039;&#039;GIF&#039;&#039;&#039; (&#039;&#039;&#039;G&#039;&#039;&#039;raphic &#039;&#039;&#039;I&#039;&#039;&#039;nterchange &#039;&#039;&#039;F&#039;&#039;&#039;ormat), welches ursprünglich von der Firma Compuserve als erstes Format für Netzwerkgrafiken entwickelt wurde. PNG komprimiert Bilder &#039;&#039;&#039;verlustfrei&#039;&#039;&#039;, d.h. das Bild wird 1:1 in Struktur und Farbe gespeichert. GIF kann dagegen nur 256 Farben speichern, die Struktur bleibt aber auch 1:1 erhalten. Für animierte GIFs gibt es bis jetzt keine verbreitete Alternative. Obwohl der Patentschutz von GIF mittlerweile abgelaufen ist, sollte man GIF nicht mehr verwenden, weil&lt;br /&gt;
&lt;br /&gt;
* PNG beliebige Farbtiefen von 1..24 Bit unterstützt (GIF nur 8 Bit)&lt;br /&gt;
* die Kompression von PNG geringfügig besser ist als GIF&lt;br /&gt;
&lt;br /&gt;
Eine Anmerkung zu Screenshots:&lt;br /&gt;
Häufig ist auf dem Rechner ein [http://de.wikipedia.org/wiki/Subpixel-Rendering Subpixel-Rendering] (vertikale Kantenglättung) namens &#039;&#039;&#039;ClearType&#039;&#039;&#039; oder &#039;&#039;&#039;CoolType&#039;&#039;&#039; aktiviert. Das führt dazu, dass:&lt;br /&gt;
&lt;br /&gt;
* Screenshots unnötig groß werden (lassen sich schlechter komprimieren)&lt;br /&gt;
* auf nicht kompatiblen Monitoren, etwa Beamern, beim Betrachter Farbsäume und Unschärfen zeigen&lt;br /&gt;
* beim Vergrößern und Verkleinen lustige (oder unverständliche) Effekte aufweisen&lt;br /&gt;
&lt;br /&gt;
Wer also einen &#039;&#039;guten&#039;&#039; Screenshot machen möchte, sollte vorher das Subpixel-Rendering ausschalten.&lt;br /&gt;
&lt;br /&gt;
Bei Fenstern &#039;&#039;mit runden Ecken oder Semitransparenz&#039;&#039; ist es sinnvoll, dieses vorher vor einen weißen Hintergrund zu setzen (etwa einem Web-Browser mit der URL &#039;&#039;&#039;about:blank&#039;&#039;&#039;). Screenshotprogramme, die dafür Alpha-Transparenz benutzen, sind nicht bekannt.&lt;br /&gt;
&lt;br /&gt;
== Universalformat PDF ==&lt;br /&gt;
&lt;br /&gt;
Das Format [http://de.wikipedia.org/wiki/Portable_Document_Format PDF] wurde vor langer Zeit von der Firma [http://www.adobe.com Adobe] entwickelt und hat sich schon lange als de-facto-Standard etabliert. Es ist auf allen gängigen Betriebssystemen lesbar. Es ist relativ kompakt (kleine Dateigrößen) und kann sowohl JPG, PNG als auch vektorbasierte Grafiken enthalten. Viele Programme bieten sowohl direkt einen Export als PDF an, oder man kann mittels Software ein PDF &amp;quot;drucken&amp;quot;, sprich anstatt eines echten Druckers, welcher Papier ausspuckt, wird eine PDF-Datei erzeugt.&lt;br /&gt;
&lt;br /&gt;
=== PDF generieren ===&lt;br /&gt;
&lt;br /&gt;
Gerade die Einbindung von Bildern und Grafiken erfordert etwas Feingefühl mit dem PDF-Generatorprogramm. Viele Generatoren sind so voreingestellt, jede Rastergrafik per JPG zu komprimieren, wodurch eine – womöglich sogar als unkomprimierte 1-bpp-Bitmap recht kleine – Grafikdatei zu einem verwaschenen (JPG-Artefakte) Monster regelrecht explodieren (Dateigröße) kann.&lt;br /&gt;
&lt;br /&gt;
Am besten fährt man, wenn man ausschließlich Vektorgrafiken beim Erstellen verwendet. Dann bleibt auch das Ergebnis gestochen scharf (insbesondere beim Vergrößern und Ausdrucken) und dennoch klein (Dateigröße). Außerdem bleiben Textanmerkungen in der Grafik durchsuchbar, sofern der Text nicht vektorisiert wurde.&lt;br /&gt;
&lt;br /&gt;
== Export mit CAD-Programmen ==&lt;br /&gt;
&lt;br /&gt;
=== Eagle ===&lt;br /&gt;
&lt;br /&gt;
Das weit verbreitete Schaltplan- und Layoutprogramm [[Eagle| EAGLE]] bietet direkt die Möglichkeit, Schaltpläne und Layouts als PNG-Bild zu exportieren (Menu File-&amp;gt;Export-&amp;gt;Image). Aber bitte nicht die Auflösung zu hoch einstellen! Die Voreinstellung von 150 dpi ist meist optimal für Schaltpläne. Layouts sind manchmal in 300dpi sinnvoll. &#039;&#039;&#039;Vorsicht!&#039;&#039;&#039; Es gibt einen kleinen Bug. Wenn man in der erscheinenden Dateiauswahlbox auf *.png umstellt, &#039;&#039;&#039;muss&#039;&#039;&#039; man auch einen Dateinamen mit .png Endung hinschreiben, sonst springt Eagle wieder zurück auf BMP Format! Der Export über die Zwischenablage ermöglicht die bequeme Nachbearbeitung mit dem Lieblings-Grafikprogramm, etwa dem Abschneiden überflüssiger Rahmen oder der Reduktion der Farbtiefe.&lt;br /&gt;
&lt;br /&gt;
Ab Version 5 kann Eagle auch als PDF-Datei exportieren (man findet diese Option allerdings nicht im Datei-&amp;gt;Exportieren...-Menü, sondern unter Datei-&amp;gt;Drucken). Das hat den Vorteil, dass eine echte Vektorgrafik exportiert wird. Somit kann man beliebig zoomen, und die Datei ist sehr klein.&lt;br /&gt;
&lt;br /&gt;
==== Von Enthusiasten geschriebene Programme ====&lt;br /&gt;
&lt;br /&gt;
Als ULP (User Language Program) gibt es Export-Programme für die Vektorformate EPS, SVG, CGM, WMF und EMF, mit unterschiedlicher Wiedergabetreue.&lt;br /&gt;
Diese eignen sich insbesondere für die Weiterverwendung in Office-Programmen.&lt;br /&gt;
&lt;br /&gt;
Für eine realitätsnahe Leiterplattenansicht gibt es Eagle3D als ziemlich umfangreiches ULP. Zum Rendern der entstehenden Zwischendatei wird &#039;&#039;&#039;Povray&#039;&#039;&#039; benötigt.&lt;br /&gt;
&lt;br /&gt;
== Formate die man meiden sollte ==&lt;br /&gt;
&lt;br /&gt;
=== Nie wieder BMP! ===&lt;br /&gt;
&lt;br /&gt;
Das Format BMP sollte man gänzlich meiden! Es ist ein unkomprimiertes oder RLE-komprimiertes Format und die Dateien sind &#039;&#039;&#039;riesig&#039;&#039;&#039;!&lt;br /&gt;
BMP-Dateien werden von der Forensoftware serverseitig automatisch nach PNG konvertiert!&lt;br /&gt;
&lt;br /&gt;
=== TIFF ===&lt;br /&gt;
&lt;br /&gt;
Dieses Format teilt sich in etliche Unterformate, die meist nicht von allen Programmen unterstützt werden. Insbesondere ist die Unterstützung bei Webbrowsern sehr schlecht. TIFF-Dateien (Endung meist .TIF) können je nach Unterformat sehr groß werden.&lt;br /&gt;
&lt;br /&gt;
=== Proprietäre Formate ===&lt;br /&gt;
&lt;br /&gt;
Formate, die nicht ohne Zusatzsoftware betrachtet werden können. Dazu gehören z.&amp;amp;nbsp;B. Schaltpläne/Layouts im Eagle-Format (.sch/.brd) oder Schaltpläne im LTSpice-Format (.asc).&lt;br /&gt;
&lt;br /&gt;
== Mehrere Dateien zusammenfassen ==&lt;br /&gt;
&lt;br /&gt;
Weder PNG, noch GIF, noch JPG kann man sinnvoll mit ZIP, RAR und welchem Packer auch immer weiter verkleinern, denn all diese Formate sind schon komprimiert! Einzig dann, wenn man mehrere Bilder hochladen und den Thread übersichtlich halten möchte, kann der Einsatz eines Packprogramms sinnvoll sein, um einfach mehrere Dateien zu einem Archiv zusammenzufassen. Dabei sollte man &#039;&#039;&#039;nur das ZIP-Format&#039;&#039;&#039; verwenden. Diese lassen sich unter so gut wie allen aktuellen Betriebssystemen mit Bordmitteln öffnen. RAR und andere Formate mögen zwar vielleicht ein paar Prozente kleiner packen, aber es ist nervig, wenn man sich erst noch ein Programm zum Auspacken suchen muss.&lt;br /&gt;
&lt;br /&gt;
== Zusammenfassung ==&lt;br /&gt;
&lt;br /&gt;
*Photos, Scans : JPG mit ca. 40% bis 70% Kompression&lt;br /&gt;
*Technische Zeichnungen und Screenshots : PNG&lt;br /&gt;
*PDF ist universell für nahezu alles geeignet&lt;br /&gt;
*Mehrere Dateien zusammenfassen: ZIP&lt;br /&gt;
&lt;br /&gt;
Eine schöne Abhandlung über das Thema findet sich bei [http://www.freiesmagazin.de/mobil/freiesMagazin-2011-05-bilder.html#11_05_bildoptimierung freiesmagazin.de].&lt;br /&gt;
&lt;br /&gt;
== Hall of Shame ==&lt;br /&gt;
(&amp;lt;strike&amp;gt;Leider&amp;lt;/strike&amp;gt; Zum Glück wurden die Bilddateien von den Moderatoren nachträglich modifiziert/verkleinert)&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/113261#1010923] Screenshots als BMP! für ein paar Zeilen Code, aber wenigstens mit ZIP komprimiert,&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/111911#995634] Bild viel zu hoch aufgelöst, 180MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/92715#795286] Saumässiger Scan trotz hoher Auflösung, wahrscheinlich als BMP in PDF gedruckt, 541 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/141996#1310490] Bild viel zu hoch aufgelöst, 802&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/137510#1257789] Bild viel zu hoch aufgelöst, 451 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/110222#977025] Total unscharf und viel zu hoch aufgelöst, 117MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/125590#1146720] Total unscharf und viel zu hoch aufgelöst, 325MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/149705#1401405] Total unscharf, 330MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/120075#1085431] Brille Fielmann?, 347MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/157302#1489930] Bild viel zu hoch  aufgelöst, 700MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/79464#678932] Ein Screenshot, der leider ins Knie ging, 318MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/111726#1036323] Vier viel zu hochaufgelöste Bilder von Bastelkram, 1254 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/147862#1379257] Total unscharf und viel zu hoch aufgelöst, 228 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/114555#1029194] Viel zu hoch aufgelöst, 1273 MB &lt;br /&gt;
* [http://www.mikrocontroller.net/topic/99177#859882]  Unscharf und viel zu hoch aufgelöst, 680MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/115459#1034095] Viel zu hoch aufgelöst, 698 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/146264#1359458] Vollkommen unscharf&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/122808#1117286] Viel zu hoch aufgelöst und teilweise unscharf durch Blitzlicht, 800MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/143205#1324456] Photo im PNG-Format, 1832MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/77593#662242] Viel zu hoch aufgelöst, 2439MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/109365#967514] Viel zu hoch aufgelöst, 315 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/144723#1341977] Ausnahmefall, sollte besser auf einem anderen Server gespeichert werden und nur ein Link geposter werden, 13649MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/143079#1322849] Viel zu hoch aufgelöst, 902 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/88492#751608] Viel zu hoch aufgelöst, 894MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/87432#745357] Viel zu hoch aufgelöst, 2874MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/151621#1449922] Noch so ein toller &amp;quot;Screenshot&amp;quot;, 174MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/157741#1493111] Viel zuviel unwichtiges Drumherum, 64MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/114544#1025880] Viel zu hoch aufgelöst, 70MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/146264] Was ist das?&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/189323#1844014] fast halbes Mb (für was) wofür?&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/195518#1916565] 1.7 MB für ein Drahtverhau, 50kB reichen auch&lt;br /&gt;
&lt;br /&gt;
Summe des Datentransfermülls: 32,3 GB! Das hätte man locker mit 1/10 und weniger schaffen können.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Tipps für Autoren]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Bildformate&amp;diff=60855</id>
		<title>Bildformate</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Bildformate&amp;diff=60855"/>
		<updated>2011-09-30T23:14:54Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Technische Zeichnungen: SVG oder PNG */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Das Problem ==&lt;br /&gt;
&lt;br /&gt;
Will man im Forum eine Antwort erhalten, dann sollte man es den anderen Forenteilnehmern so leicht wie möglich machen, sich die dazugehörigen Abbildungen anzusehen. Muss man die Dateien erst speichern oder gar ein Archiv entpacken und danach ein externes Programm benutzen, um die Dateien anzusehen, wird die Resonanz signifikant geringer sein, als hätte man einfach nur draufklicken müssen, um es gleich im Browser zu betrachen.&lt;br /&gt;
&lt;br /&gt;
Desweiteren kommt es immer wieder dazu, daß sich Forenteilnehmer &amp;quot;im Format vergreifen&amp;quot;. Da werden dann eigentlich kleine und mit wenig Farben ausgestattete Zeichnungen zu Dateimonstern von 1 MB und mehr. Das muss nicht sein, auch nicht im DSL-Zeitalter. Es gibt schon genug Datenmüll im Internet. Ausserdem sind immer noch eine gewisse Anzahl von Leuten per Modem im Internet unterwegs, an die sollte man auch ein klein wenig denken. Zu guter Letzt gilt &amp;quot;Klasse statt Masse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Vielleicht gar kein Bild? ==&lt;br /&gt;
&lt;br /&gt;
Manchmal ist es angebracht, überhaupt nichts anzuhängen. Beispielsweise ist das oft der Fall bei Datenblättern: Statt die möglicherweise hundertste Version des Datenblattes heraufzuladen, wäre ein Link deutlich angebrachter. Einerseits sind damit etwaige rechtliche Probleme schnell ausgeräumt, andererseits stolpert ein Leser in einiger Zeit nicht über ein womöglich bereits veraltetes Dokument.&lt;br /&gt;
&lt;br /&gt;
Für einen Leser kann es auch durchaus sinnvoll sein, zu wissen, woher ein Dokument stammt: etwa um weitergehende Recherche zu betreiben. Zumindest eine brauchbare Quellenangabe ist jedoch Pflicht, wenn schon Material von externen Seiten entnommen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Welches Format für welches Bild? ==&lt;br /&gt;
&lt;br /&gt;
=== Photos und Scans: JPG ===&lt;br /&gt;
&lt;br /&gt;
Photos sollten im &#039;&#039;&#039;JPG&#039;&#039;&#039;-Format abgespeichert werden. JPG bzw. JPEG (&#039;&#039;&#039;J&#039;&#039;&#039;oint &#039;&#039;&#039;P&#039;&#039;&#039;icture &#039;&#039;&#039;E&#039;&#039;&#039;xpert &#039;&#039;&#039;G&#039;&#039;&#039;roup) ist ein speziell für Echtfarbgrafiken (True Color) entwickeltes Bildformat. Es ermöglicht die Speicherung von Photos in 24 Bit Farbauflösung bei relativ geringem Speicherverbrauch. So hat z.&amp;amp;nbsp;B. ein Bild einer 2 Megapixel Digitalkamera (1600x1200 Punkte) einen Speicherbedarf von 6 MB ohne Kompression. Mit JPG und mittlerer Kompressionseinstellung sind es nur noch ca. 500 kB. Die Bilder werden dabei jedoch &#039;&#039;&#039;verlustbehaftet&#039;&#039;&#039; komprimiert. Das heißt sowohl Farben als auch Strukturen werden nicht eins zu eins abgespeichert, sondern mittels cleverer Mathematik soweit verarbeitet, dass speicherintensive Details rausfallen. Im Normalfall sieht man das nicht.&lt;br /&gt;
&lt;br /&gt;
Da jedoch 2 Megapixel heute eher zum alten Eisen gehören haben viele Leute Kameras mit 5 Megapixel und mehr. Und da man ja auch auf Qualität bedacht ist, ist meist auch nur eine geringe Kompression der Bilder eingestellt (hohe Qualität, Superfein etc.). &#039;&#039;&#039;Bitte solche Bilder nicht direkt im Forum posten.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Mit ein paar wenigen Handgriffen kann man die Bilder &#039;&#039;&#039;netztauglich&#039;&#039;&#039; machen. Dazu braucht man nur ein normales, kostenloses Bildbearbeitungsprogramm wie z.&amp;amp;nbsp;B. [http://www.irfanview.de/ Irfanview] oder [http://www.gimp.org/ GIMP].&lt;br /&gt;
&lt;br /&gt;
* Kompression erhöhen, einstellbar in den Speicheroptionen für JPG; 30% ist ein guter Kompromiss aus Qualität und Kompression&lt;br /&gt;
* Bildauschnitt auf das Wesentliche konzentrieren; ein kleiner IC der nur 1/10 der Bildfläche einnimmt, ist etwas &amp;quot;verloren&amp;quot;&lt;br /&gt;
* Auflösung reduzieren; niemand braucht 4000x3000 für die Art der hier geposteten Bilder; 1600x1200 oder weniger ist oft ausreichend&lt;br /&gt;
* Beim Fotografieren von ICs und Leiterplatten den Macromodus verwenden (meist ein Blumensymbol), damit werden kleine, nahe Objekte scharf abgebildet.&lt;br /&gt;
* Auf die Bildschärfe achten, völlig verwaschene Schatten nützen niemanden etwas&lt;br /&gt;
* Platinen kann man sehr gut mit einem Scanner abbilden&lt;br /&gt;
&lt;br /&gt;
=== Technische Zeichnungen: SVG oder PNG ===&lt;br /&gt;
&lt;br /&gt;
Zu Technischen Zeichnungen gehören&lt;br /&gt;
&lt;br /&gt;
*Schaltpläne&lt;br /&gt;
*Layouts&lt;br /&gt;
*Mechanische Zeichungen&lt;br /&gt;
*Screenshot&lt;br /&gt;
&lt;br /&gt;
Wesentliche Merkmale dieser Zeichungen sind&lt;br /&gt;
&lt;br /&gt;
*relativ wenig Farben&lt;br /&gt;
*feine Strukturen (Linien, Leiterbahnen)&lt;br /&gt;
&lt;br /&gt;
Werden solche Zeichnungen nun als JPG gespeichert kommt es zu sogenannten &#039;&#039;&#039;Kompressionsartefakten&#039;&#039;&#039; (verwaschene Kanten, &amp;quot;Pickel&amp;quot; in gleichmässigen Flächen, unscharfe Texte). Der Kompressionsalgorithmus von JPG ist darauf spezialisiert kleine Details &amp;quot;wegzuwischen&amp;quot;, um Speicher zu sparen. Das ist aber gerade hier kontraproduktiv! Technische Zeichnungen brauchen Details! Außerdem wird das Bild bei JPG immer mit 24 Bit Farbtiefe verarbeitet. Das ist Platzverschwendung, die meisten Technischen Zeichnungen kommen mit 16 oder 256 Farben bequem aus.&lt;br /&gt;
&lt;br /&gt;
Deshalb speichert man Technische Zeichnungen sinnvollerweise nur im &#039;&#039;&#039;PNG&#039;&#039;&#039;-Format (&#039;&#039;&#039;P&#039;&#039;&#039;ortable &#039;&#039;&#039;N&#039;&#039;&#039;etwork &#039;&#039;&#039;G&#039;&#039;&#039;raphic). PNG ist die Weiterentwicklung von &#039;&#039;&#039;GIF&#039;&#039;&#039; (&#039;&#039;&#039;G&#039;&#039;&#039;raphic &#039;&#039;&#039;I&#039;&#039;&#039;nterchange &#039;&#039;&#039;F&#039;&#039;&#039;ormat), welches ursprünglich von der Firma Compuserve als erstes Format für Netzwerkgrafiken entwickelt wurde. PNG komprimiert Bilder &#039;&#039;&#039;verlustfrei&#039;&#039;&#039;, d.h. das Bild wird 1:1 in Struktur und Farbe gespeichert. GIF kann dagegen nur 256 Farben speichern, die Struktur bleibt aber auch 1:1 erhalten. Für animierte GIFs gibt es bis jetzt keine verbreitete Alternative. Obwohl der Patentschutz von GIF mittlerweile abgelaufen ist, sollte man GIF nicht mehr verwenden, weil&lt;br /&gt;
&lt;br /&gt;
* PNG beliebige Farbtiefen von 1..24 Bit unterstützt (GIF nur 8 Bit)&lt;br /&gt;
* die Kompression von PNG geringfügig besser ist als GIF&lt;br /&gt;
&lt;br /&gt;
Eine Anmerkung zu Screenshots:&lt;br /&gt;
Häufig ist auf dem Rechner ein [http://de.wikipedia.org/wiki/Subpixel-Rendering Subpixel-Rendering] (vertikale Kantenglättung) namens &#039;&#039;&#039;ClearType&#039;&#039;&#039; oder &#039;&#039;&#039;CoolType&#039;&#039;&#039; aktiviert. Das führt dazu, dass:&lt;br /&gt;
&lt;br /&gt;
* Screenshots unnötig groß werden (lassen sich schlechter komprimieren)&lt;br /&gt;
* auf nicht kompatiblen Monitoren, etwa Beamern, beim Betrachter Farbsäume und Unschärfen zeigen&lt;br /&gt;
* beim Vergrößern und Verkleinen lustige (oder unverständliche) Effekte aufweisen&lt;br /&gt;
&lt;br /&gt;
Wer also einen &#039;&#039;guten&#039;&#039; Screenshot machen möchte, sollte vorher das Subpixel-Rendering ausschalten.&lt;br /&gt;
&lt;br /&gt;
Bei Fenstern &#039;&#039;mit runden Ecken oder Semitransparenz&#039;&#039; ist es sinnvoll, dieses vorher vor einen weißen Hintergrund zu setzen (etwa einem Web-Browser mit der URL &#039;&#039;&#039;about:blank&#039;&#039;&#039;). Screenshotprogramme, die dafür Alpha-Transparenz benutzen, sind nicht bekannt.&lt;br /&gt;
&lt;br /&gt;
== Universalformat PDF ==&lt;br /&gt;
&lt;br /&gt;
Das Format [http://de.wikipedia.org/wiki/Portable_Document_Format PDF] wurde vor langer Zeit von der Firma [http://www.adobe.com Adobe] entwickelt und hat sich schon lange als de-facto-Standard etabliert. Es ist auf allen gängigen Betriebssystemen lesbar. Es ist relativ kompakt (kleine Dateigrößen) und kann sowohl JPG, PNG als auch vektorbasierte Grafiken enthalten. Viele Programme bieten sowohl direkt einen Export als PDF an, oder man kann mittels Software ein PDF &amp;quot;drucken&amp;quot;, sprich anstatt eines echten Druckers, welcher Papier ausspuckt, wird eine PDF-Datei erzeugt.&lt;br /&gt;
&lt;br /&gt;
=== PDF generieren ===&lt;br /&gt;
&lt;br /&gt;
Gerade die Einbindung von Bildern und Grafiken erfordert etwas Feingefühl mit dem PDF-Generatorprogramm. Viele Generatoren sind so voreingestellt, jede Rastergrafik per JPG zu komprimieren, wodurch eine – womöglich sogar als unkomprimierte 1-bpp-Bitmap recht kleine – Grafikdatei zu einem verwaschenen (JPG-Artefakte) Monster regelrecht explodieren (Dateigröße) kann.&lt;br /&gt;
&lt;br /&gt;
Am besten fährt man, wenn man ausschließlich Vektorgrafiken beim Erstellen verwendet. Dann bleibt auch das Ergebnis gestochen scharf (insbesondere beim Vergrößern und Ausdrucken) und dennoch klein (Dateigröße). Außerdem bleiben Textanmerkungen in der Grafik durchsuchbar, sofern der Text nicht vektorisiert wurde.&lt;br /&gt;
&lt;br /&gt;
== Export mit CAD-Programmen ==&lt;br /&gt;
&lt;br /&gt;
=== Eagle ===&lt;br /&gt;
&lt;br /&gt;
Das weit verbreitete Schaltplan- und Layoutprogramm [[Eagle| EAGLE]] bietet direkt die Möglichkeit, Schaltpläne und Layouts als PNG-Bild zu exportieren (Menu File-&amp;gt;Export-&amp;gt;Image). Aber bitte nicht die Auflösung zu hoch einstellen! Die Voreinstellung von 150 dpi ist meist optimal für Schaltpläne. Layouts sind manchmal in 300dpi sinnvoll. &#039;&#039;&#039;Vorsicht!&#039;&#039;&#039; Es gibt einen kleinen Bug. Wenn man in der erscheinenden Dateiauswahlbox auf *.png umstellt, &#039;&#039;&#039;muss&#039;&#039;&#039; man auch einen Dateinamen mit .png Endung hinschreiben, sonst springt Eagle wieder zurück auf BMP Format!&lt;br /&gt;
&lt;br /&gt;
Ab Version 5 kann Eagle auch als PDF-Datei exportieren (man findet diese Option allerdings nicht im Datei-&amp;gt;Exportieren...-Menü, sondern unter Datei-&amp;gt;Drucken). Das hat den Vorteil, dass eine echte Vektorgrafik exportiert wird. Somit kann man beliebig zoomen, und die Datei ist sehr klein.&lt;br /&gt;
&lt;br /&gt;
==== Von Enthusiasten geschriebene Programme ====&lt;br /&gt;
&lt;br /&gt;
Als ULP (User Language Program) gibt es Export-Programme für die Vektorformate EPS, SVG, GCM, WMF und EMF, mit unterschiedlicher Wiedergabetreue.&lt;br /&gt;
Diese eignen sich insbesondere für die Weiterverwendung in Office-Programmen.&lt;br /&gt;
&lt;br /&gt;
Für eine realitätsnahe Leiterplattenansicht gibt es Eagle3D als ziemlich umfangreiches ULP. Zum Rendern der entstehenden Zwischendatei wird &#039;&#039;&#039;Povray&#039;&#039;&#039; benötigt.&lt;br /&gt;
&lt;br /&gt;
== Formate die man meiden sollte ==&lt;br /&gt;
&lt;br /&gt;
=== Nie wieder BMP! ===&lt;br /&gt;
&lt;br /&gt;
Das Format BMP sollte man gänzlich meiden! Es ist ein unkomprimiertes oder RLE-komprimiertes Format und die Dateien sind &#039;&#039;&#039;riesig&#039;&#039;&#039;!&lt;br /&gt;
BMP-Dateien werden von der Forensoftware serverseitig automatisch nach PNG konvertiert!&lt;br /&gt;
&lt;br /&gt;
=== TIFF ===&lt;br /&gt;
&lt;br /&gt;
Dieses Format teilt sich in etliche Unterformate, die meist nicht von allen Programmen unterstützt werden. Insbesondere ist die Unterstützung bei Webbrowsern sehr schlecht. TIFF-Dateien (Endung meist .TIF) können je nach Unterformat sehr groß werden.&lt;br /&gt;
&lt;br /&gt;
=== Proprietäre Formate ===&lt;br /&gt;
&lt;br /&gt;
Formate, die nicht ohne Zusatzsoftware betrachtet werden können. Dazu gehören z.&amp;amp;nbsp;B. Schaltpläne/Layouts im Eagle-Format (.sch/.brd) oder Schaltpläne im LTSpice-Format (.asc).&lt;br /&gt;
&lt;br /&gt;
== Mehrere Dateien zusammenfassen ==&lt;br /&gt;
&lt;br /&gt;
Weder PNG, noch GIF, noch JPG kann man sinnvoll mit ZIP, RAR und welchem Packer auch immer weiter verkleinern, denn all diese Formate sind schon komprimiert! Einzig dann, wenn man mehrere Bilder hochladen und den Thread übersichtlich halten möchte, kann der Einsatz eines Packprogramms sinnvoll sein, um einfach mehrere Dateien zu einem Archiv zusammenzufassen. Dabei sollte man &#039;&#039;&#039;nur das ZIP-Format&#039;&#039;&#039; verwenden. Diese lassen sich unter so gut wie allen aktuellen Betriebssystemen mit Bordmitteln öffnen. RAR und andere Formate mögen zwar vielleicht ein paar Prozente kleiner packen, aber es ist nervig, wenn man sich erst noch ein Programm zum Auspacken suchen muss.&lt;br /&gt;
&lt;br /&gt;
== Zusammenfassung ==&lt;br /&gt;
&lt;br /&gt;
*Photos, Scans : JPG mit ca. 40% bis 70% Kompression&lt;br /&gt;
*Technische Zeichnungen und Screenshots : PNG&lt;br /&gt;
*PDF ist universell für nahezu alles geeignet&lt;br /&gt;
*Mehrere Dateien zusammenfassen: ZIP&lt;br /&gt;
&lt;br /&gt;
Eine schöne Abhandlung über das Thema findet sich bei [http://www.freiesmagazin.de/mobil/freiesMagazin-2011-05-bilder.html#11_05_bildoptimierung freiesmagazin.de].&lt;br /&gt;
&lt;br /&gt;
== Hall of Shame ==&lt;br /&gt;
(&amp;lt;strike&amp;gt;Leider&amp;lt;/strike&amp;gt; Zum Glück wurden die Bilddateien von den Moderatoren nachträglich modifiziert/verkleinert)&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/113261#1010923] Screenshots als BMP! für ein paar Zeilen Code, aber wenigstens mit ZIP komprimiert,&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/111911#995634] Bild viel zu hoch aufgelöst, 180MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/92715#795286] Saumässiger Scan trotz hoher Auflösung, wahrscheinlich als BMP in PDF gedruckt, 541 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/141996#1310490] Bild viel zu hoch aufgelöst, 802&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/137510#1257789] Bild viel zu hoch aufgelöst, 451 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/110222#977025] Total unscharf und viel zu hoch aufgelöst, 117MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/125590#1146720] Total unscharf und viel zu hoch aufgelöst, 325MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/149705#1401405] Total unscharf, 330MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/120075#1085431] Brille Fielmann?, 347MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/157302#1489930] Bild viel zu hoch  aufgelöst, 700MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/79464#678932] Ein Screenshot, der leider ins Knie ging, 318MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/111726#1036323] Vier viel zu hochaufgelöste Bilder von Bastelkram, 1254 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/147862#1379257] Total unscharf und viel zu hoch aufgelöst, 228 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/114555#1029194] Viel zu hoch aufgelöst, 1273 MB &lt;br /&gt;
* [http://www.mikrocontroller.net/topic/99177#859882]  Unscharf und viel zu hoch aufgelöst, 680MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/115459#1034095] Viel zu hoch aufgelöst, 698 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/146264#1359458] Vollkommen unscharf&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/122808#1117286] Viel zu hoch aufgelöst und teilweise unscharf durch Blitzlicht, 800MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/143205#1324456] Photo im PNG-Format, 1832MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/77593#662242] Viel zu hoch aufgelöst, 2439MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/109365#967514] Viel zu hoch aufgelöst, 315 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/144723#1341977] Ausnahmefall, sollte besser auf einem anderen Server gespeichert werden und nur ein Link geposter werden, 13649MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/143079#1322849] Viel zu hoch aufgelöst, 902 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/88492#751608] Viel zu hoch aufgelöst, 894MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/87432#745357] Viel zu hoch aufgelöst, 2874MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/151621#1449922] Noch so ein toller &amp;quot;Screenshot&amp;quot;, 174MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/157741#1493111] Viel zuviel unwichtiges Drumherum, 64MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/114544#1025880] Viel zu hoch aufgelöst, 70MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/146264] Was ist das?&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/189323#1844014] fast halbes Mb (für was) wofür?&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/195518#1916565] 1.7 MB für ein Drahtverhau, 50kB reichen auch&lt;br /&gt;
&lt;br /&gt;
Summe des Datentransfermülls: 32,3 GB! Das hätte man locker mit 1/10 und weniger schaffen können.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Tipps für Autoren]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Bildformate&amp;diff=60853</id>
		<title>Bildformate</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Bildformate&amp;diff=60853"/>
		<updated>2011-09-30T22:53:36Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Eagle */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Das Problem ==&lt;br /&gt;
&lt;br /&gt;
Will man im Forum eine Antwort erhalten, dann sollte man es den anderen Forenteilnehmern so leicht wie möglich machen, sich die dazugehörigen Abbildungen anzusehen. Muss man die Dateien erst speichern oder gar ein Archiv entpacken und danach ein externes Programm benutzen, um die Dateien anzusehen, wird die Resonanz signifikant geringer sein, als hätte man einfach nur draufklicken müssen, um es gleich im Browser zu betrachen.&lt;br /&gt;
&lt;br /&gt;
Desweiteren kommt es immer wieder dazu, daß sich Forenteilnehmer &amp;quot;im Format vergreifen&amp;quot;. Da werden dann eigentlich kleine und mit wenig Farben ausgestattete Zeichnungen zu Dateimonstern von 1 MB und mehr. Das muss nicht sein, auch nicht im DSL-Zeitalter. Es gibt schon genug Datenmüll im Internet. Ausserdem sind immer noch eine gewisse Anzahl von Leuten per Modem im Internet unterwegs, an die sollte man auch ein klein wenig denken. Zu guter Letzt gilt &amp;quot;Klasse statt Masse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Vielleicht gar kein Bild? ==&lt;br /&gt;
&lt;br /&gt;
Manchmal ist es angebracht, überhaupt nichts anzuhängen. Beispielsweise ist das oft der Fall bei Datenblättern: Statt die möglicherweise hundertste Version des Datenblattes heraufzuladen, wäre ein Link deutlich angebrachter. Einerseits sind damit etwaige rechtliche Probleme schnell ausgeräumt, andererseits stolpert ein Leser in einiger Zeit nicht über ein womöglich bereits veraltetes Dokument.&lt;br /&gt;
&lt;br /&gt;
Für einen Leser kann es auch durchaus sinnvoll sein, zu wissen, woher ein Dokument stammt: etwa um weitergehende Recherche zu betreiben. Zumindest eine brauchbare Quellenangabe ist jedoch Pflicht, wenn schon Material von externen Seiten entnommen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Welches Format für welches Bild? ==&lt;br /&gt;
&lt;br /&gt;
=== Photos und Scans: JPG ===&lt;br /&gt;
&lt;br /&gt;
Photos sollten im &#039;&#039;&#039;JPG&#039;&#039;&#039;-Format abgespeichert werden. JPG bzw. JPEG (&#039;&#039;&#039;J&#039;&#039;&#039;oint &#039;&#039;&#039;P&#039;&#039;&#039;icture &#039;&#039;&#039;E&#039;&#039;&#039;xpert &#039;&#039;&#039;G&#039;&#039;&#039;roup) ist ein speziell für Echtfarbgrafiken (True Color) entwickeltes Bildformat. Es ermöglicht die Speicherung von Photos in 24 Bit Farbauflösung bei relativ geringem Speicherverbrauch. So hat z.&amp;amp;nbsp;B. ein Bild einer 2 Megapixel Digitalkamera (1600x1200 Punkte) einen Speicherbedarf von 6 MB ohne Kompression. Mit JPG und mittlerer Kompressionseinstellung sind es nur noch ca. 500 kB. Die Bilder werden dabei jedoch &#039;&#039;&#039;verlustbehaftet&#039;&#039;&#039; komprimiert. Das heißt sowohl Farben als auch Strukturen werden nicht eins zu eins abgespeichert, sondern mittels cleverer Mathematik soweit verarbeitet, dass speicherintensive Details rausfallen. Im Normalfall sieht man das nicht.&lt;br /&gt;
&lt;br /&gt;
Da jedoch 2 Megapixel heute eher zum alten Eisen gehören haben viele Leute Kameras mit 5 Megapixel und mehr. Und da man ja auch auf Qualität bedacht ist, ist meist auch nur eine geringe Kompression der Bilder eingestellt (hohe Qualität, Superfein etc.). &#039;&#039;&#039;Bitte solche Bilder nicht direkt im Forum posten.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Mit ein paar wenigen Handgriffen kann man die Bilder &#039;&#039;&#039;netztauglich&#039;&#039;&#039; machen. Dazu braucht man nur ein normales, kostenloses Bildbearbeitungsprogramm wie z.&amp;amp;nbsp;B. [http://www.irfanview.de/ Irfanview] oder [http://www.gimp.org/ GIMP].&lt;br /&gt;
&lt;br /&gt;
* Kompression erhöhen, einstellbar in den Speicheroptionen für JPG; 30% ist ein guter Kompromiss aus Qualität und Kompression&lt;br /&gt;
* Bildauschnitt auf das Wesentliche konzentrieren; ein kleiner IC der nur 1/10 der Bildfläche einnimmt, ist etwas &amp;quot;verloren&amp;quot;&lt;br /&gt;
* Auflösung reduzieren; niemand braucht 4000x3000 für die Art der hier geposteten Bilder; 1600x1200 oder weniger ist oft ausreichend&lt;br /&gt;
* Beim Fotografieren von ICs und Leiterplatten den Macromodus verwenden (meist ein Blumensymbol), damit werden kleine, nahe Objekte scharf abgebildet.&lt;br /&gt;
* Auf die Bildschärfe achten, völlig verwaschene Schatten nützen niemanden etwas&lt;br /&gt;
* Platinen kann man sehr gut mit einem Scanner abbilden&lt;br /&gt;
&lt;br /&gt;
=== Technische Zeichnungen: SVG oder PNG ===&lt;br /&gt;
&lt;br /&gt;
Zu Technischen Zeichnungen gehören&lt;br /&gt;
&lt;br /&gt;
*Schaltpläne&lt;br /&gt;
*Layouts&lt;br /&gt;
*Mechanische Zeichungen&lt;br /&gt;
*Screenshot&lt;br /&gt;
&lt;br /&gt;
Wesentliche Merkmale dieser Zeichungen sind&lt;br /&gt;
&lt;br /&gt;
*relativ wenig Farben&lt;br /&gt;
*feine Strukturen (Linien, Leiterbahnen)&lt;br /&gt;
&lt;br /&gt;
Werden solche Zeichnungen nun als JPG gespeichert kommt es zu sogenannten &#039;&#039;&#039;Kompressionsartefakten&#039;&#039;&#039; (verwaschene Kanten, &amp;quot;Pickel&amp;quot; in gleichmässigen Flächen, unscharfe Texte). Der Kompressionsalgorithmus von JPG ist darauf spezialisiert kleine Details &amp;quot;wegzuwischen&amp;quot;, um Speicher zu sparen. Das ist aber gerade hier kontraproduktiv! Technische Zeichnungen brauchen Details! Außerdem wird das Bild bei JPG immer mit 24 Bit Farbtiefe verarbeitet. Das ist Platzverschwendung, die meisten Technischen Zeichnungen kommen mit 16 oder 256 Farben bequem aus.&lt;br /&gt;
&lt;br /&gt;
Deshalb speichert man Technische Zeichnungen sinnvollerweise nur im &#039;&#039;&#039;PNG&#039;&#039;&#039;-Format (&#039;&#039;&#039;P&#039;&#039;&#039;ortable &#039;&#039;&#039;N&#039;&#039;&#039;etwork &#039;&#039;&#039;G&#039;&#039;&#039;raphic). PNG ist die Weiterentwicklung von &#039;&#039;&#039;GIF&#039;&#039;&#039; (&#039;&#039;&#039;G&#039;&#039;&#039;raphic &#039;&#039;&#039;I&#039;&#039;&#039;nterchange &#039;&#039;&#039;F&#039;&#039;&#039;ormat), welches ursprünglich von der Firma Compuserve als erstes Format für Netzwerkgrafiken entwickelt wurde. PNG komprimiert Bilder &#039;&#039;&#039;verlustfrei&#039;&#039;&#039;, d.h. das Bild wird 1:1 in Struktur und Farbe gespeichert. GIF kann dagegen nur 256 Farben speichern, die Struktur bleibt aber auch 1:1 erhalten. Für animierte GIFs gibt es bis jetzt keine verbreitete Alternative. Obwohl der Patentschutz von GIF mittlerweile abgelaufen ist, sollte man GIF nicht mehr verwenden, weil&lt;br /&gt;
&lt;br /&gt;
* PNG beliebige Farbtiefen von 1..24 Bit unterstützt (GIF nur 8 Bit)&lt;br /&gt;
* die Kompression von PNG geringfügig besser ist als GIF&lt;br /&gt;
&lt;br /&gt;
== Universalformat PDF ==&lt;br /&gt;
&lt;br /&gt;
Das Format [http://de.wikipedia.org/wiki/Portable_Document_Format PDF] wurde vor langer Zeit von der Firma [http://www.adobe.com Adobe] entwickelt und hat sich schon lange als de-facto-Standard etabliert. Es ist auf allen gängigen Betriebssystemen lesbar. Es ist relativ kompakt (kleine Dateigrößen) und kann sowohl JPG, PNG als auch vektorbasierte Grafiken enthalten. Viele Programme bieten sowohl direkt einen Export als PDF an, oder man kann mittels Software ein PDF &amp;quot;drucken&amp;quot;, sprich anstatt eines echten Druckers, welcher Papier ausspuckt, wird eine PDF-Datei erzeugt.&lt;br /&gt;
&lt;br /&gt;
=== PDF generieren ===&lt;br /&gt;
&lt;br /&gt;
Gerade die Einbindung von Bildern und Grafiken erfordert etwas Feingefühl mit dem PDF-Generatorprogramm. Viele Generatoren sind so voreingestellt, jede Rastergrafik per JPG zu komprimieren, wodurch eine – womöglich sogar als unkomprimierte 1-bpp-Bitmap recht kleine – Grafikdatei zu einem verwaschenen (JPG-Artefakte) Monster regelrecht explodieren (Dateigröße) kann.&lt;br /&gt;
&lt;br /&gt;
Am besten fährt man, wenn man ausschließlich Vektorgrafiken beim Erstellen verwendet. Dann bleibt auch das Ergebnis gestochen scharf (insbesondere beim Vergrößern und Ausdrucken) und dennoch klein (Dateigröße). Außerdem bleiben Textanmerkungen in der Grafik durchsuchbar, sofern der Text nicht vektorisiert wurde.&lt;br /&gt;
&lt;br /&gt;
== Export mit CAD-Programmen ==&lt;br /&gt;
&lt;br /&gt;
=== Eagle ===&lt;br /&gt;
&lt;br /&gt;
Das weit verbreitete Schaltplan- und Layoutprogramm [[Eagle| EAGLE]] bietet direkt die Möglichkeit, Schaltpläne und Layouts als PNG-Bild zu exportieren (Menu File-&amp;gt;Export-&amp;gt;Image). Aber bitte nicht die Auflösung zu hoch einstellen! Die Voreinstellung von 150 dpi ist meist optimal für Schaltpläne. Layouts sind manchmal in 300dpi sinnvoll. &#039;&#039;&#039;Vorsicht!&#039;&#039;&#039; Es gibt einen kleinen Bug. Wenn man in der erscheinenden Dateiauswahlbox auf *.png umstellt, &#039;&#039;&#039;muss&#039;&#039;&#039; man auch einen Dateinamen mit .png Endung hinschreiben, sonst springt Eagle wieder zurück auf BMP Format!&lt;br /&gt;
&lt;br /&gt;
Ab Version 5 kann Eagle auch als PDF-Datei exportieren (man findet diese Option allerdings nicht im Datei-&amp;gt;Exportieren...-Menü, sondern unter Datei-&amp;gt;Drucken). Das hat den Vorteil, dass eine echte Vektorgrafik exportiert wird. Somit kann man beliebig zoomen, und die Datei ist sehr klein.&lt;br /&gt;
&lt;br /&gt;
==== Von Enthusiasten geschriebene Programme ====&lt;br /&gt;
&lt;br /&gt;
Als ULP (User Language Program) gibt es Export-Programme für die Vektorformate EPS, SVG, GCM, WMF und EMF, mit unterschiedlicher Wiedergabetreue.&lt;br /&gt;
Diese eignen sich insbesondere für die Weiterverwendung in Office-Programmen.&lt;br /&gt;
&lt;br /&gt;
Für eine realitätsnahe Leiterplattenansicht gibt es Eagle3D als ziemlich umfangreiches ULP. Zum Rendern der entstehenden Zwischendatei wird &#039;&#039;&#039;Povray&#039;&#039;&#039; benötigt.&lt;br /&gt;
&lt;br /&gt;
== Formate die man meiden sollte ==&lt;br /&gt;
&lt;br /&gt;
=== Nie wieder BMP! ===&lt;br /&gt;
&lt;br /&gt;
Das Format BMP sollte man gänzlich meiden! Es ist ein unkomprimiertes oder RLE-komprimiertes Format und die Dateien sind &#039;&#039;&#039;riesig&#039;&#039;&#039;!&lt;br /&gt;
BMP-Dateien werden von der Forensoftware serverseitig automatisch nach PNG konvertiert!&lt;br /&gt;
&lt;br /&gt;
=== TIFF ===&lt;br /&gt;
&lt;br /&gt;
Dieses Format teilt sich in etliche Unterformate, die meist nicht von allen Programmen unterstützt werden. Insbesondere ist die Unterstützung bei Webbrowsern sehr schlecht. TIFF-Dateien (Endung meist .TIF) können je nach Unterformat sehr groß werden.&lt;br /&gt;
&lt;br /&gt;
=== Proprietäre Formate ===&lt;br /&gt;
&lt;br /&gt;
Formate, die nicht ohne Zusatzsoftware betrachtet werden können. Dazu gehören z.&amp;amp;nbsp;B. Schaltpläne/Layouts im Eagle-Format (.sch/.brd) oder Schaltpläne im LTSpice-Format (.asc).&lt;br /&gt;
&lt;br /&gt;
== Mehrere Dateien zusammenfassen ==&lt;br /&gt;
&lt;br /&gt;
Weder PNG, noch GIF, noch JPG kann man sinnvoll mit ZIP, RAR und welchem Packer auch immer weiter verkleinern, denn all diese Formate sind schon komprimiert! Einzig dann, wenn man mehrere Bilder hochladen und den Thread übersichtlich halten möchte, kann der Einsatz eines Packprogramms sinnvoll sein, um einfach mehrere Dateien zu einem Archiv zusammenzufassen. Dabei sollte man &#039;&#039;&#039;nur das ZIP-Format&#039;&#039;&#039; verwenden. Diese lassen sich unter so gut wie allen aktuellen Betriebssystemen mit Bordmitteln öffnen. RAR und andere Formate mögen zwar vielleicht ein paar Prozente kleiner packen, aber es ist nervig, wenn man sich erst noch ein Programm zum Auspacken suchen muss.&lt;br /&gt;
&lt;br /&gt;
== Zusammenfassung ==&lt;br /&gt;
&lt;br /&gt;
*Photos, Scans : JPG mit ca. 40% bis 70% Kompression&lt;br /&gt;
*Technische Zeichnungen und Screenshots : PNG&lt;br /&gt;
*PDF ist universell für nahezu alles geeignet&lt;br /&gt;
*Mehrere Dateien zusammenfassen: ZIP&lt;br /&gt;
&lt;br /&gt;
Eine schöne Abhandlung über das Thema findet sich bei [http://www.freiesmagazin.de/mobil/freiesMagazin-2011-05-bilder.html#11_05_bildoptimierung freiesmagazin.de].&lt;br /&gt;
&lt;br /&gt;
== Hall of Shame ==&lt;br /&gt;
(&amp;lt;strike&amp;gt;Leider&amp;lt;/strike&amp;gt; Zum Glück wurden die Bilddateien von den Moderatoren nachträglich modifiziert/verkleinert)&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/113261#1010923] Screenshots als BMP! für ein paar Zeilen Code, aber wenigstens mit ZIP komprimiert,&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/111911#995634] Bild viel zu hoch aufgelöst, 180MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/92715#795286] Saumässiger Scan trotz hoher Auflösung, wahrscheinlich als BMP in PDF gedruckt, 541 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/141996#1310490] Bild viel zu hoch aufgelöst, 802&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/137510#1257789] Bild viel zu hoch aufgelöst, 451 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/110222#977025] Total unscharf und viel zu hoch aufgelöst, 117MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/125590#1146720] Total unscharf und viel zu hoch aufgelöst, 325MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/149705#1401405] Total unscharf, 330MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/120075#1085431] Brille Fielmann?, 347MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/157302#1489930] Bild viel zu hoch  aufgelöst, 700MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/79464#678932] Ein Screenshot, der leider ins Knie ging, 318MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/111726#1036323] Vier viel zu hochaufgelöste Bilder von Bastelkram, 1254 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/147862#1379257] Total unscharf und viel zu hoch aufgelöst, 228 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/114555#1029194] Viel zu hoch aufgelöst, 1273 MB &lt;br /&gt;
* [http://www.mikrocontroller.net/topic/99177#859882]  Unscharf und viel zu hoch aufgelöst, 680MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/115459#1034095] Viel zu hoch aufgelöst, 698 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/146264#1359458] Vollkommen unscharf&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/122808#1117286] Viel zu hoch aufgelöst und teilweise unscharf durch Blitzlicht, 800MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/143205#1324456] Photo im PNG-Format, 1832MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/77593#662242] Viel zu hoch aufgelöst, 2439MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/109365#967514] Viel zu hoch aufgelöst, 315 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/144723#1341977] Ausnahmefall, sollte besser auf einem anderen Server gespeichert werden und nur ein Link geposter werden, 13649MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/143079#1322849] Viel zu hoch aufgelöst, 902 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/88492#751608] Viel zu hoch aufgelöst, 894MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/87432#745357] Viel zu hoch aufgelöst, 2874MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/151621#1449922] Noch so ein toller &amp;quot;Screenshot&amp;quot;, 174MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/157741#1493111] Viel zuviel unwichtiges Drumherum, 64MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/114544#1025880] Viel zu hoch aufgelöst, 70MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/146264] Was ist das?&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/189323#1844014] fast halbes Mb (für was) wofür?&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/195518#1916565] 1.7 MB für ein Drahtverhau, 50kB reichen auch&lt;br /&gt;
&lt;br /&gt;
Summe des Datentransfermülls: 32,3 GB! Das hätte man locker mit 1/10 und weniger schaffen können.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Tipps für Autoren]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Bildformate&amp;diff=60852</id>
		<title>Bildformate</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Bildformate&amp;diff=60852"/>
		<updated>2011-09-30T22:44:02Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Universalformat PDF */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Das Problem ==&lt;br /&gt;
&lt;br /&gt;
Will man im Forum eine Antwort erhalten, dann sollte man es den anderen Forenteilnehmern so leicht wie möglich machen, sich die dazugehörigen Abbildungen anzusehen. Muss man die Dateien erst speichern oder gar ein Archiv entpacken und danach ein externes Programm benutzen, um die Dateien anzusehen, wird die Resonanz signifikant geringer sein, als hätte man einfach nur draufklicken müssen, um es gleich im Browser zu betrachen.&lt;br /&gt;
&lt;br /&gt;
Desweiteren kommt es immer wieder dazu, daß sich Forenteilnehmer &amp;quot;im Format vergreifen&amp;quot;. Da werden dann eigentlich kleine und mit wenig Farben ausgestattete Zeichnungen zu Dateimonstern von 1 MB und mehr. Das muss nicht sein, auch nicht im DSL-Zeitalter. Es gibt schon genug Datenmüll im Internet. Ausserdem sind immer noch eine gewisse Anzahl von Leuten per Modem im Internet unterwegs, an die sollte man auch ein klein wenig denken. Zu guter Letzt gilt &amp;quot;Klasse statt Masse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Vielleicht gar kein Bild? ==&lt;br /&gt;
&lt;br /&gt;
Manchmal ist es angebracht, überhaupt nichts anzuhängen. Beispielsweise ist das oft der Fall bei Datenblättern: Statt die möglicherweise hundertste Version des Datenblattes heraufzuladen, wäre ein Link deutlich angebrachter. Einerseits sind damit etwaige rechtliche Probleme schnell ausgeräumt, andererseits stolpert ein Leser in einiger Zeit nicht über ein womöglich bereits veraltetes Dokument.&lt;br /&gt;
&lt;br /&gt;
Für einen Leser kann es auch durchaus sinnvoll sein, zu wissen, woher ein Dokument stammt: etwa um weitergehende Recherche zu betreiben. Zumindest eine brauchbare Quellenangabe ist jedoch Pflicht, wenn schon Material von externen Seiten entnommen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Welches Format für welches Bild? ==&lt;br /&gt;
&lt;br /&gt;
=== Photos und Scans: JPG ===&lt;br /&gt;
&lt;br /&gt;
Photos sollten im &#039;&#039;&#039;JPG&#039;&#039;&#039;-Format abgespeichert werden. JPG bzw. JPEG (&#039;&#039;&#039;J&#039;&#039;&#039;oint &#039;&#039;&#039;P&#039;&#039;&#039;icture &#039;&#039;&#039;E&#039;&#039;&#039;xpert &#039;&#039;&#039;G&#039;&#039;&#039;roup) ist ein speziell für Echtfarbgrafiken (True Color) entwickeltes Bildformat. Es ermöglicht die Speicherung von Photos in 24 Bit Farbauflösung bei relativ geringem Speicherverbrauch. So hat z.&amp;amp;nbsp;B. ein Bild einer 2 Megapixel Digitalkamera (1600x1200 Punkte) einen Speicherbedarf von 6 MB ohne Kompression. Mit JPG und mittlerer Kompressionseinstellung sind es nur noch ca. 500 kB. Die Bilder werden dabei jedoch &#039;&#039;&#039;verlustbehaftet&#039;&#039;&#039; komprimiert. Das heißt sowohl Farben als auch Strukturen werden nicht eins zu eins abgespeichert, sondern mittels cleverer Mathematik soweit verarbeitet, dass speicherintensive Details rausfallen. Im Normalfall sieht man das nicht.&lt;br /&gt;
&lt;br /&gt;
Da jedoch 2 Megapixel heute eher zum alten Eisen gehören haben viele Leute Kameras mit 5 Megapixel und mehr. Und da man ja auch auf Qualität bedacht ist, ist meist auch nur eine geringe Kompression der Bilder eingestellt (hohe Qualität, Superfein etc.). &#039;&#039;&#039;Bitte solche Bilder nicht direkt im Forum posten.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Mit ein paar wenigen Handgriffen kann man die Bilder &#039;&#039;&#039;netztauglich&#039;&#039;&#039; machen. Dazu braucht man nur ein normales, kostenloses Bildbearbeitungsprogramm wie z.&amp;amp;nbsp;B. [http://www.irfanview.de/ Irfanview] oder [http://www.gimp.org/ GIMP].&lt;br /&gt;
&lt;br /&gt;
* Kompression erhöhen, einstellbar in den Speicheroptionen für JPG; 30% ist ein guter Kompromiss aus Qualität und Kompression&lt;br /&gt;
* Bildauschnitt auf das Wesentliche konzentrieren; ein kleiner IC der nur 1/10 der Bildfläche einnimmt, ist etwas &amp;quot;verloren&amp;quot;&lt;br /&gt;
* Auflösung reduzieren; niemand braucht 4000x3000 für die Art der hier geposteten Bilder; 1600x1200 oder weniger ist oft ausreichend&lt;br /&gt;
* Beim Fotografieren von ICs und Leiterplatten den Macromodus verwenden (meist ein Blumensymbol), damit werden kleine, nahe Objekte scharf abgebildet.&lt;br /&gt;
* Auf die Bildschärfe achten, völlig verwaschene Schatten nützen niemanden etwas&lt;br /&gt;
* Platinen kann man sehr gut mit einem Scanner abbilden&lt;br /&gt;
&lt;br /&gt;
=== Technische Zeichnungen: SVG oder PNG ===&lt;br /&gt;
&lt;br /&gt;
Zu Technischen Zeichnungen gehören&lt;br /&gt;
&lt;br /&gt;
*Schaltpläne&lt;br /&gt;
*Layouts&lt;br /&gt;
*Mechanische Zeichungen&lt;br /&gt;
*Screenshot&lt;br /&gt;
&lt;br /&gt;
Wesentliche Merkmale dieser Zeichungen sind&lt;br /&gt;
&lt;br /&gt;
*relativ wenig Farben&lt;br /&gt;
*feine Strukturen (Linien, Leiterbahnen)&lt;br /&gt;
&lt;br /&gt;
Werden solche Zeichnungen nun als JPG gespeichert kommt es zu sogenannten &#039;&#039;&#039;Kompressionsartefakten&#039;&#039;&#039; (verwaschene Kanten, &amp;quot;Pickel&amp;quot; in gleichmässigen Flächen, unscharfe Texte). Der Kompressionsalgorithmus von JPG ist darauf spezialisiert kleine Details &amp;quot;wegzuwischen&amp;quot;, um Speicher zu sparen. Das ist aber gerade hier kontraproduktiv! Technische Zeichnungen brauchen Details! Außerdem wird das Bild bei JPG immer mit 24 Bit Farbtiefe verarbeitet. Das ist Platzverschwendung, die meisten Technischen Zeichnungen kommen mit 16 oder 256 Farben bequem aus.&lt;br /&gt;
&lt;br /&gt;
Deshalb speichert man Technische Zeichnungen sinnvollerweise nur im &#039;&#039;&#039;PNG&#039;&#039;&#039;-Format (&#039;&#039;&#039;P&#039;&#039;&#039;ortable &#039;&#039;&#039;N&#039;&#039;&#039;etwork &#039;&#039;&#039;G&#039;&#039;&#039;raphic). PNG ist die Weiterentwicklung von &#039;&#039;&#039;GIF&#039;&#039;&#039; (&#039;&#039;&#039;G&#039;&#039;&#039;raphic &#039;&#039;&#039;I&#039;&#039;&#039;nterchange &#039;&#039;&#039;F&#039;&#039;&#039;ormat), welches ursprünglich von der Firma Compuserve als erstes Format für Netzwerkgrafiken entwickelt wurde. PNG komprimiert Bilder &#039;&#039;&#039;verlustfrei&#039;&#039;&#039;, d.h. das Bild wird 1:1 in Struktur und Farbe gespeichert. GIF kann dagegen nur 256 Farben speichern, die Struktur bleibt aber auch 1:1 erhalten. Für animierte GIFs gibt es bis jetzt keine verbreitete Alternative. Obwohl der Patentschutz von GIF mittlerweile abgelaufen ist, sollte man GIF nicht mehr verwenden, weil&lt;br /&gt;
&lt;br /&gt;
* PNG beliebige Farbtiefen von 1..24 Bit unterstützt (GIF nur 8 Bit)&lt;br /&gt;
* die Kompression von PNG geringfügig besser ist als GIF&lt;br /&gt;
&lt;br /&gt;
== Universalformat PDF ==&lt;br /&gt;
&lt;br /&gt;
Das Format [http://de.wikipedia.org/wiki/Portable_Document_Format PDF] wurde vor langer Zeit von der Firma [http://www.adobe.com Adobe] entwickelt und hat sich schon lange als de-facto-Standard etabliert. Es ist auf allen gängigen Betriebssystemen lesbar. Es ist relativ kompakt (kleine Dateigrößen) und kann sowohl JPG, PNG als auch vektorbasierte Grafiken enthalten. Viele Programme bieten sowohl direkt einen Export als PDF an, oder man kann mittels Software ein PDF &amp;quot;drucken&amp;quot;, sprich anstatt eines echten Druckers, welcher Papier ausspuckt, wird eine PDF-Datei erzeugt.&lt;br /&gt;
&lt;br /&gt;
=== PDF generieren ===&lt;br /&gt;
&lt;br /&gt;
Gerade die Einbindung von Bildern und Grafiken erfordert etwas Feingefühl mit dem PDF-Generatorprogramm. Viele Generatoren sind so voreingestellt, jede Rastergrafik per JPG zu komprimieren, wodurch eine – womöglich sogar als unkomprimierte 1-bpp-Bitmap recht kleine – Grafikdatei zu einem verwaschenen (JPG-Artefakte) Monster regelrecht explodieren (Dateigröße) kann.&lt;br /&gt;
&lt;br /&gt;
Am besten fährt man, wenn man ausschließlich Vektorgrafiken beim Erstellen verwendet. Dann bleibt auch das Ergebnis gestochen scharf (insbesondere beim Vergrößern und Ausdrucken) und dennoch klein (Dateigröße). Außerdem bleiben Textanmerkungen in der Grafik durchsuchbar, sofern der Text nicht vektorisiert wurde.&lt;br /&gt;
&lt;br /&gt;
== Export mit CAD-Programmen ==&lt;br /&gt;
&lt;br /&gt;
=== Eagle ===&lt;br /&gt;
&lt;br /&gt;
Das weit verbreitete Schaltplan- und Layoutprogramm [[Eagle| EAGLE]] bietet direkt die Möglichkeit, Schaltpläne und Layouts als PNG-Bild zu exportieren (Menu File-&amp;gt;Export-&amp;gt;Image). Aber bitte nicht die Auflösung zu hoch einstellen! Die Voreinstellung von 150 dpi ist meist optimal für Schaltpläne. Layouts sind manchmal in 300dpi sinnvoll. &#039;&#039;&#039;Vorsicht!&#039;&#039;&#039; Es gibt einen kleinen Bug. Wenn man in der erscheinenden Dateiauswahlbox auf *.png umstellt, &#039;&#039;&#039;muss&#039;&#039;&#039; man auch einen Dateinamen mit .png Endung hinschreiben, sonst springt Eagle wieder zurück auf BMP Format!&lt;br /&gt;
&lt;br /&gt;
Ab Version 5 kann Eagle auch als PDF-Datei exportieren (man findet diese Option allerdings nicht im Datei-&amp;gt;Exportieren...-Menü, sondern unter Datei-&amp;gt;Drucken). Das hat den Vorteil, dass eine echte Vektorgrafik exportiert wird. Somit kann man beliebig zoomen, und die Datei ist sehr klein.&lt;br /&gt;
&lt;br /&gt;
== Formate die man meiden sollte ==&lt;br /&gt;
&lt;br /&gt;
=== Nie wieder BMP! ===&lt;br /&gt;
&lt;br /&gt;
Das Format BMP sollte man gänzlich meiden! Es ist ein unkomprimiertes oder RLE-komprimiertes Format und die Dateien sind &#039;&#039;&#039;riesig&#039;&#039;&#039;!&lt;br /&gt;
BMP-Dateien werden von der Forensoftware serverseitig automatisch nach PNG konvertiert!&lt;br /&gt;
&lt;br /&gt;
=== TIFF ===&lt;br /&gt;
&lt;br /&gt;
Dieses Format teilt sich in etliche Unterformate, die meist nicht von allen Programmen unterstützt werden. Insbesondere ist die Unterstützung bei Webbrowsern sehr schlecht. TIFF-Dateien (Endung meist .TIF) können je nach Unterformat sehr groß werden.&lt;br /&gt;
&lt;br /&gt;
=== Proprietäre Formate ===&lt;br /&gt;
&lt;br /&gt;
Formate, die nicht ohne Zusatzsoftware betrachtet werden können. Dazu gehören z.&amp;amp;nbsp;B. Schaltpläne/Layouts im Eagle-Format (.sch/.brd) oder Schaltpläne im LTSpice-Format (.asc).&lt;br /&gt;
&lt;br /&gt;
== Mehrere Dateien zusammenfassen ==&lt;br /&gt;
&lt;br /&gt;
Weder PNG, noch GIF, noch JPG kann man sinnvoll mit ZIP, RAR und welchem Packer auch immer weiter verkleinern, denn all diese Formate sind schon komprimiert! Einzig dann, wenn man mehrere Bilder hochladen und den Thread übersichtlich halten möchte, kann der Einsatz eines Packprogramms sinnvoll sein, um einfach mehrere Dateien zu einem Archiv zusammenzufassen. Dabei sollte man &#039;&#039;&#039;nur das ZIP-Format&#039;&#039;&#039; verwenden. Diese lassen sich unter so gut wie allen aktuellen Betriebssystemen mit Bordmitteln öffnen. RAR und andere Formate mögen zwar vielleicht ein paar Prozente kleiner packen, aber es ist nervig, wenn man sich erst noch ein Programm zum Auspacken suchen muss.&lt;br /&gt;
&lt;br /&gt;
== Zusammenfassung ==&lt;br /&gt;
&lt;br /&gt;
*Photos, Scans : JPG mit ca. 40% bis 70% Kompression&lt;br /&gt;
*Technische Zeichnungen und Screenshots : PNG&lt;br /&gt;
*PDF ist universell für nahezu alles geeignet&lt;br /&gt;
*Mehrere Dateien zusammenfassen: ZIP&lt;br /&gt;
&lt;br /&gt;
Eine schöne Abhandlung über das Thema findet sich bei [http://www.freiesmagazin.de/mobil/freiesMagazin-2011-05-bilder.html#11_05_bildoptimierung freiesmagazin.de].&lt;br /&gt;
&lt;br /&gt;
== Hall of Shame ==&lt;br /&gt;
(&amp;lt;strike&amp;gt;Leider&amp;lt;/strike&amp;gt; Zum Glück wurden die Bilddateien von den Moderatoren nachträglich modifiziert/verkleinert)&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/113261#1010923] Screenshots als BMP! für ein paar Zeilen Code, aber wenigstens mit ZIP komprimiert,&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/111911#995634] Bild viel zu hoch aufgelöst, 180MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/92715#795286] Saumässiger Scan trotz hoher Auflösung, wahrscheinlich als BMP in PDF gedruckt, 541 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/141996#1310490] Bild viel zu hoch aufgelöst, 802&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/137510#1257789] Bild viel zu hoch aufgelöst, 451 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/110222#977025] Total unscharf und viel zu hoch aufgelöst, 117MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/125590#1146720] Total unscharf und viel zu hoch aufgelöst, 325MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/149705#1401405] Total unscharf, 330MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/120075#1085431] Brille Fielmann?, 347MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/157302#1489930] Bild viel zu hoch  aufgelöst, 700MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/79464#678932] Ein Screenshot, der leider ins Knie ging, 318MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/111726#1036323] Vier viel zu hochaufgelöste Bilder von Bastelkram, 1254 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/147862#1379257] Total unscharf und viel zu hoch aufgelöst, 228 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/114555#1029194] Viel zu hoch aufgelöst, 1273 MB &lt;br /&gt;
* [http://www.mikrocontroller.net/topic/99177#859882]  Unscharf und viel zu hoch aufgelöst, 680MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/115459#1034095] Viel zu hoch aufgelöst, 698 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/146264#1359458] Vollkommen unscharf&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/122808#1117286] Viel zu hoch aufgelöst und teilweise unscharf durch Blitzlicht, 800MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/143205#1324456] Photo im PNG-Format, 1832MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/77593#662242] Viel zu hoch aufgelöst, 2439MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/109365#967514] Viel zu hoch aufgelöst, 315 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/144723#1341977] Ausnahmefall, sollte besser auf einem anderen Server gespeichert werden und nur ein Link geposter werden, 13649MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/143079#1322849] Viel zu hoch aufgelöst, 902 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/88492#751608] Viel zu hoch aufgelöst, 894MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/87432#745357] Viel zu hoch aufgelöst, 2874MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/151621#1449922] Noch so ein toller &amp;quot;Screenshot&amp;quot;, 174MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/157741#1493111] Viel zuviel unwichtiges Drumherum, 64MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/114544#1025880] Viel zu hoch aufgelöst, 70MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/146264] Was ist das?&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/189323#1844014] fast halbes Mb (für was) wofür?&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/195518#1916565] 1.7 MB für ein Drahtverhau, 50kB reichen auch&lt;br /&gt;
&lt;br /&gt;
Summe des Datentransfermülls: 32,3 GB! Das hätte man locker mit 1/10 und weniger schaffen können.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Tipps für Autoren]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Bildformate&amp;diff=60851</id>
		<title>Bildformate</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Bildformate&amp;diff=60851"/>
		<updated>2011-09-30T22:31:44Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Technische Zeichnungen: SVG oder PNG */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Das Problem ==&lt;br /&gt;
&lt;br /&gt;
Will man im Forum eine Antwort erhalten, dann sollte man es den anderen Forenteilnehmern so leicht wie möglich machen, sich die dazugehörigen Abbildungen anzusehen. Muss man die Dateien erst speichern oder gar ein Archiv entpacken und danach ein externes Programm benutzen, um die Dateien anzusehen, wird die Resonanz signifikant geringer sein, als hätte man einfach nur draufklicken müssen, um es gleich im Browser zu betrachen.&lt;br /&gt;
&lt;br /&gt;
Desweiteren kommt es immer wieder dazu, daß sich Forenteilnehmer &amp;quot;im Format vergreifen&amp;quot;. Da werden dann eigentlich kleine und mit wenig Farben ausgestattete Zeichnungen zu Dateimonstern von 1 MB und mehr. Das muss nicht sein, auch nicht im DSL-Zeitalter. Es gibt schon genug Datenmüll im Internet. Ausserdem sind immer noch eine gewisse Anzahl von Leuten per Modem im Internet unterwegs, an die sollte man auch ein klein wenig denken. Zu guter Letzt gilt &amp;quot;Klasse statt Masse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Vielleicht gar kein Bild? ==&lt;br /&gt;
&lt;br /&gt;
Manchmal ist es angebracht, überhaupt nichts anzuhängen. Beispielsweise ist das oft der Fall bei Datenblättern: Statt die möglicherweise hundertste Version des Datenblattes heraufzuladen, wäre ein Link deutlich angebrachter. Einerseits sind damit etwaige rechtliche Probleme schnell ausgeräumt, andererseits stolpert ein Leser in einiger Zeit nicht über ein womöglich bereits veraltetes Dokument.&lt;br /&gt;
&lt;br /&gt;
Für einen Leser kann es auch durchaus sinnvoll sein, zu wissen, woher ein Dokument stammt: etwa um weitergehende Recherche zu betreiben. Zumindest eine brauchbare Quellenangabe ist jedoch Pflicht, wenn schon Material von externen Seiten entnommen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Welches Format für welches Bild? ==&lt;br /&gt;
&lt;br /&gt;
=== Photos und Scans: JPG ===&lt;br /&gt;
&lt;br /&gt;
Photos sollten im &#039;&#039;&#039;JPG&#039;&#039;&#039;-Format abgespeichert werden. JPG bzw. JPEG (&#039;&#039;&#039;J&#039;&#039;&#039;oint &#039;&#039;&#039;P&#039;&#039;&#039;icture &#039;&#039;&#039;E&#039;&#039;&#039;xpert &#039;&#039;&#039;G&#039;&#039;&#039;roup) ist ein speziell für Echtfarbgrafiken (True Color) entwickeltes Bildformat. Es ermöglicht die Speicherung von Photos in 24 Bit Farbauflösung bei relativ geringem Speicherverbrauch. So hat z.&amp;amp;nbsp;B. ein Bild einer 2 Megapixel Digitalkamera (1600x1200 Punkte) einen Speicherbedarf von 6 MB ohne Kompression. Mit JPG und mittlerer Kompressionseinstellung sind es nur noch ca. 500 kB. Die Bilder werden dabei jedoch &#039;&#039;&#039;verlustbehaftet&#039;&#039;&#039; komprimiert. Das heißt sowohl Farben als auch Strukturen werden nicht eins zu eins abgespeichert, sondern mittels cleverer Mathematik soweit verarbeitet, dass speicherintensive Details rausfallen. Im Normalfall sieht man das nicht.&lt;br /&gt;
&lt;br /&gt;
Da jedoch 2 Megapixel heute eher zum alten Eisen gehören haben viele Leute Kameras mit 5 Megapixel und mehr. Und da man ja auch auf Qualität bedacht ist, ist meist auch nur eine geringe Kompression der Bilder eingestellt (hohe Qualität, Superfein etc.). &#039;&#039;&#039;Bitte solche Bilder nicht direkt im Forum posten.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Mit ein paar wenigen Handgriffen kann man die Bilder &#039;&#039;&#039;netztauglich&#039;&#039;&#039; machen. Dazu braucht man nur ein normales, kostenloses Bildbearbeitungsprogramm wie z.&amp;amp;nbsp;B. [http://www.irfanview.de/ Irfanview] oder [http://www.gimp.org/ GIMP].&lt;br /&gt;
&lt;br /&gt;
* Kompression erhöhen, einstellbar in den Speicheroptionen für JPG; 30% ist ein guter Kompromiss aus Qualität und Kompression&lt;br /&gt;
* Bildauschnitt auf das Wesentliche konzentrieren; ein kleiner IC der nur 1/10 der Bildfläche einnimmt, ist etwas &amp;quot;verloren&amp;quot;&lt;br /&gt;
* Auflösung reduzieren; niemand braucht 4000x3000 für die Art der hier geposteten Bilder; 1600x1200 oder weniger ist oft ausreichend&lt;br /&gt;
* Beim Fotografieren von ICs und Leiterplatten den Macromodus verwenden (meist ein Blumensymbol), damit werden kleine, nahe Objekte scharf abgebildet.&lt;br /&gt;
* Auf die Bildschärfe achten, völlig verwaschene Schatten nützen niemanden etwas&lt;br /&gt;
* Platinen kann man sehr gut mit einem Scanner abbilden&lt;br /&gt;
&lt;br /&gt;
=== Technische Zeichnungen: SVG oder PNG ===&lt;br /&gt;
&lt;br /&gt;
Zu Technischen Zeichnungen gehören&lt;br /&gt;
&lt;br /&gt;
*Schaltpläne&lt;br /&gt;
*Layouts&lt;br /&gt;
*Mechanische Zeichungen&lt;br /&gt;
*Screenshot&lt;br /&gt;
&lt;br /&gt;
Wesentliche Merkmale dieser Zeichungen sind&lt;br /&gt;
&lt;br /&gt;
*relativ wenig Farben&lt;br /&gt;
*feine Strukturen (Linien, Leiterbahnen)&lt;br /&gt;
&lt;br /&gt;
Werden solche Zeichnungen nun als JPG gespeichert kommt es zu sogenannten &#039;&#039;&#039;Kompressionsartefakten&#039;&#039;&#039; (verwaschene Kanten, &amp;quot;Pickel&amp;quot; in gleichmässigen Flächen, unscharfe Texte). Der Kompressionsalgorithmus von JPG ist darauf spezialisiert kleine Details &amp;quot;wegzuwischen&amp;quot;, um Speicher zu sparen. Das ist aber gerade hier kontraproduktiv! Technische Zeichnungen brauchen Details! Außerdem wird das Bild bei JPG immer mit 24 Bit Farbtiefe verarbeitet. Das ist Platzverschwendung, die meisten Technischen Zeichnungen kommen mit 16 oder 256 Farben bequem aus.&lt;br /&gt;
&lt;br /&gt;
Deshalb speichert man Technische Zeichnungen sinnvollerweise nur im &#039;&#039;&#039;PNG&#039;&#039;&#039;-Format (&#039;&#039;&#039;P&#039;&#039;&#039;ortable &#039;&#039;&#039;N&#039;&#039;&#039;etwork &#039;&#039;&#039;G&#039;&#039;&#039;raphic). PNG ist die Weiterentwicklung von &#039;&#039;&#039;GIF&#039;&#039;&#039; (&#039;&#039;&#039;G&#039;&#039;&#039;raphic &#039;&#039;&#039;I&#039;&#039;&#039;nterchange &#039;&#039;&#039;F&#039;&#039;&#039;ormat), welches ursprünglich von der Firma Compuserve als erstes Format für Netzwerkgrafiken entwickelt wurde. PNG komprimiert Bilder &#039;&#039;&#039;verlustfrei&#039;&#039;&#039;, d.h. das Bild wird 1:1 in Struktur und Farbe gespeichert. GIF kann dagegen nur 256 Farben speichern, die Struktur bleibt aber auch 1:1 erhalten. Für animierte GIFs gibt es bis jetzt keine verbreitete Alternative. Obwohl der Patentschutz von GIF mittlerweile abgelaufen ist, sollte man GIF nicht mehr verwenden, weil&lt;br /&gt;
&lt;br /&gt;
* PNG beliebige Farbtiefen von 1..24 Bit unterstützt (GIF nur 8 Bit)&lt;br /&gt;
* die Kompression von PNG geringfügig besser ist als GIF&lt;br /&gt;
&lt;br /&gt;
== Universalformat PDF ==&lt;br /&gt;
&lt;br /&gt;
Das Format [http://de.wikipedia.org/wiki/Portable_Document_Format PDF] wurde vor langer Zeit von der Firma [http://www.adobe.com Adobe] entwickelt und hat sich schon lange als de facto Standard etabliert. Es ist auf allen gängigen Betriebssystemen lesbar. Es ist relativ kompakt (kleine Dateigrößen) und kann sowohl JPG, PNG als auch vektorbasierte Grafiken enthalten. Viele Programme bieten sowohl direkt einen Export als PDF an, oder man kann mittels Software ein PDF &amp;quot;drucken&amp;quot;, sprich anstatt eines echten Druckers, welcher Papier ausspuckt, wird eine PDF-Datei erzeugt.&lt;br /&gt;
&lt;br /&gt;
== Export mit CAD-Programmen ==&lt;br /&gt;
&lt;br /&gt;
=== Eagle ===&lt;br /&gt;
&lt;br /&gt;
Das weit verbreitete Schaltplan- und Layoutprogramm [[Eagle| EAGLE]] bietet direkt die Möglichkeit, Schaltpläne und Layouts als PNG-Bild zu exportieren (Menu File-&amp;gt;Export-&amp;gt;Image). Aber bitte nicht die Auflösung zu hoch einstellen! Die Voreinstellung von 150 dpi ist meist optimal für Schaltpläne. Layouts sind manchmal in 300dpi sinnvoll. &#039;&#039;&#039;Vorsicht!&#039;&#039;&#039; Es gibt einen kleinen Bug. Wenn man in der erscheinenden Dateiauswahlbox auf *.png umstellt, &#039;&#039;&#039;muss&#039;&#039;&#039; man auch einen Dateinamen mit .png Endung hinschreiben, sonst springt Eagle wieder zurück auf BMP Format!&lt;br /&gt;
&lt;br /&gt;
Ab Version 5 kann Eagle auch als PDF-Datei exportieren (man findet diese Option allerdings nicht im Datei-&amp;gt;Exportieren...-Menü, sondern unter Datei-&amp;gt;Drucken). Das hat den Vorteil, dass eine echte Vektorgrafik exportiert wird. Somit kann man beliebig zoomen, und die Datei ist sehr klein.&lt;br /&gt;
&lt;br /&gt;
== Formate die man meiden sollte ==&lt;br /&gt;
&lt;br /&gt;
=== Nie wieder BMP! ===&lt;br /&gt;
&lt;br /&gt;
Das Format BMP sollte man gänzlich meiden! Es ist ein unkomprimiertes oder RLE-komprimiertes Format und die Dateien sind &#039;&#039;&#039;riesig&#039;&#039;&#039;!&lt;br /&gt;
BMP-Dateien werden von der Forensoftware serverseitig automatisch nach PNG konvertiert!&lt;br /&gt;
&lt;br /&gt;
=== TIFF ===&lt;br /&gt;
&lt;br /&gt;
Dieses Format teilt sich in etliche Unterformate, die meist nicht von allen Programmen unterstützt werden. Insbesondere ist die Unterstützung bei Webbrowsern sehr schlecht. TIFF-Dateien (Endung meist .TIF) können je nach Unterformat sehr groß werden.&lt;br /&gt;
&lt;br /&gt;
=== Proprietäre Formate ===&lt;br /&gt;
&lt;br /&gt;
Formate, die nicht ohne Zusatzsoftware betrachtet werden können. Dazu gehören z.&amp;amp;nbsp;B. Schaltpläne/Layouts im Eagle-Format (.sch/.brd) oder Schaltpläne im LTSpice-Format (.asc).&lt;br /&gt;
&lt;br /&gt;
== Mehrere Dateien zusammenfassen ==&lt;br /&gt;
&lt;br /&gt;
Weder PNG, noch GIF, noch JPG kann man sinnvoll mit ZIP, RAR und welchem Packer auch immer weiter verkleinern, denn all diese Formate sind schon komprimiert! Einzig dann, wenn man mehrere Bilder hochladen und den Thread übersichtlich halten möchte, kann der Einsatz eines Packprogramms sinnvoll sein, um einfach mehrere Dateien zu einem Archiv zusammenzufassen. Dabei sollte man &#039;&#039;&#039;nur das ZIP-Format&#039;&#039;&#039; verwenden. Diese lassen sich unter so gut wie allen aktuellen Betriebssystemen mit Bordmitteln öffnen. RAR und andere Formate mögen zwar vielleicht ein paar Prozente kleiner packen, aber es ist nervig, wenn man sich erst noch ein Programm zum Auspacken suchen muss.&lt;br /&gt;
&lt;br /&gt;
== Zusammenfassung ==&lt;br /&gt;
&lt;br /&gt;
*Photos, Scans : JPG mit ca. 40% bis 70% Kompression&lt;br /&gt;
*Technische Zeichnungen und Screenshots : PNG&lt;br /&gt;
*PDF ist universell für nahezu alles geeignet&lt;br /&gt;
*Mehrere Dateien zusammenfassen: ZIP&lt;br /&gt;
&lt;br /&gt;
Eine schöne Abhandlung über das Thema findet sich bei [http://www.freiesmagazin.de/mobil/freiesMagazin-2011-05-bilder.html#11_05_bildoptimierung freiesmagazin.de].&lt;br /&gt;
&lt;br /&gt;
== Hall of Shame ==&lt;br /&gt;
(&amp;lt;strike&amp;gt;Leider&amp;lt;/strike&amp;gt; Zum Glück wurden die Bilddateien von den Moderatoren nachträglich modifiziert/verkleinert)&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/113261#1010923] Screenshots als BMP! für ein paar Zeilen Code, aber wenigstens mit ZIP komprimiert,&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/111911#995634] Bild viel zu hoch aufgelöst, 180MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/92715#795286] Saumässiger Scan trotz hoher Auflösung, wahrscheinlich als BMP in PDF gedruckt, 541 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/141996#1310490] Bild viel zu hoch aufgelöst, 802&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/137510#1257789] Bild viel zu hoch aufgelöst, 451 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/110222#977025] Total unscharf und viel zu hoch aufgelöst, 117MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/125590#1146720] Total unscharf und viel zu hoch aufgelöst, 325MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/149705#1401405] Total unscharf, 330MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/120075#1085431] Brille Fielmann?, 347MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/157302#1489930] Bild viel zu hoch  aufgelöst, 700MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/79464#678932] Ein Screenshot, der leider ins Knie ging, 318MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/111726#1036323] Vier viel zu hochaufgelöste Bilder von Bastelkram, 1254 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/147862#1379257] Total unscharf und viel zu hoch aufgelöst, 228 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/114555#1029194] Viel zu hoch aufgelöst, 1273 MB &lt;br /&gt;
* [http://www.mikrocontroller.net/topic/99177#859882]  Unscharf und viel zu hoch aufgelöst, 680MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/115459#1034095] Viel zu hoch aufgelöst, 698 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/146264#1359458] Vollkommen unscharf&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/122808#1117286] Viel zu hoch aufgelöst und teilweise unscharf durch Blitzlicht, 800MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/143205#1324456] Photo im PNG-Format, 1832MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/77593#662242] Viel zu hoch aufgelöst, 2439MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/109365#967514] Viel zu hoch aufgelöst, 315 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/144723#1341977] Ausnahmefall, sollte besser auf einem anderen Server gespeichert werden und nur ein Link geposter werden, 13649MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/143079#1322849] Viel zu hoch aufgelöst, 902 MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/88492#751608] Viel zu hoch aufgelöst, 894MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/87432#745357] Viel zu hoch aufgelöst, 2874MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/151621#1449922] Noch so ein toller &amp;quot;Screenshot&amp;quot;, 174MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/157741#1493111] Viel zuviel unwichtiges Drumherum, 64MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/114544#1025880] Viel zu hoch aufgelöst, 70MB&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/146264] Was ist das?&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/189323#1844014] fast halbes Mb (für was) wofür?&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/195518#1916565] 1.7 MB für ein Drahtverhau, 50kB reichen auch&lt;br /&gt;
&lt;br /&gt;
Summe des Datentransfermülls: 32,3 GB! Das hätte man locker mit 1/10 und weniger schaffen können.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Tipps für Autoren]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Entscheidung_Mikrocontroller&amp;diff=60810</id>
		<title>Entscheidung Mikrocontroller</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Entscheidung_Mikrocontroller&amp;diff=60810"/>
		<updated>2011-09-29T11:28:19Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Stromverbrauch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die meisten Anfänger stellen sich die Frage, welchen [[Mikrocontroller]] sie verwenden sollen. Es gibt Dutzende Hersteller, und jeder davon hat unzählige Varianten im Angebot. Stellt man die Frage in einem Diskussionsforum, dann bekommt man viele verschiedene (sich teilweise widersprechende) Antworten. Bei der Entscheidung sollten u.a. die unten stehenden Kriterien beachtet werden. Dieser Artikel ist primär für Hobbyisten gedacht, da im professionellen Einsatz oftmals völlig andere Kriterien beachtet werden müssen. Weitere vergleichende Informationen über verschiedene Controllerfamilien gibt der Artikel: [[AVR_PIC_51-Vergleich]]&lt;br /&gt;
&lt;br /&gt;
== Verfügbarkeit ==&lt;br /&gt;
* Während man manche Mikrocontroller an jeder Straßenecke bekommt, sind andere nur in großen Stückzahlen und mit Gewerbenachweis erhältlich. Dazu einfach mal in die Kataloge der einschlägigen Privatkundenhändler schauen. Dabei auch darauf achten, dass der gewünschte Controller auch in der richtigen Bauform erhältlich ist (DIP, TQFP, MLF usw.), s.u.&lt;br /&gt;
* Ab und zu kündigen Hersteller ein neues Modell an (und veröffentlichen das Datenblatt dazu), können aber erst ein Jahr später nennenswerte Stückzahlen liefern. Also den Controller nicht einfach anhand der Übersichten beim Hersteller aussuchen, sondern überprüfen, was die Händler auch wirklich liefern können.&lt;br /&gt;
* Lebenszyklus: Kein Modell wird ewig hergestellt. Deswegen sollte man überprüfen, ob der Hersteller vielleicht schon angekündigt hat, dass er ein bestimmtes Modell nicht mehr herstellen will. Die Hersteller schreiben dann z.&amp;amp;nbsp;B. &amp;quot;Mature Product (Not Recommended for New Designs)&amp;quot;. Für Neuentwicklungen oder den Einstieg sollte man folgende Modelle nicht verwenden:&lt;br /&gt;
** AVR AT90-Reihe, &lt;br /&gt;
** AVR ATMega 103(L), 161(L), 163(L), 323(L).&lt;br /&gt;
* Für alle abgekündigten AVR-Controller gibt es jedoch pin- und funktionskompatible Nachfolger. Daher kommt es nur in den seltensten Fällen zu Problemen. Probleme können nur entstehen, wenn ein Programm nur in kompilierter Version zur Verfügung steht.&lt;br /&gt;
* Dagegen sind Mikrocontroller der [[8051|MCS51-Familie]] von Intel eher für langfristige Investitionen geeignet. Der 8051 wurde 1979 (!) als erstes Mitglied dieser Familie vorgestellt. Heute gibt es bereits hunderte von 8051-Derivaten von dutzenden von Halbleiterherstellern, zum Teil auch mit weiterentwickelten Prozessorkernen. Wird ein Derivat tatsächlich mal abgekündigt, findet man bei dieser Riesenauswahl meist leicht adäquaten Ersatz.&lt;br /&gt;
&lt;br /&gt;
== Preis ==&lt;br /&gt;
Einerseits kann es lästig sein, wenn man durch die Verwendung eines kleineren Modells 2 Euro gespart hat und dann mit dessen Unzulänglichkeiten kämpft, andererseits ist ein versehentlich zerstörter Chip für 30 Euro ziemlich ärgerlich. Auch ist es oft ganz praktisch, wenn man einige Controller auf Vorrat hat.&lt;br /&gt;
&lt;br /&gt;
Zum Preis eines einzelnen Mikrocontrollers kommen noch die Kosten für die Entwicklungswerkzeuge, wie [[Compiler]], Programmübertragung und Debugging hinzu (s.u. Programmiersprache und Programmübertragung).&lt;br /&gt;
&lt;br /&gt;
== Dokumentation ==&lt;br /&gt;
Die wichtigste Informationsquelle zu einem Mikrocontroller ist das Datenblatt. Diese gibt es heutzutage aber fast ausschließlich in Englisch. Wer damit nicht zurecht kommt, muss vorher schauen, ob es irgendwelche Tutorials oder Bücher in seiner Lieblingssprache gibt.&lt;br /&gt;
&lt;br /&gt;
Je mehr Funktionen ein Mikrocontroller beherrscht, desto umfangreicher wird auch das Datenblatt. Das führt dazu, dass bei manchen Mikrocontrollern das Datenblatt über 1000 Seiten hat. Da ist die Gefahr groß, dass ein Anfänger den Überblick verliert.&lt;br /&gt;
&lt;br /&gt;
== Unterstützung/Community ==&lt;br /&gt;
Gerade als Anfänger ist man oft auf die Hilfe anderer angewiesen. Da empfiehlt es sich, der Masse hinterherzulaufen und keine exotischen Typen zu verwenden. Im Bastlerbereich populäre Mikrocontroller-Familien sind die AVRs von Atmel und die PICs von Microchip. Für diese Architekturen gibt es z.&amp;amp;nbsp;B. im Forum dieser Internet-Seite gute und meist auch schnelle Hilfestellung bei Problemen.&lt;br /&gt;
&lt;br /&gt;
== Bauformen == &lt;br /&gt;
Neben den klassischen (bedrahteten) Bauformen setzt sich heutzutage [[SMD]] immer mehr durch. Manche Mikrocontroller sind nur noch in SMD-Bauformen erhältlich. Für SMD benutzt man üblicherweise geätzte Platinen oder Adapter/Sockel (die aber wieder extra kosten). Will man mit Lochrasterplatinen oder [[Breadboard]]s arbeiten, dann braucht man die klassischen Bauformen, z.&amp;amp;nbsp;B. PDIP. Zu beachten ist dabei, dass es PDIP oft nur bis DIP40 (also mit 40 Pins) gibt, d.h. einen Mikrocontroller mit 50 I/O-Pins kann es dann nur als SMD geben.&lt;br /&gt;
&lt;br /&gt;
Viele Mikrocontroller sind in verschiedenen Bauformen verfügbar. Nur in SMD verfügbar sind:&lt;br /&gt;
* MSP430 (Die kleinen sind mittlerweile auch als DIP erhältlich)&lt;br /&gt;
* AVR ATMega 64, 128, 169&lt;br /&gt;
&lt;br /&gt;
In der klassischen (wenn auch in der Anzahl der verfügbaren IO-Pins limitiert) PDIP Bauform gibt es unter anderem:&lt;br /&gt;
* AVR ATMega 8, 16, 32, 644&lt;br /&gt;
* AVR ATTiny: Praktisch alle, z.&amp;amp;nbsp;B. ATTiny 13, 24, 25, 26, 2313&lt;br /&gt;
* viele 8051-Derivate, z.&amp;amp;nbsp;B. Atmel 89S8252&lt;br /&gt;
&lt;br /&gt;
== Spannung ==&lt;br /&gt;
Während früher die meisten Mikrocontroller und die gesamte Peripherie mit 5V liefen, so gibt es heute auch alle möglichen anderen Varianten. Zu beachten ist:&lt;br /&gt;
* Controller und Peripherie müssen zusammenpassen. Man kann nicht einfach (ohne weitere Vorkehrungen) ein 3,3V-RAM an einen 5V-Controller anschließen und umgekehrt.&lt;br /&gt;
* Manche Controller besitzen, obwohl sie intern mit einer anderen Spannung arbeiten, 5V-kompatible IO-Pins (Beispiel: [[LPC2000 Philips ARM7TDMI-Familie|LPC2100]]).&lt;br /&gt;
* Manche Controller brauchen zwei verschiedene Spannungen. Dies ist aber relativ selten, z.&amp;amp;nbsp;B. bei den [[LPC2000 Philips ARM7TDMI-Familie|LPC2100]].&lt;br /&gt;
&lt;br /&gt;
* Billig-Netzteile liefern im Leerlauf manchmal deutlich mehr Spannung als angegeben, ein [[Standardbauelemente|Spannungsregler]] (z.&amp;amp;nbsp;B. 78xx) ist also Pflicht!&lt;br /&gt;
* Bei Batterien und Akkus sinkt die Spannung ab, wenn sie leerer werden. Braucht der Controller z.&amp;amp;nbsp;B. mindestens 2,7V, dann wird man mit zwei 1,5V-Batterien nicht lange Freude haben (außer man benutzt spezielle Schaltregler).&lt;br /&gt;
&lt;br /&gt;
== Stromverbrauch ==&lt;br /&gt;
Im Vergleich zu PC-Prozessoren (Pentium, Athlon usw.) brauchen Mikrocontroller relativ wenig Strom. Will man sie allerdings mit Batterien betreiben, dann wird der Stromverbrauch plötzlich doch wichtig. Die meisten Mikrocontroller besitzen hierfür Stromsparmodi, mit denen man den Controller teilweise abschalten kann. Für einen extrem geringen Stromverbrauch sind z.&amp;amp;nbsp;B. die [[MSP430]]-Controller optimiert.&lt;br /&gt;
&lt;br /&gt;
Der Stromverbrauch hängt auch stark vom Takt und der Versorgungsspannung ab. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0&lt;br /&gt;
! Frequenz !! ATMega8 (2.7V) !! ATMega8 (5.0V) !! PIC16LF84A(2.0V) !! PIC16F84A (5.5V) !! MSP430F2618 (3V) !! Einheit&lt;br /&gt;
|-&lt;br /&gt;
! 32KHz &lt;br /&gt;
|62||80||45||-&lt;br /&gt;
|title=&amp;quot;Keine Angabe&amp;quot;|k.A.||µA&lt;br /&gt;
|-&lt;br /&gt;
! 100KHz &lt;br /&gt;
|0,3||0,5||-||-||0,084&lt;br /&gt;
|rowspan=4|mA&lt;br /&gt;
|-&lt;br /&gt;
!1MHz, 2MHz*&lt;br /&gt;
|1,5||2,3||4||-||0,5&lt;br /&gt;
|-&lt;br /&gt;
!8MHz, 4MHz*&lt;br /&gt;
|5||7/15**&lt;br /&gt;
|rowspan=2|-||4,5||4,2&lt;br /&gt;
|-&lt;br /&gt;
!16MHz, 20MHz*&lt;br /&gt;
| -||20||20||9,5 (3,3V)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[*] Abweichende Taktangabe für PIC16*F84A, da hier keine entsprechenden Werte für die Frequenzen des ATmega8 im Datenblatt (PIC16F84A Data Sheet, Microchip 2001, 35007b.pdf) vorliegen.&lt;br /&gt;
&lt;br /&gt;
[**] Angaben sind in der Folge Idle/Active (Quelle: Atmel, ATmega8/L, doc2486.pdf).&lt;br /&gt;
&lt;br /&gt;
== Takt/Geschwindigkeit ==&lt;br /&gt;
Einerseits wünscht man sich oft einen möglichst schnellen Controller, insbesondere als Anfänger, wenn man effiziente Lösungen noch nicht so kennt, andererseits schlägt sich ein hoher Takt auch im Stromverbrauch und im Preis nieder. Man sollte sich dabei nicht von den hohen Taktraten der PC-Prozessoren irritieren lassen. Für viele Anwendungen reicht 1-MHz-Takt völlig aus.&lt;br /&gt;
&lt;br /&gt;
Bei einem Geschwindigkeitsvergleich sollte man beachten, dass man nicht einfach den Takt vergleichen kann: &lt;br /&gt;
* Während manche Controller 12 Takte für einen Befehl brauchen (z.&amp;amp;nbsp;B. die Original-[[8051]]), kommen andere mit einem Takt pro Befehl aus (z.&amp;amp;nbsp;B. [[AVR]]).&lt;br /&gt;
* Manche Controller unterstützen gewisse Operationen hardwareseitig, die auf anderen Controllern in Software nachgebildet werden muss. Beispiele sind z.&amp;amp;nbsp;B. Multiplikation und Division. Wer in einer Hochsprache programmiert, merkt davon nicht viel, da es dort die Befehle sowieso zur Verfügung stehen, aber sie brauchen auf einem Controller ohne Hardwareunterstützung eben deutlich länger. &lt;br /&gt;
* Die Datenbus- bzw. Registerbreite spielt eine wichtige Rolle, weil man z.&amp;amp;nbsp;B. für eine 16-Bit-Addition auf einer 8-Bit-CPU zwei Befehle und auf einer 16-Bit-CPU nur einen Befehl braucht.&lt;br /&gt;
&lt;br /&gt;
== Speicher ==&lt;br /&gt;
Während früher oft nur die [[Register]] im Mikrocontroller waren, und der gesamte restliche Speicher extern angebunden werden musste, so sind heute die Speicher oft komplett im Mikrocontroller integriert. Das bedeutet aber teilweise auch, dass man sie nicht erweitern kann. Wichtig ist dabei u.a. die Größe des Programmspeichers (meist ein [[Flash-ROM]]) und das [[RAM#SRAM|SRAM]]. Fehlt letzteres, dann kann es mit der Compilerunterstützung schwierig werden.&lt;br /&gt;
&lt;br /&gt;
Zu unterscheiden sind hier außerdem Controller in [[Von Neumann-Architektur|Von-Neumann-Architektur]] und [[Harvard-Architektur]]. Bei letzterer liegen Programmspeicher (ROM) und Datenspeicher (RAM) in getrennten Speicherbereichen; dies hat den Nachteil, dass für den Zugriff auf den Programmspeicher spezielle Befehle notwendig sind (was die Verwendung von im ROM abgelegten Daten in C-Compilern ziemlich umständlich macht), und dass man keine Programmteile direkt aus dem Datenspeicher ausführen kann.&lt;br /&gt;
&lt;br /&gt;
== Onboard-Peripherie ==&lt;br /&gt;
Mikrocontroller haben meist eine ganze Menge Funktionen integriert, z.&amp;amp;nbsp;B. [[AD-Wandler]], [[I²C]]-Bus, [[SPI]], [[PWM]], [[RS-232]] usw. usf. Der Vorteil liegt darin, dass der Controller damit mehrere Dinge gleichzeitig machen kann. Dadurch steigt zum einen die Gesamtleistung des Controllers, zum anderen sind viele Dinge zeitkritisch, und die Programmierung ist deutlich einfacher, wenn man zehn zeitkritische Dinge gleichzeitig erledigen muss.&lt;br /&gt;
&lt;br /&gt;
== Störfestigkeit ==&lt;br /&gt;
Eigentlich ein wichtiges Thema, andererseits findet man dazu nur sehr wenig Informationen. Bekannt ist beispielsweise, dass bei der [[AVR]]-Familie die ATmegas deutlich störfester sind als die alten AT90S. &lt;br /&gt;
&lt;br /&gt;
== Programmiersprachen ==&lt;br /&gt;
Den direktesten Zugriff auf die &amp;quot;Innereien&amp;quot; eines Prozessors hat man mit [[Assembler]]. Dies ist jedoch gleichzeitig - zumindest auf den ersten Blick - die &amp;quot;abschreckendste&amp;quot; Sprache, denn sie erfordert einen hohen Lernaufwand. Aufgrund stark unterschiedlicher Befehlssätze verschiedener Controllerfamilien ist das Gelernte nie 1-zu-1 übertragbar und meist nur direkt auf einen einzigen Prozessor oder allenfalls auf eine Familie &amp;quot;verwandter&amp;quot; Produkte anwendbar. Dennoch kann man sich mit einiger Erfahrung recht schnell in einen anderen Befehlssatz einarbeiten. In bestimmten Bereichen oder Teilen eines Projekts wird die Verwendung von Assembler dennoch unabdingbar sein. (Diese Teile mögen projektabhängig zwischen 100% oder auch nur deutlich unter 1% umfassen.)&lt;br /&gt;
&lt;br /&gt;
Die Auswahl der richtigen Programmiersprache hängt auch stark vom geplanten Einsatzzweck ab. Ein Elektrotechnik-Student, der sich für sein späteres Berufsleben vorbereiten möchte, sollte sich mit C und Assembler befassen. Wer dagegen gar nicht vorhat sich allzu tief einzuarbeiten und sowieso schon Basic oder Pascal kann, der sollte zu diesen Sprachen greifen.&lt;br /&gt;
&lt;br /&gt;
Für einige Controllerfamilien (z.&amp;amp;nbsp;B. AVR, ARM, MSP430) gibt es eine Portierung des kostenlosen [[GCC|GNU-C-Compilers]], wodurch C auch im Hobby-Bereich stark vertreten ist und es auch viele Programmierbeispiele dafür gibt.&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
Bei der Fehlerbeseitigung trennen sich Profi von Amateur, und es kann richtig teuer werden. Genau hier haben die Hersteller von Mikrocontrollern und/oder Compilern eine Möglichkeit gefunden, den Gelegenheitsprogrammierer abzuweisen und nur den zahlenden Profi vorzulassen.&lt;br /&gt;
&lt;br /&gt;
Die preisgünstigste, aber auch unkomfortabelste Art des Debuggings ist der Einbau von Testcode in das Programm. Dieser Testcode informiert den Programmierer über erreichte Programmpunkte und dabei aufgetretene Datenwerte. Die Ausgabe erfolgt per optisch/akustischer Anzeige oder serieller Schnittstelle. Der Nachteil dieser Methode liegt in ihrem Zeitaufwand. Für jedes Problem muss ein kurzes Stück Testcode erdacht und in das Programm eingefügt werden. Danach wird das Programm kompiliert/assembliert und in den Flashspeicher des Mikrocontrollers gebrannt. Zuguterletzt muss das Programm von Beginn an durchlaufen und mit etwas Glück liefert der Testcode Informationen über das Problem.&lt;br /&gt;
&lt;br /&gt;
Deutlich effektiver ist die Fehlersuche mittels einer in die PC-Entwicklungsumgebung integrierten Debugger-Software. Üblicherweise besteht diese Software aus mehreren Fenstern zur Anzeige folgender Informationen:&lt;br /&gt;
&lt;br /&gt;
* Programm- und Datenspeicher des Mikrocontrollers.&lt;br /&gt;
* Arbeits- und Konfigurationsregister des Mikrocontrollers.&lt;br /&gt;
* Programmquellcode in Hochsprache (z.&amp;amp;nbsp;B. C) und/oder Assembler.&lt;br /&gt;
* Werte von Programm-Variablen.&lt;br /&gt;
&lt;br /&gt;
Ausgehend vom Quellcode/Assembler-Fenster kann man den Programmcode auf das Zielsystem laden, den Programmlauf starten und an beliebigen Stellen stoppen, das Programm zeilenweise oder wiederholend abarbeiten, Variablen/Speicher/Register anzeigen und auch verändern. Diese Vorgänge werden bei modernen Debuggern mit wenigen Funktionstasten und Kontextmenü gesteuert. Angemerkt sei, Debugging einer Hochsprache wie C funktioniert nur richtig, wenn die Codeoptimierung des Compilers deaktiviert ist. Diese Bedingung bringt es mit sich, dass für die Entwicklungsphase bis zu 30% mehr Programmspeicher benötigt werden.&lt;br /&gt;
&lt;br /&gt;
Der Programmlauf kann in einem Software-Simulator oder direkt auf dem Mikrocontroller erfolgen. Leider können Simulatoren weder die Signale der Controllerumgebung, noch Interrupts realistisch nachahmen. Hier hilft nur In-System-Debugging direkt auf dem Zielsystem.&lt;br /&gt;
&lt;br /&gt;
Für das In-System-Debugging wird der Ziel-Mikrocontroller mit seiner In-Circuit-Debugging-Hardware benutzt. Diese integrierte Hardware kommuniziert über teils genormte Schnittstellen mit der Debuggersoftware auf dem PC. Als Verbindungsglied dient ein Kabel mit mehr oder weniger komplexer Elektronik. Diese Elektronik, das fehlende Wissen um ihre Funktion und die teils eingebaute Donglefunktion verhindern preisgünstigen Nachbau und machen ihren Hersteller sicher vor unautorisierter Benutzung der Entwicklungsumgebung.&lt;br /&gt;
&lt;br /&gt;
Bei der Vielzahl von Controller- und Compiler-Herstellen ist es kaum möglich, einen Überblick über die Debugger-Hardware/Software zu geben. Hier nur einige Beispiele:&lt;br /&gt;
&lt;br /&gt;
=== [http://www.atmel.com/ Atmel] ===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!System&lt;br /&gt;
!Preis&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2737 AVR JTAG ICE] Clone (wenige ATmega Typen)&lt;br /&gt;
| ~ 35€&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3891 AVR Dragon] &lt;br /&gt;
| ~ 55€&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.keeelectronics.com/mkii.htm AVR JTAG ICE MKII - CN]&lt;br /&gt;
| ~ 85$&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3353 AVR JTAG ICE MKII] / [http://www.sureelectronics.net/goods.php?id=931 Clone]&lt;br /&gt;
| ~ 280€/99$&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4279 AVR ONE!]&lt;br /&gt;
| ~ 550€&lt;br /&gt;
|}&lt;br /&gt;
 &lt;br /&gt;
[http://atmel.com/products/avr32/default.asp AVR32 Controller (32-Bit)] können mit Atmels freiem [http://atmel.com/dyn/products/tools_card.asp?tool_id=4116 AVR32 Studio], basierend auf der [http://www.eclipse.org/ Eclipse IDE], programmiert und debugt werden. Die IDE bedient sich dabei der [http://atmel.com/dyn/products/tools_card.asp?tool_id=4118 AVR32 GNU Toolchain].&lt;br /&gt;
&lt;br /&gt;
Der Debugger für [http://atmel.com/products/avr/default.asp AVR 8-Bit] RISC Controller ist in Atmels freie [http://atmel.com/dyn/products/tools_card.asp?tool_id=2725 AVR Studio] IDE integriert. In Verbindung mit dem GNU C++ Compiler für AVR ([http://winavr.sourceforge.net/ WinAVR]) und der integrierten Bibliothek [http://www.nongnu.org/avr-libc/ AVR Libc] ist Hochsprach-Entwicklung und -Debugging möglich.&lt;br /&gt;
&lt;br /&gt;
Der [[JTAG|AVR JTAG]] ICE Clone kann nur nachfolgende ältere ATmega Controller debuggen: ATmega16, ATmega16L, ATmega162, ATmega162L, ATmega162V, ATmega165,  ATmega165V, ATmega169, ATmega169L, ATmega169V, ATmega32, ATmega32L, ATmega323, ATmega323L, ATmega64, ATmega64L, ATmega128, ATmega128L, AT90CAN128. Trotzdem ist er ein sehr wertvolles, weil günstiges Werkzeug, wenn man die Typbeschränkung akzeptieren kann.&lt;br /&gt;
&lt;br /&gt;
Atmel [[AVR]] Dragon kann ATtiny, ATmega, XMega, AT32UC3x und AP7xxx programmieren und debuggen. Die drei letzt genanneten MCUs werden seit AVR Studio Version &#039;&#039;4.18 SP1&#039;&#039; unterstützt.&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/topic/107070 AVR JTAG ICE MKII – CN] ist ein Produkt aus China mit der versprochenen Funktionalität eines originalen AVR JTAG ICE MKII von Atmel. Es besitzt eigenständige Elektronik und auch die aktualisierbare Firmware ist vom Original verschieden. Oftmals ist dieses Produkt beim nicht unbekannten Online-Auktionshaus zu finden.&lt;br /&gt;
&lt;br /&gt;
=== [http://www.microchip.com/ Microchip] ===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!System&lt;br /&gt;
!Preis&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en023805 MPLAB PICkit2 / PICkit2 Debug Express]&lt;br /&gt;
| ~ 30€/55€&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en538340 MPLAB PICkit3 Debug Express]&lt;br /&gt;
| ~ 65€&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en010046&amp;amp;part=DV164005 MPLAB ICD 2] / [http://www.keeelectronics.com/icd25debugger.html Clone ICD2.5] / [http://www.sivava.com/MPLAB_ICD2.html Clone ICD2]&lt;br /&gt;
| ~ 90€/40€/40€&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en537580 MPLAB ICD 3]&lt;br /&gt;
| ~ 190€&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Alle Typen von Microchip Debugger Hardware werden von Microchips freier [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en019469&amp;amp;part=SW007002 MPLAB IDE] unterstützt. Diese IDE kann mit C-Compilern verschiedener Hersteller zusammenarbeiten. Das Setup installiert keine Microchip C-Compiler sondern bietet als Option die C-Compiler von CCS und HI-TECH. Der CCS Compiler für PIC18F45k20 ist auf 2kWord Programmcode begrenzt. Die HI-TECH Compiler für PIC10/12/16, PIC18 und PIC32 haben, wenn sie als Freeware im ‚Lite mode’ arbeiten, eingeschränkte Codeoptimierung. Microchips C-Compiler für [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en010014 PIC18], [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en535364 PIC24], [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en535363 dsPIC DSCs] und/oder [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2615&amp;amp;dDocName=en532454 PIC32] können zusätzlich installiert werden. In der zum freien Download bereitstehenden ‚Student Edition’ stellen sie nach 60 Tagen einen Teil der Codeoptimierung ein. Das MPLAB Setup bietet optional die Installation der, im nächsten Absatz behandelten, HI-TECH IDE ‚HI-TIDE 3’ an.&lt;br /&gt;
&lt;br /&gt;
Die Debugger Hardware ICD 2 von Microchip wird auch von der freien, auf [http://www.eclipse.org/ Eclipse] basierenden,  HI-TECH IDE [http://www.htsoft.com/downloads/demos.php#hitide ‚HI-TIDE 3’] unterstützt. Diese moderne IDE kann zusammen mit Microchips MPLAB oder separat installiert werden. Zusätzlich zu installieren sind HI-TECHs C-Compiler für die Microchip Reihen [http://www.htsoft.com/microchip/products/compilers/piccpro-modes.php PIC10/12/16], [http://www.htsoft.com/microchip/products/compilers/picc18pro-modes.php PIC18] und/oder [http://www.htsoft.com/microchip/products/compilers/pic32-modes.php PIC32]. Ihre im ‚Lite mode’ bestehende Einschränkung wurde bereits erwähnt.&lt;br /&gt;
&lt;br /&gt;
Die beiden für PICs vorhandenen IDEs von Microchip und HI-TECH bilden zusammen mit den freien C-Compilern und den preisgünstigen ICD 2 Clones eine kostengünstige Möglichkeit, PIC-Code zu erstellen und zu debuggen. Die eingeschränkte Codeoptimierung ist für Amateure verschmerzbar. Einige kleine PICs haben leider keine In-Circuit-Debugging-Hardware eingebaut. Diese PICs sind nur mit Hilfe eines kostspieligen [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en538769 Header Boards] debugbar.&lt;br /&gt;
&lt;br /&gt;
=== [http://focus.ti.com/mcu/docs/mcuprodoverview.tsp?sectionId=95&amp;amp;tabId=140&amp;amp;familyId=342 TI MSP430] ===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!System&lt;br /&gt;
!Preis&lt;br /&gt;
|-&lt;br /&gt;
| Olimex [http://shop.embedded-projects.net/product_info.php/info/p58_MSP430-JTAG-Parallelportkabel--MSP430-JTAG-.html MSP430 JTAG (parallel)]&lt;br /&gt;
| ~ 15€&lt;br /&gt;
|-&lt;br /&gt;
| Olimex [http://shop.embedded-projects.net/product_info.php/info/p63_MSP430-USB-JTAG-Adapter--MSP430-JTAG-TINY-.html MSP430-JTAG-TINY (USB)]&lt;br /&gt;
| ~ 65€&lt;br /&gt;
|-&lt;br /&gt;
| TI-FET [http://focus.ti.com/docs/toolsw/folders/print/msp-fet430uif.html MSP430 USB Debugging Interface]&lt;br /&gt;
| ~ 115€&lt;br /&gt;
|-&lt;br /&gt;
| TI [http://focus.ti.com/docs/toolsw/folders/print/ez430-f2013.html MSP430 USB Stick Development Tool]&lt;br /&gt;
| ~ 30€&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[http://focus.ti.com/lit/ug/slau265/slau265.pdf Programmierung] und Debugging der MSP430 erfolgt über JTAG-Schnittstelle und in neusten Varianten (MSP430F20xx, F21x2, F22xx) über ‚Spy-Bi-Wire’ (2-wire JTAG). Die ursprüngliche JTAG-Schnittstelle benötigt 4 Signalleitungen plus Reset. Bei ‚Spy-Bi-Wire’ sind die Signalleitungen auf 2 reduziert.&lt;br /&gt;
&lt;br /&gt;
Jeder anwenderprogrammierbare MSP430 enthält einen [[Bootloader]]. Bei den Typenreihen MSP430F1xx, F2xx und F4xx befindet er sich im ROM. Bei den MSP430F6xx im Flash-Speicher.&lt;br /&gt;
&lt;br /&gt;
TI bezeichnet die Programmier- und Debugging-Hardware als Flash Emulation Tool (FET). Es existieren die Varianten ‚Parallel Port’ und USB. Die preisgünstigen parallelen Systeme beherrschen nur JTAG. Bei den USB-Systemen ist zusätzlich ‚Spy-Bi-Wire’ implementiert, und man kann damit die Codeschutzsicherung des Mikrocontrollers auslösen.&lt;br /&gt;
&lt;br /&gt;
Die [http://www.olimex.com/dev/index.html Olimex] Produkte entsprechen in ihrer Funktion weitestgehend den TI-Vorbildern und können mit jeder Software verwendet werden, die TI-Werkzeuge unterstützt. Kleine Abweichungen bestehen bei der [http://www.olimex.com/dev/images/MSP430/SPY-BI-WIRE-CONNECTION.jpg Olimex Implementierung] der ‚Spy-Bi-Wire’ Verbindung des MSP430-JTAG-TINY.&lt;br /&gt;
&lt;br /&gt;
Das ‚MSP430 USB Stick Development Tool’ ist eine eigenständige Debugging-Hardware mit aufgestecktem eZ430-F2013 Zielsystem. Der Stick beherrscht aber nur ‚Spy-Bi-Wire’, wodurch die Anzahl der unterstützten Controller begrenzt ist. &lt;br /&gt;
&lt;br /&gt;
Als Entwicklungsumgebung stellt TI den auf der [http://www.eclipse.org/ Eclipse IDE] aufbauenden ‚Code Compose Essentials’ bereit. In der freien Version [http://focus.ti.com/docs/toolsw/folders/print/msp-cce430.html ‚CCE Core Edition’] ist dieses Paket auf 16kB Code begrenzt.&lt;br /&gt;
&lt;br /&gt;
Mit der freien IDE Eclipse, dem GNU C-Compiler für MSP430, einigen Zutaten und dem Olimex Parallelport-Adapter kann man die wohl preiswerteste, unbeschränkte Entwicklungsumgebung für Mikrocontroller zusammenstellen. Es ist keine perfekte Kombination, und die Installation macht einige Mühe; im Ergebnis hat man aber eine Arbeitsplattform, einschließlich Debugger, ohne unverständliche Skripte oder kryptischen Make-Files. Über diese beiden Links&lt;br /&gt;
&lt;br /&gt;
* [[Eclipse und MSPGCC unter Windows]] (03/2009)&lt;br /&gt;
* [http://matthias-hartmann.blogspot.com/ Use Eclipse and mspgcc - the easy way] (Windows 02/2009)&lt;br /&gt;
&lt;br /&gt;
findet man zwei verschiedenartige Lösungen der Installation unter Windows. Obwohl beide Varianten auf teils verschiedene Werkzeuge zurückgreifen, sind sie kombinierbar und ergeben damit Spielraum für persönliche Vorlieben.&lt;br /&gt;
&lt;br /&gt;
=== [http://www.zilog.com/ Zilog] ===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!System&lt;br /&gt;
!Preis&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.zilog.com/index.php?option=com_product&amp;amp;Itemid=26&amp;amp;mode=showProdDet&amp;amp;businessLine=1&amp;amp;familyId=6&amp;amp;productId=ZUSBSC00100ZACG USB Smart Kabel]&lt;br /&gt;
| ~ 30$&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.zilog.com/index.php?option=com_product&amp;amp;Itemid=26&amp;amp;mode=showProdDet&amp;amp;businessLine=1&amp;amp;familyId=6&amp;amp;productId=ZENETSC0100ZACG Ethernet Smart Kabel]&lt;br /&gt;
| ~ 70$&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die [[Zilog]] Entwicklungssysteme [http://www.zilog.com/index.php?option=com_content&amp;amp;task=view&amp;amp;id=40&amp;amp;Itemid=137 ZDS II] (C/ASM) für [http://www.zilog.com/index.php?option=com_product&amp;amp;Itemid=26&amp;amp;mode=showFamilyDetails&amp;amp;familyId=5&amp;amp;parent_id=2 Z8 Encore!®], [http://www.zilog.com/index.php?option=com_product&amp;amp;Itemid=26&amp;amp;mode=showFamilyDetails&amp;amp;familyId=6&amp;amp;parent_id=2 Z8 Encore! XP®], [http://www.zilog.com/index.php?option=com_product&amp;amp;Itemid=26&amp;amp;mode=showFamilyDetails&amp;amp;familyId=7&amp;amp;parent_id=2 Z8 Encore! MC™] sowie [http://www.zilog.com/index.php?option=com_product&amp;amp;Itemid=26&amp;amp;mode=showFamilyDetails&amp;amp;familyId=8&amp;amp;parent_id=2 ZNEO™ Z16F] Controller haben keine Beschränkungen sind aber ganz zu Unrecht in Europa kaum bekannt oder erhältlich.&lt;br /&gt;
&lt;br /&gt;
== Programmübertragung ==&lt;br /&gt;
Im Idealfall stellt sich die Frage, wie das Programm in den Mikrocontroller kommt, für den Programm-Entwickler nicht. Die Debugging-Hardware erledigt diese Aufgabe ganz unauffällig mit. Da die Umstände aber nicht immer ideal sind, muss der Entwickler manchmal auf andere Methoden zurückgreifen.&lt;br /&gt;
&lt;br /&gt;
Früher wurden überwiegend teure und umständlich zu handhabende Programmiergeräte verwendet, mit deren Hilfe der Programmspeicher außerhalb des Zielsystems gefüllt wurde. Heute sind die meisten Mikrocontroller über verschiedene ISP-Schnittstellen oder über das [[UART]] ‚In-System’-programmierbar.&lt;br /&gt;
&lt;br /&gt;
Die ISP-Schnittstelle ist entweder als universelle Debugging- und Programmier-Schnittstelle, z.&amp;amp;nbsp;B. [[JTAG]], oder als dedizierte Programmier-Schnittstelle realisiert. Für den zweiten Fall benötigt man einen speziellen Programmier-Adapter den man, meistens in verschiedenen Ausführungen, kaufen oder selber bauen kann. Dazugehörig ist ein passendes Programmier-Programm für den PC. Spezialisierte Programmier-Adapter und –Programme werden auch gern in der laufenden Produktion eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Mikrocontroller mit integriertem [[Bootloader]] können mit der entsprechenden PC-Software direkt über den seriellen Port programmiert werden.&lt;br /&gt;
&lt;br /&gt;
[[Category:Mikrocontroller| ]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=MSP430_Codebeispiele&amp;diff=60801</id>
		<title>MSP430 Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=MSP430_Codebeispiele&amp;diff=60801"/>
		<updated>2011-09-29T10:20:39Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Initialisierung der GPIO */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;MSP430 &amp;amp;#8211; Codebeispiele&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Einleitung:&#039;&#039;&#039;&lt;br /&gt;
Da der MSP430 eine sehr schöner Mikrocontroller für energiesparende Anwendungen ist, jedoch bei weitem nicht so verbreitet wie z.&amp;amp;nbsp;B. diverse 8051er, AVRs, PICs usw. ist, gibt es auch nicht all zu viele Codebeispiele aus Projekten für den/die Hobbybastler(in).&lt;br /&gt;
Aus diesem Grund werden hier Grundlagen der Initialisierung diverser Hardwarefeatures sowie grundlegende Softwareroutinen und dergleichen beschrieben, so dass für Anfänger auch ein einfaches Copy&amp;amp;Paste möglich ist.&lt;br /&gt;
Hierbei kommt der MSPGCC zum Einsatz, da eine professionelle unlimitierte Ausgabe des z.&amp;amp;nbsp;B. IAR für Bastler nahezu unbezahlbar ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Hardware =&lt;br /&gt;
&lt;br /&gt;
== Initializing/ Configuring UARTs ==&lt;br /&gt;
Von www.mathar.com stammt diese Routine zur initialisierung eines beliebigen UARTS. Zusätzlich müssen jedoch die Pins noch definiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void InitUSART(char USART0, char USART1, unsigned int baudrate1, unsigned int baudrate2, char IR0, char IR1)&lt;br /&gt;
{&lt;br /&gt;
  if (USART0) ME1 |= UTXE0 + URXE0;    // falls gesetzt, USART0 einschalten (TX- und RX-teil)&lt;br /&gt;
  if (USART1) ME2 |= UTXE1 + URXE1;    // falls gesetzt, USART1 einschalten (TX- und RX-teil)&lt;br /&gt;
  UCTL0 |= CHAR;                       // 8 data bits, 1 stop bit, no parity (8N1)&lt;br /&gt;
  UCTL1 |= CHAR;&lt;br /&gt;
  UTCTL0 |= SSEL1;                     // SMCLK als UCLK festlegen&lt;br /&gt;
  UTCTL1 |= SSEL1;&lt;br /&gt;
  if (baudrate1==19200)&lt;br /&gt;
  {&lt;br /&gt;
    UBR00 = 0xA0;                      // 19200 baud aus 8 MHz erzeugen&lt;br /&gt;
    UBR10 = 0x01;                      // siehe application note tabelle 1, seite 9&lt;br /&gt;
    UMCTL0 = 0x00;                     // keine korrektur der division noetig&lt;br /&gt;
  }&lt;br /&gt;
  if (baudrate2==19200)&lt;br /&gt;
  {&lt;br /&gt;
    UBR01 = 0xA0;                      // 19200 baud aus 8 MHz erzeugen&lt;br /&gt;
    UBR11 = 0x01;                      // siehe application note tabelle 1, seite 9&lt;br /&gt;
    UMCTL1 = 0x00;                     // keine korrektur der division noetig&lt;br /&gt;
  }&lt;br /&gt;
  if (USART0) UCTL0 &amp;amp;= ~SWRST;         // USART freigeben&lt;br /&gt;
  if (USART1) UCTL1 &amp;amp;= ~SWRST;&lt;br /&gt;
  if (IR0==0) IE1 |= URXIE0;           // IR0: 0 -&amp;gt; nur RX-interrupt anschalten&lt;br /&gt;
  if (IR0==1) IE1 |= UTXIE0;           //      1 -&amp;gt; nur TX-interrupt anschalten&lt;br /&gt;
  if (IR0==2) IE1 |= URXIE0 + UTXIE0;  //      2 -&amp;gt; TX- und RX-interrupt anschalten&lt;br /&gt;
  if (IR1==1||IR1==2) IFG1 &amp;amp;= ~UTXIFG0;  // initales interrupt-flag loeschen&lt;br /&gt;
  if (IR1==0) IE2 |= URXIE1;           // IR1: 0 -&amp;gt; nur RX-interrupt anschalten&lt;br /&gt;
  if (IR1==1) IE2 |= UTXIE1;           //      1 -&amp;gt; nur TX-interrupt anschalten&lt;br /&gt;
  if (IR1==2) IE2 |= URXIE1 + UTXIE1;  //      2 -&amp;gt; TX- und RX-interrupt anschalten&lt;br /&gt;
  if (IR1==1||IR1==2) IFG1 &amp;amp;= ~UTXIFG1;  // initales interrupt-flag loeschen&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialization/configuration of USART (SPI and I2C/TWI) ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_spi(void)&lt;br /&gt;
{&lt;br /&gt;
  ME1 |= USPIE0;                        // Enable USART0 SPI mode&lt;br /&gt;
  UTCTL0 = CKPH+SSEL1+SSEL0+STC;        // SMCLK, 3-pin mode&lt;br /&gt;
  UCTL0 = CHAR+SYNC+MM;                 // 8-bit SPI Master **SWRST**&lt;br /&gt;
  UBR00 = 0x02;                         // UCLK/2 &lt;br /&gt;
  UBR10 = 0x00;                         // 0&lt;br /&gt;
  UMCTL0 = 0x00;                        // no modulation&lt;br /&gt;
  P3SEL |= 0x0E;                        // P3.1-3 SPI option select&lt;br /&gt;
  P3DIR |= 0x01;                        // P3.0 output direction&lt;br /&gt;
  _EINT();                              // Enable interrupts&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void init_i2c(unsigned char slave)&lt;br /&gt;
{&lt;br /&gt;
  P3SEL |= 0x0a;                            // Assign I2C pins to module&lt;br /&gt;
  U0CTL |= I2C + SYNC;                      // Switch USART0 to I2C mode&lt;br /&gt;
  U0CTL &amp;amp;= ~I2CEN;                          // Recommended I2C init procedure&lt;br /&gt;
  I2CTCTL = I2CSSEL_2;                      // SMCLK&lt;br /&gt;
  I2CSCLH = 0x03;                           // High period of SCL&lt;br /&gt;
  I2CSCLL = 0x03;                           // Low period of SCL&lt;br /&gt;
  I2CNDAT = 0x01;                           // Transmit one byte&lt;br /&gt;
  I2CSA = slave;                             // Slave address&lt;br /&gt;
  U0CTL |= I2CEN;                           // Enable I2C, 7 bit addr,&lt;br /&gt;
  I2CIE = RXRDYIE;                          // I2C receive ready interrupt enable&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung der Quarze ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_XT2(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned int i;&lt;br /&gt;
  WDTCTL = WDTPW + WDTHOLD;             // Stop WDT&lt;br /&gt;
  BCSCTL1 &amp;amp;= ~XT2OFF;                   // XT2 = HF XTAL&lt;br /&gt;
  do &lt;br /&gt;
  {&lt;br /&gt;
    IFG1 &amp;amp;= ~OFIFG;                       // Clear OSCFault flag&lt;br /&gt;
    for (i = 0xFF; i &amp;gt; 0; i--);           // Time for flag to set&lt;br /&gt;
  }&lt;br /&gt;
  while ((IFG1 &amp;amp; OFIFG) != 0);          // OSCFault flag still set?                &lt;br /&gt;
  BCSCTL2 |= SELM1;                     // MCLK = XT2 (safe)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_XT(void) // high frequenz resonators ( 455 kHz - 8MhZ )&lt;br /&gt;
{&lt;br /&gt;
  unsigned int i;&lt;br /&gt;
  WDTCTL = WDTPW + WDTHOLD;             // Stop WDT&lt;br /&gt;
  BCSCTL1 |= XTS;                       // ACLK = LFXT1 = HF XTAL&lt;br /&gt;
  do &lt;br /&gt;
  {&lt;br /&gt;
    IFG1 &amp;amp;= ~OFIFG;                       // Clear OSCFault flag&lt;br /&gt;
    for (i = 0xFF; i &amp;gt; 0; i--);           // Time for flag to set&lt;br /&gt;
  }&lt;br /&gt;
  while ((IFG1 &amp;amp; OFIFG) == OFIFG);      // OSCFault flag still set?                &lt;br /&gt;
  BCSCTL2 |= SELM1+SELM0;               // MCLK = LFXT1 (safe)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Bei den neueren MSP430F55xx nicht vergessen, dass bei CPU-Taktfrequenzen über 8 MHz vorher die Kernspannung erhöht werden muss, sonst drohen Abstürze oder „rätselhaftes“ Verhalten. Eins der TI-Beispiele (12 MHz) „vergisst“ das sogar.&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des ADCs ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_ADC(void)&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0 = ADC12ON;	// ADC12ON / reference on Avcc&lt;br /&gt;
  P6SEL |= 0x01;        // P6.0 ADC option select &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
unsigned int sampling_ADC(void)&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0 |= ADC12SC + ENC;   // Sampling open&lt;br /&gt;
  ADC12CTL0 &amp;amp;= ~ADC12SC;        // Sampling closed, start conversion&lt;br /&gt;
  while ((ADC12CTL1 &amp;amp; ADC12BUSY) == 1);   // ADC12BUSY?&lt;br /&gt;
  return(ADC12MEM0);	// return the value read from ADC P6.0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des DACs ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void init_DAC(void)&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0 = REF2_5V + REFON;              // Internal 2.5V ref on&lt;br /&gt;
  DAC12_0CTL = DAC12IR + DAC12AMP_5 + DAC12ENC;   // Internal ref gain &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void write_DAC(unsigned int val)&lt;br /&gt;
{&lt;br /&gt;
  DAC12_0DAT = val;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des Timers A ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_TimerA(unsigned int cycles )&lt;br /&gt;
{&lt;br /&gt;
  TACTL = TASSEL1 + TACLR;              // SMCLK, clear TAR&lt;br /&gt;
  CCTL0 = CCIE;                         // CCR0 interrupt enabled&lt;br /&gt;
  CCR0 = cycles;&lt;br /&gt;
  TACTL |= MC_2;                         // Start Timer_A in continuous mode&lt;br /&gt;
  _EINT();                              // interrupt enable&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Timer A0 interrupt service routine&lt;br /&gt;
interrupt (TIMERA0_VECTOR) Timer_A(void)&lt;br /&gt;
{&lt;br /&gt;
  P1OUT ^= 0x01;                        // Toggle P1.0&lt;br /&gt;
  CCR0 += 50000;                        // Add Offset to CCR0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des Timers B ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_TimerB(unsigned int cycles)&lt;br /&gt;
{&lt;br /&gt;
  TBCTL = TBSSEL1 + TBCLR;              // SMCLK, clear TAR&lt;br /&gt;
  TBCCTL0 = CCIE;                       // CCR0 interrupt enabled&lt;br /&gt;
  TBCCR0 = cycles;&lt;br /&gt;
  TBCTL |= MC_2;                         // Start Timer_B in continuous mode&lt;br /&gt;
  _EINT();                              // interrupt enable&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Timer B0 interrupt service routine&lt;br /&gt;
interrupt (TIMERB0_VECTOR) Timer_B(void)&lt;br /&gt;
{&lt;br /&gt;
  P1OUT ^= 0x01;                        // Toggle P1.0&lt;br /&gt;
  TBCCR0 += 50000;                      // Add Offset to CCR0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des Watchdogs ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_wdt(void)&lt;br /&gt;
{&lt;br /&gt;
  WDTCTL = WDT_MDLY_32;                 // Set Watchdog Timer interval to ~30ms&lt;br /&gt;
  IE1 |= WDTIE;                         // Enable WDT interrupt&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Watchdog Timer interrupt service routine&lt;br /&gt;
interrupt (WDT_VECTOR) watchdog_timer(void)&lt;br /&gt;
{&lt;br /&gt;
  // do this, in an case of an interrupt&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  WDTCTL = WDTPW + WDTHOLD;	// Watchdog anhalten&lt;br /&gt;
  P1DIR |= 0x01;		// P1.0 als Ausgang&lt;br /&gt;
&lt;br /&gt;
  for (;;)&lt;br /&gt;
  {&lt;br /&gt;
    volatile unsigned i;	// volatile, sonst wird die Warteschleife „wegoptimiert“&lt;br /&gt;
    P1OUT ^= 0x01;		// P1.0 umschalten mit Exklusiv-ODER&lt;br /&gt;
&lt;br /&gt;
    i = 10000;			// Warteschleife in Software&lt;br /&gt;
    do; while (--i);		// (CPU-Leistung „verheizen“)&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung der GPIO ==&lt;br /&gt;
Die Ein/Ausgabeleitungen haben beim MSP430, je nach Ausbaustufe, folgende Fähigkeiten:&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Einzeln (bitweise) programmierbare Ein/Ausgabe (&amp;lt;b&amp;gt;PxDIR&amp;lt;/b&amp;gt;, &amp;lt;b&amp;gt;PxOUT&amp;lt;/b&amp;gt;)&lt;br /&gt;
&amp;lt;li&amp;gt;Unabhängige Lese-Adresse (&amp;lt;b&amp;gt;PxIN&amp;lt;/b&amp;gt;)&lt;br /&gt;
&amp;lt;li&amp;gt;Ansprechbar als 8-Bit-Ports oder je paarweise als 16-bit-Port, bspw. P1 + P2 = PA usw.&lt;br /&gt;
&amp;lt;li&amp;gt;Interrupt auf Pegelwechsel einzelner Portpins (nur P1 und P2) (&amp;lt;b&amp;gt;PxIES&amp;lt;/b&amp;gt;)&lt;br /&gt;
&amp;lt;li&amp;gt;Pull-Up, Pull-Down oder kein Widerstand auswählbar (&amp;lt;b&amp;gt;PxREN&amp;lt;/b&amp;gt;, PxOUT)&lt;br /&gt;
&amp;lt;li&amp;gt;Einstellbare Treiberstärke (reduziert und voll) (&amp;lt;b&amp;gt;PxDS&amp;lt;/b&amp;gt;)&lt;br /&gt;
&amp;lt;li&amp;gt;Ein bis zwei Peripheriefunktionen pro Pin (&amp;lt;b&amp;gt;PxSEL&amp;lt;/b&amp;gt;), auswählbar mittels PxDIR (d.h. bei zwei Peripheriefunktionen ist eine Ausgang und die andere Eingang)&lt;br /&gt;
&amp;lt;li&amp;gt;Das JTAG-Port (4 Pins) und das USB-Port (2 Pins) ist standardmäßig ein E/A-Port (MSP430F55xx)&lt;br /&gt;
&amp;lt;li&amp;gt;Erweiterte Peripheriezuordnung bei P4 (MSP430F55xx) mittels Port Mapping Controller&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Nicht 5-V-verträglich!!&amp;lt;/b&amp;gt; Keinem Portpin darf ohne genügend großen Vorwiderstand 5 V angeboten werden. Ableitströme dürfen nicht zum Ansteigen der Speisespannung führen!&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Manche Portpins haben ein gemeinsames PxSEL, etwa:&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;das JTAG-Port (entweder alle 4 oder kein Pin zugeordnet)&lt;br /&gt;
&amp;lt;li&amp;gt;das USB-Port (entweder Portpin oder USB D+ und D–)&lt;br /&gt;
&amp;lt;li&amp;gt;die Quarz-Anschlüsse (das niederwertige PxSEL schaltet beide Portpins)&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle Portpins sind beim Einschalten (PUC) wie folgt initialisiert:&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Eingang ohne Pull-Up oder Pull-Down&lt;br /&gt;
&amp;lt;li&amp;gt;Reduzierte Treiberstärke&lt;br /&gt;
&amp;lt;li&amp;gt;Kein Pegelwechsel-Interrupt&lt;br /&gt;
&amp;lt;li&amp;gt;Keine Peripherie-Zuordnung&lt;br /&gt;
&amp;lt;li&amp;gt;Der Inhalt des Ausgaberegisters &amp;lt;b&amp;gt;PxOUT&amp;lt;/b&amp;gt; ist undefiniert!&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Alle ungenutzten Anschlüsse sollten per PullDown (&amp;lt;b&amp;gt;PxREN&amp;lt;/b&amp;gt; und &amp;lt;b&amp;gt;PxOUT&amp;lt;/b&amp;gt;) festgelegt werden.&lt;br /&gt;
&lt;br /&gt;
Kein MSP430 hat einen herausgeführten Busanschluss, etwa um mehr RAM anzubinden.&lt;br /&gt;
&lt;br /&gt;
== Initialisierung von PWM ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void init_PWM_TimerA(void)&lt;br /&gt;
{&lt;br /&gt;
  TACTL = TASSEL1 + TACLR;              // SMCLK, Clear Tar&lt;br /&gt;
  CCR0 = 512-1;                         // PWM Period&lt;br /&gt;
  CCTL1 = OUTMOD_7;                     // CCR1 reset/set&lt;br /&gt;
  P1DIR |= 0x04;                        // P1.2 PWM output&lt;br /&gt;
  P1SEL |= 0x04;                        // P1.2 and TA1/2 otions&lt;br /&gt;
  TACTL |= MC0;                         // Start Timer_A in up mode&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void set_PWM_duty_cycle(unsigned char duty)&lt;br /&gt;
{&lt;br /&gt;
  CCR1 = duty;                           // CCR1 PWM duty cycle &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= Interrupts: =&lt;br /&gt;
&lt;br /&gt;
== UARTs ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// z. B. ein Echo mit dem MSPGCC-Compiler:&lt;br /&gt;
interrupt (UART0RX_VECTOR) usart0_rx(void)&lt;br /&gt;
{&lt;br /&gt;
   TXBUF0=RXBUF0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// z. B. ein Echo mit dem ImageCraft ICC430-Compiler:&lt;br /&gt;
#pragma interrupt_handler usart0_rx:UART0RX_VECTOR&lt;br /&gt;
void usart0_rx(void)&lt;br /&gt;
{&lt;br /&gt;
   TXBUF0=RXBUF0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Die Funktionen selbst können natürlich auch anders genannt werden.&lt;br /&gt;
&lt;br /&gt;
== Timer ==&lt;br /&gt;
&lt;br /&gt;
== IOs ==&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= Softwareroutinen: =&lt;br /&gt;
&lt;br /&gt;
== I2C/TWI in Software ==&lt;br /&gt;
Diese Routinen wurden ursprünglich für einen MSP430F149 geschrieben. Es werden ausschließlich IOs benutzt. Da Code in C geschrieben wurde sollte er sich einfach auf alle MSP430s ohne (aber auch mit I²C) portieren lassen. Der ist zwar nicht ganz schön, aber er funktioniert soweit ganz gut. Auch ein Beispiel ist dabei.&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/attachment.php/324877/soft-i2c.zip&lt;br /&gt;
&lt;br /&gt;
== PWM ==&lt;br /&gt;
&lt;br /&gt;
Untenstehender Code ist nur mit msp320-gcc getestet.&lt;br /&gt;
&lt;br /&gt;
Folgende Routine initialisiert den Timer als Up-Counter mit der Clock-Quelle SMCLK und einem Teiler von 8. Zudem wird der Interrupt aktiviert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void timerA_init(void)&lt;br /&gt;
{&lt;br /&gt;
	TACTL =  TASSEL_SMCLK | TACLR | ID_DIV8 | TAIE;&lt;br /&gt;
	TACTL |= MC_UPTO_CCR0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um den Timer zu starten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void timerA_start(int timing[2], int mode)&lt;br /&gt;
{&lt;br /&gt;
	TACCTL0 = mode;&lt;br /&gt;
	TACCTL0 |= CCIE ;                // enable interrupt&lt;br /&gt;
	TACCTL1 = mode;&lt;br /&gt;
	TACCR0 = timing[0];&lt;br /&gt;
	TACCR1 = timing[1];&lt;br /&gt;
	TAR = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktion wird normalerweise mit &#039;mode&#039; 3 aufgerufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
timerA_start(timing, OUTMOD_SET_RESET);&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
timing[0] enthaelt die komplette Zyklendauer einer PWM-Phase (H und L)&lt;br /&gt;
Beispiel: Um eine Pulsfrequenz von 125 Hz bei einem SMCLK von 1.0 MHz zu erhalten, gilt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;timing_0 = 1.0e6 / 8 / 125 = 1000&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
timing[1] schliesslich enthält die Zyklendauer des H-Pulses und ist immer kleiner als timing[0]. Bei einem &#039;duty cycle&#039; (Tastverhältnis) 50% gilt also&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;timing_1 = 500&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zu beachten ist, dass der Timerkanal 0 bei manchen Modi (wie dem obenstehenden) für die PWM nicht genutzt wird, &amp;quot;TACCTL0 = mode&amp;quot; keinen speziellen Effekt zeigt (siehe auch Manual).&lt;br /&gt;
&lt;br /&gt;
Deswegen wird das PWM-Signal auch an TA1 abgegriffen, nicht an TA0.&lt;br /&gt;
&lt;br /&gt;
Schlussendlich muss der entsprechende Ausgangspin für TA1 konfiguriert werden. Beim F2013 z.&amp;amp;nbsp;B. geschieht dies für P1.2 per&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	P1SEL |= 0x04;  // Enable primary peripheral&lt;br /&gt;
	P1DIR |= 0x04;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was war nun mit dem Interrupt? Falls wir z.&amp;amp;nbsp;B. die Zyklen zählen wollen, definieren wir einen Interrupt-Handler:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;signal.h&amp;gt; // &#039;interrupt&#039; makro&lt;br /&gt;
interrupt (TIMERA0_VECTOR) timera0_isr(void)&lt;br /&gt;
{&lt;br /&gt;
	g_count++;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Schlussendlich müssen wir noch die Interrupts im Initialisierungscode aktivieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
_EINT();&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Senden eines Bytes ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void SendUSART0c(char c)             // ein einzelnes zeichen über die serielle schnittstelle (USART0) senden&lt;br /&gt;
                                     // FJG: Obacht: x12xx : IFG1 =&amp;gt; IFG2 !&lt;br /&gt;
{&lt;br /&gt;
  while (!(IFG1 &amp;amp; UTXIFG0));           // warten, bis USART0 TX-buffer sendebereit&lt;br /&gt;
  TXBUF0 = c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SendUSART1c(char c)             // ein einzelnes zeichen über die serielle schnittstelle (USART1) senden&lt;br /&gt;
{&lt;br /&gt;
  while (!(IFG2 &amp;amp; UTXIFG1));           // warten, bis USART1 TX-buffer sendebereit&lt;br /&gt;
  TXBUF1 = c;&lt;br /&gt;
}     &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Senden eines Strings ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void SendUSART0(char* str)             // einen string über die serielle schnittstelle (USART0) senden&lt;br /&gt;
{&lt;br /&gt;
  while (*str != 0)&lt;br /&gt;
  {&lt;br /&gt;
    while (!(IFG1 &amp;amp; UTXIFG0));         // warten, bis USART0 TX-buffer sendebereit&lt;br /&gt;
    TXBUF0 = *str++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SendUSART1(char* str)             // einen string über die serielle schnittstelle (USART1) senden&lt;br /&gt;
{&lt;br /&gt;
  while (*str != 0)&lt;br /&gt;
  {&lt;br /&gt;
    while (!(IFG2 &amp;amp; UTXIFG1));         // warten, bis USART1 TX-buffer sendebereit&lt;br /&gt;
    TXBUF1 = *str++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Empfangen eines Bytes (interruptgesteuert)  // Receiving a byte-&amp;gt; Interrupt controlled ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/*Hab diese Interrupt Funktion für meine I²C Kommunikation verwendet&lt;br /&gt;
Startcondition wird erkannt, aber nicht Stop, da man die Flanken(die den&lt;br /&gt;
interrupt auslösen) umkehren müsste, aber dann keine Startkondition erkannt werden kann.&lt;br /&gt;
&lt;br /&gt;
Hab mir jetzt nicht die mühe gemacht alles rauszupicken was ihr nicht braucht.&lt;br /&gt;
Wer sich auskennt, kann das auch selber machen.&lt;br /&gt;
&lt;br /&gt;
Das Busy wird fürs stretching verwendet(CLK wird auf low gezogen)&lt;br /&gt;
*/  &lt;br /&gt;
&lt;br /&gt;
#pragma vector = PORT1_VECTOR           // Port 1 - Interrupt-Funktions-&amp;quot;Alias&amp;quot;&lt;br /&gt;
__interrupt void Interrupt_Port1()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
//  I2CTransfer = 0;&lt;br /&gt;
&lt;br /&gt;
    TACTL |= TACLR;&lt;br /&gt;
    TACTL |= TAIE;&lt;br /&gt;
#ifdef WD&lt;br /&gt;
    WDTCTL = WDTPW + WDTCNTCL;&lt;br /&gt;
#endif&lt;br /&gt;
    &lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
  if ((P1IFG &amp;amp; 0x04) &amp;amp;&amp;amp; !(I2CCLK)) { //if startdataimpuls but clk low is detected --return--&lt;br /&gt;
    P1IFG &amp;amp;= ~0x0C;&lt;br /&gt;
    return;}&lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
//    P1IE &amp;amp;= ~0x0C;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
  if ((P1IFG &amp;amp; 0x04) &amp;amp;&amp;amp; I2CCLK)   //Start Condition       (I2CStart)&lt;br /&gt;
    {&lt;br /&gt;
      P1IFG &amp;amp;= ~0x0C;&lt;br /&gt;
      &lt;br /&gt;
//    I2CTransfer = 1;&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
        P1IE &amp;amp;= ~0x0C;&lt;br /&gt;
//        TACTL |= TACLR;&lt;br /&gt;
//        TACTL |= TAIE;&lt;br /&gt;
//        _EINT();&lt;br /&gt;
&lt;br /&gt;
      &lt;br /&gt;
/*#ifdef Debug&lt;br /&gt;
      P2OUT |= 0x04;&lt;br /&gt;
      P2DIR |= 0x04; &lt;br /&gt;
#endif*/&lt;br /&gt;
      &lt;br /&gt;
//      Wait(10);&lt;br /&gt;
//      while(I2CCLK)  {CheckTimer;}&lt;br /&gt;
&lt;br /&gt;
//      set_Busy;&lt;br /&gt;
  &lt;br /&gt;
      BitCnt = 0x01;&lt;br /&gt;
      ByteCnt = 0;&lt;br /&gt;
//      I2CByte = 0;&lt;br /&gt;
      StartCondition = 1;&lt;br /&gt;
//      CRCByte = 0x00;&lt;br /&gt;
      GetData = 0;&lt;br /&gt;
      I2CTransfer = 0;&lt;br /&gt;
    &lt;br /&gt;
//    clr_Busy;&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
        _DINT();&lt;br /&gt;
        P1IE |= 0x0C;&lt;br /&gt;
&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
  P1IFG &amp;amp;= ~0x0C;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
    TACTL |= TACLR;&lt;br /&gt;
    _EINT();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----------------------------------------------------------------------------&lt;br /&gt;
  if (I2CCLK)&lt;br /&gt;
  {&lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
      TACTL |= TAIE;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    I2CByte &amp;lt;&amp;lt;= 1; &lt;br /&gt;
    if (I2CDAT){&lt;br /&gt;
      I2CByte += 0x01;&lt;br /&gt;
     }&lt;br /&gt;
    I2CTransfer = 1;&lt;br /&gt;
    while(I2CCLK) {CheckTimer;}&lt;br /&gt;
    set_Busy;&lt;br /&gt;
    BitCnt &amp;lt;&amp;lt;= 1;&lt;br /&gt;
  &lt;br /&gt;
    if(!(BitCnt == 0x00))&lt;br /&gt;
    {&lt;br /&gt;
      clr_Busy;  &lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      _NOP();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
  }&lt;br /&gt;
//----------------------------------------------------------------------------  &lt;br /&gt;
&lt;br /&gt;
P1DIR &amp;amp;= ~0x0C;&lt;br /&gt;
P1IFG = 0x00;&lt;br /&gt;
P1IE |= 0x0C;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ermitteln der Temperatur ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// von FJG info@aqua-sun.net :&lt;br /&gt;
// ---------------   Temperatur des Chips   ---------------------&lt;br /&gt;
&lt;br /&gt;
#define T_Faktor_a1000       ((long)103)     // REF 1,5V&lt;br /&gt;
#define T_Faktor_b1000       ((long)172)     // REF 2,5V&lt;br /&gt;
#define T_Faktor_c1000       ((long)278000)&lt;br /&gt;
&lt;br /&gt;
int Hole_Temp(void)	// Temperatur ch 10&lt;br /&gt;
{			// Temp = N* 0,17193 -278  1000Temp = N*172 -278000 bei 2,5V&lt;br /&gt;
  long Temp_L;&lt;br /&gt;
  int  Temp , Delta ;&lt;br /&gt;
&lt;br /&gt;
  Start_AD();&lt;br /&gt;
&lt;br /&gt;
  Temp_L = ((long)ADC12MEM10 * T_Faktor_a1000) - T_Faktor_c1000 ;&lt;br /&gt;
  Temp   = (int)( Temp_L / 1000);&lt;br /&gt;
&lt;br /&gt;
  Delta = Read_EEPROM( EPROM_INTERN_BL1_R_ADR,DELTA_TEMP_ADR );	   // falls Temp Messung&lt;br /&gt;
  if( Delta &amp;lt;= 120 &amp;amp;&amp;amp; Delta &amp;gt;= 80 ) Delta -= 100 ; else Delta = 0; // ungenau war&lt;br /&gt;
                                                                   // siehe dazu TI&lt;br /&gt;
  return (Temp + Delta);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// INIT AD&lt;br /&gt;
// AD muss angestoßen werden mit :   Start_AD()&lt;br /&gt;
&lt;br /&gt;
// #define ADC12TL0WERT15	(SHT1_8 + SHT0_3 + MSC + REFON + ADC12ON)&lt;br /&gt;
#define ADC12TL0WERT15		(SHT1_3 + SHT0_3 + MSC + REFON + ADC12ON)&lt;br /&gt;
#define ADC12TL0WERT25		(SHT1_3 + SHT0_3 + MSC + +REF2_5V + REFON + ADC12ON)&lt;br /&gt;
&lt;br /&gt;
//                        Start CH0 , ADC12SCBIT , SampleT , F/2 , MCLK , Sequenze of CH&lt;br /&gt;
#define ADC12CTL1WERT   ( CSTARTADD_0 + SHS_0 + SHP + ADC12DIV_1 + ADC12SSEL_2 + CONSEQ_1 )&lt;br /&gt;
&lt;br /&gt;
void adc12_init()	// ADC12CTL0 modifizieren nur mit ENC = 0&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0   = 0x00;&lt;br /&gt;
  ADC12CTL1   = ADC12CTL1WERT ;&lt;br /&gt;
&lt;br /&gt;
  ADC12MCTL0  = INCH_0;                  &lt;br /&gt;
  ADC12MCTL1  = INCH_1;                  &lt;br /&gt;
  ADC12MCTL2  = INCH_2;&lt;br /&gt;
  ADC12MCTL3  = INCH_3;&lt;br /&gt;
  ADC12MCTL4  = INCH_4;&lt;br /&gt;
  ADC12MCTL5  = INCH_5;&lt;br /&gt;
  ADC12MCTL6  = INCH_6;&lt;br /&gt;
  ADC12MCTL7  = INCH_7;                  &lt;br /&gt;
  ADC12MCTL8  = INCH_8;		// VeREF+&lt;br /&gt;
  ADC12MCTL9  = INCH_9;		// VeREF-&lt;br /&gt;
&lt;br /&gt;
  ADC12MCTL10 = INCH_10 + SREF_1 ;&lt;br /&gt;
  ADC12MCTL11 = INCH_11 + SREF_1 +EOS;&lt;br /&gt;
&lt;br /&gt;
  ADC12IE     = 0x00;&lt;br /&gt;
  ADC12CTL0   = ADC12TL0WERT15 ;&lt;br /&gt;
  ADC12CTL0  |= 0x0003;		// ENC + ADC12SC = Enable Conversation + StartConversation&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------   Diverses AD_Wandler   --------------------&lt;br /&gt;
&lt;br /&gt;
void Start_AD(void)&lt;br /&gt;
{&lt;br /&gt;
  ADC12CTL0 &amp;amp;= ~ENC;&lt;br /&gt;
  ADC12CTL0 |= (ADC12SC+ENC);&lt;br /&gt;
  NOP();&lt;br /&gt;
  NOP();&lt;br /&gt;
  ADC12CTL0 &amp;amp;=~ADC12SC;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#ifndef TEST_AD&lt;br /&gt;
#define Ist_AD_Busy()        ( ADC12CTL1 &amp;amp; ADC12BUSY )&lt;br /&gt;
#else&lt;br /&gt;
int Ist_AD_Busy()&lt;br /&gt;
{&lt;br /&gt;
  if (ADC12CTL1 &amp;amp; ADC12BUSY)&lt;br /&gt;
  {&lt;br /&gt;
     printf(&amp;quot;\n\r... BUSY ...&amp;quot;); &lt;br /&gt;
     delay_ms(500);&lt;br /&gt;
     return(1);&lt;br /&gt;
  }&lt;br /&gt;
  return(0);&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ansteuerung eines LCD &amp;amp;#8211; Zeichendisplays // Controlling the LCD character==&lt;br /&gt;
&lt;br /&gt;
Der folgende Quelltext-Schnipsel ist für Siebensegmentanzeigen gedacht,&lt;br /&gt;
&#039;&#039;nicht&#039;&#039; für die mit dem HD44780-kompatiblen Controller.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
  // hier nun der vollständige Code 14 Jan 08&lt;br /&gt;
  // von mir seinerseits entwickelt, ich hoffe, er ist eine Hilfe&lt;br /&gt;
 &lt;br /&gt;
  // Aquasun Germany  Remscheid  Franz-Josef Günther&lt;br /&gt;
  // Development info@aqua-sun.net&lt;br /&gt;
&lt;br /&gt;
  // LCD.h Header für Allgemeines zum LCD ab 02.12.04 Aquasun GUE&lt;br /&gt;
  // C-Compiler ICC&lt;br /&gt;
&lt;br /&gt;
  // -------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
  // Beispiel :&lt;br /&gt;
&lt;br /&gt;
int Aepfel = 8;&lt;br /&gt;
&lt;br /&gt;
print_LCD(&amp;quot;\nRotkaepchen hat %d Aepfel im Korb&amp;quot;,Aepfel);&lt;br /&gt;
&lt;br /&gt;
  // -------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;_const.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdarg.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt; STRING.H&amp;gt;&lt;br /&gt;
#include &amp;lt; stdio.h &amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LCD_MAX          8&lt;br /&gt;
#define Mem_LCD         16&lt;br /&gt;
&lt;br /&gt;
#ifndef Mem_LCD&lt;br /&gt;
#define Mem_LCD 20&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
    Header für 8 x 7 Segmentanzeigen 2 MUX MSP430 x4xx&lt;br /&gt;
&lt;br /&gt;
    V3 = V1 (VDD) , V5 = 0 ,&lt;br /&gt;
&lt;br /&gt;
    für : LCD siehe TI Info dazu,&lt;br /&gt;
    für : LED&#039;s :&lt;br /&gt;
&lt;br /&gt;
    LED mit gemeinsamer Kathode, SP über Buffer 74HC245 (8x) o.ä.&lt;br /&gt;
    /G=L , DIR=H A ==&amp;gt; B an 5V , COM mit Emitterfolger PNP ViL=0,8V ViH=2V&lt;br /&gt;
&lt;br /&gt;
    LED mit gemeinsamer Anode, COM über PNP Transistor invertiert&lt;br /&gt;
    und SP über ULN2804(8x) getrieben&lt;br /&gt;
            _   ___   ___   ___&lt;br /&gt;
    COM0 :   |_|   |_|   |_|&lt;br /&gt;
            ____   ___   ___&lt;br /&gt;
    COM1 :      |_|   |_|   |_|&lt;br /&gt;
             __    __    __&lt;br /&gt;
    SPon :  |  |__|  |__|  |__| mit COM0&lt;br /&gt;
&lt;br /&gt;
    SPin :   0  1  2  3  4  5  6  7    8  9 10 11 12 13 14 15&lt;br /&gt;
    COM0 :  1a 1b 1c 1d 1e 1f 1g 1h   2a 2b 2c 2d 2e 2f 2g 2h&lt;br /&gt;
    COM1 :  5a 5b 5c 5d 5e 5f 5g 5h   6a 6b 6c 6d 6e 6f 6g 6h&lt;br /&gt;
&lt;br /&gt;
    SPin :  16 17 18 19 20 21 22 23   24 25 26 27 28 29 30 31&lt;br /&gt;
    COM0 :  3a 3b 3c 3d 3e 3f 3g 3h   4a 4b 4c 4d 4e 4f 4g 4h&lt;br /&gt;
    COM1 :  7a 7b 7c 7d 7e 7f 7g 7h   8a 8b 8c 8d 8e 8f 8g 8h&lt;br /&gt;
&lt;br /&gt;
    COM        3 2   1  0   3 2   1  0&lt;br /&gt;
    MAP 0A0    - -   8h 4h  - -   8g 4g&lt;br /&gt;
        09F    - -   8f 4f  - -   8e 4e&lt;br /&gt;
        09E    - -   8d 4d  - -   8c 4c&lt;br /&gt;
        09D    - -   8b 4b  - -   8a 4a&lt;br /&gt;
&lt;br /&gt;
        09C    - -   7h 3h  - -   7g 3g&lt;br /&gt;
        09B    - -   7f 3f  - -   7e 3e&lt;br /&gt;
        09A    - -   7d 3d  - -   7c 3c&lt;br /&gt;
        099    - -   7b 3b  - -   7a 3a&lt;br /&gt;
&lt;br /&gt;
        098    - -   6h 2h  - -   6g 2g&lt;br /&gt;
        097    - -   6f 2f  - -   6e 2e&lt;br /&gt;
        096    - -   6d 2d  - -   6c 2c&lt;br /&gt;
        095    - -   6b 2b  - -   6a 2a&lt;br /&gt;
&lt;br /&gt;
        094    - -   5h 1h  - -   5g 1g&lt;br /&gt;
        093    - -   5f 1f  - -   5e 1e&lt;br /&gt;
        092    - -   5d 1d  - -   5c 1c&lt;br /&gt;
        091    - -   5b 1b  - -   5a 1a&lt;br /&gt;
&lt;br /&gt;
             ---a----&lt;br /&gt;
            |        |&lt;br /&gt;
          f |        | b&lt;br /&gt;
            |        |&lt;br /&gt;
             ---g----&lt;br /&gt;
            |        |&lt;br /&gt;
          e |        | c&lt;br /&gt;
            |        |    _&lt;br /&gt;
              ---d---    | | h&lt;br /&gt;
                          -&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
#define a0      0x01  // Char durch rechtsschiften &amp;amp; 0x..&lt;br /&gt;
#define b0      0x10&lt;br /&gt;
#define c0      0x02&lt;br /&gt;
#define d0      0x20&lt;br /&gt;
#define e0      0x04&lt;br /&gt;
#define f0      0x40&lt;br /&gt;
#define g0      0x08&lt;br /&gt;
#define h0      0x80&lt;br /&gt;
&lt;br /&gt;
#define ch_0    ( e0+f0+a0+b0+c0+d0 )&lt;br /&gt;
#define ch_1    ( b0+c0 )&lt;br /&gt;
#define ch_2    ( a0+b0+g0+e0+d0 )&lt;br /&gt;
#define ch_3    ( a0+b0+g0+c0+d0 )&lt;br /&gt;
#define ch_4    ( f0+g0+b0+c0 )&lt;br /&gt;
#define ch_5    ( a0+f0+g0+c0+d0 )&lt;br /&gt;
#define ch_6    ( a0+f0+c0+d0+e0+g0 )&lt;br /&gt;
#define ch_7    ( a0+b0+c0 )&lt;br /&gt;
#define ch_8    ( a0+b0+c0+d0+e0+f0+g0 )&lt;br /&gt;
#define ch_9    ( a0+b0+c0+f0+g0 )&lt;br /&gt;
&lt;br /&gt;
#define ch_a    ( a0+b0+c0+d0+e0+g0 )&lt;br /&gt;
#define ch_A    ( e0+f0+a0+b0+c0+g0 )&lt;br /&gt;
#define ch_B    ( a0+b0+c0+d0+e0+f0+g0 )&lt;br /&gt;
#define ch_b    ( f0+e0+d0+c0+g0 )&lt;br /&gt;
#define ch_c    ( g0+e0+d0 )&lt;br /&gt;
#define ch_C    ( a0+f0+e0+d0 )&lt;br /&gt;
#define ch_d    ( b0+c0+d0+e0+g0 )&lt;br /&gt;
#define ch_D    ( e0+f0+a0+b0+c0+d0 )&lt;br /&gt;
#define ch_e    ( f0+e0+d0+a0+b0+g0 )&lt;br /&gt;
#define ch_E    ( a0+f0+g0+d0+e0 )&lt;br /&gt;
#define ch_F    ( a0+f0+g0+e0 )&lt;br /&gt;
#define ch_G    ( a0+f0+c0+d0+e0+g0 )&lt;br /&gt;
#define ch_g    ( a0+b0+c0+d0+f0+g0 )&lt;br /&gt;
#define ch_h    ( f0+c0+e0+g0 )&lt;br /&gt;
#define ch_H    ( f0+c0+e0+g0+b0 )&lt;br /&gt;
#define ch_I    ( f0+e0 )&lt;br /&gt;
#define ch_i    ( e0 )&lt;br /&gt;
#define ch_k    ( b0+e0+f0+g0 )&lt;br /&gt;
#define ch_L    ( f0+e0+d0 )&lt;br /&gt;
#define ch_l    ( b0+c0 )&lt;br /&gt;
#define ch_M    ( c0+b0+e0+f0 )&lt;br /&gt;
&lt;br /&gt;
#define ch_n    ( e0+g0+c0 )&lt;br /&gt;
#define ch_N    ( a0+b0+c0+e0+f0 )&lt;br /&gt;
#define ch_o    ( e0+g0+c0+d0 )&lt;br /&gt;
#define ch_O    ( e0+f0+a0+b0+c0+d0 )&lt;br /&gt;
#define ch_P    ( e0+f0+a0+b0+g0 )&lt;br /&gt;
#define ch_r    ( g0+e0 )&lt;br /&gt;
#define ch_S    ( a0+f0+g0+c0+d0 )&lt;br /&gt;
#define ch_T    ( a0+f0+e0 )&lt;br /&gt;
#define ch_U    ( f0+e0+d0+c0+b0 )&lt;br /&gt;
#define ch_u    ( e0+d0+c0 )&lt;br /&gt;
#define ch_X    ( b0+g0+e0 )&lt;br /&gt;
#define ch_Y    ( f0+g0+b0+c0+d0 )&lt;br /&gt;
#define ch_Z    ( a0+b0+g0+e0+d0 )&lt;br /&gt;
#define ch_Blank  0&lt;br /&gt;
#define Unter_  ( d0 )&lt;br /&gt;
#define DP_Pkt  ( h0 )&lt;br /&gt;
#define Minus   ( g0 )&lt;br /&gt;
#define Tilde   ( a0+g0+d0 )&lt;br /&gt;
#define GLEICH  ( g0+d0 )&lt;br /&gt;
#define FRAGE   ( a0+f0+g0+c0+d0+h0 )&lt;br /&gt;
&lt;br /&gt;
// #define Digi_X1ste         LCDM17       // die erste freie LCD_Mem_Stelle 18,19,20&lt;br /&gt;
                                           // in lcd_init() auf 0&lt;br /&gt;
&lt;br /&gt;
// extern unsigned int Digi_X;             // für LCD&lt;br /&gt;
&lt;br /&gt;
const char  letter[] = &amp;quot;0123456789 _.-~?=AaBbCcDdEeFGgHhIiKkLlMmNnOoPRrSsTtUuxXYyZz&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
const int hex_Wert[] = {&lt;br /&gt;
      ch_0,    ch_1, ch_2, ch_3, ch_4, ch_5, ch_6, ch_7, ch_8, ch_9,&lt;br /&gt;
      ch_Blank, Unter_, DP_Pkt, Minus, Tilde, FRAGE , GLEICH ,&lt;br /&gt;
      ch_A, ch_a, ch_B, ch_b, ch_C, ch_c, ch_D, ch_d, ch_E, ch_e, ch_F, ch_G, ch_g,&lt;br /&gt;
      ch_H, ch_h, ch_I, ch_i, ch_k, ch_k, ch_L, ch_l , ch_M, ch_M, ch_N, ch_n, ch_O, ch_o,&lt;br /&gt;
      ch_P, ch_r, ch_r, ch_S, ch_S, ch_T, ch_T, ch_U, ch_u, ch_X, ch_X,&lt;br /&gt;
      ch_Y, ch_Y, ch_Z , ch_Z  };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void All_LCD(void);&lt;br /&gt;
void Clear_LCD_M(void);                     // Clears LCD memory&lt;br /&gt;
void Clear_LCD(void);&lt;br /&gt;
void lcd_init(void); in ini&lt;br /&gt;
void Write_LCD_Hex(int Digit_n , int HEX_Zeichen);&lt;br /&gt;
void SetzeDP( int welches_Displ);&lt;br /&gt;
int putchar_LCD(char);&lt;br /&gt;
int print_LCD(CONST char *fmt, ...)  ;      // LCD 1-7 Digit nur realisiert sonst 1...11&lt;br /&gt;
extern int _print(void (*_put)(char), const char *fmt, va_list va);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void Clear_LCD_M(void)&lt;br /&gt;
{&lt;br /&gt;
    int i;&lt;br /&gt;
    for (i =0; i&amp;lt;Mem_LCD; i++) LCDMEM[i] = 0;   // Mem_LCD extern , abhängig vom Display&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void Clear_LCD(void)&lt;br /&gt;
{&lt;br /&gt;
      print_LCD(&amp;quot;\n_&amp;quot;);                     // beim Cursor wird DIGIT_X nicht weitergezählt&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void All_LCD(void)                          // alle = 8888..&lt;br /&gt;
{&lt;br /&gt;
    int i;&lt;br /&gt;
    for (i=0; i&amp;lt;Mem_LCD; i++) LCDMEM[i] = 0xFF;   // Mem_LCD extern , abhängig vom Display&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
int putchar_LCD(char c_in)&lt;br /&gt;
{&lt;br /&gt;
                                            //  Digi_X  == LCDM17&lt;br /&gt;
    int i, leng;&lt;br /&gt;
    char c = c_in;&lt;br /&gt;
    leng = strlen(letter);                  // Länge ohne /0 , 1..&lt;br /&gt;
&lt;br /&gt;
      if( (c==&#039;\n&#039;) || (c==&#039;\r&#039;))           // nichts gefunden =&amp;gt; CLR_Displ&lt;br /&gt;
        {&lt;br /&gt;
          Digi_X =1;  Clear_LCD_M(); return c;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    for(i=0;i&amp;lt;leng;i++) { if( c == letter[i] ) break; }        // Char gefunden&lt;br /&gt;
&lt;br /&gt;
    if(i == leng)&lt;br /&gt;
      {&lt;br /&gt;
        for(i=0;i&amp;lt;leng;i++) { if( &#039; &#039; == letter[i] ) break; }  // Char &#039; &#039; als Ersatz&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    if(i&amp;lt;leng)                              // es gibt &#039;.&#039; als Ersatz&lt;br /&gt;
      {&lt;br /&gt;
        Write_LCD_Hex((int)Digi_X , i);     // Digi beschreiben oder löschen&lt;br /&gt;
                                            // if(Digi_X) Write_LCD_Hex(Digi_X , i);&lt;br /&gt;
        if(C != &#039;_&#039;)Digi_X++;&lt;br /&gt;
        if(Digi_X &amp;gt; LCD_MAX) Digi_X =1;     // if(Digi_X &amp;gt;= Mem_LCD) Digi_X =1;&lt;br /&gt;
      }&lt;br /&gt;
    return c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
    // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
int print_LCD(CONST char *fmt, ...)&lt;br /&gt;
{&lt;br /&gt;
    va_list va;&lt;br /&gt;
    int val;&lt;br /&gt;
&lt;br /&gt;
    va_start(va, fmt);&lt;br /&gt;
    val = _print((void (*)(char))putchar_LCD, fmt, va);&lt;br /&gt;
    va_end(va);&lt;br /&gt;
&lt;br /&gt;
    return val;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
   // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void lcd_init(void)             // LCD init&lt;br /&gt;
{&lt;br /&gt;
 LCDCTL=0xAD;                   // LCDM567.2,LCDM567.0,LCDM234.1,LCDM234.0,LCDM0&lt;br /&gt;
 LCDM1 =0x00;                   // 0xAD = 101 01 101&lt;br /&gt;
 LCDM2 =0x00;                   // 101 = LCDP2 ,0, LCDP0 =&amp;gt; S0..S31&lt;br /&gt;
 LCDM3 =0x00;                   //  01 = LCDMX1,LCDMX0   =&amp;gt; 2-mux&lt;br /&gt;
 LCDM4 =0x00;                   // 101 = LCDSON,x,LCDON Segments ON ,x,LCD ON&lt;br /&gt;
 LCDM5 =0x00;&lt;br /&gt;
 LCDM6 =0x00; LCDM7 =0x00; LCDM8 =0x00; LCDM9 =0x00; LCDM10 =0x00;LCDM11 =0x00;&lt;br /&gt;
 LCDM12=0x00; LCDM13=0x00; LCDM14=0x00; LCDM15=0x00; LCDM16=0x00; LCDM17=0x00;&lt;br /&gt;
 LCDM18=0x00; LCDM19=0x00; LCDM20=0x00;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
   // ----------------------------------------&lt;br /&gt;
&lt;br /&gt;
void Write_LCD_Hex(int Digit_n , int char_Nr)   // Digit1 bis 4 und 5 bis 8&lt;br /&gt;
{&lt;br /&gt;
  int i ,i_End , ch , Maske_loesch , Maske_setz ;&lt;br /&gt;
&lt;br /&gt;
  if((Digit_n == 0 ) || (Digit_n &amp;gt; LCD_MAX))&lt;br /&gt;
    {&lt;br /&gt;
        Clear_LCD_M(); i=0;&lt;br /&gt;
    }&lt;br /&gt;
   else i= (Digit_n - 1);                   // Startadresse = Digit_n x4 siehe unten&lt;br /&gt;
&lt;br /&gt;
  if(Digit_n &amp;lt; (LCD_MAX/2+1))               // Digit 1 ... 4 , i 0...3&lt;br /&gt;
    {&lt;br /&gt;
        Maske_setz   = 0x0011;&lt;br /&gt;
        Maske_loesch = 0x00FF - Maske_setz ;&lt;br /&gt;
        ch           = hex_Wert[char_Nr];&lt;br /&gt;
    } else                                  // Digit 5 ... 8&lt;br /&gt;
    {&lt;br /&gt;
        Maske_setz   = 0x0022;&lt;br /&gt;
        Maske_loesch = 0x00FF - Maske_setz ;&lt;br /&gt;
        ch           = hex_Wert[char_Nr] &amp;lt;&amp;lt; 1;&lt;br /&gt;
        i           -= (LCD_MAX/2) ;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  i &amp;lt;&amp;lt;= 2; i_End = i +4;                    // Berechnung der Start- und End -adresse&lt;br /&gt;
&lt;br /&gt;
  for(; i &amp;lt; i_End;i++)&lt;br /&gt;
    {&lt;br /&gt;
       LCDMEM[i] &amp;amp;= Maske_loesch;&lt;br /&gt;
       LCDMEM[i] |= ( ch &amp;amp; Maske_setz );&lt;br /&gt;
       ch &amp;gt;&amp;gt;=1;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
  // -----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
void SetzeDP( int welches_Displ)          // Displ 8 , 7 , 6 ...&lt;br /&gt;
{&lt;br /&gt;
  int i , i1;&lt;br /&gt;
    for (i=0,i1=1;i&amp;lt;8;i++,i1 &amp;lt;&amp;lt;=1)&lt;br /&gt;
      {&lt;br /&gt;
        if(welches_Displ &amp;amp; i1)&lt;br /&gt;
        switch(i)&lt;br /&gt;
         {&lt;br /&gt;
           case 0 : LCDM4  |= 0x10; break;&lt;br /&gt;
           case 1 : LCDM8  |= 0x10; break;&lt;br /&gt;
           case 2 : LCDM12 |= 0x10; break;&lt;br /&gt;
           case 3 : LCDM16 |= 0x10; break;&lt;br /&gt;
           case 4 : LCDM4  |= 0x20; break;&lt;br /&gt;
           case 5 : LCDM8  |= 0x20; break;&lt;br /&gt;
           case 6 : LCDM12 |= 0x20; break;&lt;br /&gt;
           case 7 : LCDM16 |= 0x20; break;&lt;br /&gt;
           default: break;&lt;br /&gt;
         }&lt;br /&gt;
      }  // for&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
  // ------------------  ENDE  ----------------------&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
[[Kategorie:MSP430]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=MSP430&amp;diff=60446</id>
		<title>MSP430</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=MSP430&amp;diff=60446"/>
		<updated>2011-09-15T15:08:18Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* seriell oder USB */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der MSP430 ist ein 16 Bit-Mikrocontroller von Texas Instruments (TI). Er wurde speziell für eine geringe Stromaufnahme entwickelt, so dass er besonders für batteriebetriebene Geräte geeignet ist. Es gibt verschiedene Typen mit 1-256 kB [[Flash-ROM]], 128-16384 Byte [[RAM]], teilweise mit Hardware-Multiplizierer, [[UART]], [[AD-Wandler]] oder LCD-Treiber, die meisten im [[SMD]]-Package mit 20 bis &amp;gt;100 Pins. Einige neuere aus der MSP430F2xxx-Serie gibt es auch im DIP-Package (Bezeichnung: MSPxxxx &#039;&#039;&#039;-N&#039;&#039;&#039;). Der MSP430F1121 zum Beispiel hat 4kB [[Flash-ROM]], 256B [[RAM]], 2 [[Timer]] und steckt in einem SO-20 Gehäuse. &lt;br /&gt;
&lt;br /&gt;
== Entwicklungshardware ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:launchpad-lcd.jpg|thumb|right|250px|Der &#039;&#039;Launchpad&#039;&#039; (ca. 5€) enthält neben dem per USB ansprechbaren Programmer auch das &amp;quot;Spy by Wire&amp;quot; Interface, mit dem der µC in der Schaltung emuliert werden kann (in Circuit emulation).]]&lt;br /&gt;
&lt;br /&gt;
Für den schnellen Einstieg stellt TI ein preisgünstiges Entwicklungssystem mit USB Schnittstelle zur Verfügung ([http://focus.ti.com/docs/toolsw/folders/print/ez430-f2013.html MSP430 USB Stick Development Tool]).&lt;br /&gt;
&lt;br /&gt;
Günstige Adapterplatinen und [[JTAG]]-Programmer für MSP430-Controller bekommt man bei [http://olimex.com/dev/ Olimex (Bulgarien)], in Deutschland bei http://shop.mikrocontroller.net und http://www.elektronikladen.de oder in Japan bei [http://passworld.co.jp/index.php?lang=GB&amp;amp;lieu=Soroban PassWorld].&lt;br /&gt;
&lt;br /&gt;
Einen einfachen Schaltplan für den [[JTAG]]-Programmer von TI bzw. Olimex gibt es [[Media:MSP430-JTAG-programmer.pdf|hier]]. Die Spannungsversorgung kommt im Gegensatz zum Original allerdings nicht vom Drucker-Port sondern muss extern (am besten vom MSP430 Board) bereitgestellt werden.&lt;br /&gt;
&lt;br /&gt;
Neben der JTAG-Programmierung bieten die MSP430-Controller auch die Möglichkeit, die Firmware über einen [[Bootloader]] einzuspielen. Die dafür erforderliche Hardware wird in der Application Note [http://focus.ti.com/docs/mcu/catalog/resources/appnoteabstract.jhtml?familyId=342&amp;amp;abstractName=slaa096d SLAA096d] von Texas Instruments beschrieben.&lt;br /&gt;
&lt;br /&gt;
Auf jeden Fall eine Überlegung wert wäre auch das neue &#039;&#039;Launchpad&#039;&#039; (Bezugsquellen: [https://estore.ti.com/MSP-EXP430G2-MSP430-LaunchPad-Value-Line-Development-kit-P2031.aspx] [http://search.digikey.com/scripts/DkSearch/dksus.dll?PName?Name=296-27570-ND] [http://www.watterott.com/de/MSP430-LaunchPad-MSP-EXP430G2]) für pinzahlmäßig kleinere MSP430 im DIL-Gehäuse.&lt;br /&gt;
&lt;br /&gt;
=== Stromversorgung ===&lt;br /&gt;
&lt;br /&gt;
Der MSP430 benötigt eine Spannung zwischen 1,8 und 3,6 V. Einfach erzeugen kann man diese z.&amp;amp;nbsp;B. mit der folgenden Schaltung:&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/images/lm317.png&lt;br /&gt;
&lt;br /&gt;
An den Eingang wird ein Steckernetzteil angeschlossen, die Ausgangsspannung lässt sich über das Potentiometer P1 einstellen.&lt;br /&gt;
Benutzt man für P1 einen 500Ω-Typ, kann man die Spannung in einem Bereich von 1,2 Volt und knapp 3,6 Volt einstellen. Dann kann man den MSP430 nicht durch zu hohe Versorgungsspannungen zerstören.&lt;br /&gt;
&lt;br /&gt;
Für den Batteriebetrieb eines MSP430 gibt es von TI eine fertige Lösung mit wenig Peripherie: [http://focus.ti.com/docs/prod/folders/print/tps61221.html TPS61221]&lt;br /&gt;
&lt;br /&gt;
Schaltung für 3,3V Versorgung: [http://focus.ti.com/lit/an/slva336/slva336.pdf]&lt;br /&gt;
&lt;br /&gt;
Die neue Generation mit USB, MSP430F55xx, enthält bereits einen Längsregler von 5 V auf 3,3 V für den Betrieb an der USB-Speisespannung.&lt;br /&gt;
Die Minimalausstattung für die Erstinbetriebnahme ist ein Quarz (bspw. 12 MHz), ein Widerstand 1,5 kΩ und eine Drahtbrücke.&lt;br /&gt;
&lt;br /&gt;
http://www-user.tu-chemnitz.de/~heha/mb-iwp/Schrittmotorsteuerung/MSP430V1.jpg&lt;br /&gt;
&lt;br /&gt;
Dabei meldet sich der Mikrocontroller (genauer: der enthaltene Bootloader) als HID-Gerät. Zum Füllen des Flash steht von Texas Instruments eine Software mit Quelltext zur Verfügung. Leider ist die API der DLL völlig missraten (total stümperhaft), und das Programm schluckt keine .HEX-Dateien (wie sonst üblich), sondern TI-spezifische .TXT-Dateien. {Da habe ich etwas nachprogrammiert, siehe: http://www-user.tu-chemnitz.de/~heha/hs_freeware/msp430-usbbsl.zip }&lt;br /&gt;
&lt;br /&gt;
== Programmieren und Debuggen ==&lt;br /&gt;
Zum Füllen des internen Flash-Programmspeichers und zum Verfolgen des Programmablaufs stehen üblicherweise drei Schnittstellen zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
* Das JTAG-Interface&lt;br /&gt;
* Der Spy-by-Wire-Anschluss&lt;br /&gt;
* Der Bootloader (seriell oder USB)&lt;br /&gt;
&lt;br /&gt;
=== Programmieren ===&lt;br /&gt;
&lt;br /&gt;
==== seriell oder USB ====&lt;br /&gt;
Wer fehlerarm programmieren kann und für jedwede Hilfsadapter zu geizig ist, benutzt am besten den eingebauten Bootloader. Dies ist auch der günstigste Weg bei der Serienfertigung.&lt;br /&gt;
&lt;br /&gt;
Zur Nutzung des seriellen Bootloaders ist es am günstigsten, wenn die fertige Schaltung bereits eine serielle Schnittstelle braucht.&lt;br /&gt;
Ungünstigerweise „hört“ der Bootloader nicht auf RxD und TxD, sondern zumeist auf P1.1 und P2.2 (siehe jeweiliges Datenblatt!). Daher behilft man sich mit festen oder trennbaren Brücken zwischen P1.1 und TxD sowie P2.2 und RxD.&lt;br /&gt;
Von den SubD-Pins 1+4+6 geht man via Serienwiderstand bspw. 33 kΩ auf /RESET,&lt;br /&gt;
von den SubD-Pins 7+8 ebenso via 33 kΩ auf TCK, fertig ist der On-Board-Programmieradapter.&lt;br /&gt;
&lt;br /&gt;
Richtig debuggen kann man mit der seriellen Schnittstelle nicht.&lt;br /&gt;
&lt;br /&gt;
MSP430 mit USB-Schnittstelle haben &#039;&#039;keinen&#039;&#039; seriellen Bootloader. Dieser ist durch den USB-Bootloader ersetzt worden. Zu seiner Verwendung werden keine ominösen Brücken verwendet; der USB-Anschluss (den wohl jede Anwendungsschaltung mit MSP430F55xx haben wird) ist sofort zum Herunterladen der Firmware geeignet.&lt;br /&gt;
&lt;br /&gt;
==== JTAG ====&lt;br /&gt;
Komfortabel und dennoch preisgünstig ist der JTAG-Anschluss.&lt;br /&gt;
Leider benötigt dieser mindestens 5 Kontakte und damit Platz auf der Schaltung. Anschluss-Adapter für den Parallelport sind leicht zu bekommen und beinhalten im einfachsten Fall nur Schutzwiderstände.&lt;br /&gt;
Wer partout kein Parallelport hat (sollte ein Entwicklungsrechner &#039;&#039;immer&#039;&#039; haben) benötigt teure aber komfortable USB-JTAG-Adapter.&lt;br /&gt;
&lt;br /&gt;
==== Spy-by-Wire ====&lt;br /&gt;
Die TI-Erfindung Spy-by-Wire kommt mit nur 2 Leitungen aus.&lt;br /&gt;
(Nebenbei, die Konkurrenz kommt mit One-Wire mit &#039;&#039;einer&#039;&#039; Leitung aus.)&lt;br /&gt;
Hier sind nur spezielle USB-Adapter bekannt, die vom Hersteller zu beziehen und closed-source sind. Auf TI-Entwicklungsplatinen ist dieser Umsetzer bereits als ein weiterer Chip aufgelötet.&lt;br /&gt;
&lt;br /&gt;
== Dokumentation ==&lt;br /&gt;
&lt;br /&gt;
* TI&#039;s Website: http://www.msp430.com &lt;br /&gt;
*:Für jede MSP430 Familie (z.&amp;amp;nbsp;B. MSP430F1xxx) gibt es ein generelles &amp;quot;datasheet&amp;quot;    und einen detailierten &amp;quot;user guide&amp;quot;. Die im user guide verwendeten   Registerbezeichnungen (Ports, SFRs, etc.) findet man auch bei den meisten   Compilern wieder.&lt;br /&gt;
&lt;br /&gt;
* Buch: Mikrocontrollertechnik Am Beispiel der MSP430-Familie&lt;br /&gt;
*:Dieses Lehrbuch führt in die Grundlagen der Mikrorechentechnik ein. Es beschreibt sehr detailliert den Aufbau, die Funktion und die Handhabung von Mikrocontrollern am Beispiel des MSP430F1232. Programmbeispiele sind in Assembler und C enthalten. Ideal für Einsteiger mit geringen technischen Vorkenntnissen. Autor: Matthias Sturm ISBN:3-446-21800-9, Hanser Verlag&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
===Freie Tools===&lt;br /&gt;
====MSP-CCE430====&lt;br /&gt;
Dies ist die Entwicklungsumgebung von TI. Es gibt eine teure Pro-Version, aber eben auch eine Freeware-Version, die auf 16kB Codegrösse beschränkt ist. &lt;br /&gt;
&lt;br /&gt;
Dieser Entwicklungsumgebung liegt Eclipse zugrunde, wobei der C-Compiler und ein Debugger bereits eingebunden sind. Die Installation ist im Gegensatz zu MSPGCC kein Problem.&lt;br /&gt;
&lt;br /&gt;
* [http://focus.ti.com/docs/toolsw/folders/print/msp-cce430.html Download MSP-CCE430]&lt;br /&gt;
&lt;br /&gt;
====MSPGCC====&lt;br /&gt;
Man kann Programme für den MSP430 komplett mit freien Tools entwickeln. Mit dem C-Compiler [[MSPGCC]], dem Debugging-Programm [[GDB]]/Insight und einem beliebigen [[Texteditor]] kann man C-Programme schreiben, kompilieren, in den Controller programmieren und debuggen. In Kombination mit MSPGCC kann man auch die freie Entwicklungsumgebung Eclipse verwenden.&lt;br /&gt;
&lt;br /&gt;
Direkt mit Eclipse 3.6 Helios compilieren und debuggen&lt;br /&gt;
* [[MSP430_eclipse_helios_mspgcc4_gdb-proxy|Anleitung]] (06/2010)&lt;br /&gt;
&lt;br /&gt;
Weblinks:&lt;br /&gt;
* [http://msp430.ms.funpic.de/doku.php?id=msp430:entwicklungumgebung Eclipse+mspgcc+GDB-Proxy] (03/2009)&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Eclipse_und_MSPGCC_unter_Windows Eclipse und MSPGCC unter Windows] (03/2009)&lt;br /&gt;
* [http://matthias-hartmann.blogspot.com/ Use Eclipse and mspgcc - the easy way] (Windows 02/2009).&lt;br /&gt;
* [http://www.mikrocontroller.net/Eclipse%20und%20MSPGCC/ Eclipse und MSPGCC] (Windows 03/2006)&lt;br /&gt;
* [http://inf.ntb.ch/infoportal/help/index.jsp?topic=/ch.ntb.infoportal/embeddedSystems_MSP430.html/ Eclipse + MSPGCC + Installationsanleitung Deutsch] (Windows, Linux) (Link ist Tot! .. hat noch wer eine Version?)&lt;br /&gt;
* [http://kurt.on.ufanet.ru/ MSPFET - FREE MSP430 flash programming utility] (Windows)&lt;br /&gt;
* [http://xgoat.com/wp/2009/03/25/fetproxy-an-open-source-replacement-for-msp430-gdbproxy/ FetProxy - Ein funktionierender Open-Source-Ersatz für msp430-gdbproxy] (Unix, Linux)&lt;br /&gt;
* [http://mspgcc4.sourceforge.net mspgcc4 - GCC 4.x toolchain for Texas Instruments MSP430 MCUs]  (Linux, 2011)&lt;br /&gt;
&lt;br /&gt;
Achtung: Es gibt &#039;&#039;&#039;mspgcc&#039;&#039;&#039; und &#039;&#039;&#039;mspgcc4&#039;&#039;&#039;!&lt;br /&gt;
Ersterer unterstützt keine CPUX (moderner MSP430-Prozessorkern mit 20 Bit Adressierungs- und Verarbeitungsbreite, für 1 MByte Adressraum), so ist man praktisch auf 47 KByte Kode beschränkt, und ohne selbstgemachte Linker-Skripte kann man zurzeit keine MSP430F55xx programmieren.&lt;br /&gt;
Letzterer basiert häufig auf cygwin und ist deshalb nicht so leicht in Gang zu setzen, die Dokumentation noch spärlicher und ausschließlich auf &#039;&#039;&#039;man&#039;&#039;&#039; basierend.&lt;br /&gt;
&lt;br /&gt;
Update(09/2011): Das Projekt mspgcc4 wurde in das Projekt mspgcc übernommen und beinhaltet viele Verbesserungen und die Unterstützung für CPUX. Für Windows gibt es eine mingw32 Toolchain.&lt;br /&gt;
&lt;br /&gt;
====MSPDebug====&lt;br /&gt;
MSPDebug ist ein Programmier/- Debugwerkzeug für den [[MSP430]], ähnlich wie avrdude für die [[AVR]]s. Es beinhaltet auch einen gdb-server um in eclipse oder direkt mit msp430-gdb zu debuggen.&lt;br /&gt;
&lt;br /&gt;
Momentan (0.17) unterstütze Programmer/Debugger (aus der Hilfe übernommen):&lt;br /&gt;
* ez430-RF2500 z.B. der Programmieradapter von der ez430-Chronos&lt;br /&gt;
* Olimex MSP-JTAG-TINY / ISO&lt;br /&gt;
* TI FET430UIF und Kompatible (z.B. eZ430)&lt;br /&gt;
* TI FET430UIF bootloader&lt;br /&gt;
* Flash Bootloader&lt;br /&gt;
&lt;br /&gt;
Weblinks:&lt;br /&gt;
* [http://mspdebug.sourceforge.net/ Projekthomepage bei Sourceforge]&lt;br /&gt;
* [http://aur.archlinux.org/packages.php?ID=37648 AUR-Paket für Arch Linux]&lt;br /&gt;
&lt;br /&gt;
=== Kommerzielle Compiler für MSP430 ===&lt;br /&gt;
* [http://www.imagecraft.com/devtools_MSP430.html ICC430]&lt;br /&gt;
*: 45-Tage Demo wird nach Ablauf auf 4 kByte Codegröße beschränkt&lt;br /&gt;
* [http://www.htsoft.com/products/msp430ccompiler.php HI-TECH MSP430 C]&lt;br /&gt;
*: 28-Tage Demo wird nach Ablauf unbrauchbar.&lt;br /&gt;
*: &#039;&#039;Die verlinkte Seite listet nur Compiler für PIC auf. Produkt eingestellt?&#039;&#039;&lt;br /&gt;
*: &#039;&#039;They are part of microchip now: [http://www.htsoft.com/HI-TECH%20Customer%20Letter_Final.pdf]&#039;&#039;&lt;br /&gt;
* [http://www.ide430.com/ IDE430]&lt;br /&gt;
*: &#039;&#039;Dieser Link ist tot. Gibt es das Produkt noch?&#039;&#039;&lt;br /&gt;
* [http://www.rowley.co.uk/msp430/index.htm CrossWorks for MSP430]&lt;br /&gt;
*: 30-Tage-Testversion nach Registrierung&lt;br /&gt;
* [http://www.quadravox.com/AQ430.htm Quadravox AQ430]&lt;br /&gt;
* [http://focus.ti.com/docs/toolsw/folders/print/msp-cce430.html?DCMP=MSP430_ccessentials&amp;amp;HQS=Other+PR+ccessentials CCEssentials (Eclipse)]&lt;br /&gt;
*: Mittlerweile: [http://processors.wiki.ti.com/index.php/CCSv4 Code Composer Studio 4]&amp;quot;, Microcontroller/&amp;quot;Core Edition&amp;quot; für MSP430 ist kostenlos. Download erfordert Registrierung und Exporterfassung. Dateiname &amp;quot;setup_CCS_MC_Core.zip&amp;quot;, ca. 360 MB.&lt;br /&gt;
*: Frei und auf 8 kByte Codegröße beschränkt, seit V3 bis 16kByte Code frei&lt;br /&gt;
* [http://www.iar.se/website1/1.0.1.0/675/1/index.php IAR Embedded Workbench for MSP430] &lt;br /&gt;
*: 30-Tage-Testversion&lt;br /&gt;
*: Freie auf 4 kByte (MSP430) oder 8 kByte (MSP430X) Codegröße beschränkte &amp;quot;KickStart&amp;quot;-Edition.&lt;br /&gt;
*: Kompatibel mit Windows7 7000 x64 (Stand: Februar 2009, Version 4.20.1)&lt;br /&gt;
&lt;br /&gt;
== Beispielanwendungen ==&lt;br /&gt;
&lt;br /&gt;
===Mathar.Com===&lt;br /&gt;
Auf http://www.mathar.com gibt es ein paar Beispiele (in C), was man so alles mit dem MSP430 anstellen kann. Dort hat der Autor einige Anwendungen näher erläutert. Angefangen mit simplen Aufgaben wie LEDs leuchten lassen geht es weiter über eine LCD- und GLCD-Ansteuerung (HD44780- und KS0108-kompatibel) sowie einigen Beispielen zur Verwendung des integrierten A/D-Wandlers, des USARTs, des Timers und vielem mehr ... Als weitere Codebeispiele sind dort auch eine I2C-Softwareimplementation und eine CAN-Library für den MSP430 zu finden.&lt;br /&gt;
&lt;br /&gt;
===Examples Ordner der freien Toolchain MSPGCC===&lt;br /&gt;
Der &amp;quot;examples&amp;quot;-Ordner bzw. &amp;quot;checkout&amp;quot; aus dem CVS vom [[MSPGCC]] ist auch sehr umfangreich: http://mspgcc.cvs.sourceforge.net/mspgcc/examples/&lt;br /&gt;
&lt;br /&gt;
===Codebeispiele auf Mikrokontroller.net===&lt;br /&gt;
Einige [[MSP430 Codebeispiele]] finden sich auch hier in der Artikelsammlung.&lt;br /&gt;
&lt;br /&gt;
===uIP Port auf Mikrokontroller.net===&lt;br /&gt;
Der Port des TCP/IP Stacks von Adam Dunkels [[MSP430_uIP_Port|uIP 1.0 für den MSP430 findet sich hier]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Launchpad interne Temp. Messung mit ADC und Anzeige auf LCD===&lt;br /&gt;
C Codebeispiel für Launchpad mit IAR Kickstartcompiler, interner ADc und LCD Ansteuerung. Vergleich Atmel 8 Bit AVR Controller und mit MSP Familie: [http://www.mikrocontroller.net/topic/222015#new]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/1/msp430 Beiträge zum MSP430 im Mikrocontroller.net Forum]&lt;br /&gt;
* [http://mspgcc.sourceforge.net/manual/c68.html An introduction to the TI MSP430 low-power microcontrollers]&lt;br /&gt;
* [http://tinymicros.com/embedded/MSP430/ The MSP430 Bugspray Database] - umfangreiche Datenbank für Bugs in MSP430-Controllern&lt;br /&gt;
* [http://www.mathar.com www.mathar.com] - Tutorial für Einsteiger und Fortgeschrittene: LCD, ADC, USART, I2C, CAN Programmierung in C&lt;br /&gt;
* [http://cnx.org/lenses/TexasInstruments/MSP430 Connexions - Texas Instruments MSP430] Tutorial (speziell für eZ430)&lt;br /&gt;
* [http://msp430.info MSP430.info] - Portalseite für MSP430; Info, Projekte, Paper, Entwicklungstools...&lt;br /&gt;
* [http://groups.yahoo.com/group/msp430 Yahoo group MSP430] - lebhaftes Forum mit vielen MSP430-Experten&lt;br /&gt;
* [http://www.thomas-wedemeyer.de/elektronik/msp430/msp430.html Thomas Wedemeyer&#039;s MSP430-Seiten] - Kleine Beispiel Applikationen und Tips zur Nutzung von MSPGCC mit der Dev-C++ Entwicklungsumgebung&lt;br /&gt;
* [http://homepage.hispeed.ch/py430/mspgcc/ msp430-gdb und Eclipse] - Eine Anleitung von Chris Liechti&lt;br /&gt;
* [http://passworld.co.jp/index.php?lang=GB&amp;amp;lieu=GPS MSP430 GPS] - [http://passworld.co.jp/index.php?lang=GB&amp;amp;lieu=Oximeter MSP430 Puls-Oximeter]&lt;br /&gt;
* [http://passworld.co.jp/ForumMSP430 MSP430 Forum]&lt;br /&gt;
* [http://develissimo.net/de/msp430entwicklung.html MSPGCC + Eclipse + msp430-gdbproxy / Linux / Debian / Ubuntu] - Anleitung / Tutorial zur Installation der MSPGCC Toolchain + Eclipse + msp430-gdbproxy für Linux / Debian / Ubuntu Lang=Deutsch und Englisch leider geht der link nicht mehr&lt;br /&gt;
* [http://www.sinelabore.com SinelaboreRT] - Generierung von Zustandsmaschinen in C speziell für kleine Low-Power Plattformen.&lt;br /&gt;
* [http://msp430.funpic.de msp430.funpic.de] - Wiki zum MSP430&lt;br /&gt;
* [http://mspsci.blogspot.com/2010/07/tutorial-01-getting-started.html Scientific Instruments Using the TI MSP430] - Tutorial speziell zum TI Launchpad.&lt;br /&gt;
* [http://43oh.com/ Four-Three-Oh!] - MSP430 News und Forum (en)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Mikrocontroller]]&lt;br /&gt;
[[Kategorie:MSP430| ]]&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR&amp;diff=57937</id>
		<title>AVR</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR&amp;diff=57937"/>
		<updated>2011-06-15T07:42:55Z</updated>

		<summary type="html">&lt;p&gt;134.109.9.176: /* Architektur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die AVR-[[Mikrocontroller]] von [http://www.atmel.com Atmel] sind besonders in Deutschland sehr beliebt, da sie meist in DIL-Gehäusen verfügbar sind, per [[ISP | In-System-Programming]] programmiert werden können, und eine Vielzahl von kostenlosen Programmen zur Softwareentwicklung (Assembler, Compiler) existiert. Diese Eigenschaften machen den AVR zum perfekten Mikrocontroller für Anfänger.&lt;br /&gt;
&lt;br /&gt;
Über die Bedeutung des Namens &amp;quot;AVR&amp;quot; gibt es verschiedene Ansichten; manche meinen er sei eine Abkürzung für &#039;&#039;&#039;A&#039;&#039;&#039;dvanced &#039;&#039;&#039;V&#039;&#039;&#039;irtual [[RISC|&#039;&#039;&#039;R&#039;&#039;&#039;ISC]], andere vermuten dass der Name aus den Anfangsbuchstaben der Namen der Entwickler (&#039;&#039;&#039;A&#039;&#039;&#039;lf Egin Bogen und &#039;&#039;&#039;V&#039;&#039;&#039;egard Wollan &#039;&#039;&#039;R&#039;&#039;&#039;ISC) zusammengesetzt wurde. Laut Atmel ist der Name bedeutungslos.&lt;br /&gt;
&lt;br /&gt;
==Architektur==&lt;br /&gt;
&lt;br /&gt;
Die Architektur ist eine 8-Bit-[[Harvard-Architektur]], das heißt, es gibt getrennte Speicher für Programmcode ([[Speicher#Flash-ROM |Flash-ROM]], dieser ist 16 bit breit) und Daten ([[Speicher#RAM |RAM]]). Bei der Programmierung hat das den Nachteil, dass sich Konstanten aus dem ROM nicht mit dem gleichen Code laden lassen wie Daten aus dem RAM. Abgesehen davon ist der Aufbau des Controllers recht übersichtlich und birgt wenige Fallstricke.&lt;br /&gt;
&lt;br /&gt;
* 32 größtenteils gleichwertige Register&lt;br /&gt;
* davon 1-3 16-bit-Zeigerregister (paarweise)&lt;br /&gt;
* ca. 110 Befehle, die meist 1-2 Taktzyklen dauern&lt;br /&gt;
* Taktfrequenz bis 32MHz&lt;br /&gt;
* Betriebsspannung von 1,8 - 5,5 V&lt;br /&gt;
* Speicher&lt;br /&gt;
**1-256 kB [[Speicher#Flash-ROM | Flash-ROM]]&lt;br /&gt;
**0-4 kB [[Speicher#EEPROM | EEPROM]]&lt;br /&gt;
**0-16 kB [[speicher#RAM | RAM]]&lt;br /&gt;
* Peripherie: [[AD-Wandler]] 10 bit, 8- und 16-Bit-[[Timer]] mit [[PWM]], [[SPI]], [[I²C]] (TWI), [[UART]], Analog-[[Komparator]], [[Watchdog]]&lt;br /&gt;
* [[Speicher#Mit_XMEM-Interface | 60kB Externer SRAM]] (ATmega128, ATmega8515); (Bei den XMEGAs bis zu 16 MB (128 Mbit) externer SRAM)&lt;br /&gt;
* [[JTAG]] bei den größeren ATmegas&lt;br /&gt;
* [[debugWire]] bei den neueren AVRs&lt;br /&gt;
&lt;br /&gt;
Es gibt keine Typen mit D/A-Wandler; hierfür benutze man PWM oder externe Bausteine.&lt;br /&gt;
&lt;br /&gt;
Auch bei der Takterzeugung sind die AVRs recht einfach gehalten. So gibt es keine internen PLLs um „krumme“ Prozessor- oder Peripherietaktfrequenzen zu erzeugen, noch ist der Peripherie-Takt vom Prozessortakt abkoppelbar. Die Baudrate serieller Schnittstellen ist für Senden und Empfangen stets gleich und lässt sich nicht gebrochen einstellen, so dass für genaue höhere Baudraten auch ein passender Quarz oder Resonator ausgesucht werden muss.&lt;br /&gt;
&lt;br /&gt;
Unglücklich gelöst sind manche Aspekte des Programmier-Interfaces. Für die serielle Programmierung (via SPI) sind 4 Datenleitungen erforderlich, und die Taktversorgung muss sicher gestellt sein. Man kann sich von dieser Variante durch Setzen von Fuses aussperren. Für die Hochvolt-Programmierung (so genannt wegen 12 V am RESET-Anschluss) werden je nach Chip sehr viele Leitungen benötigt, und das Protokoll ist gänzlich anders.&lt;br /&gt;
&lt;br /&gt;
Nicht zu verwechseln ist die 8-bit-AVR-Serie mit AVR32. Letztere ist eine 32-bit-Architektur mit recht viel Ähnlichkeit zu ARM7.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
* [[AVR-Studio]]: Kostenlose Enwicklungsumgebung mit Simulator&lt;br /&gt;
* [http://sourceforge.net/projects/kontrollerlab/ KontrollerLab]: Kostenlose Entwicklungsumgebung für KDE&lt;br /&gt;
* [http://www.microsoft.com/germany/Express/product/visualcplusplusexpress.aspx Microsoft Visual C++ Express]: Kostenlose Enwicklungsumgebung (Win),über makefile&lt;br /&gt;
* [[AVR Eclipse]]: Plugin-basierte kostenlose Entwicklungsumgebung (Win, Linux, Mac)&lt;br /&gt;
* [[Code::Blocks]]: Freie Entwicklungsumgebung (Win, Linux, Mac), die auch für AVR-Projekte Unterstützung anbietet&lt;br /&gt;
* [http://netbeans.org/ Netbeans]: Kostenlose Entwicklungsumgebung (Win, Linux, Mac)&lt;br /&gt;
* [[AVR-GCC]]: Kostenloser C-Compiler&lt;br /&gt;
* [http://sourceforge.net/projects/avra/ AVRA]: freier AVR-Assembler&lt;br /&gt;
* [http://www.mcselec.com/bascom-avr.htm Bascom AVR] beliebter Basic-Compiler&lt;br /&gt;
* [http://www.e-lab.de AVRCo Pascal Compiler]&lt;br /&gt;
* [http://amforth.sourceforge.net/ amforth]:  interaktiver und erweiterbarer Kommandointerpreter für AVR unter GNU Lizenz (Open Source)&lt;br /&gt;
* [[SJC]]: Experimenteller Java-Compiler unter GPL mit AVR-Unterstützung&lt;br /&gt;
* [http://www.atnel.pl/mkAVRCalculator_build_57en.rar mkAvrCalculator]: User friendly fuse bits calculator and GUI for avrdude&lt;br /&gt;
&lt;br /&gt;
== Boards &amp;amp; Starterkits ==&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch die Artikel in der [[:Kategorie:AVR-Boards|Kategorie AVR-Boards]] und den Artikel zur [[AVR_In_System_Programmer|AVR Programmierung]].&lt;br /&gt;
&lt;br /&gt;
* [http://shop.mikrocontroller.net/?category_id=10 diverse im Mikrocontroller.net-Shop]&lt;br /&gt;
* [[STK200]]&lt;br /&gt;
* [[STK500]]&lt;br /&gt;
* [[STK600]]&lt;br /&gt;
* [[AVR Dragon]] &lt;br /&gt;
* [[AVR Butterfly]]&lt;br /&gt;
* [[AVR Raven]]&lt;br /&gt;
* AVR-ISP / AVR-ISP mkII&lt;br /&gt;
* AVR JTAG-ICE&lt;br /&gt;
* [http://www.robotikhardware.de RN-Control]&lt;br /&gt;
* [http://www.conrad.de C-Control PRO]&lt;br /&gt;
* [http://www.myavr.de myAVR Board]&lt;br /&gt;
* [http://www.rowalt.de AVR Lehrbuch und -bausatz]&lt;br /&gt;
* [http://www.pollin.de Pollin] - preiswerte Starterkits sowie Lösungen für RFID-125kHz und EtherNet&lt;br /&gt;
* [http://www.lochraster.org/rumpus Rumpus von lochraster.org] ist ein günstiges und gut dokumentiertes Starterkit mit Atmega 168&lt;br /&gt;
* [http://www.das-labor.org/wiki/Laborboard  Laborboard von das-labor.org] - Bauplan Lochrasterplatine mit Atmega32&lt;br /&gt;
* [http://nibo.nicai-systems.de Roboterbausatz NIBO 2] - autonomer Roboter mit einem ATmega128 und einem ATmega88 / [http://nibobee.nicai-systems.de Roboterbausatz NIBObee] - Roboter für Einsteiger mit ATmega16 und integriertem USB-Programmer&lt;br /&gt;
* [http://www.nerdkits.com Nerdkit - Starterkit inkl. Doku] - ideal für Anfänger&lt;br /&gt;
* [http://arduino.cc/ Arduino] - Ein modulares System mit verschiedenen Entwicklungsboards (insbesondere auch eins mit ATmega1280, dem mit den vielen dünnen Beinchen), das aufgrund der Nutzung einer JAVA-IDE und &amp;quot;Wiring&amp;quot; besonders einfach zu nutzen ist. Es gibt verschiedene Clones unter Namen wie Freeduino, Seeeduino etc., auch den Lilypad zum Einnähen in Kleidung und Verschaltung mittels leitender Fäden. Die neueren Versionen können über einen standardmäßig mit ausgelieferten Bootloader ohne sonstige Hardware direkt über USB bespielt werden.&lt;br /&gt;
* [http://www.aevum-mechatronik.de Modularis] - AVR Mikrocontroller-Boards (z.T. mit Zusatz-Speicher und USB) die über Flachbandkabel erweitert werden können. Es gibt bis jetzt Zubehör-Module mit Taster, Motor H-Brücke, XBee und Winkelsensor.&lt;br /&gt;
* [http://www.b-redemann.de AVR Mikrocontroller Lehrbuch (R. Walter, 3. Auflage 2009) und Bauteilesatz incl. Leiterplatte; www.b-redemann.de]&lt;br /&gt;
&lt;br /&gt;
== Projekte ==&lt;br /&gt;
Siehe dazu auch die Artikel in der [[:Kategorie:AVR-Projekte|Kategorie AVR-Projekte]].&lt;br /&gt;
&lt;br /&gt;
* [[PWM_foxlight]] - LED Lampe mit PWM&lt;br /&gt;
* [[Digitaler Funktionsgenerator]]&lt;br /&gt;
* [[Midi Rekorder mit MMC/SD-Karte]]&lt;br /&gt;
* [[Schrittmotor-Controller (Stepper)]]&lt;br /&gt;
* [[Pulsuhrempfänger mit AVR Butterfly]]&lt;br /&gt;
* [[DCF77-Funkwecker mit AVR]]&lt;br /&gt;
* [[Fahrradcomputer]]&lt;br /&gt;
* [[Einfacher und billiger Webserver mit AtMega32]]&lt;br /&gt;
* [[AVR RFM12]]&lt;br /&gt;
* [[RF SOAP]] USB / AtMega88 / RFM12, optional LiPo Akku mit Lader&lt;br /&gt;
* [http://www.andreadrian.de/schach/#Selbstbau_Schachcomputer_SHAH Selbstbau Schachcomputer SHAH mit ATMega88V]&lt;br /&gt;
* [[Giess-o-mat]] - vollautomatische Blumengießanlage&lt;br /&gt;
* [http://www.zipfelmaus.com/led-flitzer/ POV-LED mit ATmega8, USB und Beschleunigungssensor]&lt;br /&gt;
* [http://g-heinrichs.de/attiny/ ATtiny-Mikrokontroller für Schulbedarf]&lt;br /&gt;
&lt;br /&gt;
== Tutorials ==&lt;br /&gt;
* [[AVR-Tutorial]]&lt;br /&gt;
* [[AVR-GCC-Tutorial]]&lt;br /&gt;
* http://www.avr-asm-tutorial.net&lt;br /&gt;
== Literatur ==&lt;br /&gt;
 	&lt;br /&gt;
* C.Kühnel Programmieren der AVR RISC Mikrocontroller mit BASCOM-AVR ISBN 3898119378 (2000) ISBN 3907857046 (2.Aufl.2004) ISBN 978-3-907857-14-4 (3. überarbeitete und erweiterte Auflage 2010)&lt;br /&gt;
* R.Mittermayr AVR-RISC: Embedded Software selbst entwickeln Franzis 2008 ISBN 3772341071&lt;br /&gt;
* F.Schäffer AVR: Hardware und C-Programmierung in der Praxis Elektor 2008 ISBN 3895762008 [http://www.blafusel.de/books/avr.html Webseite des Autors, Codebeispiele und Leseprobe]&lt;br /&gt;
* G.Schmitt Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie...Oldenbourg 4.Aufl.2008  ISBN 3486587900 ISBN 3486580167 (2006) ISBN 3486577174 (2005) [http://www.oldenbourg-wissenschaftsverlag.de/olb/de/1.c.1495224.de Verlags-Webseite mit Buchauszügen]&lt;br /&gt;
* M.Schwabl-Schmidt Programmiertechniken für AVR-Mikrocontroller Elektor 2008 ISBN 3895761761 [http://www.schwabl-schmidt.de/index.php/buecher Webseite des Autors]&lt;br /&gt;
* M.Schwabl-Schmidt Systemprogrammierung für AVR-Mikrocontroller Elektor 2009 ISBN 3895762180&lt;br /&gt;
* W.Trampert Messen,Steuern und Regeln mit AVR Mikrocontrollern Franzis 2004 ISBN 3772342981&lt;br /&gt;
* W.Trampert AVR-RISC Mikrocontroller Franzis ISBN 3772354769 (2003) ISBN 3772354742 (2002) ISBN 3772354750 (2000)&lt;br /&gt;
* P.Urbanek Embedded Systems: Ein umfassendes Grundlagenwerk ... (2007) ISBN 3981123018 [http://www.ulb.tu-darmstadt.de/tocs/188146911.pdf Inhaltsverzeichnis]&lt;br /&gt;
* S./F.Volpe AVR-Mikrocontroller-Praxis Elektor 2001 ISBN 3895760633&lt;br /&gt;
* R.Walter AVR-Mikrocontroller-Lehrbuch 3. Auflage Denkholz 2009 ISBN 9783981189445 [http://www.rowalt.de/mc/avr/avrbuch/index.htm Webseite des Autors, Buch-Download in geringer Auflösung]&lt;br /&gt;
&lt;br /&gt;
== Tipps &amp;amp; Hinweise ==&lt;br /&gt;
* [[AVR Typen]] - Die verschiedenen Typen (AT90S, ATmega, ATtiny)&lt;br /&gt;
* [[AVR Checkliste]] - Liste mit Hinweisen zur Lösung üblicher Probleme&lt;br /&gt;
* [http://blog.coldtobi.de/1_coldtobis_blog/archive/87_little_endianess_guide_for_atmel_avr.html (Little) Endianess Guide for Atmel AVR] Übersicht über die Endianess der AVR und AVR32&lt;br /&gt;
* [[AVR Fuses|Fuse-Bits]] - Das Setzen der Fuse-Bits ist ein berüchtigter Fallstrick bei den AVRs; vor dem Rumspielen damit unbedingt diese Hinweise lesen!&lt;br /&gt;
* [[AVR In System Programmer]] - Programmierhardware&lt;br /&gt;
* [[Pony-Prog Tutorial]] - Hinweise zur Programmiersoftware PonyProg&lt;br /&gt;
* [[AVRDUDE]] - Programmiersoftware für die Kommandozeile&lt;br /&gt;
* [[AVR-GCC-Codeoptimierung]] - Wie man mehr aus dem Controller herausholen kann, ohne ein Assembler-Guru sein zu muessen.&lt;br /&gt;
* [[AVR Softwarepool]] - Verschiedene Softwaremodule und Codeschnippsel aus der Codesammlung&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://revision3.com/systm/avr101 AVR101] - systm Videocast von Revision3 Internet Television (engl.).&lt;br /&gt;
&lt;br /&gt;
Weitere Verweise (Links) auf externe Informationen und Projekte finden sich in der &#039;&#039;&#039;[[Linksammlung#AVR|Linksammlung]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Category:Mikrocontroller]]&lt;br /&gt;
[[Category:AVR| ]]&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>134.109.9.176</name></author>
	</entry>
</feed>