<?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=Jonebohne</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=Jonebohne"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Jonebohne"/>
	<updated>2026-04-10T23:20:58Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=MMC-_und_SD-Karten&amp;diff=48179</id>
		<title>MMC- und SD-Karten</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=MMC-_und_SD-Karten&amp;diff=48179"/>
		<updated>2010-06-02T13:54:53Z</updated>

		<summary type="html">&lt;p&gt;Jonebohne: /* Halter */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MMC- und SD-Speicherkarten lassen sich im [[SPI]]-Modus relativ einfach mit einem Mikrocontroller ansteuern. Prinzipiell git es zwischen SD-Card und MMC nicht viele Unterschiede, allerdings sind SD-Karten weiter verbreitet, in der Regel schneller als MMCs, und haben eine besser implementiertes SPI-Interface. Es existieren diverse Varianten (miniSD, microSD) die zur normalen SD-Card kompatibel sind.&lt;br /&gt;
&lt;br /&gt;
Die Karte liest das anliegende Datenbit mit der steigenden Taktflanke ein, als SPI-Modi eignen sich somit Mode 0 (CPOL=0, CPHA=0) und Mode 3 (CPOL=1, CPHA=1) (siehe auch [[Serial Peripheral Interface]]). Bei MMCs ist der SPI-Modus nicht genau spezifiziert, somit kommt es durchaus mal vor dass der SPI-Modus je nach Karte unterschiedlich gewählt werden muss, oder dass die Karte überhaupt nicht zuverlässig funktioniert (siehe [http://www.mikrocontroller.net/forum/read-1-343528.html Beitrag im Forum]).&lt;br /&gt;
&lt;br /&gt;
=== DOs und DON&#039;Ts bei der Ansteuerung ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Lasst euch nicht verrückt machen&#039;&#039;&#039; wenn es einfach nicht funktioniert, sondern probiert zu allererst mal eine SD-Karte eines anderen Herstellers aus. Die MMC-Implementierung für AVR von Elm Chan z.&amp;amp;nbsp;B. funktioniert mit SanDisk problemlos hat aber mit Platinum Karten ein Problem.&lt;br /&gt;
* Taktfrequenz bei der Initialisierung nicht höher als 400kHz&lt;br /&gt;
* Ein Pullup-Widerstand am Ausgang der MMC/SD Karte (DO) ist für eine saubere Initialisierung per SPI notwendig! [http://www.mikrocontroller.net/topic/112421#1001693 (Thread mit Erklärung dazu)]&lt;br /&gt;
* Saubere Versorgung: Kein Dioden-Pfusch, mit dem eine vorhandene 5V Versorgung mittels in Reihe geschalteter Dioden auf irgendwas im Bereich 3V &amp;quot;geregelt&amp;quot; wird. Stattdessen einen guten 3,3V-Regler verwenden. Die Karte mag es nicht, wenn mehr als 60mV Ripple auf Vcc ist. LM317 oder LM1117-ADC/-3.3 mit entspechenden Kondensatoren reicht zumindest bei Basteleien allemal.&lt;br /&gt;
* Sauberer Anschluss der Digitalschnittstelle: Spannungsteiler &amp;quot;verschleifen&amp;quot; die Signale bei hohen Frequenzen und die Übertragungsrate muss dann begrenzt werden. Also entweder ein [http://www.mikrocontroller.net/articles/Pegelwandler Pegelwandler] oder gleich an ein 3,3V I/O anschließen.&lt;br /&gt;
* Ein Pullup-Widerstand an der Select-Leitung (/CS) schadet nicht und stellt sicher, dass die Karte erst mit Absicht selektiert wird.&lt;br /&gt;
* Nachdem die Karte deselektiert wurde (/CS auf high), die Taktleitung noch einige Male pulsen, damit die Karte DO hochohmig/tri-state schaltet (vgl. Chans Erläuterungen).&lt;br /&gt;
* Die Karten verfügen weder über einen Reset- noch einen Sleep-Anschluss. Moderne Karten reduzieren bei Nichtbenutzung ihren Stromverbrauch, einen vollständigen Reset kann man jedoch nicht per Software auslösen. Daher sollten die Karten per P-Channel-FET oder Spannungsregler/-wandler mit Enable-Funktion so angeschlossen werden, dass über Versorgung an/aus ein (Power-On-)Reset ausgelöst werden kann. Dabei darauf achten, dass vorhandene Pull-Up-Widerstände bei abgeschalteter Versorgung ebenfalls deaktiviert werden (vgl. z.&amp;amp;nbsp;B. Schaltplan für den Anschluss von SD-Card/MMC per SPI an AVR in Chans Beispielen. Link unten).&lt;br /&gt;
* Guter Kontakt im Steckplatz, sehr gut eignen sich mit der Zange verbogene Stiftleisten, oft sieht es aus als ob es &amp;quot;passt&amp;quot;, aber es gibt doch keinen Kontakt, daher bei Fehlern: Immer Durchmessen! Auch zu erwähnen wären da alte ISA-Bus Buchsen, die auf jedem alten PC Mainboard drauf sind. Um sicher zu gehen, dass der Kontakt wirklich gut ist, sollte man aber trotzdem SD-Slots benutzen. Diese bekommt man u.a. bei CSD (günstig), Reichelt (teuer) oder aus alten Kartenlesern.&lt;br /&gt;
* Guter Kontakt #2: Was sich im übrigen auch sehr gut eignet sind Adapter von MiniSD auf normales SD-Format, um dann MiniSD zu benutzen. Wenn man eine Stiftleiste im 2.54mm-Format oder Lötnägel im selben Format auf der Platine hat, kann man daran wunderbar den SD-Kartenadapter anlöten. Das ist mechanisch recht stabil. Ein kleines Manko ist allerdings, daß dann eine Gold-Lötzinn-Legierung durch die vergoldeten Kontakte entsteht und das soll ja dem Lötzinn langfristig nicht sehr zuträglich sein. Aber für&#039;s Hobby funktioniert das wunderbar.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
||[[Bild:SD Steck Stift.jpg]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;(Liefere Bild in besserer Qualität nach!)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheken zur Ansteuerung ===&lt;br /&gt;
* [http://elm-chan.org/fsw/ff/00index_e.html ELM ChaN FatFs]  FAT(12,16,32)-Dateisystem. Klein und übersichtlich, hochoptimiert, frei auch für kommerzielle Anwendung. Beispiele für AVR, H8, LPC2k mit MCI u.a. enthalten (&amp;quot;samples&amp;quot;), neuere Versionen mit LFN-Unterstützung. Beispiel für AT91SAM7 inkl. DMA im Projekt [[ARM MP3/AAC Player]].&lt;br /&gt;
* [http://elm-chan.org/fsw/ff/00index_e.html ELM ChaN Petit FatFS] FAT(12,16,32)-Dateisystem. Sehr klein. Beispiele für AVR.&lt;br /&gt;
* [http://sourceforge.net/projects/efsl EFSL] FAT16/32-Dateisystem, unterstützt Partitionen und Superfloppys, Beispielcode für AVR, LPC2000 und AT91SAM7 enthalten (siehe auch [http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/efsl_arm/ M. Thomas&#039; ARM+SD/MMC Seite])&lt;br /&gt;
* [http://www.holger-klabunde.de/avr/avrboard.htm#cf Holger Klabundes FAT16/32] mit Beispielen für AVR MMC/SD und CF, LPC2k mit SPI&lt;br /&gt;
* libfat aus dem [http://sourceforge.net/projects/devkitpro devkitpro-Projekt] u.a. LFN-Unterstützung.&lt;br /&gt;
* [http://www.mikro-control.de/Joomla/index.php?option=com_content&amp;amp;task=view&amp;amp;id=18&amp;amp;Itemid=30 SD-Logger] - FAT 16, für den privaten Einsatz kostenfrei&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/read-4-125350.html MMC-Ansteuerung mit FAT16 von Ulrich Radig]&lt;br /&gt;
* [http://www.zws.com/products/dosfs/index.html DOSFS Free FAT12/FAT16/FAT32 Filesystem] &amp;quot;DOSFS is a free FAT-compatible filesystem intended for fairly low-end embedded applications. Intended target systems would be in the ballpark of 1K RAM, 4K ROM or more&amp;quot;.&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/48481 MMC/SD-Karte mit FAT16 an AVR] von Roland Riegel&lt;br /&gt;
* [ftp://ftp.circuitcellar.com/pub/Circuit_Cellar/2005/176/Sham176.zip Circuit Cellar FAT16 MMC/SD] mit MMC/SD Hardwaretreiber für MSP430&lt;br /&gt;
* [http://www.analog.com &amp;quot;Implementing FAT32 File Systems on ADSP-BF533 Blackfin Processors&amp;quot;] Application Note und Code von ADI&lt;br /&gt;
* [http://www.atmel.com/dyn/products/tools.asp?family_id=682 FAT-Code in Atmel&#039;s AVR32 UC3 Software-Library]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/FAT32 AVR FAT16/32 read write Bibliothek mit wiki]&lt;br /&gt;
* [http://www.embedded-os.de/index.html?pcfat_port.htm pC/FAT driver] &amp;quot;using SPI for sector read/write to MMC/MMCplus/HD-MMC/M-Bridge/SD/SDHC-cards on different platforms&amp;quot;&lt;br /&gt;
* [http://www.dharmanitech.com/2009/01/sd-card-interfacing-with-atmega8-fat32.html SD Card Interfacing with ATmega8] (FAT32 implementation) by CC Dharmani&lt;br /&gt;
* [[AVR FAT32]]&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine Informationen ===&lt;br /&gt;
* [http://www.digitalspirit.org/file/index.php/obj/docs/sd/ Datenblätter] ( [http://www.digitalspirit.org/file/index.php/obj-download/docs/sd/ProductManualSDCardv2.2final.pdf SD Card Product Manual 2.2] )&lt;br /&gt;
* [http://elm-chan.org/docs/mmc/mmc_e.html ELM ChaN - How to Use an MMC]&lt;br /&gt;
* [http://elm-chan.org/fsw/ff/00index_e.html ELM ChaN - MMC/SD Benchmarks]&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/list-1-1.html?filter=MMC*+SD Beiträge zum Thema MMC/SD im Forum (ca. 200 Threads)]&lt;br /&gt;
&lt;br /&gt;
* [http://www.instructables.com/id/EZD6Q18LYGES1762SJ/ DIY SD-Card Fassung aus einem alten Floppy Kabel]&lt;br /&gt;
&lt;br /&gt;
* [http://www.shop.display3000.com/pi8/pi14/pd102.html Weiter unten im Text (runterscrollen) gibt es interessante Oszi-Bilder zu den oft genannten Spannungsteilern oder Transistorlösungen als Pegelwandler]&lt;br /&gt;
&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en532040 Microchip Memory Disk Drive System mit FAT32 und SDHC Unterstützung]&lt;br /&gt;
&lt;br /&gt;
* [http://www.ifas.htwk-leipzig.de/easytoweb/download/D&amp;amp;E_11_2006_Anbindung_von_SD-Karten.pdf Gute Beschreibung der SDIO-Architektur und wie man eine SD-Karte mit ARM bzw. AVR benutzt]&lt;br /&gt;
&lt;br /&gt;
=== Halter ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.watterott.com/SD-Sockel-SDAMB-01215BT00 Halter für normale SD-Karten] (death)&lt;br /&gt;
&lt;br /&gt;
[[Category:Bauteile]]&lt;br /&gt;
[[Category:Datenübertragung]]&lt;br /&gt;
[[Kategorie:Speicher und Dateisysteme]]&lt;/div&gt;</summary>
		<author><name>Jonebohne</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Reichelt-Wishlist&amp;diff=48103</id>
		<title>Reichelt-Wishlist</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Reichelt-Wishlist&amp;diff=48103"/>
		<updated>2010-05-30T12:11:31Z</updated>

		<summary type="html">&lt;p&gt;Jonebohne: /* Controller/FPGA/CPLD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Reichelt Wunschliste ==&lt;br /&gt;
&lt;br /&gt;
Auf dieser Seite können Wünsche zur Erweiterung des Reichelt-Lieferprogramms eingetragen werden. Es ist keine offizelle Wunschliste von Reichelt und es ist nicht bekannt, ob Reichelt-Mitarbeiter diese Seite regelmässig sichten. Reichelt sollte sicherheitshalber regelmäßig angeschrieben werden, damit diese Liste nicht in Vergessenheit gerät.&lt;br /&gt;
&lt;br /&gt;
Damit sich die beliebtesten Artikel herauskristallisieren, macht jeder einfach &#039;&#039;&#039;einen&#039;&#039;&#039; virtuellen Strich dahinter: | (Windows: ALT-GR Taste und &amp;lt; Taste drücken, Mac OS X: Alt-Taste und 7 Taste drücken). Alle fünf Striche (|||||) bitte immer ein Leerzeichen einfügen.&lt;br /&gt;
&lt;br /&gt;
Neue Artikel einfügen darf und soll natürlich auch jeder - aber bitte die Liste vorher durchgehen (Tipp: Browser-Suchfunktion nutzen)! Einfach ganz viele Striche auf einmal hinter einem Artikel einzufügen ist zwecklos. Das erkennt man in der History und es gibt viele Leute, die diese Seite überwachen...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nicht sinnvoll&#039;&#039;&#039; ist etwas sehr exotisches, wie z.&amp;amp;nbsp;B. einen ganz bestimmten super schnellen AD-Wandler hier aufzulisten! Neue Artikel müssen sich für Reichelt ja auch rentieren und wirtschaftlich &amp;quot;an den Mann bringbar&amp;quot; sein. [Die Entscheidung, ob sich was rentiert und ob es exotisch ist, sollte man vielleicht Reichelt und den eventuellen späteren Strichle-Setzern überlassen, statt im Voraus die Schere im Kopf walten zu lassen.]&lt;br /&gt;
&lt;br /&gt;
= Wunschliste =&lt;br /&gt;
== Halbleiter ==&lt;br /&gt;
=== Controller/FPGA/CPLD ===&lt;br /&gt;
&lt;br /&gt;
* Mehr FPGAs (v.a aktuellere) von Xilinx, z.&amp;amp;nbsp;B. Spartan III , ALTERA CYCLONE II (v.a. auch größere Typen, die noch im TQFP-Gehäuse zu haben sind wie z.&amp;amp;nbsp;B. XC3S400 oder XC3S500E (PQFP208)) ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |&lt;br /&gt;
* Atmel AVR Controller mit Funkanbindung z.&amp;amp;nbsp;B. AT86RF230, AT86RF211, AT86RF401, dazu passende Quarze (evtl. SMD) 18,080 MHz (Crystek P/N 016758), Spulen 39nH. ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* Atmel ATmega328P in TQFP und PDIP ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* Atmel AVR mit USB AT90USB82, AT90USB162, AT90USB646, AT90USB1286, AT90USB1287, ATmega32u2 und ATmega32u4 ||||| ||||| ||||| ||||| ||||| ||||| ||||| |&lt;br /&gt;
* Atmel Atmega 16A und 32A in TQFP und PDIP ||||| ||||| ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* Parallax Propeller CPU, 8 Cogs - DIP 40 ||||| ||||| ||||| ||||| ||||| ||||&lt;br /&gt;
* Freescale HCS12 Controller ||||| ||||| ||||| ||||| ||||&lt;br /&gt;
* Infineon XC866 ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* ALTERA Cyclone2 - Familie ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* ALTERA CPLD EPM70xx - Familie ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* Microchip PIC 24 ||||| ||||| ||||| ||||| |&lt;br /&gt;
* TI TMS470 Arm7 ||||| ||||| ||||| ||||| |&lt;br /&gt;
* Atmel AT90PWM3B (µC für Servosteuerungen und z.b. Motorsteuerungen) ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* Microchip PIC 10F2xx (+ Programmiergerät) ||||| ||||| ||||| ||| (einige Varianten erhältlich, Programmiergerät nicht sicher)&lt;br /&gt;
* ALTERA MAX-II (CPLDs) ||||| ||||| ||||| |&lt;br /&gt;
* Atmel ATmega644p(a) / atmega1284p(a) in TQFP und PDIP ||||| ||||| ||||| ||||&lt;br /&gt;
* Microchip PIC32 (MIPS) ||||| ||||| ||||| |&lt;br /&gt;
* Atmel AVR32 im TQFP ||||| ||||| ||||| ||&lt;br /&gt;
* ST STM32 Serie (Cortex-M3) ||||| ||||| ||||| |||||&lt;br /&gt;
* SSV DIL/NetPCs [http://www.dilnetpc.com]http://www.dilnetpc.com ||||| ||||| ||||&lt;br /&gt;
* Freescale MC9S08QG8 (DIP 16) ||||| ||||| |||&lt;br /&gt;
* Atmel ATmega324P in TQFP und PDIP ||||| ||||| ||||&lt;br /&gt;
* NXP LPC214x-Serie ARM7-Controller ||||| ||||| |||&lt;br /&gt;
* Microchip mehr dsPIC30F ||||| ||||| ||&lt;br /&gt;
* Microchip dsPIC33 ||||| ||||| ||&lt;br /&gt;
* Atmel AT89LP4052 PDIP ||||| ||||| ||&lt;br /&gt;
* Atmel ATtiny261 (auch 461 und 861; bevorzugt DIP) ||||| ||||| |||&lt;br /&gt;
* Renesas M16C ||||| ||||&lt;br /&gt;
* Atmel Dream Sound Synthesizer Chips, z.&amp;amp;nbsp;B. ATSAM3103 und ATSAM3308 ||||| ||||&lt;br /&gt;
* Axis Etrax 100LX Risc Processor (kostenloses Linux-System vorhanden) ||||| ||||&lt;br /&gt;
* NXP SAA5281 Videotextinterface ||||| ||||&lt;br /&gt;
* TI TUSB3210 ||||| ||&lt;br /&gt;
* TI MSP430F2001/2/3 etc. im RSA-Gehäuse (=QFN) ||||| ||&lt;br /&gt;
* ST ST7MC... (µC für Servosteuerungen, und vor allem Brushless-Motoren) ||||| ||&lt;br /&gt;
* Atmel ATmega1284P in TQFP und PDIP ||||| |||||&lt;br /&gt;
* ALTERA Cyclone3 - Familie ||||| |&lt;br /&gt;
* CY7C68013A-56PVXC (Cypress EZ-USB FX2LP) ||||| |&lt;br /&gt;
* Zilog Z8 Encore-Microcontroller (bis 64k Flash, I²C, SPI, 2xUART, ADC, on-Chip Debugger ...) [http://www.zilog.com/products/family.asp?fam=225]www.zilog.com ||||| |&lt;br /&gt;
* Freescale Prozessoren (Coldfire) (16 + 32 Bit) ||||| |&lt;br /&gt;
* Atmel Atmega 16L und 32L in TQFP (waere ATMEGA 16/32L8 TQ) ||||| |&lt;br /&gt;
* Luminarymicro Stellaris Serie (Cortex-M3) ||||| |&lt;br /&gt;
* NXP LPC23xx/24xx ||||| |&lt;br /&gt;
* Atmel AT89S2051/4051 ||||&lt;br /&gt;
* Freescale DSP56F801 ||||&lt;br /&gt;
* TI MSP430F167, TI MSP430F168 ||||&lt;br /&gt;
* Lattice ispMACH 4032C / 4064C / 4128C ||||&lt;br /&gt;
* ALTERA Flex10K - Familie ||||&lt;br /&gt;
* Atmel ATtiny2313V in SO und PDIP ||||&lt;br /&gt;
* Microchip PIC 16F883 und 16F886 |||&lt;br /&gt;
* TI MSP430F2618 |||&lt;br /&gt;
* XC3S 400 TQ144 |||&lt;br /&gt;
* Atmel ATA6612/13 (LIN-Bus SoC) ||&lt;br /&gt;
* Silabs C8051F320 USB Mikrocontroller ||&lt;br /&gt;
* ST STR7 Serie (ARM7TDMI) ||&lt;br /&gt;
* Ubicom SX20 SX28 IP2022 ||&lt;br /&gt;
* Microchip PIC 18F4523 (12/2007: PIC mit 12-Bit A/D-Wandler) ||&lt;br /&gt;
* ALTERA CPLD EPM30xx - Familie ||&lt;br /&gt;
* Western Design Center 65c816 ||&lt;br /&gt;
* Atmel ATmega48P in TQFP und PDIP ||&lt;br /&gt;
* Ajile aj-100 (Java Real-Time Prozessor) ||&lt;br /&gt;
* Atmel ATmega324PV in TQFP und PDIP ||&lt;br /&gt;
* Zilog ZNEO-Microcontroller (Z16Fxxx, bis 128k Flash, 4k RAM, bis zu 76 I/Os, 3 Timer, 10-bit A/D, externer Daten-/Adressbus, on-Chip Debugger) [http://www.zilog.com/products/family.asp?fam=236] www.zilog.com |&lt;br /&gt;
* TI MSP430FG4618 |&lt;br /&gt;
* Freescale MC9S08QEx |&lt;br /&gt;
* Lattice GAL 26V12 |&lt;br /&gt;
* Microchip PIC 18F6585 |&lt;br /&gt;
* Microchip PIC 18F6720 |&lt;br /&gt;
* Maxim/Dallas DS89C450 |&lt;br /&gt;
* Microchip PIC 18F8720 |&lt;br /&gt;
* Atmel XMega-Typen, z.&amp;amp;nbsp;B. ATXMega64A4, ATXMega128A1 |||||&lt;br /&gt;
* Neuere Atmel ATMEGA Controller (168PA, 88PA, etc.) |||||&lt;br /&gt;
* Microchip PIC24FJ64GB002-I/SP (USB-OTG im DIP28 Gehäuse) |&lt;br /&gt;
* PICAXE von Revolution Education Ltd&lt;br /&gt;
&lt;br /&gt;
=== Speicher ===&lt;br /&gt;
&lt;br /&gt;
* Atmel DataFlash, z.&amp;amp;nbsp;B. AT45DB081B (8 MBit Flash-Speicher an seriellen Bus im 8poligen Gehäuse) ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||&lt;br /&gt;
* Schnelles statisches RAM 128kB (10, 12, 15 oder 20ns, z.&amp;amp;nbsp;B. Samsung K6R1008C1D-UI10 oder CY7C1019D-10ZSXI) (5V/3,3V) ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| &lt;br /&gt;
* NexFlash spiFlash NX25P16 (16MBit serial Flash im SO8-Gehäuse) ||||| ||||| ||||| |||&lt;br /&gt;
* RAMs (SRAM oder DRAM) mit ordentlicher Kapazität (z.&amp;amp;nbsp;B. HY57V641620HG oder besser) ||||| ||||| ||||| |||&lt;br /&gt;
* FPGA Konfigurations-EEPROMS AT17LV256, AT17C65/128/256.../XCF04S/... ||||| ||||| |&lt;br /&gt;
* 24LC256 oder 24AA256 oder 24LC512 oder 24AA512 ||||| |||||&lt;br /&gt;
* EEPROM mit SPI Schnittstelle 25XX Serien ||||| ||||&lt;br /&gt;
* 3.3V DRAM ||||| |&lt;br /&gt;
* 3.3V async SRAM ab 16KByte ||||| |&lt;br /&gt;
* F-RAM mit SPI von RAMTRON ||||| |&lt;br /&gt;
&lt;br /&gt;
=== ICs ===&lt;br /&gt;
&lt;br /&gt;
* LM397, LM321 o.ä. single op-amp in SOT23-5 5-30V supply ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* Generell mehr I²C IC ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |&lt;br /&gt;
* Generell mehr 1-Wire IC ||||| ||||| ||||| ||||| ||||| ||||| ||||&lt;br /&gt;
* HV9910 Schaltregler für die Hochleistungs LED^s Ub=8-450V; I beliebig; Eff. besser 90% ||||| ||||| ||||| ||||| ||||| ||||| |&lt;br /&gt;
* ADS8320 ADC 16 Bit seriell ||||| ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* DDS-IC von Analog wie AD9833, AD9835 ||||| ||||| ||||| ||||| ||||| ||||&lt;br /&gt;
* DTMF-Dekoder-Enkoder (8870, 8880) ||||| ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* Digital Potentiometer (z.&amp;amp;nbsp;B. 2-Wire MAX546x, AD526x, X9C10x) ||||| ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* Cypress CY7C67300 dual role USB controller mit OTG ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* DAC7612 DAC 12 Bit seriell ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* I²C-Bus Temperatursensor DS1631Z ||||| ||||| ||||| |||||&lt;br /&gt;
* Generell mehr SPI IC ||||| ||||| ||||| ||||&lt;br /&gt;
* MAX6675 Typ-K Thermoelement nach SPI ||||| ||||| ||||| ||||&lt;br /&gt;
* Ethernet-Connector RJ-45 mit integriertem Übertrager (z.&amp;amp;nbsp;B. Taimag RJLBC-060TC1) ||||| ||||| ||||| ||&lt;br /&gt;
* ISD 5116 (Sprachaufnahme bis 16min &amp;amp; I2C-Interface) ||||| ||||| ||||| |&lt;br /&gt;
* PLL Schaltkreise für Frequenzerzeugung. z.&amp;amp;nbsp;B. MC / ML145170 (SOIC16) / TSA5060A ||||| ||||| ||||| |&lt;br /&gt;
* Maxim MAX629, MAX1795, MAX1703 (Aufwärtsregler / Step-Up-Konverter) ||||| ||||| |||||&lt;br /&gt;
* AD7524 in SMD ||||| ||||| ||||&lt;br /&gt;
* MCP23016 16Bit I²C I/O Expander ||||| ||||| ||&lt;br /&gt;
* D/A Wandler mit 4 oder mehr Ausgängen, z.&amp;amp;nbsp;B. TLC5620/TLV5629/AD5325 ||||| ||||| ||&lt;br /&gt;
* MAX7313 16 LED-PWM-Dimmer (Im gegensatz zu den Philips-ICs ist jede einzelne LED-Dimmbar, dafür nur in 16 Schritten) ||||| |||||&lt;br /&gt;
* QT511-ISSG (iPod-like Touch-Wheel-Sensor &#039;&#039;siehe&#039;&#039; [http://www.qprox.com/products/qwheel_qt510.php]) ||||| ||||&lt;br /&gt;
* Philips PCA82C252 oder TJA1054A oder vergleichbar (&amp;quot;Fault-Tolerant&amp;quot; CAN Transceiver, 11898-3) ||||| ||||&lt;br /&gt;
* ZHB6718 (H-Bridge für 1,5V - 20V Motoren) ||||| ||||&lt;br /&gt;
* LTC3490 ||||| ||||&lt;br /&gt;
* Ethernet Magnetics (Auch POE) ||||| |||&lt;br /&gt;
* MAX6958 / MAX6959 (I²C 4-Digit, 9-Segment LED Display Drivers with Keyscan) ||||| |||&lt;br /&gt;
* Ethernet-Controller CS8900A ||||| |||&lt;br /&gt;
* VS1053 MP3/AAC/WMA/Ogg Decoder von VLSI ||||| ||||&lt;br /&gt;
* Bosch CJ125 ||||| ||&lt;br /&gt;
* 74VHC-Serie komplettieren (z.&amp;amp;nbsp;B. 74VHC125D) ||||| ||&lt;br /&gt;
* DAC8830 IDT (16Bit-DAC,ser. Input) ||||| |&lt;br /&gt;
* AD623 Single Supply,Rail-Rail, InstrOpamp ||||| |&lt;br /&gt;
* High Side Current Sense ICs wie MAX4172 ||||| |&lt;br /&gt;
* ISD 2560 -&amp;gt; SOIC Gehäuse (Sprachaufnahme IC) ||||| |&lt;br /&gt;
* Automotiv ICs z.&amp;amp;nbsp;B. LM1815, LM1915, LM1949, LM9011, LM9040, LM9044, LMD18400... ||||| |&lt;br /&gt;
* LM3886 ||||| |&lt;br /&gt;
* LMX2306/LMX2316/LMX2326 PLL Synthesizer von National ||||| |&lt;br /&gt;
* RS485 isoliert: z.&amp;amp;nbsp;B. Burr-Brown ISO485 o.ä. ||||| |&lt;br /&gt;
* LM1117 - 3,3V SOT-223 ||||| ||&lt;br /&gt;
* Mehr FET-Treiber (TI UCC3372x, HIPxxx , die neueren Brückentreiber von Maxim ||||| |&lt;br /&gt;
* TH3122 K-Line Interface von MELEXIS ||||||||&lt;br /&gt;
* National Semiconductor CLC020 und CLC021 Parallel Component nach SDI-Converter |||||&lt;br /&gt;
* LM1117MPX-1.8 und LM1117MPX-3.3 (SMD-Spannungsregler SOT-223) |||||&lt;br /&gt;
* Maxim Switched Capacitor Tiefpass-Filter (z.&amp;amp;nbsp;B. MAX297, MAX7410) |||||&lt;br /&gt;
* CCS-Akkulade-IC (z.&amp;amp;nbsp;B. CCS9620SL) (siehe [[http://bticcs.com/]]) |||||&lt;br /&gt;
* L5973D 2,5A, 250kHz, Schaltregler im SO8 (ca. 1€) |||||&lt;br /&gt;
* TEA5768HL FM-Tuner IC von Philips |||||&lt;br /&gt;
* PCA9685 16Kanal 12Bit PWM LED Controller ||||| |&lt;br /&gt;
* Generell mehr DAC&#039;s (auch die teureren) von TI |||||&lt;br /&gt;
* TLV27(2|||||&lt;br /&gt;
* L6205 Motortreiber (2Kanal, 2,8A, DMOS)|||||&lt;br /&gt;
* STP08CL596M SO16 STM, LOW VOLTAGE 8-BIT CONSTANT CURRENT LED SINK DRIVER ||||&lt;br /&gt;
* Philips PCA9555 (I2C IO, 16 Bit par. I/O, c&#039;t Project Soundcheck II) ||||&lt;br /&gt;
* LTC1694-1 (I2C/SMBus Accelerator) |||||&lt;br /&gt;
* Generell mehr PWM-SIC&#039;s ||||&lt;br /&gt;
* TPIC6B595 (oder ähnliche 74xx595 high current (150 mA) shift register) ||||&lt;br /&gt;
* QT160 6-fach Touch Sensor IC ||||&lt;br /&gt;
* LM340x High Power LED-Treiber von National ||||&lt;br /&gt;
* 16-bit A/D-Wandler (waren von Maxim schon im Programm, sind aber wieder herausgeflogen?) ||||&lt;br /&gt;
* IR21844 DIL |||&lt;br /&gt;
* LTC24xx |||&lt;br /&gt;
* STP16CL596M SO24 STM, LOW VOLTAGE 8-BIT CONSTANT CURRENT LED SINK DRIVER |||&lt;br /&gt;
* IR2011 MOSFET Treiber |||&lt;br /&gt;
* TEA5757 FM-Tuner IC von Philips |||&lt;br /&gt;
* uC supervisor chips + watchdog z.&amp;amp;nbsp;B.: MAX6864 ist z.Z. der beste (0.2uA!) |||&lt;br /&gt;
* FTDI High Speed Chips, z.&amp;amp;nbsp;B. FT2232H ||||&lt;br /&gt;
* Motortreiber TLE 4205 |||&lt;br /&gt;
* MMI4832 (Geber Interface Baustein EnDat, SSI, Incrementalgeber |||&lt;br /&gt;
* Generell mehr I2S IC (ADC, DAC, DSP, u.a. Crystal, BurrBrown etc.) |||&lt;br /&gt;
* MAX127/128 8-Kanal 12bit ADC mit I2C interface |||&lt;br /&gt;
* TI PCM1804|||&lt;br /&gt;
* DP83848C (Ethernet Physical Layer Transceiver/PHY, MII/RMII-Schnittstelle, passend zu AT91SAM7X) |||&lt;br /&gt;
* MagJacks ||||&lt;br /&gt;
* STP08CL596B1 DIP16 STM, LOW VOLTAGE 8-BIT CONSTANT CURRENT LED SINK DRIVER ||&lt;br /&gt;
* STP16CL596B1R DIP24 STM, LOW VOLTAGE 16-BIT CONSTANT CURRENT LED SINK DRIVER ||&lt;br /&gt;
* Leistungs-OP LM675 von National ||&lt;br /&gt;
* CS5641 von Cirrus...The CS5461 incl. two delta-sigma A/D converters.... ||&lt;br /&gt;
* TI PCM2707 ||&lt;br /&gt;
* MIC6315 von Micrel (3,3/5V Reset Baustein mit manual Reset) ||&lt;br /&gt;
* DS1616 von Dallas Datalogger-IC ||&lt;br /&gt;
* MAX6650 ||&lt;br /&gt;
* TLV320AIC23B Audio-Codec ||&lt;br /&gt;
* Schnellere und gleichzeitig günstige OpAmps; Beispiel AD8055 ||&lt;br /&gt;
* IRS2092 Class-D Audio Driver IC ||&lt;br /&gt;
* LM1117 - 1,8V ||&lt;br /&gt;
* P82B86 (I2C Dual Bi-Directional Bus Buffer) ||&lt;br /&gt;
* MAX7311AWG 2Wire Interface von Maxim ||&lt;br /&gt;
* MAX 4420 Mosfet Driver ||&lt;br /&gt;
* MAX 4429 Mosfet Driver ||&lt;br /&gt;
* IP101 PHY von IC+ (Distri für DE [http://www.topas.de/tt/cfs/icp_cfs_mai05.htm Topas]) ||&lt;br /&gt;
* UDN 2987 LW (Source Driver UDN2987 in SMD-Bauform) ||&lt;br /&gt;
* VN808 Low Treshold Octal High Side Driver 0,7A |&lt;br /&gt;
* L5970 o. L5972 1 bzw. 2A, 250kHz Schaltregler im SO8 |&lt;br /&gt;
* Fast Ethernet-Controller (DE9000A/B/E, AX88796B, ...) |&lt;br /&gt;
* Max1555 - LiPo Lade IC |&lt;br /&gt;
* AD8601 Rail to Rail Opamp |&lt;br /&gt;
* ViPER Schaltregler von ST |&lt;br /&gt;
* TPS79318 1,8V 200mA LDO in (bestens für z.&amp;amp;nbsp;B. LPC210x µC) |&lt;br /&gt;
* AD5160 SPI-Poti in SOT23 |&lt;br /&gt;
* FM25L16 o. FM25L256 SPI-FRAM |&lt;br /&gt;
* TLC3702 Komparator |&lt;br /&gt;
* Linear Technology LTZ1000ACH#PBF Präzisions-Referenz (Ersatz für LM399H) |||&lt;br /&gt;
* Philips TDA1543 - 2x16-Bit DAC |&lt;br /&gt;
* ITS4141N o. BTS4141N Smart High-Side Power Switch (z.&amp;amp;nbsp;B. bestens für 24V geeignet!) |&lt;br /&gt;
* MAX528 8-fach 8Bit DAC mit Output Buffer seriell |&lt;br /&gt;
* 74HCxxxx komplette Serie |&lt;br /&gt;
* AD628 InstrOpAmp, high voltage inputs |&lt;br /&gt;
* TLV2382ID Rail-Rail-OP von TI |&lt;br /&gt;
* CP2120 single-chip SPI to I2C bridge and GPIO port expander |&lt;br /&gt;
* VS1000 Ogg Decoder von VLSI |&lt;br /&gt;
* MC 34152 D-SMD SO8 Dual Mosfet Driver |&lt;br /&gt;
* ADuM 1201 o. ADuM1401 - Digitale Übertrager |&lt;br /&gt;
* LM267X SimpleSwitcher Step-Down-Konverter in SO-8 Bauform |&lt;br /&gt;
* Video-AD-Wandler z.&amp;amp;nbsp;B. LTC2208 (16 Bit 130 MS/s) für FPGA und SDR |&lt;br /&gt;
* Clock generator IC&#039;s, z.&amp;amp;nbsp;B. PCK20?? von Philips |&lt;br /&gt;
* LTC 1661 N8 10 Bit Dual Dac mit SPI Interface |&lt;br /&gt;
* LTC 1655(L) N8 16 Bit DAC interne Ref 2.048/1.25V(L Type) SPI Interface |&lt;br /&gt;
* MCP23S17 16Bit SPI I/O Expander (aber ohne Schmidt-triggerd Eingänge wie der 23x16) |&lt;br /&gt;
* MCP23S08 8BIT SPI I/O Expander |&lt;br /&gt;
* Power over Ethernet Bausteine z.&amp;amp;nbsp;B. LM7050&lt;br /&gt;
* LTC 4411 ideale Diode 2,6 bis 5,5V max. 2,6A im SOT-23 Gehäuse&lt;br /&gt;
* MCP23008 8Bit I2C I/O Expander |&lt;br /&gt;
* Zarlink MT8841 Calling Number Identification Circuit |&lt;br /&gt;
* TI TPS61070 3.3V-75mA-aus-einer-NiMH-Zelle (+ passende SMD-Induktivität) |&lt;br /&gt;
* RFID EM4095 |&lt;br /&gt;
* LT-1117-CST-5 als Sot223 (adj und 3.3 gibts schon, 5 fehlt noch) |&lt;br /&gt;
* LTC5540 |&lt;br /&gt;
&lt;br /&gt;
=== Diskrete ===&lt;br /&gt;
&lt;br /&gt;
* Größere Auswahl an Step-up Reglern ||||| ||||| ||||| ||||| ||||&lt;br /&gt;
* Spannungsregler SMD in DPAK ||||| ||||| ||||| |||&lt;br /&gt;
* SMD Doppeldiode Schottky 12A 60V im TO252AA z.&amp;amp;nbsp;B. 12CWQ06FN von IOR ||||| ||||| ||||| ||&lt;br /&gt;
* LM317EMP oder LM317AEMP SMD-Spannungsregler einstellbar (SMD TO-223 Gehäuse) ||||| ||||| ||||&lt;br /&gt;
* Si4562DY N- and P-Channel 2.5-V (G-S) MOSFET SMD ||||| ||||| ||&lt;br /&gt;
* Niederohm-FETs in SO8, N und P ||||| ||||| |&lt;br /&gt;
* Digitaltransistoren (BCR*), auch als Pärchen NPN/PNP (BCR10, BCR08pn) ||||| ||||&lt;br /&gt;
* IRF7503/IRF7506 Dual Mosfet SMD ||||| |||||&lt;br /&gt;
* ZRA250F005 Referenzspanungsquelle 2,5V 0.5% SOT23 gehäuse ||||| |||||&lt;br /&gt;
* L4941 Spannungsregler 5V/1A in SMD-Ausführung (DPAK) ||||| ||||&lt;br /&gt;
* mehr FETs und IGBTs (nichtnur IRF, sehr gut IXYS &amp;lt;- und sauteuer!) ||||| ||||&lt;br /&gt;
* R-783.3-0.5 Schaltregler 4,75V - ca. 18V Eingang; 3,3V Ausgang (Hersteller Recom) ||||| |||&lt;br /&gt;
* R-785.0-0.5 Schaltregler 6,5V - 30V Eingang; 5,0V Ausgang (Hersteller Recom) ||||| ||&lt;br /&gt;
* MC78LCxx Serie - Ultra Low Drop Spannungsregler 3-5 Volt mit 1 Mikro-Ampere Ruhestrom ||||| ||&lt;br /&gt;
* SPP20N60C3 Infineon Mosfet 600V 190mOhm Rdson &amp;lt;10ns tr+tf (Schnellste Schaltzeit in der Klasse) ||||| |&lt;br /&gt;
* 5,2V Lowdrop Längsregler LF52 im TO252AA von STM |||||&lt;br /&gt;
* BUF420AW Schaltnetzteil Transistor von STM |||||&lt;br /&gt;
* LM2734 Schaltregler |||&lt;br /&gt;
* SDT06S60 Infineon SiC 600V 6A Silizium-Carbid Schottky-Diode (kein trr, daher keine Schaltverluste) ||||&lt;br /&gt;
* Philips PDTD113E/123E und PDTB113E/123E (PNP und NPN im sot23 mit internen Widerständen für Basis und PullUp/Down ||&lt;br /&gt;
* R-785.0-1.0 Schaltregler, Ausgang 5,0V, 1A ||&lt;br /&gt;
* 2SC1971 Transistor mit hoher Frequenz und viel Leistung für Endstufen ||&lt;br /&gt;
* MIC29300/29301 Spannungsregler 5,0V 3A im TO263(SMD) Gehäuse ||&lt;br /&gt;
* R-523.3PA Schaltregler 4V - 18V Eingang, variabler Ausgang (Nominalspannung 3.3 V) mit nur 2-4 externen Bauteilen bei &amp;gt; 90% Effizienz |&lt;br /&gt;
* IRC540 (HEXSense) |&lt;br /&gt;
* Hochspannuns-Widerstände (z.&amp;amp;nbsp;B. 330M/10kV) |&lt;br /&gt;
* R-723.3P Schaltregler 4V - 28V Eingang, variabler Ausgang (Nominalspannung 3.3 V) mit nur 2-4 externen Bauteilen bei &amp;gt; 90% Effizienz |&lt;br /&gt;
* PhotoMOS Relay (z.&amp;amp;nbsp;B. AQV257 von Panasonic; http://www.mew.co.jp/ac/e/control/relay/photomos/index.jsp) |&lt;br /&gt;
* BSH205 P-Channel 1.5V(GS), 0.75A, 12V D-S |&lt;br /&gt;
* IPS5451S intelligenter Leistungsschalter 50 V, 35 A, 25 mΩ |&lt;br /&gt;
* MAX 8865 Dual, Low-Dropout, 100mA Linear Regulator |&lt;br /&gt;
* IR3313 o.ä. Intelligenter Leistungsschalter 32V/90A, einstellbare Strombegrenzung ||&lt;br /&gt;
* LF50ABDT Spannungsregler SMD DPAK 5.0V very low drop |&lt;br /&gt;
* IPW60R045CS Infineon Mosfet 600V 45mOhm Rdson 30ns tr+tf (niedrigster Rdson in der Klasse) |&lt;br /&gt;
* MJD31C NPN Transistor SMD DPAK 3&lt;br /&gt;
* IRFI4212H-117P Doppel-Mosfet (f. Klasse D-Verstärker&lt;br /&gt;
&lt;br /&gt;
=== Sensoren/Aktoren ===&lt;br /&gt;
&lt;br /&gt;
* Sensirion SHT11/SHT71 (oder auch SHT15/SHT75) ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |&lt;br /&gt;
* Sharp Entfernungssensoren (zb den GP2D120 oder den GP2D12) ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* Drehwinkelgeber, Gyro, Kreiselsensoren ähnl. Tokin CG-L43 ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* IS471 Selbstmodulierende IR-Lichtschranke ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* Motorola/Freescale Drucksensoren z.b. MPX4250 mit AP Druckanschluss ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* kleine Feuchtigkeitssensoren zur &#039;on-board-Montage&#039; ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* Durchflussmesser (z.&amp;amp;nbsp;B. wie Conrad Nr.155374) ||||| ||||| ||||| ||&lt;br /&gt;
* iMEMs Acceleration Sensors ADXL Series von Analog Devices ||||| ||||| ||||| |&lt;br /&gt;
* Hall-Sensor UGN3503, KMZ51 ||||| ||||| ||||&lt;br /&gt;
* LEM Stromsensoren (Transducer) der HAIS-Serie, speziell HAIS 50-P und 100-P ||||| ||||| ||||| ||&lt;br /&gt;
* Summer mit 20mA@5V ähnlich Conrad Nr.751553 (TDB05 kann mit 30mA@5V nicht von allen Controllern direkt getrieben werden) ||||| ||||| |||&lt;br /&gt;
* günstige Temp. Sensoren TC77 ||||| ||||| ||&lt;br /&gt;
* FSRs (Force Sensing Resistor) von Interlink Electronics ||||| ||||| ||&lt;br /&gt;
* NanoMuscle Aktuatoren ||||| ||||| |&lt;br /&gt;
* K-Typ (J-Typ) Thermocouple Temperatursensoren und passende Steckverbinder ||||| ||||| ||&lt;br /&gt;
* 4Hz Supersense µblox LEA-4S GPS module (Importer pointis.de) + Passende Passives Patch antenna (zB. von inpaq.com) ||||| ||&lt;br /&gt;
* Magnetfeld-Sensor (Kompass-Anwendung) KMZ52 ||||| |||&lt;br /&gt;
* Flexinol ||||| ||&lt;br /&gt;
* Induktions-Stromsensoren Coilcraft #J9199-A o.ä. |||||&lt;br /&gt;
* Piezo Minimotoren/Lienearaktoren von Elliptec/Siemens einzeln und günstig |||||&lt;br /&gt;
* Anemometer |||||&lt;br /&gt;
* Linear- und 360° Soft-Pots wie von spectrasymbol |||||&lt;br /&gt;
* Allegro Stromsensoren (z.&amp;amp;nbsp;B. ACS713, ACS756) ||||| |||&lt;br /&gt;
* Luftdruck-/ Temperatur Sensor Intersema MS5534 (mit SPI- Interface) ||&lt;br /&gt;
* Temperatur IC TC1047 ||&lt;br /&gt;
* Hallsensoren z.&amp;amp;nbsp;B. TLE4905 wieder ins Programm nehmen ||&lt;br /&gt;
* Temperatursensor mit SPI-Interface LM74 ||&lt;br /&gt;
&lt;br /&gt;
== Baugruppen ==&lt;br /&gt;
* Atmel ATNGW100 von [http://www.atmel.com/dyn/corporate/view_detail.asp?FileName=AVR32NGKit_3_26.html Atmel] = billiges Linux Board ($69=51.69€) --&amp;gt; [http://www.avrfreaks.net/wiki/index.php/Documentation:NGW/NGW100_Hardware_reference Dokumentation] ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* Atmel ATSTK600 von [http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4254 Atmel] ||||&lt;br /&gt;
* Atmel ATSTK1000 von [http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3918 Atmel] ||||| ||||| ||||| ||||&lt;br /&gt;
* Atmel AVR Dragon von [http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3891 Atmel] ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* Axis Etrax 100LX MCM (Multi Chip Module) A full Linux computer on a single chip!  ||||| |||||&lt;br /&gt;
* CentiPad/DevKit Embedded Linux Modul ([http://www.centipad.de www.centipad.com]) ||||| ||&lt;br /&gt;
* DS9490R USB zu 1-Wire Dongle (auch mit Linux Treiber) |||||&lt;br /&gt;
* Easy-Radio Module zur seriellen Datenübertragung (ER400 RS/TS/RTS) ||||| ||||| ||||| ||&lt;br /&gt;
* Foxboard = Betriebsfertiges Micro Linux System mit Axis Etrax 100LX MCM 66mm x 72mm ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* FoxVHDL = FPGA Erweiterungskarte für das ACME Foxboard ||||&lt;br /&gt;
* Hope RF Module 433 u. 868 MHz, http://www.hoperf.com/pdf/RF12.pdf |||||&lt;br /&gt;
* kostengünstige Funkschaltmodule (TLP/RLP) ||||| ||||| ||||| ||||||&lt;br /&gt;
* kostengünstige Funkempfänger/Funksender 433 &amp;amp; 868 Mhz ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* Lantronix XPort Embedded Device Server ([http://www.lantronix.com www.lantronix.com]) ||||| ||||||&lt;br /&gt;
* Lantronix XPort Direct ||&lt;br /&gt;
* low-cost Experimentierplatinen für FPGA ||||| ||||| ||||| ||&lt;br /&gt;
* Mini-Bluetooth Module (RS232-Bluetooth-&amp;quot;Wandler&amp;quot;-Platinchen) z.&amp;amp;nbsp;B. BTM222   |&lt;br /&gt;
*  Bluetooth Funkmodul ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||||| ||||| |||||&lt;br /&gt;
* Mini-WLan Module (RS232 zu WLan) ||||| ||||| ||||| ||||&lt;br /&gt;
* MT1390 FM Tuner-Modul von Microtune |||&lt;br /&gt;
* NetDCU8 von F &amp;amp; S Elektronik Systeme GmbH (http://www.fs-net.de) - Linux-Computerplatine mit 400MHz Samsung-ARM mit 32MB RAM, 16MB Flash und SD/Ethernet/CAN/USB/TFT/RS232 für ca. 100 Euro ||||| ||||| ||&lt;br /&gt;
* OM5610 FM Tuner-Matchbox von Philips |||&lt;br /&gt;
* TI - MSP430 Wireless Development Tool (AEC13895U) |&lt;br /&gt;
* Gyro Sensoren  MURATA,  ENC-03J A/B    ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* UM232 FTDI USB - RS232 Modul für DIL sockel ||&lt;br /&gt;
* ST Primer 2 (Experimentierboard fuer ARM Einsteiger) |&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;Passive&amp;quot; Bauteile ==&lt;br /&gt;
&lt;br /&gt;
=== Spulen etc. ===&lt;br /&gt;
* Ordentliche Trafospulen + Kerne, z.b. ETD-Serie, oder RM10 ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* Passende Ferrite dazu: N27,N41,N67,N87,N97 ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* Magnetics CoolMu Ringkerne ||||| |||||||&lt;br /&gt;
* Magnetics MPP Ringkerne ||||| ||||| ||&lt;br /&gt;
* Die Micrometals Pulverkerne (-18 und -26) auch in größer ||||| |&lt;br /&gt;
* Funk-Entstördrosseln 16A, div. Werte ||||| ||||| |&lt;br /&gt;
* Funk-Entstördrosseln 47µF |||&lt;br /&gt;
* Würth Induktivitäten ||||| ||||| ||||| ||||&lt;br /&gt;
* Übertrager für Schaltregler z.&amp;amp;nbsp;B. Epcos Typ  B78304 ||||| ||&lt;br /&gt;
* SEPIC-Speicherdrosseln von Würth WE-DD (Größe M u. L) ||&lt;br /&gt;
* Sortimentskästen von Würth |&lt;br /&gt;
&lt;br /&gt;
=== Kondensatoren ===&lt;br /&gt;
* Low-ESR Elkos (definiertes Fabrikat/Typ, und nicht einfach irgendwelche! (Rubycon?)) ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||||  |||||| ||||| ||||| ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* Low-ESR Elkos RM 3,5mm 1.000uF 6,3V (Mainboardaustausch Elko) ||&lt;br /&gt;
* Low-ESR SMD Tantal-Elkos (definiertes Fabrikat/Typ, und nicht einfach irgendwelche! (AVX?, Epcos?)) ||||| ||||| ||||| ||||| ||||&lt;br /&gt;
* Zum MAX232 so20 passende SMD-Kerkos im Wert 1uF (0805,0603, 1206) ||||| ||||| ||||| |||||&lt;br /&gt;
* Generell SMD-Kerkos im Wert &amp;gt; 100nF ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* Kleine Niedervolt-Polyproplyenkondis mit mehr Kapazität |||&lt;br /&gt;
* Wima MKP4 ||||&lt;br /&gt;
* Wima MKP-X2 (~275V, klein und ideal für Kondensatornetzteile) |&lt;br /&gt;
* Günstige hochkapazitive Doppelschichtkondensatoren (z.&amp;amp;nbsp;B. Maxfarad MES2245 220F 2,3V) ||||| |&lt;br /&gt;
* Keramikkond. SMD 0603/0805/1206: mehr Zwischenwerte (56p, 82p, 560p) ||||| ||&lt;br /&gt;
* Drehkondensator  20-500pf |||&lt;br /&gt;
* Sanyo OS-Con bedrahtet und SMD |||&lt;br /&gt;
&lt;br /&gt;
=== Widerstände ===&lt;br /&gt;
* SMD-Widerstände 0805 und 1206 auch unterhalb von 1 Ohm ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* SMD-Widerstände unterhalb 1 Ohm, andere Gehäuse als 0805/1206 (leichter erfüllbarer Wunsch) ||||| ||||| ||&lt;br /&gt;
* SMD-Widerstände 0805 auch aus der E24-Reihe ||||| ||||| ||||| ||&lt;br /&gt;
* Durchsteck-Widerstände in kleiner Bauform 0204. ||||| |||||&lt;br /&gt;
* R2R-Widerstandsnetzwerke (z. B. 10/20kOhm für DA-Wandler an Microcontrollern) ||||| ||||| ||||| ||||| ||||| ||||| ||||&lt;br /&gt;
* Präzisionswiderstände 0,05% und besser, ev. Drahtgewickelt ||||| ||||| ||||| |&lt;br /&gt;
* Niederohm-Widerstände (Shunts ab 1mOhm im guten Gehäuse z.&amp;amp;nbsp;B. TO220) ||||| ||||| ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* 25/50W-Widerstände (~20/50 Ohm auch weniger) ||||| ||||| |||||&lt;br /&gt;
* Präzisions-Spannunsgteilernetzwerke ||||| ||||&lt;br /&gt;
*Präzisionsspannungsteiler 1:10, 1:100, 1:1000 (10MOhm Gesamtwiderstand) ||&lt;br /&gt;
* SMD-Präzisionswiderstände (0,1% TC10ppm/K =&amp;gt;0,1W indukt.arm) ||||| ||||| ||||| ||&lt;br /&gt;
* Null-Ohm Widerstände (Drahtbrücken) Baugröße wie 1/4W ||||| ||&lt;br /&gt;
* Erneut die 10k-Ohm SMD Potis ||||&lt;br /&gt;
&lt;br /&gt;
=== Quarze, Quarzoszillatoren und Resonatoren ===&lt;br /&gt;
* SMD-Quarze mit Standardgehäuse (z.&amp;amp;nbsp;B. HC49/US &amp;amp; HC49/UP) ||||| |||&lt;br /&gt;
* Quarzoszillator  9,8304 Mhz  ||&lt;br /&gt;
* Quarz mit 3,200 Mhz  ||&lt;br /&gt;
* 13,5600 MHz Quarz (benötigt für RFID)  ||||| ||||&lt;br /&gt;
* Quarz mit 13,56 MHz (SMD+bedrahtet) ||||| |&lt;br /&gt;
* 24,0000 MHz Standardquarz Grundton (&#039;&#039;&#039;kein 3. Oberton!!!&#039;&#039;&#039;) (benötigt für USB-DMX-Interface) ||||| |||&lt;br /&gt;
* 25,0000 Mhz &#039;&#039;&#039;Grundton&#039;&#039;&#039;-Quarz (wird benötigt für Microchip TCP/IP Controller ENC28J60) ||||| ||||| |||&lt;br /&gt;
* Allgemein mehr Grundtonquarze bei höheren Frequenzen ||||»&lt;br /&gt;
* SMD Quarze/ Oszillatoren in flachen, kleinen SMD Gehäusen (SMX-A/-B) |||&lt;br /&gt;
* Murata Keramik-Resonator CSTLS16M0X, CSTLS20M0X (obwohl 3. OW, direkt mit µC verwendbar)&lt;br /&gt;
&lt;br /&gt;
=== Sonstiges ===&lt;br /&gt;
* Varistoren 14V auch als bedrahtetes Bauteil (für KFZ-Bordnetz) ||||| ||||| |-&amp;gt; 1,5KE 18CA&lt;br /&gt;
* Suppressordioden mit Spannungsbereich zwischen 15V und 30V |||&lt;br /&gt;
* Netzfilter FFP Reihe Schurter ||&lt;br /&gt;
* Metallbrückengleichrichter für 50A ||||&lt;br /&gt;
* Lieferungen nach Österreich ohne 150 Euro Mindestbestellwert wie alle anderen Supplier |&lt;br /&gt;
* Hochlast NTC, z.&amp;amp;nbsp;B. 80-220 Ohm/1-4A (EPCOS, Ametherm)|&lt;br /&gt;
* Ringkertrafos &amp;gt;500VA mit höherer Spannung als 30V (Verstärkerbau) |&lt;br /&gt;
* Übertrager FB2022 oder 20F-001N (passend zu RTL8019AS)&lt;br /&gt;
* Übertrager passend zu ENC28J60&lt;br /&gt;
&lt;br /&gt;
== HF Baumaterialien ==&lt;br /&gt;
* Filter SFE10.7MA19 360khz SZP2026 |&lt;br /&gt;
* Keramische Filter CFM455... ganzes Sortiment |||| |&lt;br /&gt;
* Quarze 32 MHz 10ppm Oscillatorfrequenz 0 bis +70°C&lt;br /&gt;
* Quarze 6,500000 MHz ||&lt;br /&gt;
* MC68160FB&lt;br /&gt;
* S3C4510B&lt;br /&gt;
* MT48LC4M32B2TG-7&lt;br /&gt;
* MC68EN302PV20&lt;br /&gt;
* Zirkulatoren ALD4302SB statt LM239 &lt;br /&gt;
* Transistoren MRFG35010 |&lt;br /&gt;
* µP Compatible CTCSS Encoder,Decoder FX 365&lt;br /&gt;
* Durchführungskondensatoren 1nF/160V (waren Ende &#039;06 noch im Programm) ||| |&lt;br /&gt;
* ZF-Quarzfilter für versch. Frequenzen (10, 20, 40 MHz) ||&lt;br /&gt;
* MMICs und Ringmischer von Mini-Circuits&lt;br /&gt;
* PLL ICs z.&amp;amp;nbsp;B. von NXP und National für HF-UHF ||&lt;br /&gt;
* MICRF002/022, MICRF102/103 von Micrel  ||||| |&lt;br /&gt;
&lt;br /&gt;
== Optoelektronik und Leuchtmittel ==&lt;br /&gt;
* TFT/OLED Farb-Displays, wie die bereits abgekündigten OSRAM OLEDs |||&lt;br /&gt;
* low current SMD LEDs (z.&amp;amp;nbsp;B. Osram LG T679 - Anm.: hier gleich die neuen Varianten Lx T67K bestellen, nicht die alten 9er) ||||| ||||| ||||| |||||&lt;br /&gt;
* SMD LED Bauform 0402 rot/gelb/grün/blau/weiss  ||||| ||||| ||||| ||||| |&lt;br /&gt;
* weisse SMD LED Bauform 0603 ||||| ||||| |||||&lt;br /&gt;
* warm weisse LED ||||| ||||| ||||| ||&lt;br /&gt;
* OSRAM Hyper TOPLEDS weiss LW T67C-T2U2-5K8L ||&lt;br /&gt;
* OSRAM Halogen Decostar 51 12V 20W GU5,3 statt des billigen NoName Zeugs ||&lt;br /&gt;
* OSRAM Hyper TOPLEDS gelb LY T676-S1T1-26 ||&lt;br /&gt;
* Everlight SMD-RGB (fullcolor) 19-337/R6GHBHC-A01/2T ||||&lt;br /&gt;
* Superflux RGB LED ||&lt;br /&gt;
* 7-Segment-Anzeige 4 DIGIT mit und ohne Doppelpunkt |&lt;br /&gt;
* 7-Segment-Anzeige, allgemein Low-Current bzw. High Efficiency Versionen anbieten ||||| ||||&lt;br /&gt;
* 7-Segment-Anzeige, blau, gem. Anode ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* 7-Segment-Anzeige, weiss, gem. Kathode ||||| ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* 7-Segment-Anzeige, weiss, gem. Anode ||||| ||||| ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* 7-Segment-Anzeige, blau, gem. Kathode ||||| ||||| ||||| ||||| ||||| ||||| |&lt;br /&gt;
* Diese 4-Stelligen Dot-Matrix LED Anzeigen Siemens SLG 2016 oder von HP oder ähnliches ||||| |&lt;br /&gt;
* Generell alle 7-Segment-Anzeigen auch in Blau und bis zu 100mm höhe ||&lt;br /&gt;
* Vakuum-Fluoreszenz-Displays (Dot Matrix mit Standardcontroller, z.&amp;amp;nbsp;B. Futaba &amp;quot;LCD Emulators&amp;quot;)  ||||| ||||| |||&lt;br /&gt;
* IL207AT (SMD Optokoppler von Infineon) ||||| ||&lt;br /&gt;
* ILD256T (SMD AC-Optokoppler)  ||||| |||||&lt;br /&gt;
* ILD620 (DIP Optokoppler) ||||| ||||| ||||| ||||&lt;br /&gt;
* SFH6106, SFH6206 4 Pin Optokoppler SMD ||||||&lt;br /&gt;
* TLP113 (SMD Optokoppler) |||||&lt;br /&gt;
* Vactrol Optokoppler (mit Fotowiderstand zur Analogsignalregelung) |||||&lt;br /&gt;
* IR-Diode mit viel power ttp://www.lc-led.com/Catalog/department/36/category/49/1 ||&lt;br /&gt;
* IrDA-Tranceiver TFDS4500 (oder TFDU4100) wieder anbieten (war im 07/2005er Katalog noch drin) ||||| ||||&lt;br /&gt;
* Seoul Zled P4 (100lm bei 350mA, 240lm bei 1A!) ||||| |||||&lt;br /&gt;
* Generell: Z-Power LEDs von Seoul (günstiger und heller als Luxeon) ||||| ||&lt;br /&gt;
* Seoul Z-LED RGB auf Platine ||&lt;br /&gt;
* EA DOG-L128 128x64 Grafikdisplay zzgl Touch-Folie und Beleuchtung | --&amp;gt; ist ab Katalog 06/2009 drinn&lt;br /&gt;
* TLP 3617&lt;br /&gt;
* TSOP 1730 | [Achtung! TSOP17xx sind Auslaufmodelle bei Vishay]&lt;br /&gt;
* TSOP 1140 | (oder andere 40 kHz IR-Empfänger)&lt;br /&gt;
* TORX 178&lt;br /&gt;
* TSOP98260 (Breitband IR-Empfangsmodul 20-60 KHz) |||&lt;br /&gt;
* TSOP98200 (Breitband IR-Empfangsmodul 20-455 Khz) |||&lt;br /&gt;
* PC923 (Opto MosFET Gate Treiber auch für High Side) |&lt;br /&gt;
* TLP250 (Opto MosFET Gate Treiber auch für High Side)||||&lt;br /&gt;
* LED Punktmatrix Anzeigen 8x8 superrot 3mm (z.&amp;amp;nbsp;B. ELM-1883SRWA (Everlight)) |&lt;br /&gt;
* Acriche 230V~ LEDs&lt;br /&gt;
* Luxeon Rebel weiß (180 lm) auf Star-, Mini- oder normaler Platine ||&lt;br /&gt;
* BPW 34 F / FS (aus dem Sortiment gefallen) |&lt;br /&gt;
* SMD-IR-LEDs in 0603/0805/SOT23 |&lt;br /&gt;
* Dazu passend IR-Fotodioden in 0603/0805/SOT23 |&lt;br /&gt;
* Kingbright PSC Serie (16 Segment LED-Display, insbesondere PSC08 und PSC12) |&lt;br /&gt;
* Edison Opto LEDs: pinkompatibel mit diversen abgekündigten LEDs von Luxeon und Co, aber deutlich günstiger im Preis und leuchtstärker da u.A. Cree LED DIEs verwendet werden&lt;br /&gt;
** Edison Opto ARC / Edixeon LEDs (da ja Luxeons abgekündigt sind) ||||&lt;br /&gt;
** Edison Opto Federal (Luxeon Rebel artig) ||||&lt;br /&gt;
** Edison Opto KLC8 (Luxeon Bauform mit Cree Die) ||||&lt;br /&gt;
** Edison S Serie -&amp;gt; Lumiled kompatibles Gehäuse aber viel Leuchtstärker |||&lt;br /&gt;
** Edison Exixeon Serie -&amp;gt; Lumiled kompatibles Gehäuse aber viel Leuchtstärker ||&lt;br /&gt;
** Edison Edixeon RGB |||&lt;br /&gt;
&lt;br /&gt;
== Mechanisches ==&lt;br /&gt;
* Getriebemotoren wie RB35 oder RB40 ||||| ||||| |&lt;br /&gt;
* Muttern M2 |||&lt;br /&gt;
* Stopmuttern M2 |&lt;br /&gt;
* Zylinderkopfschrauben M2,5 x 12mm |||||&lt;br /&gt;
* Zylinderkopfschrauben M2,5 x 20mm |||||&lt;br /&gt;
* Zylinderkopfschrauben M2,5 x 30mm |||||&lt;br /&gt;
* Zylinderkopfschrauben M3 x 25mm |||||&lt;br /&gt;
* Bopla ABP oder ABPH 800-100 (10cm) Aluprofil Gehäuse |&lt;br /&gt;
* microSD / Transflash sockel mit push-push technik (ist nervig die immer für teuren versand aus amiland kommen zu lassen) ||||| ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* M2 Gewindebohrer und Senker |||&lt;br /&gt;
* Kapton-Baender, evtl auch mit Kupferbeschichtung (Flex-PCB) ||&lt;br /&gt;
* Distanzhülsen/-bolzen M3 in verschiedenen Längen aus Kunststoff |&lt;br /&gt;
* Distanzbolzen M2,5 (SW4) in verschiedenen Längen aus Messing |&lt;br /&gt;
&lt;br /&gt;
=== Schalter/Potis etc. ===&lt;br /&gt;
* Drehimpulsgeber DDM Hopt+Schuler 427 SMD (evt auch normal, stehend &amp;amp; liegend) ||||| ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* Folientastaturen ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* Drucktastenfeld Matrix 3x4 ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* kleiner Joystick wie beim Atmel Butterfly  ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||&lt;br /&gt;
* statt Radiohm potis bitte Prehostat oder Alphastat 16 63256-026xx ||||| ||||| ||||&lt;br /&gt;
* Drehschalter Serie DS in allen Versionen nur vom Hersteller C&amp;amp;K; auch brückende Versionen anbieten  ||||| |||||&lt;br /&gt;
* bistabile Relais mit 2 Wicklungen ||||| ||||| ||||| &lt;br /&gt;
* passende Touchpanels für die coolen Blue-Line-Grafikdisplays ||||| ||||||&lt;br /&gt;
* mehrpolige Fußschalter, FS 35 bitte bei Druckschalter einordnen ||||&lt;br /&gt;
* möglichst kleine und flache Druckschalter rastend!  |||||&lt;br /&gt;
* iPod-Wheel (Siehe: IC&#039;s=&amp;gt;QT511-ISSG; siehe 360° Soft-Pots - weiter oben) ||||| |&lt;br /&gt;
* Taster Radiohm ST-1034 in rot, grün, gelb, blau, grau und schwarz&lt;br /&gt;
* Leitplastikpotis im Servogehäuse |&lt;br /&gt;
* Relais mit hohen Wirkungsgrad (daher nur geringer Spulenstrom nötig) ||&lt;br /&gt;
* Tastköpfe für Taster9308, wie zb Omron B32-2000 oder B32-2010 |&lt;br /&gt;
* Batteriehalter für 4 Mignonzellen mit Lötfahne (statt Druckknopf)  ||&lt;br /&gt;
* SMD-Schiebeschalter ||||&lt;br /&gt;
* Hohlwellen-Drehgeber (z.&amp;amp;nbsp;B. EC35B-Serie von Alps) ||&lt;br /&gt;
* Taster und Kappen aus der Multimec-Reihe ||&lt;br /&gt;
* Grayhill Series 60A Joysticks mit USB-Adapter |&lt;br /&gt;
* Größere Auswahl an (Stereo-)Schiebepotis in log und lin, insbesondere jenseits 100K |&lt;br /&gt;
&lt;br /&gt;
=== (Steck-) Verbindungen ===&lt;br /&gt;
* Modulare Buchse RJ45 mit Übertrager und LEDs für Ethernet 10/100, z.&amp;amp;nbsp;B. SI-40138 MagJack von BEL-STEWART oder Taimag RJLBC-060TC1 ||||| ||||| ||||| |||||&lt;br /&gt;
* Modulare Buchse RJ45 (&#039;&#039;ohne Übertrager&#039;&#039;) mit LEDs (oder Lichtleiter für SMD-LEDs) ||||| ||&lt;br /&gt;
* Buchsenleisten zum Crimpen (allseitig anreihbar!, 1x1, 1x2, z.&amp;amp;nbsp;B. [http://www.newproduct.molex.com/datasheet.aspx?ProductID=92125 Molex 2081 ?] oder Harwin M20 )  ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||||| ||||| &lt;br /&gt;
* Für die LC-Displays: Adapterplatine mit anschlüssen im Raster 2,54mm (EA 9907-DIP) siehe http://www.lcd-module.de/ ||||| ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* TEXTOOL- bzw. ARIES-Fassungen (Breite 7-15,24mm)/ Nullkraftsockel für kleine Mikrokontroller: DIL-20 ||||| || DIL-28 | PLCC-44 ||||| ||||| ||||| (und andere)&lt;br /&gt;
* Nullkraftsockel für SO- oder TQFP-Gehäuse (z.&amp;amp;nbsp;B. Yamaichi) ||||| ||||| ||||| |||&lt;br /&gt;
* Nullkraftsockel für 6-Pin SOT23 (SOT23-6) z.&amp;amp;nbsp;B. für Programmierung v. PIC10F |||||&lt;br /&gt;
* Nullkraftsockel für DIL20 Gehäuse ||&lt;br /&gt;
* Chipkartenkontaktiereinrichtung, die die Kontakte anhebt (keine Schleifkontakte) ||||| |||| |&lt;br /&gt;
* WOL-Verbindungskabel / Stecker / Print-Connectoren: |||||&lt;br /&gt;
* gängige Platinenverbinder einreihig RM 2mm mit 2-15 Kontakten (in vielen Geräten verwendet, z.&amp;amp;nbsp;B. [http://www.newproduct.molex.com/datasheet.aspx?ProductID=19945 Molex 51004, 53015]): ||||| Molex 71226 |||&lt;br /&gt;
* Floppy Stromversorgungstecker 3,5&amp;quot; Printausführung ||||| |&lt;br /&gt;
* Hochwertigere 1/4&amp;quot; Klinkenbuchsen, z.&amp;amp;nbsp;B. von Rean oder Cliff |||| |&lt;br /&gt;
* mehrpolige, hochwertige Miniatursteckverbinder (z.&amp;amp;nbsp;B. http://www.binder-connector.de/pdfs/serien/711.pdf) ||&lt;br /&gt;
* preiswerte! Hochspannungssteckverbinder &amp;gt;2kV ||||&lt;br /&gt;
* Höherwertige 3,5mm Klinkenbuchsen / -stecker (statt &amp;quot;EBS35&amp;quot; oder &amp;quot;KK(S/M) ..&amp;quot;) ||||| ||| |&lt;br /&gt;
* Ordentliche Lautsprecherbuchsen &amp;quot;Strich-Punkt&amp;quot; (Print oder Wand) (die Stecker sind OK) |&lt;br /&gt;
* Schuko-Einbausteckdose (Maschinensteckdose) (mit oder ohne Klappdeckel); Flanschmaß möglichst klein (50mmx50mm); div. Farben (sw,grau,...) ||||| ||||| |&lt;br /&gt;
* Euro-Einbausteckdose (230V~, gab&#039;s früher mal) ||||| |&lt;br /&gt;
* Carrier-IC-Sockel&lt;br /&gt;
* JST HR Steckverbinder |||&lt;br /&gt;
* Wannenstecker(gerade) + Pfostensteckverbinder 6-Pol. (Pfostenbuchsen gibt es 6-Pol.) ||||| ||||| ||||| ||||| ||||| ||||| |||  ( z.&amp;amp;nbsp;B. Harting SEK 18 Serie http://www.harting.com/en/en/de/sol/verbtech/prod/ios/description/03005/index.de.html)&lt;br /&gt;
* Wannenstecker 2,54mm Raster auch als SMD ||||| ||&lt;br /&gt;
* Günstigere SD/MMC-Steckverbinder z.&amp;amp;nbsp;B.SDBMF-00915B0T2 von MULTICOMP(selbst bei Farnell für 1,80Euro) ||||| |&lt;br /&gt;
* Einpolige Steckerleiste 2.54 ||||| |&lt;br /&gt;
* Foliensteckverbinder (FFC) RM1,25 (z.&amp;amp;nbsp;B. 9pol, 11pol ...) |||||&lt;br /&gt;
* Triaxstecker /-buchse (Coax mit 2.tem Schirm als 3. Kontakt) |&lt;br /&gt;
* vernünftige Koax-Stecker und Kupplungen z. Bsp. von Hirschmann&lt;br /&gt;
* Platinensteckverbinder für Rastermass 2,00mm ||||&lt;br /&gt;
* Molex Steckerreihe Minifit Jr 4,2mm Rastermaß (verwendet als Stromstecker in Computern, Mainboard, PCI-E, P4/EPS ...) |&lt;br /&gt;
* Mini SD Card Connector mit Auswurffunktion für Oberflächenmontage  ||||| |&lt;br /&gt;
* Steckverbinder für PICTIVA OLED Display Folienkabel |||||&lt;br /&gt;
* E10-Schraubsockel, wie sie Glühbiren haben, mit Lötstiften (Achtung es ist nicht die Fassung gemeint) |||| |&lt;br /&gt;
* RP-SMA-Buchse/-Stecker (gewinkelt/gerade) ||&lt;br /&gt;
* WAGO 215-4mm-Stecker (Bananenstecker mit Käfigzugklemme) zur schnellen Montage bei Versuchsaufbauten ||||| ||||| ||||| ||||| |&lt;br /&gt;
* Die PSK-Kontakte in anderen Packungen als 20/10k.100Stk. wäre z.b. gut.1k auch. |||&lt;br /&gt;
* OBD-Stecker. |||&lt;br /&gt;
* Adapterprogramm SMA auf SMB ausbauen |&lt;br /&gt;
* Micro-USB Steckverbinder ||||&lt;br /&gt;
* 2.5mm Stereo Klinkenbuchsen (3-polig) SMD ||&lt;br /&gt;
* BNC-Stecker (wie UG 88U, Lötmontage) aber für RG174-Kabel |||| |&lt;br /&gt;
* U.FL bzw. IPEX Steckbüchsen zum selbskonfektionieren von HF Kabeln ||&lt;br /&gt;
* RJ45-Stecker 90° nach unten oder zur Seite gewinkelt ||&lt;br /&gt;
* Buchsenleisten 2.54mm (z.&amp;amp;nbsp;B. BL 1X...G 2,54) TEILBAR, *zum Auseinanderbrechen* (laut Anfrage vom 26.10.2009 nicht im Sortiment) ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||| |&lt;br /&gt;
* Hohlstecker für Laptops 1,7 x 4,75mm gelb ||&lt;br /&gt;
* Stiftleisten im Rastermaß 1 mm (z.&amp;amp;nbsp;B.: Samtec FTMH-120-03-F-DV-ES) |&lt;br /&gt;
* Cablesharing Adapter 2x RJ45-Buchsen(1x Ethernet 1x ISDN)1xStecker |http://www.btr-netcom.com/Products/upload/ATCH-002661.pdf&lt;br /&gt;
* Stapelleiste AMP 2–0827730–0, 20polig, A 24,2 mm |&lt;br /&gt;
* Buchsenleiste Fischer BL5&lt;br /&gt;
* Polklemmen Hirschmann PKNI 10B (max. 63A ^^), zumindest Schwarz und Weiß |&lt;br /&gt;
* Molex C-Grid SL einreihig 2 bis &amp;gt;6 polig: Stecker, Buchsen, Buchsen-SMD, Crimp-Werkzeug |&lt;br /&gt;
&lt;br /&gt;
=== Kabel etc. ===&lt;br /&gt;
* dünner Schaltdraht (&amp;lt; 1mm Durchmesser, isoliert mit Tefzel oder Kynar)  ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* Flachbandkabel im 2,54mm Raster und dazu passende Aufpressstecker und -buchsen ||||| ||||| ||||| ||||| ||||| |&lt;br /&gt;
* versilberten Kupferdraht auch &amp;lt; 0,6mm und alle Stärken in grösserer VPE (z.&amp;amp;nbsp;B. 500g Rolle) ||||| ||||&lt;br /&gt;
* Flexible Einzellitze, 0,5² in verschiedenen Farben ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* bzw. angebotene Schaltlitze (H05VK) um weitere Farben erweitern! |||&lt;br /&gt;
* das qualitativ mangelhafte 4mm Laborsteckerprogramm rausnehmen und nur noch Hirschmann anbieten  ||||| ||||| ||||| |||&lt;br /&gt;
* Zwillingslitze 2x0.14mm, z.&amp;amp;nbsp;B.  Artikel: ZL214SWW-10M Kessler Elektronik ||||| |&lt;br /&gt;
* Heizdraht zB.: Kanthal A1  |||&lt;br /&gt;
* LYIF Litze (verschiedene Farben) ||||| |&lt;br /&gt;
* dickere Mantel(Feuchtraum)leitungen, z.&amp;amp;nbsp;B. NYM J5x10 |&lt;br /&gt;
* Folienflachkabel (FFC) RM1,25 (z.&amp;amp;nbsp;B. 9pol, 11pol ... /Länge 20cm) ||&lt;br /&gt;
* Flachbandkabel im 1,00mm Raster, passend für Pfostenverbinder PL 2X25G 2,00 . Wird für notebookplatten benötigt. ||||&lt;br /&gt;
*Folienflachkabel (FFC) RM 0,8 (z.&amp;amp;nbsp;B. 30pol. Länge125mm) für 8&amp;quot;TFT Monitor&lt;br /&gt;
* H155 (HF-Kabel) |||||&lt;br /&gt;
* RG214 |&lt;br /&gt;
* Low-Loss Kabel (evtl. aus diesem Programm http://www.elspec.de/hf-kabel-technologie/download-hf-technik/hf-lowloss-kabel.html)&lt;br /&gt;
* Schnepp &amp;quot;Laborkabel&amp;quot; Messleitungen |||&lt;br /&gt;
* Litze, LiY 0,25mm^2, diverse Farben (beispielsweise von Lapp Kabel) |&lt;br /&gt;
* Distanzbolzen mit 2 M2,5 Innengewinden vrsch. Längen |&lt;br /&gt;
* HF-Litze(n) |&lt;br /&gt;
* Flachbandkabel im 1,27 mm Raster, 6-polig |&lt;br /&gt;
&lt;br /&gt;
== Platinen/Prototypen ==&lt;br /&gt;
* SOIC auf PDIP Gehäuse-Adapter zwecks Prototypen-Bau ||||| ||||| ||||| ||||| ||||| ||||| ||||| |&lt;br /&gt;
* Tonerverdichter (www.Huber-Troisdorf.com) ||||| ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* Adapter TQFP (versch. PinZahlen) auf DIL/QIL ||||| ||||| ||||| ||||| ||||| ||||| |&lt;br /&gt;
* Adapter QSOP (versch. PinZahlen) auf DIL/QIL ||||| ||&lt;br /&gt;
* Lötstopplaminat ||||| ||||| ||||| ||||| ||||| ||||&lt;br /&gt;
* www.schmartboard.com hat super einfach zu lötende SMD-Adapter in allen Größen, nur leider keinen Vertriebspartner in Deutschland (doch: ELV). Wie wäre es mit Reichelt? ||||| ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* Cadsoft Eagle ||||| ||&lt;br /&gt;
* Hohlkehlenlötspitzen (Ersa 0832HD) ||||| |&lt;br /&gt;
* Hohlkehlenlötspitzen f. Weller MLR21 ||||| |||||&lt;br /&gt;
* Fotoplatinen, zweiseitig, Hartpapier(!) |||||&lt;br /&gt;
* Entwickler NaOH-Frei von Bungard (SENO 4007 Universalentwickler) |&lt;br /&gt;
* chemisches Zinnbad ||||| ||||| ||&lt;br /&gt;
* Bungard-Fotoplatinen auch in 80x100mm (halbes Euroformat), nicht nur 75x100mm ||||| ||||| |||||&lt;br /&gt;
* Bungard-Fotoplatinen BLAU div. Formate ||||| ||||| |||||&lt;br /&gt;
* Fotoplatinen aus Hartpapier von Markenhersteller |&lt;br /&gt;
* SMD Testplatine (3x3 Felder) wie bei Conrad |&lt;br /&gt;
* Natrium Persulfat 2 kg Packung ||||&lt;br /&gt;
* Steckplatinenen (STECKBOARDS) im 84 x 54 Format (gibts bei Conrad ist da aber viel zu teuer) |&lt;br /&gt;
* Messignblech/Kupferblech 0.1mm (wenn möglich Photobeschichtet) |&lt;br /&gt;
* PCI-Express x1 Laborkarte ( wie RE 430EP) |&lt;br /&gt;
&lt;br /&gt;
== Werkzeug und Zubehör ==&lt;br /&gt;
* robuste Allzweck- und Teppichmesser ||||| |&lt;br /&gt;
* zöllische Gewindeschneider g1/4&amp;quot; und g 1/8&amp;quot; insbesondere interessant für Wasserkühlungen |||||&lt;br /&gt;
* einzelne Hartmetallbohrer in diversen Grössen (z.&amp;amp;nbsp;B. 0,8 1,0 1,3 1,5) ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||| ||&lt;br /&gt;
* Arbeitsschalen zum Entwickeln und Ätzen von Platinen(*) ||||| ||||| |||&lt;br /&gt;
* Gewindebohrer M2 und M2,5 ||||| ||||&lt;br /&gt;
* Konturenfräser/Gravurstichel, etc. zum Fräsen von Platinenprototypen (z.&amp;amp;nbsp;B. Bungard G60N/G30N) ||||| |||&lt;br /&gt;
* Tri-Wing Schraubendreher ||&lt;br /&gt;
* Ballistol Universalöl ||||| &lt;br /&gt;
* ERSA Lötspitzen der Serie 842 (besonders die feinen) Reichelt führt bis jetzt nur 832, die feinen davon sind aber recht unbrauchbar |&lt;br /&gt;
&lt;br /&gt;
== Unsortiert/Unspezifisch ==&lt;br /&gt;
* Kundenkarte so wie bei ELV (Grundgebühr für ein Jahr, keine Versandkosten, evtl kleiner Rabatt) ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* Reichelt Katalog als PDF zum Download ||||| ||||| ||||| |||||| ||||| ||||| ||||| |&lt;br /&gt;
* (durch pdf-download überflüssig:) der Reichelt Katalog auf CD/DVD |||||&lt;br /&gt;
* In Bereichen wie Multimedia etc. (z.&amp;amp;nbsp;B. Spielekonsolen) ein aktuelleres Angebot, und nich wie z.&amp;amp;nbsp;B. bei der PS2 erst wenn schon fast das Nachfolgemodell draussen ist (Multimedia ist hier nur ein Beispiel, einfach mal an der Konkurrenz orientieren (Zum beispiel am grossen C)&lt;br /&gt;
* mehr, aber als solche gekennzeichnete billig-Alternativprodukte, nicht nur High-End ||||&lt;br /&gt;
* Modellbau und Zubehör ||||| ||||| ||||| | (Wird immer mehr, man sieht, Reichelt hört dankenswerterweise auf diese Wishlist!!)&lt;br /&gt;
* mehr SMD Bauteile  ||||| ||||| ||||| ||||| ||||| ||||| |||||  |||||  ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* HCT-Logik in SMD ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |&lt;br /&gt;
* Kleinere SMD-Bauformen (bes. bei ICs) ||||| ||||| |||&lt;br /&gt;
* mehr und v.a. kleine (Hand-) Gehäuse  ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* gleicher Mindestbestellwert in Österreich und in der Schweiz wie in Deutschland ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||||   ||||| ||||| ||||| |||||&lt;br /&gt;
* gleicher Mindestbestellwert in den Niederlanden wie in Deutschland |&lt;br /&gt;
* Kein Mindestbestellwert (ich bezahle eh&#039; Porto) ||||| ||||| |||&lt;br /&gt;
* Filialen in Österreich  und der Schweiz :-) ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||||| |||||| ||||| ||| (man beachte das &amp;quot;:-)&amp;quot;, es gibt auch in D keine &amp;quot;Filialen&amp;quot; - mt)|&lt;br /&gt;
* Versand nach Österreich über GLS oder sonstigen Paketdienst &amp;amp; auf Rechnung, damit die Spesen halbwegs im Rahmen bleiben (bei der letzten Bestellung ca. EUR 40) ||||| ||||| ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* Günstige Versandkonditionen für die EU ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* Selbstabholer-Option bei der Bestellung. Vergisst man es unter &amp;quot;Bemerkung&amp;quot; kommt es per Post :(   ||||  (für Plz 26xxx kommt eine Option für Abholer, Tip: falsche Plz eintragen)&lt;br /&gt;
* Versand von Kleinteilen als Maxibrief, zwecks niedrigerem Versand ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* Option zum anklicken beim Versand, &amp;quot;nichtverfügbare Artikel automatisch streichen&amp;quot;, wenn man das ins Kommentarfeld schreibt wirds nicht beachtet, oder bis das jemand liest dauert es wieder mehrere tage. (In der Zwischenzeit realisiert!!) ||||| ||||| |||||&lt;br /&gt;
* mehr Familien von Logik-ICs, z.&amp;amp;nbsp;B. AC, ACT, LVC (in SMD) ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |&lt;br /&gt;
* LiPoly-Zellen (aufladbare Lithiumakkus &amp;quot;Suppentüten&amp;quot;) ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* Allgemein mehr Sensoren ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* Preiswertere Alu Druckgussgehäuse, wie z.&amp;amp;nbsp;B. von Hammond Manufacturing ||||| ||||| |||||&lt;br /&gt;
* nicht wie die Konkurrenz jetzt schon im April den Juli-Katalog rausbringen ||||| ||||| |||||&lt;br /&gt;
* Neuere, bessere NiMh Akkus (z.b. GP1100 2/3A, GP2000 AF, GP2200 4/5SubC) ||||| ||||| |&lt;br /&gt;
* Funk-Entstördrosseln 16A, div. Werte ||||| |&lt;br /&gt;
* Taster, Schalter und LED-Fassungen aus der Mentor FEL-Reihe ||&lt;br /&gt;
* Lötfähige (SMD-) Kühlkörper (Fischer) ||||| ||||| ||||| |&lt;br /&gt;
* Toner für Laserdrucker Kyocera FS-1010 TK17 |||||  ist ja eigentlich der gängigste Kyocera Toner&lt;br /&gt;
* Toner für Kyocera FS800-S |&lt;br /&gt;
* Microchip PICkit 2 ||||| |||&lt;br /&gt;
* Microchip PICkit 2 (PG164120) ohne Demoplatine |&lt;br /&gt;
* Möglichkeit für Selbstabholen eine Bestellung unter 10Euro abzuliefern.  |&lt;br /&gt;
* Bessere Auswahl: statt MSP430F147, F148, F149 wenigstens einen mit DAC -&amp;gt; MSP430F16x&lt;br /&gt;
* Cypress PSoC Mikrocontroller |||| |||| |||| |||| |&lt;br /&gt;
* Günstigere Oszilloskope z.&amp;amp;nbsp;B. Multimetrix oder Grundig ||||| |||||&lt;br /&gt;
* Digitale Speicherosziloskope für PC ||||| ||||| ||&lt;br /&gt;
* Sortieren und Spezifizieren der Angebotsliste in Transistoren / FET (bessere Übersicht) ||||| ||||| ||||| ||| z.&amp;amp;nbsp;B. 400V/6A würde schonmal ganz grob helfen und senkt außerdem unnötigen Traffic weil nicht extra jedes Datenblatt angeschaut wird&lt;br /&gt;
* Vorschaltgeräte mit G23 Fassung (zum Bau von UV-Belichtern geeigent)|||&lt;br /&gt;
* Speicherkarten-Adapter von SD auf CF (bzw. CFII) ||||&lt;br /&gt;
* ein Abendessen mit Angela :-) (hier dürfte wohl Angelika gemeint sein) ||| bzw. mit der Blondine von der Katalogseite mit den Servicenummern |&lt;br /&gt;
* USB-Leergehäuse (z.&amp;amp;nbsp;B. wie USB-Stick, WLAN-Dongle, o.ä.) ||||| ||||| ||||&lt;br /&gt;
* Nicht so viele Tackerklammern/Gummibänder/Tesafilm/Beutel in die Verpackungstüten machen, das nervt beim Auspacken (die kaputten Tüten kann dann auch keiner mehr brauchen, die wenigen nicht kaputt getackerten hebe ich aber gerne auf! Aber bitte weiterhin alles getrennt verpacken... oder wenigstens nicht den Zip-Verschluss tackern) ||||| ||||| ||||| ||||| ||||| ||||| ||||| |&lt;br /&gt;
* Reflektoren für 10mm LEDs ||&lt;br /&gt;
* Beamer Casio YC-400|&lt;br /&gt;
* OBD2 Kabel auf RJ45 Stecker ||&lt;br /&gt;
* mehr Verpackungsmaterial z.&amp;amp;nbsp;B. kleine Schachteln oder die Plastik IC-&amp;quot;Schienen&amp;quot; einzeln (und unzerschnitten) verkaufen |||||&lt;br /&gt;
* PCMCIA Wlan-Karten (Linux kompatibel) mit externem Antennenanschluss |&lt;br /&gt;
* Warenkorb immer in gleicher Reihenfolge sortiert, nicht bei jedem Aufruf anders ||||| ||&lt;br /&gt;
* PIC_BASIC_II || Programm mit HardwareKey [z.&amp;amp;nbsp;B. für Azubi&#039;s]&lt;br /&gt;
* Reichelt T-Shirt ||||| |||&lt;br /&gt;
* Pakete nach Österreich in EINER Lieferung schicken, und nicht aus &amp;quot;logistischen Gründen&amp;quot; trennen. Würde zumindest die Hälfte der Verandkosten sparen (letztes mal fast 70€ pro Paket (!) ||&lt;br /&gt;
* Reichelt-Gutscheine sollten bei Online-Bestellung einlösbar sein (wie bei z.&amp;amp;nbsp;B. Amazon) ||||| ||&lt;br /&gt;
&lt;br /&gt;
==Messgeräte==&lt;br /&gt;
* FS300 Messgerät Antennenanalyzer Massenpreis 50000 Stück &amp;lt;br&amp;gt;&lt;br /&gt;
* Smart Tweezer (SMD-Pinzette mit Komponentenmessung) siehe [http://www.trgcomponents.de/TrgDE/Internet/ProductShow.aspx?ItemID=680&amp;amp;CategoryID=2426] ||&lt;br /&gt;
* Hameg HM2008 Oziloscope || ( ist möglich über Service -&amp;gt; Produktservice -&amp;gt; neue Artikel anfragen)&lt;br /&gt;
*Tektronix TDS Series Osziloskope |||&lt;br /&gt;
&lt;br /&gt;
= Bereits im Sortiment =&lt;br /&gt;
&lt;br /&gt;
* Laser-Folien für die Druckformerstellung(Zweckform 3491) ||||| ||||| ||||| ||||| ||||| ||||&lt;br /&gt;
* Atmel AT91SAM7S32 ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||  (=&amp;gt; Best.: AT 91SAM7S64-AU)&lt;br /&gt;
* Atmel AT91R40008 (32bit controller 256KB-RAM 100-lead TQFP) ||||| ||||| |  (=&amp;gt; Best.: AT 91R40008)&lt;br /&gt;
* LCD: auch ein- und dreizeilige Variante der DOG-Serie (EA DOGM081 &amp;amp; 163) |||||&lt;br /&gt;
* Platinen Basismaterial, einseitig Cu-beschichtet, 0,5..1 mm dick ||||| ||||| ||| --&amp;gt;0,8mm: BEL 160x100-1-8&lt;br /&gt;
* Atmel ATtiny45 ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| =&amp;gt; ATTINY 45-20PU, ATTINY 45-20SU, ATTINY 45V-10PU, ATTINY 45V-10SU&lt;br /&gt;
* Atmel ATMEGA48 TQFP ||||| |||| =&amp;gt; ATMEGA 48-20 AU&lt;br /&gt;
* Atmel ATMEGA 88 || =&amp;gt; ATMEGA 88-20 AU, ATMEGA 88-20 PU, ATMEGA 88V-10 AU, ATMEGA 88V-10 PU&lt;br /&gt;
* Atmel ATMEGA644 ||||| ||||| ||||| ||||| =&amp;gt; ATMEGA 644-20 AU, ATMEGA 644-20 PU, ATMEGA 644V-10AU, ATMEGA 644V-10MU, ATMEGA 644V-10PU&lt;br /&gt;
* Atmel ATMEGA2560 ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| || =&amp;gt; ATMEGA 2560-16AU, ATMEGA 2560V-8AU&lt;br /&gt;
* Atmel ATMEGA2561 ||||| | =&amp;gt; ATMEGA 2561-16AU, ATMEGA 2561V-8AU&lt;br /&gt;
* Philips LPC2000-Serie ARM7-Controller (LPC214x, LPC213X, LPC21xx und LPC22xx) |||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| | =&amp;gt; Bauelemente, aktiv / Controller, Speicher / Controller, Prozessoren / Philips-Controller 80C51 / 87LPC.. / 89C51&lt;br /&gt;
* TI MSP430F2xxx (Typen mit 16 MIPS) ||||| ||||| | =&amp;gt; Bauelemente, aktiv / Controller, Speicher / Controller, Prozessoren / Texas MSP430 Controller&lt;br /&gt;
* Breadboards/&amp;quot;Steckbretter&amp;quot; ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||||| ||||| ||||| ||||| |||||| ||||| ||||| ||||| ||||| ||||| ||| =&amp;gt; STECKBOARD 1K2V, STECKBOARD 2K1V, STECKBOARD 2K4V, STECKBOARD 3K5V, STECKBOARD 4K7V (zu finden unter &#039;Diverses/Spielwaren&#039; :)&lt;br /&gt;
* RS485 ESD fest: MAX3086E oder 75180 oder ISL83086E ||||| || =&amp;gt;MAX485ECPA &lt;br /&gt;
* Microchip PIC 18F2550  || =&amp;gt; PIC 18F2550-I/P&lt;br /&gt;
* Microchip PIC 16F88  |||| || =&amp;gt; PIC 16F88-I/P&lt;br /&gt;
* Microchip dsPIC ||||| ||||| ||||| ||||| | =&amp;gt; PIC 30F2010-30 SP/SO&lt;br /&gt;
* Logicanalyzer | =&amp;gt; ME ANT 8 und ME ANT 16&lt;br /&gt;
* Atmel ATMEGA8 TQFP |||| =&amp;gt; ATMEGA 8-16 TQ&lt;br /&gt;
* 3,3V Laengsregler (LT1086-Serie z.&amp;amp;nbsp;B.)  ||||| =&amp;gt; vgl z.&amp;amp;nbsp;B. [http://reichelt.de/?ARTIKEL=LT%201086%20CM3%2C3 LT 1086 CM3,3] (SMD) oder [http://reichelt.de/?ARTIKEL=LT%201086%20CT3%2C3 LT 1086 CT3,3] (TO-220) bei Reichelt&lt;br /&gt;
* Flexible Messleitungen: Wie gesagt Reichelt bietet ja die ganze Palette an Bananen/Laborsteckern, Krokodilklemmen usw. an, nur die Leitungen dazu fehlen im Programm.  (Sind schon im Sortiment. Fertig konfektionierte z.&amp;amp;nbsp;B.: ML 100 SW, Meterware z.&amp;amp;nbsp;B.: MESSLEITUNG 10SW)&lt;br /&gt;
* FTDI USB Chips  ||||| ||||| ||||| ||||| ||||| ||| =&amp;gt; Best-Nr. FT232BL, FT232RL (sehr interessant), FT245BM und FT2232BM (2xUART auf USB)(noch nicht unter USB einsortiert)&lt;br /&gt;
* CAN-Bus Controller MCP2515  |||||&lt;br /&gt;
* VLSI MP3 Decoder  ||||| ||||| ||||| | z.Zt. unter CAN-Bus(!) einsortiert. Bitte auch die neuen Gehäuse (ROHS) und Typen mit ins Angebot nehmen.&lt;br /&gt;
* Atmel AT90CAN128 ||||| |&lt;br /&gt;
* MMC / SDC slot  ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ==&amp;gt; Bestell-Nr.: CONNECTOR MMC 11, CONNECTOR MMC 12, CONNECTOR SD 21 und CONNECTOR SD 22&lt;br /&gt;
* lineare Potentiometer als Schiebepoti ||||| | - Bestell-Nr. PSM-LIN* (&amp;quot;mono&amp;quot;) PSS-LIN* (&amp;quot;stereo&amp;quot;)&lt;br /&gt;
* Echtzeituhr DALAS DS1307 (auch SMD) ||||||| - Bestell-Nr. DS1307/DS1307Z&lt;br /&gt;
* Konkret: Neuer PIC ... und PIC18F2550 ||||| ||| &lt;br /&gt;
* MSP430F1232 |&lt;br /&gt;
* Fädelstift, Draht und Kämme ||||| || - Bestell-Nr. Fädelstift/Fädeldraht/Fädelkamm (Warum sind diese Stifte ùnd der Draht nur so &amp;quot;erschreckend&amp;quot; teuer? =&amp;gt; immerhin billiger als bei C...) (vielleicht weil jeder die nur 1x kauft und dann mit Draht aus anderen Quellen selber neu bewickelt?? ;-)&lt;br /&gt;
* Mini-GPS-Module ||||| ||||| ||||| ||||| ||| - Bestell-Nr. GPS ET 102/GPS ET 202/GPS EM 401&lt;br /&gt;
* Atmel ATmega48, ATmega168, ATtiny13 ||||| ||||| ||||| | (im neuen katalog und online verfügbar!)&lt;br /&gt;
* CompactFlash Stecker ||||| ||||| ||||| || - Bestell-Nr. connector CF 01/ Connector CF 02 &lt;br /&gt;
* DCF77 Empfangsmodule  ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| (DCF77 Modul) (4.5.2005 ist jetzt verfügbar unter DCF77 MODUL, aber leider 50% teurer als bei der Konkurenz, störempfindlicher, grotesk schwache Ausgangstreiber)&lt;br /&gt;
* Microchip PIC 12F683 (8pin PIC mit PWM !) =&amp;gt; Bereits im Sortiment: Best. Nr PIC 12F683-I/P bzw. PIC 12F683-I/SN &lt;br /&gt;
* MSP430F135 ||||| ||||| | |||||  (MSP430F135 im Programm Bestellnr.: MSP430F135 IPM)&lt;br /&gt;
* SMD 0 Ohm in Bauform 0805 |||| -&amp;gt; SMD-0805 0,00&lt;br /&gt;
* Shunt-Widerstände  ||||| ||||| ||||| ||||| |  (neu im Sortiment: Widerstandsdraht, Best.-Nr. &amp;quot;RD100/x,xx&amp;quot;, Leider nur in teuren 100g Spulen)&lt;br /&gt;
* dünner isolierter Draht, wie Klingeldraht nur dünner, vielleicht 0.2-0.3mm zum Fädeln von Platinen |||| =&amp;gt; Fädeldraht nun im Sortiment&lt;br /&gt;
* dünner Silberdraht zur Verdrahtung auf Lochrasterplatinen ||||| |   (mögl. bereits im Sortiment &amp;quot;SILBER 0,6MM&amp;quot; ???)Kupferlackdraht geht nicht?&lt;br /&gt;
* Hartmetallbohrer in mehr verschiedenen Größen (z.&amp;amp;nbsp;B. 0,6mm 0,8mm 1,1mm 1,2mm etc.) ||||| |||| =&amp;gt; Gibt es beides Bestellnummern: &amp;quot;Bohrerset&amp;quot; oder für einzelne Bohrer &amp;quot;Bohrer + Größe in mm&amp;quot; Bsp: &amp;quot;Bohrer 0,6&amp;quot; =&amp;gt; die kosten aber einiges, eine etwas preiswertere Alternative wäre auch nicht schlecht...&lt;br /&gt;
* 68HC908GP32 |&lt;br /&gt;
* überhaupt: Freescale 68HC908- und vor allem 68HCS08-Mikrocontroller fehlen total im Sortiment!&lt;br /&gt;
* RJ45-Buchse ||| - schon im Sortiment: MEBP 8-8&#039;&#039;x&#039;&#039; unter Modular-Stecker bei TK&lt;br /&gt;
* Elektromotoren ||||| |||| (Suche: Gleichstommotor)&lt;br /&gt;
* Microchip ICD2 || =&amp;gt; Bestell-Nr.: DV 164005 &amp;lt;= Fehlt im Papierkatalog&lt;br /&gt;
* 14,7456 MHz Quarze ||||| ||||| ||||| ||||| ||| (Bst: 14,7456-HC18)&lt;br /&gt;
* SMD Widerstande in Bauform 1206 (SMD 1/4W...)&lt;br /&gt;
* Atmel Atmega 128 in TQFP || (ATMEGA 128-16 TQ)&lt;br /&gt;
* Atmel Atmega 169 in TQFP || (ATMEGA 169-16 TQ)&lt;br /&gt;
* Atmel ATMEGA1280 ||||| ||||| ||||| |||| (ATMEGA 1280-16AU, ATMEGA 1280V-8AU)&lt;br /&gt;
* Atmel ATMEGA8515 | (ATMEGA 8515-*)&lt;br /&gt;
* Atmel ATtiny24/44 ||||| ||||| (ATTINY 24-*, ATTINY 44-*)&lt;br /&gt;
* Atmel ATtiny25/85 ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| | (ATTINY-25-*, ATTINY-85-* gelistet aber erst verfuegbar ab II/07)&lt;br /&gt;
* Atmel AT91SAM7S64, AT91SAM7S256 ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||| (suche AT91*)&lt;br /&gt;
* Atmel AT91SAM7X64-256 ||||| ||| (suche AT91*)&lt;br /&gt;
* TI MSP430F1611 (10k RAM, 48k Flash) ||||| ||||| ||||| ||||| ||||| ||||| || (MSP430F1611 IPM)&lt;br /&gt;
* PCA9306  Dual Bi-Directional I2C-Bus and SMBus Voltage Level-Translator ||&lt;br /&gt;
* PCA9531D  8Bit I2C_BUS LED-Dimmer ||||| |||||&lt;br /&gt;
* PCA9551D  8Bit I2C-BUS LED-Blinker ||||| ||||&lt;br /&gt;
* PCA9530D  2Bit I2C_BUS LED-Dimmer ||||| |&lt;br /&gt;
* PCA9532D 16Bit I2C_BUS LED-Dimmer ||||| |||||&lt;br /&gt;
* PCA9533D  4Bit I2C_BUS LED-Dimmer ||||| ||||&lt;br /&gt;
* PCA9550D  2Bit I2C-BUS LED-Blinker ||||| |&lt;br /&gt;
* PCA9553D  4Bit I2C-BUS LED-Blinker ||||| ||&lt;br /&gt;
* PCA9552D 16Bit I2C-BUS LED-Blinker ||||| |||&lt;br /&gt;
* Microchip PIC 18F2550 (USB, 32 KBytes Flash) | (bereits im Sortiment)&lt;br /&gt;
* Microchip PIC 16F628A (weil: besser als 16F628) ||||&lt;br /&gt;
* Microchip PIC 16F648 (weil mehr Programmspeicher, als 16F628) |||||&lt;br /&gt;
* Microchip PIC 16F684 ||||| &lt;br /&gt;
* Microchip PIC 16F688 ||||| ||&lt;br /&gt;
* Microchip PIC 16F690 ||||| ||||| |||&lt;br /&gt;
* Atmel ATtiny84 ||||| ||||| |||| (gelistet aber erst verfuegbar ab II/07)&lt;br /&gt;
* TI MSP430F169 |&lt;br /&gt;
* FT245RL (alt bekannte FTDI Chips in neuer und besserer Version, FT232RL bereits vorhanden) ||||| ||&lt;br /&gt;
* 3,3V Längsregler SMD Ultra Low drop |||| (-&amp;gt; Zetex)&lt;br /&gt;
* Schiebepotis mit passenden Knöpfen | (Bestell-Nr. PSM-LIN* (&amp;quot;mono&amp;quot;) PSS-LIN* (&amp;quot;stereo&amp;quot;) nicht passed?) |&lt;br /&gt;
* OLED-Displays (zum Beispiel: [http://www.litearray.com/products-oled.php]) || (Reichelt hat jetzt Osram Pictiva Oleds im Programm. Nach &amp;quot;Pictiva&amp;quot; suchen)&lt;br /&gt;
* OSRAM &amp;quot;Golden Dragon&amp;quot; LEDs (http://www.osram-os.com/goldendragon) ||||&lt;br /&gt;
* Microcontroller mit USB-Anschluss (von Cypress oder Atmel in PDIP z.&amp;amp;nbsp;B. AT89C5131, AT43USB355, CY7C637xx) ||||| ||||| ||||| ||||| |||||  -&amp;gt;Bereits im Sortiment: Cypress EZ-USB TQFP-44 Best. Nr AN2131 SC, Atmel AT89C5131 SO-28/PLCC-52&lt;br /&gt;
* Renesas R8C &lt;br /&gt;
* zu Schaltreglern LM257x u.a. passende Speicherspulen mit hohem L , niedrigem R und großer Strombelastbarkeit (zB. Würth WE-PD4) (keine &amp;quot;Entstörspulen&amp;quot;) |||||  |||||  |||||  ||||| |||||  ||||| |||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| || (suche L-PIS*)&lt;br /&gt;
* IL300 (linear Optokoppler z.&amp;amp;nbsp;B. von Vishay egal ob DIP oder SMD) ||||| ||||&lt;br /&gt;
* IL300H (linear Optokoppler von Siemens als DIP) - andere IL300 Varianten im Programm |||&lt;br /&gt;
* &amp;quot;optische&amp;quot; Drehgeber Fabrikat Grayhill sind lieferbar (Bst. ENC 62P22-*)&lt;br /&gt;
* mechanische Drehimpulsgeber von Alps im Programm (suche STEC*)&lt;br /&gt;
** Drehimpulsgeber (konkreter Vorschlag von O.R.: PEC16-4220F-S0024 von Bourns)  ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||&lt;br /&gt;
** Drehimpulsgeber- weiterer Vorschlag: ALPS Encoder ST EC 11B  ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||| Im Programm (STEC11B01)&lt;br /&gt;
* PCA9633D16 4-bit I2C-bus LED driver ||&lt;br /&gt;
* I²C-Bus to 1-Wire DALLAS DS2482-100 bzw. DS2482-800  ||||| ||||| ||||| ||||| ||||| ||||&lt;br /&gt;
* Step-Down-Konverter in SMD Bauform (z.b. MC 34063): ||||| (-&amp;gt;Artikel-Nr: MC 34063 AD)&lt;br /&gt;
* Preiswerte Kontaktierungen für SD/MMC  ||| (Bereits im Programm: Bestell-Nummern:  CONNECTOR MMC 11 / CONNECTOR MMC 12 / CONNECTOR SD 21 / CONNECTOR SD 22) // ~9 EUR sind wohl kaum preiswert!&lt;br /&gt;
* Eisen(III)-Chlorid  ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* EA DOG-M128 128x64 Grafikdisplay aufbau ähnlich EA DOGM162 |||||&lt;br /&gt;
* 3,3V-Längsregler SMD zu vernünfitgen Preisen (Bsp: LF33 --&amp;gt; Best.Nr.: LF 33 CV, Preis: 0,76&amp;amp;#8364;)(der LT1086 kostet 4 Euro) ||||| ||||| ||||| ||||| ||||| 	||||| ||||| ||||| || -&amp;gt; LT1117 CST-3.3V für 1.55 €&lt;br /&gt;
* Spannungsregler in SMD-Version (7805 etc., nicht nur der 78L05) ||||| ||||| ||||| ||||| ||||| ||||| ||| -&amp;gt; LT1117-ADJ für 1.55€&lt;br /&gt;
* TSic Temperatursensoren von ZMD ||| -&amp;gt; TSIC&lt;br /&gt;
* Leiterplattenbuchse Hirschmann 4mm auch in *rot* (gab es schonmal als &amp;quot;PB 4 RT) || -&amp;gt; wieder als PB 4 RT erhältlich, letzte Woche 3 Stück geliefert bekommen; Stückpreis 1,25€&lt;br /&gt;
* MCP25050 CAN-Bus Input/Output Expander ||||| |||| (MCP 25050-I/*)&lt;br /&gt;
* Ethernet-Controller RTL8019AS ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| || (erhältlich: RTL 8019AS)&lt;br /&gt;
* SPI-Ethernet-Controller ENC28J60 (erhältlich: ENC 28J60-I/*)&lt;br /&gt;
* &#039;&#039;&#039;Grundton&#039;&#039;&#039;-Quarz (25,0000 MHz Grundton, erhältlich) ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||| (wirklich erhältlich? Als Keramik-SMD-Quarz, 25.0MHz, 25,000000-MJ)&lt;br /&gt;
* Microchip PIC 18F4550 (PIC mit USB) ||||| ||||| ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* Microchip PIC 18F2585 ||||&lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
&lt;br /&gt;
== zur Webseite ==&lt;br /&gt;
&lt;br /&gt;
In &amp;quot;Neu in unserem Shop&amp;quot;/Neue Artikel werden unter Bauelemente u.a. Computerkabel und PC-Speicher angezeigt (Anlass Stand 5/2010, ist aber schon früher aufgefallen). Diese Teile würden zumindest etwas besser in PC-Technik passen. (...und die Freude des Elektronikbastlers über eine Anzahl neuer Bauelemente würde auch nach Auswahl der Details anhalten, wenn es nicht &amp;quot;nur&amp;quot; so etwas wie USB-Kabel sind.)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
myReichelt ermöglicht: &lt;br /&gt;
* Warenkorbspeicherung&lt;br /&gt;
* öffentlicher Warenkorb&lt;br /&gt;
* CSV-Import, -Export&lt;br /&gt;
&lt;br /&gt;
zu myReichelt siehe auch http://www.mikrocontroller.net/topic/62628&lt;br /&gt;
&lt;br /&gt;
Eine Webseite ohne Frames ist eigentlich heute Stand der Technik. Oder vielleicht ist es das auch nicht mehr - ich weiss es nicht aber nach meiner Auffassung sollte es Stand der Technik sein. Denn dann hat man für jedes Produkt auch einen eindeutigen Link und kann ggf. auch in Beiträgen, Mails und Anfragen darauf verlinken.&lt;br /&gt;
&lt;br /&gt;
Anmerkung dazu:&lt;br /&gt;
Verlinken auf Artikel geht schon, und zwar in der Form:&lt;br /&gt;
http://www.reichelt.de/?ARTIKEL=ATMEGA%208-16%20DIP&lt;br /&gt;
bzw.&lt;br /&gt;
http://www.reichelt.de/index.html?ARTIKEL=ATMEGA%208-16%20DIP&lt;br /&gt;
&lt;br /&gt;
Neu zu lesen unter &amp;quot;Info zum Shop&amp;quot;:&lt;br /&gt;
Zitat:&lt;br /&gt;
&amp;quot;Frames&lt;br /&gt;
In vielen Votings wurden wir auf die Verwendung von Frames hingewiesen und dass diese Technik nicht mehr -State Of The Art- sei. Dieser Meinung schliessen wir uns in vollem Umfang an. In unserem neuen Shop werden KEINE FRAMES verwendet.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Reichelt selbst macht das in seinen PDF-Prospekten auch so. Das Problem liegt nur darin, die URL jedesmal von Hand zusammenzubauen (und dabei auf die Ersetzung der Leerzeichen durch %20 zu achten) oder von einer kopierten URL alles überflüssige zu entfernen.&lt;br /&gt;
&lt;br /&gt;
Einfach mal einen &amp;quot;Permalink&amp;quot; button neben &amp;quot;Artikel empfehlen&amp;quot; ? Oder zurück mit der früheren Druckansicht.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Viele Browser ersetzen Leerzeichen im Adressfeld automatisch durch %20. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Ferner sollte es möglich sein, Bestellungen, welche noch nicht bearbeitet werden zu verändern, also z.&amp;amp;nbsp;B. was hinzuzufügen oder zu entfernen. Bei einer Wartezeit von ca. 3 Tagen bis zum Versand fällt einem doch noch was ein :-)&lt;br /&gt;
&lt;br /&gt;
Das wird bereits gemacht! Einfach E-Mail an service@reichelt.de mit den Bauteilen, die man noch haben will. I-Net-Nummer nicht vergessen.&lt;br /&gt;
&lt;br /&gt;
Andere Möglichkeit ist anrufen, das mache ich eh immer, um eventuell nicht lieferbare Dinge zu streichen oder zu ersetzen. Geht immer, es sei denn Lieferung wird schon verpackt.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Shopprogramm: Wäre es nicht komfortabel, ein Programm auf dem heimischen Rechner zu haben, welches das aktuelle Sortiment mit den aktuellen Preisen führt, wo dann auch offline Bestellungen zusammengestellt und hochgeladen werden können? So ließen sich die Merklisten auch besser verwalten.&lt;br /&gt;
&lt;br /&gt;
Ja, das fände ich auch sehr toll, sollte man mal drüber nachdenken.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Passwortschutz: Die derzeitige Lösung der Anmeldung im Shop ist für den heutigen Stand der Dinge recht unsicher. Ein zur Kundennummer gehörendes Passwort sollte schon sein. Was soll schon passieren, die Versandadresse ist ja bekannt, und wenn jemand anderes auf meinen Namen bestellt. lässt er sich über die Versandadresse herrausfinden, außerdem weiß ja auch nicht jeder meine Kundennummer.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Eine Art Lagerbestand im Onlineshop wäre sinnvoll. Es ist mehr als ärgerlich, wenn bei einer Bestellung z.&amp;amp;nbsp;B. Kleinteile wie Kondensatoren oder Schalter fehlen, weil sie nicht auf Lager waren. Dabei gibt es gerade bei solchen Teilen genug Alternativen, sei es Farbe, Bauart oder Wert, auf die man umsteigen könnte, damit die Bestellung vollständig ist. Es würde ja vollkommen ausreichen den Bestand in Form einer Ampel, wie bei anderen Shops, mit grün, gelb und rot zu realisieren.&lt;br /&gt;
&lt;br /&gt;
Im Warenkorb werden Artikel, die nicht auf Lager sind, mittlerweile auch so gekennzeichnet.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Früher würden neue Artikel mit einem gelben &amp;quot;NEU&amp;quot; gekennzeichnet, jetzt ist das nicht mehr so. Hätte gerne wieder einen Überblick was neu hinzugekommen ist ohne jede Artikelgruppe aufrufen zu müssen.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Nummerierung der Bauteile: Warum wird der Warenkorb nicht nummeriert. Ich hasse es wenn ich manuell mit Hand zählen muss! Das ist auch nervig wenn man manuell per Hand vergleichen will!!&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Virtuelle Bauteilekisten (vbox): Wer bei Reichelt bestellt ordert oft viele viele Kleinteile. Wenn man nun ein Gerät zum wiederholten mal baut, muss man alle Teile erneut eingeben. Könnte ich nun neben dem Warenkorb auch noch virtuelle Bauteilekisten füllen würde das neue Bestellungen sehr beschleunigen. Der Kunde als Wiederholungstäter sozusagen.&lt;br /&gt;
&lt;br /&gt;
Konkret:&lt;br /&gt;
Ich habe vier verschiedene Elektronikprojekte entwickelt.Für jedes dieser Projekte lege ich bei Reichelt.de eine virtuelle Bauteilekiste mit eigenem Namen an. Die Zusammenstellung der Artikel funktioniert wie beim normalen Warenkorb. Wenn ich nun ein Projekt erneut bauen möchte, kopiere ich einfach den Inhalt der virtuellen Bauteilekiste per Knopfdruck in meinen Warenkorb. Wenn ich Projekt2 also dreimal nachbauen möchte kopiere ich die virtuelle Bauteilebox &amp;quot;Projekt2&amp;quot; dreifach in den Warenkorb.&lt;br /&gt;
Schön wäre es auch die virtuellen Bauteilekisten mit Schaltplan und ev. Eagle  - Dateien veröffentlichen zu können.&lt;br /&gt;
&lt;br /&gt;
Und wieso ist der Login, den es früher mal gab weg? Da konnte man zumindest den aktuellen Warenkorb speichern soweit ich mich erinnern kann, aber seit der neuen Website gibt&#039;s den Login nicht mehr. Ausserdem muss ich jetzt jedesmal meine Kundennummer rauskramen um meine Bestellung abzusenden - Conrad löst das beispielsweise besser. (dafür haben die aber auch ne besch...eidene Suchfunktion und nen unübersichtlichen Shop)&lt;br /&gt;
&lt;br /&gt;
Nebenanregung:&lt;br /&gt;
Damit die &amp;quot;Bauteilekisten&amp;quot; nicht unmengen Platz beim Anbieter verschwenden könnte man diese auslagern.&lt;br /&gt;
Also Nach erstellen Download als einfaches File und bei Bedarf einfach bei Bestellung übertragen.&lt;br /&gt;
So könnte sie jeder in Ruhe offline vorbereiten und verwalten.&lt;br /&gt;
&lt;br /&gt;
IDEE: Offenlegung der Datenbank: Offenlegung der Datenbank oder zumindest Export für die User. Somit koennten die Datenbank in eine Art Datenbank gespeichert werden. Als Katalogprogramm koennte dann soetwas ähnliches wie das von Segor zum Einsatz kommen. Gibt es einen Standard dann koennten  Reichelt, Conrad, Segor, etc. mit einem Programm genutzt und verglichen werden:&lt;br /&gt;
siehe auch http://www.mikrocontroller.net/forum/read-7-363596.html&lt;br /&gt;
Programmierunterstuetzung findet sich bestimmt. Abgesehen davon haben die Distributoren den Vorteil die Katalogdaten übers Internet upzudaten.&lt;br /&gt;
&lt;br /&gt;
Zum offenlegen der Datenbank: Wie wäre es mit einem Webservice, mit dem man über SOAP auf die Datenbank zugreifen kann? Ähnlich wie bei Amazon oder auch Google.&lt;br /&gt;
&lt;br /&gt;
Lösung in HTML:&amp;lt;br/&amp;gt;&lt;br /&gt;
Ich hatte für das Projekt [http://www.mikrocontroller.net/topic/82127 &amp;quot;Webserver ATmega32/644DIP ENC28J60&amp;quot;] ein Bestellformular ([http://www.mikrocontroller.net/attachment/29451/reichelt.htm reichelt.htm] &amp;lt;span style=&amp;quot;font-size: 0.8em;&amp;quot;&amp;gt;[Version vom 22.12.2007]&amp;lt;/span&amp;gt;) gebastelt um schnell alle nötigen teile in den Reichelt – Warenkorb zulegen. Mit etwas HTML-Kenntnis dürfte eine Anpassung nicht das Problem darstellen.&amp;lt;br/&amp;gt;&lt;br /&gt;
In JavaScript, des &#039;&#039;&#039;reichelt.htm&#039;&#039;&#039; Bestellformulars, die Funktion &amp;lt;code&amp;gt;&#039;&#039;&#039;send()&#039;&#039;&#039; &#039;&#039;Zeile 42:&#039;&#039; var maxElements = 40;&amp;lt;/code&amp;gt; die &#039;&#039;&#039;40&#039;&#039;&#039; durch die Anzahl der unterschiedlichen Bauteile Anpassen.&lt;br /&gt;
&lt;br /&gt;
== zu Artikeln ==&lt;br /&gt;
&lt;br /&gt;
* Kupferlackdraht: Auf der Website sind Plastikspulen abgebildet, geliefert wird jedoch seit Jahren schon lose aufgewickelter Draht, der so schlecht zu verarbeiten ist. Bitte ändern! Am besten vernünftigen Draht auf Spulen, zumindest aber das Bild anpassen.&lt;br /&gt;
&lt;br /&gt;
* Spitze fände ich eine verbesserte Suche für Gehäuse. Oft stehe ich vor dem Problem, meine Baugruppe ist so-und-so groß und ich brauche ein Gehäuse, in das diese Baugruppe hineinpasst. Zur Zeit muss ich mich manuell durch alle Gehäusegrößen &amp;quot;durchwühlen&amp;quot;, bis ich ein passendes gefunden habe. Die Suche stelle ich mir so vor: Ich gebe die Maße ein, die das Gehäuse mindestens haben &#039;&#039;muss&#039;&#039;, und bekomme alle Gehäuse angezeigt, die genau so groß oder etwas größer sind als meine Vorgaben.&lt;br /&gt;
&lt;br /&gt;
== Abwicklung ==&lt;br /&gt;
&lt;br /&gt;
* Sammelbestellung: Wenn ich etwas bei Reichelt bestelle, bestelle ich für meine Kollegen auch immer etwas mit. Wenn dann das Päckchen kommt, heisst es sortieren. Wer hatte von was, wie viel? Danach kommt das rechnen dran. Ein besonderes Highlight, sind die Nettopreise. Und auch das Verteilen der Versandkosten ist nicht ohne. Währe es nicht möglich, im Bestellvorgang eine Zuordnung zu Personen oder Projekten zu realisieren, und die Zwischensummen der Personen oder Projekte auf der Rechnung oder per Mail anzugeben. Ein Schmankerl wäre die Angabe der Bruttopreise inklusive der anteiligen Versandkosten.&lt;br /&gt;
** Wahrscheinlich nicht möglich, siehe AGB-Klausel zu Massenbestellungen. &amp;quot;Garantieberechtigt&amp;quot; ist auch immer nur der ursprüngliche Besteller.&lt;br /&gt;
** Welche Klausel? Mir fällt nur 13.3 ins Auge...&lt;br /&gt;
&lt;br /&gt;
== zu dieser Wunschliste ==&lt;br /&gt;
&lt;br /&gt;
(gehört eigentlich in Diskussion)&lt;br /&gt;
&lt;br /&gt;
* Wäre es möglich ein Script zu bauen, welches man ab und zu über diesen Artikel jagt und das die Einträge nach Anzahl der Striche ordnet? =&amp;gt; Formatierung als Tabelle (1. Spalte: das Teil, 2. Spalte: die Striche) würde auch schon helfen.&lt;br /&gt;
** Das geht kaum, weil | ein SOnderzeichen in Vorlagen ist.&lt;br /&gt;
&lt;br /&gt;
* Dass hier jeder immer nur einen Strich macht, glaube ich nicht! Ein Script was pro IP nur einen Strich zulässt wäre gut. -&amp;gt; Naja, alle 24h spätestens gibt es eigendlich eine neue IP...   Antwort: Lässt sich sehr leicht überprüfen mit Artikel -&amp;gt; Versionen&lt;br /&gt;
&lt;br /&gt;
* Warum macht der 5te nicht anstelle |||| ein V :-) und anstelle vom nächsten V kommt dann ein X ....Daniel [[Benutzer:84.179.17.164|84.179.17.164]] 20:11, 4. Feb 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
* Wenn Reichelt was aus der Liste neu ins Programm aufnimmt wäre eine Benachrichtigung per Newsletter oder RSS nett. Oder zumindest eine Rubrik &amp;quot;Seit XX.XX.200X neu im Programm&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Logbuch ==&lt;br /&gt;
&lt;br /&gt;
8.4.2010: Mail an Reichelt geschickt und an die Liste erinnert.&lt;br /&gt;
&lt;br /&gt;
2.10.2009: REVERT auf die Version vor dem 20.Jul.2009 12:47. Da der Artikel von 193.200.150.82 &amp;quot;verdoppelt&amp;quot; wurde. D.h. alles war doppelt vorhanden und die Einleitung gelöscht&lt;br /&gt;
&lt;br /&gt;
19.06.2009: Hab mal den Kram unter der Rubrik &amp;quot;Webseite&amp;quot; entfernt/zusammengefasst der schon realisiert wurde. -- Tobias&lt;br /&gt;
&lt;br /&gt;
12.03.2009: Da haben wir ja alle verpennt, Reichelt in 2008 mal wieder an die Liste zu erinnern. Ich hab das jetzt mal nachgeholt und eine Mail an Reichelt geschickt. -- [http://www.reintechnisch.de Winfried Mueller]&lt;br /&gt;
&lt;br /&gt;
03.08.2007: Das Feld für &amp;quot;neue Artikel&amp;quot; scheint aus dem Reichelt Shop entfernt worden zu sein, schade da man so schnell schauen konnte was neu im Programm ist, nun ist wieder Katalogblättern angesagt. - Nicht nachvollziehbar. siehe Startseite-&amp;gt;Service-&amp;gt;Neu in unserem Shop &lt;br /&gt;
&lt;br /&gt;
18.05.2007: Habe Reichelt an diese Liste erinnert. -- Robin Tönniges&lt;br /&gt;
&lt;br /&gt;
14.11.2006 Ich lese mir gerade euer Wishlist durch. Finde ich gut! Aber wie ihr &lt;br /&gt;
hier (Logbuch) über Reichelt kritisiert finde ich nicht fair! Die haben genug zu arbeiten! Bitte keine Vorurteile! Um das gehts mir hauptsächlich!&lt;br /&gt;
Macht weiter nur nicht so! &lt;br /&gt;
P.S. Schöne inforeiche Site&lt;br /&gt;
Steven&lt;br /&gt;
&lt;br /&gt;
6.8.2006 Habe eine umfassende Kritik zu Reichelts neuem Webshop geschrieben und dabei auf unsere Wünsche bzl. Webseite, insbesondere &amp;quot;Virtuelle Bauteilebox&amp;quot; und &amp;quot;Gehäusesuche&amp;quot; hingewiesen. Verlinkung auf diese Seite ist auch erwähnt worden.&lt;br /&gt;
&lt;br /&gt;
5.8.2006 Hurra, Reichelt bietet endlich den ATtiny13V an! Jetzt können wir  Batteriebetriebene Geräte (2,4-3V) bauen. By the way: Gibt es blaue LED&#039;s, die dazu passen?&lt;br /&gt;
&lt;br /&gt;
14.7.2006 Reichelt antwortete: (Zu lang, deshalb hier nur der Inhalt:) Wir haben                                                                                    ihre mail zur Kenntnis genommen (Forum wird angeblich ab und zu immer wieder kontrolliert). Entscheidender Satz (Original eines Mitarbeiters:)....Ich denke jedoch, dass die meisten und&lt;br /&gt;
wichtigsten Wünsche zum Herbstkatalog eingelistet werden.&lt;br /&gt;
&lt;br /&gt;
14.7.2006 Reichelt erneut auf diesen Beitrag aufmerksam gemacht, erwarte Antwort.&lt;br /&gt;
&lt;br /&gt;
3.7.2006: beitz-online.de eine verlinkung gemailt. Ich hoffe das ist erlaubt.&lt;br /&gt;
&lt;br /&gt;
5.3.2006: Verlinkung gemailt&lt;br /&gt;
&lt;br /&gt;
12.10.2005: Verlinkung gemailt und gebeten sich darum zu kümmern&lt;br /&gt;
&lt;br /&gt;
07.10.2005: Reichelt eine Verlinkung gemailt und speziell auf LOW ESR Elkos und 433 Mhz Funkmodule hingewiesen. Mal sehen was die Antworten.&lt;br /&gt;
&lt;br /&gt;
08.07.2005: Reichelt bescheid gegeben, man möge mal wieder hier rein schauen -- Thomas O.&lt;br /&gt;
&lt;br /&gt;
13.05.2005: Antwort von Reichelt: der Versand ins Ausland bleibt leider bei 150 Eur -- nurmi&lt;br /&gt;
&lt;br /&gt;
09.05.2005: Reichelt bescheid gegeben, man möge mal wieder hier rein schauen -- nurmi&lt;br /&gt;
&lt;br /&gt;
08.05.2005: Pflege der Liste hier: Wenn ihr was in der Liste seht, was bereits schon im Angebot ist, löscht es bitte! Sonst ist das hier bald ein unüberschaubares Chaos. -- [http://www.reintechnisch.de Winfried Mueller]&lt;br /&gt;
&lt;br /&gt;
08.02.2005: Positives Feedback von Reichelt. Freuen sich über diese Form der Anregung. In der 2. Märzhälfte sollen weitere Produkte in den neuen Katalog einfließen. -- [http://www.reintechnisch.de Winfried Mueller]&lt;br /&gt;
&lt;br /&gt;
07.02.2005: Reichelt bescheid gegeben, man möge mal wieder hier rein schauen -- [http://www.reintechnisch.de Winfried Mueller]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Bauteile]]&lt;/div&gt;</summary>
		<author><name>Jonebohne</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_FAT32&amp;diff=47902</id>
		<title>AVR FAT32</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_FAT32&amp;diff=47902"/>
		<updated>2010-05-25T07:56:13Z</updated>

		<summary type="html">&lt;p&gt;Jonebohne: Anpassung der internen Links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;----&lt;br /&gt;
&lt;br /&gt;
== Der Status ==&lt;br /&gt;
&lt;br /&gt;
* Aktuelle Version: [http://www.mikrocontroller.net/svnbrowser/avr-fat32 SVN-Repository] &amp;lt;br&amp;gt;&lt;br /&gt;
* Bekannte Probleme: Bei [http://de.wikipedia.org/wiki/Byte-Reihenfolge Big Endian] Controllern müssen größere Anpassungen gemacht werden. &amp;lt;br&amp;gt;&lt;br /&gt;
* Problem melden, oder sonstige Anfrage: [http://www.mikrocontroller.net/user/show/zerrome Persönliche Nachricht], oder auch hier [http://www.mikrocontroller.net/topic/105869#new Thread.]&amp;lt;br&amp;gt;&lt;br /&gt;
*[http://www.mikrocontroller.net/wikifiles/0/0c/Wiki.pdf Diese Seite als PDF.]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== FAT 16/32 , die Bibliothek ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mod.jpeg|thumb|right|&#039;&#039;&#039;[http://www.mikrocontroller.net/wikifiles/e/e9/Mod.jpeg Schichtmodell] der Lib&#039;&#039;&#039;]]&lt;br /&gt;
Dies ist eine freie FAT 16 / 32 Bibliothek.&lt;br /&gt;
Die Bibliothek ist modular und besteht aus folgenden Modulen:&lt;br /&gt;
&lt;br /&gt;
* Das File-Modul, bietet high-level Datei Operationen wie man sie von Dateizugriffen kennt, z.&amp;amp;nbsp;B. ffopen/ffclose um eine Datei zu öffnen oder um an eine Datei etwas anzuhängen und diese wieder zu schließen.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Das FAT16/32-Modul, bietet die grundlegenden Funktionen für den FAT-Zugriff und die Initialisierung der FAT. Es dient als Middleware zwischen low-level Karten Zugriff und high-level Datei Operationen. Der größte Teil der des FAT Protokolls ist dort implementiert.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Das MMC/SD-Modul, ist dafür zuständig, die Kommunikation mit [[MMC- und SD-Karten]] zu managen. Wie z.&amp;amp;nbsp;B. Initialisierung der Karte oder low-level Routinen zum schreiben auf die Karte. Es ist das einzige Hardware abhängige Modul.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es gibt die Möglichkeit über #defines in der config.h den Umfang der Lib zu bestimmen, dies wirkt sich auch extrem auf die Codegröße aus.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Module sind [http://en.wikipedia.org/wiki/C_(programming_language)#C99 c99] C-Standard Konform .&lt;br /&gt;
&lt;br /&gt;
=== Code einbinden ===&lt;br /&gt;
&lt;br /&gt;
Die Module werden über die *.h Dateien bekannt gemacht. Zudem müssen noch die dazugehörigen *.c Dateien eingebunden werden. Es gibt mehrere Möglichkeiten dies zu tun. Einmal im Makefile im Bereich der &amp;quot;c source files&amp;quot; oder bei &lt;br /&gt;
[http://de.wikipedia.org/wiki/Integrierte_Entwicklungsumgebung IDEs] &lt;br /&gt;
über einen Dialog der das Gleiche macht.&lt;br /&gt;
&lt;br /&gt;
=== Die Funktionalität ===&lt;br /&gt;
&lt;br /&gt;
In der Datei config.h gibt es Möglichkeiten die Bibliothek zu konfigurieren.&amp;lt;br&amp;gt; &lt;br /&gt;
Folgende Funktionen werden unterstützt (FAT16/32):&amp;lt;br&amp;gt;&lt;br /&gt;
* Lesen, Schreiben und Überschreiben von Dateien.&amp;lt;br&amp;gt;&lt;br /&gt;
* Vor- und Rückspulen in Dateien.&amp;lt;br&amp;gt;&lt;br /&gt;
* Anlegen von Ordnern &amp;lt;br&amp;gt;&lt;br /&gt;
* Wechseln von Verzeichnissen &amp;lt;br&amp;gt;&lt;br /&gt;
* Löschen von Dateien und Ordnern, bei Ordnern Rekursiv.&amp;lt;br&amp;gt;&lt;br /&gt;
* Ermitteln der freien Bytes auf der Karte &amp;lt;br&amp;gt;&lt;br /&gt;
* Schnelleres Schreiben und Lesen durch Multi-Block Operationen.&amp;lt;br&amp;gt;&lt;br /&gt;
* Kartenunterstützung für MMC/SD/[http://de.wikipedia.org/wiki/SD_Memory_Card#SDHC_.28SD_2.0.29 SHDC].&amp;lt;br&amp;gt;&lt;br /&gt;
* Falls eine [[AVR_-_Die_genaue_Sekunde_/_RTC|RTC]] vorhanden ist, kann bei den Dateioperationen die Zeitstempel Funktionalität genutzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
* Anbindung der Karte über Software [[Serial_Peripheral_Interface|SPI]] oder Hardware SPI&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Die Schalter ====&lt;br /&gt;
Hier ein Auszug aus der config.h mit den wichtigsten Parametern: &lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define MMC_SMALL_FILE_SYSTEM 	TRUE&lt;br /&gt;
#define MMC_WRITE		TRUE	&lt;br /&gt;
#define MMC_OVER_WRITE 		FALSE&lt;br /&gt;
#define MMC_MULTI_BLOCK 	FALSE&lt;br /&gt;
#define MMC_SDHC_SUPPORT	TRUE&lt;br /&gt;
#define MMC_TIME_STAMP 		FALSE&lt;br /&gt;
 &lt;br /&gt;
#define MMC_MAX_SPEED 		TRUE&lt;br /&gt;
&lt;br /&gt;
#define MMC_SOFT_SPI 		FALSE&lt;br /&gt;
&lt;br /&gt;
#define MMC_MAX_CLUSTERS_IN_ROW 256&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Bedeutung der Schalter ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MMC_SMALL_FILE_SYSTEM TRUE&#039;&#039;&#039;, oder &#039;&#039;&#039;FALSE&#039;&#039;&#039; bestimmt den Funktionsumfang der Lib. Es Fallen Folgende Funktionalitäten raus: ffcd(), fat_str(), ffls(), ffcdLower(), ffmkdir() und ffrm() der Teil mit Ordnern rekursiv löschen. (&#039;&#039;&#039;FALSE&#039;&#039;&#039; = Komplette Unterstützung)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MMC_WRITE TRUE&#039;&#039;&#039;, oder &#039;&#039;&#039;FALSE&#039;&#039;&#039; bestimmt ob schreib Unterstützung einkompiliert wird oder nicht. (&#039;&#039;&#039;TRUE&#039;&#039;&#039; = Write an)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MMC_OVER_WRITE TRUE&#039;&#039;&#039;, oder &#039;&#039;&#039;FALSE&#039;&#039;&#039; bestimmt ob ffwrite() mit Überschreiben Funktionalität Kompiliert wird oder nicht. Überschreiben von Dateien ist nicht so performant. Siehe auch: [[AVR_FAT32#Interne_Technik|Interne Technik]] (&#039;&#039;&#039;TRUE&#039;&#039;&#039; = Dateien überschreiben)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MMC_MULTI_BLOCK TRUE&#039;&#039;&#039;, oder &#039;&#039;&#039;FALSE&#039;&#039;&#039; legt fest ob mit MultiBlock Read/Write Unterstützung Kompiliert wird oder nicht. Geht nur wenn &#039;&#039;&#039;OVER_WRITE FALSE&#039;&#039;&#039; ist! (&#039;&#039;&#039;TRUE&#039;&#039;&#039; = MultiBlock Operation)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MMC_MAX_SPEED TRUE&#039;&#039;&#039;,  oder &#039;&#039;&#039;FALSE&#039;&#039;&#039; legt fest, ob nach der Initialisierung der MMC/SD Karte mit maximalem Speed geschrieben/gelesen wird oder nicht. Zum testen wenn man nicht sicher ist ob die Hardware die maximale Geschwindigkeit mit macht empfiehlt sich &#039;&#039;&#039;FALSE&#039;&#039;&#039; als Wert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MMC_MAX_CLUSTERS_IN_ROW&#039;&#039;&#039; 1-500, gibt an, wie viele Cluster, leer oder Verkettet die zusammenhängen, gesucht werden sollen. Hier muss man den Overhead des Suchens abwägen, gegen die Zeit, die z.&amp;amp;nbsp;B. benötigt wird 500 Cluster in der Fat zu verketten. Siehe auch: [[AVR_FAT32#Interne_Technik|Interne Technik]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MMC_SDHC_SUPPORT TRUE&#039;&#039;&#039;, oder &#039;&#039;&#039;FALSE&#039;&#039;&#039; legt fest, ob mit SDHC Unterstützung Kompiliert wird oder ohne. Der [http://de.wikipedia.org/wiki/SD_Memory_Card#SDHC_.28SD_2.0.29 SD Standard 2.0] wird damit unterstützt, also Karten bis 32 GB Größe.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MMC_TIME_STAMP TRUE&#039;&#039;&#039;, oder &#039;&#039;&#039;FALSE&#039;&#039;&#039; legt fest, ob die Zeitstempel Unterstützung mit kompiliert wird oder nicht. Wenn TRUE, dann wird das Erstelldatum und die Erstellzeit eingetragen. Bei weiteren Schreibzugriffen auf die Datei wird dann auch das Zugriffsdatum und die Zugriffszeit eingetragen. Es müssen dafür auch 2 Funktionen in der fat.c mit Code gefüllt werden, damit diese das Datum und die Zeit liefern.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MMC_SOFT_SPI TRUE&#039;&#039;&#039;, oder &#039;&#039;&#039;FALSE&#039;&#039;&#039; legt fest, ob mit Software SPI Unterstützung kompiliert wird, oder nicht. Wenn &#039;&#039;&#039;TRUE&#039;&#039;&#039;, muss in der mmc.h noch eingetragen werden welche Pins als SPI Interface benutzt werden sollen. Es werden nur Pins des selben Ports unterstützt. Also z.&amp;amp;nbsp;B. nur Pins von Port B.&lt;br /&gt;
&lt;br /&gt;
==== Die C Funktionen ====&lt;br /&gt;
&lt;br /&gt;
Das Modul FILE bietet in der Standard-Konfiguration folgende für den Nutzer interessante Funktionen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
unsigned char ffread(void)&lt;br /&gt;
void          ffwrite(unsigned char c)&lt;br /&gt;
void          ffwrites(unsigned char *s )&lt;br /&gt;
unsigned char ffopen(unsigned char name[])&lt;br /&gt;
unsigned char ffclose(void)&lt;br /&gt;
void          ffseek(unsigned long int offset)&lt;br /&gt;
unsigned char ffcd(unsigned char name[])&lt;br /&gt;
void          ffls(fptr uputs_ptr)&lt;br /&gt;
unsigned char ffcdLower(void)&lt;br /&gt;
unsigned char ffrm(unsigned char name[])&lt;br /&gt;
unsigned char ffmkdir(unsigned char name[])&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Modul MMC/SD bietet für den Nutzer direkt nur eine interessante Funktion:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
unsigned char mmc_init(void)&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Modul FAT bietet für den Nutzer direkt nur zwei interessante Funktionen:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
unsigned char fat_loadFatData(void)&lt;br /&gt;
unsigned long long int fat_getFreeBytes(void)&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für die Anwendungen der Funktionen gibt es Beispiele, Kommentare und Dokumentation in den [[AVR_FAT32#Sourcen|Sourcen]]. Ein einfaches Beispiel auch unter [[AVR_FAT32#Einfaches_Code_Beispiel|Code Beispiel]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Alle Funktionen, die mit FAT-Namen in Zusammenhang stehen (Datei- und Ordner-Namen), müssen folgende Konvention erfüllen: &amp;lt;br&amp;gt;&lt;br /&gt;
Die FAT-Namenskonvention ist immer 8.3, das heißt, ein Datei-Name mit maximal 8 Zeichen und eine Datei-Endung mit maximal 3 Zeichen.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ein Dateiname &amp;quot;test.txt&amp;quot; MUSS in &amp;quot;TEST&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;TXT&amp;quot; gewandelt werden! Noch ein Beispiel: &amp;quot;MAIN&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;C&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot; = &amp;quot;main.c&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Nur vFAT erfüllt lange Datei-Namen !&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Interne Technik ===&lt;br /&gt;
&lt;br /&gt;
In der Regel wird das [http://www.mikrocontroller.net/wikifiles/e/e9/Mod.jpeg Schicht-Modell] eingehalten. Das heißt, jedes Modul nutzt nur die Funktionen aus der Schicht darunter, es gibt allerdings Ausnahmen, aus Gründen der Code-Größe. Beispiel : ffwrite nutzt direkt die Funktion mmc_write_sector(sector); aus dem Modul mmc.c. Aufgrund der Namens-Konvention ist aber leicht zu erkennen, woher die Funktion kommt.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es gibt in dem Modul fat, &amp;quot;Daten-Ketten&amp;quot;. Die Aufgaben sind atomar aufgeteilt. Zum lesen von Daten sind beispielsweise die Funktionalitäten, lesen eines Sektors, auswerten der Information und weitere Entscheidung (nächsten Sektor laden usw.) nötig. Die Idee dabei ist gewesen, die Funktionen der atomaren Aufgabe nach zu implementieren.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispielkette:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
fat_loadSector -&amp;gt; fat_loadRowOfSector -&amp;gt; fat_loadFileDataFromCluster -&amp;gt; fat_loadFileDataFromDir&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Diese Kette wird beispielsweise beim Öffnen einer Datei durchlaufen. Um die Datei zu öffnen, muss man wissen ob es die Datei im aktuellen Verzeichnis gibt. Um das herauszufinden, muss man den ersten Sektor des Verzeichnisses laden. Dann muss man die Reihen (immer 32 Byte am Stück), also Datei/Ordner-Einträge des Sektors prüfen. Da ein Cluster aus verschiedenen Sektoren bestehen kann, müssen diese auch geprüft werden. Als letzte logische Einheit müssen jetzt noch die verketteten Cluster geprüft werden, also das ganze Verzeichnis. Ist diese Kette so durchlaufen, weiß man, ob die Datei da ist oder nicht.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Lesen ====&lt;br /&gt;
Beim lesen, einer Datei wird in der FAT nach verketteten Clustern gesucht. Bei einer unfragmentierten FAT liegen im Idealfall alle Cluster in einer Reihe. Dies wird ausgenutzt:&lt;br /&gt;
Es wird der erste Cluster der Datei gesucht und solange gesucht, bis MAX_CLUSTERS_IN_ROW am Stück gefunden wurden, oder ein Abbruch der Kette erkannt wird. Wird ein Abbruch erkannt, wird erstmal das bekannte Teilstück der kompletten Kette gelesen, danach wird das nächste Teilstück gesucht. Bis die ganze Kette durchlaufen wurde. &amp;lt;br&amp;gt;&lt;br /&gt;
Bei einer unfragmentierten Fat kann man oft die ganze Datei lesen ohne einen weiteren Fat lookup, das ist extrem effizient!&lt;br /&gt;
&lt;br /&gt;
==== Schreiben ====&lt;br /&gt;
Beim schreiben, einer Datei wird in der FAT nach leeren Clustern gesucht. Bei einer unfragmentierten FAT liegen diese im Idealfall alle nebeneinander. Das wird ausgenutzt:&lt;br /&gt;
# Es werden ab Cluster Nr. 2, MAX_CLUSTERS_IN_ROW am Stück gesucht, oder so viele, wie es freie am Stück gibt.&lt;br /&gt;
# Diese werden beschrieben (also die Sektoren die mit diesen Clusternummern in Zusammenhang stehen). Sind genügend freie für die Datei Daten bekannt, werden die Cluster verkettet und man ist fertig.&lt;br /&gt;
# Sind nicht genügend freie bekannt, wird die erste Teil Kette verkettet und die letzte Cluster Nummer dieser Kette gesichert (file.lastCluster). Jetzt werden wieder neue gesucht.&lt;br /&gt;
# Sind jetzt immer noch nicht genügend freie Cluster bekannt, werden die beiden Teilketten verkettet (wo die alte aufhört weiß man durch file.lastCluster). Weiter bei 2.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Bei beiden Methoden&#039;&#039; kann es zu größerem [http://de.wikipedia.org/wiki/Overhead_(EDV) Overhead] kommen, wenn die FAT fragmentiert ist. Im Extremfall ist immer nur ein Cluster am Stück frei bzw. verkettet.&lt;br /&gt;
&lt;br /&gt;
=== Funktionsübersichts Diagramm ===&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/attachment/49287/FunktionsUebersichtsDiagramm.jpeg (Link)]    Größe: 2412 x&lt;br /&gt;
7946 Pixel, ältere Version der Lib. Viele der Funktionen enden in Schreiboperationen, weil das Diagramm mit der Option &amp;quot;MMC_OVER_WRITE TRUE&amp;quot; erstellt wurde.&lt;br /&gt;
&lt;br /&gt;
=== Die Richtlinien ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Allgemein:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es ist immer darauf zu achten, dass es sich bei MMC/SD-Karten um Flash-Speicher handelt, dieser ist NICHT unendlich oft beschreibbar. Die Schreiben/Anhängen- und Löschen- Funktionalitäten sollten so selten wie möglich benutzt werden! &amp;lt;br&amp;gt;&lt;br /&gt;
Eine SD Karte besitzt einen eigenen Controller in der Karte, der auf den eigentlichen Flash-Speicher schreibt. So können die logischen von den physikalischen Sektoren getrennt werden (Wear Leveling). Also gibt es nicht so viele Schreib Vorgänge auf dem gleichen Sektor, weil der Karten Controller den logischen Sektor auf einen anderen physikalischen schreibt. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Siehe Auch: [http://de.wikipedia.org/wiki/SD_Memory_Card Wikipedia SD Karten] , und [[MMC- und SD-Karten]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Richtlinien stable-mmc-0.5.x:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Wenn eine Datei zum schreiben geöffnet ist, aber gerade keine Daten zum schreiben vorliegen, bringt es keinen Vorteil (Strom oder Geschwindigkeit) die Datei zu schießen, wenn später noch Daten geschrieben werden sollen. Bei jedem ffclose, wird der Datei Eintrag geupdatet, also dieser Sektor geschrieben (möglicherweise zusätzlich sogar ein FAT Sektor).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oftmaliges anlegen und löschen einer Datei schreibt immer die selben (logischen) Sektoren. Besser nicht löschen und einfach neu anlegen, mit anderem Namen, oder überschreiben, da dabei die schon verketteten FAT Sektoren nicht nochmals beschrieben werden, sondern nur die Daten Sektoren überschrieben werden. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Beispiel Beschaltung==&lt;br /&gt;
&lt;br /&gt;
=== Schaltplan ===&lt;br /&gt;
[[Bild:Schaltplan.jpeg|thumb|right|260px|&#039;&#039;&#039;[http://www.mikrocontroller.net/wikifiles/9/93/Schaltplan.jpeg Schaltplan]&#039;&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
MMC/SD-Karten brauchen 3,3 Volt. Wenn der Controller mit 5 Volt arbeitet, muss man die Spannungspegel anpassen. Arbeitet der Controller auch mit 3,3 Volt kann man alle Leitungen direkt mit der Karte verbinden. &amp;lt;br&amp;gt;&lt;br /&gt;
Als Beispiel für die mögliche Frequenz des hier verwendeten HC4050 zur Pegelwandlung: bei +125 °C und VCC von 2 V wird das Propagationdelay mit Max 130 ns angegeben. Das macht ungefähr 7,6 Mhz Maximal mögliche Frequenz. Bis +85 °C und VCC von 2 V geht es bis 9,5 Mhz. Da aber hier 3,3 Volt anliegen wird er in allen Bereichen etwas schneller sein.&amp;lt;br&amp;gt;&lt;br /&gt;
Siehe Datenblatt für mehr Infos oder [[Pegelwandler]].&lt;br /&gt;
&lt;br /&gt;
Benutzt wird der [[Serial_Peripheral_Interface|SPI]]-Port des Controllers (bis auf Slave Select, hier PB1). Es wäre aber auch Software basiertes SPI möglich, siehe hierfür auch [[AVR_FAT32#Die_Funktionalit.C3.A4t|Link]]&amp;lt;br&amp;gt;&lt;br /&gt;
Die Kondensatoren C1 und C2 (100nF) dienen nur zum Entstören (möglichst nah an ICs). Sollten an jedes digitale IC in einer Schaltung. &amp;lt;br&amp;gt;&lt;br /&gt;
Die MMC/SD-Leiste kann eine richtige Halterung sein oder was auch sehr gut passt ist ein Stück alte ISA-Bus Buchse eines alten Mainboards (nur MMC Karten). Die Abstände da passen gut. Einfach vom Board Flexen und dann kleine Kabel an den Stecker löten (da wo man unten jetzt das Metall sieht)&amp;lt;br&amp;gt;&lt;br /&gt;
Das HC4050 IC ist ein &amp;quot;high to low&amp;quot; level shifter. Es sorgt dafür, dass die 3 abgehenden Signale des MC auf 3.3 Volt gebracht werden. Das abgehende Signal der Karte zum Controller wird auch so als logisch high erkannt.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pinbelegung MMC/SD/SDHC ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pinout.png|thumb|left|500px|&#039;&#039;&#039;[http://www.mikrocontroller.net/wikifiles/1/15/Pinout.png SD/SDHC/MMC Karte - Atmega8/168/328]&#039;&#039;&#039;]] &lt;br /&gt;
[[Bild:mmc_sd.png|thumb|left|500px|&#039;&#039;&#039;[http://www.mikrocontroller.net/wikifiles/5/50/Mmc_sd.png Pins SD/SDHC/MMC Karte]&#039;&#039;&#039;]]&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Der Code ==&lt;br /&gt;
&lt;br /&gt;
=== Sourcen ===&lt;br /&gt;
&lt;br /&gt;
* Sourcecode mit Linux Makefile und als AvrStudio-Projekt jetzt immer auf: [http://www.mikrocontroller.net/svnbrowser/avr-fat32 SVN AVR-Fat32]&lt;br /&gt;
&lt;br /&gt;
=== Einfaches Code Beispiel ===&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel um in eine Datei zu schreiben/anhängen und wieder zu lesen:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;config.h&amp;quot; 	// Hier werden alle nötigen Konfigurationen vorgenommen !&lt;br /&gt;
#include &amp;quot;file.h&amp;quot;&lt;br /&gt;
#include &amp;quot;fat.h&amp;quot;&lt;br /&gt;
#include &amp;quot;mmc.h&amp;quot;		// Hardware abhängig.&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;		// Hardware abhängig, es kann auch eine eigene eingebunden werden !&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//*****************************************************************************************************************&lt;br /&gt;
void main(void){&lt;br /&gt;
&lt;br /&gt;
	// Uart initialisierung zu Ausgabe von Daten.&lt;br /&gt;
	uinit();&lt;br /&gt;
&lt;br /&gt;
	uputs((unsigned char*)&amp;quot;\nBoot&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	// Versuch Karte zu Initialisieren, bis es klappt.&lt;br /&gt;
	// Umbedingt so, weil die Initialiesierung nicht immer auf anhieb klappt.&lt;br /&gt;
	while (FALSE==mmc_init()){&lt;br /&gt;
		nop();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	uputs((unsigned char*)&amp;quot;...&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Fat initialisieren. Nur wenn das klappt sind weitere Aktionen sinnvoll, sonst endet das Programm !&lt;br /&gt;
	if(TRUE == fat_loadFatData()){&lt;br /&gt;
&lt;br /&gt;
	  // Wenn auf dem terminal &amp;quot;Boot... OK&amp;quot; zu lesen ist, ist Init OK.&lt;br /&gt;
	  // Jetzt kann man schreiben/anhaengen/lesen.&lt;br /&gt;
	  uputs((unsigned char*)&amp;quot;Ok\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	  // Dateinamen muessen in diesem Format sein !&lt;br /&gt;
	  // Man beachte die Größe des Arrays und die Großbuchstaben!&lt;br /&gt;
	  unsigned char file_name[12]=&amp;quot;TEST    TXT&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	  // String zum in die Datei schreiben.&lt;br /&gt;
	  unsigned char str[13]=&amp;quot;Hallo Datei!&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	  // Datei existiert nicht, also anlegen !&lt;br /&gt;
	  if(MMC_FILE_NEW == ffopen(file_name)){&lt;br /&gt;
&lt;br /&gt;
	     // Schreibt String auf Karte !&lt;br /&gt;
	     // Nur richtige Strings koennen mit ffwrites geschrieben werden !&lt;br /&gt;
	     ffwrites(str);&lt;br /&gt;
&lt;br /&gt;
	     // Neue Zeile in der Datei.&lt;br /&gt;
             // Schreibt Zeilenumbruch in die Text Datei.&lt;br /&gt;
	     ffwrite(0x0D);&lt;br /&gt;
	     ffwrite(0x0A);&lt;br /&gt;
&lt;br /&gt;
	     // Schließt Datei.&lt;br /&gt;
	     ffclose();&lt;br /&gt;
	   }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	  // Datei existiert, also anhaengen !&lt;br /&gt;
	  if(MMC_FILE_EXISTS == ffopen(file_name)){&lt;br /&gt;
&lt;br /&gt;
	     // Spult bis zum Dateiende vor um anzuhaengen, geht auch ohne Option MMC_OVER_WRITE !&lt;br /&gt;
	     ffseek(file.length);&lt;br /&gt;
&lt;br /&gt;
	     // Schreibt String.&lt;br /&gt;
	     ffwrites(str);&lt;br /&gt;
&lt;br /&gt;
	     // Neue Zeile in der Datei.&lt;br /&gt;
             // Schreibt Zeilenumbruch in die Text Datei.&lt;br /&gt;
	     ffwrite(0x0D);&lt;br /&gt;
	     ffwrite(0x0A);&lt;br /&gt;
&lt;br /&gt;
	     // Schließt Datei.&lt;br /&gt;
	     ffclose();&lt;br /&gt;
	   }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	   // Datei existiert also lesen.&lt;br /&gt;
	   // Gerade angelegt und beschrieben, oder war schon vorhanden und es wurde was angehaengt.&lt;br /&gt;
	   if(MMC_FILE_EXISTS == ffopen(file_name)){&lt;br /&gt;
&lt;br /&gt;
	      // Setzen einer Variable und dann runterzaehlen geht am schnellsten !&lt;br /&gt;
	      unsigned long int seek=file.length;&lt;br /&gt;
&lt;br /&gt;
	      // Lesen eines chars und Ausgabe des chars.&lt;br /&gt;
	      // Solange bis komplette Datei gelesen wurde.&lt;br /&gt;
	      do{&lt;br /&gt;
	         uputc(ffread());&lt;br /&gt;
	      }while(--seek);&lt;br /&gt;
&lt;br /&gt;
	      ffclose();&lt;br /&gt;
	   }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== FAT 32 Grundlegendes ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:fat32.png|thumb|right|250px|&#039;&#039;&#039;Bild 0:&#039;&#039;&#039; [http://www.mikrocontroller.net/wikifiles/8/82/Fat32.png Grundlegende FAT32 Struktur]]]&lt;br /&gt;
&lt;br /&gt;
Ein Dateisystem des Typs FAT besteht aus mehreren Bereichen.&lt;br /&gt;
FAT ist immer [http://de.wikipedia.org/wiki/Byte-Reihenfolge little Endian].&lt;br /&gt;
Ein Dateisystem wie FAT32 ist ein Verwaltungsinstrument. Der FAT16/32 Standard beschreibt die Art und Weise wie die Daten Verwaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Im Folgenden werden die Schritte die nötig sind um Daten aus dem System zu lesen und in das System zu schreiben erläutert. Die Zahlenbeispiele und Bilder sollen ein praktisches Beispiel geben. Zum Verständnis empfiehlt es sich, das ganze Kapitel FAT32 Durchzulesen !&lt;br /&gt;
 &lt;br /&gt;
* Der erste Teil, ist der Sektor 0 oder LBA. In dem Sektor stehen die nötigen Informationen um mit dem Auslesen beginnen zu können.&lt;br /&gt;
* Dann die FAT selber, also die Dateizuordnungstabelle.&lt;br /&gt;
* Der dritte Teil ist der &amp;quot;Daten&amp;quot; Bereich, in dem beispielsweise Dateieinträge/Ordnereinträge oder Daten stehen.&lt;br /&gt;
&lt;br /&gt;
FAT bedeutet File Allocation Table ( Dateizuordnungstabelle ). Dateizuordnungstabelle beschreibt schon das Prinzip der FAT. &lt;br /&gt;
Kern des Dateisystems ist eine einfach verkettete Liste, in der festgehalten wird wo sich die Daten befinden, die Dateizuordnungstabelle !&amp;lt;br&amp;gt;&lt;br /&gt;
In dieser Tabelle werden Cluster verkettet, diese verketteten Cluster können Dateien oder Ordner bilden, dazu später mehr.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Unterschied zwischen FAT32 und FAT16 besteht darin, dass ein FAT16 Dateisystem noch einen speziellen Teil hat. Das Root-Dir ist nicht einfach ein weiterer Ordner wie bei FAT32 sondern ein festgelegter Teil, der Platz für 512 Einträge bietet. FAT einträge bei FAT16 sind nur 2 Byte groß. Der Rest ist gleich.&lt;br /&gt;
&lt;br /&gt;
=== Sektor 0 oder LBA ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:sektor0.jpeg|thumb|right|250px|&#039;&#039;&#039;Bild 1:&#039;&#039;&#039; [http://www.mikrocontroller.net/wikifiles/c/c6/Sektor0.jpeg Sektor 0] (512 Byte) bei einer unpartitionierten Karte]]&lt;br /&gt;
Um das Dateisystem lesen zu können muss man wissen wo was steht. Die nötigsten Informationen sind: &lt;br /&gt;
&lt;br /&gt;
* Sektoren pro Cluster (rot)&lt;br /&gt;
* Reservierte Sektoren nach Sektor 0 (orange)&lt;br /&gt;
* Anzahl der FATs (gelb)&lt;br /&gt;
* Wieviele Sektoren von einer FAT belegt werden (grün)&lt;br /&gt;
* Der Root-Dir Cluster (blau)&lt;br /&gt;
&lt;br /&gt;
Aus diesen Daten ergibt sich demnach:&lt;br /&gt;
&lt;br /&gt;
* 1. Sektor der 1. FAT ist Sektor 32 ([[AVR_FAT32#Die_FAT|Bild 2]]), also der erste Sektor nach der Anzahl der Reservierten (orange).&lt;br /&gt;
* Der erste Daten Cluster ist 1003, weil die Anzahl der FATs 1 ist, also einmal die Sektoren, die von einer FAT belegt werden (grün) (00003cb=971) 971 + 32 (orange) = 1003.&lt;br /&gt;
* Das Root-Dir ist Cluster 2, also Sektor 1003.&lt;br /&gt;
* Die Anzahl der Sektoren pro Cluster ist 4 (2048 Bytes/Cluster).&lt;br /&gt;
&lt;br /&gt;
Damit sind alle nötigen Daten vorhanden ! &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Mann weiß jetzt wo das Root-Dir beginnt, ab da spannt sich der Verzeichnis Baum auf. So kann man jetzt alle Dateieinträge lesen. Es sind also alle Informationen mit der man das Lesen einer Datei beginnen kann bekannt, bzw. man weiß wo man einen Dateieintrag machen muss beim schreiben. Um eine Datei aber vollständig lesen zu können, muss man alle Cluster kennen, die zu der Datei gehören, da kommt die FAT-Tabelle ins Spiel von der man ja jetzt auch die 1. Sektornummer kennt. Dort stehen ab dem 1. Cluster der Datei, verkettet alle Folgecluster.&lt;br /&gt;
&lt;br /&gt;
Bei FAT Dateisystemen können mehrere Sektoren (512 Bytes) logisch zu Clustern zusammengeschlossen werden. Ein Cluster ist für eine Datei die kleinste Speichereinheit. Das hat zur Folge, dass eine 100 Byte große Datei eventuell 2048 Bytes im Dateisystem belegt. Die rote Zahl gibt an wieviele Sektoren ein Cluster bilden. Der Daten Bereich wird immer in Clustern angegeben, das macht die Umrechnung von Sektoren zu Clustern nötig. In diesem Fall ist Cluster 2 der absolute Sektor 1003.&lt;br /&gt;
&lt;br /&gt;
=== Die FAT ===&lt;br /&gt;
 &lt;br /&gt;
Folgendes Bild zeigt den ersten FAT Sektor (512 Bytes) eines FAT32 Dateisystems (nicht den ersten Sektor der Karte!). Eingetragen sind: Root-Dir und zwei darin enthaltene Ordner sowie eine Datei mit 60.000 Bytes Größe.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Fat32.jpeg|thumb|right|250px|&#039;&#039;&#039;Bild 2:&#039;&#039;&#039; [http://www.mikrocontroller.net/wikifiles/b/b3/Fat32.jpeg 1. FAT Sektor] (hier Sektor 32)]]&lt;br /&gt;
Die Einträge 0-7 sind immer reserviert (Quasi Cluster 0 und 1)! Also beginnt die FAT ab 8 (rot, Cluster Nummer 2). Der erste Eintrag (rot) ist 4 Byte groß und zu lesen von Stelle 8 zu Stelle 11 weil little Endian, also umgedrehte Wertigkeit. 8 niedrigste Wertigkeit, dann 9 eins höher, 10 noch eine höher und 11 höchste (dazu später noch ein Beispiel).&amp;lt;br&amp;gt;&lt;br /&gt;
Wie von Microsoft empfohlen ist der erste mögliche Cluster das Root-Dir (rot). Welches hier nur einen Cluster lang ist.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An den gelben Einträgen wird die einfach verkettete Liste der FAT deutlich. Der erste gelbe Eintrag steht an der Stelle des Clusters Nummer 5 und hat als Inhalt eine 6. Das bedeutet: Cluster 5 und 6 gehören zusammen. Würde an der Stelle des Clusters Nummer 5 ein FFFFFF0F stehen (little Endian) ist nur der Cluster 5 mit Daten belegt (wie bei rot, blau und grün).&amp;lt;br&amp;gt;&lt;br /&gt;
So tastet man sich vom ersten Cluster einer Datei bis zum Letzten Cluster einer Datei vor. Das ist der einzige Zweck der FAT (mit FAT ist hier die eigentliche Tabelle gemeint).&amp;lt;br&amp;gt;&lt;br /&gt;
Woher bekommt man aber den 1. Cluster einer Datei?&lt;br /&gt;
&lt;br /&gt;
=== Daten ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Data.jpeg|right|thumb|250px|&#039;&#039;&#039;Bild 3:&#039;&#039;&#039; Inhalt eines Ordners/Dirs (hier [http://www.mikrocontroller.net/wikifiles/f/fb/Data.jpeg Cluster 4])]]&lt;br /&gt;
&lt;br /&gt;
Ein Dateieintrag besteht aus 32 Bytes und liegt in einem Ordner/Dir im Datenbereich des Dateisystems ( 32 Bytes = eine Zeile).&lt;br /&gt;
&lt;br /&gt;
Dies ist der 1. Cluster eines Ordners. Hier sieht man den &amp;quot;.&amp;quot; bzw &amp;quot;..&amp;quot; Eintrag in Zeile 1 bzw. 2. Diese beiden Einträge sind in jedem ersten Cluster eines Ordners vorhanden. Außer im Root-Dir, von dort spannt sich der Verzeichnis Baum ja erst auf. Der &amp;quot;.&amp;quot; Eintrag hat als 1. Cluster Eintrag den eigenen Cluster, hier 4. Der &amp;quot;..&amp;quot; Eintrag ist interessanter, weil er den 1. Cluster des Übergeordneten Ordners enthält, hier 3. Ist der Übergeordnete Ordner das Root-Dir, ist der 1. Cluster Eintrag 0. Diese beiden Einträge werden in der Lib genutzt um rekursiv zu löschen.&lt;br /&gt;
&lt;br /&gt;
Die dritte Zeile des Bilds zeigt eine Datei namens TEST3.TXT (grün) mit 60.000 Bytes Größe (blau) und dem 1. Cluster 5,damit ist immer der 1. Daten Cluster gemeint (rot, Folgecluster siehe [[AVR_FAT32#Die_FAT|Bild 2]]). Speziell ist hier, dass die 4 Bytes des ersten Clusters aufgeteilt sind auf 2 unterschiedliche &amp;quot;Orte&amp;quot; im 32 Byte Eintrag (Wertigkeit: 26:27:20:21).&lt;br /&gt;
&lt;br /&gt;
Um nun die Daten der Datei lesen zu können, muss man die Daten Cluster kennen. Der erste Daten Cluster steht im Datei Eintrag, hier Cluster 5. Für die Folgenden sieht man in der FAT nach. Dort stehen die Folgecluster der Datei. An der Stelle des ersten Clusters der Datei Cluster 5 steht eine 6, d.h. der nächste Cluster ist 6. In dieser Form ist die FAT verkettet. Wenn in der FAT der letzte Cluster erreicht ist, inhalt des Clusters ist FFFFFFF0, liest man den letzten Sektor bis man insgesammt die Größe der Datei (blau) gelesen hat und ist fertig.&lt;br /&gt;
&lt;br /&gt;
=== Root Dir ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Dir.jpeg|thumb|right|250px|&#039;&#039;&#039;Bild 4:&#039;&#039;&#039; Root des Dateisystems (hier [http://www.mikrocontroller.net/wikifiles/2/26/Dir.jpeg Cluster 2])]]&lt;br /&gt;
Die Sektor Nummer des Root-Dirs, bei FAT32, wird aus Sektor 0 oder dem LBA ausgelesen (siehe [[AVR_FAT32#Sektor_0_oder_LBA|Bild 1]]). Zu Sehen ist hier in der ersten Zeile ein 32 Byte Eintrag eines Ordners. Zu erkennen ist dieser am Datei Attribut 0x10 an Stelle 11 (rot). Für den Ordner Namen ist das Gleiche Feld da wie für einen Dateinamen (grün). Der 1. Cluster des Ordners ist 3 (blau, Inhalt des Ordners ist [[AVR_FAT32#Daten|Bild 3]]). Bei Ordnern werden die Felder für die Größe genullt (orange). Das Root-Dir hat keinen &amp;quot;.&amp;quot; bzw. &amp;quot;..&amp;quot; Eintrag. Der erste Cluster des Dirs ist ja über Sektor 0 bekannt und ab dem Root-Dir spannt sich der Verzeichnisbaum erst auf. Das Root-Dir bei FAT32 kann beliebig groß werden.&lt;br /&gt;
&lt;br /&gt;
=== Zusammenfassung ===&lt;br /&gt;
&lt;br /&gt;
Für Dateien und Ordner sind nur zwei Bereiche eines FAT32 Dateisystems wichtig, nämlich die FAT selbst und der Daten Bereich. &lt;br /&gt;
Eine Datei wird aufgesplittet, in einen Datei Eintrag und in die Nutzdaten der Datei (alles im Daten Bereich). Ein Ordner ist vom Eintrag im Dateisystem einer Datei sehr ähnlich. Wo bei einer Datei über den 1.Cluster eine Cluster-Chain für die eigentlichen Daten der Datei beginnt, wird bei einem Ordner so eine Cluster-Chain für weitere Datei/Ordner Einträge verkettet. Ein Ordner bietet pro Sektor maximal 16 Einträge (16*32=512).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* Thread:  http://www.mikrocontroller.net/topic/105869&lt;br /&gt;
* Infos (englisch):  https://www.pjrc.com/tech/8051/ide/fat32.html&lt;br /&gt;
* Fatgen103 von Microsoft (einfach mal nach Fatgen103.pdf suchen..)&lt;br /&gt;
* [[MMC- und SD-Karten]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&#039;&#039;&#039;Weitere Projekte mit FAT MMC/SD Karten:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [http://www.roland-riegel.de/sd-reader/index.html MMC/SD FAT16 card reader example application (Roland Riegel)]&lt;br /&gt;
* [http://www.ulrichradig.de/home/index.php/avr/mmc-sd MMC/SD FAT16 (Ulrich Radig)]&lt;br /&gt;
* [http://www.holger-klabunde.de/avr/avrboard.htm#FullFAT MMC/SD FAT16/32 auch multi File (Holger Klabunde)]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR]]&lt;br /&gt;
[[Kategorie:Speicher und Dateisysteme]]&lt;/div&gt;</summary>
		<author><name>Jonebohne</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Speicher&amp;diff=46909</id>
		<title>AVR-Tutorial: Speicher</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Speicher&amp;diff=46909"/>
		<updated>2010-04-29T14:22:39Z</updated>

		<summary type="html">&lt;p&gt;Jonebohne: /* RAM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Speichertypen ==&lt;br /&gt;
&lt;br /&gt;
Die AVR-Mikrocontroller besitzen 3 verschiedene Arten von Speicher: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th align=&amp;quot;left&amp;quot;&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th align=&amp;quot;left&amp;quot;&amp;gt;Flash&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th align=&amp;quot;left&amp;quot;&amp;gt;EEPROM&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th align=&amp;quot;left&amp;quot;&amp;gt;RAM&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th align=&amp;quot;left&amp;quot;&amp;gt;Schreibzyklen&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;gt;10.000&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;amp;gt;100.000&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;unbegrenzt&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th align=&amp;quot;left&amp;quot;&amp;gt;Lesezyklen&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;unbegrenzt&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;unbegrenzt&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;unbegrenzt&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th align=&amp;quot;left&amp;quot;&amp;gt;flüchtig&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th align=&amp;quot;left&amp;quot;&amp;gt;Größe beim ATtiny2313&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;2 KB&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;128 Byte&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;128 Byte&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th align=&amp;quot;left&amp;quot;&amp;gt;Größe beim ATmega8&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;8 KB&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;512 Byte&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1 KB&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th align=&amp;quot;left&amp;quot;&amp;gt;Größe beim ATmega32&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;32 KB&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;1 KB&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;2 KB&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Flash-ROM ===&lt;br /&gt;
&lt;br /&gt;
Das [[Speicher#Flash-ROM | &#039;&#039;&#039;Flash-ROM&#039;&#039;&#039;]] der AVRs dient als Programmspeicher. Über den Programmieradapter werden die kompilierten Programme vom PC an den Controller übertragen und im Flash-ROM abgelegt. Bei der Programmausführung wird das ROM [[Digitaltechnik#Word | Wort]] für Wort ausgelesen und ausgeführt. Es lässt sich aber auch zur Speicherung von Daten nutzen (z.&amp;amp;nbsp;B. Texte für ein [[LCD]]). Vom laufenden Programm aus kann man das ROM normalerweise nur lesen, nicht beschreiben. Es kann beliebig oft ausgelesen werden, aber theoretisch nur ~10.000 mal beschrieben werden.&lt;br /&gt;
&lt;br /&gt;
=== EEPROM ===&lt;br /&gt;
&lt;br /&gt;
Das [[Speicher#EEPROM |&#039;&#039;&#039;EEPROM&#039;&#039;&#039;]] ist wie das Flash ein nichtflüchtiger Speicher, die Daten bleiben also auch nach dem Ausschalten der Betriebsspannung erhalten. Es kann beliebig oft gelesen und mindestens 100.000 mal beschrieben werden. Bei den AVRs kann man es z.&amp;amp;nbsp;B. als Speicher für Messwerte oder Einstellungen benutzen. &lt;br /&gt;
&lt;br /&gt;
=== RAM ===&lt;br /&gt;
&lt;br /&gt;
Das [[Speicher#RAM |&#039;&#039;&#039;RAM&#039;&#039;&#039;]] ist ein flüchtiger Speicher, d.h. die Daten gehen nach dem Ausschalten verloren. Es kann beliebig oft gelesen und beschrieben werden, weshalb es sich zur Speicherung von Variablen eignet für die die Register R0-R31 nicht ausreichen. Daneben dient es als Speicherort für den Stack, auf dem z.&amp;amp;nbsp;B. bei Unterprogrammaufrufen (rcall) die Rücksprungadresse gespeichert wird (siehe [[AVR-Tutorial:_SRAM | AVR-Tutorial: SRAM]]).&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
=== Flash-ROM ===&lt;br /&gt;
&lt;br /&gt;
Die erste und wichtigste Anwendung des Flash-ROMs kennen wir bereits: Das Speichern von Programmen, die wir nach dem Assemblieren dort hineingeladen haben. Nun sollen aber auch vom laufenden Programm aus Daten ausgelesen werden. &lt;br /&gt;
&lt;br /&gt;
Um die Daten wieder auszulesen, muss man die Adresse, auf die zugegriffen werden soll, in den &#039;&#039;&#039;Z-Pointer&#039;&#039;&#039; laden. Der Z-Pointer besteht aus den Registern &#039;&#039;&#039;R30&#039;&#039;&#039; (Low-Byte) und &#039;&#039;&#039;R31&#039;&#039;&#039; (High-Byte), daher kann man das Laden einer Konstante wie gewohnt mit dem Befehl &#039;&#039;&#039;ldi&#039;&#039;&#039; durchführen. Statt R30 und R31 kann man übrigens einfach &#039;&#039;&#039;ZL&#039;&#039;&#039; und &#039;&#039;&#039;ZH&#039;&#039;&#039; schreiben, da diese Synonyme bereits in der include-Datei m8def.inc definiert sind. &lt;br /&gt;
&lt;br /&gt;
Wenn die richtige Adresse erstmal im Z-Pointer steht, geht das eigentliche Laden der Daten ganz einfach mit dem Befehl &#039;&#039;&#039;lpm&#039;&#039;&#039;. Dieser Befehl, der im Gegensatz zu out, ldi usw. keine Operanden hat, veranlasst das Laden des durch den Z-Pointer addressierte Byte aus dem Programmspeicher in das Register &#039;&#039;&#039;R0&#039;&#039;&#039;, von wo aus man es weiterverarbeiten kann. &lt;br /&gt;
&lt;br /&gt;
Jetzt muss man nur noch wissen, wie man dem Assembler überhaupt beibringt, dass er die von uns festgelegte Daten im ROM plazieren soll, und wie man dann an die Adresse kommt an der sich diese Daten befinden. Um den Programmspeicher mit Daten zu füllen, gibt es die Direktiven .db und .dw. In der Regel benötigt man nur .db, was folgendermaßen funktioniert: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
daten:&lt;br /&gt;
    .db 12, 20, 255, 0xFF, 0b10010000&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Direktiven wie .db sind Anweisungen an den Assembler, keine Prozessorbefehle. Von denen kann man sie durch den vorangestellten Punkt unterscheiden. In diesem Fall sagen wir dem Assembler, dass er die angegebenen Bytes nacheinander im Speicher platzieren soll; wenn man die Zeile also assembliert, erhält man eine Hex-Datei, die nur diese Daten enthält.&lt;br /&gt;
&lt;br /&gt;
Aber was soll das &#039;&#039;&#039;daten:&#039;&#039;&#039; am Anfang der Zeile? Bis jetzt haben wir Labels nur als Sprungmarken verwendet, um den Befehlen &#039;&#039;&#039;rcall&#039;&#039;&#039; und &#039;&#039;&#039;rjmp&#039;&#039;&#039; zu sagen, an welche Stelle im Programm gesprungen werden soll. Würden wir in diesem Fall &#039;&#039;&#039;rjmp daten&#039;&#039;&#039; im Programm stehen haben, dann würde die Programmausführung zur Stelle &#039;&#039;&#039;daten:&#039;&#039;&#039; springen, und versuchen die sinnlosen Daten als Befehle zu interpretieren - was mit Sicherheit dazu führt, dass der Controller Amok läuft. &lt;br /&gt;
&lt;br /&gt;
Statt nach &#039;&#039;&#039;daten:&#039;&#039;&#039; zu springen, sollten wir die Adresse besser in den Z-Pointer laden. Da der Z-Pointer aus zwei Bytes besteht, brauchen wir dazu zweimal den Befehl &#039;&#039;&#039;ldi&#039;&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
    ldi ZL, LOW(daten*2)    ; Low-Byte der Adresse in Z-Pointer&lt;br /&gt;
    ldi ZH, HIGH(daten*2)   ; High-Byte der Adresse in Z-Pointer&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie man sieht, ist das Ganze sehr einfach: Man kann die Labels im Assembler direkt wie Konstanten verwenden. Über die Multiplikation der Adresse mit zwei sollte man sich erst mal keine Gedanken machen: &amp;quot;Das ist einfach so.&amp;quot; Wer es genauer wissen will schaut [[AVR-Tutorial:_Mehrfachverzweigung#Z-Pointer_leicht_verst.C3.A4ndlich | hier]] nach.&lt;br /&gt;
&lt;br /&gt;
Um zu zeigen wie das alles konkret funktioniert, ist das folgende Beispiel nützlich:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt; &lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ldi     R16, 0xFF&lt;br /&gt;
    out     DDRB, R16               ; Port B: Ausgang&lt;br /&gt;
&lt;br /&gt;
    ldi     ZL, LOW(daten*2)        ; Low-Byte der Adresse in Z-Pointer&lt;br /&gt;
    ldi     ZH, HIGH(daten*2)       ; High-Byte der Adresse in Z-Pointer&lt;br /&gt;
&lt;br /&gt;
    lpm                             ; durch Z-Pointer adressiertes Byte&lt;br /&gt;
                                    ; in R0 laden&lt;br /&gt;
    out     PORTB, R0               ; an PORTB ausgeben&lt;br /&gt;
&lt;br /&gt;
ende:   &lt;br /&gt;
    rjmp ende                       ; Endlosschleife&lt;br /&gt;
&lt;br /&gt;
daten:&lt;br /&gt;
    .db 0b10101010&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man dieses Programm assembliert und in den Controller überträgt, dann kann man auf den an Port B angeschlossenen LEDs das mit &#039;&#039;&#039;.db 0b10101010&#039;&#039;&#039; im Programmspeicher abgelegte Bitmuster sehen. &lt;br /&gt;
&lt;br /&gt;
Eine häufige Anwendung von &#039;&#039;&#039;lpm&#039;&#039;&#039; ist das Auslesen von Zeichenketten (&amp;quot;Strings&amp;quot;) aus dem Flash-ROM und die Ausgabe an den seriellen Port oder ein LCD. Das folgende Programm gibt in einer Endlosschleife den Text &amp;quot;AVR-Assembler ist ganz einfach&amp;quot;, gefolgt von einem Zeilenumbruch, an den UART aus. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
.def temp = r16&lt;br /&gt;
.def temp1 = r17&lt;br /&gt;
&lt;br /&gt;
.equ CLOCK = 4000000                ; Frequenz des Quarzes&lt;br /&gt;
.equ BAUD = 9600                    ; Baudrate&lt;br /&gt;
.equ UBRRVAL = CLOCK/(BAUD*16)-1    ; Baudratenteiler&lt;br /&gt;
 &lt;br /&gt;
; hier geht das Programmsegment los&lt;br /&gt;
&lt;br /&gt;
.CSEG &lt;br /&gt;
.org 0&lt;br /&gt;
    ldi     r16, low(RAMEND)            ; Stackpointer initialisieren&lt;br /&gt;
    out     SPL, r16                    &lt;br /&gt;
    ldi     r16, high(RAMEND)&lt;br /&gt;
    out     SPH, r16                    &lt;br /&gt;
&lt;br /&gt;
    ldi     temp, LOW(UBRRVAL)          ; Baudrate einstellen&lt;br /&gt;
    out     UBRRL, temp&lt;br /&gt;
    ldi     temp, HIGH(UBRRVAL)&lt;br /&gt;
    out     UBRRH, temp&lt;br /&gt;
                                    &lt;br /&gt;
    ldi     temp, (1&amp;lt;&amp;lt;URSEL)|(3&amp;lt;&amp;lt;UCSZ0) ; Frame-Format: 8 Bit&lt;br /&gt;
    out     UCSRC, temp&lt;br /&gt;
    sbi     UCSRB, TXEN                 ; TX (Senden) aktivieren&lt;br /&gt;
&lt;br /&gt;
loop:&lt;br /&gt;
    ldi     ZL, LOW(text*2)             ; Adresse des Strings in den&lt;br /&gt;
    ldi     ZH, HIGH(text*2)            ; Z-Pointer laden&lt;br /&gt;
    rcall   print                       ; Funktion print aufrufen&lt;br /&gt;
    rcall   wait                        ; kleine Pause&lt;br /&gt;
    rjmp    loop                        ; das Ganze wiederholen&lt;br /&gt;
&lt;br /&gt;
; kleine Pause&lt;br /&gt;
wait:&lt;br /&gt;
    ldi     temp,0&lt;br /&gt;
wait_1:&lt;br /&gt;
    ldi     temp1,0&lt;br /&gt;
wait_2:&lt;br /&gt;
    dec     temp1&lt;br /&gt;
    brne    wait_2&lt;br /&gt;
    dec     temp&lt;br /&gt;
    brne    wait_1&lt;br /&gt;
    ret&lt;br /&gt;
&lt;br /&gt;
; print: sendet die durch den Z-Pointer adressierte Zeichenkette&lt;br /&gt;
&lt;br /&gt;
print:&lt;br /&gt;
    lpm                                 ; Erstes Byte des Strings nach R0 lesen&lt;br /&gt;
    tst     R0                          ; R0 auf 0 testen&lt;br /&gt;
    breq    print_end                   ; wenn 0, dann zu print_end&lt;br /&gt;
    mov     r16, r0                     ; Inhalt von R0 nach R16 kopieren&lt;br /&gt;
    rcall   sendbyte                    ; UART-Sendefunktion aufrufen&lt;br /&gt;
    adiw    ZL, 1                       ; Adresse des Z-Pointers um 1 erhöhen&lt;br /&gt;
    rjmp    print                       ; wieder zum Anfang springen&lt;br /&gt;
print_end:&lt;br /&gt;
    ret&lt;br /&gt;
&lt;br /&gt;
; sendbyte: sendet das Byte aus R16 über das UART&lt;br /&gt;
&lt;br /&gt;
sendbyte:&lt;br /&gt;
    sbis    UCSRA, UDRE                 ; warten bis das UART bereit ist&lt;br /&gt;
    rjmp    sendbyte&lt;br /&gt;
    out     UDR, r16&lt;br /&gt;
    ret&lt;br /&gt;
&lt;br /&gt;
; Konstanten werden hier im Flash abgelegt&lt;br /&gt;
&lt;br /&gt;
text:&lt;br /&gt;
    .db &amp;quot;AVR-Assembler ist ganz einfach&amp;quot;,10,13,0 &lt;br /&gt;
    ; Stringkonstante, durch eine 0 abgeschlossen&lt;br /&gt;
    ; die 10 bzw. 13 sind Steuerzeichen für Wagenrücklauf und neue Zeile&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neuere AVR-Controller besitzen einen erweiterten Befehlssatz. Darunter befindet sich auch der folgende Befehl:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
    lpm     r16, Z+&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl liest ein Byte aus dem Flash und speichert es in einem beliebigen Register, hier r16. Danach wird der Zeiger Z um eins erhöht. Für die neuen Controller, wie ATmegas kann das Codebeispiel also so abgeändert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
; print: sendet die durch den Z-Pointer adressierte Zeichenkette&lt;br /&gt;
print:&lt;br /&gt;
    lpm     r16, Z+         ; Erstes Byte des Strings nach r16 lesen&lt;br /&gt;
    tst     r16             ; r16 auf 0 testen&lt;br /&gt;
    breq    print_end       ; wenn 0, dann zu print_end&lt;br /&gt;
    rcall   sendbyte        ; UART-Sendefunktion aufrufen&lt;br /&gt;
    rjmp    print           ; wieder zum Anfang springen&lt;br /&gt;
print_end:&lt;br /&gt;
    ret&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man bei .db einen Text in doppelten Anführungszeichen angibt, werden die Zeichen automatisch in die entsprechenden ASCII-Codes umgerechnet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
    .db     &amp;quot;Test&amp;quot;, 0               &lt;br /&gt;
    ; ist äquivalent zu&lt;br /&gt;
    .db     84, 101, 115, 116, 0&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit das Programm das Ende der Zeichenkette erkennen kann, wird eine 0 an den Text angehängt. &lt;br /&gt;
&lt;br /&gt;
Das ist doch schonmal sehr viel praktischer, als jeden Buchstaben einzeln in ein Register zu laden und abzuschicken. Und wenn man statt &#039;&#039;&#039;sendbyte&#039;&#039;&#039; einfach die Routine &#039;&#039;&#039;lcd_data&#039;&#039;&#039; aus dem 4. Teil des Tutorials aufruft, dann funktioniert das gleiche sogar mit dem LCD!&lt;br /&gt;
&lt;br /&gt;
==== Neue Assemblerbefehle ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
    lpm                             ; Liest das durch den Z-Pointer&lt;br /&gt;
                                    ; addressierte Byte aus dem Flash-ROM&lt;br /&gt;
                                    ; in das Register R0 ein. &lt;br /&gt;
&lt;br /&gt;
    lpm     [Register], Z           ; Macht das gleiche wie lpm, jedoch in&lt;br /&gt;
                                    ; ein beliebiges Register&lt;br /&gt;
&lt;br /&gt;
    lpm     [Register], Z+          ; Erhöht zusätzlich den Z-Zeiger&lt;br /&gt;
&lt;br /&gt;
    tst     [Register]              ; Prüft, ob Inhalt eines Registers&lt;br /&gt;
                                    ; gleich 0 ist.&lt;br /&gt;
&lt;br /&gt;
    breq    [Label]                 ; Springt zu [Label], wenn der&lt;br /&gt;
                                    ; vorhergehende Vergleich wahr ist. &lt;br /&gt;
&lt;br /&gt;
    adiw    [Register], [Konstante] ; Addiert eine Konstante zu einem&lt;br /&gt;
                                    ; Registerpaar. [Register] bezeichnet das&lt;br /&gt;
                                    ; untere der beiden Register.&lt;br /&gt;
                                    ; Kann nur auf die Registerpaare&lt;br /&gt;
                                    ; R25:R24, R27:R26, R29:R28 und R31:R30&lt;br /&gt;
                                    ; angewendet werden. &lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== EEPROM ===&lt;br /&gt;
&lt;br /&gt;
Den Flash Speicher kann man also benutzen, um dort Daten abzulegen, die sich während eines Programmlaufs nicht verändern. Irgendwelche Tabellen oder konstante Texte. Aber des öfteren möchte man auch die Möglichkeit haben, Daten zu speichern und wieder zu lesen, die sich während des Programmlaufs ändern. Ganz besonders möchte man eine Speicherfläche zur Verfügung haben, die ihren Inhalt auch dann behält, wenn dem µC die Versorgungsspannung abgedreht wird. Man denke z.B. an irgendwelche Konfigurationsdaten oder an Informationen, wie weit der µC in der Bearbeitung von Daten vorangekommen ist oder irgendwelche Statistikdaten, die auch nach einem Stromausfall noch verfügbar sein sollen. In solchen Fällen kommt das EEPROM zum Einsatz&lt;br /&gt;
&lt;br /&gt;
==== Lesen ====&lt;br /&gt;
&lt;br /&gt;
Als erstes muss geprüft werden, ob ein vorheriger Schreibzugriff schon abgeschlossen ist. Danach wird die EEPROM-Adresse von der gelesen werden soll in das IO-Registerpaar &#039;&#039;&#039;EEARH/EEARL&#039;&#039;&#039; (EEPROM Address Register) geladen. Da der ATmega8 mehr als 256 Byte EEPROM hat, passt die Adresse nicht in ein einziges 8-Bit-Register, sondern muss in zwei Register aufgeteilt werden: EEARH bekommt das obere Byte der Adresse, EEARL das untere Byte. Dann löst man den Lesevorgang durch das Setzen des Bits &#039;&#039;&#039;EERE&#039;&#039;&#039; (EEPROM Read Enable) im IO-Register &#039;&#039;&#039;EECR&#039;&#039;&#039; (EEPROM Control Register) aus. Das gelesene Byte kann sofort aus dem IO-Register &#039;&#039;&#039;EEDR&#039;&#039;&#039; (EEPROM Data Register) in ein normales CPU-Register kopiert und dort weiterverarbeitet werden.&lt;br /&gt;
&lt;br /&gt;
Wie auch das Flash-ROM kann man das EEPROM über den ISP-Programmer programmieren. Die Daten, die im EEPROM abgelegt werden sollen, werden wie gewohnt mit .db angegeben; allerdings muss man dem Assembler natürlich sagen, dass es sich hier um Daten für das EEPROM handelt. Das macht man durch die Direktive &#039;&#039;&#039;.eseg&#039;&#039;&#039;, woran der Assembler erkennt, dass alle nun folgenden Daten für das EEPROM bestimmt sind. &lt;br /&gt;
&lt;br /&gt;
Damit man die Bytes nicht von Hand abzählen muss um die Adresse herauszufinden, kann man auch im EEPROM-Segment wieder Labels einsetzen und diese im Assemblerprogramm wie Konstanten verwenden. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; hier geht die Programmsektion los&lt;br /&gt;
.cseg&lt;br /&gt;
&lt;br /&gt;
    ldi     r16, low(RAMEND)            ; Stackpointer initialisieren&lt;br /&gt;
    out     SPL, r16                    &lt;br /&gt;
    ldi     r16, high(RAMEND)&lt;br /&gt;
    out     SPH, r16                    &lt;br /&gt;
&lt;br /&gt;
    ldi     r16, 0xFF&lt;br /&gt;
    out     DDRB, r16                   ; Port B Ausgang&lt;br /&gt;
&lt;br /&gt;
    ldi     ZL,low(daten)               ; Z-Zeiger laden&lt;br /&gt;
    ldi     ZH,high(daten)&lt;br /&gt;
    rcall   EEPROM_read                 ; Daten aus EEPROM lesen&lt;br /&gt;
    out     PORTB, r16&lt;br /&gt;
&lt;br /&gt;
loop:   &lt;br /&gt;
    rjmp loop&lt;br /&gt;
&lt;br /&gt;
EEPROM_read:&lt;br /&gt;
    sbic    EECR,EEWE                   ; prüfe ob der vorherige Schreibzugriff&lt;br /&gt;
                                        ; beendet ist&lt;br /&gt;
    rjmp    EEPROM_read                 ; nein, nochmal prüfen&lt;br /&gt;
&lt;br /&gt;
    out     EEARH, ZH                   ; Adresse laden&lt;br /&gt;
    out     EEARL, ZL    &lt;br /&gt;
    sbi     EECR, EERE                  ; Lesevorgang aktivieren&lt;br /&gt;
    in      r16, EEDR                   ; Daten in CPU Register kopieren&lt;br /&gt;
    ret&lt;br /&gt;
&lt;br /&gt;
; Daten im EEPROM definieren&lt;br /&gt;
.eseg&lt;br /&gt;
daten:&lt;br /&gt;
    .db     0b10101010&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man dieses Programm assembliert, erhält man außer der .hex-Datei noch eine Datei mit der Endung &#039;&#039;&#039;.eep&#039;&#039;&#039;. Diese Datei enthält die Daten aus dem EEPROM-Segment (.eseg), und muss zusätzlich zu der hex-Datei in den Controller programmiert werden. &lt;br /&gt;
&lt;br /&gt;
Das Programm gibt die Binärzahl 0b10101010 an den Port B aus, das heißt jetzt sollte jede zweite LED leuchten.&lt;br /&gt;
&lt;br /&gt;
Natürlich kann man auch aus dem EEPROM Strings lesen und an den UART senden: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
.def temp = r16&lt;br /&gt;
&lt;br /&gt;
.equ CLOCK = 4000000                ; Frequenz des Quarzes&lt;br /&gt;
&lt;br /&gt;
.equ BAUD = 9600                    ; Baudrate&lt;br /&gt;
.equ UBRRVAL = CLOCK/(BAUD*16)-1    ; Baudratenteiler&lt;br /&gt;
 &lt;br /&gt;
; hier geht das Programmsegment los&lt;br /&gt;
&lt;br /&gt;
.CSEG &lt;br /&gt;
 &lt;br /&gt;
; Hauptprogramm&lt;br /&gt;
main:&lt;br /&gt;
    ldi     temp, LOW(RAMEND)           ; Stackpointer initialisieren&lt;br /&gt;
    out     SPL, temp&lt;br /&gt;
    ldi     temp, HIGH(RAMEND)&lt;br /&gt;
    out     SPH, temp&lt;br /&gt;
                          &lt;br /&gt;
    ldi     temp, LOW(UBRRVAL)          ; Baudrate einstellen&lt;br /&gt;
    out     UBRRL, temp&lt;br /&gt;
    ldi     temp, HIGH(UBRRVAL)&lt;br /&gt;
    out     UBRRH, temp&lt;br /&gt;
                                    &lt;br /&gt;
    ldi     temp, (1&amp;lt;&amp;lt;URSEL)|(3&amp;lt;&amp;lt;UCSZ0) ; Frame-Format: 8 Bit&lt;br /&gt;
    out     UCSRC, temp&lt;br /&gt;
    sbi     UCSRB, TXEN                 ; TX (Senden) aktivieren&lt;br /&gt;
 &lt;br /&gt;
    ldi     ZL, low(text1)              ; ersten String senden&lt;br /&gt;
    ldi     ZH, high(text1)             ; Z-Pointer laden&lt;br /&gt;
    rcall   EEPROM_print&lt;br /&gt;
    &lt;br /&gt;
    ldi     ZL, low(text2)              ; zweiten String senden&lt;br /&gt;
    ldi     ZH, high(text2)             ; Z-Pointer laden&lt;br /&gt;
    rcall   EEPROM_print&lt;br /&gt;
&lt;br /&gt;
loop:   &lt;br /&gt;
    rjmp    loop                        ; Endlosschleife&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; EEPROM Lesezugriff auf Strings + UART Ausgabe&lt;br /&gt;
&lt;br /&gt;
EEPROM_print:&lt;br /&gt;
    sbic    EECR,EEWE           ; prüf ob der vorherige Schreibzugriff&lt;br /&gt;
                                ; beendet ist&lt;br /&gt;
    rjmp    EEPROM_print        ; nein, nochmal prüfen&lt;br /&gt;
&lt;br /&gt;
    out     EEARH, ZH           ; Adresse laden&lt;br /&gt;
    out     EEARL, ZL&lt;br /&gt;
    &lt;br /&gt;
    sbi     EECR, EERE          ; Lesevorgang aktivieren&lt;br /&gt;
    in      temp, EEDR          ; Daten in CPU Register kopieren&lt;br /&gt;
    tst     temp                ; auf 0 testen (=Stringende)&lt;br /&gt;
    breq    eep_print_end       ; falls 0, Funktion beenden&lt;br /&gt;
    rcall   sendbyte            ; ansonsten Byte senden...&lt;br /&gt;
    adiw    ZL,1                ; Adresse um 1 erhöhen...&lt;br /&gt;
    rjmp    EEPROM_print        ; und zum Anfang der Funktion&lt;br /&gt;
eep_print_end:&lt;br /&gt;
    ret&lt;br /&gt;
&lt;br /&gt;
; sendbyte: sendet das Byte aus &amp;quot;data&amp;quot; über den UART&lt;br /&gt;
&lt;br /&gt;
sendbyte:&lt;br /&gt;
    sbis    UCSRA, UDRE         ; warten bis das UART bereit ist&lt;br /&gt;
    rjmp    sendbyte&lt;br /&gt;
    out     UDR, temp&lt;br /&gt;
    ret&lt;br /&gt;
&lt;br /&gt;
; hier wird der EEPROM-Inhalt definiert&lt;br /&gt;
&lt;br /&gt;
.ESEG&lt;br /&gt;
&lt;br /&gt;
text1:&lt;br /&gt;
    .db     &amp;quot;Strings funktionieren auch &amp;quot;, 0&lt;br /&gt;
text2:&lt;br /&gt;
    .db     &amp;quot;im EEPROM&amp;quot;,10,13, 0&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Schreiben ====&lt;br /&gt;
&lt;br /&gt;
Als erstes muss geprüft werden, ob ein vorheriger Schreibzugriff schon abgeschlossen ist. Danach wird die EEPROM-Adresse, auf die geschrieben wird, in das IO-Register &#039;&#039;&#039;EEAR&#039;&#039;&#039; (&#039;&#039;&#039;EE&#039;&#039;&#039;PROM &#039;&#039;&#039;A&#039;&#039;&#039;ddress &#039;&#039;&#039;R&#039;&#039;&#039;egister) geladen. Dann schreibt man die Daten, welche man auf der im Adressregister abgespeicherten Position ablegen will ins Register &#039;&#039;&#039;EEDR&#039;&#039;&#039; (&#039;&#039;&#039;EE&#039;&#039;&#039;PROM &#039;&#039;&#039;D&#039;&#039;&#039;ata &#039;&#039;&#039;R&#039;&#039;&#039;egister). Als nächstes setzt man das &#039;&#039;&#039;EEMWE&#039;&#039;&#039; Bit im EEPROM-Kontrollregister &#039;&#039;&#039;EECR&#039;&#039;&#039; (&#039;&#039;&#039;EE&#039;&#039;&#039;PROM &#039;&#039;&#039;C&#039;&#039;&#039;ontrol &#039;&#039;&#039;R&#039;&#039;&#039;egister) um den Schreibvorgang vorzubereiten. Nun wird es zeitkritisch - es darf nun keinesfalls ein Interrupt dazwischenfahren - denn man muss innerhalb von 4 Taktzyklen das &#039;&#039;&#039;EEWE&#039;&#039;&#039; Bit setzen um den Schreibvorgang auszulösen. Um das unter allen Bedingungen sicherzustellen werden die Interrupts kurz gesperrt. Danach startet der Schreibvorgang und läuft automatisch ab. Wenn er beendet ist, wird von der Hardware das &#039;&#039;&#039;EEWE&#039;&#039;&#039; Bit im Register &#039;&#039;&#039;EECR&#039;&#039;&#039; wieder gelöscht.&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel werden Zeichen per UART und Interrupt empfangen und nacheinander im EEPROM gespeichert. Per Terminalprogramm kann man nun bis zu 512 Zeichen in den EEPROM schreiben. Per Programmieradapter kann man denn EEPROM wieder auslesen und seine gespeicherten Daten anschauen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
.def temp      = r16&lt;br /&gt;
.def sreg_save = r17&lt;br /&gt;
&lt;br /&gt;
.equ CLOCK = 4000000&lt;br /&gt;
&lt;br /&gt;
.equ BAUD = 9600&lt;br /&gt;
.equ UBRRVAL = CLOCK/(BAUD*16)-1&lt;br /&gt;
 &lt;br /&gt;
; hier geht das Programmsegment los&lt;br /&gt;
&lt;br /&gt;
.CSEG&lt;br /&gt;
.org 0x00&lt;br /&gt;
    rjmp    main&lt;br /&gt;
 &lt;br /&gt;
.org URXCaddr&lt;br /&gt;
    rjmp    int_rxc&lt;br /&gt;
 &lt;br /&gt;
; Hauptprogramm&lt;br /&gt;
main:&lt;br /&gt;
    ldi     temp, LOW(RAMEND)           ; Stackpointer initialisieren&lt;br /&gt;
    out     SPL, temp&lt;br /&gt;
    ldi     temp, HIGH(RAMEND)&lt;br /&gt;
    out     SPH, temp&lt;br /&gt;
                          &lt;br /&gt;
    ldi     temp, LOW(UBRRVAL)          ; Baudrate einstellen&lt;br /&gt;
    out     UBRRL, temp&lt;br /&gt;
    ldi     temp, HIGH(UBRRVAL)&lt;br /&gt;
    out     UBRRH, temp&lt;br /&gt;
 &lt;br /&gt;
                                   &lt;br /&gt;
    ldi     temp, (1&amp;lt;&amp;lt;URSEL)|(3&amp;lt;&amp;lt;UCSZ0) ; Frame-Format: 8 Bit&lt;br /&gt;
    out     UCSRC, temp&lt;br /&gt;
 &lt;br /&gt;
    sbi     UCSRB, RXCIE                ; Interrupt bei Empfang&lt;br /&gt;
    sbi     UCSRB, RXEN                 ; RX (Empfang) aktivieren&lt;br /&gt;
&lt;br /&gt;
    ldi     ZL,low(daten)               ; der Z-Zeiger wird hier exclusiv&lt;br /&gt;
    ldi     ZH,high(daten)              ; für die Datenadressierung verwendet&lt;br /&gt;
    &lt;br /&gt;
    sei                                 ; Interrupts global aktivieren&lt;br /&gt;
    &lt;br /&gt;
loop:   &lt;br /&gt;
    rjmp    loop                        ; Endlosschleife (ABER Interrupts!)&lt;br /&gt;
        &lt;br /&gt;
; Interruptroutine wird ausgeführt,&lt;br /&gt;
; sobald ein Byte über den UART empfangen wurde&lt;br /&gt;
&lt;br /&gt;
int_rxc:&lt;br /&gt;
    push    temp                        ; temp auf dem Stack sichern&lt;br /&gt;
    in      temp,sreg                   ; SREG sicher, muss praktisch in jeder&lt;br /&gt;
                                        ; Interruptroutine gemacht werden&lt;br /&gt;
    push    temp&lt;br /&gt;
    &lt;br /&gt;
    in      temp, UDR                   ; empfangenes Byte lesen&lt;br /&gt;
    rcall   EEPROM_write                ; Byte im EEPROM speichern&lt;br /&gt;
    adiw    ZL,1                        ; Zeiger erhöhen&lt;br /&gt;
    cpi     ZL,low(EEPROMEND+1)         ; Vergleiche den Z Zeiger&lt;br /&gt;
    ldi     temp,high(EEPROMEND+1)      ; mit der maximalen EEPROM Adresse +1&lt;br /&gt;
    cpc     ZH,temp&lt;br /&gt;
    brne    int_rxc_1                   ; wenn ungleich, springen&lt;br /&gt;
    ldi     ZL,low(Daten)               ; wenn gleich, Zeiger zurücksetzen&lt;br /&gt;
    ldi     ZH,high(Daten)&lt;br /&gt;
int_rxc_1:&lt;br /&gt;
&lt;br /&gt;
    pop     temp&lt;br /&gt;
    out     sreg,temp&lt;br /&gt;
    pop     temp                        ; temp wiederherstellen&lt;br /&gt;
    reti&lt;br /&gt;
&lt;br /&gt;
; der eigentliche EEPROM Schreibzugriff&lt;br /&gt;
; Adresse in ZL/ZH&lt;br /&gt;
; Daten in temp&lt;br /&gt;
&lt;br /&gt;
EEPROM_write:&lt;br /&gt;
    sbic    EECR, EEWE                  ; prüfe ob der letzte Schreibvorgang beendet ist&lt;br /&gt;
    rjmp    EEPROM_write                ; wenn nein, nochmal prüfen&lt;br /&gt;
&lt;br /&gt;
    out     EEARH, ZH                   ; Adresse schreiben&lt;br /&gt;
    out     EEARL, ZL                   ; &lt;br /&gt;
    out     EEDR,temp                   ; Daten  schreiben&lt;br /&gt;
    in      sreg_save,sreg              ; SREG sichern&lt;br /&gt;
    cli                                 ; Interrupts sperren, die nächsten&lt;br /&gt;
                                        ; zwei Befehle dürfen NICHT&lt;br /&gt;
                                        ; unterbrochen werden&lt;br /&gt;
    sbi     EECR,EEMWE                  ; Schreiben vorbereiten&lt;br /&gt;
    sbi     EECR,EEWE                   ; Und los !&lt;br /&gt;
    out     sreg, sreg_save             ; SREG wieder herstellen&lt;br /&gt;
    ret&lt;br /&gt;
&lt;br /&gt;
; hier wird der EEPROM-Inhalt definiert&lt;br /&gt;
.ESEG&lt;br /&gt;
&lt;br /&gt;
Daten:  &lt;br /&gt;
    .db     0&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SRAM ===&lt;br /&gt;
&lt;br /&gt;
Die Verwendung des SRAM wird in einem anderen Kapitel erklärt: [[AVR-Tutorial: SRAM]]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[Adressierung]]&lt;br /&gt;
&lt;br /&gt;
{{Navigation_zurückhochvor|&lt;br /&gt;
zurücktext=UART|&lt;br /&gt;
zurücklink=AVR-Tutorial: UART|&lt;br /&gt;
hochtext=Inhaltsverzeichnis|&lt;br /&gt;
hochlink=AVR-Tutorial|&lt;br /&gt;
vortext=Timer|&lt;br /&gt;
vorlink=AVR-Tutorial: Timer}}&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Tutorial]]&lt;br /&gt;
[[Kategorie:Speicher und Dateisysteme]]&lt;/div&gt;</summary>
		<author><name>Jonebohne</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Aufl%C3%B6sung_und_Genauigkeit&amp;diff=46759</id>
		<title>Auflösung und Genauigkeit</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Aufl%C3%B6sung_und_Genauigkeit&amp;diff=46759"/>
		<updated>2010-04-28T14:16:23Z</updated>

		<summary type="html">&lt;p&gt;Jonebohne: /* Auflösung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Das Problem ==&lt;br /&gt;
&lt;br /&gt;
Immer wieder werden die beiden Parameter Auflösung und Genauigkeit verwechselt. Oft  werden Meßgeräte oder Sensoren mit einer hohen Auflösung beworben. Wenn man jedoch genauer nachliest, oder manchmal auch genauer nachmißt, stellt man fest, daß zwar viel Auflösung vorhanden ist, aber die Genauigkeit doch eher zu wünschen übrig läßt. Dieser Artikel soll Klarheit schaffen.&lt;br /&gt;
&lt;br /&gt;
== Auflösung ==&lt;br /&gt;
&lt;br /&gt;
Auflösung ist das Vermögen eines Messgerätes (z.&amp;amp;nbsp;B. [[AD-Wandler]]), zwischen zwei geringfügig verschiedenen Messwerten reproduzierbar einen Unterschied zu erkennen. Dabei spielt der absolute Betrag keine Rolle. Es werden nur relative Unterschiede betrachtet. Ein 8 Bit Wandler mit 5V Referenzspannung kann beispielsweise die Eingangsspannung in 20mV Schritten auflösen. Wenn die Eingangsspannungen zwischen zwei Messungen näher als 20 mV zusammen liegen kann der AD-Wandler keinen Unterschied messen (Es sei denn, es liegt zufällig eine Grenze zwischen zwei [[Quantisierung | Quantisierungsstufen]] dazwischen). Mit einem 16 Bit AD-Wandler und 5V Referenzspannung kann man die Eingangsspannung bereits auf 76 &amp;amp;mu;V auflösen, 256 mal besser als mit dem 8-Bit Wandler.&lt;br /&gt;
&lt;br /&gt;
== Genauigkeit ==&lt;br /&gt;
&lt;br /&gt;
Genauigkeit gibt an, wie weit das Meßergebnis vom physikalisch absolut wahren Ergebnis abweicht (egal ob digital oder analog). Es werden dabei absolute Meßwerte betrachtet und mit einem physikalisch nahezu perfekten Meßgerät verglichen. Z.B. zeigen zwei Armbanduhren die Zeit mit einer 1 Sekunde Auflösung an (hier wird bewußt die umgangssprachliche Formulierung „auf eine Sekunde genau“ vermieden). Wenn eine davon eine [[Funkuhr]] ist , wird diese immer die absolut richtige Zeit anzeigen, wie sie im Moment physikalisch exakt generiert werden kann. Die Zweite ist eine normale Quarzuhr und wird nach einem Monat vielleicht 10 Sekunden Abweichung anzeigen. Sie ist dann ungenau.&lt;br /&gt;
&lt;br /&gt;
== Eichen, Kalibrieren, Justieren ==&lt;br /&gt;
&lt;br /&gt;
Die meisten Meßgeräte müssen nach der Herstellung vor der Verwendung noch eingestellt werden, um das Maximum an Genauigkeit zu erreichen, welches durch die Schaltung möglich ist. Hierbei spricht man von justieren.&lt;br /&gt;
&lt;br /&gt;
Um jedoch ein Meßgerät justieren zu können, muß der Fehler, die sog. Meßungenauigkeit bekannt sein. Diese kann durch &#039;&#039;&#039;Kalibrieren&#039;&#039;&#039; oder &#039;&#039;&#039;Eichen&#039;&#039;&#039; ermittelt werden.&lt;br /&gt;
&lt;br /&gt;
Von &#039;&#039;&#039;Eichen&#039;&#039;&#039; spricht man, wenn die sog. &#039;&#039;&#039;Kalibrierung&#039;&#039;&#039; durch das Eichamt durchgeführt wird.&lt;br /&gt;
&lt;br /&gt;
Zum &#039;&#039;&#039;Eichen&#039;&#039;&#039; oder &#039;&#039;&#039; Kalibrieren&#039;&#039;&#039; benötigt man ein  Meßgerät, welches eine kleinere Messunsicherheit hat, als der Prüfling. Diese Meßgeräte nennt man Eichmaß oder Referenz oder auch nationale Normale. Mit solchen Normalen wird auch im Eichamt ein Meßgerät kalibriert. Das ist sowohl ein technisch sehr aufwendiger als auch amtlich beglaubigter Vorgang und dementsprechend teuer. Das zu eichende Meßgerät wird während einer Messung über den gesamten Meßbereich mit dem Eichmaß verglichen und die Meßunsicherheit des Prüflings ermittelt. Das Eichen ist normalerweise nur für Meßgeräte vorgeschrieben, die für den Handel o.ä. verwendet werden, wie z.&amp;amp;nbsp;B. Waagen, Zapfsäulen, Portowaagen ect.&lt;br /&gt;
&lt;br /&gt;
Normalerweise spricht man aber von  &#039;&#039;&#039;Kalibrieren&#039;&#039;&#039;. Der Vorgang ist physikalisch der Gleiche. Dabei gibt es in Deutschland eine sog. Kalibrierpyramide. Dessen oberste Stelle ist die PTB, also das physikalisch technische Institut in Braunschweig. Die PTB kalibriert die &amp;quot;Normale&amp;quot; oder Referenzen der einzelnen Kalibrierlaboratorien. Darunter ist der DKD angesiedelt, dieser wiederum kalibriert Meßgeräte und Normale, die für Werkskalibrierungen verwendet werden. Mit den vom DKD kalibrierten Meßgeräten und Normalen werden dann Werkskalibrierungen durchgeführt, wie z.&amp;amp;nbsp;B. die Kalibrierung von Multimetern, Waagen, Messuhren ect. Kalibrieren kann man auch selber, indem man ein genaues Meßgerät mit seiner selbstgebauten Schaltung vergleicht und diese dementsprechend den Fehler bzw. die Abweichung seiner Schaltung ermittelt.&lt;br /&gt;
&lt;br /&gt;
Ist der Fehler zu groß, so muss bzw. kann die Schaltung oder das Meßgerät neu justiert werden, um den Fehler zu minimieren.&lt;br /&gt;
&lt;br /&gt;
== Veranschaulichung ==&lt;br /&gt;
&lt;br /&gt;
Wenn einem der Unterschied zwischen Genauigkeit und Auflösung langsam klar wird, dann versteht man auch, wie z.&amp;amp;nbsp;B. Multimeter Spannungen mit 40000 Schritten anzeigen (0,0025% = 25ppm Auflösung) aber „nur“ auf 0,1 bis 0,3% Genauigkeit kalibriert sind.&lt;br /&gt;
 &lt;br /&gt;
Nachfolgend sind die prinzipiellen Kennlinien einiger Meßgeräte dargestellt, um den Unterschied zwischen Auflösung und Genauigkeit bildlich darzustellen.  Auf der X-Achse ist dabei der wahre Meßwert dargestellt, die Y-Achse zeigt das Meßergebnis. Die Kennlinien sind bewußt extrem dargestellt um das Prinzip zu veranschaulichen.&lt;br /&gt;
&lt;br /&gt;
[[bild:kennlinien.png |640px]]&lt;br /&gt;
&lt;br /&gt;
* K1 ist die Kennlinie eines idealen Meßgerätes. Es verfügt über eine unendlich hohe Auflösung, hat keinerlei Meßfehler (Genauigkeit) und ist vollkommen linear.&lt;br /&gt;
* K2 ist die Kennlinie eines AD-Wandlers mit hoher Genauigkeit. Die Auflösung ist zwar relativ niedrig (große Treppenstufen der Kennlinie), dafür liegen die Meßergebnisse nah an der idealen Kennlinie (hohe Genauigkeit).&lt;br /&gt;
* K3 ist die Kennlinie eines AD-Wandlers mit geringer Genauigkeit. Die Meßwerte weichen stark von der idealen Kennlinie ab, die hohe Auflösung nützt hier eher wenig.&lt;br /&gt;
* K4 ist ein weiterer Fall einer realen Kennlinie mit nichtlinearem Verlauf, resultierend in geringer Genauigkeit.&lt;br /&gt;
&lt;br /&gt;
== Zusammenfassung ==&lt;br /&gt;
&lt;br /&gt;
Auflösung und Genauigkeit sind zwei verschiedene Parameter. Eine hohe Auflösung bedeutet nicht automatisch eine hohe Genauigkeit und umgekehrt. Bei manchen Messungen braucht man nur eine hohe Auflösung mit geringer Genauigkeit, wenn beispielsweise vergleichende Messungen durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.ptb.de www.ptb.de]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: Grundlagen]]&lt;/div&gt;</summary>
		<author><name>Jonebohne</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_PWM&amp;diff=46684</id>
		<title>AVR PWM</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_PWM&amp;diff=46684"/>
		<updated>2010-04-27T16:28:46Z</updated>

		<summary type="html">&lt;p&gt;Jonebohne: /* Tiefpassfilter-Berechnung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Vorwort==&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist noch nicht vollständig!&lt;br /&gt;
Und außerdem überschneidet er sich teilweise mit dem Tutorial, weil PWM und Timer zum Verständnis praktisch dasselbe sind. &lt;br /&gt;
Vielleicht kann ja jemand, der gerade dabei ist, sich diese Dinge anzueignen, die Beschreibung vorantreiben (erweitern/entschlacken)?&lt;br /&gt;
&lt;br /&gt;
Hier sollen die Möglichkeiten und die Funktionsweise der PWM mit AVRs erläutert werden, so daß Anfänger auf ihrem Weg zum Ziel unterstützt werden, ohne sich erst durch die wenig erklärenden Beiträge im Forum zu quälen.&lt;br /&gt;
Auch wenn das Verständnis (hoffentlich) dann nicht mehr aus dem Datenblatt kommen muß, ist dieses für die spezifischen Einstellungen und Feinheiten absolut notwendig. Aber mit dieser Übersicht sollte es leichter fallen, die relevanten Informationen schneller zu finden.&lt;br /&gt;
&lt;br /&gt;
Ich gehe dabei von meiner Situation aus: &amp;quot;Gerade mit AVRs angefangen, die LED blinkt, Taster wird abgefragt, schonmal von PWM gehört und unter den AVR Pins welche mit OC.. entdeckt, das hängt damit irgendwie zusammen.&amp;quot;&lt;br /&gt;
Man sollte sich auch um die Prozessorfrequenz gekümmert haben, also die [[AVR_Fuses]] entsprechend gesetzt haben.&lt;br /&gt;
&lt;br /&gt;
Wer in Begriff steht, sein erstes Board zu ätzen, sollte sich über die verschiedenen Möglichkeiten, die die OCnx Pins bieten, informiert haben.&lt;br /&gt;
&lt;br /&gt;
Übrigens lässt es sich besser lesen, wenn man sein Browserfenster so schmal macht, daß der Text in eine schöne Spalte gezwungen wird.&lt;br /&gt;
&lt;br /&gt;
==Einführung==&lt;br /&gt;
&lt;br /&gt;
Im AVR-GCC-Tutorial werden im Abschnitt DAC-Optionen ([http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#DAC_.28Digital_Analog_Converter.29           link]) verschiedene Möglichkeiten angesprochen, analoge Spannungen zu generieren.&lt;br /&gt;
&lt;br /&gt;
Darunter fällt auch die [[Pulsweitenmodulation]], bei der durch schnelles Ein- und  Ausschalten eines Ausgangs (über einen Filter) eine [[analog]]e Spannung generiert werden kann.&lt;br /&gt;
&lt;br /&gt;
Beim Dimmen von Lichtquellen wirkt die Trägheit des Auges als Filter, wenn z.&amp;amp;nbsp;B. eine LED im Mittel die Hälfte der Zeit eingeschaltet ist, scheint es also, als würde sie nur halb so hell leuchten.&lt;br /&gt;
&lt;br /&gt;
Bei Motoren läßt sich PWM gut zum Dosieren des Stroms einsetzen, ohne große Verluste zu haben.  Für einen Teil der Zeit wird also der volle Motorstrom eingeschaltet, d.h. das Drehmoment ist maximal.&lt;br /&gt;
&lt;br /&gt;
Die Rechtecksignale lassen sich mit Mikrocontrollern auf zwei Wegen erzeugen:&lt;br /&gt;
&lt;br /&gt;
PWM per Software&lt;br /&gt;
* Kostet Rechenzeit, erhöhter Softwareaufwand&lt;br /&gt;
* Signalausgabe auf jedem I/O-Pin möglich&lt;br /&gt;
* Höhere Kanalanzahl möglich&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
PWM per Hardware&lt;br /&gt;
* Läuft unabhängig vom Programm&lt;br /&gt;
* Bietet mehr Möglichkeiten bei gleichem Softwareaufwand &lt;br /&gt;
* Signalausgabe nur auf bestimmten, fest vorgegebenen Pins möglich&lt;br /&gt;
* Nur begrenzte Anzahl an PWM-Kanälen vorhanden (viele verbreitete AVR-Typen haben 2 bis 3, neuere auch mehr) &lt;br /&gt;
&lt;br /&gt;
Alles was mit Pulsen und Modulation zu tun hat, hat auch was mit Zeit zu tun - denn im Prinzip soll mit einer bestimmten Frequenz für eine bestimmte Dauer ein Pin eingeschaltet werden.&lt;br /&gt;
&lt;br /&gt;
Alles was bei Mikrocontrollern mit Zeit zu tun hat, hat wahrscheinlich auch etwas mit einem Timer bzw. Counter zu tun.&lt;br /&gt;
&lt;br /&gt;
==Timer / Counter==&lt;br /&gt;
&lt;br /&gt;
Unter [[Timer]] bzw. [[Counter]] (T/C) steht noch nicht soviel, aber man sollte kurz mal reinsehen, oder mehr dazu schreiben, oder die fehlende Verknüpfung anlegen.&lt;br /&gt;
&lt;br /&gt;
Ein Timer ist nichts anderes als ein selbständiger Zähler (Counter), der mit einer bestimmten Frequenz einen Wert raufzählt. Und zwar in Hardware, also unabhängig vom Programm. Seine Zählfrequenz wird vom Prozessortakt abgeleitet, das erledigt der [[Prescaler]] in einstellbaren Schritten (Frequenzteiler).&lt;br /&gt;
&lt;br /&gt;
Der Zählerstand läßt sich sowohl in Software als auch von der Hardware selbst überwachen - und schon lassen sich damit periodisch Ereignisse auslösen.&lt;br /&gt;
&lt;br /&gt;
Deswegen lassen sich die T/C für viele Zwecke verwenden, wir wollen den T/C für PWM nutzen (trotzdem gleich eine Übersicht über die verschiedenen Modi).&lt;br /&gt;
&lt;br /&gt;
Es lohnt sich natürlich, das Prinzip der T/C verstanden zu haben. Ein Blick ins GCC-Tutorial lohnt, die Atmel Application Note 130: Setup and Use the AVR Timers schadet auch nicht. &lt;br /&gt;
&lt;br /&gt;
Wie schon angedeutet, gibt es - je nach AVR - einen oder mehrere T/C . Sie unterscheiden sich erwartungsgemäß durch ihre Parameter und Optionen, z.&amp;amp;nbsp;B. die Auflösung, Frequenz, Zählweise und andere Betriebsmodi.&lt;br /&gt;
&lt;br /&gt;
Und natürlich auch durch den Namen, der sich auch in den [[Register]]n widerspiegelt: Sie werden nämlich numeriert (im Folgenden hier und im Datenblatt mit Platzhalter n). &lt;br /&gt;
&lt;br /&gt;
T/C 0 ist beim tiny2313 der &#039;einfache&#039; mit 8 Bit Auflösung (das Aus-An Verhältnis läßt sich in 256 Stufen einstellen), T/C 1 dagegen hat eine Auflösung von 16 Bit und bietet einige weitere Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
=== 8 oder 16 Bit ? ===&lt;br /&gt;
Außer der Tatsache, daß die Auflösung bei 16 Bit mit 65536 Stufen um einiges größer ist, gibt es noch folgende Unterschiede:&lt;br /&gt;
&lt;br /&gt;
* Er verwendet einige 16 Bit Register&lt;br /&gt;
** Schreiben/Lesen dieser Register erfolgt in Schritten&lt;br /&gt;
* &lt;br /&gt;
&lt;br /&gt;
Mit dem Zähler alleine kann man noch nicht so viel anfangen. Ausgedacht wurde deswegen außerdem die&lt;br /&gt;
&lt;br /&gt;
=== Output Compare Unit ===&lt;br /&gt;
&lt;br /&gt;
was soviel bedeutet wie Ausgangsvergleichseinheit.&lt;br /&gt;
&lt;br /&gt;
Jeder Zähler hat eine oder mehrere voneinander unabhängige Output Compare Units (OC), auch wieder mit den dazugehörigen Registern.&lt;br /&gt;
&lt;br /&gt;
Die verschiedenen OCs und ihre Register werden mit Buchstaben (&#039;A&#039;, &#039;B&#039;) benannt. (Im PWM Modus hängt das direkt mit den Pins zusammen: OC1B ist der Ausgang der OC des T/C 1. Dazu gleich mehr..)&lt;br /&gt;
&lt;br /&gt;
Die OC vergleicht den Zählerstand (im Register TCNTn) ständig mit ihren eigenen Registerinhalten (0CRnx). Wenn diese übereinstimmen, passiert etwas.&lt;br /&gt;
&lt;br /&gt;
Was passiert, wird bestimmt durch die&lt;br /&gt;
&lt;br /&gt;
=== Betriebsmodi ===&lt;br /&gt;
&lt;br /&gt;
Der Zähler zählt. Die OC Unit vergleicht dessen Zählerstand mit einem Wert. Wenn diese übereinstimmen, kann etwas passieren.&lt;br /&gt;
&lt;br /&gt;
Weil es hier gleich mit den Einstellungen in den Registern losgeht, noch ein Hinweis:&lt;br /&gt;
&lt;br /&gt;
Die Kontrolle über das Verhalten der Zähler und OCs wird über Register vorgenommen, deren Namen nichts mit den OC Units zu tun haben!&lt;br /&gt;
Die Einstellungen sind lediglich auf zwei Register verteilt, die Timer/Counter Control Register - TCCRnA &amp;amp; TCCRnB.&lt;br /&gt;
&lt;br /&gt;
Ein paar Notizen:&lt;br /&gt;
* In verschiedenen Modi haben auch Bits in den Registern eine andere Bedeutung!&lt;br /&gt;
* Meist können Interrupts ausgelöst werden.&lt;br /&gt;
* Es kann häufig auch der Zählerstand per Software verändert werden.&lt;br /&gt;
* Die Frequenz der ausgegebenen Waveform hängt ab von&lt;br /&gt;
** I/O Clock (CPU)&lt;br /&gt;
** Prescaler&lt;br /&gt;
** Counter Modus&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die verschiedenen Modi (vorerst die vom 8 Bit Zähler):&lt;br /&gt;
&lt;br /&gt;
* Normal (evtl. für Software PWM)&lt;br /&gt;
* Clear Timer on Compare (CTC) (eingeschränkte PWM)&lt;br /&gt;
* Fast PWM&lt;br /&gt;
* Phase Correct PWM&lt;br /&gt;
&lt;br /&gt;
Dazu hier noch folgende Begriffe im Zusammenhang mit dem Zähler:&lt;br /&gt;
&lt;br /&gt;
 BOTTOM: 0x00&lt;br /&gt;
 MAX   : 0xFF bei 8 Bit, 0xFFFF bei 16 Bit&lt;br /&gt;
 TOP   : MAX oder OCRnx&lt;br /&gt;
&lt;br /&gt;
==== Normal==== &lt;br /&gt;
(evtl. für Software PWM)&lt;br /&gt;
&lt;br /&gt;
Der Zähler zählt rauf (BOTTOM-&amp;gt;MAX), und wird nicht zurückgesetzt, sondern läuft einfach über, und setzt dabei sein Overflow-Flag.&lt;br /&gt;
Dieser Modus wird zur PWM nicht empfohlen, weil er im Vergleich mit Hardware-PWM viel CPU-Zeit benötigt - das ist logisch:&lt;br /&gt;
Bei jedem Nulldurchgang müsste man einen Interrupt verwenden, der dann eine Routine ausführt, die den Ausgang umschaltet. Und man müsste den Zählerstand manipulieren, um die Pulslänge zu verändern.&lt;br /&gt;
&lt;br /&gt;
Für die verhältnismäßig langsame (Menschenzeit) Programmsteuerung ist dieser Modus aber ideal. Während das Hauptprogramm i.A. einfach endlos durchläuft, wird die Programmzeit durch einen Timer(-Interrupt) in Time-Slots gerastert (z.&amp;amp;nbsp;B. 1/10s). Damit lassen sich bequem Wartezeiten bzw. zeitabhängige Ereignisse steuern, ohne das Programm anzuhalten.&lt;br /&gt;
&lt;br /&gt;
====  Clear Timer on Compare (CTC)==== &lt;br /&gt;
(eingeschränkte PWM)&lt;br /&gt;
&lt;br /&gt;
Der Zähler zählt hoch, bis er mit OCRnx übereinstimmt (BOTTOM-&amp;gt;OCRnx: Match!) und wird dann auf Null gesetzt. Der maximale Wert lässt sich also über das Register OCRnx komfortabel bestimmen.&lt;br /&gt;
&lt;br /&gt;
Konkret bedeutet das, dass die in diesem Modus vom Prescaler erzeugte Basisfrequenz nochmals durch den Wert von OCRnx geteilt wird.&lt;br /&gt;
&lt;br /&gt;
Für PWM:&lt;br /&gt;
&lt;br /&gt;
Wenn eingestellt ist, dass der OC-Ausgang bei jedem Match umschaltet (toggle), entspricht der eingestellt Wert dem Pulsweitenverhältnis.&lt;br /&gt;
Bei OCRnx=128 des 8 Bit T/C wäre also etwa die Hälfte der Zeit der Pin eingeschaltet.&lt;br /&gt;
&lt;br /&gt;
Allerdings kann das beim T/C 0 des tiny2313 nur der Ausgang A (OC0A). Also ins Datenblatt gucken!&lt;br /&gt;
&lt;br /&gt;
====  Fast PWM====&lt;br /&gt;
&lt;br /&gt;
Einer von den zwei eigentlichen PWM-Betriebsarten der Counter.&lt;br /&gt;
&lt;br /&gt;
Zählt von BOTTOM bis TOP, wobei TOP entweder 0xFF oder OCRnx sein kann.&lt;br /&gt;
&lt;br /&gt;
Bei einem Match wird im&lt;br /&gt;
&lt;br /&gt;
a) nicht-invertierenden Modus&lt;br /&gt;
der Zähler gelöscht, und bei BOTTOM gesetzt&lt;br /&gt;
&lt;br /&gt;
b) invertierenden Modus&lt;br /&gt;
der Zähler gesetzt, und bei BOTTOM gelöscht.&lt;br /&gt;
&lt;br /&gt;
Klingt theoretisch kompliziert, praktisch invertiert es nur den Ausgang.&lt;br /&gt;
Aber der Vergleichswert muss anscheinend ständig aktualisiert werden!?&lt;br /&gt;
&lt;br /&gt;
Dieser Modus hat eine asymmetrische Ausgangsform, weil der Ausgang periodisch umgeschaltet wird (also immer nach der gleichen Zeit) und dann nach Ablauf der variablen Pulslänge wieder invertiert wird.&lt;br /&gt;
&lt;br /&gt;
Und es gibt noch einen Toggle-Modus, der allerdings nur für den Ausgang OC0A zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
====  Phase Correct PWM==== &lt;br /&gt;
&lt;br /&gt;
Ist nur halb so schnell wie Fast PWM, dafür aber mit symmetrischer Wellenform.&lt;br /&gt;
&lt;br /&gt;
Erreicht wird das, indem von BOTTOM-&amp;gt;TOP gezählt wird, und dann wieder runter: TOP-BOTTOM.&lt;br /&gt;
&lt;br /&gt;
TOP kann entweder 0xFF oder OCRnx sein.&lt;br /&gt;
&lt;br /&gt;
Auch hier gibt es wieder den nicht-invertierenden, den invertierenden, und den toggle-Modus (nicht an OC0B).&lt;br /&gt;
&lt;br /&gt;
Der symmetrische PWM-Modus wird gerne für Motorsteuerungen verwendet, wenn man den Strom in den Motorwindungen messen möchte.  Da man nicht während der Schaltzeitpunkte der H-Brückentransistoren messen möchte (noise), braucht man einen Messzeitpunkt der maximal weit von diesen Schaltzeitpunkten entfernt ist.  Die BOTTOM und TOP Werte des Counters bieten genau dies, da sie in der Mitte des High- bzw. Lowpegels liegen.&lt;br /&gt;
&lt;br /&gt;
==Praktisches Vorgehen==&lt;br /&gt;
&lt;br /&gt;
* Pins low setzen&lt;br /&gt;
* Pins als Ausgang konfigurieren.&lt;br /&gt;
* Geeignete Wellenform ermitteln&lt;br /&gt;
* Registerinformationen für ausgewählten T/C im Datenblatt aufschlagen&lt;br /&gt;
* Modus &amp;amp; Prescaler setzen und damit starten&lt;br /&gt;
** Bits in Control-Register TCCRnA &amp;amp; TCCRnB schreiben. Siehe [[Bitmanipulation]]&lt;br /&gt;
* Vergleichswert OCRnx setzen&lt;br /&gt;
&lt;br /&gt;
==Programmbeispiele==&lt;br /&gt;
&lt;br /&gt;
===PWM per Software===&lt;br /&gt;
====Pseudocode====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//Initialisierung&lt;br /&gt;
pwm_phase = 0   // von 0 bis 100(99) ergibt ein moduliertes Signal&lt;br /&gt;
pwm_soll = 30  // Tastverhältnis in Prozent (Werte von 0..100)&lt;br /&gt;
&lt;br /&gt;
//alle s Sekunden tue:&lt;br /&gt;
wenn pwm_soll = pwm_phase dann&lt;br /&gt;
  ausgang = LOW&lt;br /&gt;
wenn pwm_phase++ = 100 dann&lt;br /&gt;
  pwm_phase = 0&lt;br /&gt;
  ausgang = HIGH&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das Tastverhältnis ist &amp;lt;math&amp;gt;t_\text{HIGH}=\frac{100}{\text{pwm}\_\text{soll}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Frequenz ist &amp;lt;math&amp;gt;f=\frac{100}{s} \text{Hz}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====ASM====&lt;br /&gt;
Der Code ist nicht von mir, ich hab den John Honniball auch nicht um Erlaubnis gefragt, den Code hier zu posten. Trozdem finde ich das Ganze recht nützlich und hab&#039; es mir trozdem erlaubt:&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
; ledpwm.asm --- drive a blue LED with PWM                     21/04/2006&lt;br /&gt;
; Copyright (c) 2006 John Honniball&lt;br /&gt;
&lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
            .org 0x0000&lt;br /&gt;
&lt;br /&gt;
; Blue LED on Port B bit 2&lt;br /&gt;
            .equ LEDPORT = PortB&lt;br /&gt;
            .equ LEDBIT = 0&lt;br /&gt;
&lt;br /&gt;
; This program drives a single LED connected to the AVR&#039;s I/O port.  It&lt;br /&gt;
; is connected so that the cathode of the LED is wired to the AVR pin,&lt;br /&gt;
; and the anode of the LED is wired to the 5V power supply via a&lt;br /&gt;
; resistor.  The value of that resistor depends on the colour of the LED,&lt;br /&gt;
; but is usually a few hundred ohms.&lt;br /&gt;
&lt;br /&gt;
; We control the brightness of the LED with Pulse Width Modulation (PWM),&lt;br /&gt;
; for two reasons.  Firstly, we have no analog outputs on the AVR chip,&lt;br /&gt;
; only digital ones.  Secondly, a LED&#039;s brightness  does not respond&lt;br /&gt;
; linearly to variations in supply voltage, but it responds much better&lt;br /&gt;
; to PWM.&lt;br /&gt;
&lt;br /&gt;
; Pulsating LED looks better if it never quite goes &amp;quot;off&amp;quot;, but cycles from&lt;br /&gt;
; full brightness to a dim state, and back again&lt;br /&gt;
            .equ MINBRIGHT = 25&lt;br /&gt;
            .equ MAXBRIGHT = 255&lt;br /&gt;
&lt;br /&gt;
; This value controls how fast the LED cycles from bright to dim.  It is&lt;br /&gt;
; the number of PWM cycles that we generate for each step in the brightness&lt;br /&gt;
; ramp, up and down.  Larger numbers will make the pulsation slower.&lt;br /&gt;
            .equ NCYCLES = 1&lt;br /&gt;
&lt;br /&gt;
; Start of program execution after a Reset&lt;br /&gt;
            ldi r16,low(RAMEND)                     ; Initialise stack to top of RAM&lt;br /&gt;
            out SPL,r16&lt;br /&gt;
            ldi r16,high(RAMEND)&lt;br /&gt;
            out SPH,r16&lt;br /&gt;
&lt;br /&gt;
; Initialise the hardware&lt;br /&gt;
            ldi r16,0xff                            ; Set Port B to all outputs&lt;br /&gt;
            out DDRB,r16&lt;br /&gt;
&lt;br /&gt;
            sbi LEDPORT,LEDBIT                      ; Switch off blue LED by setting output pin high&lt;br /&gt;
&lt;br /&gt;
; Start with LED at its lowest level, then ramp up to maximum&lt;br /&gt;
dopwm:      ldi r17,MINBRIGHT                       ; R17 holds current brightness level&lt;br /&gt;
l1:         ldi r18,NCYCLES                         ; R18 counts PWM cycles, and hence pulsation speed&lt;br /&gt;
l2:         cbi LEDPORT,LEDBIT                      ; Output pin low, LED on&lt;br /&gt;
            mov r16,r17                             ; R16 controls length of delay (= R17)&lt;br /&gt;
            rcall delayn4us                         ; Call delay subroutine&lt;br /&gt;
            sbi LEDPORT,LEDBIT                      ; Output pin high, LED off&lt;br /&gt;
            ldi r16,255&lt;br /&gt;
            sub r16,r17                             ; R16 controls length of delay (= 255 - R17)&lt;br /&gt;
            rcall delayn4us                         ; Call delay subroutine&lt;br /&gt;
            dec r18                                 ; Decrement PWM cycle counter&lt;br /&gt;
            brne l2&lt;br /&gt;
            inc r17                                 ; Increase brightness by one step&lt;br /&gt;
            brne l1&lt;br /&gt;
&lt;br /&gt;
; Now ramp back down to the minimum brightness&lt;br /&gt;
            ldi r17,MAXBRIGHT                       ; R17 holds current brightness level&lt;br /&gt;
l3:         ldi r18,NCYCLES                         ; R18 counts PWM cycles, and hence pulsation speed&lt;br /&gt;
l4:         cbi LEDPORT,LEDBIT                      ; Output pin low, LED on&lt;br /&gt;
            mov r16,r17                             ; R16 controls length of delay (= R17)&lt;br /&gt;
            rcall delayn4us                         ; Call delay subroutine&lt;br /&gt;
            sbi LEDPORT,LEDBIT                      ; Output pin high, LED off&lt;br /&gt;
            ldi r16,255&lt;br /&gt;
            sub r16,r17                             ; R16 controls length of delay (= 255 - R17)&lt;br /&gt;
            rcall delayn4us                         ; Call delay subroutine&lt;br /&gt;
            dec r18                                 ; Decrement PWM cycle counter&lt;br /&gt;
            brne l4&lt;br /&gt;
            dec r17                                 ; Decrease brightness by one step&lt;br /&gt;
            cpi r17,MINBRIGHT                       ; Have we reached the minimum?&lt;br /&gt;
            brne l3&lt;br /&gt;
&lt;br /&gt;
            rjmp dopwm                              ; Loop back to start&lt;br /&gt;
&lt;br /&gt;
; DELAYN4US&lt;br /&gt;
; Delay for (R16 * 4) microseconds&lt;br /&gt;
delayn4us:  tst r16                                 ; R16 = 0? (no delay)&lt;br /&gt;
            breq dly4&lt;br /&gt;
dly2:       ldi r24,low(16)&lt;br /&gt;
            ldi r25,high(16)&lt;br /&gt;
dly3:       sbiw r24,1                              ; 2 cycles&lt;br /&gt;
            brne dly3                               ; 2 cycles&lt;br /&gt;
            dec r16&lt;br /&gt;
            brne dly2&lt;br /&gt;
dly4:       ret                                     ; Return to caller&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====C====&lt;br /&gt;
&lt;br /&gt;
Ich wollte das hier mal ergänzen. Ich bin zwar noch ein Newbie aber es funktioniert. Man darf es aber gerne verbessern und/oder löschen...&lt;br /&gt;
Lg Fabi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
#warning &amp;quot;F_CPU war noch nicht definiert, wird nun mit 4000000 definiert&amp;quot;&lt;br /&gt;
#define F_CPU 4000000UL    		/* Quarz mit 4.00000 Mhz  */&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{	&lt;br /&gt;
	DDRB=0xFF;				// Port B als Ausgang&lt;br /&gt;
	int pwm_phase=0, pwm_soll=30;		// Dimmerwert definieren&lt;br /&gt;
	while(1)&lt;br /&gt;
	{&lt;br /&gt;
		if(pwm_soll==pwm_phase)&lt;br /&gt;
		{&lt;br /&gt;
			PORTB=0x01;		// LED+ Widerstand mit PB0 und +5V verbunden&lt;br /&gt;
		}&lt;br /&gt;
		pwm_phase++;&lt;br /&gt;
		if(pwm_phase==100)&lt;br /&gt;
		{&lt;br /&gt;
			pwm_phase=0;&lt;br /&gt;
			PORTB=0x00;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
(Ich habe es als Dimmbare LED entworfen. Deswegen die Beschreibung.)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====BASCOM====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &#039; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===PWM per Hardware===&lt;br /&gt;
&lt;br /&gt;
===Programmbeispiele===&lt;br /&gt;
====ASM====&lt;br /&gt;
Für AtMega8.&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
.include   &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
   .def   temp      = r16&lt;br /&gt;
&lt;br /&gt;
start:&lt;br /&gt;
   ldi    temp, LOW  (RAMEND)&lt;br /&gt;
   out    SPL, temp&lt;br /&gt;
   ldi    temp, HIGH (RAMEND)&lt;br /&gt;
   out    SPH, temp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   ldi    temp, 0xFF&lt;br /&gt;
   out    DDRB, temp								;define PortB as output&lt;br /&gt;
&lt;br /&gt;
   ldi    temp, 0xF3&lt;br /&gt;
   out    TCCR1A, temp							;10bit Phase Correct PWM&lt;br /&gt;
&lt;br /&gt;
   ldi    temp, 0x0A&lt;br /&gt;
   out    TCCR1B, temp							;set Prescaler&lt;br /&gt;
&lt;br /&gt;
   sei&lt;br /&gt;
&lt;br /&gt;
main:&lt;br /&gt;
   ldi    temp, 0x1&lt;br /&gt;
   out    OCR1AH, temp							;set pwm pin 1 highbyte&lt;br /&gt;
&lt;br /&gt;
   ldi    temp, 0x00&lt;br /&gt;
   out    OCR1AL, temp							;set pwm pin 1 lowbyte&lt;br /&gt;
														;pin: PortB1&lt;br /&gt;
&lt;br /&gt;
   ldi    temp, 0x00&lt;br /&gt;
   out    OCR1BH, temp							;set pwm pin 2 highbyte&lt;br /&gt;
&lt;br /&gt;
   ldi    temp, 0x00&lt;br /&gt;
   out    OCR1BL, temp							;set pwm pin 2 lowbyte&lt;br /&gt;
														;pin: PortB2&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
loop: &lt;br /&gt;
	rjmp   loop&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====C====&lt;br /&gt;
Hier wird mit dem 16-Bit-Counter 1 im 8-Bit-Mode eine LED gedimmt.&lt;br /&gt;
Die Frequenz ist &lt;br /&gt;
:&amp;lt;math&amp;gt;f=\frac{\text{Taktfrequenz}}{\text{Prescaler}\cdot(1+\text{OCR0A})} \,\text{Hz}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
TCCR1A = (1&amp;lt;&amp;lt;WGM10)|(1&amp;lt;&amp;lt;COM1A1); // PWM, phase correct, 8 bit.&lt;br /&gt;
TCCR1B =  (1&amp;lt;&amp;lt;CS11) |(1&amp;lt;&amp;lt;CS10); // set clock/prescaler 1/64 -&amp;gt; enable counter&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
&lt;br /&gt;
PORTB = 0xff; // enable pull-ups for inputs, set outputs high, Pin LED auf 1 setzen&lt;br /&gt;
DDRB  =  1&amp;lt;&amp;lt;LED;    // Port B1 als Ausgang&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
&lt;br /&gt;
OCR1A=128; // LED 50%&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tiefpassfilter-Berechnung ==&lt;br /&gt;
Die PWM-Frequenz muß meistens mit einem Tiefpassfilter entfernt werden, da sie nachfolgende Verstärkerstufen übersteuert oder den Hörgenuss trübt. Ein einfacher RC-Tiefpass kann für Motorsteuerungen ausreichen, für Audioanwendungen ist der Abstand zwischen höchster Niederfrequenz und PWM-Frequenz zu klein. Ein aktives Filter mit Operationsverstärker kann die Lösung sein, oder ein passiver LC-Tiefpass. Dessen Berechnung mittels [http://www.aade.com AADE Filter Designer] soll hier an einem Fallbeispiel erläutert werden.&lt;br /&gt;
&lt;br /&gt;
Ein ATmega48 mit 20 MHz Quarz soll mittels 10 Bit &amp;quot;fast PWM&amp;quot; des 16 Bit- Timers 1 ein Stereosignal am Pin OC1A und OC1B ausgeben. Die PWM-Frequenz beträgt somit knapp 20 kHz, nach dem Abtasttheorem sind maximal 10 kHz Nutzsignal möglich. Mit der Faustregel &amp;quot;6dB pro Bit&amp;quot; erreichen wir einen Dynamikumfang oder Störabstand von 60 dB. Etwa dieselbe Unterdrückung sollte auch das Tiefpassfilter erreichen.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cauerfilter.png|thumb|right|400px|Cauer-Tiefpass mit 3,3mH und 10 mH Festinduktivität]]&lt;br /&gt;
Zunächst brauchen wir noch eine Abschätzung der zulässigen Ausgangsbelastung. Laut Datenblatt beträgt der maximal zulässige Strom pro Pin 40 mA, entsprechend einem 125 Ohm Widerstand von 5V nach Masse. Mit 10 bis 20 mA entsprechend 500 bis 250 Ohm als Maximalwert dürfte also nichts passieren. Der zeitliche Mittelwert liegt für Audioanwendungen bei 2,5V, also dem halben Maximalstrom. Ein hochohmiger Kopfhörer, z.&amp;amp;nbsp;B. 600 Ohm, läßt sich so noch ohne weitere Verstärker anschließen.&lt;br /&gt;
&lt;br /&gt;
Die größte Filtersteilheit erreicht das Cauer- oder Elliptic Filter, auf Kosten von größeren Phasenänderungen/ Gruppenlaufzeit gegenüber anderen Filtertypen. Wir starten also das Filterberechnungsprogramm mit den Vorgaben &amp;quot;lowpass&amp;quot;, &amp;quot;Cauer/Elliptic&amp;quot;, &amp;quot;3.Ordnung&amp;quot;, was eine Schaltung mit einer Induktivität und drei Kapazitäten berechnet. Den Ein- und Ausgangswiderstand geben wir erst mal irgendwo in dem genannten Bereich vor, die Durchlasswelligkeit kann auf 1 dB bleiben, Durchlassfrequenz wie gesagt 10000 Hz, die Sperrfrequenz etwas unterhalb der PWM-Frequenz, ca. 17500Hz, da der Dämpfungspol dann etwa auf 20 kHz fällt. Mit &amp;quot;analyze voltage insertion gain&amp;quot; berechnen wir eine Durchlasskurve und kontrollieren die korrekte Lage des Dämpfungspols. Jetzt variieren wir die beiden Widerstände, bis die Induktivität etwa einem leicht erhältlichen Normwert entspricht. Die drei Kondensatoren werden am Schluß ebenfalls mit dem nächsten Normwert bestückt. Sicherheitshalber kann man diese endgültige Schaltung noch mit einem [http://www.mikrocontroller.net/articles/Schaltungssimulation#Analog Schaltungssimulationsprogramm] überprüfen und die Bauteilwerte leicht korrigieren.&lt;br /&gt;
&lt;br /&gt;
Als Induktivität kommen eher die größeren Bauformen infrage, die &amp;quot;Garnrollen&amp;quot;-Form oder die axiale Bauform 77A von Fastron. Hier gilt: je größer desto höhere Güte, wie man aus den Katalogangaben zum Gleichstromwiderstand schließen kann. Von magnetischen Wechselfeldern wie etwa Schaltregler-Trafos sollte man ein paar Zentimeter Abstand halten.&lt;br /&gt;
&lt;br /&gt;
Im Bild  sind zwei Schaltungen für die genannten Frequenzen mit einer 3,3mH-Drossel und einer 10mH-Drossel gezeigt. Die Kurven sind noch mit verlustlosen Bauteilen und den berechneten krummen Bauteilwerten gezeichnet. Der Widerstand am Ausgang kann auch durch die Last wie der genannte Kopfhörer gebildet werden. Ein größerer Wert hat hier wenig Einfluß auf die Filterkurve, während der Widerstand am Eingang genau den vorgegebenen Wert haben sollte.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[AVR-Tutorial: PWM]]&lt;br /&gt;
* Beiträge im Forum [http://www.mikrocontroller.net/forum/4 Codesammlung], die den Begriff PWM enthalten: [http://www.mikrocontroller.net/search?query=pwm&amp;amp;forums%5B%5D=4 hier]&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]]&lt;/div&gt;</summary>
		<author><name>Jonebohne</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR&amp;diff=46636</id>
		<title>AVR-GCC-Tutorial/Die Timer und Zähler des AVR</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR&amp;diff=46636"/>
		<updated>2010-04-26T12:19:02Z</updated>

		<summary type="html">&lt;p&gt;Jonebohne: /* 16-Bit Timer/Counter */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die heutigen Mikrocontroller und insbesondere die RISC-[[AVR]]s sind für viele Steuerungsaufgaben zu schnell. Wenn wir beispielsweise eine [[LED]] oder Lampe blinken lassen wollen, können wir selbstverständlich nicht die CPU-Frequenz verwenden, da ja dann nichts mehr vom Blinken zu bemerken wäre.&lt;br /&gt;
&lt;br /&gt;
Wir brauchen also eine Möglichkeit, Vorgänge in Zeitabständen durchzuführen, die geringer als die Taktfrequenz des Controllers sind. Selbstverständlich sollte die resultierende Frequenz auch noch möglichst genau und stabil sein.&lt;br /&gt;
&lt;br /&gt;
Hier kommen die im AVR vorhandenen Timer/Counter zum Einsatz.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Ein Timer ist ganz einfach ein bestimmtes Register im µC, das völlig ohne Zutun des Programms, also per Hardware, hochgezählt wird. Das alleine wäre noch nicht allzu nützlich, wenn nicht dieses Hardwareregister bei bestimmten Zählerständen einen Interrupt auslösen könnte. &lt;br /&gt;
&lt;br /&gt;
Ein solches Ereignis ist der Overflow (Überlauf): Da die Bitbreite des Registers beschränkt ist, kommt es natürlich auch vor, dass der Zähler so hoch zählt, dass der nächste Zählerstand mit dieser Bitbreite nicht mehr darstellbar ist und der Zähler wieder auf 0 zurückgesetzt wird. Dieses Ereignis nennt man den Overflow und es ist möglich an dieses Ereignis einen Interrupt zu koppeln.&lt;br /&gt;
&lt;br /&gt;
Ein anderes Anwendungsgebiet ist das Zählen von Impulsen, welche über einen I/O-Pin zugeführt werden.&lt;br /&gt;
&lt;br /&gt;
Als Eingangstakt für die Timer/Counter kann entweder die CPU-Taktfrequenz, der Vorteiler-Ausgang oder ein an einen I/O-Pin angelegtes Signal verwendet werden. Wenn ein externes Signal verwendet wird, so darf dessen Frequenz nicht höher sein als die Hälfte des CPU-Taktes.&lt;br /&gt;
&lt;br /&gt;
Die folgenden Ausführungen beziehen sich auf den AT90S2313. Für andere Modelltypen müsst ihr euch die allenfalls notwendigen Anpassungen aus den Datenblättern der entsprechenden Controller herauslesen.&lt;br /&gt;
&lt;br /&gt;
== Der Vorteiler (Prescaler) ==&lt;br /&gt;
&lt;br /&gt;
Der Vorteiler dient dazu, den CPU-Takt vorerst um einen einstellbaren Faktor zu reduzieren. Die so geteilte Frequenz wird den Eingängen der Timer zugeführt.&lt;br /&gt;
&lt;br /&gt;
Wenn wir mit einem CPU-Takt von 4 MHz arbeiten und den Vorteiler auf 1024 einstellen, wird also der Timer mit einer Frequenz von 4 MHz / 1024, also mit &#039;&#039;&#039;ca.&#039;&#039;&#039; 4 kHz versorgt. Wenn also der Timer läuft, so wird das Zählregister (TCNTx) mit dieser Frequenz inkrementiert.&lt;br /&gt;
&lt;br /&gt;
== Timer-Bitzahlen verschiedener AVRs ==&lt;br /&gt;
&lt;br /&gt;
Wir unterscheiden grundsätzlich zwischen 8-Bit Timern, welche eine Auflösung von 256 (2^8) aufweisen und 16-Bit Timern mit einer Auflösung von 65536 (2^16). &lt;br /&gt;
&lt;br /&gt;
Alle AVR-Modelle verfügen über mindestens einen, teilweise sogar zwei, 8-Bit Timer.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
! AVR-Typ || Timer/Counter0 || Timer/Counter1 || Timer/Counter2&lt;br /&gt;
|- &lt;br /&gt;
| AT90S2313  ||  8 || 16 || -&lt;br /&gt;
|- &lt;br /&gt;
| ATtiny2313 ||  8 || 16 || -&lt;br /&gt;
|- &lt;br /&gt;
| ATmega8    || 8  || 16 || 8&lt;br /&gt;
|- &lt;br /&gt;
| ATmega88   || 8  || 16 || 8&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 8-Bit Timer/Counter ==&lt;br /&gt;
&lt;br /&gt;
Der 8-Bit Timer wird z.B bei AT90S2313 über folgende Register angesprochen (bei anderen Typen weitestgehend analog):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;TCCR0&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;T&#039;&#039;&#039;imer/&#039;&#039;&#039;C&#039;&#039;&#039;ounter &#039;&#039;&#039;C&#039;&#039;&#039;ontrol &#039;&#039;&#039;R&#039;&#039;&#039;egister&lt;br /&gt;
Timer &#039;&#039;&#039;0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In diesem Register stellen wir ein, wie wir den Timer/Counter verwenden möchten.&lt;br /&gt;
&lt;br /&gt;
Das Register ist wie folgt aufgebaut:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
! Bit&lt;br /&gt;
| 7|| 6|| 5|| 4|| 3|| 2|| 1|| 0&lt;br /&gt;
|- &lt;br /&gt;
! Name&lt;br /&gt;
|| &#039;&#039;&#039;-&#039;&#039;&#039;|| &#039;&#039;&#039;-&#039;&#039;&#039;|| &#039;&#039;&#039;-&#039;&#039;&#039;|| &#039;&#039;&#039;-&#039;&#039;&#039;|| &#039;&#039;&#039;-&#039;&#039;&#039;|| &#039;&#039;&#039;CS02&#039;&#039;&#039;|| &#039;&#039;&#039;CS01&#039;&#039;&#039;|| &#039;&#039;&#039;CS00&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
! R/W&lt;br /&gt;
| R|| R|| R|| R|| R|| R/W|| R/W|| R/W&lt;br /&gt;
|- &lt;br /&gt;
! Initialwert&lt;br /&gt;
| 0|| 0|| 0|| 0|| 0|| 0|| 0|| 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CS02, CS01, CS00&#039;&#039;&#039; (&#039;&#039;&#039;C&#039;&#039;&#039;lock &#039;&#039;&#039;S&#039;&#039;&#039;elect Bits)&lt;br /&gt;
:Diese 3 Bits bestimmen die Quelle für den Timer/Counter:&lt;br /&gt;
&lt;br /&gt;
:{|  class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
! CS02 || CS01 || CS00 || Resultat&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| Stopp, Der Timer/Counter wird angehalten.&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| CPU-Takt&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| CPU-Takt / 8&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| CPU-Takt / 64&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| CPU-Takt / 256&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| CPU-Takt / 1024&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| Externer Pin &#039;&#039;&#039;TO&#039;&#039;&#039;, fallende Flanke&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| Externer Pin &#039;&#039;&#039;TO&#039;&#039;&#039;, steigende Flanke&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:Wenn als Quelle der externe Pin &#039;&#039;&#039;TO&#039;&#039;&#039; verwendet wird, so wird ein Flankenwechsel auch erkannt, wenn der Pin &#039;&#039;&#039;TO&#039;&#039;&#039; als Ausgang geschaltet ist.&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;TCNT0&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;T&#039;&#039;&#039;imer/&#039;&#039;&#039;C&#039;&#039;&#039;ou&#039;&#039;&#039;nt&#039;&#039;&#039;er Daten Register Timer &#039;&#039;&#039;0&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
Dieses ist als 8-Bit Aufwärtszähler mit Schreib- und Lesezugriff&lt;br /&gt;
realisiert. Wenn der Zähler den Wert 255 erreicht hat beginnt er beim&lt;br /&gt;
nächsten Zyklus wieder bei 0.&lt;br /&gt;
&lt;br /&gt;
{|  class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
! Bit&lt;br /&gt;
| 7|| 6|| 5|| 4|| 3|| 2|| 1|| 0&lt;br /&gt;
|- &lt;br /&gt;
! Name&lt;br /&gt;
| &#039;&#039;&#039;MSB&#039;&#039;&#039;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &#039;&#039;&#039;LSB&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
! R/W&lt;br /&gt;
| R/W|| R/W|| R/W|| R/W|| R/W|| R/W|| R/W|| R/W&lt;br /&gt;
|- &lt;br /&gt;
! Initialwert&lt;br /&gt;
| 0|| 0|| 0|| 0|| 0|| 0|| 0|| 0&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Um nun also den Timer0 in Betrieb zu setzen und ihn mit einer Frequenz von 1/8-tel des CPU-Taktes zählen zu lassen, schreiben wir die folgende Befehlszeile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    TCCR0 = (1&amp;lt;&amp;lt;CS01);&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Zähler zählt nun aufwärts bis 255, um dann wieder bei 0 zu beginnen. Der aktuelle Zählerstand steht in TCNT0. Bei jedem Überlauf von 255 auf 0 wird das Timer Overflow Flag &#039;&#039;&#039;TOV0&#039;&#039;&#039; im Timer Interrupt Flag &#039;&#039;&#039;TIFR&#039;&#039;&#039;-Register gesetzt und, falls so konfiguriert, ein entsprechender Timer-Overflow-Interrupt ausgelöst und die daran gebundene Interrupt-Routine abgearbeitet. Das TOV Flag &lt;br /&gt;
lässt sich durch das Hineinschreiben einer 1 und nicht wie erwartet einer 0 wieder zurücksetzen.&lt;br /&gt;
&lt;br /&gt;
=== Overflow Interrupt ===&lt;br /&gt;
&lt;br /&gt;
Jedesmal wenn der Timer seinen höchsten Wert erreicht hat, erfolgt ein Overflow und der Timer beginnt wieder bei 0 zu zählen. An diesen Overflow kann eine Funktion, die Overflow-ISR, gebunden werden. Damit hat man eine Möglichkeit, mit der man bestimmte Funktionalität in regelmässigen Zeitabständen ausführen lassen kann. Wie groß diese Zeitabstände sind, wird ausschliesslich von der Zählfrequenz des Timers und der Bitbreite des Timers (also dem höchsten Wert, den der Timer erreichen kann) bestimmt. Die Zählfrequenz wiederrum hängt von Taktfrequenz und dem eingestellten Vorteiler ab.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  // Timer 0 konfigurieren&lt;br /&gt;
  TCCR0 = (1&amp;lt;&amp;lt;CS01); // Prescaler 8&lt;br /&gt;
&lt;br /&gt;
  // Overflow Interrupt erlauben&lt;br /&gt;
  TIMSK |= (1&amp;lt;&amp;lt;TOIE0);&lt;br /&gt;
&lt;br /&gt;
  // Global Interrupts aktivieren&lt;br /&gt;
  sei();&lt;br /&gt;
&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    /* Sonstige Aktionen */&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
Der Overflow Interrupt Handler&lt;br /&gt;
wird aufgerufen, wenn TCNT0 von&lt;br /&gt;
255 auf 0 wechselt (256 Schritte),&lt;br /&gt;
d.h. ca. alle 2 ms&lt;br /&gt;
*/&lt;br /&gt;
ISR (TIMER0_OVF_vect)&lt;br /&gt;
{&lt;br /&gt;
  /* Interrupt Aktion alle&lt;br /&gt;
  (1000000/8)/256 Hz = 488,28125 Hz&lt;br /&gt;
  bzw.&lt;br /&gt;
  1/488,28125 s = 2,048 ms  &lt;br /&gt;
  */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Grundsätzlich kann man in einer ISR jeden beliebigen Code ausführen lassen. Allerdings sollte man sich an die Grundregeln der ISR Programmierung halten: Nur das tun was unbedingt notwendig ist. Eine ISR sollte (zeitlich gesehen) so kurz wie möglich aber so lang wie notwendig sein. Komplexe Ausgaben auf LCD óder gar auf die UART gehören nicht in eine ISR. Sie dauern einfach zu lange und blockieren so den Prozessor zu lange. Programme die mehrere Dinge quasi gleichzeitig machen, werden so zu lange blockiert.&lt;br /&gt;
&lt;br /&gt;
Möchte man die Interruptaktion &#039;&#039;genau&#039;&#039; alle 1 ms ausführen, ginge das nur über eine Manipulation des Zählerstands von TCNT0 in der iSR, d.h. Vorbelegung beim Init und Reload in der ISR. Die Idee ist es dabei, in TCNT0 einen Wert zu laden, so dass bis zum nächsten Overflow nicht mehr zb 256 Zähltakte notwendig sind, sondern entsprechend weniger. Es gibt bei moderneren AVRs allerdings einen eleganteren, automatischen Weg dies zu tun: den CTC Modus&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;CTC&#039;&#039;&#039; Clear Timer on Compare Match (Auto Reload) ===&lt;br /&gt;
&lt;br /&gt;
Im CTC Modus des Timers ist es möglich, anstelle der durch die Hardware bedingten Obergrenze des Timers, eine andere Zahl zu benutzen, an der der Timer einen Interrupt auslöst und wieder bei 0 zu zählen anfängt. Neben dem Aktivieren des CTC Modus genügt es dazu, einfach den gewünschten Endwert in ein spezielles Register, das OCRA0, zu laden. Und natürlich hat auch die ISR dann einen anderen Namen. Weitere Anmerkungen und Erläuterungen finden sich im CTC-Kapitel der 16-Bit Timer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Variablen für die Zeit&lt;br /&gt;
volatile unsigned int  millisekunden;&lt;br /&gt;
volatile unsigned int sekunde;&lt;br /&gt;
volatile unsigned int minute;&lt;br /&gt;
volatile unsigned int stunde;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  // Timer 0 konfigurieren&lt;br /&gt;
  TCCR0A = (1&amp;lt;&amp;lt;WGM01); // CTC Modus&lt;br /&gt;
  TCCR0B |= (1&amp;lt;&amp;lt;CS01); // Prescaler 8&lt;br /&gt;
  // ((1000000/8)/1000) = 125&lt;br /&gt;
  OCR0A = 125-1;&lt;br /&gt;
&lt;br /&gt;
  // Compare Interrupt erlauben&lt;br /&gt;
  TIMSK |= (1&amp;lt;&amp;lt;OCIE0A);&lt;br /&gt;
&lt;br /&gt;
  // Global Interrupts aktivieren&lt;br /&gt;
  sei();&lt;br /&gt;
&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    /*Hier kann die aktuelle Zeit&lt;br /&gt;
      ausgeben werden*/&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
Der Compare Interrupt Handler &lt;br /&gt;
wird aufgerufen, wenn &lt;br /&gt;
TCNT0 = OCR0A = 125-1 &lt;br /&gt;
ist (125 Schritte), d.h. genau alle 1 ms&lt;br /&gt;
*/&lt;br /&gt;
ISR (TIMER0_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
  millisekunden++;&lt;br /&gt;
  if(millisekunden == 1000)&lt;br /&gt;
  {&lt;br /&gt;
    sekunde++;&lt;br /&gt;
    millisekunden = 0;&lt;br /&gt;
    if(sekunde == 60)&lt;br /&gt;
    {&lt;br /&gt;
      minute++;&lt;br /&gt;
      sekunde = 0;&lt;br /&gt;
    }&lt;br /&gt;
    if(minute == 60)&lt;br /&gt;
    {&lt;br /&gt;
      stunde++;&lt;br /&gt;
      minute = 0;&lt;br /&gt;
    }&lt;br /&gt;
    if(stunde == 24)&lt;br /&gt;
    {&lt;br /&gt;
      stunde = 0;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anm.: In diesem Beispiel ist es egal, ob TCCR0B absolut gesetzt wird (TCCR0B = (1&amp;lt;&amp;lt;CS01)) oder der Prescaler-Wert zum alten Inhalt hinzugeODERt wird (TCCR0B |= (1&amp;lt;&amp;lt;CS01)). Die anderen Bits in TCCR0B sind nach dem Reset 0 und sollen auch 0 bleiben. Wenn man sicher nur bestimmte Bits ändern will, ist das ODER (bzw. UND mit dem Kehrwert) sicherer. Näheres dazu im Artikel [[Bitmanipulation]].&lt;br /&gt;
&lt;br /&gt;
== 16-Bit Timer/Counter ==&lt;br /&gt;
&lt;br /&gt;
Viele AVR-Modelle besitzen außer den 8-Bit Timern auch 16-Bit Timer. Die 16-Bit Timer/Counter sind etwas komplexer aufgebaut als die 8-Bit Timer/Counter, bieten dafür aber auch viel mehr Möglichkeiten, als da sind:&lt;br /&gt;
&lt;br /&gt;
* Die [[PWM]]-Betriebsart zur Erzeugung eines pulsweitenmodulierten Ausgangssignals. &lt;br /&gt;
* Vergleichswert-Überprüfung mit Erzeugung eines Ausgangssignals (Output Compare Match).&lt;br /&gt;
* Einfangen eines Eingangssignals mit Speicherung des aktuellen Zählerwertes (Input Capturing), mit zuschaltbarer Rauschunterdrückung (Noise Filtering).&lt;br /&gt;
&lt;br /&gt;
Folgende Register sind dem Timer/Counter 1 zugeordnet:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;TCCR1A&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;T&#039;&#039;&#039;imer/&#039;&#039;&#039;C&#039;&#039;&#039;ounter &#039;&#039;&#039;C&#039;&#039;&#039;ontrol &#039;&#039;&#039;R&#039;&#039;&#039;egister &#039;&#039;&#039;A&#039;&#039;&#039; Timer &#039;&#039;&#039;1&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
In diesem und dem folgenden Register stellen wir ein, wie wir den Timer/Counter verwenden möchten.&amp;lt;br /&amp;gt;&lt;br /&gt;
Das Register ist wie folgt aufgebaut:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
! Bit&lt;br /&gt;
| 7|| 6|| 5|| 4|| 3|| 2|| 1|| 0&lt;br /&gt;
|- &lt;br /&gt;
! Name&lt;br /&gt;
| &#039;&#039;&#039;COM1A1&#039;&#039;&#039;|| &#039;&#039;&#039;COM1A0&#039;&#039;&#039;|| &#039;&#039;&#039;-&#039;&#039;&#039;|| &#039;&#039;&#039;-&#039;&#039;&#039;|| &#039;&#039;&#039;-&#039;&#039;&#039;|| &#039;&#039;&#039;-&#039;&#039;&#039;|| &#039;&#039;&#039;PWM11&#039;&#039;&#039;|| &#039;&#039;&#039;PWM10&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
! R/W&lt;br /&gt;
| R/W|| R/W|| R|| R|| R|| R|| R/W|| R/W&lt;br /&gt;
|- &lt;br /&gt;
! Initialwert&lt;br /&gt;
| 0|| 0|| 0|| 0|| 0|| 0|| 0|| 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;COM1A1&#039;&#039;&#039;, &#039;&#039;&#039;COM1A0&#039;&#039;&#039; (&#039;&#039;&#039;Co&#039;&#039;&#039;mpare &#039;&#039;&#039;M&#039;&#039;&#039;atch Control Bits)&lt;br /&gt;
:Diese 2 Bits bestimmen die Aktion, welche am Output-Pin &#039;&#039;&#039;OC1&#039;&#039;&#039; ausgeführt werden soll, wenn der Wert des Datenregisters des Timer/Counter 1 den Wert des Vergleichsregisters erreicht, also ein so genannter Compare Match auftritt.&lt;br /&gt;
:Der Pin &#039;&#039;&#039;OC1&#039;&#039;&#039; (&#039;&#039;&#039;PB3&#039;&#039;&#039; beim 2313) muss mit dem Datenrichtungsregister als Ausgang konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
! COM1A1 || COM1A0 || Resultat&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| Output-Pin &#039;&#039;&#039;OC1&#039;&#039;&#039; wird nicht angesteuert.&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| Das Signal am Pin &#039;&#039;&#039;OC1&#039;&#039;&#039; wird invertiert (Toggle).&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| Der Output Pin &#039;&#039;&#039;OC1&#039;&#039;&#039; wird auf 0 gesetzt.&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| Der Output Pin &#039;&#039;&#039;OC1&#039;&#039;&#039; wird auf 1 gesetzt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:In der PWM-Betriebsart haben diese Bits eine andere Funktion.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
! COM1A1 || COM1A0 || Resultat&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| Output-Pin &#039;&#039;&#039;OC1&#039;&#039;&#039; wird nicht angesteuert.&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| Output-Pin &#039;&#039;&#039;OC1&#039;&#039;&#039; wird nicht angesteuert.&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| Wird beim Hochzählen der Wert im Vergleichsregister erreicht, so wird der Pin &#039;&#039;&#039;OC1&#039;&#039;&#039; auf 0 gesetzt.&lt;br /&gt;
Wird beim Herunterzählen der Wert im Vergleichsregister erreicht, so wird der Pin auf 1 gesetzt.&lt;br /&gt;
&lt;br /&gt;
Man nennt dies &#039;&#039;nicht invertierende PWM&#039;&#039;.&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| Wird beim Hochzählen der Wert im Vergleichsregister erreicht, so wird der Pin &#039;&#039;&#039;OC1&#039;&#039;&#039; auf 1 gesetzt.&lt;br /&gt;
Wird beim Herunterzählen der Wert im Vergleichsregister erreicht, so wird der Pin auf 0 gesetzt.&lt;br /&gt;
&lt;br /&gt;
Man nennt dies &#039;&#039;invertierende PWM&#039;&#039;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PWM11&#039;&#039;&#039;, &#039;&#039;&#039;PWM10&#039;&#039;&#039; (&#039;&#039;&#039;PWM&#039;&#039;&#039; Mode Select Bits)&lt;br /&gt;
:Mit diesen 2 Bits wird die PWM-Betriebsart des Timer/Counter 1 gesteuert.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
! PWM11 || PWM10 || Resultat&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| Die PWM-Betriebsart ist nicht aktiviert. Timer/Counter 1 arbeitet als normaler Timer bzw. Zähler.&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| 8-Bit PWM Betriebsart aktivieren.&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| 9-Bit PWM Betriebsart aktivieren.&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| 10-Bit PWM Betriebsart aktivieren.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;TCCR1B&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;T&#039;&#039;&#039;imer/&#039;&#039;&#039;C&#039;&#039;&#039;ounter &#039;&#039;&#039;C&#039;&#039;&#039;ontrol &#039;&#039;&#039;R&#039;&#039;&#039;egister &#039;&#039;&#039;B&#039;&#039;&#039; Timer &#039;&#039;&#039;1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{|  class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
! Bit&lt;br /&gt;
| 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0&lt;br /&gt;
|- &lt;br /&gt;
! Name&lt;br /&gt;
| &#039;&#039;&#039;ICNC1&#039;&#039;&#039;|| &#039;&#039;&#039;ICES1&#039;&#039;&#039;|| &#039;&#039;&#039;-&#039;&#039;&#039;|| &#039;&#039;&#039;WGM13&#039;&#039;&#039;|| &#039;&#039;&#039;WGM12 (CTC1)&#039;&#039;&#039;|| &#039;&#039;&#039;CS12&#039;&#039;&#039;|| &#039;&#039;&#039;CS11&#039;&#039;&#039;|| &#039;&#039;&#039;CS10&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
! R/W&lt;br /&gt;
| R/W || R/W || R || R || R/W || R/W || R/W || R/W&lt;br /&gt;
|- &lt;br /&gt;
! Initialwert&lt;br /&gt;
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ICNC1&#039;&#039;&#039; (&#039;&#039;&#039;I&#039;&#039;&#039;nput &#039;&#039;&#039;C&#039;&#039;&#039;apture &#039;&#039;&#039;N&#039;&#039;&#039;oise &#039;&#039;&#039;C&#039;&#039;&#039;anceler (4 CKs) Timer/Counter 1&lt;br /&gt;
:oder auf Deutsch Rauschunterdrückung des Eingangssignals.&lt;br /&gt;
:Wenn dieses Bit gesetzt ist und mit dem Input Capture Signal gearbeitet wird so werden nach der Triggerung des Signals mit der entsprechenden Flanke (steigend oder fallend) am Input Capture Pin &#039;&#039;&#039;ICP&#039;&#039;&#039; jeweils 4 Messungen mit der CPU-Frequenz des Eingangssignals abgefragt. Nur dann, wenn alle 4 Messungen den gleichen Zustand aufweisen gilt das Signal als erkannt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ICES1&#039;&#039;&#039; (&#039;&#039;&#039;I&#039;&#039;&#039;nput &#039;&#039;&#039;C&#039;&#039;&#039;apture &#039;&#039;&#039;E&#039;&#039;&#039;dge &#039;&#039;&#039;S&#039;&#039;&#039;elect Timer/Counter &#039;&#039;&#039;1&#039;&#039;&#039;)&lt;br /&gt;
:Mit diesem Bit wird bestimmt, ob die steigende (&#039;&#039;&#039;ICES1&#039;&#039;&#039;=1) oder fallende (&#039;&#039;&#039;ICES1&#039;&#039;&#039;=0) Flanke zur Auswertung des Input Capture Signals an Pin &#039;&#039;&#039;ICP&#039;&#039;&#039; heran gezogen wird.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CTC1&#039;&#039;&#039; (&#039;&#039;&#039;C&#039;&#039;&#039;lear &#039;&#039;&#039;T&#039;&#039;&#039;imer/&#039;&#039;&#039;C&#039;&#039;&#039;ounter on Compare Match Timer/Counter &#039;&#039;&#039;1&#039;&#039;&#039;)&lt;br /&gt;
:Wenn dieses Bit gesetzt ist, so wird nach einer Übereinstimmung des Datenregisters &#039;&#039;&#039;TCNT1H&#039;&#039;&#039;/&#039;&#039;&#039;TCNT1L&#039;&#039;&#039; mit dem Vergleichswert in &#039;&#039;&#039;OCR1H&#039;&#039;&#039;/&#039;&#039;&#039;OCR1L&#039;&#039;&#039; das Datenregister &#039;&#039;&#039;TCNT1H&#039;&#039;&#039;/&#039;&#039;&#039;TCNT1L&#039;&#039;&#039; auf 0 gesetzt.&lt;br /&gt;
:Da die Übereinstimmung im Takt nach dem Vergleich behandelt wird, ergibt sich je nach eingestelltem Vorteiler ein etwas anderes Zählverhalten:&lt;br /&gt;
:Wenn der Vorteiler auf 1 gestellt, und C der voreingestellte Vergleichswert ist, dann nimmt das Datenregister, im CPU-Takt betrachtet, folgende Werte an:&lt;br /&gt;
:... | C-2 | C-1 | C | 0 | 1 |...&lt;br /&gt;
:Wenn der Vorteiler z.&amp;amp;nbsp;B. auf 8 eingestellt ist, dann nimmt das Datenregister folgende Werte an:&lt;br /&gt;
:... | C-2, C-2, C-2, C-2, C-2, C-2, C-2, C-2 | C-1, C-1, C-1, C-1, C-1, C-1, C-1, C-1 | C, 0, 0, 0, 0, 0, 0, 0 |...&lt;br /&gt;
:In der PWM-Betriebsart hat dieses Bit keine Funktion.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CS12&#039;&#039;&#039;, &#039;&#039;&#039;CS11&#039;&#039;&#039;, &#039;&#039;&#039;CS10&#039;&#039;&#039; (&#039;&#039;&#039;C&#039;&#039;&#039;lock &#039;&#039;&#039;S&#039;&#039;&#039;elect Bits)&lt;br /&gt;
:Diese 3 Bits bestimmen die Quelle für den Timer/Counter:&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
! CS12 || CS11 || CS10 || Resultat&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| Stopp, Der Timer/Counter wird angehalten.&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| CPU-Takt&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| CPU-Takt / 8&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| CPU-Takt / 64&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| CPU-Takt / 256&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| CPU-Takt / 1024&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 0&lt;br /&gt;
| Externer Pin T1, fallende Flanke&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1&lt;br /&gt;
| Externer Pin T1, steigende Flanke&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:Wenn als Quelle der externe Pin T1 verwendet wird, so wird ein Flankenwechsel auch erkannt, wenn der Pin T1 als Ausgang geschaltet ist.&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;TCNT1H&#039;&#039;&#039;&amp;lt;br /&amp;gt;&#039;&#039;&#039;TCNT1L&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;T&#039;&#039;&#039;imer/&#039;&#039;&#039;C&#039;&#039;&#039;ou&#039;&#039;&#039;nt&#039;&#039;&#039;er Daten Register Timer/Counter &#039;&#039;&#039;1&#039;&#039;&#039;&lt;br /&gt;
Dieses ist als 16-Bit Aufwärtszähler mit Schreib- und Lesezugriff realisiert. Wenn der Zähler den Wert 65535 erreicht hat, beginnt er beim nächsten Zyklus wieder bei 0.&lt;br /&gt;
&lt;br /&gt;
{|  class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
! Bit&lt;br /&gt;
| 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0 ||&lt;br /&gt;
|- &lt;br /&gt;
! Name&lt;br /&gt;
| &#039;&#039;&#039;MSB&#039;&#039;&#039;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &#039;&#039;&#039;TCNT1H&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
! Name&lt;br /&gt;
|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &#039;&#039;&#039;LSB&#039;&#039;&#039;|| &#039;&#039;&#039;TCNT1L&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
! R/W&lt;br /&gt;
| R/W|| R/W|| R/W|| R/W|| R/W|| R/W|| R/W|| R/W|| &amp;amp;nbsp;&lt;br /&gt;
|- &lt;br /&gt;
! Initialwert&lt;br /&gt;
| 0|| 0|| 0|| 0|| 0|| 0|| 0|| 0|| &amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In der PWM-Betriebsart wird das Register als Auf/Ab-Zähler verwendet, d.h. der Wert steigt zuerst von 0, bis er den Überlauf von 65535 auf 0 erreicht hat. Dann zählt das Register rückwärts wiederum bis 0.&lt;br /&gt;
&lt;br /&gt;
Zum Auslesen des Registers wird von der CPU ein internes TEMP-Register verwendet. Das gleiche Register wird auch verwendet, wenn auf &#039;&#039;&#039;OCR1&#039;&#039;&#039; oder &#039;&#039;&#039;ICR1&#039;&#039;&#039; zugegriffen wird.&lt;br /&gt;
&lt;br /&gt;
Deshalb müssen vor dem Zugriff auf eines dieser Register alle Interrupts gesperrt werden, weil sonst die Möglichkeit des gleichzeitigen Zugriffs auf das Temporärregister gegeben ist, was natürlich zu fehlerhaftem Verhalten des Programms führt.. Zudem muss zuerst &#039;&#039;&#039;TCNT1L&#039;&#039;&#039; und erst danach &#039;&#039;&#039;TCNT1H&#039;&#039;&#039; ausgelesen werden.&lt;br /&gt;
&lt;br /&gt;
Wenn in das Register geschrieben werden soll, müssen ebenfalls alle Interrrupts gesperrt werden. Dann muss zuerst das &#039;&#039;&#039;TCNT1H&#039;&#039;&#039;-Register und erst danach das &#039;&#039;&#039;TCNT1L&#039;&#039;&#039;-Register geschrieben werden, also genau die umgekehrte Reihenfolge wie beim Lesen des Registers.&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;OCR1H&#039;&#039;&#039;&amp;lt;br /&amp;gt;&#039;&#039;&#039;OCR1L&#039;&#039;&#039;&lt;br /&gt;
| Timer/Counter &#039;&#039;&#039;O&#039;&#039;&#039;utput &#039;&#039;&#039;C&#039;&#039;&#039;ompare &#039;&#039;&#039;R&#039;&#039;&#039;egister Timer/Counter &#039;&#039;&#039;1&#039;&#039;&#039;&lt;br /&gt;
{|  class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
! Bit&lt;br /&gt;
| 7|| 6|| 5|| 4|| 3|| 2|| 1|| 0|| &amp;amp;nbsp;&lt;br /&gt;
|- &lt;br /&gt;
! Name&lt;br /&gt;
| &#039;&#039;&#039;MSB&#039;&#039;&#039;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &#039;&#039;&#039;OCR1H&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
! Name&lt;br /&gt;
| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &#039;&#039;&#039;LSB&#039;&#039;&#039;|| &#039;&#039;&#039;OCR1L&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
! R/W&lt;br /&gt;
| R/W|| R/W|| R/W|| R/W|| R/W|| R/W|| R/W|| R/W|| &amp;amp;nbsp;&lt;br /&gt;
|- &lt;br /&gt;
! Initialwert&lt;br /&gt;
| 0|| 0|| 0|| 0|| 0|| 0|| 0|| 0|| &amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Wert im Output Compare Register wird ständig mit dem aktuellen Wert im Datenregister TCNT1H/TCNT1L verglichen. Stimmen die beiden Werte überein, so wird ein sogenannter Output Compare Match ausgelöst. Die entsprechenden Aktionen werden über die Timer/Counter 1 Control und Status Register eingestellt.&lt;br /&gt;
&lt;br /&gt;
Zum Auslesen des Registers wird von der CPU ein internes TEMP-Register verwendet. Das gleiche Register wird auch verwendet, wenn auf &#039;&#039;&#039;TCNT1&#039;&#039;&#039; oder &#039;&#039;&#039;ICR1&#039;&#039;&#039; zugegriffen wird.&lt;br /&gt;
Deshalb müssen vor dem Zugriff auf eines dieser Register alle Interrupts gesperrt werden, weil sonst die Möglichkeit des gleichzeitigen Zugriffs auf das Temporärregister gegeben ist, was natürlich zu fehlerhaftem Verhalten des Programms führt. Zudem muss zuerst &#039;&#039;&#039;OCR1L&#039;&#039;&#039; und erst danach &#039;&#039;&#039;OCR1H&#039;&#039;&#039; ausgelesen werden.&lt;br /&gt;
&lt;br /&gt;
Wenn in das Register geschrieben werden soll, müssen ebenfalls alle Interrupts gesperrt werden. Dann muss zuerst das &#039;&#039;&#039;OCR1H&#039;&#039;&#039;-Register und erst danach das &#039;&#039;&#039;OCR1L&#039;&#039;&#039;-Register geschrieben werden, also genau die umgekehrte Reihenfolge wie beim Lesen des Registers.&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;ICR1H&#039;&#039;&#039;&amp;lt;br /&amp;gt;&#039;&#039;&#039;ICR1L&#039;&#039;&#039;&lt;br /&gt;
| Timer/Counter &#039;&#039;&#039;I&#039;&#039;&#039;nput &#039;&#039;&#039;C&#039;&#039;&#039;apture &#039;&#039;&#039;R&#039;&#039;&#039;egister Timer/Counter &#039;&#039;&#039;1&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
{|  class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
! Bit&lt;br /&gt;
| 7|| 6|| 5|| 4|| 3|| 2|| 1|| 0|| &amp;amp;nbsp;&lt;br /&gt;
|- &lt;br /&gt;
! Name&lt;br /&gt;
| &#039;&#039;&#039;MSB&#039;&#039;&#039;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &#039;&#039;&#039;ICR1H&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
! Name&lt;br /&gt;
| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &amp;amp;nbsp;|| &#039;&#039;&#039;LSB&#039;&#039;&#039;|| &#039;&#039;&#039;ICR1L&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
! R/W&lt;br /&gt;
| R|| R|| R|| R|| R|| R|| R|| R|| &amp;amp;nbsp;&lt;br /&gt;
|- &lt;br /&gt;
! Initialwert&lt;br /&gt;
| 0|| 0|| 0|| 0|| 0|| 0|| 0|| 0|| &amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Das Input Capture Register ist ein 16-Bit Register mit Lesezugriff. Es kann nicht beschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Wenn am Input Capture Pin &#039;&#039;&#039;ICP&#039;&#039;&#039; die gemäß Einstellungen im &#039;&#039;&#039;TCCR1B&#039;&#039;&#039; definierte Flanke erkannt wird, so wird der aktuelle Inhalt des Datenregisters &#039;&#039;&#039;TCNT1H&#039;&#039;&#039;/&#039;&#039;&#039;TCNT1L&#039;&#039;&#039; sofort in dieses Register kopiert und das Input Capture Flag &#039;&#039;&#039;ICF1&#039;&#039;&#039; im Timer Interrupt Flag Register &#039;&#039;&#039;TIFR&#039;&#039;&#039; gesetzt.&lt;br /&gt;
&lt;br /&gt;
{{Warnung|Wie bereits oben erwähnt, müssen vor dem Zugriff auf dieses Register alle Interrupts gesperrt werden. Zudem müssen Low- und Highbyte des Registers in der richtigen Reihenfolge bearbeitet werden:&lt;br /&gt;
;Lesen&amp;amp;#58;: &#039;&#039;&#039;ICR1L&#039;&#039;&#039; &amp;amp;rarr; &#039;&#039;&#039;ICR1H&#039;&#039;&#039;&lt;br /&gt;
Bei Verwendung des Compilers wird der Zugriff in der korrekten Reihenfolge ausgeführt, wenn man das 16-Bit register ICR1 verwendet anstatt zwei Zugriffe auf 8-Bit Register.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Die PWM-Betriebsart ===&lt;br /&gt;
&lt;br /&gt;
Wenn der Timer/Counter 1 in der PWM-Betriebsart betrieben wird, so bilden das Datenregister &#039;&#039;&#039;TCNT1H&#039;&#039;&#039;/&#039;&#039;&#039;TCNT1L&#039;&#039;&#039; und das Vergleichsregister &#039;&#039;&#039;OCR1H&#039;&#039;&#039;/&#039;&#039;&#039;OCR1L&#039;&#039;&#039; einen 8-, 9- oder 10-Bit, frei laufenden PWM-Modulator, welcher als PWM-Signal am &#039;&#039;&#039;OC1&#039;&#039;&#039;-Pin (&#039;&#039;&#039;PB3&#039;&#039;&#039; beim 2313) abgegriffen werden kann. Das Datenregister &#039;&#039;&#039;TCNT1H&#039;&#039;&#039;/&#039;&#039;&#039;TCNT1L&#039;&#039;&#039; wird dabei als Auf-/Ab-Zähler betrieben, welcher von 0 an aufwärts zählt bis zur Obergrenze und danach wieder zurück auf 0.&lt;br /&gt;
Die Obergrenze ergibt sich daraus, ob 8-, 9- oder 10-Bit PWM verwendet wird, und zwar gemäß folgender Tabelle:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
! Auflösung || Obergrenze || Frequenz&lt;br /&gt;
|- &lt;br /&gt;
| 8 || 255 || f&amp;lt;sub&amp;gt;TC1&amp;lt;/sub&amp;gt; / 510&lt;br /&gt;
|- &lt;br /&gt;
| 9 || 511 || f&amp;lt;sub&amp;gt;TC1&amp;lt;/sub&amp;gt; / 1022&lt;br /&gt;
|- &lt;br /&gt;
|10 || 1023 || f&amp;lt;sub&amp;gt;TC1&amp;lt;/sub&amp;gt; / 2046&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wenn nun der Zählerwert im Datenregister den in &#039;&#039;&#039;OCR1H&#039;&#039;&#039;/&#039;&#039;&#039;OCR1L&#039;&#039;&#039; gespeicherten Wert erreicht, wird der Ausgabepin &#039;&#039;&#039;OC1&#039;&#039;&#039; gesetzt bzw. gelöscht, je nach Einstellung von &#039;&#039;&#039;COM1A1&#039;&#039;&#039; und &#039;&#039;&#039;COM1A0&#039;&#039;&#039; im &#039;&#039;&#039;TCCR1A&#039;&#039;&#039;-Register.&lt;br /&gt;
&lt;br /&gt;
Ich habe versucht, die entsprechenden Signale in der folgenden Grafik zusammenzufassen&lt;br /&gt;
&lt;br /&gt;
[[Image:PWM Theorie 3.gif]] [[Image:PWM Theorie 4.gif]]&lt;br /&gt;
&lt;br /&gt;
=== Vergleichswert-Überprüfung (Compare Match) ===&lt;br /&gt;
&lt;br /&gt;
Hier wird in ein spezielles Vergleichswertregister (&#039;&#039;&#039;OCR1H&#039;&#039;&#039;/&#039;&#039;&#039;OCR1L&#039;&#039;&#039;) ein Wert eingeschrieben, welcher ständig mit dem aktuellen Zählerwert verglichen wird.&lt;br /&gt;
Erreicht der Zähler den in diesem Register eingetragenen Wert, so kann ein Signal (0 oder 1) am Pin &#039;&#039;&#039;OC1&#039;&#039;&#039; erzeugt und/oder ein Interrupt ausgelöst werden.&lt;br /&gt;
&lt;br /&gt;
Zu erwähnen ist in dem Zusammenhang, dass das zur Compare-Einheit gehörende Interrupt-Flag erst beim auf die Übereinstimmung der Werte folgenden Timertakt gesetzt wird. Das ist v.a. deshalb wichtig, da es sonst bei OCRnx = 0 einen undefinierten Zustand gäbe.&lt;br /&gt;
&lt;br /&gt;
Möchte man ein Compare-Ereignis 100 Takte nach dem Timerüberlauf auslösen, dann muss in das betreffende Compare-Register eine 99 geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
=== CTC-Betriebsart (Clear Timer on Compare Match) ===&lt;br /&gt;
&lt;br /&gt;
Das sogenannte &#039;&#039;&#039;Compare Match-Ereignis&#039;&#039;&#039; kann auch dazu verwendet werden, um den Timer automatisch zurückzusetzen (d.h. das TCNT-Register wird zu Null gesetzt). Diese Betriebsart heißt &amp;quot;Clear Timer on Compare Match&amp;quot;, also auf deutsch &amp;quot;Lösche Timer bei Vergleichsübereinstimmung&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Mit dieser Funktionalität ist es möglich, sehr präzise Taktsignale zu erzeugen, ohne dabei programmtechnisch eingreifen zu müssen. &#039;&#039;&#039;Diese Funktion ersetzt das bei anderen Controllern und Timern ohne Compare-Einheit erforderliche Timer Reload&#039;&#039;&#039; (also das Nachladen des Zählregisters mit &amp;quot;Überlaufwert minus gewünschte Taktzahl bis zum Überlauf&amp;quot;, v.a. verbreitet bei 8051er-µCs).&lt;br /&gt;
&lt;br /&gt;
Zur Erzeugung eines Taktes per Hardware muss lediglich eine der CTC-Betriebsarten ausgewählt werden und einer der OCnx-Pins so gesetzt werden, dass er bei Auftreten des Compare Match getoggelt wird (über die COM-Bits).&lt;br /&gt;
&lt;br /&gt;
Die Frequenz des Taktes am entsprechenden Ausgang ist dann:&lt;br /&gt;
&amp;lt;math&amp;gt;f_\text{OC} = \frac{f_\text{CPU}}{\text{Prescaler} \cdot \left( \text{OCRnx} + 1 \right)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Umgeformt gilt für OCRnx:&lt;br /&gt;
&amp;lt;math&amp;gt;\text{OCRnx} = \frac{f_\text{CPU}}{\text{Prescaler} \cdot f_\text{OC}} - 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Betriebsart macht das Timer-Nachladen, das bei AVRs, die ja im Unterschied zu 8051-Derivaten keine Auto-Reload-Funktion haben, immer mit Ungenauigkeiten und programmtechnischen Klimmzügen verbunden ist, überflüssig. Ist das OCRnx einmal gesetzt, dann wird das Signal am Ausgang kontinuierlich ausgegeben, ohne dass die Anwendersoftware eingreifen muss (es sei denn, die Frequenz soll geändert werden).&lt;br /&gt;
&lt;br /&gt;
Beim ATmega8 hat der 8-Bit-Timer 0 keine Compare-Einheit, so dass dort CTC und auch sonstige automatische Vergleichsoperationen nicht möglich sind. Bei Timer 1 und Timer 2 ist das jedoch möglich. Bei den neueren AVRs besitzen i.d.R. &#039;&#039;alle&#039;&#039; Timer eine oder mehrere Compare-Einheiten, so dass dort eine größere Flexibilität gegeben ist.&lt;br /&gt;
&lt;br /&gt;
Im Unterschied zu den PWM-Betriebsarten wird die Registeraktualisierung bei CTC nicht automatisch synchronisiert. Schreibt man einen neuen Compare-Wert, dann wird dieser sofort übernommen, was zu Fehlfunktionen führen kann, wenn der neue Compare-Wert höher ist, als der aktuelle Stand von TCNTnx. In den PWM-Betriebsarten wird hingegen der TOP-Wert synchron bei Erreichen von TOP oder BOTTOM aktualisiert.&lt;br /&gt;
&lt;br /&gt;
=== Einfangen eines Eingangssignals (Input Capturing) ===&lt;br /&gt;
&lt;br /&gt;
Bei dieser Betriebsart wird an den Input Capturing Pin (ICP) des Controllers eine Signalquelle angeschlossen.&lt;br /&gt;
Nun kann je nach Konfiguration entweder ein Signalwechsel von 0 nach 1 (steigende Flanke) oder von 1 nach 0 (fallende Flanke) erkannt werden und der zu diesem Zeitpunkt aktuelle Zählerstand in ein spezielles Register abgelegt werden. Gleichzeitig kann auch ein entsprechender Interrupt ausgelöst werden.&lt;br /&gt;
Wenn die Signalquelle ein starkes Rauschen beinhaltet, kann die Rauschunterdrückung eingeschaltet werden. Dann wird beim Erkennen der konfigurierten Flanke über 4 Taktzyklen das Signal überwacht und nur dann, wenn alle 4 Messungen gleich sind, wird die entsprechende Aktion ausgelöst.&lt;br /&gt;
&lt;br /&gt;
== Gemeinsame Register ==&lt;br /&gt;
&lt;br /&gt;
Verschiedene Register beinhalten Zustände und Einstellungen, welche sowohl&lt;br /&gt;
für den 8-Bit, als auch für den 16-Bit Timer/Counter in ein und demselben&lt;br /&gt;
Register zu finden sind.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;TIMSK&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;T&#039;&#039;&#039;imer/Counter &#039;&#039;&#039;I&#039;&#039;&#039;nterrupt &#039;&#039;&#039;M&#039;&#039;&#039;a&#039;&#039;&#039;sk&#039;&#039;&#039;&lt;br /&gt;
Register&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
! Bit&lt;br /&gt;
| 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0&lt;br /&gt;
|- &lt;br /&gt;
! Name&lt;br /&gt;
| &#039;&#039;&#039;TOIE1&#039;&#039;&#039;|| &#039;&#039;&#039;OCIE1A&#039;&#039;&#039;|| &#039;&#039;&#039;-&#039;&#039;&#039;|| &#039;&#039;&#039;-&#039;&#039;&#039;|| &#039;&#039;&#039;TICIE&#039;&#039;&#039;|| &#039;&#039;&#039;-&#039;&#039;&#039;|| &#039;&#039;&#039;TOIE0&#039;&#039;&#039;|| &#039;&#039;&#039;-&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
! R/W&lt;br /&gt;
| R/W || R/W || R || R || R/W || R || R/W || R&lt;br /&gt;
|- &lt;br /&gt;
! Initialwert&lt;br /&gt;
| 0|| 0|| 0|| 0|| 0|| 0|| 0|| 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TOIE1&#039;&#039;&#039; (&#039;&#039;&#039;T&#039;&#039;&#039;imer/Counter &#039;&#039;&#039;O&#039;&#039;&#039;verflow &#039;&#039;&#039;I&#039;&#039;&#039;nterrupt &#039;&#039;&#039;E&#039;&#039;&#039;nable Timer/Counter &#039;&#039;&#039;1&#039;&#039;&#039;)&lt;br /&gt;
:Wenn dieses Bit gesetzt ist, wird bei einem Überlauf des Datenregisters des Timer/Counter 1 ein Timer Overflow 1 Interrupt ausgelöst. Das Global Enable Interrupt Flag muss selbstverständlich auch gesetzt sein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OCIE1A&#039;&#039;&#039; (&#039;&#039;&#039;O&#039;&#039;&#039;utput &#039;&#039;&#039;C&#039;&#039;&#039;ompare Match &#039;&#039;&#039;I&#039;&#039;&#039;nterrupt &#039;&#039;&#039;E&#039;&#039;&#039;nable Timer/Counter &#039;&#039;&#039;1&#039;&#039;&#039;)&lt;br /&gt;
:Beim Timer/Counter 1 kann zusätzlich zum Überlauf ein Vergleichswert definiert werden.&lt;br /&gt;
&lt;br /&gt;
:Wenn dieses Bit gesetzt ist, wird beim Erreichen des Vergleichswertes ein Compare Match Interrupt ausgelöst. Das Global Enable Interrupt Flag muss selbstverständlich auch gesetzt sein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TICIE&#039;&#039;&#039; (&#039;&#039;&#039;T&#039;&#039;&#039;imer/Counter &#039;&#039;&#039;I&#039;&#039;&#039;nput &#039;&#039;&#039;C&#039;&#039;&#039;apture &#039;&#039;&#039;I&#039;&#039;&#039;nterrupt &#039;&#039;&#039;E&#039;&#039;&#039;nable)&lt;br /&gt;
:Wenn dieses Bit gesetzt ist, wird ein Capture Event Interrupt ausgelöst, wenn ein entsprechendes Signalereignis am Pin PD6(ICP) auftritt. Das Global Enable Interrupt Flag muss selbstverständlich auch gesetzt sein, wenn auch ein entsprechender Interrupt ausgelöst werden soll.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TOIE0&#039;&#039;&#039; (&#039;&#039;&#039;T&#039;&#039;&#039;imer/Counter &#039;&#039;&#039;O&#039;&#039;&#039;verflow &#039;&#039;&#039;I&#039;&#039;&#039;nterrupt &#039;&#039;&#039;E&#039;&#039;&#039;nable Timer/Counter &#039;&#039;&#039;0&#039;&#039;&#039;)&lt;br /&gt;
:Wenn dieses Bit gesetzt ist, wird bei einem Überlauf des Datenregisters des Timer/Counter 0 ein Timer Overflow 0 Interrupt ausgelöst. Das Global Enable Interrupt Flag muss selbstverständlich auch gesetzt sein.&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;TIFR&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;T&#039;&#039;&#039;imer/Counter &#039;&#039;&#039;I&#039;&#039;&#039;nterrupt &#039;&#039;&#039;F&#039;&#039;&#039;lag &#039;&#039;&#039;R&#039;&#039;&#039;egister&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
! Bit&lt;br /&gt;
| 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0&lt;br /&gt;
|- &lt;br /&gt;
! Name&lt;br /&gt;
| &#039;&#039;&#039;TOV1&#039;&#039;&#039;|| &#039;&#039;&#039;OCF1A&#039;&#039;&#039;|| &#039;&#039;&#039;-&#039;&#039;&#039;|| &#039;&#039;&#039;-&#039;&#039;&#039;|| &#039;&#039;&#039;ICF1&#039;&#039;&#039;|| &#039;&#039;&#039;-&#039;&#039;&#039;|| &#039;&#039;&#039;TOV0&#039;&#039;&#039;|| &#039;&#039;&#039;-&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
! R/W&lt;br /&gt;
| R/W|| R/W|| R|| R|| R/W|| R|| R/W|| R&lt;br /&gt;
|- &lt;br /&gt;
! Initialwert&lt;br /&gt;
| 0|| 0|| 0|| 0|| 0|| 0|| 0|| 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TOV1&#039;&#039;&#039; (&#039;&#039;&#039;T&#039;&#039;&#039;imer/Counter &#039;&#039;&#039;O&#039;&#039;&#039;verflow Flag Timer/Counter &#039;&#039;&#039;1&#039;&#039;&#039;)&lt;br /&gt;
:Dieses Bit wird vom Controller gesetzt, wenn beim Timer 1 ein Überlauf des Datenregisters stattfindet.&lt;br /&gt;
&lt;br /&gt;
:In der PWM-Betriebsart wird das Bit gesetzt, wenn die Zählrichtung von auf- zu abwärts und umgekehrt geändert wird (Zählerwert = 0).&lt;br /&gt;
&lt;br /&gt;
:Das Flag wird automatisch gelöscht, wenn der zugehörige Interrupt-Vektor aufgerufen wird. Es kann jedoch auch gelöscht werden, indem eine logische 1 (!) in das entsprechende Bit geschrieben wird.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OCF1A&#039;&#039;&#039; (&#039;&#039;&#039;O&#039;&#039;&#039;utput &#039;&#039;&#039;C&#039;&#039;&#039;ompare &#039;&#039;&#039;F&#039;&#039;&#039;lag Timer/Counter &#039;&#039;&#039;1&#039;&#039;&#039;)&lt;br /&gt;
:Dieses Bit wird gesetzt, wenn der aktuelle Wert des Datenregisters von Timer/Counter 1 mit demjenigen im Vergleichsregister &#039;&#039;&#039;OCR1&#039;&#039;&#039; übereinstimmt.&lt;br /&gt;
&lt;br /&gt;
:Das Flag wird automatisch gelöscht, wenn der zugehörige Interrupt-Vektor aufgerufen wird. Es kann jedoch auch gelöscht werden, indem eine logische 1 (!) in das entsprechende Bit geschrieben wird.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ICF1&#039;&#039;&#039; (&#039;&#039;&#039;I&#039;&#039;&#039;nput &#039;&#039;&#039;C&#039;&#039;&#039;apture &#039;&#039;&#039;F&#039;&#039;&#039;lag Timer/Counter &#039;&#039;&#039;1&#039;&#039;&#039;)&lt;br /&gt;
:Dieses Bit wird gesetzt, wenn ein Capture-Ereignis aufgetreten ist, welches anzeigt, dass der Wert des Datenregisters des  Timer/Counter 1 in das Input Capture Register ICR1 übertragen wurde.&lt;br /&gt;
&lt;br /&gt;
:Das Flag wird automatisch gelöscht, wenn der zugehörige Interrupt-Vektor aufgerufen wird. Es kann jedoch auch gelöscht werden, indem eine logische 1 (!) in das entsprechende Bit geschrieben wird.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TOV0&#039;&#039;&#039; (&#039;&#039;&#039;T&#039;&#039;&#039;imer/Counter &#039;&#039;&#039;O&#039;&#039;&#039;verflow Flag Timer/Counter &#039;&#039;&#039;0&#039;&#039;&#039;)&lt;br /&gt;
:Dieses Bit wird vom Controller gesetzt, wenn beim Timer 0 ein Überlauf des Datenregisters stattfindet.&lt;br /&gt;
&lt;br /&gt;
:Das Flag wird automatisch gelöscht, wenn der zugehörige Interrupt-Vektor aufgerufen wird. Es kann jedoch auch gelöscht werden, indem eine logische 1 (!) in das entsprechende Bit geschrieben wird.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:avr-gcc Tutorial]]&lt;br /&gt;
[[Kategorie:Timer und Uhren]]&lt;/div&gt;</summary>
		<author><name>Jonebohne</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=USB-Stick_am_Mikrocontroller&amp;diff=46600</id>
		<title>USB-Stick am Mikrocontroller</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=USB-Stick_am_Mikrocontroller&amp;diff=46600"/>
		<updated>2010-04-25T13:07:02Z</updated>

		<summary type="html">&lt;p&gt;Jonebohne: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Allgemeine Funktionsbeschreibung ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;- AVR/GCC-Version im Projektarchiv verfügbar -&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Projekt demonstriert an einem Hard- und Softwarebeispiel die Verwendung von [[USB]]-Sticks an Mikrocontrollersystemen. Es ist nicht als fertiges Projekt zu betrachten, sondern soll eine Grundlage zur Realisierung eigener Anwendungen sein. Die Software liegt in einer 8051er/SDCC und einer [[AVR-GCC]] Version vor.&lt;br /&gt;
&lt;br /&gt;
[[Bild:VNC Ansicht.png|framed|top|Ansicht des Testaufbaues]]&lt;br /&gt;
&lt;br /&gt;
Dazu ist ein USB-Hostcontroller erforderlich. Die meisten Mikrocontroller mit integrierten USB-Port, bzw. Lösungen mit FT232-Bausteinen, bieten keine Host-Funktionalität. Es wird der Typ VNC1L-1A von FTDI (Vinculum) eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Dieser IC hat folgende Eigenschaften:&lt;br /&gt;
* USB 2.0 Host- und Slave-Funktionalität&lt;br /&gt;
* 2 USB-Ports mit Low- und Full-Speed&lt;br /&gt;
* [[UART]]-, [[SPI]]- und Parallelinterface&lt;br /&gt;
* zusätzliche, frei verwendbare I/O-Ports&lt;br /&gt;
* integrierter 8Bit Mikrocontroller und 32Bit Aritmetik-Prozessor&lt;br /&gt;
* interner DMA-Controller, 64kByte Flash, 4kByte SRAM&lt;br /&gt;
* Firmware für FAT16 und FAT32 Support kostenfrei Verfügbar&lt;br /&gt;
* 3.3V (25mA) Versorgungsspannung, I/O-Pins sind 5V tolerant&lt;br /&gt;
* wenige externe Bauteile erforderlich&lt;br /&gt;
Leider ist der IC nur in SMD (LQFP-48 [[Gehäuse-Übersicht|Gehäuse]]) erhältlich.&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Zum Einsatz kommt ein fertiges Modul VDIP1. Dieses enthält auf einer kleinen Platine einen VNC1L-1A mit allen erforderlichen Zusatzbauteilen. Werksmäßig ist auch die passende Firmware (VDAP) bereits programmiert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:VNC VDIP1.png|framed|top|VDIP1-Modul]]&lt;br /&gt;
&lt;br /&gt;
* VNC1L-1A&lt;br /&gt;
* Quarz 12MHz (per interne PLL auf 48MHz vervielfacht)&lt;br /&gt;
* 3.3V Spannungsregler&lt;br /&gt;
* 2 Jumper für die Interfaceeinstellung&lt;br /&gt;
* USB-A Buchse&lt;br /&gt;
* komplette Schutzbeschaltung&lt;br /&gt;
* 2 Status-LEDs&lt;br /&gt;
* 2x 12 Stifte im DIP24 IC-Format &lt;br /&gt;
* VDAP Firmware und Bootloader bereits vorinstalliert&lt;br /&gt;
* Updatefähig über USB-Stick&lt;br /&gt;
&lt;br /&gt;
[http://www.vinculum.com/documents/schematics/VDIP1%20Schematic%20Prints.pdf VDIP1-Schaltung (PDF)] / &lt;br /&gt;
[http://www.vinculum.com/documents/datasheets/DS_VDIP1.pdf VDIP1-Datenblatt (PDF)]&lt;br /&gt;
&lt;br /&gt;
Das VDIP1-Modul ist für Experimente gut geeignet, zumal es die VDAP-Firmware bereits enthält. (Das flashen eines leeren VNC1L-1A ist dagegen nicht gerade einfach!) Bezug ist über diverse Elektronikversender möglich. Preis: VDIP1 ca. 25 Euro, VNC1L-1A als einzelner IC ab ca. 10 Euro. Bezugsquellen befinden sich im Diskussionsbeitrag, siehe unten.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel wurde als Zielsystem (8051) eine universelle Mikrocontroller-Platine [http://pro-51.eltra-tec.de PRO-51] mit 8051-Mikrocontroller verwendet. Es kann natürlich jeder andere Mikrocontroller eingesetzt werden. Besondere Leistung ist nicht erforderlich. Die Taktfrequenz beträgt im Bsp. 11.0592MHz und ist unkritisch. Ich habe die Frequenz auch mal Testweise auf 24MHz erhöht, was ohne Software-Änderung auch funktionierte.&lt;br /&gt;
&lt;br /&gt;
Für die AVR-Version habe ich einen ATmega644 verwendet.  Auch andere AVRs sollten funktionieren. Getestet mit unterschiedlichen Taktfrequenzen (1MHz, 8MHz, 11.0592MHz). Beim Einsatz des UART-Monitoring sollte unbedingt ein externer Quarz angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:VNC Stromlaufplan.png|400px|Stromlaufplan 8051]]&lt;br /&gt;
&lt;br /&gt;
[[Media:VNC Stromlaufplan.pdf|Stromlaufplan (8051) als PDF]].&lt;br /&gt;
&lt;br /&gt;
[[Bild:VNC AVR Stromlaufplan.png|400px|Stromlaufplan AVR]]&lt;br /&gt;
&lt;br /&gt;
[[Media:VNC AVR Stromlaufplan.pdf|Stromlaufplan (AVR) als PDF]].&lt;br /&gt;
&lt;br /&gt;
Zu Übertragung wird die SPI-Schnittstelle verwendet. Das SPI-Handling ist komplexer als beispielsweise die UART-Schnittstelle, hat aber den Vorteil, dass die wertvolle Mikrocontroller-UART für andere Anwendungen erhalten bleibt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Nicht vergessen, die Jumper J3 und J4 des VDIP1-Moduls auf SPI zu stecken!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das VNC1L-1A SPI-Protokoll weicht erheblich von dem üblichen SPI ab. Es ist ehr eine Mischung aus SPI-, I2C- und UART-Eigenschaften und Bedarf einiger Aufmerksamkeit. Wenn es einmal läuft, dann jedoch sehr stabil und bis 12MHz Busfrequenz schnell. Delays sind kaum notwendig. Da immer 13 Bit übertragen werden, ist eine Hardware-SPI auf Mikrocontrollerseite nicht nutzbar. Das Timing wurde über normale Port-Pins per Software nachgebildet.&lt;br /&gt;
&lt;br /&gt;
Der Mikrocontroller ist Master, der VNC1L-1A Slave. Zum senden eines Zeichens an den VNC1L-1A ist dies ideal, schwieriger erscheint das Empfangen von Zeichen vom VNC1L-1A, da dieser keinen Interrupt-Pin hat, welcher das Vorhandensein neuer Zeichen signalisiert. Der VNC1L-1A muss dennoch nicht ständig vom Mikrocontroller auf neue Zeichen gepollt werden, da er einen ziemlich großen FIFO hat. Ein &amp;quot;Buffer voll&amp;quot; wird vom Programm erkannt und entsprechend gewartet.&lt;br /&gt;
&lt;br /&gt;
Jedes übertragene Zeichen wird vom VNC1L-1A im Status-Bit sofort auf Akzeptanz bestätigt, ähnlich dem Acknowledgment-Bit des I2C-Buses. Ein nicht bestätigtes Zeichen wird erneut gesendet.&lt;br /&gt;
&lt;br /&gt;
Das Testsystem benutzt zur Anzeige ein alphanumerischen LC-Display mit 4x20 Zeichen, konkret ein DIP204-4 von EA, mit KS0073 Controller. Die Anschaltung und der Betrieb ist Standard und nicht Thema dieses Beitrages. Alle an den VNC1L-1A gesendeten und von ihm empfangenen Daten können bei Bedarf auf dem Display angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
Ebenfalls möglich ist UART-Monitoring über die serielle Schnittstelle. Alle gesendeten und empfangenen Zeichen werden hierbei ebenfalls übertragen. &lt;br /&gt;
&lt;br /&gt;
Beide Funktionen sind hilfreich bei der Inbetriebnahme und zum verstehen der Arbeitsweise.&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
Es wird vorausgesetzt, das auf dem VNC1L-1A die VDAP Software bereits installiert ist. Dies ist auf einen VDIP1-Modul werkseitig der Fall. Meist ist jedoch eine ältere Version drauf. Das sollte man auch erstmal so lassen.&lt;br /&gt;
&lt;br /&gt;
Der Stick muss mit FAT16 oder FAT32 formatiert sein. Es wird nur die erste primäre Partition unterstützt. NTFS oder andere Dateisysteme werden nicht erkannt.&lt;br /&gt;
&lt;br /&gt;
Die VDAP-Firmware stellt praktisch alle Funktionen zum Zugriff auf dem USB-Stick bereit. Kenntnisse des FAT-Dateisystems sind nicht erforderlich. Die Firmware arbeitet im Prinzip wie ein Monitorprogramm mit DOS-ähnlichen Kommandos. Nach einem erfolgreichen Kommando meldet sich die Firmware mit einen &#039;D:\&amp;gt;&#039; zurück.&lt;br /&gt;
&lt;br /&gt;
Die Beispielprogramme sind in Ansi-C geschrieben und mit SDCC bzw. GCC kompiliert. Sie belegen inkl. der LCD-Funktionen und Test-Filedaten ca. 7Kbyte FLASH und 270Byte RAM (8051) und ca. 700Byte SRAM (AVR), mit Einsparpotential. (Auf PROGMEM-Nutzung wurde bisher verzichtet.) Eine Portierung auf andere Mikrocontroller sollte problemlos möglich sein. Spezielle SFR- und Zusatzkomponentennutzung wurde weitgehend vermieden. Das Programm dürfte leicht zu verstehen sein. Einige Erfahrungen sollten jedoch schon vorhanden sein.&lt;br /&gt;
&lt;br /&gt;
Zunächst werden ein Reset des VNC1L-1A und einige Initialisierungen durchgeführt:&lt;br /&gt;
&lt;br /&gt;
* ECS - erweitertes Kommando-Set einstellen&lt;br /&gt;
* IPA - alle Zahlen werden als ASCII übertragen&lt;br /&gt;
* FWV - Anzeige der Softwareversion&lt;br /&gt;
* DIR - Anzeige des Stickinhaltes&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Wenn diese 4 Punkte funktionieren, kann man sich an ein Update der VDAP-Firmware trauen. Dazu die aktuelle Firmware von der [http://www.vinculum.com/downloads.html Vinculum-Homepage] laden (endet mit .ftd), in &amp;quot;ftrfb.ftd&amp;quot; umbenennen und diese Datei ins Root des USB-Sticks kopieren. Der Bootloader flasht die Datei dann automatisch beim nächsten anstecken und quitiert den Vorgang mit der Anzeige CHANGE MAIN. Alle Funktionen habe ich mit der Version 3.66 und 3.68 ausprobiert.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Bild:VNC Monitor FW.png|top|Firmwaremeldung nach FWV-Kommando]]&lt;br /&gt;
&lt;br /&gt;
Die danach folgenden Softwareteile zeigen, wie man eine Datei auf dem USB-Stick erzeugt bzw. einliest. &#039;&#039;&#039;Hinweis! Nur 8.3 Dateinamen verwenden!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Besonderen Wert sollte man auf die elementaren SPI I/O-Funktionen &#039;&#039;&#039;vnc_wr_byte&#039;&#039;&#039; und &#039;&#039;&#039;vnc_rd_byte&#039;&#039;&#039; legen. Das Datenblatt des VNC1L-1A geht recht detailiert auf das Timing ein. Damit sollte man sich vorab gründlich beschäftigen. (Die Angaben zum SPI im Datenblatt des VDIP1 sind dagegen spärlich und teilweise falsch!)&lt;br /&gt;
&lt;br /&gt;
Die vollständigen Quelltexte sind im &#039;&#039;&#039;Projektarchiv&#039;&#039;&#039; (siehe unten), enthalten. Zusätzlich ist darin ein kleines Testprogramm (AVR) zur Überprüfung der elementaren SPI-Kommunikation enthalten. Es wird ständig ein E(cho) gesendet und empfangen. Dieses Progamm sollte man für den Einstieg und Inbetriebnahme als erstes verwenden. Man kann dann ziemlich sicher sein, dass die Hardware-Verbindung funktioniert.&lt;br /&gt;
&lt;br /&gt;
Das Video zeigt den Ablauf des Beispielprogrammes auf dem LC-Display. Die Pausen zwischen den einzelnen Kommandos wurden zur besseren Demonstration etwas vergrößert.&lt;br /&gt;
&lt;br /&gt;
[[Bild:VNC Youtube klein.png|top|100px|Video]] [http://www.youtube.com/watch?v=oUX1U1ipfQk Video ansehen] (Länge ca. 1 Minute auf www.youtube.de)&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Video zeigt zum Verständnis das Grundprinzip der Kommunikation mit dem VNC1L, hier über UART und Terminalprogramm auf einem PC.&lt;br /&gt;
&lt;br /&gt;
[[Bild:VNC Youtube klein.png|top|100px|Video]] [http://www.youtube.com/watch?v=r3fF48pI0Wo Video ansehen] (Länge ca. 1.5 Minuten auf www.youtube.de)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Auf die LCD-Ansteuerung wird hier nicht näher eingegangen.&#039;&#039;&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ausblick ==&lt;br /&gt;
&lt;br /&gt;
Die Software wurde mit folgenden USB-Sticks getestet:&lt;br /&gt;
* RUNDISK 512MB FAT16 - ok&lt;br /&gt;
* PLATINUM  2GB FAT32 - ok&lt;br /&gt;
* CNMEMORY  4GB FAT32 - ok&lt;br /&gt;
* TREKSTOR 16GB FAT32 - ok&lt;br /&gt;
* OCZ 8GB (RALLY DUAL-CANAL) FAT32 -  kein schreiben möglich&lt;br /&gt;
(VDAP-Firmware kann mit Dual-Canal-Technik offenbar nicht korrekt umgehen. Der Stick wird zwar erkannt, ein schreiben war mir jedoch nicht möglich.)&lt;br /&gt;
&lt;br /&gt;
FAT16-Systeme sind schneller als FAT32-Systeme. Ich habe während der Testphase, auch bei gravierenden Softwarefehlern, kein Dateisystem auf dem Stick demoliert, oder fremde Dateien beschädigt. Die VDAP-Firmware scheint recht stabil zu funktionieren. Trotzdem sollte man nicht seinen einzigen Backup-Stick zum testen verwenden...&lt;br /&gt;
&lt;br /&gt;
Mit dem VNC1L-1A können auch andere Geräte, wie z.&amp;amp;nbsp;B. USB-Drucker, Kameras und Handys angesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Über Kommentare und Anregungen bin ich dankbar. Kontakt: Matthias Kahnt / matthiask (az51@gmx.net)&amp;lt;br&amp;gt;&#039;&#039;&#039;([http://www.mikrocontroller.net/topic/130381#new zum Diskussionsbeitrag im Forum])&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weiterhin ist im &#039;&#039;&#039;&amp;quot;Embedded Projects Journal&amp;quot;&#039;&#039;&#039;, Ausgabe 4 ein Beitrag zum Thema &amp;quot;USB-Stick am Mikrocontroller&amp;quot; veröffentlicht wurden. Download: siehe unten.&lt;br /&gt;
&lt;br /&gt;
== Links / Download ==&lt;br /&gt;
* [[Media:VNC_Projektarchiv1_24.zip|Projektarchiv - USB-Stick am Mikrocontroller V1.24 - Stand: 16.11.2009 (8051- und AVR-Version)]]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/130381#new Diskussions-Beitrag hier im Forum]&lt;br /&gt;
* [http://www.ixbat.de//files/admin/projekte/epjournal/EPJ_04_download.pdf Embedded Projects Journal, Ausgabe 4]&lt;br /&gt;
* [http://www.vinculum.com Vinculum-Homepage]&lt;br /&gt;
* [http://www.vinculum.com/downloads.html Vinculum-Downloadbereich]&lt;br /&gt;
* [http://www.vinculum.com/documents.html#vdatasheets Vinculum Datenblattbereich]&lt;br /&gt;
* [http://www.ftdichip.com FTDI-Homepage]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Projekte]]&lt;br /&gt;
[[Kategorie:8051]]&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;br /&gt;
[[Kategorie:USB]]&lt;/div&gt;</summary>
		<author><name>Jonebohne</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Schaltplaneditoren&amp;diff=46569</id>
		<title>Schaltplaneditoren</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Schaltplaneditoren&amp;diff=46569"/>
		<updated>2010-04-24T07:58:42Z</updated>

		<summary type="html">&lt;p&gt;Jonebohne: /* Eagle */ Windows 7 kompatibel&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Eagle ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Eagle.png|right|thumb|Screenshot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;i&amp;gt;Eagle&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt; von Cadsoft ist nicht nur ein &amp;lt;b&amp;gt;Schaltplaneditor&amp;lt;/b&amp;gt;, sondern ein komplettes Paket mit &amp;lt;b&amp;gt;Layoutprogramm&amp;lt;/b&amp;gt; und &amp;lt;b&amp;gt;Autorouter&amp;lt;/b&amp;gt;. Das hat den Vorteil, dass man einen erstellten Schaltplan gleich zur Platine weiterverarbeiten kann.&lt;br /&gt;
&lt;br /&gt;
Mitgeliefert werden umfangreiche Symbol- bzw. Bauteilbibliotheken, von Widerständen in allen Bauformen über Taster bis hin zu [[AVR]]s. Eine Library für viele aktuelle AVRs findet sich im Download-Bereich &lt;br /&gt;
von [http://www.embedit.de http://www.embedit.de].&lt;br /&gt;
&lt;br /&gt;
Eagle läuft unter Linux, Windows (2000/XP/Vista/7) und Mac OS X.&lt;br /&gt;
&lt;br /&gt;
Eine für nichtkommerzielle Anwendungen kostenlose Version ist von [http://www.cadsoft.de/ CadSoft] erhältlich. Diese ist auf zweilagige Platinen im halben Euro-Format (80x100mm) sowie Schaltpläne mit nur einer Seite beschränkt.&lt;br /&gt;
&lt;br /&gt;
Zum Betrachten des fertigen, bestückten Platinenentwurfs als 3D-Bild bietet sich [http://www.matwei.de/doku.php?id=en:eagle3d:eagle3d eagle3D] an. Mit Hilfe eines ULP wird eine Beschreibungsdatei für &amp;lt;i&amp;gt;POVray&amp;lt;/i&amp;gt; erzeugt, die dann anschließend gerendert wird. Eine große Zahl an Bauteilen wird unterstützt.&lt;br /&gt;
&lt;br /&gt;
Anwendungshinweise:&lt;br /&gt;
* [[Eagle im Hobbybereich]]&lt;br /&gt;
* [http://gaussmarkov.net/wordpress/category/tools/software/eagle/ Eagle CAD Tutorial] im Blog von gaussmarkov: diy fx (englisch)&lt;br /&gt;
&lt;br /&gt;
== PCB ==&lt;br /&gt;
&lt;br /&gt;
[http://pcb.sourceforge.net/index.html PCB] ist ein freies (open source) Layoutprogramm inklusive Autorouter. Zum Zeichnen der Schaltpläne kann [[Schaltplaneditoren#Gschem|Gschem]] verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;PCB&amp;lt;/i&amp;gt; wurde ursprünglich für den Atari ST entwickelt und später nach &lt;br /&gt;
Unix portiert. &amp;lt;i&amp;gt;PCB&amp;lt;/i&amp;gt; läuft meist unter Linux, kann allerdings mit [http://www.cygwin.com/ Cygwin] auch unter Windows betrieben werden.&lt;br /&gt;
&lt;br /&gt;
Als Ausgabeformate stehen [http://de.wikipedia.org/wiki/Postscript Postscript] und Gerber RS-274-X zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil von &amp;lt;i&amp;gt;PCB&amp;lt;/i&amp;gt; ist, dass alle Funktionen auch über &lt;br /&gt;
Hotkeys gesteuert werden können, was insbesondere nach längerer Einarbeitungszeit ein großer Gewinn gegenüber manchen Windows-Programmen ist.&lt;br /&gt;
&lt;br /&gt;
Zur Einarbeitung ist es meines Erachtens sehr wichtig, sich das [http://www.geda.seul.org/wiki/geda:gsch2pcb_tutorial Tutorial] durchzulesen. &amp;lt;i&amp;gt;PCB&amp;lt;/i&amp;gt; und &amp;lt;i&amp;gt;Gschem&amp;lt;/i&amp;gt; sind nicht besonders einfach zu benutzen. Gerade am Anfang, wenn man sich versucht damit einzuarbeiten. Aber wenn man einmal mit dem Werkzeug arbeiten kann, wird man es nicht mehr missen wollen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Wichtige Einstellungen &amp;amp; Tips ===&lt;br /&gt;
&lt;br /&gt;
Die neue GTK+ Version aus dem CVS Archiv ist der alten, etwas angestaubten Version vorzuziehen. Auch das Kompilieren ist nicht wirklich schwierig. Alles, was dazu notwendig ist (und das Programm hat keine großen Abhängigkeiten), ist in der Readme erklärt. Somit fällt die Kompilierung recht einfach aus.&lt;br /&gt;
&lt;br /&gt;
Auf der linken Seite befindet sich die Auswahl der jeweiligen Layer. Gerade bei Verwendung des Autorouters sollte man hier den 2. Layer deaktivieren. Dies kann ganz einfach mit einem Klick auf die Beschriftung erfolgen (component, GND-comp und VCC-comp). Ebenso sollte man unused (grün) und unused (blau) deaktivieren.&lt;br /&gt;
&lt;br /&gt;
Als Route Style verwende ich den &#039;&#039;Power Style&#039;&#039; mit einer Dicke von 25 Mil (0.6 mm). Der &#039;&#039;Signal Style&#039;&#039; scheint mir gerade bei schlechten Belichtungsverhältnissen nicht ganz optimal zu sein.&lt;br /&gt;
&lt;br /&gt;
=== Autorouter ===&lt;br /&gt;
&lt;br /&gt;
Der Autorouter von &amp;lt;i&amp;gt;PCB&amp;lt;/i&amp;gt; hat einige Schwächen, welche allerdings bei Hobby-Projekten völlig belanglos sind: Beispielsweise kann es bei TQFP-Gehäusen mit 100 Pins u. 0.5mm Pinabstand zu Problemen kommen, 64polige TQFP-Gehäuse (z.&amp;amp;nbsp;B. vom ATmega 128) gehen jedoch ohne Probleme. &lt;br /&gt;
&lt;br /&gt;
Hat man sich soweit im [http://www.geda.seul.org/wiki/geda:gsch2pcb_tutorial Tutorial] durchgearbeitet und seine Bauteile positioniert, kann der Autorouter zum Einsatz kommen. Auch hier ist ein wenig Experimentierfreude erforderlich, um zu zufriedenstellenden Ergebnissen zu kommen.&lt;br /&gt;
&lt;br /&gt;
Unter &#039;&#039;&#039;Connects / Optimize routed Tracks / Miter&#039;&#039;&#039; können die gerouteten Linien in 45 Grad Winkel modifiziert werden.&lt;br /&gt;
&lt;br /&gt;
=== Footprints ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pcbgtk.png|right|thumb|Screenshot]]&lt;br /&gt;
&lt;br /&gt;
Sehr wichtig für das Zusammenspiel zwischen dem Schaltplaneditor [http://www.geda.seul.org/tools/gschem/ Gschem] und dem [http://pcb.sourceforge.net PCB] ist die Verwendung der richtigen Footprints.&lt;br /&gt;
&lt;br /&gt;
Mir persönlich ist aufgefallen, daß viele Pads zu klein sind. Gerade im Bereich der Hobbyätzerei könnten sie ruhig größer ausfallen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=1&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
   &amp;lt;th&amp;gt;Element&amp;lt;/th&amp;gt;&lt;br /&gt;
   &amp;lt;th&amp;gt;Footprint&amp;lt;/th&amp;gt;&lt;br /&gt;
   &amp;lt;th&amp;gt;Alternativer Footprint&amp;lt;/th&amp;gt;&lt;br /&gt;
   &amp;lt;th&amp;gt;Beschreibung&amp;lt;/th&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
   &amp;lt;td&amp;gt;Widerstand 1/4 Watt&amp;lt;/td&amp;gt;&lt;br /&gt;
   &amp;lt;td&amp;gt;R0w4&amp;lt;/td&amp;gt;&lt;br /&gt;
   &amp;lt;td&amp;gt;R025&amp;lt;/td&amp;gt;&lt;br /&gt;
   &amp;lt;td&amp;gt;Ich benutze R0w4, weil es die Pads größer sind.&amp;lt;/td&amp;gt;&lt;br /&gt;
 &amp;lt;/tr&amp;gt;&lt;br /&gt;
 &amp;lt;tr&amp;gt;&lt;br /&gt;
   &amp;lt;td&amp;gt;Elko&amp;lt;/td&amp;gt;&lt;br /&gt;
   &amp;lt;td&amp;gt;CR200&amp;lt;/td&amp;gt;&lt;br /&gt;
   &amp;lt;td&amp;gt;RADIAL_CAN 200&amp;lt;/td&amp;gt;&lt;br /&gt;
   &amp;lt;td&amp;gt;CR200 ist für größere Elkos (Umfang), während bei RADIAL_CAN 200 der Umfang kleiner ist. Leider fehlt die Polarität bei diesem Symbol.  Allgemein jedoch sind bei beiden Elementen die Pads zu klein.&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Pcb_widerstand.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mir waren irgendwie alle Widerstände nicht ideal genug.&lt;br /&gt;
Die Löcher werden ja meist mit 0.8mm gebohrt: (0.8 mm * (1 mil/ 0.0254 mm) = 31 mil. Eine Richtlinie für den gesamten Paddurchmesser habe ich nicht gefunden. Aus einer Elektor Platine habe ich mit Meßschieber ungefähr 2 mm gemessen, also 78 mil.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Element[&amp;quot;&amp;quot; &amp;quot;R__0w4_10.16mm&amp;quot; &amp;quot;&amp;quot; &amp;quot;&amp;quot; 0 0 0 -10300 0 100 &amp;quot;&amp;quot;]&lt;br /&gt;
(&lt;br /&gt;
    Pin[0 0 7800 3100 6100 3500 &amp;quot;&amp;quot; &amp;quot;1&amp;quot; &amp;quot;edge2&amp;quot;]&lt;br /&gt;
    Pin[40000 0 7800 3100 6100 3500 &amp;quot;&amp;quot; &amp;quot;2&amp;quot; &amp;quot;edge2&amp;quot;]&lt;br /&gt;
    ElementLine [7900 0 4400 0 1000]&lt;br /&gt;
    ElementLine [32000 0 35500 0 1000]&lt;br /&gt;
    ElementLine [7900 -3300 7900 3300 1000]&lt;br /&gt;
    ElementLine [32000 -3300 32000 3300 1000]&lt;br /&gt;
    ElementLine [7900 -3300 32000 -3300 1000]&lt;br /&gt;
    ElementLine [7900 3300 32000 3300 1000]&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für Kapazitäten mit einer Breite von 2.54 mm oder 5.08 mm nutze ich folgendes Element&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Element[&amp;quot;&amp;quot; &amp;quot;&amp;quot; &amp;quot;&amp;quot; &amp;quot;&amp;quot; 65000 78500 0 0 0 100 &amp;quot;&amp;quot;]&lt;br /&gt;
(&lt;br /&gt;
    Pin[2000 -2500 7000 3000 4200 2000 &amp;quot;&amp;quot; &amp;quot;cap_2&amp;quot; &amp;quot;edge2&amp;quot;]&lt;br /&gt;
    Pin[-8000 -2500 7000 3000 4200 2000 &amp;quot;&amp;quot; &amp;quot;cap_1&amp;quot; &amp;quot;edge2&amp;quot;]&lt;br /&gt;
    Pin[-18000 -2500 7000 3000 4200 2000 &amp;quot;&amp;quot; &amp;quot;cap_1&amp;quot; &amp;quot;edge2&amp;quot;]&lt;br /&gt;
    Pad[-16000 -2500 -10000 -2500 1000 2000 3000 &amp;quot;&amp;quot; &amp;quot;1&amp;quot; &amp;quot;&amp;quot;]&lt;br /&gt;
    ElementLine [-4000 -6500 -4000 2500 1399]&lt;br /&gt;
    ElementLine [-2000 -6500 -2000 2500 1399]&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für eine Breite von 5.08 mm oder 7.62 mm nutze ich folgendes Element:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Element[&amp;quot;&amp;quot; &amp;quot;&amp;quot; &amp;quot;&amp;quot; &amp;quot;&amp;quot; 63000 93500 0 0 0 100 &amp;quot;&amp;quot;]&lt;br /&gt;
(&lt;br /&gt;
    Pin[14000 -4500 7000 3000 4200 2000 &amp;quot;&amp;quot; &amp;quot;cap_2&amp;quot; &amp;quot;edge2&amp;quot;]&lt;br /&gt;
    Pin[4000 -4500 7000 3000 4200 2000 &amp;quot;&amp;quot; &amp;quot;cap_2&amp;quot; &amp;quot;edge2&amp;quot;]&lt;br /&gt;
    Pin[-16000 -4500 7000 3000 4200 2000 &amp;quot;&amp;quot; &amp;quot;cap_1&amp;quot; &amp;quot;edge2&amp;quot;]&lt;br /&gt;
    Pad[5500 -4500 12500 -4500 1000 2000 3000 &amp;quot;&amp;quot; &amp;quot;1&amp;quot; &amp;quot;edge2&amp;quot;]&lt;br /&gt;
    ElementLine [-7500 -8500 -7500 500 1399]&lt;br /&gt;
    ElementLine [-5500 -8500 -5500 500 1399]&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gschem ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Gschem.png|right|thumb|Screenshot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;i&amp;gt;gschem&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt; ist der Schaltplaneditor aus dem Open Source Projekt gEDA. &amp;lt;i&amp;gt;gschem&amp;lt;/i&amp;gt; wird hauptsächlich auf Linux Rechnern entwickelt, läuft aber auch auf anderen Unix-Betriebssystemen und unter Windows. &amp;lt;i&amp;gt;gschem&amp;lt;/i&amp;gt; ist für die Linuxdistributionen RedHat und Debian als Paket verfügbar, für Windows ist nur eine ältere Version erhältlich und für alle anderen ist selber kompilieren angesagt.&lt;br /&gt;
&lt;br /&gt;
Die Bedienung ist nicht sonderlich anfängerfreundlich. Hat man sich aber mal daran gewöhnt, dass jeder Menupunkt mit 1 oder 2 Tasten erreichbar ist, läßt sich&#039;s mit &amp;lt;i&amp;gt;gschem&amp;lt;/i&amp;gt; prima arbeiten. &lt;br /&gt;
&lt;br /&gt;
In der Symbolbibliothek (die auch online betrachtet werden kann) sind etwas mehr als 1000 Symbole; das Selbsterzeugen von Symbolen ist jedoch problemlos möglich. Insbesondere ist es aufgrund des gut dokumentierten und einfachen Datei-Formates möglich, mit einfachen Perl-Programmen z.&amp;amp;nbsp;B. aus Reports von Xilinx ISE Symbole zu erzeugen und automatisch zu aktualisieren, wenn sich die Pinzuordnung ändert. Das fehlerhafte Eingeben der Pinbelegung von CPLDs und FPGAs von Hand und die Änderung derselben ist damit für &amp;lt;i&amp;gt;gschem&amp;lt;/i&amp;gt; User Geschichte.&lt;br /&gt;
&lt;br /&gt;
Die Schaltpläne lassen sich als png und als Postscript exportieren. &lt;br /&gt;
&lt;br /&gt;
Netzlisten (insgesamt über 20 Formate für PCB, Protel, Eagle, BAE, spice, pads, ... ) lassen sich mit dem Programm &amp;lt;i&amp;gt;gnetlist&amp;lt;/i&amp;gt; generieren. Aus diesem Grund ist man (bis auf die Namen der Footprints) unabhängig von der verwendeten Layout-Software und kann diese auch sehr leicht wechseln.&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil der gEDA-Suite sind die Dateiformate, welche alle reiner ASCII-Text sind. Dies macht die Entwicklung von Helper-Tools zur Lösung von speziellen Aufgaben sehr leicht. Außerdem können die Dateien deswegen sehr einfach in Versionsverwaltungssystemen wie CVS verwaltet werden, was insbesondere die Entwickler größerer Projekte zu schätzen wissen.&lt;br /&gt;
&lt;br /&gt;
Nähere Informationen über &amp;lt;i&amp;gt;gschem&amp;lt;/i&amp;gt; (gEDA) gibt es unter [[http://www.geda.seul.org/ http://www.geda.seul.org/]].&lt;br /&gt;
&lt;br /&gt;
== BAE ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Bartels AutoEngineer&amp;lt;/b&amp;gt; (&amp;lt;b&amp;gt;&amp;lt;i&amp;gt;BAE&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;) unterstützt die Erstellung von Schaltplänen, Leiterplatten und integrierten Schaltungen und läuft unter Windows, Linux und verschiedenen X11-/Unix-Systemen. Der Schaltplaneditor kann Pläne auf beliebig vielen Blättern erstellen, wobei auch hierarchische Strukturen möglich sind. Der Autorouter erzeugt recht brauchbare Ergebnisse, wobei beliebige Teile mit der Hand vorab geroutet werden können. Ein Autoplacer ist ebenfalls vorhanden.&lt;br /&gt;
&lt;br /&gt;
Eine auf Schaltplaneingabe beschränkte Version und eine kastrierte Evaluierungsversion sind auf der [http://www.bartels.de/bae/bae_de.htm BAE Homepage] downloadbar.&lt;br /&gt;
&lt;br /&gt;
Die [http://www.bartels.de/bae/baeprice_de.htm preiswerteste] kostenpflichtige Version ist das &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;BAE Light&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;. Diese Version ist auf Leiterplatten der Groesse 160x100 und auf 2 Layer beschränkt, eine Beschränkung auf eine bestimmte Pinanzahl gibt es aber nicht.&lt;br /&gt;
&lt;br /&gt;
Ansonsten wird eine Economy-, Professional- und Highendversion angeboten, die jeweiligen Eigenschaften sind im Abschnitt [http://www.bartels.de/baedoc/inst_de.htm Bartels AutoEngineer Softwarekonfigurationen] erklärt. Interessant ist z.&amp;amp;nbsp;B. der Bauteilhöhencheck.&lt;br /&gt;
&lt;br /&gt;
Mit dem &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;BAE IC Design&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt; dringt man bis in den Bereich der IC-Entwicklung vor.&lt;br /&gt;
&lt;br /&gt;
[[BAE-Tutorial]]&lt;br /&gt;
&lt;br /&gt;
== TARGET 3001! == &lt;br /&gt;
[[Bild:target3001.png|right|thumb|Screenshot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;i&amp;gt;TARGET 3001!&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt; für Windows (ME/NT4/2000/XP/Vista) bietet folgende Funktionen&lt;br /&gt;
&lt;br /&gt;
* Schaltplan&lt;br /&gt;
* Bauteilerstellung &lt;br /&gt;
* Schaltungssimulation (PSPICE-Syntax)&lt;br /&gt;
* Platinen-Layout mit Autoplatzierer&lt;br /&gt;
* Autorouter &lt;br /&gt;
* Anzeige der Platine in 3D&lt;br /&gt;
* Frontplattenentwurf direkt an oder über der Platine&lt;br /&gt;
&lt;br /&gt;
Die Platinen-Layout-Software ist in deutscher, englischer oder französischer Sprache. Es gibt eine für nicht kommerzielle Anwendungen kostenlose Version: &amp;lt;b&amp;gt;TARGET 3001! discover&amp;lt;/b&amp;gt; ist beschränkt auf 250 Pins/Pads, 2 Kupferlagen&lt;br /&gt;
und 30 Signale sind simulierbar, die Fläche ist unbeschränkt (1,2m x 1,2m).&lt;br /&gt;
&lt;br /&gt;
Auf der c&#039;t 11/07 CD ist eine &amp;lt;b&amp;gt;SE Version&amp;lt;/b&amp;gt; von TARGET 3001! verfügbar welche 400 Pins/Pads verarbeiten kann. &lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;b&amp;gt;PCB-Pool Edition&amp;lt;/b&amp;gt; hat keine Beschränkungen, speichert aber die Layouts in einem von normalen Target Versionen nicht lesbaren Format. Diese Layouts können dann allerdings nur zum selbst Ätzen ausgedruckt werden oder vom PCB-POOL® produziert werden.&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* [http://server.ibfriedrich.com/wiki/ibfwikide Target3001 Homepage]&lt;br /&gt;
* [http://www.pcb-pool.com/ppde/service_downloads.html Target3001 PCB-Pool-Edition]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;TARGET 3001!&amp;lt;/i&amp;gt; bietet ein typisches Windows Look-And-Feel. Eine einfache Einführung findet sich &#039;&#039;&#039;[http://server.ibfriedrich.com/wiki/ibfwikide/index.php?title=Kurzeinführung2 hier]&#039;&#039;&#039;. Wer sich schon mit Eagle auskennt, kann auch &#039;&#039;&#039;[http://server.ibfriedrich.com/wiki/ibfwikide/index.php?title=Eagle hier]&#039;&#039;&#039; schauen. Es gibt kostenlosen direkten Service durch den Hersteller telefonisch oder per E-Mail auch für Einsteiger oder Demo-User.&lt;br /&gt;
&lt;br /&gt;
== ExpressPCB ==&lt;br /&gt;
&lt;br /&gt;
Die Firma &amp;lt;b&amp;gt;ExpressPCB&amp;lt;/b&amp;gt; bietet den kostenlosen Schaltplaneditor &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;ExpressSCH&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt; an. Zusätzlich gibt es das kostenlose Layoutprogramm &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;ExpressPCB&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt; zum Erstellen von zwei- und vierlagigen Leiterplatten. Die beiden Programme sind auf Windows (NT, 2000, XP, Vista) beschränkt. &lt;br /&gt;
&lt;br /&gt;
Die Firma bietet auf der [http://www.expresspcb.com/ ExpressPCB Homepage] ausserdem einen kommerziellen Service für die Herstellung von zwei- und vierlagigen Leiterplatten an. &lt;br /&gt;
&lt;br /&gt;
Auf der Seite finden sich [http://www.expresspcb.com/ExpressPCBHtm/Tips.htm hier] einige Hinweise zum Entwurf von Leiterplatten.&lt;br /&gt;
&lt;br /&gt;
== JFig ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Jfig.png|right|thumb|Screenshot]]&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;i&amp;gt;JFig&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt; ist eigentlich ein &amp;quot;ganz normales&amp;quot; Vektorzeichenprogramm. Um Schaltpläne zu zeichnen benötigt man deshalb zusätzliche Symbolbibliotheken. &lt;br /&gt;
&lt;br /&gt;
Die Exportmöglichkeiten für das weitverbreitete fig-Format sind sehr vielfältig: mit dem Zusatzprogramm &amp;lt;i&amp;gt;fig2dev&amp;lt;/i&amp;gt;, das direkt aus dem &amp;lt;i&amp;gt;jfig&amp;lt;/i&amp;gt;-Menü aufgerufen kann, bleiben von Postscript über PNG bis hin zu [[LaTeX]] kaum Wünsche offen. Für kleine Schaltpläne oder Diagramme, die ausgedruckt oder in PDF-Dateien verbreitet werden sollen, gibt es deshalb nichts besseres.&lt;br /&gt;
&lt;br /&gt;
Das Programm ist ein komplett in [http://java.sun.com/ Java] geschriebener 1:1-Klon des [[Linux]]-Programms &amp;lt;i&amp;gt;xfig&amp;lt;/i&amp;gt; und sollte daher mit jedem Betriebssystem von Windows bis Mac OS laufen. Es ist kostenlos auf [http://tams-www.informatik.uni-hamburg.de/applets/jfig/ http://tams-www.informatik.uni-hamburg.de/applets/jfig/] erhältlich.&lt;br /&gt;
&lt;br /&gt;
Die Bedienung wird für Windows-Benutzer am Anfang wohl ziemlich ungewohnt sein, aber wenn man mal das Grundprinzip verstanden, hat findet man sich durch die eindeutig beschrifteten Schaltflächen schnell zurecht.&lt;br /&gt;
&lt;br /&gt;
== Kicad ==&lt;br /&gt;
&lt;br /&gt;
[[KiCAD]] ([http://www.lis.inpg.fr/realise_au_lis/kicad/ Homepage&amp;amp;Download]) ist ein Paket aus Design / Layout / Routing Programmen. Es basiert auf wxWidgets und ist damit plattformübergreifend. Die Progamme sind unter der GPL veröffentlicht und damit Open Source.&lt;br /&gt;
&lt;br /&gt;
Eine Kicad User-Group findet sich unter http://groups.yahoo.com/group/kicad-users/. Die Anmeldung erfolgt erst, nachdem man vom Besitzer der User-Group freigeschaltet wurde (wie üblich für die meisten Yahoo-Groups).&lt;br /&gt;
&lt;br /&gt;
Neben der mitgelieferten, bereits umfangreichen Bibliothek gibt es auf vielen anderen Seiten (z.&amp;amp;nbsp;B. http://www.kicadlib.org/) weitere Bibliotheken zum Download, die einfach integriert werden können.&lt;br /&gt;
&lt;br /&gt;
Für Umsteiger von anderen Programmen sollten sich nach wenigen Stunden bereits die gleichen Ergebnisse erzielen lassen. Beim Erlernen kann das Tutorial von http://www.curiousinventor.com/guides/kicad helfen.&lt;br /&gt;
&lt;br /&gt;
Kicad liefert eine schöne 3D-Ansicht des fertigen Layouts einschließlich der bestückten Bauteile, so dass man an dieser Stelle schon einmal einen Überblick bekommt, ob vielleicht nicht doch etwas vergessen wurde. Es gibt zwar nicht für alle Bauformen ein 3D-Modell, allerdings lassen sich diese selbst erstellen.&lt;br /&gt;
&lt;br /&gt;
Als Nachteil ließe sich noch aufführen, dass der PCB-Layouter in der neusten Version (Januar 2006) etwas instabil ist und gerne abstürzt. Ebenso sind die Autorouterfunktionen nicht gut dokumentiert.&lt;br /&gt;
&lt;br /&gt;
== TinyCAD ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TinyCAD&#039;&#039;&#039; ist ein weiterer &#039;&#039;open source&#039;&#039; Schaltplaneditor für Windows. Mehr Infos gibt es auf der Projektseite http://tinycad.sourceforge.net&lt;br /&gt;
&lt;br /&gt;
TinyCAD kann z.&amp;amp;nbsp;B. mit VeeCAD (s.u.) kombiniert werden.&lt;br /&gt;
&lt;br /&gt;
== VeeCAD ==&lt;br /&gt;
&lt;br /&gt;
[http://veecad.com/ VeeCAD] Stripboard Layout Editor ist ein Werkzeug, um [[Lochrasterplatine]]n zu entwerfen. VeeCAD ist als kommerzielle Version und als eingeschränkte Freiversion erhältlich.&lt;br /&gt;
&lt;br /&gt;
== AACircuit ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AACircuit&#039;&#039;&#039; ist ein Schaltplaneditor mit einer Ausgabe als ASCII-Grafik. Das Programm wurde dafür entwickelt, um mal eben eine Frage oder eine Antwort in &#039;&#039;newsgroups&#039;&#039;, Chats oder Foren zu veranschaulichen, wenn keine Upload-Möglichkeit von Bilddateien da ist. AACircuit gibt es bei http://www.tech-chat.de/&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  .---o----o------o---o---------------o---o----o------------o 12-15V&lt;br /&gt;
  |   |    |  22uF| + |               |   |    |&lt;br /&gt;
 .-.  |   .-.    ###  |              .-.  |    |    .-------o&lt;br /&gt;
 | |&amp;lt;-&#039;   | |    ---  |              | |  |    |    |   .---o&lt;br /&gt;
 | |5k    | |5k6  |   |              | |  |    |    |   |&lt;br /&gt;
 &#039;-&#039;      &#039;-&#039;     |   o--.           &#039;-&#039;  |   _|_   o  /o&lt;br /&gt;
  |        |     ===  |  |            |   |  |_/_|-   /&lt;br /&gt;
 .-.       |     GND  | ---100n   LED V   -    |     /&lt;br /&gt;
 | |       |          | ---           -   ^    |    o&lt;br /&gt;
 | |6k2    |          |  |            |   |    |    |&lt;br /&gt;
 &#039;-&#039;       |          | GND           &#039;---o----o    &#039;-------o&lt;br /&gt;
  |        |       2|\|7                       |&lt;br /&gt;
  o-----------------|-\ LM741      ___       |/&lt;br /&gt;
  |        |        |  &amp;gt;-------o--|___|--o---|&lt;br /&gt;
  |        o---o----|+/ 6      |   22k   |   |&amp;gt;  BC547&lt;br /&gt;
  |        |   |   3|/|4       |         |     |&lt;br /&gt;
 .-.       |   |     ===       o---.    .-.    |&lt;br /&gt;
 | |       |   o---. GND       |   |    | |5k6 |&lt;br /&gt;
 | |2k7   .-.  |   |   ___    _V_  |    | |    |&lt;br /&gt;
 &#039;-&#039;     KTY10 | + &#039;--|___|--|___|-&#039;    &#039;-&#039;    |&lt;br /&gt;
  |       | | ###      47k   220k        |     |&lt;br /&gt;
  |       &#039;-&#039; ---                        |     |&lt;br /&gt;
  |        |   |                         |     |&lt;br /&gt;
  |        |   |                         |     |&lt;br /&gt;
  &#039;--------o---o-------------------------o-----o------------o GND&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== sPlan ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;sPlan&#039;&#039;&#039; ist ein rel. preiswerter Schaltplaneditor für Windows (95,98,ME,NT,2000,XP)&lt;br /&gt;
Infos und eine Demoversion von sPlan gibt es u.a. bei http://www.abacom-online.de/html/splan.html&lt;br /&gt;
&lt;br /&gt;
== Basic Schematic == &lt;br /&gt;
&lt;br /&gt;
Basic Schematic (&#039;&#039;&#039;BSch3V&#039;&#039;&#039;) ist ein freier Schaltplaneditor für Windows (98/Me/2000/XP). Ein ZIP-Archiv mit engl. Programm, Handbuch und Sourcecode gibt es bei http://www.suigyodo.com/online/e/index.htm. Ebenso ist dort eine Cross-Plattform Version &#039;&#039;&#039;Qt-BSch3V&#039;&#039;&#039; auf der Basis von Qt-Grafiklibraries erhältlich.&lt;br /&gt;
&lt;br /&gt;
== Fritzing ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fritzing&#039;&#039;&#039; ist ein sich zur Zeit (Januar 2009) im Preview-Stadium befindendes Programm, welches einmal zu einer vollwertigen Electronic Design Automation (EDA) Software ausgebaut werden soll. Der Editor verwende die Metapher eines Breadboards (Steckbretts), auf dem die Benutzer virtuell Bauteile einstecken. Fritzings Zielgruppe sind Künstler und Designer, nicht Elektroniker, und die Software soll speziell auf diese Zielgruppe zugeschnitten werden. Dabei wird auf eine niedrige Zugangsschwelle wert gelegt.&lt;br /&gt;
&lt;br /&gt;
Preview-Versionen für Mac OS X, Linux und Windows (XP/Vista) sind bei http://www.fritzing.org/ erhältlich. Im jetzigen Zustand ist es eher für Neugierige geeignet, denn für ernsthafte Projektentwicklung.&lt;br /&gt;
&lt;br /&gt;
== Electric ==&lt;br /&gt;
&lt;br /&gt;
The [http://www.staticfreesoft.com/index.html Electric(TM)] [[VLSI]] Design System is an open-source Electronic Design Automation (EDA) system.&lt;br /&gt;
&lt;br /&gt;
== ProtoCAD ==&lt;br /&gt;
&lt;br /&gt;
[http://protomind.net/page.php?7 ProtoCAD] is a tool for creating circuit schematics rapidly. It is developed for use with stripboards (&#039;&#039;Lochrasterplatine&#039;&#039;, &#039;&#039;Lochstreifenplatine&#039;&#039;) but can also be used with other methods. (Java 1.5 compatible, Swing GUI, Opensource)&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[Schaltungssimulation]]&lt;br /&gt;
* [[Do&#039;s and dont&#039;s - Platinenlayout]]&lt;br /&gt;
* [[Lochrasterplatine]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Platinen]]&lt;/div&gt;</summary>
		<author><name>Jonebohne</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_PWM&amp;diff=46555</id>
		<title>AVR PWM</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_PWM&amp;diff=46555"/>
		<updated>2010-04-23T19:03:03Z</updated>

		<summary type="html">&lt;p&gt;Jonebohne: /* C */ Typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Vorwort==&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel ist noch nicht vollständig!&lt;br /&gt;
Und außerdem überschneidet er sich teilweise mit dem Tutorial, weil PWM und Timer zum Verständnis praktisch dasselbe sind. &lt;br /&gt;
Vielleicht kann ja jemand, der gerade dabei ist, sich diese Dinge anzueignen, die Beschreibung vorantreiben (erweitern/entschlacken)?&lt;br /&gt;
&lt;br /&gt;
Hier sollen die Möglichkeiten und die Funktionsweise der PWM mit AVRs erläutert werden, so daß Anfänger auf ihrem Weg zum Ziel unterstützt werden, ohne sich erst durch die wenig erklärenden Beiträge im Forum zu quälen.&lt;br /&gt;
Auch wenn das Verständnis (hoffentlich) dann nicht mehr aus dem Datenblatt kommen muß, ist dieses für die spezifischen Einstellungen und Feinheiten absolut notwendig. Aber mit dieser Übersicht sollte es leichter fallen, die relevanten Informationen schneller zu finden.&lt;br /&gt;
&lt;br /&gt;
Ich gehe dabei von meiner Situation aus: &amp;quot;Gerade mit AVRs angefangen, die LED blinkt, Taster wird abgefragt, schonmal von PWM gehört und unter den AVR Pins welche mit OC.. entdeckt, das hängt damit irgendwie zusammen.&amp;quot;&lt;br /&gt;
Man sollte sich auch um die Prozessorfrequenz gekümmert haben, also die [[AVR_Fuses]] entsprechend gesetzt haben.&lt;br /&gt;
&lt;br /&gt;
Wer in Begriff steht, sein erstes Board zu ätzen, sollte sich über die verschiedenen Möglichkeiten, die die OCnx Pins bieten, informiert haben.&lt;br /&gt;
&lt;br /&gt;
Übrigens lässt es sich besser lesen, wenn man sein Browserfenster so schmal macht, daß der Text in eine schöne Spalte gezwungen wird.&lt;br /&gt;
&lt;br /&gt;
==Einführung==&lt;br /&gt;
&lt;br /&gt;
Im AVR-GCC-Tutorial werden im Abschnitt DAC-Optionen ([http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#DAC_.28Digital_Analog_Converter.29           link]) verschiedene Möglichkeiten angesprochen, analoge Spannungen zu generieren.&lt;br /&gt;
&lt;br /&gt;
Darunter fällt auch die [[Pulsweitenmodulation]], bei der durch schnelles Ein- und  Ausschalten eines Ausgangs (über einen Filter) eine [[analog]]e Spannung generiert werden kann.&lt;br /&gt;
&lt;br /&gt;
Beim Dimmen von Lichtquellen wirkt die Trägheit des Auges als Filter, wenn z.&amp;amp;nbsp;B. eine LED im Mittel die Hälfte der Zeit eingeschaltet ist, scheint es also, als würde sie nur halb so hell leuchten.&lt;br /&gt;
&lt;br /&gt;
Bei Motoren läßt sich PWM gut zum Dosieren des Stroms einsetzen, ohne große Verluste zu haben.  Für einen Teil der Zeit wird also der volle Motorstrom eingeschaltet, d.h. das Drehmoment ist maximal.&lt;br /&gt;
&lt;br /&gt;
Die Rechtecksignale lassen sich mit Mikrocontrollern auf zwei Wegen erzeugen:&lt;br /&gt;
&lt;br /&gt;
PWM per Software&lt;br /&gt;
* Kostet Rechenzeit, erhöhter Softwareaufwand&lt;br /&gt;
* Signalausgabe auf jedem I/O-Pin möglich&lt;br /&gt;
* Höhere Kanalanzahl möglich&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
PWM per Hardware&lt;br /&gt;
* Läuft unabhängig vom Programm&lt;br /&gt;
* Bietet mehr Möglichkeiten bei gleichem Softwareaufwand &lt;br /&gt;
* Signalausgabe nur auf bestimmten, fest vorgegebenen Pins möglich&lt;br /&gt;
* Nur begrenzte Anzahl an PWM-Kanälen vorhanden (viele verbreitete AVR-Typen haben 2 bis 3, neuere auch mehr) &lt;br /&gt;
&lt;br /&gt;
Alles was mit Pulsen und Modulation zu tun hat, hat auch was mit Zeit zu tun - denn im Prinzip soll mit einer bestimmten Frequenz für eine bestimmte Dauer ein Pin eingeschaltet werden.&lt;br /&gt;
&lt;br /&gt;
Alles was bei Mikrocontrollern mit Zeit zu tun hat, hat wahrscheinlich auch etwas mit einem Timer bzw. Counter zu tun.&lt;br /&gt;
&lt;br /&gt;
==Timer / Counter==&lt;br /&gt;
&lt;br /&gt;
Unter [[Timer]] bzw. [[Counter]] (T/C) steht noch nicht soviel, aber man sollte kurz mal reinsehen, oder mehr dazu schreiben, oder die fehlende Verknüpfung anlegen.&lt;br /&gt;
&lt;br /&gt;
Ein Timer ist nichts anderes als ein selbständiger Zähler (Counter), der mit einer bestimmten Frequenz einen Wert raufzählt. Und zwar in Hardware, also unabhängig vom Programm. Seine Zählfrequenz wird vom Prozessortakt abgeleitet, das erledigt der [[Prescaler]] in einstellbaren Schritten (Frequenzteiler).&lt;br /&gt;
&lt;br /&gt;
Der Zählerstand läßt sich sowohl in Software als auch von der Hardware selbst überwachen - und schon lassen sich damit periodisch Ereignisse auslösen.&lt;br /&gt;
&lt;br /&gt;
Deswegen lassen sich die T/C für viele Zwecke verwenden, wir wollen den T/C für PWM nutzen (trotzdem gleich eine Übersicht über die verschiedenen Modi).&lt;br /&gt;
&lt;br /&gt;
Es lohnt sich natürlich, das Prinzip der T/C verstanden zu haben. Ein Blick ins GCC-Tutorial lohnt, die Atmel Application Note 130: Setup and Use the AVR Timers schadet auch nicht. &lt;br /&gt;
&lt;br /&gt;
Wie schon angedeutet, gibt es - je nach AVR - einen oder mehrere T/C . Sie unterscheiden sich erwartungsgemäß durch ihre Parameter und Optionen, z.&amp;amp;nbsp;B. die Auflösung, Frequenz, Zählweise und andere Betriebsmodi.&lt;br /&gt;
&lt;br /&gt;
Und natürlich auch durch den Namen, der sich auch in den [[Register]]n widerspiegelt: Sie werden nämlich numeriert (im Folgenden hier und im Datenblatt mit Platzhalter n). &lt;br /&gt;
&lt;br /&gt;
T/C 0 ist beim tiny2313 der &#039;einfache&#039; mit 8 Bit Auflösung (das Aus-An Verhältnis läßt sich in 256 Stufen einstellen), T/C 1 dagegen hat eine Auflösung von 16 Bit und bietet einige weitere Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
=== 8 oder 16 Bit ? ===&lt;br /&gt;
Außer der Tatsache, daß die Auflösung bei 16 Bit mit 65536 Stufen um einiges größer ist, gibt es noch folgende Unterschiede:&lt;br /&gt;
&lt;br /&gt;
* Er verwendet einige 16 Bit Register&lt;br /&gt;
** Schreiben/Lesen dieser Register erfolgt in Schritten&lt;br /&gt;
* &lt;br /&gt;
&lt;br /&gt;
Mit dem Zähler alleine kann man noch nicht so viel anfangen. Ausgedacht wurde deswegen außerdem die&lt;br /&gt;
&lt;br /&gt;
=== Output Compare Unit ===&lt;br /&gt;
&lt;br /&gt;
was soviel bedeutet wie Ausgangsvergleichseinheit.&lt;br /&gt;
&lt;br /&gt;
Jeder Zähler hat eine oder mehrere voneinander unabhängige Output Compare Units (OC), auch wieder mit den dazugehörigen Registern.&lt;br /&gt;
&lt;br /&gt;
Die verschiedenen OCs und ihre Register werden mit Buchstaben (&#039;A&#039;, &#039;B&#039;) benannt. (Im PWM Modus hängt das direkt mit den Pins zusammen: OC1B ist der Ausgang der OC des T/C 1. Dazu gleich mehr..)&lt;br /&gt;
&lt;br /&gt;
Die OC vergleicht den Zählerstand (im Register TCNTn) ständig mit ihren eigenen Registerinhalten (0CRnx). Wenn diese übereinstimmen, passiert etwas.&lt;br /&gt;
&lt;br /&gt;
Was passiert, wird bestimmt durch die&lt;br /&gt;
&lt;br /&gt;
=== Betriebsmodi ===&lt;br /&gt;
&lt;br /&gt;
Der Zähler zählt. Die OC Unit vergleicht dessen Zählerstand mit einem Wert. Wenn diese übereinstimmen, kann etwas passieren.&lt;br /&gt;
&lt;br /&gt;
Weil es hier gleich mit den Einstellungen in den Registern losgeht, noch ein Hinweis:&lt;br /&gt;
&lt;br /&gt;
Die Kontrolle über das Verhalten der Zähler und OCs wird über Register vorgenommen, deren Namen nichts mit den OC Units zu tun haben!&lt;br /&gt;
Die Einstellungen sind lediglich auf zwei Register verteilt, die Timer/Counter Control Register - TCCRnA &amp;amp; TCCRnB.&lt;br /&gt;
&lt;br /&gt;
Ein paar Notizen:&lt;br /&gt;
* In verschiedenen Modi haben auch Bits in den Registern eine andere Bedeutung!&lt;br /&gt;
* Meist können Interrupts ausgelöst werden.&lt;br /&gt;
* Es kann häufig auch der Zählerstand per Software verändert werden.&lt;br /&gt;
* Die Frequenz der ausgegebenen Waveform hängt ab von&lt;br /&gt;
** I/O Clock (CPU)&lt;br /&gt;
** Prescaler&lt;br /&gt;
** Counter Modus&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die verschiedenen Modi (vorerst die vom 8 Bit Zähler):&lt;br /&gt;
&lt;br /&gt;
* Normal (evtl. für Software PWM)&lt;br /&gt;
* Clear Timer on Compare (CTC) (eingeschränkte PWM)&lt;br /&gt;
* Fast PWM&lt;br /&gt;
* Phase Correct PWM&lt;br /&gt;
&lt;br /&gt;
Dazu hier noch folgende Begriffe im Zusammenhang mit dem Zähler:&lt;br /&gt;
&lt;br /&gt;
 BOTTOM: 0x00&lt;br /&gt;
 MAX   : 0xFF bei 8 Bit, 0xFFFF bei 16 Bit&lt;br /&gt;
 TOP   : MAX oder OCRnx&lt;br /&gt;
&lt;br /&gt;
==== Normal==== &lt;br /&gt;
(evtl. für Software PWM)&lt;br /&gt;
&lt;br /&gt;
Der Zähler zählt rauf (BOTTOM-&amp;gt;MAX), und wird nicht zurückgesetzt, sondern läuft einfach über, und setzt dabei sein Overflow-Flag.&lt;br /&gt;
Dieser Modus wird zur PWM nicht empfohlen, weil er im Vergleich mit Hardware-PWM viel CPU-Zeit benötigt - das ist logisch:&lt;br /&gt;
Bei jedem Nulldurchgang müsste man einen Interrupt verwenden, der dann eine Routine ausführt, die den Ausgang umschaltet. Und man müsste den Zählerstand manipulieren, um die Pulslänge zu verändern.&lt;br /&gt;
&lt;br /&gt;
Für die verhältnismäßig langsame (Menschenzeit) Programmsteuerung ist dieser Modus aber ideal. Während das Hauptprogramm i.A. einfach endlos durchläuft, wird die Programmzeit durch einen Timer(-Interrupt) in Time-Slots gerastert (z.&amp;amp;nbsp;B. 1/10s). Damit lassen sich bequem Wartezeiten bzw. zeitabhängige Ereignisse steuern, ohne das Programm anzuhalten.&lt;br /&gt;
&lt;br /&gt;
====  Clear Timer on Compare (CTC)==== &lt;br /&gt;
(eingeschränkte PWM)&lt;br /&gt;
&lt;br /&gt;
Der Zähler zählt hoch, bis er mit OCRnx übereinstimmt (BOTTOM-&amp;gt;OCRnx: Match!) und wird dann auf Null gesetzt. Der maximale Wert lässt sich also über das Register OCRnx komfortabel bestimmen.&lt;br /&gt;
&lt;br /&gt;
Konkret bedeutet das, dass die in diesem Modus vom Prescaler erzeugte Basisfrequenz nochmals durch den Wert von OCRnx geteilt wird.&lt;br /&gt;
&lt;br /&gt;
Für PWM:&lt;br /&gt;
&lt;br /&gt;
Wenn eingestellt ist, dass der OC-Ausgang bei jedem Match umschaltet (toggle), entspricht der eingestellt Wert dem Pulsweitenverhältnis.&lt;br /&gt;
Bei OCRnx=128 des 8 Bit T/C wäre also etwa die Hälfte der Zeit der Pin eingeschaltet.&lt;br /&gt;
&lt;br /&gt;
Allerdings kann das beim T/C 0 des tiny2313 nur der Ausgang A (OC0A). Also ins Datenblatt gucken!&lt;br /&gt;
&lt;br /&gt;
====  Fast PWM====&lt;br /&gt;
&lt;br /&gt;
Einer von den zwei eigentlichen PWM-Betriebsarten der Counter.&lt;br /&gt;
&lt;br /&gt;
Zählt von BOTTOM bis TOP, wobei TOP entweder 0xFF oder OCRnx sein kann.&lt;br /&gt;
&lt;br /&gt;
Bei einem Match wird im&lt;br /&gt;
&lt;br /&gt;
a) nicht-invertierenden Modus&lt;br /&gt;
der Zähler gelöscht, und bei BOTTOM gesetzt&lt;br /&gt;
&lt;br /&gt;
b) invertierenden Modus&lt;br /&gt;
der Zähler gesetzt, und bei BOTTOM gelöscht.&lt;br /&gt;
&lt;br /&gt;
Klingt theoretisch kompliziert, praktisch invertiert es nur den Ausgang.&lt;br /&gt;
Aber der Vergleichswert muss anscheinend ständig aktualisiert werden!?&lt;br /&gt;
&lt;br /&gt;
Dieser Modus hat eine asymmetrische Ausgangsform, weil der Ausgang periodisch umgeschaltet wird (also immer nach der gleichen Zeit) und dann nach Ablauf der variablen Pulslänge wieder invertiert wird.&lt;br /&gt;
&lt;br /&gt;
Und es gibt noch einen Toggle-Modus, der allerdings nur für den Ausgang OC0A zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
====  Phase Correct PWM==== &lt;br /&gt;
&lt;br /&gt;
Ist nur halb so schnell wie Fast PWM, dafür aber mit symmetrischer Wellenform.&lt;br /&gt;
&lt;br /&gt;
Erreicht wird das, indem von BOTTOM-&amp;gt;TOP gezählt wird, und dann wieder runter: TOP-BOTTOM.&lt;br /&gt;
&lt;br /&gt;
TOP kann entweder 0xFF oder OCRnx sein.&lt;br /&gt;
&lt;br /&gt;
Auch hier gibt es wieder den nicht-invertierenden, den invertierenden, und den toggle-Modus (nicht an OC0B).&lt;br /&gt;
&lt;br /&gt;
Der symmetrische PWM-Modus wird gerne für Motorsteuerungen verwendet, wenn man den Strom in den Motorwindungen messen möchte.  Da man nicht während der Schaltzeitpunkte der H-Brückentransistoren messen möchte (noise), braucht man einen Messzeitpunkt der maximal weit von diesen Schaltzeitpunkten entfernt ist.  Die BOTTOM und TOP Werte des Counters bieten genau dies, da sie in der Mitte des High- bzw. Lowpegels liegen.&lt;br /&gt;
&lt;br /&gt;
==Praktisches Vorgehen==&lt;br /&gt;
&lt;br /&gt;
* Pins low setzen&lt;br /&gt;
* Pins als Ausgang konfigurieren.&lt;br /&gt;
* Geeignete Wellenform ermitteln&lt;br /&gt;
* Registerinformationen für ausgewählten T/C im Datenblatt aufschlagen&lt;br /&gt;
* Modus &amp;amp; Prescaler setzen und damit starten&lt;br /&gt;
** Bits in Control-Register TCCRnA &amp;amp; TCCRnB schreiben. Siehe [[Bitmanipulation]]&lt;br /&gt;
* Vergleichswert OCRnx setzen&lt;br /&gt;
&lt;br /&gt;
==Programmbeispiele==&lt;br /&gt;
&lt;br /&gt;
===PWM per Software===&lt;br /&gt;
====Pseudocode====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//Initialisierung&lt;br /&gt;
pwm_phase = 0   // von 0 bis 100(99) ergibt ein moduliertes Signal&lt;br /&gt;
pwm_soll = 30  // Tastverhältnis in Prozent (Werte von 0..100)&lt;br /&gt;
&lt;br /&gt;
//alle s Sekunden tue:&lt;br /&gt;
wenn pwm_soll = pwm_phase dann&lt;br /&gt;
  ausgang = LOW&lt;br /&gt;
wenn pwm_phase++ = 100 dann&lt;br /&gt;
  pwm_phase = 0&lt;br /&gt;
  ausgang = HIGH&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das Tastverhältnis ist &amp;lt;math&amp;gt;t_\text{HIGH}=\frac{100}{\text{pwm}\_\text{soll}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Frequenz ist &amp;lt;math&amp;gt;f=\frac{100}{s} \text{Hz}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====ASM====&lt;br /&gt;
Der Code ist nicht von mir, ich hab den John Honniball auch nicht um Erlaubnis gefragt, den Code hier zu posten. Trozdem finde ich das Ganze recht nützlich und hab&#039; es mir trozdem erlaubt:&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
; ledpwm.asm --- drive a blue LED with PWM                     21/04/2006&lt;br /&gt;
; Copyright (c) 2006 John Honniball&lt;br /&gt;
&lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
            .org 0x0000&lt;br /&gt;
&lt;br /&gt;
; Blue LED on Port B bit 2&lt;br /&gt;
            .equ LEDPORT = PortB&lt;br /&gt;
            .equ LEDBIT = 0&lt;br /&gt;
&lt;br /&gt;
; This program drives a single LED connected to the AVR&#039;s I/O port.  It&lt;br /&gt;
; is connected so that the cathode of the LED is wired to the AVR pin,&lt;br /&gt;
; and the anode of the LED is wired to the 5V power supply via a&lt;br /&gt;
; resistor.  The value of that resistor depends on the colour of the LED,&lt;br /&gt;
; but is usually a few hundred ohms.&lt;br /&gt;
&lt;br /&gt;
; We control the brightness of the LED with Pulse Width Modulation (PWM),&lt;br /&gt;
; for two reasons.  Firstly, we have no analog outputs on the AVR chip,&lt;br /&gt;
; only digital ones.  Secondly, a LED&#039;s brightness  does not respond&lt;br /&gt;
; linearly to variations in supply voltage, but it responds much better&lt;br /&gt;
; to PWM.&lt;br /&gt;
&lt;br /&gt;
; Pulsating LED looks better if it never quite goes &amp;quot;off&amp;quot;, but cycles from&lt;br /&gt;
; full brightness to a dim state, and back again&lt;br /&gt;
            .equ MINBRIGHT = 25&lt;br /&gt;
            .equ MAXBRIGHT = 255&lt;br /&gt;
&lt;br /&gt;
; This value controls how fast the LED cycles from bright to dim.  It is&lt;br /&gt;
; the number of PWM cycles that we generate for each step in the brightness&lt;br /&gt;
; ramp, up and down.  Larger numbers will make the pulsation slower.&lt;br /&gt;
            .equ NCYCLES = 1&lt;br /&gt;
&lt;br /&gt;
; Start of program execution after a Reset&lt;br /&gt;
            ldi r16,low(RAMEND)                     ; Initialise stack to top of RAM&lt;br /&gt;
            out SPL,r16&lt;br /&gt;
            ldi r16,high(RAMEND)&lt;br /&gt;
            out SPH,r16&lt;br /&gt;
&lt;br /&gt;
; Initialise the hardware&lt;br /&gt;
            ldi r16,0xff                            ; Set Port B to all outputs&lt;br /&gt;
            out DDRB,r16&lt;br /&gt;
&lt;br /&gt;
            sbi LEDPORT,LEDBIT                      ; Switch off blue LED by setting output pin high&lt;br /&gt;
&lt;br /&gt;
; Start with LED at its lowest level, then ramp up to maximum&lt;br /&gt;
dopwm:      ldi r17,MINBRIGHT                       ; R17 holds current brightness level&lt;br /&gt;
l1:         ldi r18,NCYCLES                         ; R18 counts PWM cycles, and hence pulsation speed&lt;br /&gt;
l2:         cbi LEDPORT,LEDBIT                      ; Output pin low, LED on&lt;br /&gt;
            mov r16,r17                             ; R16 controls length of delay (= R17)&lt;br /&gt;
            rcall delayn4us                         ; Call delay subroutine&lt;br /&gt;
            sbi LEDPORT,LEDBIT                      ; Output pin high, LED off&lt;br /&gt;
            ldi r16,255&lt;br /&gt;
            sub r16,r17                             ; R16 controls length of delay (= 255 - R17)&lt;br /&gt;
            rcall delayn4us                         ; Call delay subroutine&lt;br /&gt;
            dec r18                                 ; Decrement PWM cycle counter&lt;br /&gt;
            brne l2&lt;br /&gt;
            inc r17                                 ; Increase brightness by one step&lt;br /&gt;
            brne l1&lt;br /&gt;
&lt;br /&gt;
; Now ramp back down to the minimum brightness&lt;br /&gt;
            ldi r17,MAXBRIGHT                       ; R17 holds current brightness level&lt;br /&gt;
l3:         ldi r18,NCYCLES                         ; R18 counts PWM cycles, and hence pulsation speed&lt;br /&gt;
l4:         cbi LEDPORT,LEDBIT                      ; Output pin low, LED on&lt;br /&gt;
            mov r16,r17                             ; R16 controls length of delay (= R17)&lt;br /&gt;
            rcall delayn4us                         ; Call delay subroutine&lt;br /&gt;
            sbi LEDPORT,LEDBIT                      ; Output pin high, LED off&lt;br /&gt;
            ldi r16,255&lt;br /&gt;
            sub r16,r17                             ; R16 controls length of delay (= 255 - R17)&lt;br /&gt;
            rcall delayn4us                         ; Call delay subroutine&lt;br /&gt;
            dec r18                                 ; Decrement PWM cycle counter&lt;br /&gt;
            brne l4&lt;br /&gt;
            dec r17                                 ; Decrease brightness by one step&lt;br /&gt;
            cpi r17,MINBRIGHT                       ; Have we reached the minimum?&lt;br /&gt;
            brne l3&lt;br /&gt;
&lt;br /&gt;
            rjmp dopwm                              ; Loop back to start&lt;br /&gt;
&lt;br /&gt;
; DELAYN4US&lt;br /&gt;
; Delay for (R16 * 4) microseconds&lt;br /&gt;
delayn4us:  tst r16                                 ; R16 = 0? (no delay)&lt;br /&gt;
            breq dly4&lt;br /&gt;
dly2:       ldi r24,low(16)&lt;br /&gt;
            ldi r25,high(16)&lt;br /&gt;
dly3:       sbiw r24,1                              ; 2 cycles&lt;br /&gt;
            brne dly3                               ; 2 cycles&lt;br /&gt;
            dec r16&lt;br /&gt;
            brne dly2&lt;br /&gt;
dly4:       ret                                     ; Return to caller&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====C====&lt;br /&gt;
&lt;br /&gt;
Ich wollte das hier mal ergänzen. Ich bin zwar noch ein Newbie aber es funktioniert. Man darf es aber gerne verbessern und/oder löschen...&lt;br /&gt;
Lg Fabi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
#warning &amp;quot;F_CPU war noch nicht definiert, wird nun mit 4000000 definiert&amp;quot;&lt;br /&gt;
#define F_CPU 4000000UL    		/* Quarz mit 4.00000 Mhz  */&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{	&lt;br /&gt;
	DDRB=0xFF;				// Port B als Ausgang&lt;br /&gt;
	int pwm_phase=0, pwm_soll=30;		// Dimmerwert definieren&lt;br /&gt;
	while(1)&lt;br /&gt;
	{&lt;br /&gt;
		if(pwm_soll==pwm_phase)&lt;br /&gt;
		{&lt;br /&gt;
			PORTB=0x01;		// LED+ Widerstand mit PB0 und +5V verbunden&lt;br /&gt;
		}&lt;br /&gt;
		pwm_phase++;&lt;br /&gt;
		if(pwm_phase==100)&lt;br /&gt;
		{&lt;br /&gt;
			pwm_phase=0;&lt;br /&gt;
			PORTB=0x00;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
(Ich habe es als Dimmbare LED entworfen. Deswegen die Beschreibung.)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====BASCOM====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &#039; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===PWM per Hardware===&lt;br /&gt;
&lt;br /&gt;
===Programmbeispiele===&lt;br /&gt;
====ASM====&lt;br /&gt;
Für AtMega8.&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
.include   &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
   .def   temp      = r16&lt;br /&gt;
&lt;br /&gt;
start:&lt;br /&gt;
   ldi    temp, LOW  (RAMEND)&lt;br /&gt;
   out    SPL, temp&lt;br /&gt;
   ldi    temp, HIGH (RAMEND)&lt;br /&gt;
   out    SPH, temp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   ldi    temp, 0xFF&lt;br /&gt;
   out    DDRB, temp								;define PortB as output&lt;br /&gt;
&lt;br /&gt;
   ldi    temp, 0xF3&lt;br /&gt;
   out    TCCR1A, temp							;10bit Phase Correct PWM&lt;br /&gt;
&lt;br /&gt;
   ldi    temp, 0x0A&lt;br /&gt;
   out    TCCR1B, temp							;set Prescaler&lt;br /&gt;
&lt;br /&gt;
   sei&lt;br /&gt;
&lt;br /&gt;
main:&lt;br /&gt;
   ldi    temp, 0x1&lt;br /&gt;
   out    OCR1AH, temp							;set pwm pin 1 highbyte&lt;br /&gt;
&lt;br /&gt;
   ldi    temp, 0x00&lt;br /&gt;
   out    OCR1AL, temp							;set pwm pin 1 lowbyte&lt;br /&gt;
														;pin: PortB1&lt;br /&gt;
&lt;br /&gt;
   ldi    temp, 0x00&lt;br /&gt;
   out    OCR1BH, temp							;set pwm pin 2 highbyte&lt;br /&gt;
&lt;br /&gt;
   ldi    temp, 0x00&lt;br /&gt;
   out    OCR1BL, temp							;set pwm pin 2 lowbyte&lt;br /&gt;
														;pin: PortB2&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
loop: &lt;br /&gt;
	rjmp   loop&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====C====&lt;br /&gt;
Hier wird mit dem 16-Bit-Counter 1 im 8-Bit-Mode eine LED gedimmt.&lt;br /&gt;
Die Frequenz ist &lt;br /&gt;
:&amp;lt;math&amp;gt;f=\frac{\text{Taktfrequenz}}{\text{Prescaler}\cdot(1+\text{OCR0A})} \,\text{Hz}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
TCCR1A = (1&amp;lt;&amp;lt;WGM10)|(1&amp;lt;&amp;lt;COM1A1); // PWM, phase correct, 8 bit.&lt;br /&gt;
TCCR1B =  (1&amp;lt;&amp;lt;CS11) |(1&amp;lt;&amp;lt;CS10); // set clock/prescaler 1/64 -&amp;gt; enable counter&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
&lt;br /&gt;
PORTB = 0xff; // enable pull-ups for inputs, set outputs high, Pin LED auf 1 setzen&lt;br /&gt;
DDRB  =  1&amp;lt;&amp;lt;LED;    // Port B1 als Ausgang&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
&lt;br /&gt;
OCR1A=128; // LED 50%&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tiefpassfilter-Berechnung ==&lt;br /&gt;
Die PWM-Frequenz muß meistens mit einem Tiefpassfilter entfernt werden, da sie nachfolgende Verstärkerstufen übersteuert oder den Hörgenuß trübt. Ein einfacher RC-Tiefpass kann für Motorsteuerungen ausreichen, für Audioanwendungen ist der Abstand zwischen höchster Niederfrequenz und PWM-Frequenz zu klein. Ein aktives Filter mit Operationsverstärker kann die Lösung sein, oder ein passiver LC-Tiefpass. Dessen Berechnung mittels [http://www.aade.com AADE Filter Designer] soll hier an einem Fallbeispiel erläutert werden.&lt;br /&gt;
&lt;br /&gt;
Ein ATmega48 mit 20 MHz Quarz soll mittels 10 Bit &amp;quot;fast PWM&amp;quot; des 16 Bit- Timers 1 ein Stereosignal am Pin OC1A und OC1B ausgeben. Die PWM-Frequenz beträgt somit knapp 20 kHz, nach dem Abtasttheorem sind maximal 10 kHz Nutzsignal möglich. Mit der Faustregel &amp;quot;6dB pro Bit&amp;quot; erreichen wir einen Dynamikumfang oder Störabstand von 60 dB. Etwa dieselbe Unterdrückung sollte auch das Tiefpassfilter erreichen.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cauerfilter.png|thumb|right|400px|Cauer-Tiefpass mit 3,3mH und 10 mH Festinduktivität]]&lt;br /&gt;
Zunächst brauchen wir noch eine Abschätzung der zulässigen Ausgangsbelastung. Laut Datenblatt beträgt der maximal zulässige Strom pro Pin 40 mA, entsprechend einem 125 Ohm Widerstand von 5V nach Masse. Mit 10 bis 20 mA entsprechend 500 bis 250 Ohm als Maximalwert dürfte also nichts passieren. Der zeitliche Mittelwert liegt für Audioanwendungen bei 2,5V, also dem halben Maximalstrom. Ein hochohmiger Kopfhörer, z.&amp;amp;nbsp;B. 600 Ohm, läßt sich so noch ohne weitere Verstärker anschließen.&lt;br /&gt;
&lt;br /&gt;
Die größte Filtersteilheit erreicht das Cauer- oder Elliptic Filter, auf Kosten von größeren Phasenänderungen/ Gruppenlaufzeit gegenüber anderen Filtertypen. Wir starten also das Filterberechnungsprogramm mit den Vorgaben &amp;quot;lowpass&amp;quot;, &amp;quot;Cauer/Elliptic&amp;quot;, &amp;quot;3.Ordnung&amp;quot;, was eine Schaltung mit einer Induktivität und drei Kapazitäten berechnet. Den Ein- und Ausgangswiderstand geben wir erst mal irgendwo in dem genannten Bereich vor, die Durchlasswelligkeit kann auf 1 dB bleiben, Durchlassfrequenz wie gesagt 10000 Hz, die Sperrfrequenz etwas unterhalb der PWM-Frequenz, ca. 17500Hz, da der Dämpfungspol dann etwa auf 20 kHz fällt. Mit &amp;quot;analyze voltage insertion gain&amp;quot; berechnen wir eine Durchlasskurve und kontrollieren die korrekte Lage des Dämpfungspols. Jetzt variieren wir die beiden Widerstände, bis die Induktivität etwa einem leicht erhältlichen Normwert entspricht. Die drei Kondensatoren werden am Schluß ebenfalls mit dem nächsten Normwert bestückt. Sicherheitshalber kann man diese endgültige Schaltung noch mit einem [http://www.mikrocontroller.net/articles/Schaltungssimulation#Analog Schaltungssimulationsprogramm] überprüfen und die Bauteilwerte leicht korrigieren.&lt;br /&gt;
&lt;br /&gt;
Als Induktivität kommen eher die größeren Bauformen infrage, die &amp;quot;Garnrollen&amp;quot;-Form oder die axiale Bauform 77A von Fastron. Hier gilt: je größer desto höhere Güte, wie man aus den Katalogangaben zum Gleichstromwiderstand schließen kann. Von magnetischen Wechselfeldern wie etwa Schaltregler-Trafos sollte man ein paar Zentimeter Abstand halten.&lt;br /&gt;
&lt;br /&gt;
Im Bild  sind zwei Schaltungen für die genannten Frequenzen mit einer 3,3mH-Drossel und einer 10mH-Drossel gezeigt. Die Kurven sind noch mit verlustlosen Bauteilen und den berechneten krummen Bauteilwerten gezeichnet. Der Widerstand am Ausgang kann auch durch die Last wie der genannte Kopfhörer gebildet werden. Ein größerer Wert hat hier wenig Einfluß auf die Filterkurve, während der Widerstand am Eingang genau den vorgegebenen Wert haben sollte.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[AVR-Tutorial: PWM]]&lt;br /&gt;
* Beiträge im Forum [http://www.mikrocontroller.net/forum/4 Codesammlung], die den Begriff PWM enthalten: [http://www.mikrocontroller.net/search?query=pwm&amp;amp;forums%5B%5D=4 hier]&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]]&lt;/div&gt;</summary>
		<author><name>Jonebohne</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Sleep_Mode&amp;diff=46553</id>
		<title>Sleep Mode</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Sleep_Mode&amp;diff=46553"/>
		<updated>2010-04-23T18:29:21Z</updated>

		<summary type="html">&lt;p&gt;Jonebohne: /* Ermittlung des Stromverbrauchs */ Typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Auf deutsch Schlafmodus. Damit bezeichnet man den Zustand eines [[Mikrocontroller]]s, in dem verschiedene Funktionsblöcke ausgeschaltet sind ([[Timer]], [[UART]], [[AD-Wandler]] etc.) um Strom zu sparen. Das ist vor allem in [[Versorgung aus einer Zelle | batteriebetriebenen]] Geräten wichtig. Denn schließlich möchte man ja eine möglichst lange Laufzeit mit einer möglichst kleinen Batterie erreichen.&lt;br /&gt;
&lt;br /&gt;
Mit dem Sleep Mode eng verknüpft ist das [[Ultra low power]] Design. Man muss viele Dinge beachten, um nicht unnötig Strom zu verbrauchen. Z. B. werden in vielen Geräten über lange Zeiträume Daten erfaßt (Datenschreiber). Dabei werden meist relativ wenig Daten in sehr langen Zeitabständen aufgezeichnet und gespeichert. Zwischendurch gibt es für den Mikrocontroller meist nichts zu tun. Dann ist es nicht sinnvoll in Warteschleifen Zeit zu vertrödeln. Das geht wesentlich stromsparender.&lt;br /&gt;
&lt;br /&gt;
Die Ausführungen dieses Wikiartikels beziehen sich auf den [[AVR]] ATmega32. Prinzipiell gilt das Gesagte auch für viele andere Mikrocontroller ([[MSP430]], [[8051]] etc.), die Details muss man jedoch in den jeweiligen Datenblättern nachlesen. Bei den verschiedenen AVR Modellen findet man diese Informationen im Datenblatt unter der Überschrift &amp;quot;Power Management and Sleep Modes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Sleep_mode_ablauf.png|framed|Flussdiagramm]] Das Prinzip ist immer gleich. Nach Initialisierung des Mikrocontrollers und eventuell angeschlossener ICs ([[LCD]], [[I2C]]-EEPROM etc.) geht der Prozessor in eine Endlosschleife, in welcher die verschiedenen Aufgaben zyklisch bearbeitet werden. Wenn jedoch gerade nichts zu tun ist geht der Prozessor schlafen. Ein Interrupt weckt ihn, der Interrupt wird ausgeführt und er setzt seine Arbeit in der Hauptschleife fort. Das heißt aber auch, daß vor dem Eintritt in den Sleep-Mode die jeweiligen Interrupts freigegeben werden müssen und auch die entsprechenden Interruptroutinen bereitgestellt werden müssen. Sonst gibt es im wahrsten Sinne des Wortes ein böses Erwachen oder einen endlosen Dornröschenschlaf, der nur durch ein Reset beendet werden kann. Kurz bevor der Mikrocontroller schlafen geht, sollte man möglichst alle Module abschalten, welche nicht gebraucht werden, um wertvollen Strom zu sparen. Dazu zählen&lt;br /&gt;
&lt;br /&gt;
* der [[Brownout|Brown Out]] Detector (per [[AVR Fuses]] einschaltbar)&lt;br /&gt;
* der Analogcomparator&lt;br /&gt;
* interne AD-Referenz&lt;br /&gt;
* [[Watchdog]]&lt;br /&gt;
* [[UART]]&lt;br /&gt;
* [[Timer]]&lt;br /&gt;
&lt;br /&gt;
Weitere Hinweise zum Stromsparen gibt es im Artikel [[Ultra low power]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Überlick über alle Sleep Modes der AVRs ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Sleep Mode || Verfügbare Module || Stromaufnahme&amp;lt;BR&amp;gt;3,3V/1 MHz || Weckruf || Aufwachzeit&amp;lt;BR&amp;gt;[Takte] || Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| Active     || alle              &lt;br /&gt;
|align =&amp;quot;center&amp;quot;|  1,2mA                                  || alle     &lt;br /&gt;
|align =&amp;quot;center&amp;quot;| 0 &lt;br /&gt;
| - &lt;br /&gt;
|- &lt;br /&gt;
| Idle       || alle              &lt;br /&gt;
|align =&amp;quot;center&amp;quot;| 0,3mA                                   || alle     &lt;br /&gt;
|align =&amp;quot;center&amp;quot;| 6 &lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| ADC Noise&amp;lt;BR&amp;gt;Reduction || ADC&amp;lt;BR&amp;gt;Timer 2&amp;lt;BR&amp;gt;ext. Interrupts&amp;lt;BR&amp;gt;TWI&amp;lt;BR&amp;gt;Watchdog  &lt;br /&gt;
|align =&amp;quot;center&amp;quot;| ca. 0,3mA || ADC&amp;lt;BR&amp;gt;Timer 2&amp;lt;BR&amp;gt;ext. &#039;&#039;&#039;level&#039;&#039;&#039; Interrupt&amp;lt;BR&amp;gt;[[TWI]] Address match&amp;lt;BR&amp;gt;Brown Out Detector Reset&amp;lt;BR&amp;gt;External Reset&amp;lt;BR&amp;gt;Watchdog Reset &lt;br /&gt;
|align =&amp;quot;center&amp;quot;| 6&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| Power Save || Timer 2&amp;lt;BR&amp;gt;ext. Interrupts&amp;lt;BR&amp;gt;TWI&amp;lt;BR&amp;gt;Watchdog &lt;br /&gt;
|align =&amp;quot;center&amp;quot;|   10&amp;amp;mu;A         || Timer 2&amp;lt;BR&amp;gt;ext. &#039;&#039;&#039;level&#039;&#039;&#039; Interrupt&amp;lt;BR&amp;gt;TWI Address match&amp;lt;BR&amp;gt;Brown Out Detector Reset&amp;lt;BR&amp;gt;External Reset&amp;lt;BR&amp;gt;Watchdog Reset &lt;br /&gt;
|align =&amp;quot;center&amp;quot;| siehe&amp;lt;BR&amp;gt;[[#Morgenmuffel | hier]]&lt;br /&gt;
| Timer2 mit 32,768 kHz&amp;lt;BR&amp;gt;Uhrenquarz aktiv&lt;br /&gt;
|-&lt;br /&gt;
| Stand By   ||  ext. Interrupts&amp;lt;BR&amp;gt;TWI&amp;lt;BR&amp;gt;Watchdog &lt;br /&gt;
|align =&amp;quot;center&amp;quot;|   35&amp;amp;mu;A                              || ext. &#039;&#039;&#039;level&#039;&#039;&#039; Interrupt&amp;lt;BR&amp;gt;TWI Address match&amp;lt;BR&amp;gt;Brown Out Detector Reset&amp;lt;BR&amp;gt;External Reset&amp;lt;BR&amp;gt;Watchdog Reset &lt;br /&gt;
|align =&amp;quot;center&amp;quot;|  6&lt;br /&gt;
| Hauptoszillator aktiv&lt;br /&gt;
|-&lt;br /&gt;
| Power Down ||  ext. Interrupts&amp;lt;BR&amp;gt;TWI&amp;lt;BR&amp;gt;Watchdog &lt;br /&gt;
|align =&amp;quot;center&amp;quot;| 0,3&amp;amp;mu;A                                 ||ext. &#039;&#039;&#039;level&#039;&#039;&#039; Interrupt&amp;lt;BR&amp;gt;TWI Address match&amp;lt;BR&amp;gt;Brown Out Detector Reset&amp;lt;BR&amp;gt;External Reset&amp;lt;BR&amp;gt;Watchdog Reset&amp;lt;br\&amp;gt;PCINT&lt;br /&gt;
|align =&amp;quot;center&amp;quot;| siehe&amp;lt;BR&amp;gt;[[#Morgenmuffel | hier]]&lt;br /&gt;
| -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Die verschiedenen Sleep Modes im Detail ==&lt;br /&gt;
&lt;br /&gt;
=== Active Mode ===&lt;br /&gt;
&lt;br /&gt;
Eigentlich ist das kein Sleep Mode, er soll der Vollständigkeit halber aber genannt werden. In diesem Modus sind alle Takte und alle Module aktiv, zumindest die, die man per Programm aktiviert hat. In diesem Modus ist die CPU ständig am arbeiten, auch wenn es nur eine lange Warteschleife ist. Warten kostet genauso viel Strom wie sinnvolle Dinge berechnen! Dadurch werden auch ständig Daten aus dem [[Speicher#Flash-ROM | Flash]] geladen, nämlich das Programm, welches gerade ausgeführt wird. Das kostet natürlich Strom, wenn gleich auch die Mikrocontroller von heute sehr wenig brauchen. Bei 1 MHz und 3.3V braucht der ATmega ca. 1,2mA, zu finden im Datenblatt unter &amp;quot;ATmega8 Typical Characteristics&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Idle Mode ===&lt;br /&gt;
&lt;br /&gt;
Hier kann zum ersten mal gespart werden. Wenn nichts berechnet werden soll, der Timer, UART, ADC etc. aber arbeiten sollen, dann ist dieser Modus das Mittel der Wahl. Die CPU bleibt stehen, ebenso der Flash, weil ja kein Programm ausgeführt wird. Das spart schon mal einiges, der Stromverbrauch sinkt auf ca. 0,35mA, eine Einsparung von 70%! Aus diesem Modus kann jeder Interrupt die CPU wieder wecken. Sie ist dann bereits nach sechs Takten wieder voll einsatzfähig.&lt;br /&gt;
&lt;br /&gt;
=== ADC Noise Reduction Mode ===&lt;br /&gt;
&lt;br /&gt;
Dieser Modus geht einen kleinen Schritt weiter als der Idle Mode. Hier wird zusätzlich der Takt für die IO-Module abgeschaltet. Nur noch der [[AD-Wandler]], die exteren Interrupts, das [[TWI]] und der Watchdog sind funktionsfähig (wenn man sie nutzen will). Der [[UART]] und Timer0 bzw. Timer1 sind nicht mehr nutzbar. Wie der Name des Sleep Mode vermuten lässt wird das alles getan, um möglichst wenig Störungen mit den internen Modulen zu erzeugen, um die Messung des ADC geringfügig zu verbessern.&lt;br /&gt;
&lt;br /&gt;
=== Power Save Mode ===&lt;br /&gt;
&lt;br /&gt;
Hier werden fast alle Oszillatoren gestoppt. Die einzige Ausnahme ist der Timer 2, welcher asynchron mit einem 32,768 kHz Uhrenquarz betrieben werden kann. Ist er entsprechend konfiguriert, dann bleibt er beim Einschalten des Power Save Mode aktiv. Dieser Modus ist einer der wichtigsten! Da alle Oszillatoren gestoppt sind, funktionieren nur noch die asynchronen Module.&lt;br /&gt;
&lt;br /&gt;
Bei neueren AVR-Typen (z.&amp;amp;nbsp;B. ATMega88/ATMega644) kann Timer2 wahlweise auch mit dem internen Oszillator weiterlaufen. In dem Fall braucht es keinen externen Uhrenquarz.&lt;br /&gt;
&lt;br /&gt;
=== Stand By ===&lt;br /&gt;
&lt;br /&gt;
Hier werden alle Takte auf dem IC angehalten. &#039;&#039;&#039;ABER!&#039;&#039;&#039; Der ausgewählte Hauptoszillator läuft weiter. Das kostet zwar etwas Strom, hat aber den Riesenvorteil, daß die CPU nach dem Aufwachen nach nur sechs Takten wieder zur Verfügung steht. Das klingt selbstverständlich, ist es aber nicht! Gerade Quarzoszillatoren haben auf Grund ihrer sehr hohen Güte (sehr schmalbandiger Schwingkreis) eine Einschwingzeit von 10..100ms! Eine kleine Ewigkeit. Dieser Modus ist ideal, wenn ein Quarz verwendet wird und kürzeste Reaktionszeiten nach dem Aufwecken nötig sind. Da alle Takte gestoppt sind, funktionieren nur noch die asynchronen Module.&lt;br /&gt;
&lt;br /&gt;
=== Power Down Mode ===&lt;br /&gt;
&lt;br /&gt;
Das ist der &amp;quot;tiefste&amp;quot; Sleep Mode. Dabei werden &#039;&#039;&#039;ALLE&#039;&#039;&#039; Oszillatoren gestoppt (intern wie extern). Nur asynchrone Module funktionieren jetzt noch und können den schlafenden AVR wecken. Die Stromaufnahme wird nur noch von den Leckströmen bestimmt und liegt typisch bei 300nA.&lt;br /&gt;
&lt;br /&gt;
== Morgenmuffel ==&lt;br /&gt;
&lt;br /&gt;
Im Power Save und Power Down Mode ist der Oszillator für die CPU gestoppt. Wird der AVR nun geweckt kann er leider nicht sofort loslegen. Warum? Weil der Oszillator erst anlaufen und sich stabil einschwingen muß. Während dieser Zeit darf die CPU noch nicht loslaufen, sonst kann es passieren, daß sie abstürzt! (Weil ein noch instabiler Oszillator ultrakurze Taktpulse erzeugen kann, an denen sich die CPU &amp;quot;verschluckt&amp;quot;.) Wie bereits oben gesagt kann das Anschwingen eines Quarzoszillators sehr lange dauern. Je niedriger die Frequenz um so länger. Keramikresonatoren sind ca. zehn mal so schnell. Auch das ist ganz einfach physikalisch durch die Güte bestimmt. Sie sind breitbandiger, dadurch zwar ungenauer aber schwingen schneller an. Am schnellsten sind RC-Oszillatoren, leider sind sie aber auch die ungenauesten. Um nun die entsprechende Zeit zu warten wird der Watchdog-Oszillator verwendet. Darum muß man sich nicht direkt kümmern das macht der AVR allein. Aber man muß mittels der [[AVR Fuses]] festlegen, wieviel Takte gewartet werden soll. Die Frequenz des Watchdogoszillators beträgt ca. 1,15 MHz bei 3,3V Versorgungsspannung.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!   Taktquelle                 || Wartezeit [Takte] || Wartezeit      || typische Einschwingzeit&lt;br /&gt;
|-&lt;br /&gt;
|   externer Quarz (1)         || 16384&amp;lt;BR&amp;gt; 32768      || 14,2ms&amp;lt;BR&amp;gt; 28,4ms || 10ms, Uhrenquarze 100ms&lt;br /&gt;
|-&lt;br /&gt;
|   externer Resonator (1)     || 1024&amp;lt;BR&amp;gt; 16384       || 890&amp;amp;mu;s&amp;lt;BR&amp;gt; 14,2ms || 1ms&lt;br /&gt;
|-&lt;br /&gt;
|   externer Quarzoszillator   || 6                    || 5&amp;amp;mu;s      || Takt liegt konstant an&lt;br /&gt;
|-&lt;br /&gt;
|   externer RC-Oszillator     || 6&amp;lt;BR&amp;gt; 18             || 5&amp;amp;mu;s&amp;lt;BR&amp;gt; 15&amp;amp;mu;s || 1..3 Takte&lt;br /&gt;
|-&lt;br /&gt;
|  interner RC-Oszillator      || 6                    || 5&amp;amp;mu;s        || 1..3 Takte&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(1) Es können für den Quarz bzw. Resonator auch niedigere Wartezeiten verwendet werden. Das ist jedoch nicht empfehlenswert. Näheres siehe Datenblatt.&lt;br /&gt;
&lt;br /&gt;
== Ermittlung des Stromverbrauchs ==&lt;br /&gt;
&lt;br /&gt;
Bei der Messung des Stromverbrauchs haben wir jedoch ein kleines Problem. Die Stromaufnahme eines Mikrocontrollers schwankt bei der Verwendung des Sleep Mode gewaltig. Denn oft wartet der Mikrocontroller im Schlafmodus auf ein Ereignis, z.&amp;amp;nbsp;B. einen Tastendruck. Wird eine Taste gedrückt arbeitet der Mikrocontroller beispielsweise für 100ms und geht dann wieder für Sekunden bis Tage schlafen. Die stoßartige Arbeitsweise (Burst) gleicht einer [[PWM]]. Das Problem ist dabei, dass man theoretisch mit einem Tiefpass diese PWM filtern (glätten) muss um sie anschließend mit einem Multimeter zu messen. Aber wer will schon einen Tiefpass mit einer Zeitkonstante von mehreren Minuten bis Tagen bauen und damit messen? Das Problem muss anders gelöst werden. Und das ist recht leicht.&lt;br /&gt;
&lt;br /&gt;
* Mit einem Multimeter misst man die Stromaufnahme im Sleep Mode (Mikroampere)&lt;br /&gt;
* Mit einem Reihenwiderstand von 10..100 Ohm in der Vcc Leitung des Mikrocontrollers und einem Oszilloskop kann die Stromaufnahme des Mikrocontrollers während der kurzen aktiven Arbeitsphase gemessen werden. Dazu braucht man nur das ohmsche Gesetz, I = U / R. Dabei nutzt man einen 1:1 Tastkopf, um eine maximale Spannungsauflösung zu erreichen. Ausserdem schaltet man den Eingang auf AC-Kopplung, da ja nur Pulse gemessen werden, keine Gleichspannungen. Damit kann man vor allem den Spannungsmessbereich sehr weit runter drehen.  &lt;br /&gt;
* Der mittlere Stromverbrauch wird wie folgt berechnet:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;I_m = \frac {I_{sleep} \cdot t_{sleep} + I_{aktiv} \cdot t_{aktiv}}{t_{sleep} + t_{aktiv}} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Batterielebensdauer ==&lt;br /&gt;
&lt;br /&gt;
Wie übersetzen sich nun diese Zahlen in eine Batterielebensdauer? Versorgt man den AVR über drei in Reihe geschaltete AAA [[Versorgung aus einer Zelle | Batterien]], kann man etwa folgende Abschätzung machen. Eine AAA Batterie (Mignon) hat eine Kapazität von ca. 1200mAh. D.H. Sie kann für 1200 Stunden (50 Tage) 1mA liefern. Oder für 12000 Stunden 0,1mA, das sind immerhin schon 500 Tage, also über sechzehn Monate! Nutzt man den Power Save Mode (10uA), dann reichen die Batterien bereits 120.000 Stunden, das sind theoretisch 13,7 Jahre! Natürlich sinkt während der Entladung die  Batteriespannung, aber der Mega32 kann ja mit 2,7V betrieben werden, einige [[AVR]]-Typen sogar mit nur 1,8V. Ebenso wird es in 13 Jahren zu einer merklichen Selbstentladung der Batterien kommen, so daß die hier berechnete Zeit nicht erreicht wird. Real kann eher mit drei bis sieben Jahren gerechnet werden. Um eine hohe Lebensdauer zu erreichen müssen dann Lithiumbatterien verwendet werden, welche eine extrem geringe Selbstentladung haben und eine Lebensdauer von 10 Jahren erreichen.&lt;br /&gt;
&lt;br /&gt;
Wenn man wirklich das allerletzte Mikroampere einsparen will und dennoch quarzgenau eine Zeitbasis benötigt, dann verwendet man eine &#039;&#039;&#039;R&#039;&#039;&#039;eal &#039;&#039;&#039;T&#039;&#039;&#039;ime &#039;&#039;&#039;C&#039;&#039;&#039;lock (RTC, Echtzeituhr), wie z.&amp;amp;nbsp;B. [http://datasheets.maxim-ic.com/en/ds/DS1371.pdf DS1371]. Dieser Baustein arbeitet auch mit einem 32,768 kHz Uhrenquarz, ist aber extrem auf Stromsparen optimiert (Stromverbrauch 800..1100nA). Gleichzeitig ist eine Uhr und Weckfunktion eingebaut. Ausgelesen werden kann sie über den [[I2C]]-[[Bus]]. Diese RTC kann den Mikrocontroller periodisch nach einer bestimmten Zeit (Sekunden bis Tage) über einen externen Interrupt wecken. Damit kann der Mikrocontroller in den Power Down Mode gehen und maximal Strom sparen. So eine Kombination aus AVR und RTC verbraucht dann nur noch  ca. 1400nA! Eine kleine 3V Lithiumzelle mit 100mAh reicht dann unglaubliche 71.400 Stunden = 8 Jahre!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Allgemein gilt:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\text{Lebensdauer} [h] = \frac {\mathrm{Kapazit\ddot at} [Ah] }{\text{Strom} [A]}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zu beachten ist, daß diese Formel nur für relativ geringe Entladeströme gilt, typisch bei einer Entladung über 20 Stunden oder länger. Will man hohe Ströme in einer kurzen Zeit entnehmen, sinkt die verfügbare Kapazität. Genaueres findet man dazu [http://www.amplepower.com/pwrnews/beer/ hier] und im Datenblatt der Batterien.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
Die Beispiele sind mit WINAVR 20060421 compiliert und getestet worden. Zur Nutzung des Sleep Mode werden zwei C-Funktionen zur Verfügung gestellt, set_sleep_mode() und sleep_mode(). Genaueres hierzu findet man in der Dokumentation der libc im WINAVR. Alle Programme wurden mit Optimierungsstufe -Os compiliert.&lt;br /&gt;
&lt;br /&gt;
=== UART Terminal ===&lt;br /&gt;
&lt;br /&gt;
Soll der UART verwendet werden kommt nur der Idle Mode in Frage. In diesem Beispiel wird der AVR genutzt um Zeichen von der [[RS232]] Schnittstelle zu empfangen und per Morsezeichen auszugeben. Als Hauptoszillator wird ein 3,6864 MHz Quarz eingesetzt, wie für eine zuverlässige UART-Kommunikation notwendig ist. Siehe auch [[AVR-Tutorial: UART | AVR-Tutorial]], [[AVR Checkliste#UART.2FUSART | AVR Checkliste]] und [[AVR-GCC-Tutorial#Der_UART | AVR-GCC-Tutorial]]. Im Sleepmode verbraucht der AVR ca. 1,9mA, im aktiven Zustand mit eingeschalteter LED ca. 7,3mA.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
************************************************************************&lt;br /&gt;
*&lt;br /&gt;
* Sleep Mode Demo, Idle Mode&lt;br /&gt;
*&lt;br /&gt;
* ATmega32 mit externem 3,6864 MHz Quarz an XTAL1/XTAL2&lt;br /&gt;
*&lt;br /&gt;
* LOW Fuse Byte = 0xFF&lt;br /&gt;
*&lt;br /&gt;
* An PD5 muss eine LED mit 1 kOhm Vorwiderstand angeschlossen werden&lt;br /&gt;
* An PD0 ist ein MAX232 angeschlosssen, um Daten vom PC zu empfangen&lt;br /&gt;
*&lt;br /&gt;
************************************************************************&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#define F_CPU 3686400       // Taktfrequenz des Quarzes&lt;br /&gt;
&lt;br /&gt;
#define BAUD 9600L          // Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!&lt;br /&gt;
 &lt;br /&gt;
// Berechnungen&lt;br /&gt;
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden&lt;br /&gt;
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate&lt;br /&gt;
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) // Fehler in Promille &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;
// globale Variablen&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t uart_flag;&lt;br /&gt;
volatile uint8_t uart_data;&lt;br /&gt;
&lt;br /&gt;
// lange, variable Wartezeit, Einheit in Millisekunden&lt;br /&gt;
&lt;br /&gt;
void long_delay(uint16_t ms) {&lt;br /&gt;
    for (; ms&amp;gt;0; ms--) _delay_ms(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Ein Byte als &amp;quot;Morsezeichen&amp;quot; auf eine LED ausgeben&lt;br /&gt;
&lt;br /&gt;
void morse(uint8_t data) {&lt;br /&gt;
    uint8_t i,j;&lt;br /&gt;
    &lt;br /&gt;
    for(i=0; i&amp;lt;8; i++) {&lt;br /&gt;
        if (data &amp;amp; 0x01)        // Prüfe Bit #0&lt;br /&gt;
            j=250;              // Bit ist 1&lt;br /&gt;
        else&lt;br /&gt;
            j=100;              // Bit ist 0&lt;br /&gt;
&lt;br /&gt;
        PORTD |= (1 &amp;lt;&amp;lt; PD5);    // LED an&lt;br /&gt;
        long_delay(j);&lt;br /&gt;
        PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PD5);   // LED aus&lt;br /&gt;
        long_delay(1000-j);&lt;br /&gt;
        data &amp;gt;&amp;gt;= 1;             // nächstes Bit auf Bit #0 schieben&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main (void) {&lt;br /&gt;
&lt;br /&gt;
// IO konfigurieren&lt;br /&gt;
&lt;br /&gt;
    DDRA = 0xFF;&lt;br /&gt;
    DDRB = 0xFF;&lt;br /&gt;
    DDRC = 0xFF;&lt;br /&gt;
    DDRD = 0xFF;&lt;br /&gt;
&lt;br /&gt;
// UART konfigurieren&lt;br /&gt;
&lt;br /&gt;
    UBRRH = UBRR_VAL &amp;gt;&amp;gt; 8;&lt;br /&gt;
    UBRRL = UBRR_VAL &amp;amp; 0xFF;&lt;br /&gt;
    UCSRB = (1&amp;lt;&amp;lt;RXCIE) | (1&amp;lt;&amp;lt;RXEN); &lt;br /&gt;
&lt;br /&gt;
// Interrupts freigeben&lt;br /&gt;
&lt;br /&gt;
    sei();&lt;br /&gt;
    &lt;br /&gt;
// Endlose Hauptschleife&lt;br /&gt;
&lt;br /&gt;
    while(1) {&lt;br /&gt;
        set_sleep_mode(SLEEP_MODE_IDLE);&lt;br /&gt;
        sleep_mode();                   // in den Schlafmodus wechseln&lt;br /&gt;
&lt;br /&gt;
        // hier wachen wir wieder auf&lt;br /&gt;
        if (uart_flag==1) {&lt;br /&gt;
            uart_flag =0;&lt;br /&gt;
            morse(uart_data);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// UART RX complete interrupt&lt;br /&gt;
&lt;br /&gt;
ISR(USART_RXC_vect) {&lt;br /&gt;
    uart_flag = 1;              // signalisiere neue Daten&lt;br /&gt;
    uart_data = UDR;            // Daten auslesen, dadurch wird auch der Interrupt gelöscht&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Quarzgenaue Zeitbasis ===&lt;br /&gt;
&lt;br /&gt;
Hier kommt der Power Save Mode zum Einsatz. Als Zeitbasis dient ein externer 32,768 kHz Uhrenquarz, welcher asynchron den Timer 2 taktet. Das ist zwar nur ein 8 Bit Zähler, der schon nach 256 Takten überläuft, aber es gibt ja zum Glück noch den Vorteiler (Prescaler). Dieser kann die Teilerverhältnisse 1/8/32/256/1024 annehmen, daraus ergeben sich Überlaufzeiten von 7,8125ms/62,5ms/250ms/2s/8s. Werden längere Zeiten benötigt muß man diese in Software nachbilden. Z. B. kann man mit einem zwei Sekunden Intervall in einer Variable bis 30 zählen um exakt eine Minute zu erhalten. Die 30 mal aufwachen, Variable hochzählen und wieder in den Sleep Mode schalten fallen praktisch nicht ins Gewicht, das dauert nur einige Dutzend Mikrosekunden.&lt;br /&gt;
&lt;br /&gt;
Das hier gezeigte Beispiel ist sehr einfach gehalten, zeigt aber deutlich die Vorgehensweise. Im quarzgenauen Zeitraster von einer Minute wird eine LED für zwei Sekunden eingeschaltet. In den realen Anwendungen wird natürliche eine Messung etc. gemacht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
************************************************************************&lt;br /&gt;
*&lt;br /&gt;
* Sleep Mode Demo, Power Save Mode&lt;br /&gt;
*&lt;br /&gt;
* ATmega32 mit internem 1 MHz Oszillator + 32 kHz Quarz&lt;br /&gt;
*&lt;br /&gt;
* LOW Fuse Byte = 0xE1&lt;br /&gt;
*&lt;br /&gt;
* An PD5 muss eine LED mit 1 kOhm Vorwiderstand angeschlossen werden&lt;br /&gt;
* An TOSC1/TOSC2 muss ein 32,768 kHz Quarz angeschlossen sein&lt;br /&gt;
*&lt;br /&gt;
************************************************************************&lt;br /&gt;
*/&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;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;
// globale Variablen&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t flag;&lt;br /&gt;
&lt;br /&gt;
// lange, variable Wartezeit, Einheit in Millisekunden&lt;br /&gt;
&lt;br /&gt;
void long_delay(uint16_t ms) {&lt;br /&gt;
    for (; ms&amp;gt;0; ms--) _delay_ms(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main (void) {&lt;br /&gt;
&lt;br /&gt;
// IO konfigurieren&lt;br /&gt;
&lt;br /&gt;
    DDRA = 0xFF;&lt;br /&gt;
    DDRB = 0xFF;&lt;br /&gt;
    DDRC = 0xFF;&lt;br /&gt;
    DDRD = 0xFF;&lt;br /&gt;
&lt;br /&gt;
// Analogcomparator ausschalten&lt;br /&gt;
&lt;br /&gt;
    ACSR = 0x80;&lt;br /&gt;
&lt;br /&gt;
// Timer2 konfigurieren&lt;br /&gt;
&lt;br /&gt;
    ASSR  = (1&amp;lt;&amp;lt; AS2);              // Timer2 asynchron takten&lt;br /&gt;
    long_delay(1000);               // Einschwingzeit des 32kHz Quarzes&lt;br /&gt;
    TCCR2  = 6;                     // Vorteiler 256 -&amp;gt; 2s Überlaufperiode&lt;br /&gt;
    while((ASSR &amp;amp; (1&amp;lt;&amp;lt; TCR2UB)));   // Warte auf das Ende des Zugriffs&lt;br /&gt;
    TIFR   = (1&amp;lt;&amp;lt;TOV2);             // Interrupts löschen (*)&lt;br /&gt;
    TIMSK |= (1&amp;lt;&amp;lt;TOIE2);            // Timer overflow Interrupt freischalten&lt;br /&gt;
// (*) &amp;quot;Alternatively, TOV2 is cleared by writing a logic one to the flag.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Interrupts freigeben&lt;br /&gt;
&lt;br /&gt;
    sei();&lt;br /&gt;
&lt;br /&gt;
// Endlose Hauptschleife&lt;br /&gt;
&lt;br /&gt;
    while(1) {&lt;br /&gt;
&lt;br /&gt;
        // WICHTIG!&lt;br /&gt;
        // Wenn der Timer2 im asynchronen Modus periodisch zum Wecken aus dem Sleep Mode&lt;br /&gt;
        // genutzt wird, dann muss vor dem Wiedereintritt mindestens&lt;br /&gt;
        // 1 Oszillatortakt des Timers abgewartet werden (~30us), um die Interruptlogik &lt;br /&gt;
        // wieder zu aktivieren, anderenfalls wacht der AVR nicht mehr auf.&lt;br /&gt;
        // Die folgenden zwei Zeilen tun dies.&lt;br /&gt;
        // Nur wenn sichergestellt ist, dass der Interrupt + Hauptschleife länger als 30us dauern,&lt;br /&gt;
        // kann man den Test weglassen&lt;br /&gt;
&lt;br /&gt;
        OCR2 = 0;                       // Dummyzugriff&lt;br /&gt;
        while((ASSR &amp;amp; (1&amp;lt;&amp;lt; OCR2UB)));   // Warte auf das Ende des Zugriffs&lt;br /&gt;
&lt;br /&gt;
        set_sleep_mode(SLEEP_MODE_PWR_SAVE);&lt;br /&gt;
        sleep_mode();                   // in den Schlafmodus wechseln&lt;br /&gt;
&lt;br /&gt;
        // hier wachen wir wieder auf, nach Ausführung des Interrupts&lt;br /&gt;
&lt;br /&gt;
        if (flag==1) {                  // Neues Messintervall ?&lt;br /&gt;
            flag =0;&lt;br /&gt;
            PORTD |= (1 &amp;lt;&amp;lt; PD5);        // LED für 2 Sekunden anschalten&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Timer2 overflow Interrupt&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER2_OVF_vect) {&lt;br /&gt;
    static uint8_t ticks;               // Hilfsvariable für Messintervall&lt;br /&gt;
&lt;br /&gt;
    ticks++;&lt;br /&gt;
    if (ticks==30) {                    // neues Messintervall ?&lt;br /&gt;
        ticks=0;&lt;br /&gt;
        flag=1;&lt;br /&gt;
    }&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PD5);               // LED ausschalten&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Sleep Mode beträgt die Stromaufnahme des AVR ca. 10&amp;amp;mu;A, während der zwei Sekunden LED Leuchtdauer 2,3mA. Dadurch ergibt sich ein mittlerer Stromverbrauch von&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;I_m = \frac {10 \mu A \cdot 58s + 2,3mA \cdot 2s}{60s} = 86,3 \mu A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Korrekterweise müßte man jedoch noch den Stromverbrauch berücksichtigen, welcher bei jedem Timerüberlauf alle zwei Sekunden entsteht. Dabei wird einmal der Timerinterrupt durchlaufen sowie einmal die Hauptschleife. Das dauert hier ca. 50 Takte, bei 1 MHz somit 50&amp;amp;mu;s. Zusätzlich wird noch bis zu 30us gewartet, um garantiert einen Takt im Timer 2 vergehen zu lassen. Das passiert pro Minute 30 mal, somit erhöht sich der mittlere Stromverbrauch um&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\frac {30 \cdot 80 \mu s \cdot 1,2mA}{60s}= 48nA&amp;lt;/math&amp;gt; , was somit praktisch vollkommen vernachlässigbar ist.&lt;br /&gt;
&lt;br /&gt;
=== Aufwachen per Tastendruck ===&lt;br /&gt;
&lt;br /&gt;
Maximale Einsparung an Energie bringt der Power Down Modus. Das Aufwecken muß dann aber durch eine externen Interrupt erfolgen. Auch hier blinkt eine LED.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
************************************************************************&lt;br /&gt;
*&lt;br /&gt;
* Sleep Mode Demo, Power Down Mode&lt;br /&gt;
*&lt;br /&gt;
* ATmega32 mit internem 1 MHz Oszillator&lt;br /&gt;
*&lt;br /&gt;
* LOW Fuse Byte = 0xE1&lt;br /&gt;
*&lt;br /&gt;
* An PD5 muss eine LED mit 1 kOhm Vorwiderstand angeschlossen werden&lt;br /&gt;
* An PD2 muss ein Taster gegen GND angeschlossen sein&lt;br /&gt;
*&lt;br /&gt;
************************************************************************&lt;br /&gt;
*/&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;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;
// lange, variable Wartezeit, Einheit in Millisekunden&lt;br /&gt;
&lt;br /&gt;
void long_delay(uint16_t ms) {&lt;br /&gt;
    for (; ms&amp;gt;0; ms--) _delay_ms(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main (void) {&lt;br /&gt;
&lt;br /&gt;
// IO konfigurieren&lt;br /&gt;
&lt;br /&gt;
    DDRA = 0xFF;&lt;br /&gt;
    DDRB = 0xFF;&lt;br /&gt;
    DDRC = 0xFF;&lt;br /&gt;
    DDRD = 0xFB;        // PD2 = INT0 = Eingang&lt;br /&gt;
    PORTD = 0x04;       // Pull Up aktivieren&lt;br /&gt;
&lt;br /&gt;
// Analogcomparator ausschalten&lt;br /&gt;
&lt;br /&gt;
    ACSR = 0x80;&lt;br /&gt;
&lt;br /&gt;
// Interrupt konfigurieren&lt;br /&gt;
&lt;br /&gt;
    MCUCR &amp;amp;= ~0x3;              // levelgesteuerter Interrupt an INT0&lt;br /&gt;
&lt;br /&gt;
// Interrupts freigeben&lt;br /&gt;
&lt;br /&gt;
    sei();&lt;br /&gt;
    &lt;br /&gt;
// Endlose Hauptschleife&lt;br /&gt;
&lt;br /&gt;
    while(1) {&lt;br /&gt;
&lt;br /&gt;
        GICR |= (1 &amp;lt;&amp;lt; INT0);            // externen Interrupt freigeben&lt;br /&gt;
&lt;br /&gt;
        set_sleep_mode(SLEEP_MODE_PWR_DOWN);&lt;br /&gt;
        sleep_mode();                   // in den Schlafmodus wechseln&lt;br /&gt;
&lt;br /&gt;
        // hier wachen wir wieder auf&lt;br /&gt;
        GICR &amp;amp;= ~(1 &amp;lt;&amp;lt; INT0);           // externen Interrupt sperren&lt;br /&gt;
                                        // WICHTIG! falls der externe LOW Puls an INT0&lt;br /&gt;
                                        // sehr lange dauert&lt;br /&gt;
&lt;br /&gt;
        PORTD |= (1 &amp;lt;&amp;lt; PD5);            // LED für eine Sekunde anschalten&lt;br /&gt;
        long_delay(1000);&lt;br /&gt;
        PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PD5);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// externer Interrupt INT0 &lt;br /&gt;
&lt;br /&gt;
// Die Interruptroutine kann leer sein, ABER sie muss existieren!&lt;br /&gt;
// Sonst springt der AVR nach dem Aufwachen zum Reset, weil kein sinnvoller&lt;br /&gt;
// Interruptvektor eingetragen ist!&lt;br /&gt;
&lt;br /&gt;
ISR(INT0_vect) {&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Power Down Mode beträgt die Stromaufnahme des AVR weniger als 1&amp;amp;mu;A (weniger konnte mit dem verfügbaren Messgerät nicht gemessen werden), laut Datenblatt ca. 0,3&amp;amp;mu;A. Während der einen Sekunde LED Leuchtdauer werden 3,8mA verbraucht. Wird einmal pro Minute die Taste gedrückt, ergibt sich ein mittlerer Stromverbrauch von&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;I_m = \frac {0,3 \mu A \cdot 59s + 3,8mA \cdot 1s}{60s} = 63,6 \mu A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird nur einmal pro Stunde die Taste gedrückt, ergibt sich ein mittlerer Stromverbrauch von&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;I_m = \frac {0,3 \mu A \cdot 3559s + 3,8mA \cdot 1s}{3660s} = 1,3 \mu A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
&lt;br /&gt;
=== JTAG Fuse ===&lt;br /&gt;
&lt;br /&gt;
Aus dem Beitrag http://www.mikrocontroller.net/topic/51206&lt;br /&gt;
&lt;br /&gt;
&amp;gt; wenn ich in den Power Down mode schalte bleibt die Stromaufnahme&lt;br /&gt;
&amp;gt; trotzdem gleich.&lt;br /&gt;
&amp;gt; Atmega128 8Mhz 3,3V = 8mah entspricht auch dem Datenblatt.&lt;br /&gt;
&lt;br /&gt;
Datenblatt, Seite 49:&lt;br /&gt;
&lt;br /&gt;
If the On-chip debug system is enabled by the OCDEN Fuse and the chip enter Power down or&lt;br /&gt;
Power save sleep mode, the main clock source remains enabled. In these sleep modes, this will&lt;br /&gt;
contribute significantly to the total current consumption. There are three alternative ways to&lt;br /&gt;
avoid this:&lt;br /&gt;
• Disable OCDEN Fuse.&lt;br /&gt;
• Disable JTAGEN Fuse.&lt;br /&gt;
• Write one to the JTD bit in MCUCSR.&lt;br /&gt;
&lt;br /&gt;
PS. Ich habe gestern den ganzen Tag dran mit dem ATmega128 im&lt;br /&gt;
Sleep-Modus gesessen, man musste einfacht JTAG abschalten, dann läuft&lt;br /&gt;
der Hauptoszillator nicht mehr und der Stromverbrauch sinkt drastisch&lt;br /&gt;
ab.&lt;br /&gt;
&lt;br /&gt;
== Bauteile ==&lt;br /&gt;
&lt;br /&gt;
* [http://datasheets.maxim-ic.com/en/ds/DS1371.pdf DS1371], Echtzeituhr mit 1&amp;amp;mu;A Stromverbrauch&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://interface.khm.de/index.php/lab/experiments/sleep_watchdog_battery/ [[Arduino]] Sleep_Watchdog_Battery] von Martin Nawrath&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]]&lt;br /&gt;
[[Kategorie: Spannungsversorgung und Energiequellen]]&lt;/div&gt;</summary>
		<author><name>Jonebohne</name></author>
	</entry>
</feed>