<?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=129.247.247.240</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=129.247.247.240"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/129.247.247.240"/>
	<updated>2026-04-10T21:58:14Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_Softwarepool&amp;diff=64890</id>
		<title>AVR Softwarepool</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_Softwarepool&amp;diff=64890"/>
		<updated>2012-03-12T12:47:20Z</updated>

		<summary type="html">&lt;p&gt;129.247.247.240: /* Video */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die interessantesten Softwareprojekte aus der Codesammlung...&lt;br /&gt;
&lt;br /&gt;
(A)   ... Projekt ist in &#039;&#039;&#039;Assembler&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
(C)   ... Projekt ist in &#039;&#039;&#039;C&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
(C++) ... Projekt ist in &#039;&#039;&#039;C++&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
(B)   ... Projekt ist in &#039;&#039;&#039;Bascom&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
(PC)  ... Projekt ist nicht für einen µC, sondern für den PC&lt;br /&gt;
&lt;br /&gt;
==1-Wire==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/14792  DS1820, DS18B20 in C]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/6505 Mehrere DS1820/DS18B20 auslesen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31408#536372 Mehrere DS1820/DS18B20/DS18S20/DS1822 über einen Webserver auslesbar]&lt;br /&gt;
&lt;br /&gt;
==Akkulader==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/72627#594587 Bleiakku-Lader 12/24V]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/99803#866081 Glühwürmchen in Rotkohlglas gefangen]&lt;br /&gt;
&lt;br /&gt;
==Betriebssysteme und Scheduler==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/190388#1856376 Nano OS] von Tobias W. ([http://sourceforge.net/projects/nanoos/ Sourceforge])&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/12176#79672 Wartezeiten effektiv (Scheduler)] von Peter Dannegger&lt;br /&gt;
* (C++) [http://www.mikrocontroller.net/topic/96977#837989 Einfacher Scheduler und Timer in C++ für ATMega] von S. Seegel&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/74026#609246 GOS: einfacher preemptive multitasking scheduler] von Günter Greschenz&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/articles/Monitorprogramm_Bamo128 Bamo128] Monitorprogramm und Bootloader&lt;br /&gt;
&lt;br /&gt;
==Bootloader==&lt;br /&gt;
* (A,C,PC) [http://www.mikrocontroller.net/topic/12181#79866 AVR Bootloader]&lt;br /&gt;
* (A, PC) [http://www.mikrocontroller.net/topic/146638#1364260 AVR Bootloader für GCC-Toolchain]&lt;br /&gt;
* (A,PC) [http://www.mikrocontroller.net/topic/95839 AVR Bootloader mit Verschlüsselung]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/72308#591159 ATtiny45 Bootloader]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/67047#538510 MMC/SD Bootloader für ATMega16]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/56818#439359 SD/MMC Card Bootloader (passt in 2kb bootsection)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/61170#480765 boofa - Bootloader für AVR über UART (AVR109)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/53130#413058 Bootloader ATmega168]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/73196#600293 UART Bootloader ATtiny13 - ATmega644]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/99803#866081 Glühwürmchen in Rotkohlglas gefangen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/150816#1414460 UART Bootloader AtMega644P @ 20MHz] (Eclipse Projekt)&lt;br /&gt;
* (C) [[AVR Bootloader in C - eine einfache Anleitung]]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/200645#1971295 LAN-Bootloader für ATmega1284p]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/articles/Monitorprogramm_Bamo128 Bamo128] Monitorprogramm und Bootloader&lt;br /&gt;
Siehe auch: [[Bootloader]]&lt;br /&gt;
&lt;br /&gt;
==DCC==&lt;br /&gt;
&lt;br /&gt;
(Digital Command Control, Standard zur digitalen Steuerung von Modelleisenbahnen)&lt;br /&gt;
&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31397#241300 DCC Decoder]&lt;br /&gt;
&lt;br /&gt;
==DCF77==&lt;br /&gt;
&lt;br /&gt;
(Zeitsignaldienst für funkgesteuerte Uhren auf der Langwellen-Frequenz 77,5 kHz)&lt;br /&gt;
 &lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/38914#287867 DCF77 AVR-Assemblerbaustein ]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/6500#41738 DCF77-Uhr mit ATTINY12]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31385#241104 DCF Digital Empfangsmodul - Korrelation - (Assembler)ATmega8 ]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25071#186286 DCF 77 ]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/14788#101528 DCF-Uhr mit DotMatrix-Anzeige für avr-gcc]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/12154#79501 PC DCF Timer ( PC Zeitschaltuhr)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25116#187197 DCF 77 Uhr mit CodeVision ]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/58769#456232 DCF77 Uhr in C mit ATtiny26]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48597#372164 DCF77 Uhr, zum X.ten Mal, jetzt mit SAF]&lt;br /&gt;
* (C,A) [http://www.mikrocontroller.net/topic/31408#536372 DCF77 mit beliebig gepoltem Eingangssignal innerhalb eines Webservers]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/121049 DCF-Uhr, Sonnenstand, TWI-Port, Alarmfunktion für Atmega8]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/151260#1419218 DCF77 Uhr 7 Segment LED ATmega8 Assembler]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/168807#1614129 DCF-Uhr mit LCD in C]&lt;br /&gt;
&lt;br /&gt;
== DRAM ==&lt;br /&gt;
* (A,C) [http://www.mikrocontroller.net/topic/25053#186085 2MB DRAM an AVR] und Anwendung als [http://www.mikrocontroller.net/topic/25053#186089 Audiorekorder]&lt;br /&gt;
&lt;br /&gt;
==Drehgeber==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/6526#41978 Drehgeber auslesen]&lt;br /&gt;
&lt;br /&gt;
==DTMF==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/92444#792954 DTMF dekodieren]&lt;br /&gt;
&lt;br /&gt;
==DMX==&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/92350#new 20 Kanal Relaissteuerung per DMX]&lt;br /&gt;
&lt;br /&gt;
==Entwicklungssysteme==&lt;br /&gt;
* (PC) [http://www.mikrocontroller.net/topic/74198#611404 AVR Code Wizard]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/30110#230503 Multitasking kernel für ATtinys in ASM]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/65156#521012 BASIC-Computer mit ATmega32]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/64129#511368 AVR TinyBASIC Anpassung für ATmega8]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/59189#460273 Mini-Computer mit BASIC]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/55807 Forth System für ATmegas in Assembler]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/94193 Forth-Computer mit ATmega32 und Videoausgabe] von Christian Berger&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/62500#493931 Fixpoint-Arithmetik in &amp;quot;C&amp;quot;]&lt;br /&gt;
* (C++) [http://www.mikrocontroller.net/topic/143537 Fixpoint-Arithmetik in &amp;quot;C++&amp;quot;]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/85256#717037 64 Bit float Emulator in C, IEEE754 kompatibel]&lt;br /&gt;
* (A,C) [http://www.mikrocontroller.net/topic/92979#797957 AVR ATmega8TestBoard]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/94468#812992 Gleitkomma-Bibliothek für AVR]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/177481?page=1 AVR CP/M System]&lt;br /&gt;
* (PC) [http://www.mikrocontroller.net/topic/187390 EMACS Konfiguration]&lt;br /&gt;
&lt;br /&gt;
==FFT==&lt;br /&gt;
&lt;br /&gt;
(Fast Fourier Transformation, &amp;quot;schnelle&amp;quot; Fouriertransformation)&lt;br /&gt;
&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/25095#186536 FFT auf dem AVR]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/25062#186225 128point FFT in ASM]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/27001#203911 Schnelle FFT in Assembler]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/131525#1191497 AVR-Lichtorgel per FFT MEGA8 32 644 ]&lt;br /&gt;
&lt;br /&gt;
==Funksteckdosen==&lt;br /&gt;
* (C,A) [http://www.mikrocontroller.net/topic/31408#536372 Ansteuerung von Funksteckdosen mit einem Webserver]&lt;br /&gt;
&lt;br /&gt;
==GPS==&lt;br /&gt;
&lt;br /&gt;
(Global Positioning System, satellitengestütztes System zur weltweiten Positions- und Zeitbestimmung)&lt;br /&gt;
&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/48544#371717 GPS - MOUSE - MINI- NAVIGATOR (Assembler) ATmega8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/72507#593252 GPS an mega8,88 oder 168]&lt;br /&gt;
&lt;br /&gt;
==IR==&lt;br /&gt;
* siehe auch [[AVR Softwarepool#RC5|RC5]]&lt;br /&gt;
* (C) [[IRMP]] - Infrared Multi Protocol Decoder:&lt;br /&gt;
**[[IRMP| Wiki Seite]]&lt;br /&gt;
**[http://www.mikrocontroller.net/topic/162119#1545798 Thread im Forum]&lt;br /&gt;
&lt;br /&gt;
==Kryptographie==&lt;br /&gt;
* (A,C) [http://www.mikrocontroller.net/topic/73468 Verschiedene kryptographische Funktionen] &lt;br /&gt;
&lt;br /&gt;
==LANC==&lt;br /&gt;
&lt;br /&gt;
(Steuerprotokoll für Video- und Digitalfotokameras, auch als Control-L bekannt)&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/40463#302754 Sony LANC Auswertung mit AVR] (Atmega 128 @ 16 MHz)&lt;br /&gt;
&lt;br /&gt;
==LEDs und LED-Anzeigen==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/76839#638278 Solarlicht Steuerung]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/77863#648213 Taster + LED am selben Draht (4*)]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/73776#606472 LED-Touch-Panel] (ARM)&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/74013#609097 RGB-Moodlight auf ATTiny2313 mit RC5-Fernbedienung]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/54561#421940 HSV RGB Led Dimmer, C Code &amp;amp; Video &amp;amp; Doku]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/67567#543492 Mini RGB Lichteffektgenerator mit Menü für Pic16F84]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48464#370871 Ansteuerung einer RGB LED (PWM)]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/87149#737282 3x7 Segment und 1 I/O-Pin (Assembler)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31370#240843 ADC mit Multiplexanzeige] (vier 7-Segmentanzeigen)&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31388#241192 AVR-Lauflicht]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/94746#815809 HSB-&amp;gt;RGB Umrechnung rein in Assembler, auch für ATiny]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/99803#866081 Glühwürmchen in Rotkohlglas gefangen]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/110168 2x7-Segment an nur 3 Leitungen]&lt;br /&gt;
* (A) [[Ambilight in Hardware]]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/145156#1346531 µCke Microcontroller Mücke (Atmel Tiny13)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/131525#1191497 AVR-Lichtorgel per FFT MEGA8 32 644 ]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/182305 TLC5940 16-Kanal 12bit LED Treiber ansteuern und HighPower LEDs über MosFETs treiben]&lt;br /&gt;
* (PC) [http://www.mikrocontroller.net/topic/185730 7Segment Coder]&lt;br /&gt;
&lt;br /&gt;
==LCD und VFD==&lt;br /&gt;
* (C) [http://bluematrixi.bl.funpic.de/index.php/elektronik-avr/lcd-display-nokia3310 Bibliothek für Nokia 3310 Lcd Ansteuerung in &amp;quot;C&amp;quot; - sehr gut]&lt;br /&gt;
*(C,A)[http://www.mikrocontroller.net/articles/Ansteuerung_Handy_Displays Ansteuerung_Handy_Displays]&lt;br /&gt;
* (PC) [http://www.mikrocontroller.net/topic/53137#413137 Programm zum Erstellen eigener Schriftarten (LCD)]&lt;br /&gt;
* (PC) [http://www.mikrocontroller.net/topic/54860#423255 LCD Schriftarten ( Fonts in veschiedenen Größen )]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31403  The Siemens S65 132x176, 65536 color display with AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48501#371218 LCD Ansteuerung im 4bit-Modus]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48456#370782 LCD Library T6963c]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/76399#633680 &amp;quot;Bessere&amp;quot; T6963c Library]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25099#186569 LCD Controller für 640x480 LCD mit mega8515]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/38923#287939 LCD Controller KS0073 Support im 4-Bit Mode]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/79609#664268 KS0066U oder Ähnliche --- LCD Treiber]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/81793#683135 Pollin E0855-2 SED1530-Treiber]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/90449#772843 LCD über nur einen IO-Pin ansteuern]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/120475 VFD Library (Vacuum Fluorescent Display Library)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/98321#851423 Grafikfähiger LCD Controller für 320x240 LCD mit 4 Graustufen] (jetzt auch mit 8 Graustufen)&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/140369 Menüsystem für beliebige schwarz-weiß LCDs bis 4096x4096 Pixeln und grafischem Editor]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/194149 Schnelle SED1520 Funktionsbibliothek mit Bildkonverter und Fontgenerator]&lt;br /&gt;
* (PC,C) [http://www.mikrocontroller.net/topic/234304 DOGXL Fontgenerator (SW+Graustufen)]&lt;br /&gt;
* (C,A) [http://www.mikrocontroller.net/topic/236862#2401250 Grafikfähiger LCD Controller für 320x240 LCD mit D-RAM]&lt;br /&gt;
&lt;br /&gt;
==I2C==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/98923#857451 Ultraschall Entfernungsmesser mit I2C, Eigenbau]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/83871#new  I2C-Master realisiert in Software, ohne TWI für alle ATMEGAs]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/38919#new  RS232 &amp;lt;-&amp;gt; TWI / I2C Interface für ATMega8 (ASM) inkl. Windows Software]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/67698#544930 USI TWI Master]&lt;br /&gt;
&lt;br /&gt;
==Messgeräte==&lt;br /&gt;
===Drehzahlmesser===&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/1518#8469 Drehzahlmesser 4 mal 7-Segment mit 90S2313]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/articles/Drehzahlmesser Drehzahlmesser mit 4 mal 7-Segment anzeigen mit Tiny2313, Wiki-Artikel]&lt;br /&gt;
&lt;br /&gt;
===Klopfsensormessgerät===&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/articles/Klopfsensormessgeraet Messgerät für Klopfgeräusche an Verbrennungsmotoren auf Basis des TPIC8101]&lt;br /&gt;
&lt;br /&gt;
===Entfernungsmesser===&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/98923#857451 Ultraschall Entfernungsmesser mit I2C, Eigenbau]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/130834 3D Umgebungserfassung mit einem auf zwei Servors montiertem Sharp Distanzsensor, Eigenbau]&lt;br /&gt;
&lt;br /&gt;
===Frequenzmesser===&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/62610#495030 Frequenzmesser bis 2Mhz -- mit AVR ATmega8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48582#372072 Frequenzmessung]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/62517#494146 Input Capture Pin (ICP) auslesen ( Frequenz messen)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25144#187587 Frequenzmessung und Impulszählung über den Parallelport-IR]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31394#241251 einfacher 5 MHz Frequenzzähler (Assembler) ATmega8]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/69021#558098 Multimeter]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/173665#new sehr genauer Frequenzmesser Atmega8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/186801#new  Reziproker Frequenzzähler+ Optimierte 64bit uint Routinen]&lt;br /&gt;
* (C+A) [http://www.mikrocontroller.net/topic/200279#new 6 Stellen von 1Hz bis 40MHz ATmega8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/241150#2458079 Reziproker Frequenzzähler, GPS-stabilisiert, ATmega162]&lt;br /&gt;
&lt;br /&gt;
===Frequenzgenerator===&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/152966#1438488 Einstellbarer Frequenzgenerator für 0.12 Hz - 8 MHz mit Atmega 8 und Bascom ]&lt;br /&gt;
&lt;br /&gt;
===Kompass===&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/100239#870281 KOMPASS KMZ10A KMZ10B ATmega8 Assembler]&lt;br /&gt;
&lt;br /&gt;
===Messgeräte für elektronische Bauteile===&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/69021#558098 Multimeter]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/60797#477026 LC-METER / LC-Messgerät ATmega8 Assembler]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/60591#474873 Widerstandstester]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/56770#438957 Ladungsmessgerät]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31386#241139 Transistortester]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/131804#1194273 Transistortester]&lt;br /&gt;
&lt;br /&gt;
===Spannungsmesser===&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31370#240843 ADC mit Multiplexanzeige] - Voltmeter&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/69021#558098 Multimeter]&lt;br /&gt;
&lt;br /&gt;
===Thermometer===&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/6516#41903 Zeit + Temperatur auf LCD mit AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/53127#413006 Thermometer mit LED &amp;amp; LM35]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31408#536372 Viele DS18x20-Thermometer in einem Webserver]&lt;br /&gt;
&lt;br /&gt;
===Oszilloskop===&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/53129#413011 Einfaches Oszilloskop - Bascom]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/48586#372093 Oszi- &amp;amp; Logikanalyser mit LCD]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31376#240880 einfaches DIGITAL- Oszilloskop (800 Datenpunkte) Assembler]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/56616#437772 Einfaches &amp;quot;Oszilloskop&amp;quot;]&lt;br /&gt;
* (C) [http://www.christoph-lauer.de/Homepage/Blog/Eintrage/2010/8/22_Embedded_C_based_Spectrumanalyzer.html ATXMega based Oscilloscope and Spectrumanalyzer]&lt;br /&gt;
&lt;br /&gt;
==MIDI==&lt;br /&gt;
&lt;br /&gt;
(Musical Instrument Digital Interface, Datenübertragungsstandard für Musikinstrumente)&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48542#371695 Mr.MidiPlayer - Spielt alle MIDI-Dateien von einer SD-Karte] (siehe auch: [[Midi_Rekorder_mit_MMC/SD-Karte]])&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25035#185861 MIDI-Rekorder mit SD/MMC und AVR]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/106512# Drum-Trigger mit MIDI-Ausgabe]&lt;br /&gt;
&lt;br /&gt;
==MMC==&lt;br /&gt;
&lt;br /&gt;
(Multimedia Card, digitales Flash-Speichermedium)&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25056#186117 SourceCode MMC die Zweite]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48481#370950 MMC/SD-Karte mit FAT16 an AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/67047#538510 MMC/SD Bootloader füt ATMega16]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/14800#102024 MMC/SD ansteuern mit AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25035#185861 MIDI-Rekorder mit SD/MMC und AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/articles/FAT32 MMC/SD - FAT16/32 Bibliothek für AVR  mit Wiki]&lt;br /&gt;
&lt;br /&gt;
==Netzgeräte==&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/60786#476904 Labornetzgerät]&lt;br /&gt;
* [[RADLAB-PS1]] [http://www.mikrocontroller.net/topic/124858#1138781 Netzteil um LM317 mit Strombegrenzung und Anzeige!]&lt;br /&gt;
&lt;br /&gt;
==Netzwerk==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/87517#new Kleiner ENC28J60 µWebserver von SimonK]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/82127#new Ulrich Radigs ENC28J60 mit leicht lötbaren/beschaffbaren Bauteilen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/131825 Dirk Broßwick Webserver auf ENC28j60 Basis mit einem ATmega2561, es gibt auch einen Port auf das AVR-NET IO]&lt;br /&gt;
&lt;br /&gt;
==Parser==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/64763#517245 Zwei Parser für numerische Ausdrücke]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/76842#638283 uShell - ein universeller Parser für uCs]&lt;br /&gt;
&lt;br /&gt;
==RFID==&lt;br /&gt;
&lt;br /&gt;
(Radio Frequency Identification, Verfahren zur funkbasierten Identifizierung und Lokalisierung von Gegenständen)&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/68442#552128 USB RFID Tag Leser]&lt;br /&gt;
&lt;br /&gt;
==RC - Fernsteuerungen/Servos==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48529#371582 RC Summen Signal erzeugen ]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/192453 RC Summen Signal dekodieren ]&lt;br /&gt;
&lt;br /&gt;
==RC5==&lt;br /&gt;
&lt;br /&gt;
(verbreitetes Datenübertragungsprotokoll für Infrarot-Fernbedienungen)&lt;br /&gt;
&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/14789#101536 RC5 Sender auf einem Attiny11L]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/74013#609097 RGB-Moodlight auf ATTiny2313 mit RC5-Fernbedienung]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/12216#80856 Fernbedien RC5 Empfänger]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/59235#460765 RC5 Sender selber bauen ???]&lt;br /&gt;
&lt;br /&gt;
==Ringpuffer==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/66789#536189 Ringpuffer AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/101472#882716 AVR-GCC: UART mit FIFO]&lt;br /&gt;
&lt;br /&gt;
==SD==&lt;br /&gt;
&lt;br /&gt;
(Secure Digital Memory Card; digitales Flash-Speichermedium)&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48542#371695 Mr.MidiPlayer - Spielt alle MIDI-Dateien von einer SD-Karte] (siehe auch: [[Midi_Rekorder_mit_MMC/SD-Karte]])&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25035#185861 MIDI-Rekorder mit SD/MMC und AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/68257#550336 Datenrekorder auf SD-Karte mit mega88]&lt;br /&gt;
&lt;br /&gt;
==Sonstiges==&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/111783#994358 Sonnenstandberechnung mit Atmega 8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/articles/UAC_Mikrocontroller_ASCII_Console uAC Mikrocontroller ASCII Console]&lt;br /&gt;
&lt;br /&gt;
==Spaßprojekte==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/99803#866081 Glühwürmchen in Rotkohlglas gefangen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/119876#1083044 Miniprojekt: Lagerfeuer-LED (ATtiny25)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/120289#1087905 Klingel mit 100 Melodien - last minute Weihnachtsgeschenk]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/145156#1346531 µCke Microcontroller Mücke (Atmel Tiny13)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/167528#1601077 Toastbrote zählen]&lt;br /&gt;
&lt;br /&gt;
==Spiele==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48505#371259 Tetris auf dem AtMega8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/187253# Atmega8 Schachuhr mit Max7219 ]&lt;br /&gt;
&lt;br /&gt;
==Steuerungen==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/123551 Aquarium Controller]&lt;br /&gt;
&lt;br /&gt;
==Taster / Schalter==&lt;br /&gt;
===mechanisch===&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/6492#41625 Tasten entprellen - Bulletproof] (siehe auch: [[Entprellung]])&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48465#370877 Universelle Tastenabfrage]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/6491#41624 Tasten-Matrix entprellen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/64731#517001 Tastenmatrix auslesen über nur 2 Leitungen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/64743#517105 Tasten Entprellen für N00bs]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/77863#648213 Taster + LED am selben Draht (4*)]&lt;br /&gt;
===kapazitiv===&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/38904  Sensor mit nur einer Kontaktfläche]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25045 Einfache Sensortaste]&lt;br /&gt;
&lt;br /&gt;
==Tonerzeugung==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/66945#537624 ATMEGA8 Soundgenerator/Synthesizer]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/120289#1087905 Klingel mit 100 Melodien - last minute Weihnachtsgeschenk]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/134362 RTTTL Melodiegenerator mit ATTINY85]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/232702#new RTTTL Melodiegenerator mit ATMEGA8]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/25051 Melodie ausgeben mit AVR ATTiny12]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/145156#1346531 µCke Microcontroller Mücke (Atmel Tiny13)]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/137629#1259132 Melodieklingel BASCOM ATmega8]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/191596 2Kanal Synthesizer ATtiny 2313, 85, ..]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/232845 17 Kanal Avr Synthesizer]&lt;br /&gt;
&lt;br /&gt;
==TWI==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/87597#742070 AVR TWI Master und Slave Funtionen in C]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31404#242081 TWI / I2C einf. MASTER SLAVE Beispiel(Assembler) ATmega8]&lt;br /&gt;
&lt;br /&gt;
==USB==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/75254#622120 USB Host Stack für Eingebettete Systeme (LGPL)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/68442#552128 USB RFID Tag Leser]&lt;br /&gt;
* (A,C) [http://www.mikrocontroller.net/topic/92979#797957 AVR ATmega8TestBoard]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/90791#776280 Relaiskarte für den USB Port]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/130381#1179352 USB-Stick am Mikrocontroller VNC1L]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/155241 PDIUSBD12 Treiber und micro USB-Device stack]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/192453 HID-Joystick mit V-USB ]&lt;br /&gt;
&lt;br /&gt;
==UART==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/101472#882716 AVR-GCC: UART mit FIFO]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/38928#287985 Software UART]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/125651#1147436 Software UART mit FIFO]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/175946#1690682 uParse] - ein kompakter und vielseitiger Parser (Atmega32) für [[RS232]]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/159753#1517744 Einfacher Interpreter für Komandozeilen/Befehlszeilen] (Atmega32) für [[RS232]]&lt;br /&gt;
&lt;br /&gt;
==Video==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/53140#413249 AVR ASCII Video Terminal - 40 x 25 - BAS Signal]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/53139#413225 TV VIDEO BILD BAS Frequenzzähler DVM Atmega8 Assembler]&lt;br /&gt;
* (A) [http://www.electronicspit.com/video/ Videosignal in Farbe aus dem ATMega32] (URL nicht mehr erreichbar)&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/25091#new VGA Testbildgenerator]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/101429#882288 ATmega8 erzeugt Video in C!]&lt;br /&gt;
&lt;br /&gt;
==Zeitgeber und Uhren==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/12185#80055 Die genaue Sekunde / RTC]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/74673#616226 LCD-Timer für Belichtungsgerät]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/119859#1082804 DS1307 Assembler-Code]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31374#240878 AVR Library für RTC 12C887 in C]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25136#187534 RTC DS1302 in C]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25087#186454 RTC + Scheduler]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/53131#413059 Jumbo-LED Uhr]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/6516#41903 Zeit + Temperatur auf LCD mit AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25069 Sekunden in Zeit/Datum umwandeln (mit Sommerzeit/Schaltjahren)]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/48560#371911 BASCOM Uhr mit Butterfly]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48450#370765 Countdown timer für UV Belichter]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/98885 Countdown Timer mit ATtiny2313]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/12176#79672 Wartezeiten effektiv (Scheduler)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31408#536372 Schaltuhr mit DCF77-Referenz in einem Webserver, Steuerung von Funksteckdosen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/100892#876549 Eieruhr mit ATtiny24V/ATtiny2313V]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/151236 Zeitauslöser für Casio EX F1 mit Attiny2313]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/151260#1419218 DCF77 Uhr 7 Segment LED ATmega8 Assembler]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/177688# NIXIE Uhr mit vielen Funktionen in C mit ATTiny2313]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[AVR-Codesammlung Übersicht]]&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR| ]]&lt;br /&gt;
[[Kategorie:Forum]]&lt;/div&gt;</summary>
		<author><name>129.247.247.240</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Reichelt-Wishlist&amp;diff=61550</id>
		<title>Reichelt-Wishlist</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Reichelt-Wishlist&amp;diff=61550"/>
		<updated>2011-11-09T14:18:25Z</updated>

		<summary type="html">&lt;p&gt;129.247.247.240: /* Sensoren und Aktoren */&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äßig 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. Blöcke von 50 Strichen werden regelmäßig gegen eingefärbte Kolonnen von Ausrufezeichen ausgetauscht, die den Reichelt-Mitarbeitern hoffentlich umso mehr auffallen ;)&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 und CPLD ===&lt;br /&gt;
&lt;br /&gt;
* Ajile aj-100 (Java Real-Time Prozessor) ||||&lt;br /&gt;
* ALTERA CPLD EPM30xx - Familie ||&lt;br /&gt;
* ALTERA CPLD EPM70xx - Familie ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* ALTERA Cyclone2 - Familie ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* ALTERA Cyclone3 - Familie ||||| |&lt;br /&gt;
* ALTERA Flex10K - Familie ||||&lt;br /&gt;
* ALTERA MAX-II (CPLDs) ||||| ||||| ||||| |&lt;br /&gt;
* Arm: Cortex M3 Nachfolger für die LPC2x&lt;br /&gt;
* Atmel AT89LP4052 PDIP ||||| ||||| ||||&lt;br /&gt;
* Atmel AT89S2051/4051 |||||&lt;br /&gt;
* Atmel AT90PWM3B (µC für Servosteuerungen und z.b. Motorsteuerungen) ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* Atmel ATA6612/13 (LIN-Bus SoC) ||&lt;br /&gt;
* Atmel Atmega 168PA, 88PA, etc. ||||| ||||&lt;br /&gt;
* Atmel Atmega 16A und 32A in TQFP und PDIP ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* Atmel Atmega 16L und 32L in TQFP (waere ATMEGA 16/32L8 TQ) ||||| |&lt;br /&gt;
* Atmel ATmega16M1 in TQFP |&lt;br /&gt;
* Atmel ATmega324P in TQFP und PDIP ||||| ||||| ||||| |&lt;br /&gt;
* Atmel ATmega324PV in TQFP und PDIP ||&lt;br /&gt;
* Atmel ATmega328P in TQFP und PDIP ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* Atmel ATmega48P in TQFP und PDIP ||||&lt;br /&gt;
* Atmel ATmega644p(a) / ATmega1284p(a) in TQFP und PDIP ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||&lt;br /&gt;
* Atmel ATtiny2313V in SO und PDIP |||||&lt;br /&gt;
* Atmel ATtiny261 (auch 461 und 861; bevorzugt DIP) ||||| ||||| ||||| |&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. {{Reichelt50|FF0000}}{{Reichelt50|00FF00}}||||| ||||| ||||| ||||| ||||&lt;br /&gt;
* Atmel AVR mit USB: AT90USB82 und ATmega32u4 ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |&lt;br /&gt;
* Atmel AVR32 im TQFP ||||| ||||| ||||| ||||| |&lt;br /&gt;
* Atmel Cortex M3 SAM3S im QFN/LQFP Gehäuse |&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;
* Bessere Auswahl: statt MSP430F147, F148, F149 wenigstens einen mit DAC -&amp;gt; MSP430F16x&lt;br /&gt;
* CY7C68013A-56PVXC (Cypress EZ-USB FX2LP) ||||| ||&lt;br /&gt;
* Cypress PSoC Mikrocontroller ||||| ||||| ||||| ||&lt;br /&gt;
* Freescale DSP56F801 ||||&lt;br /&gt;
* Freescale HCS12 Controller ||||| ||||| ||||| ||||| ||||&lt;br /&gt;
* Freescale MC9S08QD4 ||&lt;br /&gt;
* Freescale MC9S08QEx |&lt;br /&gt;
* Freescale MC9S08QG8 (DIP 16) ||||| ||||| ||||| ||&lt;br /&gt;
* Freescale Prozessoren (Coldfire) (16 + 32 Bit) ||||| ||&lt;br /&gt;
* Infineon XC866 ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* Lattice GAL 26V12 |&lt;br /&gt;
* Lattice ispMACH 4032C / 4064C / 4128C ||||&lt;br /&gt;
* Luminarymicro Stellaris Serie (Cortex-M3) ||||| ||&lt;br /&gt;
* Maxim/Dallas DS89C450 |&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)) {{Reichelt50|FF0000}}{{Reichelt50|00FF00}}{{Reichelt50|0000FF}}{{Reichelt50|00FFFF}}||||| ||||| ||||| ||||| |&lt;br /&gt;
* Microchip dsPIC33FJ128GP802 ||||&lt;br /&gt;
* Microchip PIC12F1822 |&lt;br /&gt;
* NXP LPC1114 |&lt;br /&gt;
* NXP LPC1313 |&lt;br /&gt;
* NXP LPC1343 |&lt;br /&gt;
* NXP LPC1751 |&lt;br /&gt;
* NXP LPC1754 |&lt;br /&gt;
* NXP LPC214x-Serie ARM7-Controller ||||| ||||| ||||&lt;br /&gt;
* NXP LPC23xx/24xx ||||| ||&lt;br /&gt;
* NXP SAA5281 Videotextinterface ||||| ||||&lt;br /&gt;
* Parallax Propeller CPU, 8 Cogs - DIP 40 ||||| ||||| ||||| ||||| ||||| ||||| ||||| |&lt;br /&gt;
* PICAXE von Revolution Education Ltd |&lt;br /&gt;
* Renesas M16C ||||| ||||&lt;br /&gt;
* Silabs C8051F320 USB Mikrocontroller ||&lt;br /&gt;
* Silabs Si4735 im SSOP-Gehäuse (AM/FM-Empfänger) |||&lt;br /&gt;
* SSV DIL/NetPCs [http://www.dilnetpc.com]http://www.dilnetpc.com ||||| ||||| ||||&lt;br /&gt;
* ST ST7MC... (µC für Servosteuerungen, und vor allem Brushless-Motoren) ||||| ||||&lt;br /&gt;
* ST STM32 Serie (Cortex-M3) {{Reichelt50|FF0000}}|&lt;br /&gt;
* ST STR7 Serie (ARM7TDMI) ||&lt;br /&gt;
* TI MSP430F167, TI MSP430F168 ||||&lt;br /&gt;
* TI MSP430F2001/2/3 etc. im RSA-Gehäuse (=QFN) ||||| ||&lt;br /&gt;
* TI MSP430F2618 |||&lt;br /&gt;
* TI MSP430FG4618 |&lt;br /&gt;
* TI TMS470 Arm7 ||||| ||||| ||||| ||||| |&lt;br /&gt;
* TI TUSB3210 ||||| ||&lt;br /&gt;
* Ubicom SX20 SX28 IP2022 ||&lt;br /&gt;
* Western Design Center 65c816 |||&lt;br /&gt;
* XC3S 400 TQ144 |||&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;
* 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;
&lt;br /&gt;
=== Speicher ===&lt;br /&gt;
&lt;br /&gt;
* 24LC256 oder 24AA256 oder 24LC512 oder 24AA512 ||||| |||||&lt;br /&gt;
* 3.3V async SRAM ab 16KByte ||||| ||&lt;br /&gt;
* 3.3V DRAM ||||| |&lt;br /&gt;
* Atmel DataFlash, z.&amp;amp;nbsp;B. AT45DB081B (8 MBit Flash-Speicher an seriellen Bus im 8poligen Gehäuse) {{Reichelt50|FF0000}}{{Reichelt50|00FF00}}|||&lt;br /&gt;
* EEPROM mit SPI Schnittstelle 25XX Serien ||||| ||||&lt;br /&gt;
* F-RAM mit SPI von RAMTRON ||||| |||&lt;br /&gt;
* FM25L16 o. FM25L256 SPI-FRAM |&lt;br /&gt;
* FPGA Konfigurations-EEPROMS AT17LV256, AT17C65/128/256.../XCF04S/... ||||| ||||| ||||| |||&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;
* Schnelles statisches RAM 128kB (10, 12, 15 oder 20ns, z.&amp;amp;nbsp;B. Samsung K6R1008C1D-UI10 oder CY7C1019D-10ZSXI) (5V/3,3V) {{Reichelt50|FF0000}}||||| ||||| ||&lt;br /&gt;
* Serielle SRAMs (Microchip 23K256) |&lt;br /&gt;
&lt;br /&gt;
=== Einzeltransistoren, Op-Amps, MOSFET-Treiber ===&lt;br /&gt;
&lt;br /&gt;
* OPA134, OPA2134, OPA4134 low noise audio OpAmps |&lt;br /&gt;
* 2SC1971 Transistor mit hoher Frequenz und viel Leistung für Endstufen ||&lt;br /&gt;
* AD623 Single Supply,Rail-Rail, InstrOpamp ||||| |&lt;br /&gt;
* AD628 InstrOpAmp, high voltage inputs |&lt;br /&gt;
* AD8601 Rail to Rail Opamp |&lt;br /&gt;
* BSH205 P-Channel 1.5V(GS), 0.75A, 12V D-S ||&lt;br /&gt;
* BUF420AW Schaltnetzteil Transistor von STM |||||&lt;br /&gt;
* Digitaltransistoren (BCR*), auch als Pärchen NPN/PNP (BCR10, BCR08pn) ||||| ||||&lt;br /&gt;
* IPS5451S intelligenter Leistungsschalter 50 V, 35 A, 25 mΩ |&lt;br /&gt;
* IPW60R045CS Infineon Mosfet 600V 45mOhm Rdson 30ns tr+tf (niedrigster Rdson in der Klasse) |&lt;br /&gt;
* IR2011 MOSFET Treiber |||&lt;br /&gt;
* IR21844 DIL (High-Speed IGBT-Driver) |||&lt;br /&gt;
* IR3313 o.ä. Intelligenter Leistungsschalter 32V/90A, einstellbare Strombegrenzung |||&lt;br /&gt;
* IRC540 (HEXFET) |&lt;br /&gt;
* IRF7503/IRF7506 Dual Mosfet SMD ||||| |||||&lt;br /&gt;
* IRFI4212H-117P Doppel-Mosfet (f. Klasse D-Verstärker) |&lt;br /&gt;
* J-FET BF545 A,B,C (entspricht BF245 in SMD ) |&lt;br /&gt;
* Leistungs-OP LM675 von National ||&lt;br /&gt;
* LM397, LM321 o.ä. single op-amp in SOT23-5 5-30V supply {{Reichelt50|FF0000}}||||| ||||| ||||| ||||| ||||| ||||&lt;br /&gt;
* MAX4420 Mosfet Driver ||&lt;br /&gt;
* MAX4429 Mosfet Driver ||&lt;br /&gt;
* MC 34152 D-SMD SO8 Dual Mosfet Driver |&lt;br /&gt;
* Mehr FET-Treiber (TI UCC3372x, HIPxxx , die neueren Brückentreiber von Maxim ||||| |||&lt;br /&gt;
* mehr FETs und IGBTs (nichtnur IRF, sehr gut IXYS &amp;lt;- und sauteuer!) ||||| ||||&lt;br /&gt;
* MJD31C NPN Transistor SMD DPAK 3&lt;br /&gt;
* Niederohm-FETs in SO8, N und P ||||| ||||| ||&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;
* Schnellere und gleichzeitig günstige OpAmps; Beispiel AD8055 ||&lt;br /&gt;
* Si4562DY N- and P-Channel 2.5-V (G-S) MOSFET SMD ||||| ||||| ||&lt;br /&gt;
* SPP20N60C3 Infineon Mosfet 600V 190mOhm Rdson &amp;lt;10ns tr+tf (Schnellste Schaltzeit in der Klasse) ||||| |&lt;br /&gt;
* TLC2264 (Quad Rail-To-Rail Operational Amplifier) ||&lt;br /&gt;
* TLV2782 (1,8V Rail-to-Rail OP) &#039;&#039;&#039;unklar: War &amp;quot;TLV27(2&amp;quot;&#039;&#039;&#039; |||||&lt;br /&gt;
* TLC3702 Komparator |&lt;br /&gt;
* TLV2382ID Rail-Rail-OP von TI |&lt;br /&gt;
* Sehr schnelle Op-Amps wie LMH6733 o.a in single und trible |&lt;br /&gt;
&lt;br /&gt;
=== Schaltregler (Buck, Boost, DC/DC,...) ===&lt;br /&gt;
&lt;br /&gt;
* 5,2V Lowdrop Längsregler LF52 im TO252AA von STM |||||&lt;br /&gt;
* generell Spannungsregler, LOW-DROP, SMD (DPAK, D2PAK) &lt;br /&gt;
* Größere Auswahl an Step-up Reglern ||||| ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* L4941 Spannungsregler 5V/1A in SMD-Ausführung (DPAK) ||||| |||||&lt;br /&gt;
* L5970 o. L5972 1 bzw. 2A, 250kHz Schaltregler im SO8 |&lt;br /&gt;
* L5973D 2,5A, 250kHz, Schaltregler im SO8 (ca. 1€) |||||&lt;br /&gt;
* LF50ABDT Spannungsregler SMD DPAK 5.0V very low drop |&lt;br /&gt;
* LM1084-ADJ (low dropout voltage positive regulator) |&lt;br /&gt;
* LM1117 (low dropout voltage regulator) - 1,8V ||&lt;br /&gt;
* LM1117MPX-1.8 und LM1117MPX-3.3 (SMD-Spannungsregler SOT-223) ||||| ||||| |||||&lt;br /&gt;
* LM2734 Schaltregler |||&lt;br /&gt;
* LM317EMP oder LM317AEMP SMD-Spannungsregler einstellbar (SMD TO-223 Gehäuse) ||||| ||||| ||||&lt;br /&gt;
* Maxim MAX629, MAX1795, MAX1703 (Aufwärtsregler / Step-Up-Konverter) ||||| ||||| |||||&lt;br /&gt;
* MAX 8865 Dual, Low-Dropout, 100mA Linear Regulator |&lt;br /&gt;
* MC78LCxx Serie - Ultra Low Drop Spannungsregler 3-5 Volt mit 1 Mikro-Ampere Ruhestrom ||||| ||&lt;br /&gt;
* MIC29300/29301 Spannungsregler 5,0V 3A im TO263(SMD) Gehäuse ||&lt;br /&gt;
* NCP3063: 1.5 A, BUCK _&amp;amp;_ BOOST Inverting Switching Regulator DIP8/SOIC8 (MC34063 upgrade) (0,32$) |&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;
* 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;
* 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;
* R-785.0-1.0 Schaltregler, Ausgang 5,0V, 1A |||&lt;br /&gt;
* Spannungsregler SMD in DPAK ||||| ||||| ||||| ||||| ||||&lt;br /&gt;
* ST1S10 günstiger &amp;quot;Monolithic synchronous step-down regulator&amp;quot; bis zu 3A Ausgang | &lt;br /&gt;
* TI TPS61070 3.3V-75mA-aus-einer-NiMH-Zelle (+ passende SMD-Induktivität) |&lt;br /&gt;
* ViPER Schaltregler von ST |&lt;br /&gt;
&lt;br /&gt;
=== Konstantstromquellen (LED, Akkus) ===&lt;br /&gt;
&lt;br /&gt;
* CCS-Akkulade-IC (z.&amp;amp;nbsp;B. CCS9620SL) (siehe [[http://bticcs.com/]]) |||||&lt;br /&gt;
* HV9910 Schaltregler für die Hochleistungs-LEDs Ub=8-450V; I beliebig; Eff. besser 90% ||||| ||||| ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* LM340x High Power LED-Treiber von National ||||&lt;br /&gt;
* LTC3490 (350mA-Konstantstromquelle) ||||| |||||&lt;br /&gt;
* Max1555 - LiPo Lade IC |||&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;
* PCA9685 16Kanal 12Bit PWM LED Controller ||||| ||&lt;br /&gt;
* STP08CL596B1 DIP16 STM, LOW VOLTAGE 8-BIT CONSTANT CURRENT LED SINK DRIVER ||&lt;br /&gt;
* STP08CL596M SO16 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;
* STP16CL596M SO24 STM, LOW VOLTAGE 8-BIT CONSTANT CURRENT LED SINK DRIVER |||&lt;br /&gt;
* TLC5940 16 Kanal PWM LED-Treiber ||&lt;br /&gt;
* UDN 2987 LW (Source Driver UDN2987 in SMD-Bauform) ||&lt;br /&gt;
&lt;br /&gt;
=== Ethernet, I²C (2Wire), SPI und andere Interfaces ===&lt;br /&gt;
&lt;br /&gt;
* CLC020 und CLC021 (National Semiconductor) Parallel Component nach SDI-Converter |||||&lt;br /&gt;
* CP2120 single-chip SPI to I2C bridge and GPIO port expander |&lt;br /&gt;
* CS8900A Ethernet-Controller ||||| |||&lt;br /&gt;
* CY7C67300 (Cypress) dual role USB controller mit OTG ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* DP83848C (Ethernet Physical Layer Transceiver/PHY, MII/RMII-Schnittstelle, passend zu AT91SAM7X) |||&lt;br /&gt;
* Ethernet Magnetics (Auch POE) ||||| ||||&lt;br /&gt;
* Fast Ethernet-Controller (DE9000A/B/E, AX88796B, ...) |&lt;br /&gt;
* FTDI High Speed Chips, z.&amp;amp;nbsp;B. FT2232H (USB - UART/FIFO IC)||||| |&lt;br /&gt;
* Generell mehr 1-Wire-ICs ||||| ||||| ||||| ||||| ||||| ||||| ||||| |&lt;br /&gt;
* Generell mehr I²C-ICs {{Reichelt50|FF0000}}||||| |&lt;br /&gt;
* Generell mehr SPI IC ||||| ||||| ||||| |||||&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;
* ISD 5116 (Sprachaufnahme bis 16min &amp;amp; I2C-Interface) ||||| ||||| ||||| |&lt;br /&gt;
* LTC1694-1 (I2C/SMBus Accelerator) ||||| |&lt;br /&gt;
* MAX6650 I²C-Lüftermonitor ||&lt;br /&gt;
* MAX6958 / MAX6959 (I²C 4-Digit, 9-Segment LED Display Drivers with Keyscan) ||||| ||||| ||&lt;br /&gt;
* MAX7311AWG 2Wire Interface von Maxim ||||&lt;br /&gt;
* MCP23008 8Bit I2C I/O Expander ||&lt;br /&gt;
* MCP23016 16Bit I²C I/O Expander ||||| ||||| ||| (verfügbar)&lt;br /&gt;
* MCP23S08 8BIT SPI I/O Expander |&lt;br /&gt;
* MCP23S17 16Bit SPI I/O Expander (aber ohne Schmidt-triggerd Eingänge wie der 23x16) |&lt;br /&gt;
* P82B86 (I2C Dual Bi-Directional Bus Buffer) ||&lt;br /&gt;
* Philips PCA82C252 oder TJA1054A oder vergleichbar (&amp;quot;Fault-Tolerant&amp;quot; CAN Transceiver, 11898-3) ||||| |||||&lt;br /&gt;
* Power over Ethernet Bausteine z.&amp;amp;nbsp;B. LM7050 |&lt;br /&gt;
* RS485 isoliert: z.&amp;amp;nbsp;B. Burr-Brown ISO485 o.ä. ||||| ||&lt;br /&gt;
* sn65hvd230/231/232 (CAN-Transceiver) in SO8 ||&lt;br /&gt;
* TH3122 K-Line Interface von Melexis ||||| ||||&lt;br /&gt;
* TH8080 LIN Transceiver von Melexis (oder vergleichbare) |&lt;br /&gt;
* TI ISO1050 (Isolierter CAN-Transceiver) ||&lt;br /&gt;
&lt;br /&gt;
=== ADC, DAC und PWM ===&lt;br /&gt;
&lt;br /&gt;
* 16-bit A/D-Wandler (waren von Maxim schon im Programm, sind aber wieder herausgeflogen?) ||||| ||&lt;br /&gt;
* AD7524 8-Bit DAC in SMD ||||| ||||| ||||&lt;br /&gt;
* ADS8320 ADC 16 Bit seriell ||||| ||||| ||||| ||||| ||||| ||||| |&lt;br /&gt;
* CS5641 von Cirrus...The CS5461 incl. two delta-sigma A/D converters.... ||&lt;br /&gt;
* D/A Wandler mit 4 oder mehr Ausgängen, z.&amp;amp;nbsp;B. TLC5620/TLV5629/AD5325 ||||| ||||| |||&lt;br /&gt;
* DAC7612 DAC 12 Bit seriell ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* DAC8830 IDT (16Bit-DAC,ser. Input) ||||| |&lt;br /&gt;
* Generell mehr DAC&#039;s (auch die teureren) von TI |||||&lt;br /&gt;
* Generell mehr I2C IC (ADC, DAC, DSP, u.a. Crystal, BurrBrown etc.) ||||&lt;br /&gt;
* Generell mehr PWM-SIC&#039;s ||||&lt;br /&gt;
* LTC 1655(L) N8 16 Bit DAC interne Ref 2.048/1.25V(L Type) SPI Interface ||&lt;br /&gt;
* LTC24xx (24-Bit Delta-Sigma ADC) ||||&lt;br /&gt;
* MAX127/128 8-Kanal 12bit ADC mit I2C interface |||&lt;br /&gt;
* MAX528 8-fach 8Bit DAC mit Output Buffer seriell |&lt;br /&gt;
* MCP4725A0 und MCP4725A1 D/A-Wandler 12 Bit I²C ||&lt;br /&gt;
* Philips TDA1543 - 2x16-Bit DAC |&lt;br /&gt;
* TI PCM1804 Audio-ADC||||&lt;br /&gt;
* TI PCM2707 USB-Audio-DAC ||&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;
&lt;br /&gt;
=== Sensoren und Aktoren ===&lt;br /&gt;
&lt;br /&gt;
* 4Hz Supersense µblox LEA-4S GPS module (Importer pointis.de) + Passende Passives Patch antenna (zB. von inpaq.com) ||||| |||&lt;br /&gt;
* Allegro Stromsensoren (z.&amp;amp;nbsp;B. ACS713, ACS756) ||||| ||||| ||||&lt;br /&gt;
* Allgemein mehr Sensoren ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* Anemometer ||||| |&lt;br /&gt;
* BLDC-Motoren |||&lt;br /&gt;
* Drehwinkelgeber, Gyro, Kreiselsensoren ähnl. Tokin CG-L43 ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||&lt;br /&gt;
* Durchflussmesser (z.&amp;amp;nbsp;B. wie Conrad Nr.155374) ||||| ||||| ||||| |||&lt;br /&gt;
* Flexinol ||||| |||&lt;br /&gt;
* FSRs (Force Sensing Resistor) von Interlink Electronics ||||| ||||| |||&lt;br /&gt;
* Getriebemotoren wie RB35 oder RB40 ||||| ||||| |||||&lt;br /&gt;
* günstige Temp. Sensoren TC77 ||||| ||||| ||||&lt;br /&gt;
* Gyro Sensoren  MURATA,  ENC-03J A/B    ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* Hall-Sensor UGN3503, KMZ51 ||||| ||||| ||||| |&lt;br /&gt;
* Hall-Sensoren aehnlich TLE4905, aber mit Vcc 3,3V, z.&amp;amp;nbsp;B. CYD1102G |&lt;br /&gt;
* Hall-Sensoren z.&amp;amp;nbsp;B. TLE4905 wieder ins Programm nehmen ||||&lt;br /&gt;
* I²C-Bus Temperatursensor DS1631Z ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* iMEMs Acceleration Sensors ADXL Series von Analog Devices ||||| ||||| ||||| ||||&lt;br /&gt;
* Induktions-Stromsensoren Coilcraft #J9199-A o.ä. ||||| ||&lt;br /&gt;
* IS471 Selbstmodulierende IR-Lichtschranke ||||| ||||| ||||| ||||| ||||| |&lt;br /&gt;
* K-Typ (J-Typ) Thermocouple Temperatursensoren und passende Steckverbinder ||||| ||||| ||&lt;br /&gt;
* kleine Feuchtigkeitssensoren zur &#039;on-board-Montage&#039; ||||| ||||| ||||| ||||| ||||&lt;br /&gt;
* LEM Stromsensoren (Transducer) der HAIS-Serie, speziell HAIS 50-P und 100-P ||||| ||||| ||||| ||||&lt;br /&gt;
* Luftdruck-/ Temperatur Sensor Intersema MS5534 (mit SPI- Interface) ||||| ||||&lt;br /&gt;
* Magnetfeld-Sensor (Kompass-Anwendung) KMZ52 ||||| ||||| ||&lt;br /&gt;
* MAX6675 Typ-K Thermoelement nach SPI ||||| ||||| ||||| ||||| &lt;br /&gt;
* Modellbau-Servos ||&lt;br /&gt;
* Motorola/Freescale Drucksensoren z.b. MPX4250 mit AP Druckanschluss ||||| ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* NanoMuscle Aktuatoren ||||| ||||| ||&lt;br /&gt;
* Piezo Minimotoren/Linearaktoren von Elliptec/Siemens einzeln und günstig ||||| |||&lt;br /&gt;
* PIR Bewegungsmelder ||&lt;br /&gt;
* QT160 6-fach Touch Sensor IC ||||&lt;br /&gt;
* Sensirion SHT11/SHT71 (oder auch SHT15/SHT75) {{Reichelt50|FF0000}}||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||&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;
* Temperatur IC TC1047 |||&lt;br /&gt;
* Temperatursensor mit SPI-Interface LM74 ||||| |&lt;br /&gt;
&lt;br /&gt;
=== Funk und Signalsynthese ===&lt;br /&gt;
&lt;br /&gt;
* Clock generator IC&#039;s, z.&amp;amp;nbsp;B. PCK20?? von Philips |&lt;br /&gt;
* DDS-IC (Waveform-Generator) von Analog wie AD9833, AD9835 ||||| ||||| ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* EM4095 (RFID) |||&lt;br /&gt;
* LMX2306/LMX2316/LMX2326 PLL Synthesizer von National ||||| ||&lt;br /&gt;
* LTC5540 (RF-Mixer) |&lt;br /&gt;
* PLL Schaltkreise für Frequenzerzeugung. z.&amp;amp;nbsp;B. MC / ML145170 (SOIC16) / TSA5060A ||||| ||||| ||||| |||&lt;br /&gt;
* SI4735 Silicon Labs Radio ICs |||&lt;br /&gt;
* TEA5757 FM-Tuner IC von Philips |||&lt;br /&gt;
* TEA5768HL FM-Tuner IC von Philips |||||&lt;br /&gt;
* TPS79318 1,8V 200mA LDO in (bestens für z.&amp;amp;nbsp;B. LPC210x µC) |&lt;br /&gt;
&lt;br /&gt;
=== sonstige ===&lt;br /&gt;
&lt;br /&gt;
* 74HCxxxx komplette Serie |||&lt;br /&gt;
* 74VHC-Serie komplettieren (z.&amp;amp;nbsp;B. 74VHC125D) ||||| ||&lt;br /&gt;
* A3982 Motortreiber/Controller (1,5A, 2APeak, u.A. für RepRap&#039;s) |&lt;br /&gt;
* Automotiv ICs z.&amp;amp;nbsp;B. LM1815, LM1915, LM1949, LM9011, LM9040, LM9044, LMD18400... ||||| |&lt;br /&gt;
* Bosch CJ125 (Lambdasonden-IC) ||||| |||&lt;br /&gt;
* DS1616 von Dallas Datalogger-IC ||&lt;br /&gt;
* DTMF-Dekoder-Enkoder (8870, 8880) ||||| ||||| ||||| ||||| ||||| ||||&lt;br /&gt;
* HCT-Logik in SMD {{Reichelt50|FF0000}}||||| ||||| ||||| |||&lt;br /&gt;
* High Side Current Sense ICs wie MAX4172 ||||| |&lt;br /&gt;
* IRS2092 Class-D Audio Driver IC ||&lt;br /&gt;
* ISD 2560 -&amp;gt; SOIC Gehäuse (Sprachaufnahme IC) ||||| |&lt;br /&gt;
* ITS4141N o. BTS4141N Smart High-Side Power Switch (z.&amp;amp;nbsp;B. bestens für 24V geeignet!) ||&lt;br /&gt;
* Kleinere SMD-Bauformen (bes. bei ICs) ||||| ||||| ||||| |&lt;br /&gt;
* L6205 Motortreiber (2Kanal, 2,8A, DMOS)|||||&lt;br /&gt;
* L6206N Motortreiber (Wird für OpenDCC benötigt, und ist derzeit nur SEHR schlecht erhältlich) |&lt;br /&gt;
* LM3886 (68W Audioverstärker) ||||| |&lt;br /&gt;
* LMD18200 (H-Bridge) |&lt;br /&gt;
* LT-1117-CST-5 als Sot223 (adj und 3.3 gibts schon, 5 fehlt noch) |&lt;br /&gt;
* LTC 4411 ideale Diode 2,6 bis 5,5V max. 2,6A im SOT-23 Gehäuse&lt;br /&gt;
* LTZ1000ACH#PBF Linear Technology Präzisions-Referenz (Ersatz für LM399H) |||&lt;br /&gt;
* Maxim Switched Capacitor Tiefpass-Filter (z.&amp;amp;nbsp;B. MAX297, MAX7410) ||||| |&lt;br /&gt;
* mehr Familien von Logik-ICs, z.&amp;amp;nbsp;B. AC, ACT, LVC (in SMD) ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* mehr SMD Bauteile  {{Reichelt50|FF0000}} {{Reichelt50|00FF00}} ||||&lt;br /&gt;
* MIC6315 von Micrel (3,3/5V Reset Baustein mit manual Reset) ||&lt;br /&gt;
* Motortreiber TLE 4205 |||&lt;br /&gt;
* SDT06S60 Infineon SiC 600V 6A Silizium-Carbid Schottky-Diode (kein trr, daher keine Schaltverluste) ||||&lt;br /&gt;
* SMD Doppeldiode Schottky 12A 60V im TO252AA z.&amp;amp;nbsp;B. 12CWQ06FN von IOR ||||| ||||| ||||| ||&lt;br /&gt;
* TLV320AIC23B Audio-Codec ||&lt;br /&gt;
* TPIC6B595 (oder ähnliche 74xx595 high current (150 mA) shift register) ||||| |&lt;br /&gt;
* uC supervisor chips + watchdog z.&amp;amp;nbsp;B.: MAX6864 ist z.Z. der beste (0.2uA!) |||&lt;br /&gt;
* VN808 Low Treshold Octal High Side Driver 0,7A |&lt;br /&gt;
* VS1000 Ogg Decoder von VLSI |&lt;br /&gt;
* VS1053 MP3/AAC/WMA/Ogg Decoder von VLSI ||||| ||||| |&lt;br /&gt;
* Zarlink MT8841 Calling Number Identification Circuit |&lt;br /&gt;
* ZHB6718 (H-Bridge für 1,5V - 20V Motoren) ||||| ||||&lt;br /&gt;
* ZRA250F005 Referenzspanungsquelle 2,5V 0.5% SOT23 gehäuse ||||| ||||| |&lt;br /&gt;
&lt;br /&gt;
== Baugruppen ==&lt;br /&gt;
&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 ATSTK1000 von [http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3918 Atmel] ||||| ||||| ||||| ||||&lt;br /&gt;
* Axis Etrax 100LX MCM (Multi Chip Module) A full Linux computer on a single chip!  ||||| |||||&lt;br /&gt;
* Bluetooth Funkmodul {{Reichelt50|FF0000}}{{Reichelt50|00FF00}}||&lt;br /&gt;
* Bluetooth Mini-Module (RS232-Bluetooth-&amp;quot;Wandler&amp;quot;-Platinchen) z.&amp;amp;nbsp;B. BTM222 |||||&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;
* FPGA, low-cost Experimentierplatinen ||||| ||||| ||||| ||||| |||| &lt;br /&gt;
* Hope RF Module 433 u. 868 MHz, http://www.hoperf.com/pdf/RF12.pdf ||||| ||&lt;br /&gt;
* kostengünstige Funkempfänger/Funksender 433 &amp;amp; 868 Mhz ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* kostengünstige Funkschaltmodule (TLP/RLP) ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* Lantronix XPort Direct ||&lt;br /&gt;
* Lantronix XPort Embedded Device Server ([http://www.lantronix.com www.lantronix.com]) ||||| ||||| |&lt;br /&gt;
* Microchip PICkit 2 ||||| |||&lt;br /&gt;
* Microchip PICkit 2 (PG164120) ohne Demoplatine |&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;
* ST Primer 2 (Experimentierboard fuer ARM Einsteiger) ||&lt;br /&gt;
* STM STM3210C-EVAL für &amp;lt;=214,79€ netto (wie bei Future Elektronik, Stand 18.3.2011) |&lt;br /&gt;
* TI - MSP430 Wireless Development Tool (AEC13895U) |&lt;br /&gt;
* TI eZ430-Chronos |&lt;br /&gt;
* UM232 FTDI USB - RS232 Modul für DIL sockel |||&lt;br /&gt;
&lt;br /&gt;
== Passive Bauteile ==&lt;br /&gt;
&lt;br /&gt;
=== Spulen und Trafos ===&lt;br /&gt;
&lt;br /&gt;
* Die Micrometals Pulverkerne (-18 und -26) auch in größer ||||| |&lt;br /&gt;
* Fastron 0805 AS Serie vervollständigen |&lt;br /&gt;
* Funk-Entstördrosseln 16A, div. Werte ||||| ||||| ||||| |||&lt;br /&gt;
* Funk-Entstördrosseln 330µH / 3A |&lt;br /&gt;
* Funk-Entstördrosseln 47µF |||&lt;br /&gt;
* Magnetics CoolMu Ringkerne ||||| ||||| ||&lt;br /&gt;
* Magnetics MPP Ringkerne ||||| ||||| ||&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;
* Ringkertrafos &amp;gt;500VA mit höherer Spannung als 30V (Verstärkerbau) ||&lt;br /&gt;
* SEPIC-Speicherdrosseln von Würth WE-DD (Größe M u. L) ||||&lt;br /&gt;
* Übertrager für Schaltregler z.&amp;amp;nbsp;B. Epcos Typ  B78304 ||||| |||||&lt;br /&gt;
* Würth Induktivitäten ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* Würth Sortimentskästen Induktivitäten |||||&lt;br /&gt;
&lt;br /&gt;
=== Kondensatoren ===&lt;br /&gt;
&lt;br /&gt;
* Drehkondensatoren 20-500pf ||||| |&lt;br /&gt;
* Generell SMD-Kerkos im Wert &amp;gt; 100nF {{Reichelt50|FF0000}}||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||||&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;
* Kleine Niedervolt-Polyproplyenkondis mit mehr Kapazität ||||&lt;br /&gt;
* Low-ESR Elkos (definiertes Fabrikat/Typ, und nicht einfach irgendwelche! (Rubycon?)) {{Reichelt50|FF0000}}||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||&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;
* Sanyo OS-Con bedrahtet und SMD |||&lt;br /&gt;
* Wima FKP02 |&lt;br /&gt;
* Wima FKP2 |&lt;br /&gt;
* Wima MKP3-X2 (~275V, klein und ideal für Kondensatornetzteile) ||&lt;br /&gt;
* Wima MKP4 |||||&lt;br /&gt;
* Zum MAX232 so20 passende SMD-Kerkos im Wert 1uF (0805,0603, 1206) ||||| ||||| ||||| ||||| ||&lt;br /&gt;
&lt;br /&gt;
=== Widerstände und Potis ===&lt;br /&gt;
&lt;br /&gt;
* 25/50/100W Hochlast-Widerstände (~20/50 Ohm auch weniger) ||||| ||||| ||||| |||&lt;br /&gt;
* Digitalpoti AD5160 mit SPI in SOT23 |&lt;br /&gt;
* Digital-Potentiometer (z.&amp;amp;nbsp;B. 2-Wire MAX546x, AD526x, X9C10x) ||||| ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* Durchsteck-Widerstände in kleiner Bauform 0204. ||||| ||||| ||&lt;br /&gt;
* Endlospotis als Motorgeber |&lt;br /&gt;
* Erneut die 10k-Ohm SMD-Potis |||||&lt;br /&gt;
* Größere Auswahl an (Stereo-)Schiebepotis in log und lin, insbesondere jenseits 100K ||&lt;br /&gt;
* Hochlast NTC, z.&amp;amp;nbsp;B. 80-220 Ohm/1-4A (EPCOS, Ametherm) ||&lt;br /&gt;
* Hochspannuns-Widerstände (z.&amp;amp;nbsp;B. 330M/10kV) |&lt;br /&gt;
* iPod-Wheel z.B. QT511-ISSG  ||||| ||||| |||||&lt;br /&gt;
* Kleine Ein-Gang-Trimmer unterhalb 250 Ohm |&lt;br /&gt;
* Leitplastikpotis im Servogehäuse |&lt;br /&gt;
* Linear- und 360° Soft-Pots (iPod-Wheel) wie von spectrasymbol ||||| |||&lt;br /&gt;
* Niederohm-Widerstände (Shunts ab 1mOhm im guten Gehäuse z.&amp;amp;nbsp;B. TO220) ||||| ||||| ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* Null-Ohm Widerstände (Drahtbrücken) Baugröße wie 1/4W ||||| ||||| ||&lt;br /&gt;
* Präzisions-Spannungsteilernetzwerke ||||| |||||&lt;br /&gt;
* Präzisionsspannungsteiler 1:10, 1:100, 1:1000 (10MOhm Gesamtwiderstand) ||&lt;br /&gt;
* Präzisionswiderstände 0,05% und besser, ev. Drahtgewickelt ||||| ||||| ||||| |&lt;br /&gt;
* R2R-Widerstandsnetzwerke (z. B. 10/20kOhm für DA-Wandler an Microcontrollern) ||||| ||||| ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* SMD-Präzisionswiderstände (0,1% TC10ppm/K =&amp;gt;0,1W indukt.arm) ||||| ||||| ||||| |||&lt;br /&gt;
* SMD-Widerstände 0805 auch aus der E24-Reihe ||||| ||||| ||||| |||&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;
* statt Radiohm potis bitte Prehostat oder Alphastat 16 63256-026xx ||||| ||||| ||||&lt;br /&gt;
* Widerstände &amp;gt; 10MOhm (möglichst bis 100GOhm) ||&lt;br /&gt;
* Widerstandsnetzwerke 11-Pin (für 10er Bargraphanzeige) ||&lt;br /&gt;
&lt;br /&gt;
=== Quarze, Quarzoszillatoren und Resonatoren ===&lt;br /&gt;
&lt;br /&gt;
* 13,5600 MHz Quarz (benötigt für RFID) (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 (SMD-Grundtonquarz unter 24,0000-MA505 verfügbar) ||||| |||||&lt;br /&gt;
* 25,0000 MHz &#039;&#039;&#039;Grundton&#039;&#039;&#039;-Quarz, wird benötigt für Microchip TCP/IP Controller ENC28J60) (als Keramik-SMD-Quarz 25,000000-MJ verfügbar) {{Reichelt50|FF0000}}{{Reichelt50|00FF00}}||||| ||||| ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* Allgemein mehr Grundtonquarze bei höheren Frequenzen |||||&lt;br /&gt;
* Murata Keramik-Resonator CSTLS16M0X, CSTLS20M0X (obwohl 3. OW, direkt mit µC verwendbar)&lt;br /&gt;
* Quarze 6,500000 MHz (HF-Anwendung) ||&lt;br /&gt;
* Quarze 32 MHz 10ppm Oscillatorfrequenz 0 bis +70°C&lt;br /&gt;
* Quarz mit 3,200 MHz  ||&lt;br /&gt;
* Quarzoszillator 9,8304 MHz  ||&lt;br /&gt;
* SMD Quarze/ Oszillatoren in flachen, kleinen SMD Gehäusen (SMX-A/-B) ||||&lt;br /&gt;
* SMD-Quarze mit Standardgehäuse (z.&amp;amp;nbsp;B. HC49/US &amp;amp; HC49/UP) ||||| ||||&lt;br /&gt;
&lt;br /&gt;
=== Sonstiges ===&lt;br /&gt;
&lt;br /&gt;
* Lötfähige (SMD-) Kühlkörper (Fischer) ||||| ||||| ||||| ||&lt;br /&gt;
* Metallbrückengleichrichter für 50A ||||&lt;br /&gt;
* Netzfilter FFP Reihe Schurter ||&lt;br /&gt;
* Suppressordioden mit Spannungsbereich zwischen 15V und 30V |||&lt;br /&gt;
* Übertrager FB2022 oder 20F-001N (passend zu RTL8019AS)|&lt;br /&gt;
* Übertrager passend zu ENC28J60&lt;br /&gt;
* Varistoren 14V auch als bedrahtetes Bauteil (für KFZ-Bordnetz) ||||| ||||| |-&amp;gt; 1,5KE 18CA&lt;br /&gt;
&lt;br /&gt;
== HF-Baumaterialien ==&lt;br /&gt;
&lt;br /&gt;
* Durchführungskondensatoren 1nF/160V (waren Ende &#039;06 noch im Programm) ||||&lt;br /&gt;
* Filter SFE10.7MA19 360khz SZP2026 |&lt;br /&gt;
* H155 (HF-Kabel) |||||&lt;br /&gt;
* HF-Litze(n) |&lt;br /&gt;
* Keramik / Teflon Leiterplatinen |&lt;br /&gt;
* Keramische Filter CFM455... ganzes Sortiment |||||&lt;br /&gt;
* MC68160FB&lt;br /&gt;
* MC68EN302PV20&lt;br /&gt;
* MICRF002/022, MICRF102/103 von Micrel  ||||| |&lt;br /&gt;
* MMICs und Ringmischer von Mini-Circuits&lt;br /&gt;
* MT48LC4M32B2TG-7&lt;br /&gt;
* PLL ICs z.&amp;amp;nbsp;B. von NXP und National für HF-UHF ||&lt;br /&gt;
* S3C4510B&lt;br /&gt;
* Transistoren MRFG35010 |&lt;br /&gt;
* U.FL bzw. IPEX Steckbuchsen zum Selbstkonfektionieren von HF-Kabeln ||&lt;br /&gt;
* ZF-Quarzfilter für versch. Frequenzen (10, 20, 40 MHz) ||&lt;br /&gt;
* Zirkulatoren ALD4302SB statt LM239 &lt;br /&gt;
* µP Compatible CTCSS Encoder,Decoder FX 365&lt;br /&gt;
&lt;br /&gt;
== Optoelektronik und Leuchtmittel ==&lt;br /&gt;
&lt;br /&gt;
=== Einzel-LEDs ===&lt;br /&gt;
&lt;br /&gt;
* Acriche 230V~ LEDs&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;
* Everlight SMD-RGB (fullcolor) 19-337/R6GHBHC-A01/2T ||||&lt;br /&gt;
* Generell: Z-Power LEDs von Seoul (günstiger und heller als Luxeon) ||||| ||&lt;br /&gt;
* IR-Diode mit viel Power ttp://www.lc-led.com/Catalog/department/36/category/49/1 ||&lt;br /&gt;
* Kühlerplatinen für Power-LEDs im Star-Format oder vergleichbar |&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;
* Luxeon Rebel weiß (180 lm) auf Star-, Mini- oder normaler Platine ||&lt;br /&gt;
* OSRAM Hyper TOPLEDS gelb LY T676-S1T1-26 ||&lt;br /&gt;
* OSRAM Hyper TOPLEDS weiss LW T67C-T2U2-5K8L ||&lt;br /&gt;
* Reflektoren für 10mm LEDs ||&lt;br /&gt;
* Samsung SLS RGB W815 TS (PLCC6 RGB-LED)|&lt;br /&gt;
* Seoul Z-LED RGB auf Platine ||&lt;br /&gt;
* Seoul Zled P4 (100lm bei 350mA, 240lm bei 1A!) ||||| |||||&lt;br /&gt;
* SMD-IR-LEDs in 0603/0805/SOT23 + dazu passende IR-Fotodioden in gleicher Größe |&lt;br /&gt;
* SMD-LED Bauform 0402 rot/gelb/grün/blau/weiss  ||||| ||||| ||||| ||||| |&lt;br /&gt;
* Superflux RGB-LED |||&lt;br /&gt;
* warmweiße LED ||||| ||||| ||||| |||&lt;br /&gt;
* weiße SMD-LED Bauform 0603 ||||| ||||| |||||&lt;br /&gt;
&lt;br /&gt;
=== Anzeigen und Displays ===&lt;br /&gt;
&lt;br /&gt;
* 4-Stellige Dot-Matrix LED-Anzeigen Siemens SLG 2016 oder von HP oder ähnliches ||||| |&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, weiss, gem. Anode ||||| ||||| ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* 7-Segment-Anzeige, weiss, gem. Kathode ||||| ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* Generell alle 7-Segment-Anzeigen auch in Blau und bis zu 100mm Höhe ||&lt;br /&gt;
* Kingbright PSC Serie (16 Segment LED-Display, insbesondere PSC08 und PSC12) |&lt;br /&gt;
* LED Punktmatrix Anzeigen 8x8 superrot 3mm (z.&amp;amp;nbsp;B. Everlight ELM-1883SRWA) ||&lt;br /&gt;
* LED Punktmatrix bicolor 1.9mm (z.b. Betlux BL-M 07A881SG-XX )&lt;br /&gt;
* TFT/OLED Farb-Displays, wie die bereits abgekündigten OSRAM OLEDs |||&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;
&lt;br /&gt;
=== andere Leuchtmittel ===&lt;br /&gt;
&lt;br /&gt;
* OSRAM Halogen Decostar 51 12V 20W GU5,3 statt des billigen NoName Zeugs ||&lt;br /&gt;
&lt;br /&gt;
=== sonstige Optoelektronik ===&lt;br /&gt;
&lt;br /&gt;
* BPW 34 F / FS (aus dem Sortiment gefallen, PIN-Fotodiode) |&lt;br /&gt;
* IL207AT (SMD Optokoppler von Infineon) ||||| ||&lt;br /&gt;
* ILD256T (SMD AC-Optokoppler)  ||||| |||||&lt;br /&gt;
* ILD620 (DIP Optokoppler) ||||| ||||| ||||| |||||&lt;br /&gt;
* IrDA-Tranceiver TFDS4500 (oder TFDU4100) wieder anbieten - war im 07/2005er Katalog noch drin) ||||| ||||&lt;br /&gt;
* PC923 (Opto MosFET Gate Treiber auch für High Side) |&lt;br /&gt;
* SFH6106, SFH6206 4 Pin Optokoppler SMD ||||| |&lt;br /&gt;
* TLP 3617 Photo-Triac&lt;br /&gt;
* TLP113 (SMD Optokoppler) |||||&lt;br /&gt;
* TLP250 (Opto MosFET Gate Treiber auch für High Side)||||&lt;br /&gt;
* TORX 178 Fiberoptik-Receiver&lt;br /&gt;
* TOTX177PL und TORX177PL (Fiberoptik-Transmitter) als Ersatz für TOTX173 und TORX173 (zwar anderes Footprint, aber dafür auch kleiner und günstiger)&lt;br /&gt;
* TSOP 1140 Infrarot-Receiver  (oder andere 40 kHz IR-Empfänger) |&lt;br /&gt;
* TSOP 1730 Infrarot-Receiver [Achtung! TSOP17xx sind Auslaufmodelle bei Vishay] |&lt;br /&gt;
* TSOP98200 (Breitband IR-Empfangsmodul 20-455 KHz) |||&lt;br /&gt;
* TSOP98260 (Breitband IR-Empfangsmodul 20-60 kHz) ||||&lt;br /&gt;
* Vactrol Optokoppler (mit Fotowiderstand zur Analogsignalregelung) |||||&lt;br /&gt;
&lt;br /&gt;
== Mechanisches ==&lt;br /&gt;
&lt;br /&gt;
=== Schalter/Taster/Eingabegeräte, Relais ===&lt;br /&gt;
&lt;br /&gt;
* bistabile Relais mit 2 Wicklungen ||||| ||||| ||||| &lt;br /&gt;
* Drehimpulsgeber DDM Hopt+Schuler 427 SMD (evt auch normal, stehend &amp;amp; liegend) ||||| ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* Drehschalter Serie DS in allen Versionen nur vom Hersteller C&amp;amp;K; auch brückende Versionen anbieten  ||||| |||||&lt;br /&gt;
* Drucktastenfeld Matrix 3x4 ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* Folientastaturen {{Reichelt50|FF0000}}||||| ||||| ||||&lt;br /&gt;
* Grayhill Series 60A Joysticks mit USB-Adapter |&lt;br /&gt;
* Hohlwellen-Drehgeber (z.&amp;amp;nbsp;B. EC35B-Serie von Alps) ||&lt;br /&gt;
* kleiner Joystick wie beim Atmel Butterfly  ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* mehrpolige Fußschalter, FS 35 bitte bei Druckschalter einordnen ||||&lt;br /&gt;
* Miniaturkippschalter mit Verriegelung ||||&lt;br /&gt;
* möglichst kleine und flache Druckschalter rastend!  |||||&lt;br /&gt;
* passende Touchpanels für die coolen Blue-Line-Grafikdisplays ||||| ||||| |&lt;br /&gt;
* Relais mit hohen Wirkungsgrad (daher nur geringer Spulenstrom nötig) ||&lt;br /&gt;
* SMD-Schiebeschalter |||||&lt;br /&gt;
* Taster Radiohm ST-1034 in rot, grün, gelb, blau, grau und schwarz&lt;br /&gt;
* Taster und Kappen aus der Multimec-Reihe |||&lt;br /&gt;
* Taster, Schalter und LED-Fassungen aus der Mentor FEL-Reihe |||&lt;br /&gt;
* Tastköpfe für Taster9308, wie zb Omron B32-2000 oder B32-2010 |&lt;br /&gt;
* PhotoMOS Relay (z.&amp;amp;nbsp;B. AQV257 von Panasonic |&lt;br /&gt;
&lt;br /&gt;
=== (Steck-) Verbindungen PC- und Audiotechnik ===&lt;br /&gt;
&lt;br /&gt;
* 2.5mm Stereo Klinkenbuchsen (3-polig) SMD ||||&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;
* Floppy Stromversorgungstecker 3,5&amp;quot; Printausführung ||||| |&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;
* Hochwertigere 1/4&amp;quot; Klinkenbuchsen, z.&amp;amp;nbsp;B. von Rean oder Cliff |||||&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;
* Micro-USB Steckverbinder ||||| ||&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;
* MiniSD Card Connector mit Auswurffunktion für Oberflächenmontage  ||||| |&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 {{Reichelt50|FF0000}}||&lt;br /&gt;
* Modulare Buchse RJ45 ohne Übertrager mit LEDs (oder Lichtleiter für SMD-LEDs) ||||| ||&lt;br /&gt;
* Molex Steckerreihe Minifit Jr 4,2mm Rastermaß (verwendet als Stromstecker in Computern, Mainboard, PCI-E, P4/EPS ...) |&lt;br /&gt;
* Ordentliche Lautsprecherbuchsen &amp;quot;Strich-Punkt&amp;quot; (Print oder Wand) (die Stecker sind OK) |&lt;br /&gt;
* RJ45-Stecker 90° nach unten oder zur Seite gewinkelt ||&lt;br /&gt;
* SATA Strom-Stecker/ Buchsen für Kabel/ Printmontage |||&lt;br /&gt;
* USB3, e-SATA, eSATAp (Power e-SATA) Stecker in Printausführung (gerade und gewinkelt) ||||&lt;br /&gt;
* vernünftige Koax-Stecker und Kupplungen z. Bsp. von Hirschmann&lt;br /&gt;
* WOL-Verbindungskabel / Stecker / Print-Connectoren: ||||| |&lt;br /&gt;
&lt;br /&gt;
=== (Steck-) Verbindungen Platinen und ICs ===&lt;br /&gt;
* Buchsenleiste Fischer BL5  |&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;
* Carrier-IC-Sockel&lt;br /&gt;
* Die PSK-Kontakte in anderen Packungen als 20/10k.100Stk. wäre z.B. gut.1k auch. ||||| |&lt;br /&gt;
* Einpolige Steckerleiste 2.54 ||||| ||&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;
* mehrpolige, hochwertige Miniatursteckverbinder (z.&amp;amp;nbsp;B. http://www.binder-connector.de/pdfs/serien/711.pdf) |||&lt;br /&gt;
* Molex C-Grid SL einreihig 2 bis &amp;gt;6 polig: Stecker, Buchsen, Buchsen-SMD, Crimp-Werkzeug |&lt;br /&gt;
* Nullkraftsockel (TEXTOOL, ARIES, Yamaichi,..) für 6-Pin SOT23 (SOT23-6) |||||&lt;br /&gt;
* Nullkraftsockel (TEXTOOL, ARIES, Yamaichi,..) für DIL20 ||||| ||||&lt;br /&gt;
* Nullkraftsockel (TEXTOOL, ARIES, Yamaichi,..) für DIL28 |&lt;br /&gt;
* Nullkraftsockel (TEXTOOL, ARIES, Yamaichi,..) für PLCC-44 ||||| ||||| |||||&lt;br /&gt;
* Nullkraftsockel (TEXTOOL, ARIES, Yamaichi,..) für andere SO- oder TQFP-Gehäuse ||||| ||||| ||||| |||&lt;br /&gt;
* Platinensteckverbinder für Rastermass 2,00mm ||||&lt;br /&gt;
* Stapelleiste AMP 2–0827730–0, 20polig, A 24,2 mm |&lt;br /&gt;
* Stiftleisten im Rastermaß 1 mm (z.&amp;amp;nbsp;B.: Samtec FTMH-120-03-F-DV-ES) |&lt;br /&gt;
* Wannenstecker 2,54mm Raster auch als SMD ||||| ||||&lt;br /&gt;
* Wannenstecker 6-Pol. gewinkelt, gibt nur gerade (WSL 6W, aber derzeit nicht lieferbar) ||&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;
&lt;br /&gt;
=== (Steck-) Verbindungen sonstige ===&lt;br /&gt;
* Adapterprogramm SMA auf SMB ausbauen |&lt;br /&gt;
* BNC-Stecker (wie UG 88U, Lötmontage) aber für RG174-Kabel ||||| |&lt;br /&gt;
* Chipkartenkontaktiereinrichtung, die die Kontakte anhebt (keine Schleifkontakte) ||||| |||||&lt;br /&gt;
* E10-Schraubsockel, wie sie Glühbiren haben, mit Lötstiften (Achtung es ist nicht die Fassung gemeint) |||||&lt;br /&gt;
* Euro-Einbausteckdose (230V~, gab&#039;s früher mal) ||||| |&lt;br /&gt;
* Foliensteckverbinder (FFC) RM1,25 (z.&amp;amp;nbsp;B. 9pol, 11pol ...) |||||&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;
* Hohlstecker für Laptops 1,7 x 4,75mm gelb ||&lt;br /&gt;
* JST HR Steckverbinder |||&lt;br /&gt;
* Lüsterklemmen kleiner LÜK 2,5, also z.B. LÜK 1,5: ||&lt;br /&gt;
* Mini-Schraubklemmen Phoenix Contact MPT-Reihe RM2,54, z.B. MPT0,5/12-2,54 f. 12polig |&lt;br /&gt;
* OBD-Stecker. ||||&lt;br /&gt;
* Polklemmen Hirschmann PKNI 10B (max. 63A ^^), zumindest Schwarz und Weiß |&lt;br /&gt;
* preiswerte! Hochspannungssteckverbinder &amp;gt;2kV ||||&lt;br /&gt;
* RP-SMA-Buchse/-Stecker (gewinkelt/gerade) |||&lt;br /&gt;
* Schuko-Einbausteckdose (Maschinensteckdose) (mit oder ohne Klappdeckel); Flanschmaß möglichst klein (50mmx50mm); div. Farben (sw,grau,...) ||||| ||||| ||&lt;br /&gt;
* Steckverbinder für PICTIVA OLED Display Folienkabel |||||&lt;br /&gt;
* Triaxstecker /-buchse (Coax mit 2. Schirm als 3. Kontakt) ||&lt;br /&gt;
&lt;br /&gt;
=== Kabel, Drähte etc. ===&lt;br /&gt;
&lt;br /&gt;
* angebotene Schaltlitze (H05VK) um weitere Farben erweitern ||||&lt;br /&gt;
* das qualitativ mangelhafte 4mm Laborsteckerprogramm rausnehmen und nur noch Hirschmann anbieten  ||||| ||||| ||||| ||||| |&lt;br /&gt;
* dickere Mantel(Feuchtraum)leitungen, z.&amp;amp;nbsp;B. NYM J5x10 |&lt;br /&gt;
* Distanzbolzen mit 2 M2,5 Innengewinden vrsch. Längen ||&lt;br /&gt;
* dünner Schaltdraht (&amp;lt; 1mm Durchmesser, isoliert mit Tefzel oder Kynar)  {{Reichelt50|FF0000}}||||| ||||| ||||| ||||| ||||| ||||| ||||| |&lt;br /&gt;
* Flachbandkabel im 1,00mm Raster, passend für Pfostenverbinder PL 2X25G 2,00 . Wird für Notebookplatten benötigt. Ohne das ist die gesamte 2,0mm-Wannensteckerproduktgruppe sinnlos. ||||| ||&lt;br /&gt;
* Flachbandkabel im 1,27 mm Raster, 6-polig ||&lt;br /&gt;
* Flachbandkabel im 2,54mm Raster und dazu passende Aufpressstecker und -buchsen ||||| ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* Flexible Einzellitze, 0,5² in verschiedenen Farben ||||| ||||| ||||| ||||| ||||| ||||&lt;br /&gt;
* Folienflachkabel (FFC) RM 0,8 (z.&amp;amp;nbsp;B. 30pol., Länge 125mm) für 8&amp;quot; TFT-Monitor&lt;br /&gt;
* Folienflachkabel (FFC) RM1,25 (z.&amp;amp;nbsp;B. 9pol, 11pol ... /Länge 20cm) ||&lt;br /&gt;
* Heizdraht zB.: Kanthal A1  |||||&lt;br /&gt;
* hochwertige MicroUSB-Kabel (AK 676-AB rupft einem fast die Buchse aus dem Handy) |&lt;br /&gt;
* Kupferlackdraht auf Spulen statt lose (Artikelbild ist irreführend!) |||&lt;br /&gt;
* kurze (10cm, 30cm, 50cm) Kabel zB.: USB A-&amp;gt;B, A-&amp;gt;Bmini, A-&amp;gt;Bmicro; Klinke/Cinchkabel ||&lt;br /&gt;
* Litze, LiY 0,25mm^2, diverse Farben (beispielsweise von Lapp Kabel) |&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;
* LYIF Litze (verschiedene Farben) ||||| |&lt;br /&gt;
* RG214 |&lt;br /&gt;
* Schnepp &amp;quot;Laborkabel&amp;quot; Messleitungen |||||&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;
* Zwillingslitze 2x0.14mm, z.&amp;amp;nbsp;B.  Artikel: ZL214SWW-10M Kessler Elektronik ||||| ||||&lt;br /&gt;
&lt;br /&gt;
=== Gehäuse und Gehäusetechnik ===&lt;br /&gt;
&lt;br /&gt;
* Batteriehalter für 18650er Lithiumzellen (ähnlich dealextreme sku 100996/100997/100999) |||&lt;br /&gt;
* Batteriehalter für 4 Mignonzellen mit Lötfahne (statt Druckknopf)  ||&lt;br /&gt;
* Bopla ABP oder ABPH 800-100 (10cm) Aluprofil Gehäuse ||&lt;br /&gt;
* Distanzbolzen M2,5 (SW4) in verschiedenen Längen aus Messing ||&lt;br /&gt;
* Distanzhülsen/-bolzen M3 in verschiedenen Längen aus Kunststoff |&lt;br /&gt;
* mehr und v.a. kleine (Hand-) Gehäuse  {{Reichelt50|FF0000}}||||| ||||| |&lt;br /&gt;
* Muttern M2 |||&lt;br /&gt;
* Preiswertere Alu Druckgussgehäuse, wie z.&amp;amp;nbsp;B. von Hammond Manufacturing ||||| ||||| ||||| ||&lt;br /&gt;
* Stopmuttern M2 |&lt;br /&gt;
* Strangpreßprofilgehäuse von Fischer |&lt;br /&gt;
* USB-Leergehäuse (z.&amp;amp;nbsp;B. wie USB-Stick, WLAN-Dongle, o.ä.) ||||| ||||| ||||| ||||&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;
&lt;br /&gt;
== Prototypenbau, Platinen und Chemie ==&lt;br /&gt;
&lt;br /&gt;
* Adapter QSOP (versch. Pinzahlen) auf DIL/QIL ||||| ||||&lt;br /&gt;
* Adapter TQFP (versch. Pinzahlen) auf DIL/QIL ||||| ||||| ||||| ||||| |||||  ||||| ||||| |||&lt;br /&gt;
* Arbeitsschalen zum Entwickeln und Ätzen von Platinen(*)(ist im Starterkit enthalten) ||||| ||||| ||||| |||||&lt;br /&gt;
* Ballistol Universalöl ||||| ||||&lt;br /&gt;
* Bungard Green Coat |&lt;br /&gt;
* Bungard Sur-Tin |&lt;br /&gt;
* Bungard-Fotoplatinen auch in 80x100mm (halbes Euroformat), nicht nur 75x100mm ||||| ||||| ||||| |||&lt;br /&gt;
* Bungard-Fotoplatinen BLAU div. Formate ||||| ||||| ||||| ||&lt;br /&gt;
* Cadsoft Eagle ||||| |||||&lt;br /&gt;
* chemisches Zinnbad ||||| ||||| ||||| ||&lt;br /&gt;
* Entwickler NaOH-Frei von Bungard (SENO 4007 Universalentwickler) ||&lt;br /&gt;
* Fotoplatinen aus Hartpapier von Markenhersteller ||&lt;br /&gt;
* Fotoplatinen, zweiseitig, Hartpapier(!) |||||&lt;br /&gt;
* Hohlkehlenlötspitzen (Ersa 0832HD) ||||| |&lt;br /&gt;
* Hohlkehlenlötspitzen f. Weller MLR21 ||||| |||||&lt;br /&gt;
* Kapton-Baender, evtl auch mit Kupferbeschichtung (Flex-PCB) |||&lt;br /&gt;
* Lötstopplaminat ||||| ||||| ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* LPKF Durchkontaktierungspaste ||&lt;br /&gt;
* Messingblech/Kupferblech 0.1mm (wenn möglich Photobeschichtet) |||&lt;br /&gt;
* Natriumpersulfat 2 kg Packung |||||&lt;br /&gt;
* PCI-Express x1 Laborkarte (wie RE 430EP) |&lt;br /&gt;
* PIC_BASIC_II || Programm mit HardwareKey [z.&amp;amp;nbsp;B. für Azubi&#039;s]&lt;br /&gt;
* SMD Testplatine (3x3 Felder) wie bei Conrad ||&lt;br /&gt;
* SOIC auf PDIP Gehäuse-Adapter zwecks Prototypen-Bau ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* Spitzenhülsen WSP-/MPR 80 (Weller) |&lt;br /&gt;
* Steckplatinen (Breadboards) ohne Grundplatte und ohne Versorgungsleiste (wie Conrad 526827; STECKBOARD 1K2V hat beidseitig Leisten und ist daher nicht anreihbar / ist anreihbar, aber danach sind die beiden Leisten jeweils übrig) |&lt;br /&gt;
* Steckplatinenen (STECKBOARDS) im 84 x 54 Format (gibts bei Conrad ist da aber viel zu teuer) ||&lt;br /&gt;
* Target 3001 V15 Autorouter verschiedene Lizenzen |&lt;br /&gt;
* Tonerverdichter (www.Huber-Troisdorf.com) ||||| ||||| ||||| ||||| ||||| |||&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 (wo?)). Wie wäre es mit Reichelt? ||||| ||||| ||||| ||||| ||||| ||||| ||||&lt;br /&gt;
&lt;br /&gt;
== Werkzeug und Zubehör ==&lt;br /&gt;
&lt;br /&gt;
* einzelne Hartmetallbohrer in diversen Grössen (z.&amp;amp;nbsp;B. 0,8 1,0 1,3 1,5) {{Reichelt50|FF0000}}||||| ||||&lt;br /&gt;
* ESD-Erdungspunkte 4mm/10mm für Schuko, wie Vermason J6100 (alt) / 231125 (neu) |&lt;br /&gt;
* Gewindebohrer M2 und M2,5 ||||| ||||| |&lt;br /&gt;
* hochwertige 9mm Abbrechklingen |&lt;br /&gt;
* Konturenfräser/Gravurstichel, etc. zum Fräsen von Platinenprototypen (z.&amp;amp;nbsp;B. Bungard G60N/G30N) ||||| ||||| &lt;br /&gt;
* M2 Gewindebohrer und Senker |||&lt;br /&gt;
* robuste Allzweck- und Teppichmesser ||||| |||&lt;br /&gt;
* Sortimentskasten H1 und evtl. H2-Serie |&lt;br /&gt;
* Tri-Wing Schraubendreher |||&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;
&lt;br /&gt;
== Messgeräte, Diagnose und Stromversorgung ==&lt;br /&gt;
&lt;br /&gt;
* FS300 Messgerät Antennenanalyzer Massenpreis 50000 Stück |&lt;br /&gt;
* Günstigere Oszilloskope z.&amp;amp;nbsp;B. Multimetrix oder Grundig ||||| ||||| |&lt;br /&gt;
* LiPoly-Zellen (aufladbare Lithiumakkus &amp;quot;Suppentüten&amp;quot;) ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* Neuere, bessere NiMH-Akkus (z.b. GP1100 2/3A, GP2000 AF, GP2200 4/5SubC) ||||| ||||| ||&lt;br /&gt;
* OBD2 Kabel auf RJ45 Stecker ||||&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;
* Tektronix TDS Series Osziloskope |||&lt;br /&gt;
* Vorschaltgeräte mit G23 Fassung (zum Bau von UV-Belichtern geeigent)|||&lt;br /&gt;
&lt;br /&gt;
== Auswahl, Bestellung und Versand ==&lt;br /&gt;
&lt;br /&gt;
* bei über 10kg Gewicht nicht gleich die Versandkosten verdoppeln, sondern geringerer oder keinen Aufschlag ||&lt;br /&gt;
* der Reichelt Katalog auf CD/DVD (durch pdf-download überflüssig:) |||||&lt;br /&gt;
* Filialen in Österreich  und der Schweiz :-) {{Reichelt50|FF0000}}||||| (man beachte das &amp;quot;:-)&amp;quot;, es gibt auch in D keine &amp;quot;Filialen&amp;quot; - mt)|&lt;br /&gt;
* Günstige Versandkonditionen für die EU ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||&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;
* Kein Mindestbestellwert (ich bezahle eh&#039; Porto) ||||| ||||| ||||| ||||&lt;br /&gt;
* Kundenkarte so wie bei ELV (Grundgebühr für ein Jahr, keine Versandkosten, evtl kleiner Rabatt) {{Reichelt50|FF0000}}{{Reichelt50|00FF00}}||||&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;
* Möglichkeit für Selbstabholen eine Bestellung unter 10 Euro abzuliefern.  |&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) {{Reichelt50|FF0000}}||&lt;br /&gt;
* nicht wie die Konkurrenz jetzt schon im April den Juli-Katalog rausbringen ||||| ||||| ||||| ||&lt;br /&gt;
* Parametrische Suche aller Elektronikartikel, speziell erstmal Halbleiter, so wie bei Maxim-ic.com ||&lt;br /&gt;
* Reichelt Katalog als PDF zum Download (siehe [[Reichelt PDF Katalog]] ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |&lt;br /&gt;
* Reichelt-Gutscheine sollten bei Online-Bestellung einlösbar sein (wie bei z.&amp;amp;nbsp;B. Amazon) ||||| ||||| |&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;
* Skalierbarer Warenkorb für mehrfachen Aufbau gleicher Platinen |&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;
* Versand von Kleinteilen als Maxibrief, zwecks niedrigerem Versand {{Reichelt50|FF0000}}||||| ||||| |||||&lt;br /&gt;
* Warenkorb immer in gleicher Reihenfolge sortiert, nicht bei jedem Aufruf anders ||||| ||||| |||&lt;br /&gt;
&lt;br /&gt;
== Unsortiert/Unspezifisch ==&lt;br /&gt;
&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;
* 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;
* 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;
* Beamer Casio YC-400 |&lt;br /&gt;
* PCMCIA Wlan-Karten (Linux kompatibel) mit externem Antennenanschluss |&lt;br /&gt;
* Reichelt T-Shirt ||||| |||||&lt;br /&gt;
* Röhrensortiment mit den wichtigsten Typen wie z.B. EL34; KT88 einführen + Sockel ||&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 53x gewünscht  (=&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) 57x gewünscht =&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; 115x gewünscht =&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 50x gewünscht ==&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 60x gewünscht (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;) 96x gewünscht (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) 173x gewünscht&lt;br /&gt;
** Drehimpulsgeber- weiterer Vorschlag: ALPS Encoder ST EC 11B  64x gewünscht 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  115x gewünscht&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 337x gewünscht (erhältlich: RTL 8019AS)&lt;br /&gt;
* SPI-Ethernet-Controller ENC28J60 (erhältlich: ENC 28J60-I/*)&lt;br /&gt;
* Microchip PIC 18F4550 (PIC mit USB) ||||| ||||| ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* Microchip PIC 18F2585 ||||&lt;br /&gt;
* gleicher Mindestbestellwert in Österreich und in der Schweiz wie in Deutschland &#039;&#039;&#039; Seit 1.12.10 umgesetzt&#039;&#039;&#039; ||&lt;br /&gt;
* gleicher Mindestbestellwert in den Niederlanden wie in Deutschland | (mittlerweile überall 10€)&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) ||||| ||||| ||||| ||||| ||||| ||||| ||| &#039;&#039;&#039;Anm.: Versand nach AT inzwischen ab 9,90&#039;&#039;&#039;&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;
* Digitale Speicherosziloskope für PC ||||| ||||| || (Picoscope, PC-Oszilloskop)&lt;br /&gt;
* Hameg HM2008 Oziloscope || ( ist möglich über Service -&amp;gt; Produktservice -&amp;gt; neue Artikel anfragen)&lt;br /&gt;
* Microchip dsPIC30F ||||| ||||| |||&lt;br /&gt;
* Microchip PIC 16F883 und 16F886 |||&lt;br /&gt;
* Microchip PIC 18F4523 (12/2007: PIC mit 12-Bit A/D-Wandler) ||&lt;br /&gt;
* Microchip PIC 18F6585 |&lt;br /&gt;
* Microchip PIC 18F6720 |&lt;br /&gt;
* Microchip PIC 18F8720 |&lt;br /&gt;
* Microchip PIC 24FJ64GB002-I/SP (USB-OTG im DIP28 Gehäuse) |&lt;br /&gt;
* Atmel XMega-Typen, z.B. ATXMega64A4, ATXMega128A1 ||||| ||&lt;br /&gt;
* 7-Segment-Anzeige, blau, gem. Kathode ||||| ||||| ||||| ||||| ||||| ||||| || (SC 52-11 BL)&lt;br /&gt;
* 7-Segment-Anzeige, blau, gem. Anode ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||| (SA 52-11 BL, SA 56-11 BL)&lt;br /&gt;
* EA DOG-L128 128x64 Grafikdisplay zzgl Touch-Folie und Beleuchtung | --&amp;gt; ist ab Katalog 06/2009 drinn&lt;br /&gt;
* LTC 1661 N8 10 Bit Dual Dac mit SPI Interface | (LT C1661 CMS8)&lt;br /&gt;
* Microchip PIC 10F2xx (+ Programmiergerät) ||||| ||||| ||||| ||| (einige Varianten erhältlich, Programmiergerät nicht sicher)&lt;br /&gt;
* Microchip PIC 24 ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* Microchip PIC32 (MIPS) ||||| ||||| ||||| |||&lt;br /&gt;
* Microchip dsPIC33 ||||| ||||| ||||&lt;br /&gt;
* WAGO 215-4mm-Stecker (Bananenstecker mit Käfigzugklemme) zur schnellen Montage bei Versuchsaufbauten ||||| ||||| ||||| ||||| ||| (dieser Wunsch wurde erhört, Hurraa! Best.-Nr. Wago 215-x11, Vielen Dank an Reichelt.)&lt;br /&gt;
* Philips PCA9555 (I2C IO, 16 Bit par. I/O, c&#039;t Project Soundcheck II) |||||&lt;br /&gt;
* ADuM 1201 o. ADuM1401, bzw. andere ADuMxxxx oder ISOxxxx - Digitale Übertrager mit galvanischer Trennung |||&lt;br /&gt;
* LM2675 SimpleSwitcher Step-Down-Konverter in SO-8 Bauform&lt;br /&gt;
* Sharp Entfernungssensoren (zb den GP2D120 oder den GP2D12) 51x gewünscht---- siehe Reichelt Artikel : GP2-0430 und GP2-1080&lt;br /&gt;
* TSOP31238 (Besserer Ersatz (2,5-5,5V) für den nicht mehr Lieferbaren TSOP1738) || --- Artikel-Nr. &amp;quot;TSOP 31238&amp;quot;&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 |||| --- sind nach einer freundlichen Mail in den Katalog aufgenommen worden. Artikel-Nr. &amp;quot;SPITZE 842&amp;quot;&lt;br /&gt;
* Atmel ATSTK600 von [http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4254 Atmel] |||| (AVR STK 600)&lt;br /&gt;
* Atmel AVR Dragon von [http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3891 Atmel] ||||| ||||| ||||| ||||| ||| (AT AVR DRAGON)&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!!) ||||| ||||| ||||| || (oder klare Anzeige wie viel noch vorhanden ist)&lt;br /&gt;
* AVR mit USB: AT90USB1287 (AT 90USB1287 TQ, TQFP64), dazu passendes Demoboard AT 90USB KEY; AT90USB162TQ (AT 90USB162 TQ, TQFP32), AT90USB646 (AT 90USB646 TQ, TQFP64), AT90USB1286QFN (AT 90USB1286 QFN, QFN64), ATmega32u2 (ATMEGA 32-U2 TQ, TQFP44)&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) (SPL 64?) {{Reichelt50|FF0000}}||||| ||||| ||||| ||||| ||||| ||||| ||||| | &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;
* 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;
::Sehr clever. Das würde es Reichelt bestimmt enorm erleichtern, stark nachgefragte Artikel schnell zu erkennen. *facepalm* ;-)&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;
07.10.2011: Reichelt über Facebook drauf aufmerksam gemacht - man schaue sich die Liste regelmäßig durch :)&lt;br /&gt;
&lt;br /&gt;
01.10.2011: Umfangreiche Neuordnung der gesamten Wishlist: Neue Unterkategorien, alphabetische Sortierung, Zusammenführung gleicher Wünsche aus verschiedenen Kategorien, Fix diverse Falsch-Einsortierungen, Update inzwischen erhältlicher Teile, Ausbau einzelner Einträge für bessere Sortierung und mehr Info beim Lesen (nicht nur IC-Namen), etc. Vielleicht hat ja noch jemand nen Einfall für die Sichtbarmachung besonders nachgefragter Einträge, Fett- und Kursivdruck der &#039;&#039;&#039;&#039;&#039;|||||&#039;&#039;&#039;&#039;&#039;-Blöcke funktioniert ja leider nicht... &lt;br /&gt;
&lt;br /&gt;
...bei Ausrufezeichen funktionierts aber. Meinungen zur Farbe und der Auslagerung in eine Vorlage?--[[Benutzer:Bzzz|Bzzz]] 14:49, 1. Okt. 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
03.03.2011: E-Mail wurde an Reichelt-Verwaltung geschrieben.&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;br /&gt;
[[Kategorie:Lieferanten]]&lt;/div&gt;</summary>
		<author><name>129.247.247.240</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Reichelt-Wishlist&amp;diff=61549</id>
		<title>Reichelt-Wishlist</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Reichelt-Wishlist&amp;diff=61549"/>
		<updated>2011-11-09T14:17:53Z</updated>

		<summary type="html">&lt;p&gt;129.247.247.240: /* Sensoren und Aktoren */&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äßig 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. Blöcke von 50 Strichen werden regelmäßig gegen eingefärbte Kolonnen von Ausrufezeichen ausgetauscht, die den Reichelt-Mitarbeitern hoffentlich umso mehr auffallen ;)&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 und CPLD ===&lt;br /&gt;
&lt;br /&gt;
* Ajile aj-100 (Java Real-Time Prozessor) ||||&lt;br /&gt;
* ALTERA CPLD EPM30xx - Familie ||&lt;br /&gt;
* ALTERA CPLD EPM70xx - Familie ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* ALTERA Cyclone2 - Familie ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* ALTERA Cyclone3 - Familie ||||| |&lt;br /&gt;
* ALTERA Flex10K - Familie ||||&lt;br /&gt;
* ALTERA MAX-II (CPLDs) ||||| ||||| ||||| |&lt;br /&gt;
* Arm: Cortex M3 Nachfolger für die LPC2x&lt;br /&gt;
* Atmel AT89LP4052 PDIP ||||| ||||| ||||&lt;br /&gt;
* Atmel AT89S2051/4051 |||||&lt;br /&gt;
* Atmel AT90PWM3B (µC für Servosteuerungen und z.b. Motorsteuerungen) ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* Atmel ATA6612/13 (LIN-Bus SoC) ||&lt;br /&gt;
* Atmel Atmega 168PA, 88PA, etc. ||||| ||||&lt;br /&gt;
* Atmel Atmega 16A und 32A in TQFP und PDIP ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* Atmel Atmega 16L und 32L in TQFP (waere ATMEGA 16/32L8 TQ) ||||| |&lt;br /&gt;
* Atmel ATmega16M1 in TQFP |&lt;br /&gt;
* Atmel ATmega324P in TQFP und PDIP ||||| ||||| ||||| |&lt;br /&gt;
* Atmel ATmega324PV in TQFP und PDIP ||&lt;br /&gt;
* Atmel ATmega328P in TQFP und PDIP ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* Atmel ATmega48P in TQFP und PDIP ||||&lt;br /&gt;
* Atmel ATmega644p(a) / ATmega1284p(a) in TQFP und PDIP ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||&lt;br /&gt;
* Atmel ATtiny2313V in SO und PDIP |||||&lt;br /&gt;
* Atmel ATtiny261 (auch 461 und 861; bevorzugt DIP) ||||| ||||| ||||| |&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. {{Reichelt50|FF0000}}{{Reichelt50|00FF00}}||||| ||||| ||||| ||||| ||||&lt;br /&gt;
* Atmel AVR mit USB: AT90USB82 und ATmega32u4 ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |&lt;br /&gt;
* Atmel AVR32 im TQFP ||||| ||||| ||||| ||||| |&lt;br /&gt;
* Atmel Cortex M3 SAM3S im QFN/LQFP Gehäuse |&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;
* Bessere Auswahl: statt MSP430F147, F148, F149 wenigstens einen mit DAC -&amp;gt; MSP430F16x&lt;br /&gt;
* CY7C68013A-56PVXC (Cypress EZ-USB FX2LP) ||||| ||&lt;br /&gt;
* Cypress PSoC Mikrocontroller ||||| ||||| ||||| ||&lt;br /&gt;
* Freescale DSP56F801 ||||&lt;br /&gt;
* Freescale HCS12 Controller ||||| ||||| ||||| ||||| ||||&lt;br /&gt;
* Freescale MC9S08QD4 ||&lt;br /&gt;
* Freescale MC9S08QEx |&lt;br /&gt;
* Freescale MC9S08QG8 (DIP 16) ||||| ||||| ||||| ||&lt;br /&gt;
* Freescale Prozessoren (Coldfire) (16 + 32 Bit) ||||| ||&lt;br /&gt;
* Infineon XC866 ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* Lattice GAL 26V12 |&lt;br /&gt;
* Lattice ispMACH 4032C / 4064C / 4128C ||||&lt;br /&gt;
* Luminarymicro Stellaris Serie (Cortex-M3) ||||| ||&lt;br /&gt;
* Maxim/Dallas DS89C450 |&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)) {{Reichelt50|FF0000}}{{Reichelt50|00FF00}}{{Reichelt50|0000FF}}{{Reichelt50|00FFFF}}||||| ||||| ||||| ||||| |&lt;br /&gt;
* Microchip dsPIC33FJ128GP802 ||||&lt;br /&gt;
* Microchip PIC12F1822 |&lt;br /&gt;
* NXP LPC1114 |&lt;br /&gt;
* NXP LPC1313 |&lt;br /&gt;
* NXP LPC1343 |&lt;br /&gt;
* NXP LPC1751 |&lt;br /&gt;
* NXP LPC1754 |&lt;br /&gt;
* NXP LPC214x-Serie ARM7-Controller ||||| ||||| ||||&lt;br /&gt;
* NXP LPC23xx/24xx ||||| ||&lt;br /&gt;
* NXP SAA5281 Videotextinterface ||||| ||||&lt;br /&gt;
* Parallax Propeller CPU, 8 Cogs - DIP 40 ||||| ||||| ||||| ||||| ||||| ||||| ||||| |&lt;br /&gt;
* PICAXE von Revolution Education Ltd |&lt;br /&gt;
* Renesas M16C ||||| ||||&lt;br /&gt;
* Silabs C8051F320 USB Mikrocontroller ||&lt;br /&gt;
* Silabs Si4735 im SSOP-Gehäuse (AM/FM-Empfänger) |||&lt;br /&gt;
* SSV DIL/NetPCs [http://www.dilnetpc.com]http://www.dilnetpc.com ||||| ||||| ||||&lt;br /&gt;
* ST ST7MC... (µC für Servosteuerungen, und vor allem Brushless-Motoren) ||||| ||||&lt;br /&gt;
* ST STM32 Serie (Cortex-M3) {{Reichelt50|FF0000}}|&lt;br /&gt;
* ST STR7 Serie (ARM7TDMI) ||&lt;br /&gt;
* TI MSP430F167, TI MSP430F168 ||||&lt;br /&gt;
* TI MSP430F2001/2/3 etc. im RSA-Gehäuse (=QFN) ||||| ||&lt;br /&gt;
* TI MSP430F2618 |||&lt;br /&gt;
* TI MSP430FG4618 |&lt;br /&gt;
* TI TMS470 Arm7 ||||| ||||| ||||| ||||| |&lt;br /&gt;
* TI TUSB3210 ||||| ||&lt;br /&gt;
* Ubicom SX20 SX28 IP2022 ||&lt;br /&gt;
* Western Design Center 65c816 |||&lt;br /&gt;
* XC3S 400 TQ144 |||&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;
* 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;
&lt;br /&gt;
=== Speicher ===&lt;br /&gt;
&lt;br /&gt;
* 24LC256 oder 24AA256 oder 24LC512 oder 24AA512 ||||| |||||&lt;br /&gt;
* 3.3V async SRAM ab 16KByte ||||| ||&lt;br /&gt;
* 3.3V DRAM ||||| |&lt;br /&gt;
* Atmel DataFlash, z.&amp;amp;nbsp;B. AT45DB081B (8 MBit Flash-Speicher an seriellen Bus im 8poligen Gehäuse) {{Reichelt50|FF0000}}{{Reichelt50|00FF00}}|||&lt;br /&gt;
* EEPROM mit SPI Schnittstelle 25XX Serien ||||| ||||&lt;br /&gt;
* F-RAM mit SPI von RAMTRON ||||| |||&lt;br /&gt;
* FM25L16 o. FM25L256 SPI-FRAM |&lt;br /&gt;
* FPGA Konfigurations-EEPROMS AT17LV256, AT17C65/128/256.../XCF04S/... ||||| ||||| ||||| |||&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;
* Schnelles statisches RAM 128kB (10, 12, 15 oder 20ns, z.&amp;amp;nbsp;B. Samsung K6R1008C1D-UI10 oder CY7C1019D-10ZSXI) (5V/3,3V) {{Reichelt50|FF0000}}||||| ||||| ||&lt;br /&gt;
* Serielle SRAMs (Microchip 23K256) |&lt;br /&gt;
&lt;br /&gt;
=== Einzeltransistoren, Op-Amps, MOSFET-Treiber ===&lt;br /&gt;
&lt;br /&gt;
* OPA134, OPA2134, OPA4134 low noise audio OpAmps |&lt;br /&gt;
* 2SC1971 Transistor mit hoher Frequenz und viel Leistung für Endstufen ||&lt;br /&gt;
* AD623 Single Supply,Rail-Rail, InstrOpamp ||||| |&lt;br /&gt;
* AD628 InstrOpAmp, high voltage inputs |&lt;br /&gt;
* AD8601 Rail to Rail Opamp |&lt;br /&gt;
* BSH205 P-Channel 1.5V(GS), 0.75A, 12V D-S ||&lt;br /&gt;
* BUF420AW Schaltnetzteil Transistor von STM |||||&lt;br /&gt;
* Digitaltransistoren (BCR*), auch als Pärchen NPN/PNP (BCR10, BCR08pn) ||||| ||||&lt;br /&gt;
* IPS5451S intelligenter Leistungsschalter 50 V, 35 A, 25 mΩ |&lt;br /&gt;
* IPW60R045CS Infineon Mosfet 600V 45mOhm Rdson 30ns tr+tf (niedrigster Rdson in der Klasse) |&lt;br /&gt;
* IR2011 MOSFET Treiber |||&lt;br /&gt;
* IR21844 DIL (High-Speed IGBT-Driver) |||&lt;br /&gt;
* IR3313 o.ä. Intelligenter Leistungsschalter 32V/90A, einstellbare Strombegrenzung |||&lt;br /&gt;
* IRC540 (HEXFET) |&lt;br /&gt;
* IRF7503/IRF7506 Dual Mosfet SMD ||||| |||||&lt;br /&gt;
* IRFI4212H-117P Doppel-Mosfet (f. Klasse D-Verstärker) |&lt;br /&gt;
* J-FET BF545 A,B,C (entspricht BF245 in SMD ) |&lt;br /&gt;
* Leistungs-OP LM675 von National ||&lt;br /&gt;
* LM397, LM321 o.ä. single op-amp in SOT23-5 5-30V supply {{Reichelt50|FF0000}}||||| ||||| ||||| ||||| ||||| ||||&lt;br /&gt;
* MAX4420 Mosfet Driver ||&lt;br /&gt;
* MAX4429 Mosfet Driver ||&lt;br /&gt;
* MC 34152 D-SMD SO8 Dual Mosfet Driver |&lt;br /&gt;
* Mehr FET-Treiber (TI UCC3372x, HIPxxx , die neueren Brückentreiber von Maxim ||||| |||&lt;br /&gt;
* mehr FETs und IGBTs (nichtnur IRF, sehr gut IXYS &amp;lt;- und sauteuer!) ||||| ||||&lt;br /&gt;
* MJD31C NPN Transistor SMD DPAK 3&lt;br /&gt;
* Niederohm-FETs in SO8, N und P ||||| ||||| ||&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;
* Schnellere und gleichzeitig günstige OpAmps; Beispiel AD8055 ||&lt;br /&gt;
* Si4562DY N- and P-Channel 2.5-V (G-S) MOSFET SMD ||||| ||||| ||&lt;br /&gt;
* SPP20N60C3 Infineon Mosfet 600V 190mOhm Rdson &amp;lt;10ns tr+tf (Schnellste Schaltzeit in der Klasse) ||||| |&lt;br /&gt;
* TLC2264 (Quad Rail-To-Rail Operational Amplifier) ||&lt;br /&gt;
* TLV2782 (1,8V Rail-to-Rail OP) &#039;&#039;&#039;unklar: War &amp;quot;TLV27(2&amp;quot;&#039;&#039;&#039; |||||&lt;br /&gt;
* TLC3702 Komparator |&lt;br /&gt;
* TLV2382ID Rail-Rail-OP von TI |&lt;br /&gt;
* Sehr schnelle Op-Amps wie LMH6733 o.a in single und trible |&lt;br /&gt;
&lt;br /&gt;
=== Schaltregler (Buck, Boost, DC/DC,...) ===&lt;br /&gt;
&lt;br /&gt;
* 5,2V Lowdrop Längsregler LF52 im TO252AA von STM |||||&lt;br /&gt;
* generell Spannungsregler, LOW-DROP, SMD (DPAK, D2PAK) &lt;br /&gt;
* Größere Auswahl an Step-up Reglern ||||| ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* L4941 Spannungsregler 5V/1A in SMD-Ausführung (DPAK) ||||| |||||&lt;br /&gt;
* L5970 o. L5972 1 bzw. 2A, 250kHz Schaltregler im SO8 |&lt;br /&gt;
* L5973D 2,5A, 250kHz, Schaltregler im SO8 (ca. 1€) |||||&lt;br /&gt;
* LF50ABDT Spannungsregler SMD DPAK 5.0V very low drop |&lt;br /&gt;
* LM1084-ADJ (low dropout voltage positive regulator) |&lt;br /&gt;
* LM1117 (low dropout voltage regulator) - 1,8V ||&lt;br /&gt;
* LM1117MPX-1.8 und LM1117MPX-3.3 (SMD-Spannungsregler SOT-223) ||||| ||||| |||||&lt;br /&gt;
* LM2734 Schaltregler |||&lt;br /&gt;
* LM317EMP oder LM317AEMP SMD-Spannungsregler einstellbar (SMD TO-223 Gehäuse) ||||| ||||| ||||&lt;br /&gt;
* Maxim MAX629, MAX1795, MAX1703 (Aufwärtsregler / Step-Up-Konverter) ||||| ||||| |||||&lt;br /&gt;
* MAX 8865 Dual, Low-Dropout, 100mA Linear Regulator |&lt;br /&gt;
* MC78LCxx Serie - Ultra Low Drop Spannungsregler 3-5 Volt mit 1 Mikro-Ampere Ruhestrom ||||| ||&lt;br /&gt;
* MIC29300/29301 Spannungsregler 5,0V 3A im TO263(SMD) Gehäuse ||&lt;br /&gt;
* NCP3063: 1.5 A, BUCK _&amp;amp;_ BOOST Inverting Switching Regulator DIP8/SOIC8 (MC34063 upgrade) (0,32$) |&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;
* 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;
* 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;
* R-785.0-1.0 Schaltregler, Ausgang 5,0V, 1A |||&lt;br /&gt;
* Spannungsregler SMD in DPAK ||||| ||||| ||||| ||||| ||||&lt;br /&gt;
* ST1S10 günstiger &amp;quot;Monolithic synchronous step-down regulator&amp;quot; bis zu 3A Ausgang | &lt;br /&gt;
* TI TPS61070 3.3V-75mA-aus-einer-NiMH-Zelle (+ passende SMD-Induktivität) |&lt;br /&gt;
* ViPER Schaltregler von ST |&lt;br /&gt;
&lt;br /&gt;
=== Konstantstromquellen (LED, Akkus) ===&lt;br /&gt;
&lt;br /&gt;
* CCS-Akkulade-IC (z.&amp;amp;nbsp;B. CCS9620SL) (siehe [[http://bticcs.com/]]) |||||&lt;br /&gt;
* HV9910 Schaltregler für die Hochleistungs-LEDs Ub=8-450V; I beliebig; Eff. besser 90% ||||| ||||| ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* LM340x High Power LED-Treiber von National ||||&lt;br /&gt;
* LTC3490 (350mA-Konstantstromquelle) ||||| |||||&lt;br /&gt;
* Max1555 - LiPo Lade IC |||&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;
* PCA9685 16Kanal 12Bit PWM LED Controller ||||| ||&lt;br /&gt;
* STP08CL596B1 DIP16 STM, LOW VOLTAGE 8-BIT CONSTANT CURRENT LED SINK DRIVER ||&lt;br /&gt;
* STP08CL596M SO16 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;
* STP16CL596M SO24 STM, LOW VOLTAGE 8-BIT CONSTANT CURRENT LED SINK DRIVER |||&lt;br /&gt;
* TLC5940 16 Kanal PWM LED-Treiber ||&lt;br /&gt;
* UDN 2987 LW (Source Driver UDN2987 in SMD-Bauform) ||&lt;br /&gt;
&lt;br /&gt;
=== Ethernet, I²C (2Wire), SPI und andere Interfaces ===&lt;br /&gt;
&lt;br /&gt;
* CLC020 und CLC021 (National Semiconductor) Parallel Component nach SDI-Converter |||||&lt;br /&gt;
* CP2120 single-chip SPI to I2C bridge and GPIO port expander |&lt;br /&gt;
* CS8900A Ethernet-Controller ||||| |||&lt;br /&gt;
* CY7C67300 (Cypress) dual role USB controller mit OTG ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* DP83848C (Ethernet Physical Layer Transceiver/PHY, MII/RMII-Schnittstelle, passend zu AT91SAM7X) |||&lt;br /&gt;
* Ethernet Magnetics (Auch POE) ||||| ||||&lt;br /&gt;
* Fast Ethernet-Controller (DE9000A/B/E, AX88796B, ...) |&lt;br /&gt;
* FTDI High Speed Chips, z.&amp;amp;nbsp;B. FT2232H (USB - UART/FIFO IC)||||| |&lt;br /&gt;
* Generell mehr 1-Wire-ICs ||||| ||||| ||||| ||||| ||||| ||||| ||||| |&lt;br /&gt;
* Generell mehr I²C-ICs {{Reichelt50|FF0000}}||||| |&lt;br /&gt;
* Generell mehr SPI IC ||||| ||||| ||||| |||||&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;
* ISD 5116 (Sprachaufnahme bis 16min &amp;amp; I2C-Interface) ||||| ||||| ||||| |&lt;br /&gt;
* LTC1694-1 (I2C/SMBus Accelerator) ||||| |&lt;br /&gt;
* MAX6650 I²C-Lüftermonitor ||&lt;br /&gt;
* MAX6958 / MAX6959 (I²C 4-Digit, 9-Segment LED Display Drivers with Keyscan) ||||| ||||| ||&lt;br /&gt;
* MAX7311AWG 2Wire Interface von Maxim ||||&lt;br /&gt;
* MCP23008 8Bit I2C I/O Expander ||&lt;br /&gt;
* MCP23016 16Bit I²C I/O Expander ||||| ||||| ||| (verfügbar)&lt;br /&gt;
* MCP23S08 8BIT SPI I/O Expander |&lt;br /&gt;
* MCP23S17 16Bit SPI I/O Expander (aber ohne Schmidt-triggerd Eingänge wie der 23x16) |&lt;br /&gt;
* P82B86 (I2C Dual Bi-Directional Bus Buffer) ||&lt;br /&gt;
* Philips PCA82C252 oder TJA1054A oder vergleichbar (&amp;quot;Fault-Tolerant&amp;quot; CAN Transceiver, 11898-3) ||||| |||||&lt;br /&gt;
* Power over Ethernet Bausteine z.&amp;amp;nbsp;B. LM7050 |&lt;br /&gt;
* RS485 isoliert: z.&amp;amp;nbsp;B. Burr-Brown ISO485 o.ä. ||||| ||&lt;br /&gt;
* sn65hvd230/231/232 (CAN-Transceiver) in SO8 ||&lt;br /&gt;
* TH3122 K-Line Interface von Melexis ||||| ||||&lt;br /&gt;
* TH8080 LIN Transceiver von Melexis (oder vergleichbare) |&lt;br /&gt;
* TI ISO1050 (Isolierter CAN-Transceiver) ||&lt;br /&gt;
&lt;br /&gt;
=== ADC, DAC und PWM ===&lt;br /&gt;
&lt;br /&gt;
* 16-bit A/D-Wandler (waren von Maxim schon im Programm, sind aber wieder herausgeflogen?) ||||| ||&lt;br /&gt;
* AD7524 8-Bit DAC in SMD ||||| ||||| ||||&lt;br /&gt;
* ADS8320 ADC 16 Bit seriell ||||| ||||| ||||| ||||| ||||| ||||| |&lt;br /&gt;
* CS5641 von Cirrus...The CS5461 incl. two delta-sigma A/D converters.... ||&lt;br /&gt;
* D/A Wandler mit 4 oder mehr Ausgängen, z.&amp;amp;nbsp;B. TLC5620/TLV5629/AD5325 ||||| ||||| |||&lt;br /&gt;
* DAC7612 DAC 12 Bit seriell ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* DAC8830 IDT (16Bit-DAC,ser. Input) ||||| |&lt;br /&gt;
* Generell mehr DAC&#039;s (auch die teureren) von TI |||||&lt;br /&gt;
* Generell mehr I2C IC (ADC, DAC, DSP, u.a. Crystal, BurrBrown etc.) ||||&lt;br /&gt;
* Generell mehr PWM-SIC&#039;s ||||&lt;br /&gt;
* LTC 1655(L) N8 16 Bit DAC interne Ref 2.048/1.25V(L Type) SPI Interface ||&lt;br /&gt;
* LTC24xx (24-Bit Delta-Sigma ADC) ||||&lt;br /&gt;
* MAX127/128 8-Kanal 12bit ADC mit I2C interface |||&lt;br /&gt;
* MAX528 8-fach 8Bit DAC mit Output Buffer seriell |&lt;br /&gt;
* MCP4725A0 und MCP4725A1 D/A-Wandler 12 Bit I²C ||&lt;br /&gt;
* Philips TDA1543 - 2x16-Bit DAC |&lt;br /&gt;
* TI PCM1804 Audio-ADC||||&lt;br /&gt;
* TI PCM2707 USB-Audio-DAC ||&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;
&lt;br /&gt;
=== Sensoren und Aktoren ===&lt;br /&gt;
&lt;br /&gt;
* 4Hz Supersense µblox LEA-4S GPS module (Importer pointis.de) + Passende Passives Patch antenna (zB. von inpaq.com) ||||| |||&lt;br /&gt;
* Allegro Stromsensoren (z.&amp;amp;nbsp;B. ACS713, ACS756) ||||| ||||| ||||&lt;br /&gt;
* Allgemein mehr Sensoren ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* Anemometer ||||| |&lt;br /&gt;
* BLDC-Motoren |||&lt;br /&gt;
* Drehwinkelgeber, Gyro, Kreiselsensoren ähnl. Tokin CG-L43 ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||&lt;br /&gt;
* Durchflussmesser (z.&amp;amp;nbsp;B. wie Conrad Nr.155374) ||||| ||||| ||||| |||&lt;br /&gt;
* Flexinol ||||| |||&lt;br /&gt;
* FSRs (Force Sensing Resistor) von Interlink Electronics ||||| ||||| |||&lt;br /&gt;
* Getriebemotoren wie RB35 oder RB40 ||||| ||||| |||||&lt;br /&gt;
* günstige Temp. Sensoren TC77 ||||| ||||| ||||&lt;br /&gt;
* Gyro Sensoren  MURATA,  ENC-03J A/B    ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* Hall-Sensor UGN3503, KMZ51 ||||| ||||| ||||| |&lt;br /&gt;
* Hall-Sensoren aehnlich TLE4905, aber mit Vcc 3,3V, z.&amp;amp;nbsp;B. CYD1102G |&lt;br /&gt;
* Hall-Sensoren z.&amp;amp;nbsp;B. TLE4905 wieder ins Programm nehmen ||||&lt;br /&gt;
* I²C-Bus Temperatursensor DS1631Z ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* iMEMs Acceleration Sensors ADXL Series von Analog Devices ||||| ||||| ||||| ||||&lt;br /&gt;
* Induktions-Stromsensoren Coilcraft #J9199-A o.ä. ||||| ||&lt;br /&gt;
* IS471 Selbstmodulierende IR-Lichtschranke ||||| ||||| ||||| ||||| ||||| |&lt;br /&gt;
* K-Typ (J-Typ) Thermocouple Temperatursensoren und passende Steckverbinder ||||| ||||| ||&lt;br /&gt;
* kleine Feuchtigkeitssensoren zur &#039;on-board-Montage&#039; ||||| ||||| ||||| ||||| ||||&lt;br /&gt;
* LEM Stromsensoren (Transducer) der HAIS-Serie, speziell HAIS 50-P und 100-P ||||| ||||| ||||| ||||&lt;br /&gt;
* Luftdruck-/ Temperatur Sensor Intersema MS5534 (mit SPI- Interface) ||||| ||||&lt;br /&gt;
* Magnetfeld-Sensor (Kompass-Anwendung) KMZ52 ||||| ||||| ||&lt;br /&gt;
* MAX6675 Typ-K Thermoelement nach SPI ||||| ||||| ||||| ||||| &lt;br /&gt;
* Modellbau-Servos ||&lt;br /&gt;
* Motorola/Freescale Drucksensoren z.b. MPX4250 mit AP Druckanschluss ||||| ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* NanoMuscle Aktuatoren ||||| ||||| ||&lt;br /&gt;
* Piezo Minimotoren/Linearaktoren von Elliptec/Siemens einzeln und günstig ||||| |||&lt;br /&gt;
* PIR Bewegungsmelder ||&lt;br /&gt;
* QT160 6-fach Touch Sensor IC ||||&lt;br /&gt;
* Sensirion SHT11/SHT71 (oder auch SHT15/SHT75) {{Reichelt50|FF0000}}||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||&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;
* Temperatur IC TC1047 |||&lt;br /&gt;
* Temperatursensor mit SPI-Interface LM74 ||||||&lt;br /&gt;
&lt;br /&gt;
=== Funk und Signalsynthese ===&lt;br /&gt;
&lt;br /&gt;
* Clock generator IC&#039;s, z.&amp;amp;nbsp;B. PCK20?? von Philips |&lt;br /&gt;
* DDS-IC (Waveform-Generator) von Analog wie AD9833, AD9835 ||||| ||||| ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* EM4095 (RFID) |||&lt;br /&gt;
* LMX2306/LMX2316/LMX2326 PLL Synthesizer von National ||||| ||&lt;br /&gt;
* LTC5540 (RF-Mixer) |&lt;br /&gt;
* PLL Schaltkreise für Frequenzerzeugung. z.&amp;amp;nbsp;B. MC / ML145170 (SOIC16) / TSA5060A ||||| ||||| ||||| |||&lt;br /&gt;
* SI4735 Silicon Labs Radio ICs |||&lt;br /&gt;
* TEA5757 FM-Tuner IC von Philips |||&lt;br /&gt;
* TEA5768HL FM-Tuner IC von Philips |||||&lt;br /&gt;
* TPS79318 1,8V 200mA LDO in (bestens für z.&amp;amp;nbsp;B. LPC210x µC) |&lt;br /&gt;
&lt;br /&gt;
=== sonstige ===&lt;br /&gt;
&lt;br /&gt;
* 74HCxxxx komplette Serie |||&lt;br /&gt;
* 74VHC-Serie komplettieren (z.&amp;amp;nbsp;B. 74VHC125D) ||||| ||&lt;br /&gt;
* A3982 Motortreiber/Controller (1,5A, 2APeak, u.A. für RepRap&#039;s) |&lt;br /&gt;
* Automotiv ICs z.&amp;amp;nbsp;B. LM1815, LM1915, LM1949, LM9011, LM9040, LM9044, LMD18400... ||||| |&lt;br /&gt;
* Bosch CJ125 (Lambdasonden-IC) ||||| |||&lt;br /&gt;
* DS1616 von Dallas Datalogger-IC ||&lt;br /&gt;
* DTMF-Dekoder-Enkoder (8870, 8880) ||||| ||||| ||||| ||||| ||||| ||||&lt;br /&gt;
* HCT-Logik in SMD {{Reichelt50|FF0000}}||||| ||||| ||||| |||&lt;br /&gt;
* High Side Current Sense ICs wie MAX4172 ||||| |&lt;br /&gt;
* IRS2092 Class-D Audio Driver IC ||&lt;br /&gt;
* ISD 2560 -&amp;gt; SOIC Gehäuse (Sprachaufnahme IC) ||||| |&lt;br /&gt;
* ITS4141N o. BTS4141N Smart High-Side Power Switch (z.&amp;amp;nbsp;B. bestens für 24V geeignet!) ||&lt;br /&gt;
* Kleinere SMD-Bauformen (bes. bei ICs) ||||| ||||| ||||| |&lt;br /&gt;
* L6205 Motortreiber (2Kanal, 2,8A, DMOS)|||||&lt;br /&gt;
* L6206N Motortreiber (Wird für OpenDCC benötigt, und ist derzeit nur SEHR schlecht erhältlich) |&lt;br /&gt;
* LM3886 (68W Audioverstärker) ||||| |&lt;br /&gt;
* LMD18200 (H-Bridge) |&lt;br /&gt;
* LT-1117-CST-5 als Sot223 (adj und 3.3 gibts schon, 5 fehlt noch) |&lt;br /&gt;
* LTC 4411 ideale Diode 2,6 bis 5,5V max. 2,6A im SOT-23 Gehäuse&lt;br /&gt;
* LTZ1000ACH#PBF Linear Technology Präzisions-Referenz (Ersatz für LM399H) |||&lt;br /&gt;
* Maxim Switched Capacitor Tiefpass-Filter (z.&amp;amp;nbsp;B. MAX297, MAX7410) ||||| |&lt;br /&gt;
* mehr Familien von Logik-ICs, z.&amp;amp;nbsp;B. AC, ACT, LVC (in SMD) ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* mehr SMD Bauteile  {{Reichelt50|FF0000}} {{Reichelt50|00FF00}} ||||&lt;br /&gt;
* MIC6315 von Micrel (3,3/5V Reset Baustein mit manual Reset) ||&lt;br /&gt;
* Motortreiber TLE 4205 |||&lt;br /&gt;
* SDT06S60 Infineon SiC 600V 6A Silizium-Carbid Schottky-Diode (kein trr, daher keine Schaltverluste) ||||&lt;br /&gt;
* SMD Doppeldiode Schottky 12A 60V im TO252AA z.&amp;amp;nbsp;B. 12CWQ06FN von IOR ||||| ||||| ||||| ||&lt;br /&gt;
* TLV320AIC23B Audio-Codec ||&lt;br /&gt;
* TPIC6B595 (oder ähnliche 74xx595 high current (150 mA) shift register) ||||| |&lt;br /&gt;
* uC supervisor chips + watchdog z.&amp;amp;nbsp;B.: MAX6864 ist z.Z. der beste (0.2uA!) |||&lt;br /&gt;
* VN808 Low Treshold Octal High Side Driver 0,7A |&lt;br /&gt;
* VS1000 Ogg Decoder von VLSI |&lt;br /&gt;
* VS1053 MP3/AAC/WMA/Ogg Decoder von VLSI ||||| ||||| |&lt;br /&gt;
* Zarlink MT8841 Calling Number Identification Circuit |&lt;br /&gt;
* ZHB6718 (H-Bridge für 1,5V - 20V Motoren) ||||| ||||&lt;br /&gt;
* ZRA250F005 Referenzspanungsquelle 2,5V 0.5% SOT23 gehäuse ||||| ||||| |&lt;br /&gt;
&lt;br /&gt;
== Baugruppen ==&lt;br /&gt;
&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 ATSTK1000 von [http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3918 Atmel] ||||| ||||| ||||| ||||&lt;br /&gt;
* Axis Etrax 100LX MCM (Multi Chip Module) A full Linux computer on a single chip!  ||||| |||||&lt;br /&gt;
* Bluetooth Funkmodul {{Reichelt50|FF0000}}{{Reichelt50|00FF00}}||&lt;br /&gt;
* Bluetooth Mini-Module (RS232-Bluetooth-&amp;quot;Wandler&amp;quot;-Platinchen) z.&amp;amp;nbsp;B. BTM222 |||||&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;
* FPGA, low-cost Experimentierplatinen ||||| ||||| ||||| ||||| |||| &lt;br /&gt;
* Hope RF Module 433 u. 868 MHz, http://www.hoperf.com/pdf/RF12.pdf ||||| ||&lt;br /&gt;
* kostengünstige Funkempfänger/Funksender 433 &amp;amp; 868 Mhz ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* kostengünstige Funkschaltmodule (TLP/RLP) ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* Lantronix XPort Direct ||&lt;br /&gt;
* Lantronix XPort Embedded Device Server ([http://www.lantronix.com www.lantronix.com]) ||||| ||||| |&lt;br /&gt;
* Microchip PICkit 2 ||||| |||&lt;br /&gt;
* Microchip PICkit 2 (PG164120) ohne Demoplatine |&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;
* ST Primer 2 (Experimentierboard fuer ARM Einsteiger) ||&lt;br /&gt;
* STM STM3210C-EVAL für &amp;lt;=214,79€ netto (wie bei Future Elektronik, Stand 18.3.2011) |&lt;br /&gt;
* TI - MSP430 Wireless Development Tool (AEC13895U) |&lt;br /&gt;
* TI eZ430-Chronos |&lt;br /&gt;
* UM232 FTDI USB - RS232 Modul für DIL sockel |||&lt;br /&gt;
&lt;br /&gt;
== Passive Bauteile ==&lt;br /&gt;
&lt;br /&gt;
=== Spulen und Trafos ===&lt;br /&gt;
&lt;br /&gt;
* Die Micrometals Pulverkerne (-18 und -26) auch in größer ||||| |&lt;br /&gt;
* Fastron 0805 AS Serie vervollständigen |&lt;br /&gt;
* Funk-Entstördrosseln 16A, div. Werte ||||| ||||| ||||| |||&lt;br /&gt;
* Funk-Entstördrosseln 330µH / 3A |&lt;br /&gt;
* Funk-Entstördrosseln 47µF |||&lt;br /&gt;
* Magnetics CoolMu Ringkerne ||||| ||||| ||&lt;br /&gt;
* Magnetics MPP Ringkerne ||||| ||||| ||&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;
* Ringkertrafos &amp;gt;500VA mit höherer Spannung als 30V (Verstärkerbau) ||&lt;br /&gt;
* SEPIC-Speicherdrosseln von Würth WE-DD (Größe M u. L) ||||&lt;br /&gt;
* Übertrager für Schaltregler z.&amp;amp;nbsp;B. Epcos Typ  B78304 ||||| |||||&lt;br /&gt;
* Würth Induktivitäten ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* Würth Sortimentskästen Induktivitäten |||||&lt;br /&gt;
&lt;br /&gt;
=== Kondensatoren ===&lt;br /&gt;
&lt;br /&gt;
* Drehkondensatoren 20-500pf ||||| |&lt;br /&gt;
* Generell SMD-Kerkos im Wert &amp;gt; 100nF {{Reichelt50|FF0000}}||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||||&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;
* Kleine Niedervolt-Polyproplyenkondis mit mehr Kapazität ||||&lt;br /&gt;
* Low-ESR Elkos (definiertes Fabrikat/Typ, und nicht einfach irgendwelche! (Rubycon?)) {{Reichelt50|FF0000}}||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||&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;
* Sanyo OS-Con bedrahtet und SMD |||&lt;br /&gt;
* Wima FKP02 |&lt;br /&gt;
* Wima FKP2 |&lt;br /&gt;
* Wima MKP3-X2 (~275V, klein und ideal für Kondensatornetzteile) ||&lt;br /&gt;
* Wima MKP4 |||||&lt;br /&gt;
* Zum MAX232 so20 passende SMD-Kerkos im Wert 1uF (0805,0603, 1206) ||||| ||||| ||||| ||||| ||&lt;br /&gt;
&lt;br /&gt;
=== Widerstände und Potis ===&lt;br /&gt;
&lt;br /&gt;
* 25/50/100W Hochlast-Widerstände (~20/50 Ohm auch weniger) ||||| ||||| ||||| |||&lt;br /&gt;
* Digitalpoti AD5160 mit SPI in SOT23 |&lt;br /&gt;
* Digital-Potentiometer (z.&amp;amp;nbsp;B. 2-Wire MAX546x, AD526x, X9C10x) ||||| ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* Durchsteck-Widerstände in kleiner Bauform 0204. ||||| ||||| ||&lt;br /&gt;
* Endlospotis als Motorgeber |&lt;br /&gt;
* Erneut die 10k-Ohm SMD-Potis |||||&lt;br /&gt;
* Größere Auswahl an (Stereo-)Schiebepotis in log und lin, insbesondere jenseits 100K ||&lt;br /&gt;
* Hochlast NTC, z.&amp;amp;nbsp;B. 80-220 Ohm/1-4A (EPCOS, Ametherm) ||&lt;br /&gt;
* Hochspannuns-Widerstände (z.&amp;amp;nbsp;B. 330M/10kV) |&lt;br /&gt;
* iPod-Wheel z.B. QT511-ISSG  ||||| ||||| |||||&lt;br /&gt;
* Kleine Ein-Gang-Trimmer unterhalb 250 Ohm |&lt;br /&gt;
* Leitplastikpotis im Servogehäuse |&lt;br /&gt;
* Linear- und 360° Soft-Pots (iPod-Wheel) wie von spectrasymbol ||||| |||&lt;br /&gt;
* Niederohm-Widerstände (Shunts ab 1mOhm im guten Gehäuse z.&amp;amp;nbsp;B. TO220) ||||| ||||| ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* Null-Ohm Widerstände (Drahtbrücken) Baugröße wie 1/4W ||||| ||||| ||&lt;br /&gt;
* Präzisions-Spannungsteilernetzwerke ||||| |||||&lt;br /&gt;
* Präzisionsspannungsteiler 1:10, 1:100, 1:1000 (10MOhm Gesamtwiderstand) ||&lt;br /&gt;
* Präzisionswiderstände 0,05% und besser, ev. Drahtgewickelt ||||| ||||| ||||| |&lt;br /&gt;
* R2R-Widerstandsnetzwerke (z. B. 10/20kOhm für DA-Wandler an Microcontrollern) ||||| ||||| ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* SMD-Präzisionswiderstände (0,1% TC10ppm/K =&amp;gt;0,1W indukt.arm) ||||| ||||| ||||| |||&lt;br /&gt;
* SMD-Widerstände 0805 auch aus der E24-Reihe ||||| ||||| ||||| |||&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;
* statt Radiohm potis bitte Prehostat oder Alphastat 16 63256-026xx ||||| ||||| ||||&lt;br /&gt;
* Widerstände &amp;gt; 10MOhm (möglichst bis 100GOhm) ||&lt;br /&gt;
* Widerstandsnetzwerke 11-Pin (für 10er Bargraphanzeige) ||&lt;br /&gt;
&lt;br /&gt;
=== Quarze, Quarzoszillatoren und Resonatoren ===&lt;br /&gt;
&lt;br /&gt;
* 13,5600 MHz Quarz (benötigt für RFID) (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 (SMD-Grundtonquarz unter 24,0000-MA505 verfügbar) ||||| |||||&lt;br /&gt;
* 25,0000 MHz &#039;&#039;&#039;Grundton&#039;&#039;&#039;-Quarz, wird benötigt für Microchip TCP/IP Controller ENC28J60) (als Keramik-SMD-Quarz 25,000000-MJ verfügbar) {{Reichelt50|FF0000}}{{Reichelt50|00FF00}}||||| ||||| ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* Allgemein mehr Grundtonquarze bei höheren Frequenzen |||||&lt;br /&gt;
* Murata Keramik-Resonator CSTLS16M0X, CSTLS20M0X (obwohl 3. OW, direkt mit µC verwendbar)&lt;br /&gt;
* Quarze 6,500000 MHz (HF-Anwendung) ||&lt;br /&gt;
* Quarze 32 MHz 10ppm Oscillatorfrequenz 0 bis +70°C&lt;br /&gt;
* Quarz mit 3,200 MHz  ||&lt;br /&gt;
* Quarzoszillator 9,8304 MHz  ||&lt;br /&gt;
* SMD Quarze/ Oszillatoren in flachen, kleinen SMD Gehäusen (SMX-A/-B) ||||&lt;br /&gt;
* SMD-Quarze mit Standardgehäuse (z.&amp;amp;nbsp;B. HC49/US &amp;amp; HC49/UP) ||||| ||||&lt;br /&gt;
&lt;br /&gt;
=== Sonstiges ===&lt;br /&gt;
&lt;br /&gt;
* Lötfähige (SMD-) Kühlkörper (Fischer) ||||| ||||| ||||| ||&lt;br /&gt;
* Metallbrückengleichrichter für 50A ||||&lt;br /&gt;
* Netzfilter FFP Reihe Schurter ||&lt;br /&gt;
* Suppressordioden mit Spannungsbereich zwischen 15V und 30V |||&lt;br /&gt;
* Übertrager FB2022 oder 20F-001N (passend zu RTL8019AS)|&lt;br /&gt;
* Übertrager passend zu ENC28J60&lt;br /&gt;
* Varistoren 14V auch als bedrahtetes Bauteil (für KFZ-Bordnetz) ||||| ||||| |-&amp;gt; 1,5KE 18CA&lt;br /&gt;
&lt;br /&gt;
== HF-Baumaterialien ==&lt;br /&gt;
&lt;br /&gt;
* Durchführungskondensatoren 1nF/160V (waren Ende &#039;06 noch im Programm) ||||&lt;br /&gt;
* Filter SFE10.7MA19 360khz SZP2026 |&lt;br /&gt;
* H155 (HF-Kabel) |||||&lt;br /&gt;
* HF-Litze(n) |&lt;br /&gt;
* Keramik / Teflon Leiterplatinen |&lt;br /&gt;
* Keramische Filter CFM455... ganzes Sortiment |||||&lt;br /&gt;
* MC68160FB&lt;br /&gt;
* MC68EN302PV20&lt;br /&gt;
* MICRF002/022, MICRF102/103 von Micrel  ||||| |&lt;br /&gt;
* MMICs und Ringmischer von Mini-Circuits&lt;br /&gt;
* MT48LC4M32B2TG-7&lt;br /&gt;
* PLL ICs z.&amp;amp;nbsp;B. von NXP und National für HF-UHF ||&lt;br /&gt;
* S3C4510B&lt;br /&gt;
* Transistoren MRFG35010 |&lt;br /&gt;
* U.FL bzw. IPEX Steckbuchsen zum Selbstkonfektionieren von HF-Kabeln ||&lt;br /&gt;
* ZF-Quarzfilter für versch. Frequenzen (10, 20, 40 MHz) ||&lt;br /&gt;
* Zirkulatoren ALD4302SB statt LM239 &lt;br /&gt;
* µP Compatible CTCSS Encoder,Decoder FX 365&lt;br /&gt;
&lt;br /&gt;
== Optoelektronik und Leuchtmittel ==&lt;br /&gt;
&lt;br /&gt;
=== Einzel-LEDs ===&lt;br /&gt;
&lt;br /&gt;
* Acriche 230V~ LEDs&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;
* Everlight SMD-RGB (fullcolor) 19-337/R6GHBHC-A01/2T ||||&lt;br /&gt;
* Generell: Z-Power LEDs von Seoul (günstiger und heller als Luxeon) ||||| ||&lt;br /&gt;
* IR-Diode mit viel Power ttp://www.lc-led.com/Catalog/department/36/category/49/1 ||&lt;br /&gt;
* Kühlerplatinen für Power-LEDs im Star-Format oder vergleichbar |&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;
* Luxeon Rebel weiß (180 lm) auf Star-, Mini- oder normaler Platine ||&lt;br /&gt;
* OSRAM Hyper TOPLEDS gelb LY T676-S1T1-26 ||&lt;br /&gt;
* OSRAM Hyper TOPLEDS weiss LW T67C-T2U2-5K8L ||&lt;br /&gt;
* Reflektoren für 10mm LEDs ||&lt;br /&gt;
* Samsung SLS RGB W815 TS (PLCC6 RGB-LED)|&lt;br /&gt;
* Seoul Z-LED RGB auf Platine ||&lt;br /&gt;
* Seoul Zled P4 (100lm bei 350mA, 240lm bei 1A!) ||||| |||||&lt;br /&gt;
* SMD-IR-LEDs in 0603/0805/SOT23 + dazu passende IR-Fotodioden in gleicher Größe |&lt;br /&gt;
* SMD-LED Bauform 0402 rot/gelb/grün/blau/weiss  ||||| ||||| ||||| ||||| |&lt;br /&gt;
* Superflux RGB-LED |||&lt;br /&gt;
* warmweiße LED ||||| ||||| ||||| |||&lt;br /&gt;
* weiße SMD-LED Bauform 0603 ||||| ||||| |||||&lt;br /&gt;
&lt;br /&gt;
=== Anzeigen und Displays ===&lt;br /&gt;
&lt;br /&gt;
* 4-Stellige Dot-Matrix LED-Anzeigen Siemens SLG 2016 oder von HP oder ähnliches ||||| |&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, weiss, gem. Anode ||||| ||||| ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* 7-Segment-Anzeige, weiss, gem. Kathode ||||| ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* Generell alle 7-Segment-Anzeigen auch in Blau und bis zu 100mm Höhe ||&lt;br /&gt;
* Kingbright PSC Serie (16 Segment LED-Display, insbesondere PSC08 und PSC12) |&lt;br /&gt;
* LED Punktmatrix Anzeigen 8x8 superrot 3mm (z.&amp;amp;nbsp;B. Everlight ELM-1883SRWA) ||&lt;br /&gt;
* LED Punktmatrix bicolor 1.9mm (z.b. Betlux BL-M 07A881SG-XX )&lt;br /&gt;
* TFT/OLED Farb-Displays, wie die bereits abgekündigten OSRAM OLEDs |||&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;
&lt;br /&gt;
=== andere Leuchtmittel ===&lt;br /&gt;
&lt;br /&gt;
* OSRAM Halogen Decostar 51 12V 20W GU5,3 statt des billigen NoName Zeugs ||&lt;br /&gt;
&lt;br /&gt;
=== sonstige Optoelektronik ===&lt;br /&gt;
&lt;br /&gt;
* BPW 34 F / FS (aus dem Sortiment gefallen, PIN-Fotodiode) |&lt;br /&gt;
* IL207AT (SMD Optokoppler von Infineon) ||||| ||&lt;br /&gt;
* ILD256T (SMD AC-Optokoppler)  ||||| |||||&lt;br /&gt;
* ILD620 (DIP Optokoppler) ||||| ||||| ||||| |||||&lt;br /&gt;
* IrDA-Tranceiver TFDS4500 (oder TFDU4100) wieder anbieten - war im 07/2005er Katalog noch drin) ||||| ||||&lt;br /&gt;
* PC923 (Opto MosFET Gate Treiber auch für High Side) |&lt;br /&gt;
* SFH6106, SFH6206 4 Pin Optokoppler SMD ||||| |&lt;br /&gt;
* TLP 3617 Photo-Triac&lt;br /&gt;
* TLP113 (SMD Optokoppler) |||||&lt;br /&gt;
* TLP250 (Opto MosFET Gate Treiber auch für High Side)||||&lt;br /&gt;
* TORX 178 Fiberoptik-Receiver&lt;br /&gt;
* TOTX177PL und TORX177PL (Fiberoptik-Transmitter) als Ersatz für TOTX173 und TORX173 (zwar anderes Footprint, aber dafür auch kleiner und günstiger)&lt;br /&gt;
* TSOP 1140 Infrarot-Receiver  (oder andere 40 kHz IR-Empfänger) |&lt;br /&gt;
* TSOP 1730 Infrarot-Receiver [Achtung! TSOP17xx sind Auslaufmodelle bei Vishay] |&lt;br /&gt;
* TSOP98200 (Breitband IR-Empfangsmodul 20-455 KHz) |||&lt;br /&gt;
* TSOP98260 (Breitband IR-Empfangsmodul 20-60 kHz) ||||&lt;br /&gt;
* Vactrol Optokoppler (mit Fotowiderstand zur Analogsignalregelung) |||||&lt;br /&gt;
&lt;br /&gt;
== Mechanisches ==&lt;br /&gt;
&lt;br /&gt;
=== Schalter/Taster/Eingabegeräte, Relais ===&lt;br /&gt;
&lt;br /&gt;
* bistabile Relais mit 2 Wicklungen ||||| ||||| ||||| &lt;br /&gt;
* Drehimpulsgeber DDM Hopt+Schuler 427 SMD (evt auch normal, stehend &amp;amp; liegend) ||||| ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* Drehschalter Serie DS in allen Versionen nur vom Hersteller C&amp;amp;K; auch brückende Versionen anbieten  ||||| |||||&lt;br /&gt;
* Drucktastenfeld Matrix 3x4 ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* Folientastaturen {{Reichelt50|FF0000}}||||| ||||| ||||&lt;br /&gt;
* Grayhill Series 60A Joysticks mit USB-Adapter |&lt;br /&gt;
* Hohlwellen-Drehgeber (z.&amp;amp;nbsp;B. EC35B-Serie von Alps) ||&lt;br /&gt;
* kleiner Joystick wie beim Atmel Butterfly  ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* mehrpolige Fußschalter, FS 35 bitte bei Druckschalter einordnen ||||&lt;br /&gt;
* Miniaturkippschalter mit Verriegelung ||||&lt;br /&gt;
* möglichst kleine und flache Druckschalter rastend!  |||||&lt;br /&gt;
* passende Touchpanels für die coolen Blue-Line-Grafikdisplays ||||| ||||| |&lt;br /&gt;
* Relais mit hohen Wirkungsgrad (daher nur geringer Spulenstrom nötig) ||&lt;br /&gt;
* SMD-Schiebeschalter |||||&lt;br /&gt;
* Taster Radiohm ST-1034 in rot, grün, gelb, blau, grau und schwarz&lt;br /&gt;
* Taster und Kappen aus der Multimec-Reihe |||&lt;br /&gt;
* Taster, Schalter und LED-Fassungen aus der Mentor FEL-Reihe |||&lt;br /&gt;
* Tastköpfe für Taster9308, wie zb Omron B32-2000 oder B32-2010 |&lt;br /&gt;
* PhotoMOS Relay (z.&amp;amp;nbsp;B. AQV257 von Panasonic |&lt;br /&gt;
&lt;br /&gt;
=== (Steck-) Verbindungen PC- und Audiotechnik ===&lt;br /&gt;
&lt;br /&gt;
* 2.5mm Stereo Klinkenbuchsen (3-polig) SMD ||||&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;
* Floppy Stromversorgungstecker 3,5&amp;quot; Printausführung ||||| |&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;
* Hochwertigere 1/4&amp;quot; Klinkenbuchsen, z.&amp;amp;nbsp;B. von Rean oder Cliff |||||&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;
* Micro-USB Steckverbinder ||||| ||&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;
* MiniSD Card Connector mit Auswurffunktion für Oberflächenmontage  ||||| |&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 {{Reichelt50|FF0000}}||&lt;br /&gt;
* Modulare Buchse RJ45 ohne Übertrager mit LEDs (oder Lichtleiter für SMD-LEDs) ||||| ||&lt;br /&gt;
* Molex Steckerreihe Minifit Jr 4,2mm Rastermaß (verwendet als Stromstecker in Computern, Mainboard, PCI-E, P4/EPS ...) |&lt;br /&gt;
* Ordentliche Lautsprecherbuchsen &amp;quot;Strich-Punkt&amp;quot; (Print oder Wand) (die Stecker sind OK) |&lt;br /&gt;
* RJ45-Stecker 90° nach unten oder zur Seite gewinkelt ||&lt;br /&gt;
* SATA Strom-Stecker/ Buchsen für Kabel/ Printmontage |||&lt;br /&gt;
* USB3, e-SATA, eSATAp (Power e-SATA) Stecker in Printausführung (gerade und gewinkelt) ||||&lt;br /&gt;
* vernünftige Koax-Stecker und Kupplungen z. Bsp. von Hirschmann&lt;br /&gt;
* WOL-Verbindungskabel / Stecker / Print-Connectoren: ||||| |&lt;br /&gt;
&lt;br /&gt;
=== (Steck-) Verbindungen Platinen und ICs ===&lt;br /&gt;
* Buchsenleiste Fischer BL5  |&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;
* Carrier-IC-Sockel&lt;br /&gt;
* Die PSK-Kontakte in anderen Packungen als 20/10k.100Stk. wäre z.B. gut.1k auch. ||||| |&lt;br /&gt;
* Einpolige Steckerleiste 2.54 ||||| ||&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;
* mehrpolige, hochwertige Miniatursteckverbinder (z.&amp;amp;nbsp;B. http://www.binder-connector.de/pdfs/serien/711.pdf) |||&lt;br /&gt;
* Molex C-Grid SL einreihig 2 bis &amp;gt;6 polig: Stecker, Buchsen, Buchsen-SMD, Crimp-Werkzeug |&lt;br /&gt;
* Nullkraftsockel (TEXTOOL, ARIES, Yamaichi,..) für 6-Pin SOT23 (SOT23-6) |||||&lt;br /&gt;
* Nullkraftsockel (TEXTOOL, ARIES, Yamaichi,..) für DIL20 ||||| ||||&lt;br /&gt;
* Nullkraftsockel (TEXTOOL, ARIES, Yamaichi,..) für DIL28 |&lt;br /&gt;
* Nullkraftsockel (TEXTOOL, ARIES, Yamaichi,..) für PLCC-44 ||||| ||||| |||||&lt;br /&gt;
* Nullkraftsockel (TEXTOOL, ARIES, Yamaichi,..) für andere SO- oder TQFP-Gehäuse ||||| ||||| ||||| |||&lt;br /&gt;
* Platinensteckverbinder für Rastermass 2,00mm ||||&lt;br /&gt;
* Stapelleiste AMP 2–0827730–0, 20polig, A 24,2 mm |&lt;br /&gt;
* Stiftleisten im Rastermaß 1 mm (z.&amp;amp;nbsp;B.: Samtec FTMH-120-03-F-DV-ES) |&lt;br /&gt;
* Wannenstecker 2,54mm Raster auch als SMD ||||| ||||&lt;br /&gt;
* Wannenstecker 6-Pol. gewinkelt, gibt nur gerade (WSL 6W, aber derzeit nicht lieferbar) ||&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;
&lt;br /&gt;
=== (Steck-) Verbindungen sonstige ===&lt;br /&gt;
* Adapterprogramm SMA auf SMB ausbauen |&lt;br /&gt;
* BNC-Stecker (wie UG 88U, Lötmontage) aber für RG174-Kabel ||||| |&lt;br /&gt;
* Chipkartenkontaktiereinrichtung, die die Kontakte anhebt (keine Schleifkontakte) ||||| |||||&lt;br /&gt;
* E10-Schraubsockel, wie sie Glühbiren haben, mit Lötstiften (Achtung es ist nicht die Fassung gemeint) |||||&lt;br /&gt;
* Euro-Einbausteckdose (230V~, gab&#039;s früher mal) ||||| |&lt;br /&gt;
* Foliensteckverbinder (FFC) RM1,25 (z.&amp;amp;nbsp;B. 9pol, 11pol ...) |||||&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;
* Hohlstecker für Laptops 1,7 x 4,75mm gelb ||&lt;br /&gt;
* JST HR Steckverbinder |||&lt;br /&gt;
* Lüsterklemmen kleiner LÜK 2,5, also z.B. LÜK 1,5: ||&lt;br /&gt;
* Mini-Schraubklemmen Phoenix Contact MPT-Reihe RM2,54, z.B. MPT0,5/12-2,54 f. 12polig |&lt;br /&gt;
* OBD-Stecker. ||||&lt;br /&gt;
* Polklemmen Hirschmann PKNI 10B (max. 63A ^^), zumindest Schwarz und Weiß |&lt;br /&gt;
* preiswerte! Hochspannungssteckverbinder &amp;gt;2kV ||||&lt;br /&gt;
* RP-SMA-Buchse/-Stecker (gewinkelt/gerade) |||&lt;br /&gt;
* Schuko-Einbausteckdose (Maschinensteckdose) (mit oder ohne Klappdeckel); Flanschmaß möglichst klein (50mmx50mm); div. Farben (sw,grau,...) ||||| ||||| ||&lt;br /&gt;
* Steckverbinder für PICTIVA OLED Display Folienkabel |||||&lt;br /&gt;
* Triaxstecker /-buchse (Coax mit 2. Schirm als 3. Kontakt) ||&lt;br /&gt;
&lt;br /&gt;
=== Kabel, Drähte etc. ===&lt;br /&gt;
&lt;br /&gt;
* angebotene Schaltlitze (H05VK) um weitere Farben erweitern ||||&lt;br /&gt;
* das qualitativ mangelhafte 4mm Laborsteckerprogramm rausnehmen und nur noch Hirschmann anbieten  ||||| ||||| ||||| ||||| |&lt;br /&gt;
* dickere Mantel(Feuchtraum)leitungen, z.&amp;amp;nbsp;B. NYM J5x10 |&lt;br /&gt;
* Distanzbolzen mit 2 M2,5 Innengewinden vrsch. Längen ||&lt;br /&gt;
* dünner Schaltdraht (&amp;lt; 1mm Durchmesser, isoliert mit Tefzel oder Kynar)  {{Reichelt50|FF0000}}||||| ||||| ||||| ||||| ||||| ||||| ||||| |&lt;br /&gt;
* Flachbandkabel im 1,00mm Raster, passend für Pfostenverbinder PL 2X25G 2,00 . Wird für Notebookplatten benötigt. Ohne das ist die gesamte 2,0mm-Wannensteckerproduktgruppe sinnlos. ||||| ||&lt;br /&gt;
* Flachbandkabel im 1,27 mm Raster, 6-polig ||&lt;br /&gt;
* Flachbandkabel im 2,54mm Raster und dazu passende Aufpressstecker und -buchsen ||||| ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* Flexible Einzellitze, 0,5² in verschiedenen Farben ||||| ||||| ||||| ||||| ||||| ||||&lt;br /&gt;
* Folienflachkabel (FFC) RM 0,8 (z.&amp;amp;nbsp;B. 30pol., Länge 125mm) für 8&amp;quot; TFT-Monitor&lt;br /&gt;
* Folienflachkabel (FFC) RM1,25 (z.&amp;amp;nbsp;B. 9pol, 11pol ... /Länge 20cm) ||&lt;br /&gt;
* Heizdraht zB.: Kanthal A1  |||||&lt;br /&gt;
* hochwertige MicroUSB-Kabel (AK 676-AB rupft einem fast die Buchse aus dem Handy) |&lt;br /&gt;
* Kupferlackdraht auf Spulen statt lose (Artikelbild ist irreführend!) |||&lt;br /&gt;
* kurze (10cm, 30cm, 50cm) Kabel zB.: USB A-&amp;gt;B, A-&amp;gt;Bmini, A-&amp;gt;Bmicro; Klinke/Cinchkabel ||&lt;br /&gt;
* Litze, LiY 0,25mm^2, diverse Farben (beispielsweise von Lapp Kabel) |&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;
* LYIF Litze (verschiedene Farben) ||||| |&lt;br /&gt;
* RG214 |&lt;br /&gt;
* Schnepp &amp;quot;Laborkabel&amp;quot; Messleitungen |||||&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;
* Zwillingslitze 2x0.14mm, z.&amp;amp;nbsp;B.  Artikel: ZL214SWW-10M Kessler Elektronik ||||| ||||&lt;br /&gt;
&lt;br /&gt;
=== Gehäuse und Gehäusetechnik ===&lt;br /&gt;
&lt;br /&gt;
* Batteriehalter für 18650er Lithiumzellen (ähnlich dealextreme sku 100996/100997/100999) |||&lt;br /&gt;
* Batteriehalter für 4 Mignonzellen mit Lötfahne (statt Druckknopf)  ||&lt;br /&gt;
* Bopla ABP oder ABPH 800-100 (10cm) Aluprofil Gehäuse ||&lt;br /&gt;
* Distanzbolzen M2,5 (SW4) in verschiedenen Längen aus Messing ||&lt;br /&gt;
* Distanzhülsen/-bolzen M3 in verschiedenen Längen aus Kunststoff |&lt;br /&gt;
* mehr und v.a. kleine (Hand-) Gehäuse  {{Reichelt50|FF0000}}||||| ||||| |&lt;br /&gt;
* Muttern M2 |||&lt;br /&gt;
* Preiswertere Alu Druckgussgehäuse, wie z.&amp;amp;nbsp;B. von Hammond Manufacturing ||||| ||||| ||||| ||&lt;br /&gt;
* Stopmuttern M2 |&lt;br /&gt;
* Strangpreßprofilgehäuse von Fischer |&lt;br /&gt;
* USB-Leergehäuse (z.&amp;amp;nbsp;B. wie USB-Stick, WLAN-Dongle, o.ä.) ||||| ||||| ||||| ||||&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;
&lt;br /&gt;
== Prototypenbau, Platinen und Chemie ==&lt;br /&gt;
&lt;br /&gt;
* Adapter QSOP (versch. Pinzahlen) auf DIL/QIL ||||| ||||&lt;br /&gt;
* Adapter TQFP (versch. Pinzahlen) auf DIL/QIL ||||| ||||| ||||| ||||| |||||  ||||| ||||| |||&lt;br /&gt;
* Arbeitsschalen zum Entwickeln und Ätzen von Platinen(*)(ist im Starterkit enthalten) ||||| ||||| ||||| |||||&lt;br /&gt;
* Ballistol Universalöl ||||| ||||&lt;br /&gt;
* Bungard Green Coat |&lt;br /&gt;
* Bungard Sur-Tin |&lt;br /&gt;
* Bungard-Fotoplatinen auch in 80x100mm (halbes Euroformat), nicht nur 75x100mm ||||| ||||| ||||| |||&lt;br /&gt;
* Bungard-Fotoplatinen BLAU div. Formate ||||| ||||| ||||| ||&lt;br /&gt;
* Cadsoft Eagle ||||| |||||&lt;br /&gt;
* chemisches Zinnbad ||||| ||||| ||||| ||&lt;br /&gt;
* Entwickler NaOH-Frei von Bungard (SENO 4007 Universalentwickler) ||&lt;br /&gt;
* Fotoplatinen aus Hartpapier von Markenhersteller ||&lt;br /&gt;
* Fotoplatinen, zweiseitig, Hartpapier(!) |||||&lt;br /&gt;
* Hohlkehlenlötspitzen (Ersa 0832HD) ||||| |&lt;br /&gt;
* Hohlkehlenlötspitzen f. Weller MLR21 ||||| |||||&lt;br /&gt;
* Kapton-Baender, evtl auch mit Kupferbeschichtung (Flex-PCB) |||&lt;br /&gt;
* Lötstopplaminat ||||| ||||| ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* LPKF Durchkontaktierungspaste ||&lt;br /&gt;
* Messingblech/Kupferblech 0.1mm (wenn möglich Photobeschichtet) |||&lt;br /&gt;
* Natriumpersulfat 2 kg Packung |||||&lt;br /&gt;
* PCI-Express x1 Laborkarte (wie RE 430EP) |&lt;br /&gt;
* PIC_BASIC_II || Programm mit HardwareKey [z.&amp;amp;nbsp;B. für Azubi&#039;s]&lt;br /&gt;
* SMD Testplatine (3x3 Felder) wie bei Conrad ||&lt;br /&gt;
* SOIC auf PDIP Gehäuse-Adapter zwecks Prototypen-Bau ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||||&lt;br /&gt;
* Spitzenhülsen WSP-/MPR 80 (Weller) |&lt;br /&gt;
* Steckplatinen (Breadboards) ohne Grundplatte und ohne Versorgungsleiste (wie Conrad 526827; STECKBOARD 1K2V hat beidseitig Leisten und ist daher nicht anreihbar / ist anreihbar, aber danach sind die beiden Leisten jeweils übrig) |&lt;br /&gt;
* Steckplatinenen (STECKBOARDS) im 84 x 54 Format (gibts bei Conrad ist da aber viel zu teuer) ||&lt;br /&gt;
* Target 3001 V15 Autorouter verschiedene Lizenzen |&lt;br /&gt;
* Tonerverdichter (www.Huber-Troisdorf.com) ||||| ||||| ||||| ||||| ||||| |||&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 (wo?)). Wie wäre es mit Reichelt? ||||| ||||| ||||| ||||| ||||| ||||| ||||&lt;br /&gt;
&lt;br /&gt;
== Werkzeug und Zubehör ==&lt;br /&gt;
&lt;br /&gt;
* einzelne Hartmetallbohrer in diversen Grössen (z.&amp;amp;nbsp;B. 0,8 1,0 1,3 1,5) {{Reichelt50|FF0000}}||||| ||||&lt;br /&gt;
* ESD-Erdungspunkte 4mm/10mm für Schuko, wie Vermason J6100 (alt) / 231125 (neu) |&lt;br /&gt;
* Gewindebohrer M2 und M2,5 ||||| ||||| |&lt;br /&gt;
* hochwertige 9mm Abbrechklingen |&lt;br /&gt;
* Konturenfräser/Gravurstichel, etc. zum Fräsen von Platinenprototypen (z.&amp;amp;nbsp;B. Bungard G60N/G30N) ||||| ||||| &lt;br /&gt;
* M2 Gewindebohrer und Senker |||&lt;br /&gt;
* robuste Allzweck- und Teppichmesser ||||| |||&lt;br /&gt;
* Sortimentskasten H1 und evtl. H2-Serie |&lt;br /&gt;
* Tri-Wing Schraubendreher |||&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;
&lt;br /&gt;
== Messgeräte, Diagnose und Stromversorgung ==&lt;br /&gt;
&lt;br /&gt;
* FS300 Messgerät Antennenanalyzer Massenpreis 50000 Stück |&lt;br /&gt;
* Günstigere Oszilloskope z.&amp;amp;nbsp;B. Multimetrix oder Grundig ||||| ||||| |&lt;br /&gt;
* LiPoly-Zellen (aufladbare Lithiumakkus &amp;quot;Suppentüten&amp;quot;) ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* Neuere, bessere NiMH-Akkus (z.b. GP1100 2/3A, GP2000 AF, GP2200 4/5SubC) ||||| ||||| ||&lt;br /&gt;
* OBD2 Kabel auf RJ45 Stecker ||||&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;
* Tektronix TDS Series Osziloskope |||&lt;br /&gt;
* Vorschaltgeräte mit G23 Fassung (zum Bau von UV-Belichtern geeigent)|||&lt;br /&gt;
&lt;br /&gt;
== Auswahl, Bestellung und Versand ==&lt;br /&gt;
&lt;br /&gt;
* bei über 10kg Gewicht nicht gleich die Versandkosten verdoppeln, sondern geringerer oder keinen Aufschlag ||&lt;br /&gt;
* der Reichelt Katalog auf CD/DVD (durch pdf-download überflüssig:) |||||&lt;br /&gt;
* Filialen in Österreich  und der Schweiz :-) {{Reichelt50|FF0000}}||||| (man beachte das &amp;quot;:-)&amp;quot;, es gibt auch in D keine &amp;quot;Filialen&amp;quot; - mt)|&lt;br /&gt;
* Günstige Versandkonditionen für die EU ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||&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;
* Kein Mindestbestellwert (ich bezahle eh&#039; Porto) ||||| ||||| ||||| ||||&lt;br /&gt;
* Kundenkarte so wie bei ELV (Grundgebühr für ein Jahr, keine Versandkosten, evtl kleiner Rabatt) {{Reichelt50|FF0000}}{{Reichelt50|00FF00}}||||&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;
* Möglichkeit für Selbstabholen eine Bestellung unter 10 Euro abzuliefern.  |&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) {{Reichelt50|FF0000}}||&lt;br /&gt;
* nicht wie die Konkurrenz jetzt schon im April den Juli-Katalog rausbringen ||||| ||||| ||||| ||&lt;br /&gt;
* Parametrische Suche aller Elektronikartikel, speziell erstmal Halbleiter, so wie bei Maxim-ic.com ||&lt;br /&gt;
* Reichelt Katalog als PDF zum Download (siehe [[Reichelt PDF Katalog]] ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |&lt;br /&gt;
* Reichelt-Gutscheine sollten bei Online-Bestellung einlösbar sein (wie bei z.&amp;amp;nbsp;B. Amazon) ||||| ||||| |&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;
* Skalierbarer Warenkorb für mehrfachen Aufbau gleicher Platinen |&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;
* Versand von Kleinteilen als Maxibrief, zwecks niedrigerem Versand {{Reichelt50|FF0000}}||||| ||||| |||||&lt;br /&gt;
* Warenkorb immer in gleicher Reihenfolge sortiert, nicht bei jedem Aufruf anders ||||| ||||| |||&lt;br /&gt;
&lt;br /&gt;
== Unsortiert/Unspezifisch ==&lt;br /&gt;
&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;
* 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;
* 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;
* Beamer Casio YC-400 |&lt;br /&gt;
* PCMCIA Wlan-Karten (Linux kompatibel) mit externem Antennenanschluss |&lt;br /&gt;
* Reichelt T-Shirt ||||| |||||&lt;br /&gt;
* Röhrensortiment mit den wichtigsten Typen wie z.B. EL34; KT88 einführen + Sockel ||&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 53x gewünscht  (=&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) 57x gewünscht =&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; 115x gewünscht =&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 50x gewünscht ==&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 60x gewünscht (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;) 96x gewünscht (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) 173x gewünscht&lt;br /&gt;
** Drehimpulsgeber- weiterer Vorschlag: ALPS Encoder ST EC 11B  64x gewünscht 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  115x gewünscht&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 337x gewünscht (erhältlich: RTL 8019AS)&lt;br /&gt;
* SPI-Ethernet-Controller ENC28J60 (erhältlich: ENC 28J60-I/*)&lt;br /&gt;
* Microchip PIC 18F4550 (PIC mit USB) ||||| ||||| ||||| ||||| ||||| ||||| |||&lt;br /&gt;
* Microchip PIC 18F2585 ||||&lt;br /&gt;
* gleicher Mindestbestellwert in Österreich und in der Schweiz wie in Deutschland &#039;&#039;&#039; Seit 1.12.10 umgesetzt&#039;&#039;&#039; ||&lt;br /&gt;
* gleicher Mindestbestellwert in den Niederlanden wie in Deutschland | (mittlerweile überall 10€)&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) ||||| ||||| ||||| ||||| ||||| ||||| ||| &#039;&#039;&#039;Anm.: Versand nach AT inzwischen ab 9,90&#039;&#039;&#039;&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;
* Digitale Speicherosziloskope für PC ||||| ||||| || (Picoscope, PC-Oszilloskop)&lt;br /&gt;
* Hameg HM2008 Oziloscope || ( ist möglich über Service -&amp;gt; Produktservice -&amp;gt; neue Artikel anfragen)&lt;br /&gt;
* Microchip dsPIC30F ||||| ||||| |||&lt;br /&gt;
* Microchip PIC 16F883 und 16F886 |||&lt;br /&gt;
* Microchip PIC 18F4523 (12/2007: PIC mit 12-Bit A/D-Wandler) ||&lt;br /&gt;
* Microchip PIC 18F6585 |&lt;br /&gt;
* Microchip PIC 18F6720 |&lt;br /&gt;
* Microchip PIC 18F8720 |&lt;br /&gt;
* Microchip PIC 24FJ64GB002-I/SP (USB-OTG im DIP28 Gehäuse) |&lt;br /&gt;
* Atmel XMega-Typen, z.B. ATXMega64A4, ATXMega128A1 ||||| ||&lt;br /&gt;
* 7-Segment-Anzeige, blau, gem. Kathode ||||| ||||| ||||| ||||| ||||| ||||| || (SC 52-11 BL)&lt;br /&gt;
* 7-Segment-Anzeige, blau, gem. Anode ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| ||||| |||| (SA 52-11 BL, SA 56-11 BL)&lt;br /&gt;
* EA DOG-L128 128x64 Grafikdisplay zzgl Touch-Folie und Beleuchtung | --&amp;gt; ist ab Katalog 06/2009 drinn&lt;br /&gt;
* LTC 1661 N8 10 Bit Dual Dac mit SPI Interface | (LT C1661 CMS8)&lt;br /&gt;
* Microchip PIC 10F2xx (+ Programmiergerät) ||||| ||||| ||||| ||| (einige Varianten erhältlich, Programmiergerät nicht sicher)&lt;br /&gt;
* Microchip PIC 24 ||||| ||||| ||||| ||||| ||&lt;br /&gt;
* Microchip PIC32 (MIPS) ||||| ||||| ||||| |||&lt;br /&gt;
* Microchip dsPIC33 ||||| ||||| ||||&lt;br /&gt;
* WAGO 215-4mm-Stecker (Bananenstecker mit Käfigzugklemme) zur schnellen Montage bei Versuchsaufbauten ||||| ||||| ||||| ||||| ||| (dieser Wunsch wurde erhört, Hurraa! Best.-Nr. Wago 215-x11, Vielen Dank an Reichelt.)&lt;br /&gt;
* Philips PCA9555 (I2C IO, 16 Bit par. I/O, c&#039;t Project Soundcheck II) |||||&lt;br /&gt;
* ADuM 1201 o. ADuM1401, bzw. andere ADuMxxxx oder ISOxxxx - Digitale Übertrager mit galvanischer Trennung |||&lt;br /&gt;
* LM2675 SimpleSwitcher Step-Down-Konverter in SO-8 Bauform&lt;br /&gt;
* Sharp Entfernungssensoren (zb den GP2D120 oder den GP2D12) 51x gewünscht---- siehe Reichelt Artikel : GP2-0430 und GP2-1080&lt;br /&gt;
* TSOP31238 (Besserer Ersatz (2,5-5,5V) für den nicht mehr Lieferbaren TSOP1738) || --- Artikel-Nr. &amp;quot;TSOP 31238&amp;quot;&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 |||| --- sind nach einer freundlichen Mail in den Katalog aufgenommen worden. Artikel-Nr. &amp;quot;SPITZE 842&amp;quot;&lt;br /&gt;
* Atmel ATSTK600 von [http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4254 Atmel] |||| (AVR STK 600)&lt;br /&gt;
* Atmel AVR Dragon von [http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3891 Atmel] ||||| ||||| ||||| ||||| ||| (AT AVR DRAGON)&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!!) ||||| ||||| ||||| || (oder klare Anzeige wie viel noch vorhanden ist)&lt;br /&gt;
* AVR mit USB: AT90USB1287 (AT 90USB1287 TQ, TQFP64), dazu passendes Demoboard AT 90USB KEY; AT90USB162TQ (AT 90USB162 TQ, TQFP32), AT90USB646 (AT 90USB646 TQ, TQFP64), AT90USB1286QFN (AT 90USB1286 QFN, QFN64), ATmega32u2 (ATMEGA 32-U2 TQ, TQFP44)&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) (SPL 64?) {{Reichelt50|FF0000}}||||| ||||| ||||| ||||| ||||| ||||| ||||| | &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;
* 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;
::Sehr clever. Das würde es Reichelt bestimmt enorm erleichtern, stark nachgefragte Artikel schnell zu erkennen. *facepalm* ;-)&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;
07.10.2011: Reichelt über Facebook drauf aufmerksam gemacht - man schaue sich die Liste regelmäßig durch :)&lt;br /&gt;
&lt;br /&gt;
01.10.2011: Umfangreiche Neuordnung der gesamten Wishlist: Neue Unterkategorien, alphabetische Sortierung, Zusammenführung gleicher Wünsche aus verschiedenen Kategorien, Fix diverse Falsch-Einsortierungen, Update inzwischen erhältlicher Teile, Ausbau einzelner Einträge für bessere Sortierung und mehr Info beim Lesen (nicht nur IC-Namen), etc. Vielleicht hat ja noch jemand nen Einfall für die Sichtbarmachung besonders nachgefragter Einträge, Fett- und Kursivdruck der &#039;&#039;&#039;&#039;&#039;|||||&#039;&#039;&#039;&#039;&#039;-Blöcke funktioniert ja leider nicht... &lt;br /&gt;
&lt;br /&gt;
...bei Ausrufezeichen funktionierts aber. Meinungen zur Farbe und der Auslagerung in eine Vorlage?--[[Benutzer:Bzzz|Bzzz]] 14:49, 1. Okt. 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
03.03.2011: E-Mail wurde an Reichelt-Verwaltung geschrieben.&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;br /&gt;
[[Kategorie:Lieferanten]]&lt;/div&gt;</summary>
		<author><name>129.247.247.240</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Dockstar&amp;diff=50634</id>
		<title>Dockstar</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Dockstar&amp;diff=50634"/>
		<updated>2010-09-15T07:51:06Z</updated>

		<summary type="html">&lt;p&gt;129.247.247.240: /* Kernel kompilieren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das &#039;&#039;&#039;Dockstar&#039;&#039;&#039; ist ein kostengünstiges [[ARM]] System mit 128 Mbyte RAM und 256 Mbyte Flash (NAND) Speicher 8 cm mal 8 cm Größe und nur etwa 5 W Leistung. Es läßt sich auf einfache Weise vielfältig zweckentfremden...&lt;br /&gt;
&lt;br /&gt;
= Beitrag im Forum =&lt;br /&gt;
[http://www.mikrocontroller.net/topic/187115#new 20Euro Embedded System mit ARM, 128MB RAM und 256MB Flash ]&lt;br /&gt;
&lt;br /&gt;
= Hardware =&lt;br /&gt;
==PIN-Forschung==&lt;br /&gt;
[[Bild:RTC.jpg|thumb|RTC]]Hier müssen die beiden Widerstände entfernt werden, da beide Pin´s mit 0 Ohm an Masse angeschlossen sind.&lt;br /&gt;
&lt;br /&gt;
[[Bild:dockstar_oberseite_teil1.jpg|thumb|Oberseite Pins: 21, 22, 23, 28, 29, 30, 32, 35]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:dockstar_oberseite_teil2.jpg|thumb|Oberseite Pins: 1, 2, 3, 8, 12, 14, 15, 18, 19, 36, 37, 38, 40, 44, 46, 47, 49]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:dockstar_unterseite_teil1.jpg|thumb|Unterseite Pins: ]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:dockstar_unterseite_teil2.jpg|thumb|Unterseite Pins: 7, 9, 10, 13, 16, 17, 39, 45, 48]]&lt;br /&gt;
&lt;br /&gt;
Zweite Ethernet Schnittstelle:&lt;br /&gt;
*32 = TX1_CLKOUT&lt;br /&gt;
*33 = TX1_CTRL&lt;br /&gt;
*20 = TXD1[0]&lt;br /&gt;
*21 = TXD1[1]&lt;br /&gt;
*22 = TXD1[2]&lt;br /&gt;
*23 = TXD1[3]&lt;br /&gt;
*30 = RX1_CTRL&lt;br /&gt;
*31 = RX1_CLK&lt;br /&gt;
*24 = RXD1[0]&lt;br /&gt;
*25 = RXD1[1]&lt;br /&gt;
*26 = RXD1[2]&lt;br /&gt;
*27 = RXD1[3]&lt;br /&gt;
&lt;br /&gt;
I2S Schnittstelle:&lt;br /&gt;
*39 = I2SLRCLK&lt;br /&gt;
*40 = I2SDO&lt;br /&gt;
*41 = I2SLRCLK&lt;br /&gt;
*42 = I2SMCLK&lt;br /&gt;
*43 = AU_I2SDI&lt;br /&gt;
*44 = AU_I2SEXTCLK&lt;br /&gt;
&lt;br /&gt;
SPDIF Schnittstelle:&lt;br /&gt;
*36 = SPDIFI&lt;br /&gt;
*37 = SPDIFO&lt;br /&gt;
*38 = SPDIFCLK&lt;br /&gt;
&lt;br /&gt;
I2C Schnittstelle:&lt;br /&gt;
*8 = TW_SDA&lt;br /&gt;
*9 = TW_SCK&lt;br /&gt;
&lt;br /&gt;
SDHC Karte:&lt;br /&gt;
*12 = SD_CLK&lt;br /&gt;
*13 = SD_CMD / Alternativ UA1_TXD (UART1)&lt;br /&gt;
*14 = SD_D0 / Alternativ UA1_RXD (UART1)&lt;br /&gt;
*15 = SD_D1&lt;br /&gt;
*16 = SD_D2&lt;br /&gt;
*17 = SD_D3&lt;br /&gt;
&lt;br /&gt;
SPI Schnittstelle:&lt;br /&gt;
*0 = SPI_CS#&lt;br /&gt;
*1 = SPI_MOSI&lt;br /&gt;
*2 = SPI_SCK&lt;br /&gt;
*3 = SPI_MISO&lt;br /&gt;
&lt;br /&gt;
IO´s:&lt;br /&gt;
*18 = NF_IO0&lt;br /&gt;
*19 = NF_IO1&lt;br /&gt;
&lt;br /&gt;
== I2C ==&lt;br /&gt;
===via USB===&lt;br /&gt;
http://bralug.de/wiki/BLIT2008-Board_mit_i2c-tiny-usb-Firmware&lt;br /&gt;
&lt;br /&gt;
Die auf dieser Seite beschrieben Hardware und Vorgehensweise funktioniert problemlos auch am Dockstar mit Debian Squeeze, da die notwendigen Kernelmodule und Tools vorhanden sind. &#039;&#039;Achtung:&#039;&#039; lm-sensors sollte man allerdings nicht unbedingt ausprobieren, da man damit das Dockstar zum Absturz bringt bzw. auch z.B. der entsprechende Treiber für den LM75 in der vorliegenden Version nicht vorhanden ist.&lt;br /&gt;
&lt;br /&gt;
== JTAG ==&lt;br /&gt;
[http://www.yourwarrantyisvoid.com/2010/09/08/dead-dockstar-resurrected-with-jtag/ dead-dockstar-resurrected-with-jtag]&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
== neue Betriebssyteme ==&lt;br /&gt;
*[[DockstarDebianSqueeze | Debian &#039;&#039;Squeeze&#039;&#039; installieren]]&lt;br /&gt;
&lt;br /&gt;
== Kernel kompilieren ==&lt;br /&gt;
Fertiger Kernel für das Dockstar&lt;br /&gt;
* http://www.onderka.com/2010/08/22/seagate-dockstar-kernel-2-6-33-5/&lt;br /&gt;
Beschreibung von Alexander Holler mit Patches, ...&lt;br /&gt;
* http://ahsoftware.de/dockstar/&lt;br /&gt;
Fertiges 2.6.35.4 Kernel für das Dockstar (nach &amp;quot;dockstarheavy.deb&amp;quot; suchen)&lt;br /&gt;
* http://forum.doozan.com/read.php?2,582&lt;br /&gt;
Howto: Build a new Debian kernel with LED support&lt;br /&gt;
* http://forum.doozan.com/read.php?2,524&lt;br /&gt;
&lt;br /&gt;
= Ideen =&lt;br /&gt;
*SPDIF Ausgang&lt;br /&gt;
*I2C&lt;br /&gt;
*Mehr Ram/Flash&lt;/div&gt;</summary>
		<author><name>129.247.247.240</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Dockstar&amp;diff=50633</id>
		<title>Dockstar</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Dockstar&amp;diff=50633"/>
		<updated>2010-09-15T07:49:14Z</updated>

		<summary type="html">&lt;p&gt;129.247.247.240: /* Kernel kompilieren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das &#039;&#039;&#039;Dockstar&#039;&#039;&#039; ist ein kostengünstiges [[ARM]] System mit 128 Mbyte RAM und 256 Mbyte Flash (NAND) Speicher 8 cm mal 8 cm Größe und nur etwa 5 W Leistung. Es läßt sich auf einfache Weise vielfältig zweckentfremden...&lt;br /&gt;
&lt;br /&gt;
= Beitrag im Forum =&lt;br /&gt;
[http://www.mikrocontroller.net/topic/187115#new 20Euro Embedded System mit ARM, 128MB RAM und 256MB Flash ]&lt;br /&gt;
&lt;br /&gt;
= Hardware =&lt;br /&gt;
==PIN-Forschung==&lt;br /&gt;
[[Bild:RTC.jpg|thumb|RTC]]Hier müssen die beiden Widerstände entfernt werden, da beide Pin´s mit 0 Ohm an Masse angeschlossen sind.&lt;br /&gt;
&lt;br /&gt;
[[Bild:dockstar_oberseite_teil1.jpg|thumb|Oberseite Pins: 21, 22, 23, 28, 29, 30, 32, 35]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:dockstar_oberseite_teil2.jpg|thumb|Oberseite Pins: 1, 2, 3, 8, 12, 14, 15, 18, 19, 36, 37, 38, 40, 44, 46, 47, 49]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:dockstar_unterseite_teil1.jpg|thumb|Unterseite Pins: ]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:dockstar_unterseite_teil2.jpg|thumb|Unterseite Pins: 7, 9, 10, 13, 16, 17, 39, 45, 48]]&lt;br /&gt;
&lt;br /&gt;
Zweite Ethernet Schnittstelle:&lt;br /&gt;
*32 = TX1_CLKOUT&lt;br /&gt;
*33 = TX1_CTRL&lt;br /&gt;
*20 = TXD1[0]&lt;br /&gt;
*21 = TXD1[1]&lt;br /&gt;
*22 = TXD1[2]&lt;br /&gt;
*23 = TXD1[3]&lt;br /&gt;
*30 = RX1_CTRL&lt;br /&gt;
*31 = RX1_CLK&lt;br /&gt;
*24 = RXD1[0]&lt;br /&gt;
*25 = RXD1[1]&lt;br /&gt;
*26 = RXD1[2]&lt;br /&gt;
*27 = RXD1[3]&lt;br /&gt;
&lt;br /&gt;
I2S Schnittstelle:&lt;br /&gt;
*39 = I2SLRCLK&lt;br /&gt;
*40 = I2SDO&lt;br /&gt;
*41 = I2SLRCLK&lt;br /&gt;
*42 = I2SMCLK&lt;br /&gt;
*43 = AU_I2SDI&lt;br /&gt;
*44 = AU_I2SEXTCLK&lt;br /&gt;
&lt;br /&gt;
SPDIF Schnittstelle:&lt;br /&gt;
*36 = SPDIFI&lt;br /&gt;
*37 = SPDIFO&lt;br /&gt;
*38 = SPDIFCLK&lt;br /&gt;
&lt;br /&gt;
I2C Schnittstelle:&lt;br /&gt;
*8 = TW_SDA&lt;br /&gt;
*9 = TW_SCK&lt;br /&gt;
&lt;br /&gt;
SDHC Karte:&lt;br /&gt;
*12 = SD_CLK&lt;br /&gt;
*13 = SD_CMD / Alternativ UA1_TXD (UART1)&lt;br /&gt;
*14 = SD_D0 / Alternativ UA1_RXD (UART1)&lt;br /&gt;
*15 = SD_D1&lt;br /&gt;
*16 = SD_D2&lt;br /&gt;
*17 = SD_D3&lt;br /&gt;
&lt;br /&gt;
SPI Schnittstelle:&lt;br /&gt;
*0 = SPI_CS#&lt;br /&gt;
*1 = SPI_MOSI&lt;br /&gt;
*2 = SPI_SCK&lt;br /&gt;
*3 = SPI_MISO&lt;br /&gt;
&lt;br /&gt;
IO´s:&lt;br /&gt;
*18 = NF_IO0&lt;br /&gt;
*19 = NF_IO1&lt;br /&gt;
&lt;br /&gt;
== I2C ==&lt;br /&gt;
===via USB===&lt;br /&gt;
http://bralug.de/wiki/BLIT2008-Board_mit_i2c-tiny-usb-Firmware&lt;br /&gt;
&lt;br /&gt;
Die auf dieser Seite beschrieben Hardware und Vorgehensweise funktioniert problemlos auch am Dockstar mit Debian Squeeze, da die notwendigen Kernelmodule und Tools vorhanden sind. &#039;&#039;Achtung:&#039;&#039; lm-sensors sollte man allerdings nicht unbedingt ausprobieren, da man damit das Dockstar zum Absturz bringt bzw. auch z.B. der entsprechende Treiber für den LM75 in der vorliegenden Version nicht vorhanden ist.&lt;br /&gt;
&lt;br /&gt;
== JTAG ==&lt;br /&gt;
[http://www.yourwarrantyisvoid.com/2010/09/08/dead-dockstar-resurrected-with-jtag/ dead-dockstar-resurrected-with-jtag]&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
== neue Betriebssyteme ==&lt;br /&gt;
*[[DockstarDebianSqueeze | Debian &#039;&#039;Squeeze&#039;&#039; installieren]]&lt;br /&gt;
&lt;br /&gt;
== Kernel kompilieren ==&lt;br /&gt;
Fertiger Kernel für das Dockstar&lt;br /&gt;
* http://www.onderka.com/2010/08/22/seagate-dockstar-kernel-2-6-33-5/&lt;br /&gt;
Beschreibung von Alexander Holler mit Patches, ...&lt;br /&gt;
* http://ahsoftware.de/dockstar/&lt;br /&gt;
Fertiges 2.6.35.4 Kernel für das Dockstar (nach &amp;quot;dockstarheavy.deb&amp;quot; suchen)&lt;br /&gt;
* http://forum.doozan.com/read.php?2,582&lt;br /&gt;
&lt;br /&gt;
= Ideen =&lt;br /&gt;
*SPDIF Ausgang&lt;br /&gt;
*I2C&lt;br /&gt;
*Mehr Ram/Flash&lt;/div&gt;</summary>
		<author><name>129.247.247.240</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-GCC-Tutorial&amp;diff=39743</id>
		<title>AVR-GCC-Tutorial</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-GCC-Tutorial&amp;diff=39743"/>
		<updated>2009-10-08T13:49:18Z</updated>

		<summary type="html">&lt;p&gt;129.247.247.240: /* Zugriff auf Register */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Vorwort =&lt;br /&gt;
&lt;br /&gt;
Dieses Tutorial soll den Einstieg in die Programmierung von Atmel [[AVR]]-Mikrocontrollern in der Programmiersprache [[C]] mit dem freien C-Compiler [[AVR-GCC]] aus der [http://gcc.gnu.org/ GNU Compiler Collection] erleichtern.&lt;br /&gt;
&lt;br /&gt;
Vorausgesetzt werden Grundkenntnisse der Progammiersprache C. Diese Kenntnisse kann man sich online erarbeiten, z. B. mit dem [http://www.schellong.de/c.htm C Tutorial von Helmut Schellong]. Nicht erforderlich sind Vorkenntnisse in der Programmierung von Mikrocontrollern, weder in Assembler noch in einer anderen Sprache. &lt;br /&gt;
&lt;br /&gt;
In diesem Text wird häufig auf die Standardbibliothek avr-libc verwiesen, für die es eine [http://www.nongnu.org/avr-libc/user-manual/index.html Online-Dokumentation] gibt, in der sich auch viele nützliche Informationen zum Compiler und zur Programmierung von AVR Controllern finden. Bei WinAVR gehört die avr-libc Dokumentation zum Lieferumfang und wird mitinstalliert.&lt;br /&gt;
&lt;br /&gt;
Der Compiler und die Standardbibliothek avr-libc werden stetig weiterentwickelt. Erläuterungen und Beispiele beziehen sich auf den C-Compiler avr-gcc ab Version 3.4 und die avr-libc ab Version 1.4.3. Die Unterschiede zu älteren Versionen werden im Haupttext und Anhang zwar erläutert, Anfängern sei jedoch empfohlen, die aktuellen Versionen zu nutzen (für MS-Windows: aktuelle Version des [[WinAVR]]-Pakets; für Linux gibt es CDK4AVR: http://cdk4avr.sf.net oder auch fertige Pakete bei verschiedenen Distributionen.). &lt;br /&gt;
&lt;br /&gt;
Das ursprüngliche Tutorial stammt von Christian Schifferle, viele neue Abschnitte und aktuelle Anpassungen von Martin Thomas.&lt;br /&gt;
&lt;br /&gt;
Dieses Tutorial ist in PDF-Form hier erhältlich (nicht immer auf aktuellem Stand):&lt;br /&gt;
[[Media:AVR-GCC-Tutorial.pdf]]&lt;br /&gt;
&lt;br /&gt;
= Benötigte Werkzeuge =&lt;br /&gt;
&lt;br /&gt;
Um eigene Programme für AVRs mittels avr-gcc/avr-libc zu erstellen und zu testen, wird folgende Hard- und Software benötigt:&lt;br /&gt;
&lt;br /&gt;
* Platine oder Versuchsaufbau für die Aufnahme eines AVR Controllers, der vom avr-gcc Compiler unterstützt wird (alle ATmegas und die meisten AT90, siehe Dokumentation der avr-libc für unterstützte Typen). Dieses Testboard kann durchaus auch selbst gelötet oder auf einem Steckbrett aufgebaut werden. Einige Registerbeschreibungen dieses Tutorials beziehen sich auf den inzwischen veralteten AT90S2313. Der weitaus größte Teil des Textes ist aber für alle Controller der AVR-Familie gültig. Brauchbare Testplattformen sind auch das [[STK500]] und der [[AVR Butterfly]] von Atmel. Weitere Infos findet man [[AVR#Starterkits|hier]].&lt;br /&gt;
&lt;br /&gt;
* Der avr-gcc Compiler und die avr-libc. Kostenlos erhältlich für nahezu alle Plattformen und Betriebssysteme. Für MS-Windows im Paket [[WinAVR]]; für Unix/Linux siehe auch Hinweise im Artikel [[AVR-GCC]].&lt;br /&gt;
&lt;br /&gt;
* Programmiersoftware und -[[AVR In System Programmer |hardware]] z. B. PonyProg (siehe auch: [[Pony-Prog Tutorial]]) oder [[AVRDUDE]] mit [[STK200]]-Dongle oder die von Atmel verfügbare Hard- und Software ([[STK500]], Atmel AVRISP, [[AVR-Studio]]).&lt;br /&gt;
&lt;br /&gt;
* Nicht unbedingt erforderlich, aber zur Simulation und zum Debuggen unter MS-Windows recht nützlich: [[AVR-Studio]] (siehe Artikel [[AVR-GCC-Tutorial/Exkurs_Makefiles|Exkurs: Makefiles]]).&lt;br /&gt;
&lt;br /&gt;
* Wer unter Windows und Linux gleichermassen entwickeln will, der sollte sich die [http://www.eclipse.org/ IDE Eclipse for C/C++ Developers] und das [http://avr-eclipse.sourceforge.net/wiki/index.php/The_AVR_Eclipse_Plugin AVR-Eclipse Plugin ] ansehen, beide sind unter Windows und Linux einfach zu installieren. Ebenfalls unter Linux und Windows verfügbar ist die Entwicklungsumgebung [http://www.codeblocks.org/ Code::Blocks] (aktuelle, stabile Versionen sind als Nightly Builds regelmäßig im [http://forums.codeblocks.org/ Forum] verfügbar). Innerhalb dieser Entwicklungsumgebung können ohne die Installation zusätzlicher Plugins &amp;quot;AVR-Projekte&amp;quot; angelegt werden. Für Linux gibt es auch noch das [http://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=25220&amp;amp;postdays=0&amp;amp;postorder=asc&amp;amp;start=0 KontrollerLab].&lt;br /&gt;
&lt;br /&gt;
= Was tun, wenn&#039;s nicht &amp;quot;klappt&amp;quot;? =&lt;br /&gt;
&lt;br /&gt;
* Herausfinden, ob es tatsächlich ein avr(-gcc) spezifisches Problem ist oder nur die eigenen C-Kenntnisse einer Auffrischung bedürfen. Allgemeine C-Fragen kann man eventuell &amp;quot;beim freundlichen Programmierer zwei Büro-, Zimmer- oder Haustüren weiter&amp;quot; loswerden. Ansonsten: [[C]]-Buch (gibt&#039;s auch &amp;quot;gratis&amp;quot; online) lesen.&lt;br /&gt;
&lt;br /&gt;
* Die [[AVR Checkliste]] durcharbeiten.&lt;br /&gt;
&lt;br /&gt;
* Die &#039;&#039;&#039;[http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc]&#039;&#039;&#039; lesen, vor allem (aber nicht nur) den Abschnitt Related Pages/&#039;&#039;&#039;Frequently Asked Questions&#039;&#039;&#039; = Oft gestellte Fragen (und Antworten dazu). Z.Zt leider nur in englischer Sprache verfügbar.&lt;br /&gt;
&lt;br /&gt;
* Den Artikel [[AVR-GCC]] in diesem Wiki lesen.&lt;br /&gt;
&lt;br /&gt;
* Das [http://www.mikrocontroller.net/forum/gcc GCC-Forum auf  www.mikrocontroller.net] nach vergleichbaren Problemen absuchen.&lt;br /&gt;
&lt;br /&gt;
* Das avr-gcc-Forum bei [http://www.avrfreaks.net AVRfreaks] nach vergleichbaren Problemen absuchen.&lt;br /&gt;
&lt;br /&gt;
* Das [http://lists.gnu.org/archive/html/avr-gcc-list/ Archiv der avr-gcc Mailing-Liste] nach vergleichbaren Problemen absuchen.&lt;br /&gt;
&lt;br /&gt;
* Nach Beispielcode suchen. Vor allem im &#039;&#039;Projects&#039;&#039;-Bereich von [http://www.avrfreaks.net AVRfreaks] (anmelden).&lt;br /&gt;
&lt;br /&gt;
* Google oder yahoo befragen schadet nie.&lt;br /&gt;
&lt;br /&gt;
* Bei Problemen mit der Ansteuerung interner AVR-Funktionen mit C-Code: das Datenblatt des Controllers lesen (ganz und am Besten zweimal). Datenblätter sind  auf den [http://www.atmel.com Atmel Webseiten] als pdf-Dateien verfügbar. Das komplette Datenblatt (complete) und nicht die Kurzfassung (summary) verwenden.&lt;br /&gt;
&lt;br /&gt;
* Die Beispieleprogramme im [[AVR-Tutorial]] sind zwar in AVR-Assembler verfasst, Erläuterungen und Vorgehensweisen sind aber auch auf C-Programme übertragbar.&lt;br /&gt;
&lt;br /&gt;
* Einen Beitrag in eines der Foren oder eine Mail an die Mailing-Liste schreiben. Dabei möglichst viel Information geben: Controller, Compilerversion, genutzte Bibliotheken, Ausschnitte aus dem Quellcode oder besser ein [http://www.mikrocontroller.net/topic/72767#598986 Testprojekt] mit allen notwendigen Dateien, um das Problem nachzuvollziehen, sowie genaue Fehlermeldungen bzw. Beschreibung des Fehlverhaltens. Bei Ansteuerung externer Geräte die Beschaltung beschreiben oder skizzieren (z. B. mit [http://www.tech-chat.de/ Andys ASCII Circuit]). Siehe dazu auch: &#039;&#039;&#039;[http://www.tty1.net/smart-questions_de.html &amp;quot;Wie man Fragen richtig stellt&amp;quot;]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Erzeugen von Maschinencode =&lt;br /&gt;
&lt;br /&gt;
Aus dem C-Quellcode erzeugt der avr-gcc Compiler (zusammen mit Hilfsprogrammen wie z.&amp;amp;nbsp;B. Präprozessor, Assembler und Linker) Maschinencode für den AVR-Controller. Üblicherweise liegt dieser Code dann im Intel Hex-Format vor (&amp;quot;Hex-Datei&amp;quot;). Die Programmiersoftware (z.&amp;amp;nbsp;B. [[AVRDUDE]], PonyProg oder AVRStudio/STK500-plugin) liest diese Datei ein und überträgt die enthaltene Information (den Maschinencode) in den Speicher des Controllers. Im Prinzip sind also &amp;quot;nur&amp;quot; der avr-gcc-Compiler (und wenige Hilfsprogramme) mit den &amp;quot;richtigen&amp;quot; Optionen aufzurufen, um aus C-Code eine &amp;quot;Hex-Datei&amp;quot; zu erzeugen. Grundsätzlich stehen dazu zwei verschiedene Ansätze zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
* Die Verwendung einer integrierten Entwicklungsumgebung (IDE = &#039;&#039;&#039;I&#039;&#039;&#039;ntegrated &#039;&#039;&#039;D&#039;&#039;&#039;evelopment &#039;&#039;&#039;E&#039;&#039;&#039;nvironment), bei der alle Einstellungen z.&amp;amp;nbsp;B. in Dialogboxen durchgeführt werden können. Unter Anderem kann AVRStudio ab Version 4.12 (kostenlos auf [http://www.atmel.com/ atmel.com]) zusammen mit WinAVR als integrierte Entwicklungsumgebung für den Compiler avr-gcc genutzt werden (dazu müssen AVRStudio und WinAVR auf dem Rechner installiert sein). Weitere IDEs (ohne Anspruch auf Vollständigkeit): [http://www.eclipse.org/ Eclipse for C/C++ Developers] (d.h. inkl. CDT) und das [http://avr-eclipse.sourceforge.net/wiki/index.php/The_AVR_Eclipse_Plugin AVR-Eclipse Plugin] (für diverse Plattformen, u.a. Linux und MS Windows, IDE und Plugin kostenlos), [http://sourceforge.net/projects/kontrollerlab KontrollerLab] (Linux/KDE, kostenlos). [http://www.atmanecl.com/EnglishSite/SoftwareEnglish.htm AtmanAvr] (MS Windows, relativ günstig), KamAVR (MS-Windows, kostenlos, wird augenscheinlich nicht mehr weiterentwickelt), [http://www.amctools.com/vmlab.htm VMLab] (MS Windows, ab Version 3.12 ebenfalls kostenlos). Integrierte Entwicklungsumgebungen unterscheiden sich stark in Ihrer Bedienung und stehen auch nicht für alle Plattformen zur Verfügung, auf denen der Compiler  ausführbar ist (z.&amp;amp;nbsp;B. AVRStudio nur für MS-Windows). Zur Anwendung des avr-gcc Compilers mit IDEs sei hier auf deren Dokumentation verwiesen. &lt;br /&gt;
&lt;br /&gt;
* Die Nutzung des Programms make mit passenden Makefiles. In den folgenden Abschnitten wird die Generierung von Maschinencode für einen AVR (&amp;quot;hex-Datei&amp;quot;) aus C-Quellcode (&amp;quot;c-Dateien&amp;quot;) anhand von &amp;quot;make&amp;quot; und den &amp;quot;Makefiles&amp;quot; näher erläutert. Viele der darin beschriebenen Optionen findet man auch im Konfigurationsdialog des avr-gcc-Plugins von AVRStudio (AVRStudio generiert ein makefile in einem Unterverzeichnis des Projektverzeichnisses). &lt;br /&gt;
&lt;br /&gt;
Beim Wechsel vom makefile-Ansatz nach WinAVR-Vorlage zu AVRStudio ist darauf zu achten, dass AVRStudio (Stand: AVRStudio Version 4.13) bei einem neuen Projekt die Optimierungsoption (vgl. Artikel [[AVR-GCC-Tutorial/Exkurs_Makefiles|AVR-GCC-Tutorial/Exkurs: Makefiles]], typisch: -Os) nicht einstellt und die mathematische Bibliothek der avr-libc (libm.a, Linker-Option -lm) nicht einbindet. (Hinweis: Bei Version 4.16 wird beides bereits gesetzt). Beides ist Standard bei Verwendung von makefiles nach WinAVR-Vorlage und sollte daher auch im Konfigurationsdialog des avr-gcc-Plugins von AVRStudio &amp;quot;manuell&amp;quot; eingestellt werden, um auch mit AVRStudio kompakten Code zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
= Einführungsbeispiel =&lt;br /&gt;
&lt;br /&gt;
Zum Einstieg ein kleines Beispiel, an dem die Nutzung des Compilers und der Hilfsprogramme (der sogenannten &#039;&#039;Toolchain&#039;&#039;) demonstriert wird. Detaillierte Erläuterungen folgen in den weiteren Abschnitten dieses Tutorials.&lt;br /&gt;
&lt;br /&gt;
Das Programm soll auf einem AVR Mikrocontroller einige Ausgänge ein- und andere ausschalten. Das Beispiel ist für einen ATmega16 programmiert ([http://www.atmel.com/dyn/resources/prod_documents/doc2466.pdf Datenblatt]), kann aber sinngemäß für andere Controller der AVR-Familie modifiziert werden. &lt;br /&gt;
&lt;br /&gt;
Zunächst der Quellcode der Anwendung, der in einer Text-Datei mit dem Namen &#039;&#039;main.c&#039;&#039; abgespeichert wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* Alle Zeichen zwischen Schrägstrich-Stern &lt;br /&gt;
   und Stern-Schrägstrich sind lediglich Kommentare */&lt;br /&gt;
&lt;br /&gt;
// Zeilenkommentare sind ebenfalls möglich&lt;br /&gt;
// alle auf die beiden Schrägstriche folgenden&lt;br /&gt;
// Zeichen einer Zeile sind Kommentar&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;          // (1)&lt;br /&gt;
&lt;br /&gt;
int main (void) {            // (2)&lt;br /&gt;
&lt;br /&gt;
   DDRB  = 0xff;             // (3)&lt;br /&gt;
   PORTB = 0x03;             // (4)&lt;br /&gt;
&lt;br /&gt;
   while(1) {                // (5a)&lt;br /&gt;
     /* &amp;quot;leere&amp;quot; Schleife*/  // (5b)&lt;br /&gt;
   }                         // (5c)&lt;br /&gt;
&lt;br /&gt;
   /* wird nie erreicht */&lt;br /&gt;
   return 0;                 // (6)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* In der mit (1) markierten Zeile wird eine so genannte Header-Datei eingebunden. In io.h sind die Registernamen definiert, die im späteren Verlauf genutzt werden.&lt;br /&gt;
&lt;br /&gt;
* Bei (2) beginnt das eigentliche Programm. Jedes C-Programm beginnt mit den Anweisungen in der Funktion main.&lt;br /&gt;
&lt;br /&gt;
* Die Anschlüsse eines AVR (&amp;quot;Beinchen&amp;quot;) werden zu Blöcken zusammengefasst, einen solchen Block bezeichnet man als Port. Beim ATmega16 hat jeder Port 8 Anschlüsse, bei kleineren AVRs können einem Port auch weniger als 8 Anschlüsse zugeordnet sein. Da per Definition (Datenblatt) alle gesetzten Bits in einem Richtungsregister den entsprechenden Anschluss auf Ausgang schalten, werden mit DDRB=0xff alle Anschlüsse des Ports B zu Ausgängen.&lt;br /&gt;
&lt;br /&gt;
* (4) stellt die Werte der Ausgänge ein. Die den ersten beiden Bits des Ports zugeordneten Anschlüsse (PB0 und PB1) werden 1, alle anderen Anschlüsse des Ports B (PB2-PB7) zu 0. Aktivierte Ausgänge (logisch 1 oder &amp;quot;high&amp;quot;) liegen auf Betriebsspannung (VCC, meist 5 Volt), nicht aktivierte Ausgänge führen 0 Volt (GND, Bezugspotential).&lt;br /&gt;
&lt;br /&gt;
* (5) ist die so genannte Hauptschleife (main-loop). Dies ist eine Programmschleife, welche kontinuierlich wiederkehrende Befehle enthält. In diesem Beispiel ist sie leer. Der Controller durchläuft die Schleife immer wieder, ohne dass etwas passiert (außer das Strom verbraucht wird). Eine solche Schleife ist notwendig, da es auf dem Controller kein Betriebssystem gibt, das nach Beendigung des Programmes die Kontrolle übernehmen könnte. Ohne diese Schleife wäre der Zustand des Controllers nach dem Programmende undefiniert.&lt;br /&gt;
&lt;br /&gt;
* (6) wäre das Programmende. Die Zeile ist nur aus Gründen der C-Kompatibilität enthalten: int main(void) besagt, dass die Funktion einen Wert zurückgibt. Die Anweisung wird aber nicht erreicht, da das Programm die Hauptschleife nie verlässt.&lt;br /&gt;
&lt;br /&gt;
Um diesen Quellcode in ein auf dem Controller lauffähiges Programm zu übersetzen, wird hier ein Makefile genutzt. Das verwendete Makefile findet sich auf der Seite [[Beispiel Makefile]] und basiert auf der Vorlage, die in WinAVR mitgeliefert wird und wurde bereits angepasst (Controllertyp ATmega16). Man kann das Makefile bearbeiten und an andere Controller anpassen oder sich mit dem Programm MFile menügesteuert ein Makefile &amp;quot;zusammenklicken&amp;quot;. Das Makefile speichert man unter dem Namen Makefile (ohne Endung) im selben Verzeichnis, in dem auch die Datei main.c mit dem Programmcode abgelegt ist. Detailliertere Erklärungen zur Funktion von Makefiles finden sich im folgenden Abschnitt [[AVR-GCC-Tutorial#Exkurs: Makefiles|Exkurs: Makefiles]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D:\tmp\gcc_tut\quickstart&amp;gt;dir&lt;br /&gt;
&lt;br /&gt;
 Verzeichnis von D:\tmp\gcc_tut\quickstart&lt;br /&gt;
&lt;br /&gt;
28.11.2006  22:53    &amp;lt;DIR&amp;gt;          .&lt;br /&gt;
28.11.2006  22:53    &amp;lt;DIR&amp;gt;          ..&lt;br /&gt;
28.11.2006  20:06               118 main.c&lt;br /&gt;
28.11.2006  20:03            16.810 Makefile&lt;br /&gt;
               2 Datei(en)         16.928 Bytes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun gibt man &#039;&#039;make all&#039;&#039; ein. Falls das mit WinAVR installierte Programmers Notepad genutzt wird, gibt es dazu einen Menüpunkt im Tools Menü. Sind alle Einstellungen korrekt, entsteht eine Datei main.hex, in der der Code für den AVR enthalten ist. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D:\tmp\gcc_tut\quickstart&amp;gt;make all&lt;br /&gt;
&lt;br /&gt;
-------- begin --------&lt;br /&gt;
avr-gcc (GCC) 3.4.6&lt;br /&gt;
Copyright (C) 2006 Free Software Foundation, Inc.&lt;br /&gt;
This is free software; see the source for copying conditions.  There is NO&lt;br /&gt;
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Compiling C: main.c&lt;br /&gt;
avr-gcc -c -mmcu=atmega16 -I. -gdwarf-2 -DF_CPU=1000000UL -Os -funsigned-char -f&lt;br /&gt;
unsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wundef&lt;br /&gt;
 -Wa,-adhlns=obj/main.lst  -std=gnu99 -Wundef -MD -MP -MF .dep/main.o.d main.c -&lt;br /&gt;
o obj/main.o&lt;br /&gt;
&lt;br /&gt;
Linking: main.elf&lt;br /&gt;
avr-gcc -mmcu=atmega16 -I. -gdwarf-2 -DF_CPU=1000000UL -Os -funsigned-char -funs&lt;br /&gt;
igned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wundef -W&lt;br /&gt;
a,-adhlns=obj/main.o  -std=gnu99 -Wundef -MD -MP -MF .dep/main.elf.d obj/main.o&lt;br /&gt;
--output main.elf -Wl,-Map=main.map,--cref    -lm&lt;br /&gt;
&lt;br /&gt;
Creating load file for Flash: main.hex&lt;br /&gt;
avr-objcopy -O ihex -R .eeprom main.elf main.hex&lt;br /&gt;
&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Inhalt der hex-Datei kann nun zum Controller übertragen werden. Dies kann z.&amp;amp;nbsp;B. über In-System-Programming (ISP) erfolgen, das im [[AVR-Tutorial: Equipment]] beschrieben ist. Makefiles nach der WinAVR/MFile-Vorlage sind für die Nutzung des Programms [[AVRDUDE]] vorbereitet. Wenn man den Typ und Anschluss des Programmiergerätes richtig eingestellt hat, kann mit &#039;&#039;make program&#039;&#039; die Übertragung mittels AVRDUDE gestartet werden. Jede andere Software, die hex-Dateien lesen und zu einem AVR übertragen kann (z.&amp;amp;nbsp;B. [[Pony-Prog_Tutorial|Ponyprog]], yapp, AVRStudio), kann natürlich ebenfalls genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Startet man nun den Controller (Reset-Taster oder Stromzufuhr aus/an), werden vom Programm die Anschlüsse PB0 und PB1 auf 1 gesetzt. Man kann mit einem Messgerät nun an diesem Anschluss die Betriebsspannung messen oder eine LED leuchten lassen (Anode an den Pin, Vorwiderstand nicht vergessen). An den Anschlüssen PB2-PB7 misst man 0 Volt. Eine mit der Anode mit einem dieser Anschlüsse verbundene LED leuchtet nicht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ganzzahlige (Integer) Datentypen =&lt;br /&gt;
&lt;br /&gt;
Bei der Programmierung von Mikrokontrollern ist die Definition einiger ganzzahliger Datentypen sinnvoll, an denen eindeutig die Bit-Länge abgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
Standardisierte Datentypen werden in der Header-Datei stdint.h definiert. &lt;br /&gt;
Zur Nutzung der standardisierten Typen bindet man die &amp;quot;Definitionsdatei&amp;quot; wie folgt ein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// ab avr-libc Version 1.2.0 möglich und empfohlen:&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// veraltet: #include &amp;lt;inttypes.h&amp;gt;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Einige der dort definierten Typen (avr-libc Version 1.0.4):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
typedef signed char        int8_t;&lt;br /&gt;
typedef unsigned char      uint8_t;&lt;br /&gt;
&lt;br /&gt;
typedef short              int16_t;&lt;br /&gt;
typedef unsigned short     uint16_t;&lt;br /&gt;
&lt;br /&gt;
typedef long               int32_t;&lt;br /&gt;
typedef unsigned long      uint32_t;&lt;br /&gt;
&lt;br /&gt;
typedef long long          int64_t;&lt;br /&gt;
typedef unsigned long long uint64_t;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* int8_t steht für einen 8-Bit Integer mit einem Wertebereich -128 bis +127.&lt;br /&gt;
&lt;br /&gt;
* uint8_t steht für einen 8-Bit Integer ohne Vorzeichen (unsigned int) mit einem Wertebereich von 0 bis 255&lt;br /&gt;
&lt;br /&gt;
* int16_t steht für einen 16-Bit Integer mit einem Wertebereich -32768 bis +32767.&lt;br /&gt;
&lt;br /&gt;
* uint16_t steht für einen 16-Bit Integer ohne Vorzeichen (unsigned int) mit einem Wertebereich von 0 bis 65535.&lt;br /&gt;
&lt;br /&gt;
Die Typen ohne vorangestelltes &#039;&#039;u&#039;&#039; werden als vorzeichenbehaftete Zahlen abgespeichert. Typen mit vorgestelltem &#039;&#039;u&#039;&#039; dienen der Ablage von postiven Zahlen (inkl. 0). Siehe dazu auch: [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Modules/(Standard) Integer Types.&lt;br /&gt;
&lt;br /&gt;
= Bitfelder =&lt;br /&gt;
&lt;br /&gt;
Beim Programmieren von Mikrocontrollern muss auf jedes Byte oder sogar auf&lt;br /&gt;
jedes Bit geachtet werden. Oft müssen wir in einer Variablen lediglich den&lt;br /&gt;
Zustand 0 oder 1 speichern. Wenn wir nun zur Speicherung eines einzelnen Wertes&lt;br /&gt;
den kleinsten bekannten Datentypen, nämlich &#039;&#039;&#039;unsigned char&#039;&#039;&#039;, nehmen, dann&lt;br /&gt;
verschwenden wir 7 Bits, da ein &#039;&#039;&#039;unsigned char&#039;&#039;&#039; ja 8 Bits breit ist.&lt;br /&gt;
&lt;br /&gt;
Hier bietet uns die Programmiersprache C ein mächtiges Werkzeug an, mit dessen&lt;br /&gt;
Hilfe wir 8 Bits in eine einzelne Bytevariable zusammenfassen und (fast) wie&lt;br /&gt;
8 einzelne Variablen ansprechen können. Die Rede ist von so genannten Bitfeldern. Diese werden als Strukturelemente definiert. Sehen wir uns dazu doch am besten gleich ein Beispiel an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
struct {&lt;br /&gt;
   unsigned bStatus_1:1; // 1 Bit für bStatus_1&lt;br /&gt;
   unsigned bStatus_2:1; // 1 Bit für bStatus_2&lt;br /&gt;
   unsigned bNochNBit:1; // Und hier noch mal ein Bit&lt;br /&gt;
   unsigned b2Bits:2;    // Dieses Feld ist 2 Bits breit&lt;br /&gt;
   // All das hat in einer einzigen Byte-Variable Platz.&lt;br /&gt;
   // die 3 verbleibenden Bits bleiben ungenutzt&lt;br /&gt;
} x;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Zugriff auf ein solches Feld erfolgt nun wie beim Strukturzugriff bekannt&lt;br /&gt;
über den Punkt- oder den Dereferenzierungs-Operator:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
x.bStatus_1 = 1;&lt;br /&gt;
x.bStatus_2 = 0;&lt;br /&gt;
x.b2Bits = 3;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bitfelder sparen Platz im RAM, zu Lasten von Platz im Flash, verschlechtern aber unter Umständen die Les- und Wartbarkeit des Codes. Anfängern wird deshalb geraten, ein &amp;quot;ganzes&amp;quot; Byte (uint8_t) zu nutzen, auch wenn nur ein Bitwert gespeichert werden soll.&lt;br /&gt;
&lt;br /&gt;
= Grundsätzlicher Programmaufbau eines &amp;amp;micro;C-Programms =&lt;br /&gt;
&lt;br /&gt;
Wir unterscheiden zwischen 2 verschiedenen Methoden, um ein&lt;br /&gt;
Mikrocontroller-Programm zu schreiben, und zwar völlig unabhängig davon, in&lt;br /&gt;
welcher Programmiersprache das Programm geschrieben wird.&lt;br /&gt;
&lt;br /&gt;
== Sequentieller Programmablauf ==&lt;br /&gt;
&lt;br /&gt;
Bei dieser Programmiertechnik wird eine Endlosschleife programmiert, welche im&lt;br /&gt;
Wesentlichen immer den gleichen Aufbau hat:&lt;br /&gt;
&lt;br /&gt;
[[Image:Sequentielle Programme.gif]]&lt;br /&gt;
&lt;br /&gt;
== Interruptgesteuerter Programmablauf ==&lt;br /&gt;
&lt;br /&gt;
Bei dieser Methode werden beim Programmstart zuerst die gewünschten Interruptquellen aktiviert und dann in eine Endlosschleife gegangen, in welcher Dinge erledigt werden können, welche nicht zeitkritisch sind. Wenn ein Interrupt ausgelöst wird, so wird automatisch die zugeordnete Interruptfunktion ausgeführt.&lt;br /&gt;
&lt;br /&gt;
[[Image:Interrupt Programme.gif]]&lt;br /&gt;
&lt;br /&gt;
= Zugriff auf Register =&lt;br /&gt;
&lt;br /&gt;
Die AVR-Controller verfügen über eine Vielzahl von Register. Die meisten&lt;br /&gt;
davon sind sogenannte Schreib-/Leseregister. Das heißt, das Programm kann die&lt;br /&gt;
Inhalte der Register sowohl auslesen als auch beschreiben.&lt;br /&gt;
&lt;br /&gt;
Register haben einen besonderen Stellenwert bei den AVR Controllern. Sie dienen dem Zugriff auf die Ports und die Schnittstellen des Controllers. Wir unterscheiden zwischen 8-Bit und 16-Bit Registern. Vorerst behandeln wir mal&lt;br /&gt;
die 8-Bit Register.&lt;br /&gt;
&lt;br /&gt;
Einzelne Register sind bei allen AVRs vorhanden, andere wiederum nur bei bestimmten Typen. So sind beispielsweise die Register, welche für den Zugriff auf den UART notwendig sind, selbstverständlich nur bei denjenigen Modellen vorhanden, welche über einen integrierten Hardware UART bzw. USART verfügen.&lt;br /&gt;
&lt;br /&gt;
Die Namen der Register sind in den Headerdateien zu den entsprechenden AVR-Typen definiert. Dazu muss man den Namen der controllerspezifischen Headerdatei nicht kennen. Es reicht aus, die allgemeine Headerdatei &#039;&#039;avr/io.h&#039;&#039; einzubinden:&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;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist im Makefile der MCU-Typ z.&amp;amp;nbsp;B. mit dem Inhalt atmega8 definiert (und wird somit per -mmcu=atmega8 an den Compiler übergeben), wird beim Einlesen der io.h-Datei implizit (&amp;quot;automatisch&amp;quot;) auch die iom8.h-Datei mit den Register-Definitionen für den ATmega8 eingelesen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Wohl besser als Anhang - spaeter... --&amp;gt;&lt;br /&gt;
Intern wird diese &amp;quot;Automatik&amp;quot; wie folgt realisiert: Der Controllertyp wird dem Compiler als Parameter übergeben (vgl. &#039;&#039;avr-gcc -c -mmcu=atmega16 [...]&#039;&#039; im Einführungsbeispiel). Wird ein Makefile nach der WinAVR/mfile-Vorlage verwendet, setzt man die Variable &#039;&#039;MCU&#039;&#039;, der Inhalt dieser Variable wird dann an passender Stelle für die Compilerparameter verwendet. Der Compiler definiert intern eine dem mmcu-Parameter zugeordnete &amp;quot;Variable&amp;quot; (genauer: ein Makro) mit dem Namen des Controllers, vorangestelltem &#039;&#039;__AVR_&#039;&#039; und angehängten Unterstrichen (z.B. wird bei &#039;&#039;-mmcu=atmega16&#039;&#039; das Makro &#039;&#039;__AVR_ATmega16__&#039;&#039; definiert). Beim Einbinden der Header-Datei &#039;&#039;avr/io.h&#039;&#039; wird geprüft, ob das jeweilige Makro definiert ist und die zum Controller passende Definitionsdatei eingelesen. Zur Veranschaulichung einige Ausschnitte aus einem Makefile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
# MCU Type (&amp;quot;name&amp;quot;) setzen:&lt;br /&gt;
MCU = atmega16&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
[...]&lt;br /&gt;
## Verwendung des Inhalts von MCU (hier atmega16) fuer die &lt;br /&gt;
## Compiler- und Assembler-Parameter&lt;br /&gt;
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)&lt;br /&gt;
ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)&lt;br /&gt;
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
[...]&lt;br /&gt;
## Aufruf des Compilers:&lt;br /&gt;
## mit den Parametern ($(ALL_CFLAGS) ist -mmcu=$(MCU)[...] = -mmcu=atmega16[...]&lt;br /&gt;
$(OBJDIR)/%.o : %.c&lt;br /&gt;
	@echo&lt;br /&gt;
	@echo $(MSG_COMPILING) $&amp;lt;&lt;br /&gt;
	$(CC) -c $(ALL_CFLAGS) $&amp;lt; -o $@ &lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da --mmcu=atmega16 übergeben wurde, wird __AVR_ATmega16__ definiert und kann in avr/io.h zur Fallunterscheidung genutzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// avr/io.h &lt;br /&gt;
// (bei WinAVR-Standardinstallation in C:\WinAVR\avr\include\avr)&lt;br /&gt;
[...]&lt;br /&gt;
#if defined (__AVR_AT94K__)&lt;br /&gt;
#  include &amp;lt;avr/ioat94k.h&amp;gt;&lt;br /&gt;
// [...]&lt;br /&gt;
#elif defined (__AVR_ATmega16__)&lt;br /&gt;
// da __AVR_ATmega16__ definiert ist, wird avr/iom16.h eingebunden:&lt;br /&gt;
#  include &amp;lt;avr/iom16.h&amp;gt;&lt;br /&gt;
// [...]&lt;br /&gt;
#else&lt;br /&gt;
#  if !defined(__COMPILING_AVR_LIBC__)&lt;br /&gt;
#    warning &amp;quot;device type not defined&amp;quot;&lt;br /&gt;
#  endif&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Beispiele in den folgenden Abschnitten demonstrieren den Zugriff auf Register anhand der Register für I/O-Ports (PORTx, DDRx, PINx), die Vorgehensweise ist jedoch für alle Register (z.B. die des UART, ADC, SPI) analog.&lt;br /&gt;
&lt;br /&gt;
== Schreiben in Register ==&lt;br /&gt;
&lt;br /&gt;
Zum Schreiben kann man Register einfach wie eine Variable setzen. In Quellcodes, die für ältere Versionen des avr-gcc/der avr-libc entwickelt wurden, erfolgt der Schreibzugriff über die Funktion outp(). Aktuelle Versionen des Compilers unterstützen den Zugriff nun direkt und outp() ist nicht mehr erforderlich.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&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;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    /* Setzt das Richtungsregister des Ports A auf 0xff &lt;br /&gt;
       (alle Pins als Ausgang, vgl. Abschnitt Zugriff auf Ports): */&lt;br /&gt;
    DDRA = 0xff;    &lt;br /&gt;
&lt;br /&gt;
    /* Setzt PortA auf 0x03, Bit 0 und 1 &amp;quot;high&amp;quot;, restliche &amp;quot;low&amp;quot;: */&lt;br /&gt;
    PORTA = 0x03;   &lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
    // Setzen der Bits 0,1,2,3 und 4&lt;br /&gt;
    // Binär 00011111 = Hexadezimal 1F&lt;br /&gt;
    DDRB = 0x1F;    /* direkte Zuweisung - unübersichtlich */&lt;br /&gt;
&lt;br /&gt;
    /* Ausführliche Schreibweise: identische Funktionalität, mehr Tipparbeit&lt;br /&gt;
       aber übersichtlicher und selbsterklärend: */&lt;br /&gt;
    DDRB = (1 &amp;lt;&amp;lt; DDB0) | (1 &amp;lt;&amp;lt; DDB1) | (1 &amp;lt;&amp;lt; DDB2) | (1 &amp;lt;&amp;lt; DDB3) | (1 &amp;lt;&amp;lt; DDB4);&lt;br /&gt;
    // (Hinweis: für Einsteiger (wie mich) nicht selbsterklärend. Was macht |, was macht &amp;lt;&amp;lt;, gibt es auch DDB5-7?)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die ausführliche Schreibweise sollte bevorzugt verwendet werden, da dadurch die Zuweisungen selbsterklärend sind und somit der Code leichter nachvollzogen werden kann. Atmel verwendet sie auch bei Beispielen in Datenblätten und in den allermeisten Quellcodes zu Application-Notes.&lt;br /&gt;
&lt;br /&gt;
Der gcc C-Compiler (genauer der Präprozessor) unterstützt ab Version 4.3.0 Konstanten im Binärformat, z.B. DDRB&amp;amp;nbsp;=&amp;amp;nbsp;0b00011111 (für WinAVR wurden schon ältere Versionen des gcc entsprechend angepasst). Diese Schreibweise ist jedoch nicht standardkonform und man sollte sie daher insbesondere dann nicht verwenden, wenn Code mit anderen ausgetauscht oder mit anderen Compilern bzw. älteren Versionen des gcc genutzt werden soll.&lt;br /&gt;
&lt;br /&gt;
== Verändern von Registerinhalten ==&lt;br /&gt;
&lt;br /&gt;
Einzelne Bits setzt und löscht man &amp;quot;Standard-C-konform&amp;quot; mittels logischer (Bit-) Operationen. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 x |= (1 &amp;lt;&amp;lt; Bitnummer);  // Hiermit wird ein Bit in x gesetzt&lt;br /&gt;
 x &amp;amp;= ~(1 &amp;lt;&amp;lt; Bitnummer); // Hiermit wird ein Bit in x geloescht&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es wird jeweils nur der Zustand des angegebenen Bits geändert, der vorherige Zustand der anderen Bits bleibt erhalten. &lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
#define MEINBIT 2&lt;br /&gt;
...&lt;br /&gt;
PORTA |= (1 &amp;lt;&amp;lt; MEINBIT);    /* setzt Bit 2 an PortA auf 1 */&lt;br /&gt;
PORTA &amp;amp;= ~(1 &amp;lt;&amp;lt; MEINBIT);   /* loescht Bit 2 an PortA */&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit dieser Methode lassen sich auch mehrere Bits eines Registers gleichzeitig setzen und löschen.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
DDRA &amp;amp;= ~( (1&amp;lt;&amp;lt;PA0) | (1&amp;lt;&amp;lt;PA3) );  /* PA0 und PA3 als Eingaenge */&lt;br /&gt;
PORTA |= (1&amp;lt;&amp;lt;PA0) | (1&amp;lt;&amp;lt;PA3);      /* Interne Pull-Up fuer beide einschalten */&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Quellcodes, die für ältere Version den des avr-gcc/der avr-libc entwickelt wurden, werden einzelne Bits mittels der Funktionen sbi und cbi gesetzt bzw. gelöscht. Beide Funktionen sind nicht mehr erforderlich.&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* [[Bitmanipulation]]&lt;br /&gt;
* [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Modules/Special Function Registers&lt;br /&gt;
&lt;br /&gt;
== Lesen aus Registern ==&lt;br /&gt;
&lt;br /&gt;
Zum Lesen kann man auf Register einfach wie auf eine Variable zugreifen. In Quellcodes, die für ältere Versionen des avr-gcc/der avr-libc entwickelt wurden, erfolgt der Lesezugriff über die Funktion inp(). Aktuelle Versionen des Compilers unterstützen den Zugriff nun direkt und inp() ist nicht mehr erforderlich.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&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;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
uint8_t foo;&lt;br /&gt;
&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    /* kopiert den Status der Eingabepins an PortB &lt;br /&gt;
       in die Variable foo: */&lt;br /&gt;
    foo = PINB;    &lt;br /&gt;
    //...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Abfrage der Zustände von Bits erfolgt durch Einlesen des gesamten Registerinhalts und ausblenden der Bits deren Zustand nicht von Interesse ist. Einige Beispiele zum Prüfen ob Bits gesetzt oder gelöscht sind:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define MEINBIT0 0 &lt;br /&gt;
#define MEINBIT2 2&lt;br /&gt;
&lt;br /&gt;
uint8_t i;&lt;br /&gt;
&lt;br /&gt;
extern test1();&lt;br /&gt;
&lt;br /&gt;
// Funkion test1 aufrufen, wenn Bit 0 in Register PINA gesetzt (1) ist&lt;br /&gt;
i = PINA;         // Inhalt in Arbeitsvariable&lt;br /&gt;
i = i &amp;amp; 0x01;     // alle Bits bis auf Bit 0 ausblenden (logisches und)&lt;br /&gt;
                  // falls das Bit gesetzt war, hat i den Inhalt 1&lt;br /&gt;
if ( i != 0 ) {   // Ergebnis ungleich 0 (wahr)? &lt;br /&gt;
  test1();         // dann muss Bit 0 in i gesetzt sein -&amp;gt; Funktion aufrufen&lt;br /&gt;
}&lt;br /&gt;
// verkürzt:&lt;br /&gt;
if ( ( PINA &amp;amp; 0x01 ) != 0 ) {&lt;br /&gt;
  test1();&lt;br /&gt;
}&lt;br /&gt;
// nochmals verkürzt:&lt;br /&gt;
if ( PINA &amp;amp; 0x01 ) {&lt;br /&gt;
  test1();&lt;br /&gt;
}&lt;br /&gt;
// mit definierter Bitnummer:&lt;br /&gt;
if ( PINA &amp;amp; ( 1 &amp;lt;&amp;lt; MEINBIT0 ) ) {&lt;br /&gt;
  test1();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Funktion aufrufen, wenn Bit 0 oder Bit 2 gesetzt ist. (Bit 0 und 2 also Wert 5) &lt;br /&gt;
// (Bedenke: Bit 0 hat Wert 1, Bit 1 hat Wert 2 und Bit 2 hat Wert 4)&lt;br /&gt;
if ( PINA &amp;amp; 0x05 ) {&lt;br /&gt;
  test1();  // Vergleich &amp;lt;&amp;gt; 0 (wahr), also muss Bit 0 oder 2 gesetzt sein&lt;br /&gt;
}&lt;br /&gt;
// mit definierten Bitnummern:&lt;br /&gt;
if ( PINA &amp;amp; ( ( 1 &amp;lt;&amp;lt; MEINBIT0 ) | ( 1 &amp;lt;&amp;lt; MEINBIT2 ) ) ) {&lt;br /&gt;
  test1();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Funktion aufrufen, wenn Bit 0 und Bit 2 gesetzt sind&lt;br /&gt;
if ( ( PINA &amp;amp; 0x05 ) == 0x05 ) {  // nur wahr, wenn beide Bits gesetzt&lt;br /&gt;
  test1();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Funktion test2() aufrufen, wenn Bit 0 gelöscht (0) ist&lt;br /&gt;
i = PINA;        // einlesen in temporäre Variable&lt;br /&gt;
i = i &amp;amp; 0x01;    // maskieren von Bit 0&lt;br /&gt;
if ( i == 0 ) {  // Vergleich ist wahr, wenn Bit 0 nicht gesetzt ist&lt;br /&gt;
  test2();&lt;br /&gt;
}&lt;br /&gt;
// analog mit !-Operator (not)&lt;br /&gt;
if ( !i ) {&lt;br /&gt;
  test2();&lt;br /&gt;
}&lt;br /&gt;
// nochmals verkürzt:&lt;br /&gt;
if ( !( PINA &amp;amp; 0x01 ) ) {&lt;br /&gt;
  test2();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die AVR-Bibliothek (avr-libc) stellt auch Funktionen (Makros) zur Abfrage eines einzelnen Bits eines Registers zur Verfügung, diese sind bei anderen Compilern meist nicht verfügbar (können aber dann einfach durch Makros &amp;quot;nachgerüstet&amp;quot; werden).&lt;br /&gt;
&lt;br /&gt;
;bit_is_set (&amp;lt;Register&amp;gt;,&amp;lt;Bitnummer&amp;gt;): Die Funktion &#039;&#039;bit_is_set&#039;&#039; prüft, ob ein Bit gesetzt ist. Wenn das Bit gesetzt ist, wird ein Wert ungleich 0 zurückgegeben. Genau genommen ist es die Wertigkeit des abgefragten Bits, also 1 für Bit0, 2 für Bit1, 3 für Bit2 etc.&lt;br /&gt;
&lt;br /&gt;
;bit_is_clear (&amp;lt;Register&amp;gt;,&amp;lt;Bitnummer&amp;gt;): Die Funktion &#039;&#039;bit_is_clear&#039;&#039; prüft, ob ein Bit gelöscht ist. Wenn das Bit gelöscht ist, also auf 0 ist, wird ein Wert ungleich 0 zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
Die Funktionen (eigentlich Makros) bit_is_clear bzw. bit_is_set sind nicht erforderlich, man kann und sollte C-Syntax verwenden, die universell verwendbar und portabel ist. Siehe auch [[Bitmanipulation]].&lt;br /&gt;
&lt;br /&gt;
== Warten auf einen bestimmten Zustand ==&lt;br /&gt;
&lt;br /&gt;
Es gibt in der Bibliothek avr-libc Funktionen, die warten, bis ein bestimmter Zustand eines Bits erreicht ist. Es ist allerdings normalerweise eine eher unschöne Programmiertechnik, da in diesen Funktionen &amp;quot;blockierend&amp;quot; gewartet wird. Der Programmablauf bleibt also an dieser Stelle stehen, bis das maskierte Ereignis erfolgt ist. Setzt man den Watchdog ein, muss man darauf achten, dass dieser auch noch getriggert wird (Zurücksetzen des Watchdogtimers). &lt;br /&gt;
&lt;br /&gt;
Die Funktion &#039;&#039;&#039;loop_until_bit_is_set&#039;&#039;&#039; wartet in einer Schleife, bis das definierte Bit gesetzt ist. Wenn das Bit beim Aufruf der Funktion bereits gesetzt ist, wird die Funktion sofort wieder verlassen. Das niederwertigste Bit hat die Bitnummer 0. &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;
...&lt;br /&gt;
&lt;br /&gt;
/* Warten bis Bit Nr. 2 (das dritte Bit) in Register PINA gesetzt (1) ist */&lt;br /&gt;
&lt;br /&gt;
#define WARTEPIN PINA&lt;br /&gt;
#define WARTEBIT PA2&lt;br /&gt;
&lt;br /&gt;
// mit der avr-libc Funktion:&lt;br /&gt;
loop_until_bit_is_set(WARTEPIN, WARTEBIT);&lt;br /&gt;
&lt;br /&gt;
// dito in &amp;quot;C-Standard&amp;quot;:&lt;br /&gt;
// Durchlaufe die (leere) Schleife solange das WARTEBIT in Register WARTEPIN&lt;br /&gt;
// _nicht_ ungleich 0 (also 0) ist.&lt;br /&gt;
while ( !(WARTEPIN &amp;amp; (1 &amp;lt;&amp;lt; WARTEBIT)) ) ;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktion &#039;&#039;&#039;loop_until_bit_is_clear&#039;&#039;&#039; wartet in einer Schleife, bis das definierte Bit gelöscht ist. Wenn das Bit beim Aufruf der Funktion bereits gelöscht ist, wird die Funktion sofort wieder verlassen.&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;
...&lt;br /&gt;
&lt;br /&gt;
/* Warten bis Bit Nr. 4 (das fuenfte Bit) in Register PINB geloescht (0) ist */&lt;br /&gt;
#define WARTEPIN PINB&lt;br /&gt;
#define WARTEBIT PB4&lt;br /&gt;
&lt;br /&gt;
// avr-libc-Funktion:&lt;br /&gt;
loop_until_bit_is_clear(WARTEPIN, WARTEBIT);&lt;br /&gt;
&lt;br /&gt;
// dito in &amp;quot;C-Standard&amp;quot;:&lt;br /&gt;
// Durchlaufe die (leere) Schleife solange das WARTEBIT in Register WARTEPIN&lt;br /&gt;
// gesetzt (1) ist &lt;br /&gt;
while ( WARTEPIN &amp;amp; (1&amp;lt;&amp;lt;WARTEBIT) ) ;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Universeller und auch auf andere Plattformen besser übertragbar ist die Verwendung von C-Standardoperationen.&lt;br /&gt;
&lt;br /&gt;
Siehe auch: &lt;br /&gt;
* [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Modules/Special Function Registers&lt;br /&gt;
* [[Bitmanipulation]]&lt;br /&gt;
&lt;br /&gt;
== 16-Bit Register (ADC, ICR1, OCR1, TCNT1, UBRR) ==&lt;br /&gt;
&lt;br /&gt;
Einige der Portregister in den AVR-Controllern sind 16 Bit breit. Im Datenblatt sind diese Register üblicherweise mit dem Suffix &amp;quot;L&amp;quot; (LSB) und &amp;quot;H&amp;quot; (MSB) versehen. Die avr-libc definiert zusätzlich die meisten dieser Variablen die Bezeichnung ohne &amp;quot;L&amp;quot; oder &amp;quot;H&amp;quot;. Auf diese kann direkt zugewiesen bzw. zugegriffen werden. Die Konvertierung von 16-bit Wort nach 2*8-bit Byte erfolgt intern.&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;stdint.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
uint16_t foo;&lt;br /&gt;
&lt;br /&gt;
foo=ADC; /* setzt die Wort-Variable foo auf den Wert der letzten AD-Wandlung */&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls ben&amp;amp;ouml;tigt, kann eine 16-Bit Variable auch recht einfach manuell in ihre zwei 8-Bit Bestandteile zerlegt werden. Folgendes Beispiel demonstriert dies anhand des pseudo- 16-Bit Registers UBRR.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* Diese Variante ist normal am effizientesten */&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
#define F_CPU 3686400&lt;br /&gt;
#endif&lt;br /&gt;
#define UART_BAUD_RATE 9600&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
        uint16_t i16;&lt;br /&gt;
        struct {&lt;br /&gt;
                uint8_t i8l;&lt;br /&gt;
                uint8_t i8h;&lt;br /&gt;
        };&lt;br /&gt;
} convert16to8;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
convert16to8 baud;&lt;br /&gt;
baud.i16 = F_CPU / (UART_BAUD_RATE * 16L) -1;&lt;br /&gt;
UBRRH = baud.i8h;&lt;br /&gt;
UBRRL = baud.i8l;&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
/* Alternative 1:*/&lt;br /&gt;
#include &amp;lt;inttypes.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
uint16_t wFoo16;&lt;br /&gt;
uint8_t bFooLow, bFooHigh;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
wFoo16   = 0xAA55;                 /* zu &amp;quot;zerlegende&amp;quot; 16Bit-Integer */&lt;br /&gt;
bFooHigh = (uint8_t)(wFoo16 &amp;gt;&amp;gt; 8); /* MS-Byte */&lt;br /&gt;
bFooLow  = (uint8_t)(wFoo16);      /* LS-Byte */&lt;br /&gt;
&lt;br /&gt;
/* Alternative 2:*/&lt;br /&gt;
&lt;br /&gt;
#define us0(Data) (*((unsigned char *)(&amp;amp;Data)))&lt;br /&gt;
#define us1(Data) (*((unsigned char *)((&amp;amp;Data)+1)))&lt;br /&gt;
bFooHigh = us1(wFoo16);&lt;br /&gt;
bFoolow  = us0(wFoo16);&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einigen AVR-Typen (z.B. ATmega8, ATMega16) teilen sich UBRRH und UCSRC die gleiche Memory-Adresse. Damit der AVR trotzdem zwischen den beiden Registern unterscheiden kann, bestimmt das Bit7 (URSEL) welches Register tats&amp;amp;auml;chlich beschrieben werden soll. &#039;&#039;1000 0011&#039;&#039; (0x83) adressiert demnach UCSRC und &amp;amp;uuml;bergibt den Wert &#039;&#039;3&#039;&#039; und &#039;&#039;0000 0011&#039;&#039; (0x3) adressiert UBRRH und &amp;amp;uuml;bergibt ebenfalls den Wert &#039;&#039;3&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
Speziell bei den &#039;&#039;&#039;16-Bit-Timern&#039;&#039;&#039; und auch beim &#039;&#039;&#039;ADC&#039;&#039;&#039; ist es bei allen Zugriffen auf Datenregister erforderlich, dass diese Daten synchronisiert sind. Wenn z.B. bei einem 16-Bit-Timer das High-Byte des Zählregisters gelesen wurde und vor dem Lesezugriff auf das Low-Byte ein Überlauf des Low-Bytes stattfindet, erhält man einen völlig unsinnigen Wert. Auch die Compare-Register müssen synchron geschrieben werden, da es ansonsten zu unerwünschten Compare-Ereignissen kommen kann. &lt;br /&gt;
&lt;br /&gt;
Beim ADC besteht das Problem darin, dass zwischen den Zugriffen auf die beiden Teilregister eine Wandlung beendet werden kann und der ADC ein neues Ergebnis in ADCL und ADCH schreiben will, wodurch High- und Low-Byte nicht zusammenpassen.&lt;br /&gt;
&lt;br /&gt;
Um diese Datenmüllproduktion zu verhindern, gibt es in beiden Fällen eine Synchronisation, die jeweils durch den Zugriff auf das Low-Byte ausgelöst wird:&lt;br /&gt;
* Bei den Timer-Registern (das gilt für alle TCNT-, OCR- und ICR-Register bei den 16-Bit-Timern) wird bei einem &#039;&#039;&#039;Lesezugriff&#039;&#039;&#039; auf das Low-Byte automatisch das High-Byte in ein temporäres Register, das ansonsten nach außen nicht sichtbar ist, geschoben. Greift man nun &#039;&#039;anschließend&#039;&#039; auf das High-Byte zu, dann wird eben dieses temporäre Register gelesen.&lt;br /&gt;
* Bei einem &#039;&#039;&#039;Schreibzugriff&#039;&#039;&#039; auf eines der genannten Register wird das High-Byte in besagtem temporären Register zwischengespeichert und erst beim Schreiben des Low-Bytes werden &#039;&#039;beide&#039;&#039; gleichzeitig in das eigentliche Register übernommen.&lt;br /&gt;
&lt;br /&gt;
Das bedeutet für die Reihenfolge beim &#039;&#039;&#039;Lesezugriff: Erst Low-Byte, dann High-Byte&#039;&#039;&#039; und für den &#039;&#039;&#039;Schreibzugriff: Erst High-Byte, dann Low-Byte&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Des weiteren ist zu beachten, dass es für all diese 16-Bit-Register nur ein einziges temporäres Register gibt, so dass das Auftreten eines Interrupts, in dessen Handler ein solches Register manipuliert wird, bei einem durch ihn unterbrochenen Zugriff i.d.R. zu Datenmüll führt. &#039;&#039;&#039;16-Bit-Zugriffe sind generell nicht atomar!&#039;&#039;&#039; Wenn mit &#039;&#039;&#039;Interrupts&#039;&#039;&#039; gearbeitet wird, kann es erforderlich sein, vor einem solchen Zugriff auf ein 16-Bit-Register die Interrupt-Bearbeitung zu deaktivieren.&lt;br /&gt;
&lt;br /&gt;
Beim ADC-Datenregister ADCH/ADCL ist die Synchronisierung anders gelöst. Hier wird beim Lesezugriff (ADCH/ADCL sind logischerweise Read-only) auf das Low-Byte ADCL beide Teilregister für Zugriffe seitens des ADC so lange gesperrt, bis das High-Byte ADCH ausgelesen wurde. Dadurch kann der ADC nach einem Zugriff auf ADCL keinen neuen Wert in ADCH/ADCL ablegen, bis ADCH gelesen wurde. Ergebnisse von Wandlungen, die zwischen einem Zugriff auf ADCL und ADCH beendet werden, gehen verloren!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nach einem Zugriff auf ADCL muss grundsätzlich ADCH gelesen werden!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In beiden Fällen (also sowohl bei den Timern als auch beim ADC) werden vom C-Compiler 16-Bit-Pseudo-Register zur Verfügung gestellt (z.B. TCNT1H/TCNT1L -&amp;gt; TCNT1, ADCH/ADCL -&amp;gt; ADC bzw. ADCW), bei deren Verwendung der Compiler automatisch die richtige Zugriffsreihenfolge regelt. &#039;&#039;&#039;In C-Programmen sollten grundsätzlich diese 16-Bit-Register verwendet werden&#039;&#039;&#039;. Sollte trotzdem ein Zugriff auf ein Teilregister erforderlich sein, sind obige Angaben zu berücksichtigen.&lt;br /&gt;
&lt;br /&gt;
Es ist darauf zu achten, dass auch ein Zugriff auf die 16-Bit-Register vom Compiler in zwei 8-Bit-Zugriffe aufgeteilt wird und dementsprechend genauso nicht-atomar ist wie die Einzelzugriffe. Auch hier gilt, dass u.U. die Interrupt-Bearbeitung gesperrt werden muss, um Datenmüll zu vermeiden.&lt;br /&gt;
&lt;br /&gt;
Beim ADC gibt es für den Fall, dass eine Auflösung von 8 Bit ausreicht, die Möglichkeit, das Ergebnis &amp;quot;linksbündig&amp;quot; in ADCH/ADCL auszurichten, so dass die relevanten 8 MSB in ADCH stehen. In diesem Fall muss bzw. sollte nur ADCH ausgelesen werden.&lt;br /&gt;
&lt;br /&gt;
ADC und ADCW sind unterschiedliche Bezeichner für das selbe Registerpaar. Üblicherweise kann man in C-Programmen ADC verwenden, was analog zu den anderen 16-Bit-Registern benannt ist. ADCW (ADC Word) existiert nur deshalb, weil die Headerdateien auch für Assembler vorgesehen sind und es bereits einen Assembler-Befehl namens &#039;&#039;adc&#039;&#039; gibt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Im Umgang mit 16-Bit Registern siehe auch:&lt;br /&gt;
* [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Related Pages/Frequently Asked Questions/Nr. 8&lt;br /&gt;
* Datenblatt Abschnitt &#039;&#039;Accessing 16-bit Registers&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== IO-Register als Parameter und Variablen ==&lt;br /&gt;
&lt;br /&gt;
Um Register als Parameter für eigene Funktionen übergeben zu können, muss man sie als einen volatile uint8_t Pointer übergeben. Zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
uint8_t key_pressed(const volatile uint8_t *inputreg, uint8_t inputbit)&lt;br /&gt;
{&lt;br /&gt;
  static uint8_t last_state = 0;&lt;br /&gt;
 &lt;br /&gt;
  if ( last_state == ( *inputreg &amp;amp; (1&amp;lt;&amp;lt;inputbit) ) ) {&lt;br /&gt;
     return 0; /* keine Änderung */&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  /* Wenn doch, warten bis etwaiges Prellen vorbei ist: */&lt;br /&gt;
  _delay_ms(20);&lt;br /&gt;
&lt;br /&gt;
  /* Zustand für nächsten Aufruf merken: */&lt;br /&gt;
  last_state = ( *inputreg &amp;amp; (1&amp;lt;&amp;lt;inputbit) );&lt;br /&gt;
 &lt;br /&gt;
  /* und den entprellten Tastendruck zurückgeben: */&lt;br /&gt;
  return ( *inputreg &amp;amp; (1&amp;lt;&amp;lt;inputbit) );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Beispiel für einen Funktionsaufruf: */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
uint8_t i;&lt;br /&gt;
&lt;br /&gt;
//...&lt;br /&gt;
    i = key_pressed( &amp;amp;PINB, PB1 );&lt;br /&gt;
//...&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Aufruf der Funktion mit call by value würde Folgendes bewirken: Beim Funktionseintritt wird nur eine Kopie des momentanen Portzustandes angefertigt, die sich unabhängig vom tatsächlichen Zustand das Ports nicht mehr ändert, womit die Funktion wirkungslos wäre. Die Übergabe eines Zeigers wäre die Lösung, wenn der Compiler nicht optimieren würde. Denn dadurch wird im Programm nicht von der Hardware gelesen, sondern wieder nur von einem Abbild im Speicher. Das Ergebnis wäre das gleiche wie oben. Mit dem Schlüsselwort volatile sagt man nun dem Compiler, dass die entsprechende Variable entweder durch andere Softwareroutinen (Interrupts) oder durch die Hardware verändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Im Übrigen können mit volatile gekennzeichnete Variablen auch als const deklariert werden, um sicherzustellen, dass sie nur noch von der Hardware änderbar sind.&lt;br /&gt;
&lt;br /&gt;
= Zugriff auf IO-Ports =&lt;br /&gt;
&lt;br /&gt;
Jeder AVR implementiert eine unterschiedliche Menge an GPIO-Registern&lt;br /&gt;
(GPIO - General Purpose Input/Output). Diese Register dienen dazu:&lt;br /&gt;
* einzustellen welche der Anschlüsse (&amp;quot;Beinchen&amp;quot;) des Controllers als Ein- oder Ausgänge dienen&lt;br /&gt;
* bei Ausgängen deren Zustand festzulegen&lt;br /&gt;
* bei Eingängen deren Zustand zu erfassen&lt;br /&gt;
&lt;br /&gt;
Mittels GPIO werden digitale Zustände gesetzt und erfasst, d.h. die Spannung an einem Ausgang wird ein- oder ausgeschaltet und an einem Eingang wird erfasst, ob die anliegende Spannung über oder unter einem bestimmten Schwellwert liegt. Im Datenblatt Abschnitt Electrical Characteristics/DC Characteristics finden sich die Spannungswerte (V_OL, V_OH für Ausgänge, V_IL, V_IH für Eingänge).&lt;br /&gt;
&lt;br /&gt;
Die Verarbeitung von analogen Eingangswerten und die Ausgabe von Analogwerten wird in Kapitel [[AVR-GCC-Tutorial#Analoge_Ein-_und_Ausgabe|Analoge Ein- und Ausgabe]] behandelt.&lt;br /&gt;
&lt;br /&gt;
Alle Ports der AVR-Controller werden über Register gesteuert. Dazu sind jedem Port 3 Register zugeordnet:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
! DDRx&lt;br /&gt;
| Datenrichtungsregister für Port&#039;&#039;&#039;x&#039;&#039;&#039;. &lt;br /&gt;
&#039;&#039;&#039;x&#039;&#039;&#039; entspricht &#039;&#039;&#039;A&#039;&#039;&#039;, &#039;&#039;&#039;B&#039;&#039;&#039;, &#039;&#039;&#039; C&#039;&#039;&#039;, &#039;&#039;&#039;D&#039;&#039;&#039; usw. (abhängig von der Anzahl der Ports des verwendeten AVR). Bit im Register gesetzt (1) für Ausgang, Bit gelöscht (0) für Eingang.&lt;br /&gt;
|- &lt;br /&gt;
! PINx&lt;br /&gt;
| Eingangsadresse für Port&#039;&#039;&#039;x&#039;&#039;&#039;. &lt;br /&gt;
Zustand des Ports. Die Bits in PINx entsprechen dem Zustand der als Eingang definierten Portpins. Bit 1 wenn Pin &amp;quot;high&amp;quot;, Bit 0 wenn Portpin low.&lt;br /&gt;
|-&lt;br /&gt;
! PORTx&lt;br /&gt;
| Datenregister für Port&#039;&#039;&#039;x&#039;&#039;&#039;. &lt;br /&gt;
Dieses Register wird verwendet, um die Ausgänge eines Ports anzusteuern. Bei Pins, die mittels DDRx auf Eingang geschaltet wurden, können über PORTx&lt;br /&gt;
die internen Pull-Up Widerstände aktiviert oder deaktiviert werden (1 = aktiv).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die folgenden Beispiele gehen von einem AVR aus, der sowohl Port A als auch Port B besitzt. Sie müssen für andere AVRs (zum Beispiel ATmega8/48/88/168) entsprechend angepasst werden.&lt;br /&gt;
&lt;br /&gt;
== Datenrichtung bestimmen ==&lt;br /&gt;
&lt;br /&gt;
Zuerst muss die Datenrichtung der verwendeten Pins bestimmt werden. Um dies zu erreichen, wird das Datenrichtungsregister des entsprechenden Ports beschrieben.&lt;br /&gt;
&lt;br /&gt;
Für jeden Pin, der als Ausgang verwendet werden soll, muss dabei das&lt;br /&gt;
entsprechende Bit auf dem Port gesetzt werden. Soll der Pin als Eingang&lt;br /&gt;
verwendet werden, muss das entsprechende Bit gelöscht sein.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
Angenommen am Port B sollen die Pins 0 bis 4 als Ausgänge definiert werden, die noch verbleibenden Pins 5 bis 7 sollen als Eingänge fungieren. Dazu ist es daher notwendig, im für das Port B zuständigen Datenrichtungsregister DDRB folgende Bitkonfiguration einzutragen&lt;br /&gt;
&lt;br /&gt;
   +---+---+---+---+---+---+---+---+&lt;br /&gt;
   | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 |&lt;br /&gt;
   +---+---+---+---+---+---+---+---+&lt;br /&gt;
     7   6   5   4   3   2   1   0&lt;br /&gt;
&lt;br /&gt;
In C liest sich das dann so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// in io.h wird u.a. DDRB definiert:&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
// Setzen der Bits 0,1,2,3 und 4&lt;br /&gt;
// Binär 00011111 = Hexadezimal 1F&lt;br /&gt;
DDRB = 0x1F;    /* direkte Zuweisung - unübersichtlich */&lt;br /&gt;
&lt;br /&gt;
// übersichtliche Alternative - Binärschreibweise&lt;br /&gt;
DDRB = 0b00011111;    /* direkte Zuweisung - übersichtlich */&lt;br /&gt;
&lt;br /&gt;
/* Ausführliche Schreibweise: identische Funktionalität, mehr Tipparbeit&lt;br /&gt;
   aber übersichtlicher und selbsterklärend: */&lt;br /&gt;
DDRB = (1 &amp;lt;&amp;lt; DDB0) | (1 &amp;lt;&amp;lt; DDB1) | (1 &amp;lt;&amp;lt; DDB2) | (1 &amp;lt;&amp;lt; DDB3) | (1 &amp;lt;&amp;lt; DDB4); &lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Pins 5 bis 7 werden (da 0) als Eingänge geschaltet. Weitere Beispiele:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// Alle Pins des Ports B als Ausgang definieren:&lt;br /&gt;
DDRB = 0xff; &lt;br /&gt;
// Pin0 wieder auf Eingang und andere im ursprünglichen Zustand belassen:&lt;br /&gt;
DDRB &amp;amp;= ~( 1 &amp;lt;&amp;lt; DDB0 );&lt;br /&gt;
// Pin 3 und 4 auf Eingang und andere im ursprünglichen Zustand belassen:&lt;br /&gt;
DDRB &amp;amp;= ~( ( 1 &amp;lt;&amp;lt; DDB3 ) | ( 1&amp;lt;&amp;lt;DDB4) );&lt;br /&gt;
// Pin 0 und 3 wieder auf Ausgang und andere im ursprünglichen Zustand belassen:&lt;br /&gt;
DDRB |= ( 1 &amp;lt;&amp;lt; DDB0) | ( 1 &amp;lt;&amp;lt; DDB3 );&lt;br /&gt;
// Alle Pins auf Eingang:&lt;br /&gt;
DDRB = 0x00;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Vordefinierte Bitnummern für I/O-Register ==&lt;br /&gt;
&lt;br /&gt;
Die Bitnummern (z.B. PCx, PINCx und DDCx für den Port C) sind in den io*.h-Dateien der avr-libc definiert und dienen lediglich der besseren Lesbarkeit. Man muss diese Definitionen nicht verwenden oder kann auch einfach &amp;quot;immer&amp;quot; PAx, PBx, PCx usw. nutzen, auch wenn der Zugriff auf Bits in DDRx- oder PINx-Registern erfolgt. Für den Compiler sind die Ausdrücke (1&amp;lt;&amp;lt;PC7), (1&amp;lt;&amp;lt;DDC7) und (1&amp;lt;&amp;lt;PINC7) identisch zu (1&amp;lt;&amp;lt;7) (genauer: der Präprozessor ersetzt die Ausdrücke (1&amp;lt;&amp;lt;PC7),... zu (1&amp;lt;&amp;lt;7)). Ein Ausschnitt der Definitionen für Port C eines ATmega32 aus der iom32.h-Datei zur Verdeutlichung (analog für die weiteren Ports):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
/* PORTC */&lt;br /&gt;
#define PC7     7&lt;br /&gt;
#define PC6     6&lt;br /&gt;
#define PC5     5&lt;br /&gt;
#define PC4     4&lt;br /&gt;
#define PC3     3&lt;br /&gt;
#define PC2     2&lt;br /&gt;
#define PC1     1&lt;br /&gt;
#define PC0     0&lt;br /&gt;
&lt;br /&gt;
/* DDRC */&lt;br /&gt;
#define DDC7    7&lt;br /&gt;
#define DDC6    6&lt;br /&gt;
#define DDC5    5&lt;br /&gt;
#define DDC4    4&lt;br /&gt;
#define DDC3    3&lt;br /&gt;
#define DDC2    2&lt;br /&gt;
#define DDC1    1&lt;br /&gt;
#define DDC0    0&lt;br /&gt;
&lt;br /&gt;
/* PINC */&lt;br /&gt;
#define PINC7   7&lt;br /&gt;
#define PINC6   6&lt;br /&gt;
#define PINC5   5&lt;br /&gt;
#define PINC4   4&lt;br /&gt;
#define PINC3   3&lt;br /&gt;
#define PINC2   2&lt;br /&gt;
#define PINC1   1&lt;br /&gt;
#define PINC0   0&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Digitale Signale ==&lt;br /&gt;
&lt;br /&gt;
Am einfachsten ist es, digitale Signale mit dem Mikrocontroller zu erfassen bzw. auszugeben.&lt;br /&gt;
&lt;br /&gt;
== Ausgänge ==&lt;br /&gt;
Will man als Ausgang definierte Pins (entsprechende DDRx-Bits = 1) auf Logisch 1 setzen, setzt man die  entsprechenden Bits im Portregister.&lt;br /&gt;
&lt;br /&gt;
Mit dem Befehl&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
    PORTB = 0x04; /* besser PORTB=(1&amp;lt;&amp;lt;PB2) */&lt;br /&gt;
&lt;br /&gt;
    // übersichtliche Alternative - Binärschreibweise&lt;br /&gt;
    PORTB = 0b00000100;    /* direkte Zuweisung - übersichtlich */&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
wird also der Ausgang an Pin PB2 gesetzt (Beachte, dass die Bits immer &#039;&#039;von 0 an&#039;&#039; gezählt werden, das niederwertigste Bit ist also Bitnummer 0 und nicht etwa Bitnummer 1).&lt;br /&gt;
&lt;br /&gt;
Man beachte, dass bei der Zuweisung mittels &#039;&#039;&#039;=&#039;&#039;&#039; immer alle Pins gleichzeitig angegeben werden. Man sollte also, wenn nur bestimmte Ausgänge geschaltet werden sollen, zuerst den aktuellen Wert des Ports einlesen und das Bit des gewünschten Ports in diesen Wert einfließen lassen. Will man also nur den dritten Pin (Bit Nr. 2) an Port B auf &amp;quot;high&amp;quot; setzen und den Status der anderen Ausgänge unverändert lassen, nutze man diese Form:&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;
...&lt;br /&gt;
    PORTB = PORTB | 0x04; /* besser: PORTB = PORTB | ( 1&amp;lt;&amp;lt;PB2 ) */&lt;br /&gt;
    /* vereinfacht durch Nutzung des |= Operators : */&lt;br /&gt;
    PORTB |= (1&amp;lt;&amp;lt;PB2);&lt;br /&gt;
&lt;br /&gt;
    /* auch mehrere &amp;quot;gleichzeitig&amp;quot;: */&lt;br /&gt;
    PORTB |= (1&amp;lt;&amp;lt;PB4) | (1&amp;lt;&amp;lt;PB5); /* Pins PB4 und PB5 &amp;quot;high&amp;quot; */&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Ausschalten&amp;quot;, also  Ausgänge auf &amp;quot;low&amp;quot; setzen, erfolgt analog:&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;
...&lt;br /&gt;
    PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;PB2); /* löscht Bit 2 in PORTB und setzt damit Pin PB2 auf low */ &lt;br /&gt;
    PORTB &amp;amp;= ~( (1&amp;lt;&amp;lt;PB4) | (1&amp;lt;&amp;lt;PB5) ); /* Pin PB4 und Pin PB5 &amp;quot;low&amp;quot; */&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Quellcodes, die für ältere Version den des avr-gcc/der avr-libc entwickelt wurden, werden einzelne Bits mittels der Funktionen sbi und cbi gesetzt bzw. gelöscht. Beide Funktionen sind in aktuellen Versionen der avr-libc nicht mehr enthalten und auch nicht mehr erforderlich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Falls der Anfangszustand von Ausgängen kritisch ist, muss die Reihenfolge beachtet werden, mit der die Datenrichtung (DDRx) eingestellt und der Ausgabewert (PORTx) gesetzt wird:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Für Ausgangspins, die mit Anfangswert &amp;quot;high&amp;quot; initialisiert werden sollen:&lt;br /&gt;
* zuerst die Bits im PORTx-Register setzen&lt;br /&gt;
* anschließend die Datenrichtung auf Ausgang stellen&lt;br /&gt;
&lt;br /&gt;
Daraus ergibt sich die Abfolge für einen Pin, der bisher als Eingang mit abgeschaltetem Pull-Up konfiguriert ware:&lt;br /&gt;
* setze PORTx: interner Pull-Up aktiv&lt;br /&gt;
* setze DDRx: Ausgang (&amp;quot;high&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Bei der Reihenfolge erst DDRx und dann PORTx, kann es zu einem kurzen &amp;quot;low-Puls&amp;quot; kommen, der auch externe Pull-Up-Widerstände &amp;quot;überstimmt&amp;quot;. Die (ungünstige) Abfolge: Eingang -&amp;gt; setze DDRx: Ausgang (auf &amp;quot;low&amp;quot;, da PORTx nach Reset 0) -&amp;gt; setze PORTx: Ausgang auf high. Vergleiche dazu auch das Datenblatt Abschnitt &#039;&#039;Configuring the Pin&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Eingänge (Wie kommen Signale in den &amp;amp;micro;C) ==&lt;br /&gt;
&lt;br /&gt;
Die digitalen Eingangssignale können auf verschiedene Arten zu unserer Logik gelangen.&lt;br /&gt;
&lt;br /&gt;
=== Signalkopplung ===&lt;br /&gt;
&lt;br /&gt;
Am einfachsten ist es, wenn die Signale direkt aus einer anderen digitalen Schaltung übernommen werden können. Hat der Ausgang der entsprechenden Schaltung TTL-Pegel dann können wir sogar direkt den Ausgang der Schaltung mit einem Eingangspin von unserem Controller verbinden.&lt;br /&gt;
&lt;br /&gt;
Hat der Ausgang der anderen Schaltung keinen TTL-Pegel so müssen wir den Pegel über entsprechende Hardware (z.B. Optokoppler, [[Widerstand#Spannungsteiler|Spannungsteiler]], &amp;quot;Levelshifter&amp;quot; aka [[Pegelwandler]]) anpassen.&lt;br /&gt;
&lt;br /&gt;
Die Masse der beiden Schaltungen muss selbstverständlich miteinander verbunden werden. Der Software selber ist es natürlich letztendlich egal, wie das Signal eingespeist wird. Wir können ja ohnehin lediglich prüfen, ob an einem Pin unseres Controllers eine logische 1 (Spannung größer ca. 0,7*Vcc) oder eine logische 0 (Spannung kleiner ca. 0,2*Vcc) anliegt. Detaillierte Informationen darüber, ab welcher Spannung ein Eingang als 0 (&amp;quot;low&amp;quot;) bzw. 1 (&amp;quot;high&amp;quot;) erkannt wird, liefert die Tabelle DC Characteristics im Datenblatt des genutzten Controllers.&lt;br /&gt;
&lt;br /&gt;
Die Abfrage der Zustände der Portpins erfolgt direkt über den Registernamen.&lt;br /&gt;
&lt;br /&gt;
{{Warnung|Dabei ist wichtig, zur Abfrage der Eingänge &#039;&#039;nicht&#039;&#039; etwa Portregister &#039;&#039;&#039;PORTx&#039;&#039;&#039; zu verwenden, sondern Eingangsregister &#039;&#039;&#039;PINx&#039;&#039;&#039;. Ansonsten liest man nicht den Zustand der Eingänge, sondern den Status der internen Pull-Up-Widerstände. Die Abfrage der Pinzustände über PORTx statt PINx ist ein häufiger Fehler beim AVR-&amp;quot;Erstkontakt&amp;quot;.}}&lt;br /&gt;
&lt;br /&gt;
Will man also die aktuellen Signalzustände von Port D abfragen und in eine Variable namens bPortD abspeichern, schreibt man folgende Befehlszeilen:&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;stdint.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
uint8_t bPortD;&lt;br /&gt;
...&lt;br /&gt;
bPortD = PIND;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit den C-Bitoperationen kann man den Status der Bits abfragen.&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;
...&lt;br /&gt;
/* Fuehre Aktion aus, wenn Bit Nr. 1 (das &amp;quot;zweite&amp;quot; Bit) in PINC gesetzt (1) ist */&lt;br /&gt;
if ( PINC &amp;amp; (1&amp;lt;&amp;lt;PINC1) ) {&lt;br /&gt;
  /* Aktion */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Fuehre Aktion aus, wenn Bit Nr. 2 (das &amp;quot;dritte&amp;quot; Bit) in PINB geloescht (0) ist */&lt;br /&gt;
if ( !(PINB &amp;amp; (1&amp;lt;&amp;lt;PINB2)) ) {&lt;br /&gt;
  /* Aktion */&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Interne Pull-Up Widerstände ===&lt;br /&gt;
&lt;br /&gt;
Portpins für Ein- und Ausgänge (GPIO) eines AVR verfügen über zuschaltbare interne Pull-Up Widerstände (nominal mehrere 10kOhm, z.B. ATmega16 20-50kOhm). Diese können in vielen Fällen statt externer Widerstände genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Die internen Pull-Up Widerstände von Vcc zu den einzelnen Portpins werden über das Register &#039;&#039;&#039; PORTx&#039;&#039;&#039; aktiviert bzw. deaktiviert, wenn ein Pin als &#039;&#039;&#039; Eingang&#039;&#039;&#039; geschaltet ist.&lt;br /&gt;
&lt;br /&gt;
Wird der Wert des entsprechenden Portpins auf 1 gesetzt, so ist der Pull-Up Widerstand aktiviert. Bei einem Wert von 0 ist der Pull-Up Widerstand nicht aktiv. Man sollte jeweils entweder den internen oder einen externen Pull-Up Widerstand verwenden, aber nicht beide zusammen.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel werden alle Pins des Ports D als Eingänge geschaltet und alle Pull-Up Widerstände aktiviert. Weiterhin wird Pin PC7 als Eingang geschaltet und dessen interner Pull-Up Widerstand aktiviert, ohne die Einstellungen für die anderen Portpins (PC0-PC6) zu verändern.&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;
...&lt;br /&gt;
DDRD  = 0x00; /* alle Pins von Port D als Eingang */&lt;br /&gt;
PORTD = 0xff; /* interne Pull-Ups an allen Port-Pins aktivieren */&lt;br /&gt;
...&lt;br /&gt;
DDRC  &amp;amp;= ~(1&amp;lt;&amp;lt;DDC7);  /* Pin PC7 als Eingang */&lt;br /&gt;
PORTC |= (1&amp;lt;&amp;lt;PC7);    /* internen Pull-Up an PC7 aktivieren */&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tasten und Schalter ===&lt;br /&gt;
&lt;br /&gt;
Der Anschluss mechanischer Kontakte an den Mikrocontroller gestaltet sich ebenfalls ganz einfach, wobei wir zwei unterschiedliche Methoden unterscheiden müssen: &#039;&#039;Active Low&#039;&#039; und &#039;&#039;Active High&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;300&amp;quot; heights=&amp;quot;300&amp;quot; caption=&amp;quot;Anschluss mechanischer Kontakte an einen µC&amp;quot;&amp;gt;&lt;br /&gt;
Image:Active Low.gif|&#039;&#039;&#039;Active Low:&#039;&#039;&#039; Bei dieser Methode wird der Kontakt zwischen den Eingangspin des Controllers und Masse geschaltet. Damit bei offenem Schalter der Controller kein undefiniertes Signal bekommt wird zwischen die Versorgungsspannung und den Eingangspin ein sogenannter Pull-Up Widerstand geschaltet. Dieser dient dazu, den Pegel bei geöffnetem Schalter auf logisch 1 zu ziehen.&lt;br /&gt;
Image:Active High.gif|&#039;&#039;&#039;Active High:&#039;&#039;&#039; Hier wird der Kontakt zwischen die Versorgungsspannung und den Eingangspin geschaltet. Damit bei offener Schalterstellung kein undefiniertes Signal am Controller ansteht, wird zwischen den Eingangspin und die Masse ein Pull-Down Widerstand geschaltet. Dieser dient dazu, den Pegel bei geöffneter Schalterstellung auf logisch 0 zu halten.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Widerstandswert von Pull-Up- und Pull-Down-Widerständen ist an sich nicht kritisch. Wird er allerdings zu hoch gewählt, ist die Wirkung eventuell nicht gegeben. Als üblicher Wert haben sich 10 kOhm eingebürgert. Die AVRs verfügen an den meisten Pins softwaremäßig über zuschaltbare interne Pull-Up Widerstände (vgl. Abschnitt [[AVR-GCC-Tutorial#Interne Pull-Up Widerstände|Interne Pull-Up Widerstände]]), welche insbesondere wie hier bei Tastern und ähnlichen Bauteilen (z.B. Drehgebern) statt externer Bauteile verwenden werden können.&lt;br /&gt;
&lt;br /&gt;
==== (Tasten-)Entprellung ====&lt;br /&gt;
&lt;br /&gt;
Nun haben alle mechanischen Kontakte, sei es von Schaltern, Tastern oder auch von Relais, die unangenehme Eigenschaft zu prellen. Dies bedeutet, dass beim Schließen des Kontaktes derselbe nicht direkt Kontakt herstellt, sondern mehrfach ein- und ausschaltet bis zum endgültigen Herstellen des Kontaktes.&lt;br /&gt;
&lt;br /&gt;
Soll nun mit einem schnellen Mikrocontroller gezählt werden, wie oft ein solcher Kontakt geschaltet wird, dann haben wir ein Problem, weil das Prellen als mehrfache Impulse gezählt wird. Diesem Phänomen muss beim Schreiben des Programms unbedingt Rechnung getragen werden.&lt;br /&gt;
&lt;br /&gt;
Beim folgenden einfachen Beispiel für eine Entprellung ist zu beachten, dass der AVR im Falle eines Tastendrucks 200ms wartet, also brach liegt. Bei zeitkritische Anwendungen sollte man ein anderes Verfahren nutzen (z.B. Abfrage der Tastenzustände in einer Timer-Interrupt-Service-Routine).&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;inttypes.h&amp;gt;&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
#warning &amp;quot;F_CPU war noch nicht definiert, wird nun mit 3686400 definiert&amp;quot;&lt;br /&gt;
#define F_CPU 3686400UL     /* Quarz mit 3.6864 Mhz  */&lt;br /&gt;
#endif&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;     /* bei alter avr-libc: #include &amp;lt;avr/delay.h&amp;gt; */      &lt;br /&gt;
&lt;br /&gt;
/* Einfache Funktion zum Entprellen eines Tasters */&lt;br /&gt;
inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)&lt;br /&gt;
{&lt;br /&gt;
    if ( ! (*port &amp;amp; (1 &amp;lt;&amp;lt; pin)) )&lt;br /&gt;
    {&lt;br /&gt;
        /* Pin wurde auf Masse gezogen, 100ms warten   */&lt;br /&gt;
        _delay_ms(50);  // max. 262.1 ms / F_CPU in MHz&lt;br /&gt;
        _delay_ms(50); &lt;br /&gt;
        if ( *port &amp;amp; (1 &amp;lt;&amp;lt; pin) )&lt;br /&gt;
        {&lt;br /&gt;
            /* Anwender Zeit zum Loslassen des Tasters geben */&lt;br /&gt;
            _delay_ms(50);&lt;br /&gt;
            _delay_ms(50); &lt;br /&gt;
            return 1;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    DDRB &amp;amp;= ~( 1 &amp;lt;&amp;lt; PB0 );                 /* PIN PB0 auf Eingang (Taster)            */&lt;br /&gt;
    PORTB |= ( 1 &amp;lt;&amp;lt; PB0 );                 /* Pullup-Widerstand aktivieren            */&lt;br /&gt;
    ...&lt;br /&gt;
    if (debounce(&amp;amp;PINB, PB0))             /* Falls Taster an PIN PB0 gedrueckt..    */&lt;br /&gt;
        PORTD = PIND ^ ( 1 &amp;lt;&amp;lt; PD7 );  /* ..LED an Port PD7 an-&lt;br /&gt;
                                   bzw. ausschalten */&lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Thema Entprellen siehe auch:&lt;br /&gt;
* Artikel [[Entprellung]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Analoge Ein- und Ausgabe =&lt;br /&gt;
&lt;br /&gt;
Analoge Eingangswerte werden in der Regel über den AVR Analog-Digital-Converter (AD-Wandler, ADC) eingelesen, der in vielen Typen verfügbar ist (typisch 10bit Auflösung). Durch diesen werden analoge Signale (Spannungen) in digitale Zahlenwerte gewandelt. Bei AVRs, die über keinen internen AD-Wandler verfügen (z.B. ATmega162), kann durch externe Beschaltung (R/C-Netzwerk und &amp;quot;Zeitmessung&amp;quot;) die Funktion des AD-Wandlers &amp;quot;emuliert&amp;quot; werden.&lt;br /&gt;
&lt;br /&gt;
Es existieren keine AVRs mit eingebautem Digital-Analog-Konverter (DAC). Diese Funktion muss durch externe Komponenten nachgebildet werden (z.B. PWM und &amp;quot;Glättung&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Unabhängig davon besteht natürlich immer die Möglichkeit, spezielle Bausteine zur Analog-Digital- bzw. Digital-Analog-Wandlung zu nutzen und diese über eine digitale Schnittstelle (z.b. SPI oder I2C) mit einem AVR anzusteuern.&lt;br /&gt;
&lt;br /&gt;
== AC (Analog Comparator) ==&lt;br /&gt;
&lt;br /&gt;
Der Comparator vergleicht 2 Spannungen an den Pins AIN0 und AIN1 und gibt einen Status aus welche der beiden Spannungen größer ist. AIN0 Dient dabei als Referenzspannung (Sollwert) und AIN1 als Vergleichsspannung (Istwert). Als Referenzspannung kann auch alternativ eine interne Referenzspannung ausgewählt werden.&lt;br /&gt;
&lt;br /&gt;
Liegt die Vergleichsspannung (IST) unter der der Referenzspannung (SOLL) gibt der Comperator eine logische 1 aus. Ist die Vergleichsspannung hingegen größer als die Referenzspannung wird eine logische 0 ausgegeben.&lt;br /&gt;
&lt;br /&gt;
Der Comparator arbeitet völlig autark bzw. parallel zum Prozessor. Für mobile Anwendungen empfiehlt es sich ihn abzuschalten sofern er nicht benötigt wird, da er ansonsten Strom benötigt. Der Comparator kann Interruptgesteuert abgefragt werden oder im Pollingbetrieb.&lt;br /&gt;
&lt;br /&gt;
Das Steuer- bzw. Statusregister 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;
|+ &#039;&#039;&#039;ACSR - Analog Comparator Status Register&#039;&#039;&#039;&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;ACD&#039;&#039;&#039;|| &#039;&#039;&#039;ACBG&#039;&#039;&#039;|| &#039;&#039;&#039;ACO&#039;&#039;&#039;|| &#039;&#039;&#039;ACI&#039;&#039;&#039;|| &#039;&#039;&#039;ACIE&#039;&#039;&#039;|| &#039;&#039;&#039;ACIC&#039;&#039;&#039;|| &#039;&#039;&#039;ACIS1&#039;&#039;&#039;|| &#039;&#039;&#039;ACIS0&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
! R/W&lt;br /&gt;
| R/W|| R/W|| R|| R/W|| R/W|| R/W|| R/W|| R/W&lt;br /&gt;
|- &lt;br /&gt;
! Initialwert&lt;br /&gt;
| 0|| 0|| n/a|| 0|| 0|| 0|| 0|| 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Bit 7 ACD: Analog Comparator Disable: 0 = Comparator ein, 1 = Comparator aus. Wird dieses Bit geändert kann ein Interrupt ausgelöst werden. Soll dies vermieden werden muß das Bit 3 ACIE ggf. abgeschaltet werden.&lt;br /&gt;
&lt;br /&gt;
;Bit 6 ACBG: Analog Comparator Bandgap Select: Ermöglicht das umschalten zwischen interner und externer Referenzspannung. 1 = interne (~1,3 Volt), 0 = externe Referenzspannung (an Pin AIN0)&lt;br /&gt;
&lt;br /&gt;
;Bit 5 ACO: Analog Comparator Output: Hier wird das Ergebnis des Vergleichs angezeigt. Es liegt typischerweise nach 1-2 Taktzyklen vor.&lt;br /&gt;
:: IST &amp;lt; SOLL &amp;amp;rarr; 1&lt;br /&gt;
:: IST &amp;gt; SOLL &amp;amp;rarr; 0&lt;br /&gt;
&lt;br /&gt;
;Bit 4 ACI: Analog Comparator Interrupt Flag: Dieses Bit wird von der Hardware gesetzt wenn ein Interruptereignis das in Bit 0 und 1 definiert ist eintritt. Dieses Bit löst noch keinen Interrupt aus! Die Interruptroutine wird nur dann ausgeführt wenn das Bit 3 ACIE gesetzt ist und global Interrupts erlaubt sind (I-Bit in SREG=1). Das Bit 4 ACI wird wieder gelöscht wenn die Interruptroutine ausgeführt wurde oder wenn manuell das Bit auf 1 gesetzt wird. Das Bit kann für Abfragen genutzt werden, steuert oder konfuguriert aber nicht den Comparator.&lt;br /&gt;
&lt;br /&gt;
;Bit 3 ACIE: Analog Comparator Interrupt Enable: Ist das Bit auf 1 gesetzt wird immer ein Interrupt ausgelöst wenn das Ereignis das in Bit 1 und 0 definiert ist eintritt.&lt;br /&gt;
&lt;br /&gt;
;Bit 2 ACIC: Analog Comparator Input Capture Enable: Wird das Bit gesetzt wird der Comparatorausgang intern mit dem Counter 1 verbunden. Es könnten damit z.b. die Anzahl der Vergleiche im Counter1 gezählt werden. Um den Comparator an den Timer1 Input Capture Interrupt zu verbinden muß im Timerregister das TICIE1 Bit auf 1 gesetzt werden. Der Trigger wird immer dann ausgelöst wenn das in Bit 1 und 0 definierte Ereignis eintritt.&lt;br /&gt;
&lt;br /&gt;
;Bit 1,0 ACIS1,ACIS0: Analog Comparator Interrupt select: Hier wird definiert welche Ereignisse einen Interrupt auslösen sollen:&lt;br /&gt;
:* 00 = Interrupt auslösen bei jedem Flankenwechsel&lt;br /&gt;
:* 10 = Interrupt auslösen bei fallender Flanke&lt;br /&gt;
:* 11 = Interrupt auslösen bei steigender Flanke&lt;br /&gt;
&lt;br /&gt;
Werden diese Bit geändert kann ein Interrupt ausgelöst werden. Soll dies vermieden werden muß das Bit 3 gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
== ADC (Analog Digital Converter) ==&lt;br /&gt;
&lt;br /&gt;
Der Analog-Digital-Konverter (ADC) wandelt analoge Signale in digitale Werte um, welche vom Controller interpretiert werden können. Einige AVR-Typen haben bereits einen mehrkanaligen Analog-Digital-Konverter eingebaut. Die Genauigkeit, mit welcher ein analoges Signal aufgelöst werden kann, wird durch die Auflösung des ADC in Anzahl Bits angegeben, man hört bzw. liest jeweils von 8-Bit-ADC oder 10-Bit-ADC oder noch höher. ADCs die in AVRs enthalten sind haben zur Zeit eine maximale Auflösung von 10-Bit.&lt;br /&gt;
&lt;br /&gt;
Ein ADC mit 8 Bit Auflösung kann somit das analoge Signal mit einer Genauigkeit von 1/256 des Maximalwertes darstellen. Wenn wir nun mal annehmen, wir hätten eine Spannung zwischen 0 und 5 Volt und eine Auflösung von 3 Bit, dann könnten&lt;br /&gt;
die Werte 0V, 0.625V, 1.25, 1.875V, 2.5V, 3.125V, 3.75, 4.375, 5V&lt;br /&gt;
daherkommen, siehe dazu folgende Tabelle:&lt;br /&gt;
&lt;br /&gt;
::{|  class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! Eingangsspannung am ADC [V] || Entsprechender Messwert&lt;br /&gt;
|-&lt;br /&gt;
| 0–0.625    || 0&lt;br /&gt;
|-&lt;br /&gt;
| 0.625–1.25 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 1.25–1.875 || 2&lt;br /&gt;
|-&lt;br /&gt;
| 1.875–2.5  || 3&lt;br /&gt;
|-&lt;br /&gt;
| 2.5–3.125  || 4&lt;br /&gt;
|-&lt;br /&gt;
| 3.125–3.75 || 5&lt;br /&gt;
|-&lt;br /&gt;
| 3.75–4.375 || 6&lt;br /&gt;
|-&lt;br /&gt;
| 4.375–5    || 7&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Angaben sind natürlich nur ungefähr. Je höher nun die Auflösung des Analog-Digital-Konverters ist, also je mehr Bits er hat, um so genauer kann der Wert erfasst werden.&lt;br /&gt;
&lt;br /&gt;
=== Der interne ADC im AVR ===&lt;br /&gt;
&lt;br /&gt;
Wenn es einmal etwas genauer sein soll, dann müssen wir auf einen AVR mit eingebautem Analog-Digital-Wandler (ADC) zurückgreifen, die über mehrere Kanäle verfügen. Kanäle heißt in diesem Zusammenhang, dass zwar bis zu zehn analoge Eingänge am AVR verfügbar sind, aber nur ein &amp;quot;echter&amp;quot; Analog-Digital-Wandler zur Verfügung steht, vor der eigentlichen Messung ist also einzustellen, welcher Kanal (&amp;quot;Pin&amp;quot;) mit dem Wandler verbunden und gemessen wird.&lt;br /&gt;
&lt;br /&gt;
Die Umwandlung innerhalb des AVR basiert auf der schrittweisen Näherung. Beim AVR müssen die Pins &#039;&#039;&#039;AGND&#039;&#039;&#039; und &#039;&#039;&#039;AVCC&#039;&#039;&#039; beschaltet werden. Für genaue Messungen sollte AVCC über ein L-C Netzwerk mit VCC verbunden werden, um Spannungsspitzen und -einbrüche vom Analog-Digital-Wandler fernzuhalten. Im Datenblatt findet sich dazu eine Schaltung, die 10uH und 100nF vorsieht.&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis der Analog-Digital-Wandlung wird auf eine Referenzspannung bezogen. Aktuelle AVRs bieten 3 Möglichkeiten zur Wahl dieser Spannung:&lt;br /&gt;
&lt;br /&gt;
* Eine externe Referenzspannung von maximal &#039;&#039;&#039;Vcc&#039;&#039;&#039; am Anschlusspin &#039;&#039;&#039;AREF&#039;&#039;&#039;. Die minimale (externe) Referenzspannung darf jedoch nicht beliebig niedrig sein, vgl. dazu das (aktuellste) Datenblatt des verwendeten Controllers. &lt;br /&gt;
&lt;br /&gt;
* Verfügt der AVR über eine interne Referenzspannung, kann diese genutzt werden. Alle aktuellen AVRs mit internem AD-Wandler sollten damit ausgestattet sein (vgl. Datenblatt: 2,56V oder 1,1V je nach Typ). Das Datenblatt gibt auch über die Genauigkeit dieser Spannung Auskunft.&lt;br /&gt;
&lt;br /&gt;
* Es kann die Spannung AVcc als Referenzspannung herangezogen werden&lt;br /&gt;
&lt;br /&gt;
Bei Nutzung von AVcc oder der internen Referenz wird empfohlen, einen Kondensator zwischen dem AREF-Pin und GND anzuordnen. Die Festlegung, welche Spannungsreferenz genutzt wird, erfolgt z.B. beim ATmega16 mit den Bits REFS1/REFS0 im ADMUX-Register. Die zu messende Spannung muss im Bereich zwischen &#039;&#039;&#039;AGND&#039;&#039;&#039; und &#039;&#039;&#039;AREF&#039;&#039;&#039; (egal ob intern oder extern) liegen. &lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;ADC&#039;&#039;&#039; kann in zwei verschiedenen Betriebsarten verwendet werden:&lt;br /&gt;
&lt;br /&gt;
; Einfache Wandlung (Single Conversion) : In dieser Betriebsart wird der Wandler bei Bedarf vom Programm angestoßen für jeweils eine Messung.&lt;br /&gt;
&lt;br /&gt;
; Frei laufend (Free Running) : In dieser Betriebsart erfasst der Wandler permanent die anliegende Spannung und schreibt diese in das &#039;&#039;&#039;ADC Data Register&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Die Register des ADC ====&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;ADC&#039;&#039;&#039; verfügt über eigene Register. Im Folgenden die Registerbeschreibung eines  ATMega16, welcher über 8 ADC-Kanäle verfügt. Die Register unterscheiden sich jedoch nicht erheblich von denen anderer AVRs (vgl. Datenblatt).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;ADCSRA&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;ADC&#039;&#039;&#039; &#039;&#039;&#039;C&#039;&#039;&#039;ontrol and &#039;&#039;&#039;S&#039;&#039;&#039;tatus &#039;&#039;&#039;R&#039;&#039;&#039;egister A.&amp;lt;br /&amp;gt;&lt;br /&gt;
In diesem Register stellen wir ein, wie wir den &#039;&#039;&#039;ADC&#039;&#039;&#039; 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; 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;ADEN&#039;&#039;&#039;|| &#039;&#039;&#039;ADSC&#039;&#039;&#039;|| &#039;&#039;&#039;ADFR&#039;&#039;&#039;|| &#039;&#039;&#039;ADIF&#039;&#039;&#039;|| &#039;&#039;&#039;ADIE&#039;&#039;&#039;|| &#039;&#039;&#039;ADPS2&#039;&#039;&#039;|| &#039;&#039;&#039;ADPS1&#039;&#039;&#039;|| &#039;&#039;&#039;ADPS0&#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;
&#039;&#039;&#039;ADEN&#039;&#039;&#039; (&#039;&#039;&#039;AD&#039;&#039;&#039;C &#039;&#039;&#039;En&#039;&#039;&#039;able)&lt;br /&gt;
:Dieses Bit muss gesetzt werden, um den &#039;&#039;&#039; ADC&#039;&#039;&#039; überhaupt zu aktivieren. Wenn das Bit nicht gesetzt ist, können die Pins wie normale I/O-Pins verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ADSC&#039;&#039;&#039; (&#039;&#039;&#039;AD&#039;&#039;&#039;C &#039;&#039;&#039;S&#039;&#039;&#039;tart &#039;&#039;&#039;C&#039;&#039;&#039;onversion)&lt;br /&gt;
:Mit diesem Bit wird ein Messvorgang gestartet. In der frei laufenden Betriebsart muss das Bit gesetzt werden, um die kontinuierliche Messung zu aktivieren.&lt;br /&gt;
:Wenn das Bit nach dem Setzen des &#039;&#039;&#039;ADEN&#039;&#039;&#039;-Bits zum ersten Mal gesetzt wird, führt der Controller zuerst eine zusätzliche Wandlung und erst dann die eigentliche Wandlung aus. Diese zusätzliche Wandlung wird zu Initialisierungszwecken durchgeführt.&lt;br /&gt;
:Das Bit bleibt nun so lange auf 1, bis die Umwandlung abgeschlossen ist, im Initialisierungsfall entsprechend bis die zweite Umwandlung erfolgt ist und geht danach auf 0.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ADFR&#039;&#039;&#039; (&#039;&#039;&#039;AD&#039;&#039;&#039;C &#039;&#039;&#039;F&#039;&#039;&#039;ree &#039;&#039;&#039;R&#039;&#039;&#039;un select)&lt;br /&gt;
:Mit diesem Bit wird die Betriebsart eingestellt.&lt;br /&gt;
:Ist das Bit auf 1 gesetzt arbeitet der ADC im Freerunning Modus. Dabei wird das Datenregister permanent aktualisiert. Ist das Bit hingegen auf 0 gesetzt macht der ADC nur eine Single Conversion. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ADIF&#039;&#039;&#039; (&#039;&#039;&#039;AD&#039;&#039;&#039;C &#039;&#039;&#039;I&#039;&#039;&#039;nterrupt &#039;&#039;&#039;F&#039;&#039;&#039;lag)&lt;br /&gt;
:Dieses Bit wird vom &#039;&#039;&#039; ADC&#039;&#039;&#039; gesetzt, sobald eine Umwandlung erfolgt ist und das &#039;&#039;&#039;ADC Data Register&#039;&#039;&#039; aktualisiert wurde. Das Bit wird bei lesendem Zugriff auf &#039;&#039;&#039;ADC(L,H)&#039;&#039;&#039; automatisch (d.h. durch die Hardware) gelöscht.&lt;br /&gt;
:Wenn das &#039;&#039;&#039;ADIE&#039;&#039;&#039; Bit sowie das &#039;&#039;&#039;I-Bit&#039;&#039;&#039; im AVR &#039;&#039;&#039;Statusregister&#039;&#039;&#039; gesetzt ist, wird der &#039;&#039;&#039;ADC Interrupt&#039;&#039;&#039; ausgelöst und die Interrupt-Behandlungsroutine aufgerufen.&lt;br /&gt;
:Das Bit wird automatisch gelöscht, wenn die Interrupt-Behandlungsroutine aufgerufen wird. Es kann jedoch auch gelöscht werden, indem eine logische 1 in das Register geschrieben wird.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ADIE&#039;&#039;&#039; (&#039;&#039;&#039;AD&#039;&#039;&#039;C &#039;&#039;&#039;I&#039;&#039;&#039;nterrupt &#039;&#039;&#039;E&#039;&#039;&#039;nable)&lt;br /&gt;
:Wenn dieses Bit gesetzt ist und ebenso das &#039;&#039;&#039; I-Bit&#039;&#039;&#039; im Statusregister &#039;&#039;&#039;SREG&#039;&#039;&#039;, dann wird der &#039;&#039;&#039; ADC-Interrupt&#039;&#039;&#039; aktiviert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ADPS2...ADPS0&#039;&#039;&#039; (&#039;&#039;&#039;AD&#039;&#039;&#039;C &#039;&#039;&#039;P&#039;&#039;&#039;rescaler &#039;&#039;&#039;S&#039;&#039;&#039;elect Bits)&lt;br /&gt;
:Diese Bits bestimmen den Teilungsfaktor zwischen der Taktfrequenz und dem Eingangstakt des &#039;&#039;&#039;ADC&#039;&#039;&#039;.&lt;br /&gt;
:Der &#039;&#039;&#039;ADC&#039;&#039;&#039; benötigt einen eigenen Takt, welchen er sich selber aus der CPU-Taktfreqenz erzeugt. Der &#039;&#039;&#039;ADC&#039;&#039;&#039;-Takt sollte zwischen 50 und 200kHz sein.&lt;br /&gt;
:Der Vorteiler muss also so eingestellt werden, dass die CPU-Taktfrequenz dividiert durch den Teilungsfaktor einen Wert zwischen 50-200kHz ergibt.&lt;br /&gt;
:Bei einer CPU-Taktfrequenz von 4MHz beispielsweise rechnen wir&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{matrix}&lt;br /&gt;
TF_{min}=\frac{CLK}{200\,\mathrm{kHz}}=\frac{4000000}{200000}=\mathbf{20}&lt;br /&gt;
\\&lt;br /&gt;
\\&lt;br /&gt;
TF_{max}=\frac{CLK}{50\,\mathrm{kHz}}=\frac{4000000}{50000}=\mathbf{80}&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Somit kann hier der Teilungsfaktor 32 oder 64 verwendet werden. Im Interesse der schnelleren Wandlungszeit werden wir hier den Faktor 32 einstellen.&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;
! &#039;&#039;&#039;ADPS2&#039;&#039;&#039;|| &#039;&#039;&#039;ADPS1&#039;&#039;&#039;|| &#039;&#039;&#039;ADPS0&#039;&#039;&#039;|| &#039;&#039;&#039;Teilungsfaktor&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0|| 0|| 0|| 2&lt;br /&gt;
|-&lt;br /&gt;
| 0|| 0|| 1|| 2&lt;br /&gt;
|-&lt;br /&gt;
| 0|| 1|| 0|| 4&lt;br /&gt;
|-&lt;br /&gt;
| 0|| 1|| 1|| 8&lt;br /&gt;
|-&lt;br /&gt;
| 1|| 0|| 0|| 16&lt;br /&gt;
|-&lt;br /&gt;
| 1|| 0|| 1|| 32&lt;br /&gt;
|-&lt;br /&gt;
| 1|| 1|| 0|| 64&lt;br /&gt;
|-&lt;br /&gt;
| 1|| 1|| 1|| 128&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;ADCL&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;ADCH&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;ADC &#039;&#039;&#039; Data Register&amp;lt;br /&amp;gt;&lt;br /&gt;
Wenn eine Umwandlung abgeschlossen ist, befindet sich der gemessene Wert in&lt;br /&gt;
diesen beiden Registern. Von &#039;&#039;&#039;ADCH&#039;&#039;&#039; werden nur die beiden niederwertigsten Bits verwendet. Es müssen immer beide Register ausgelesen werden, und zwar immer &#039;&#039;&#039;in der Reihenfolge: ADCL, ADCH&#039;&#039;&#039;. &lt;br /&gt;
Der effektive Messwert ergibt sich dann zu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
x = ADCL;       // mit uint16_t x&lt;br /&gt;
x += (ADCH&amp;lt;&amp;lt;8); // in zwei Zeilen (LSB/MSB-Reihenfolge und&lt;br /&gt;
                // C-Operatorpriorität sichergestellt)&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder &lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
x = ADCW; // je nach AVR auch x = ADC (siehe avr/ioxxx.h)&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;ADMUX&amp;amp;nbsp;&amp;amp;nbsp;&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;AD&#039;&#039;&#039;C &#039;&#039;&#039;Mu&#039;&#039;&#039;ltiple&#039;&#039;&#039;x&#039;&#039;&#039;er Select Register&amp;lt;br /&amp;gt;&lt;br /&gt;
Mit diesem Register wird der zu messende Kanal ausgewählt. Beim 90S8535&lt;br /&gt;
kann jeder Pin von Port A als &#039;&#039;&#039;ADC&#039;&#039;&#039;-Eingang verwendet werden (=8 Kanäle).&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; 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;REFS1&#039;&#039;&#039;|| &#039;&#039;&#039;REFS0&#039;&#039;&#039;|| &#039;&#039;&#039;ADLAR&#039;&#039;&#039;|| &#039;&#039;&#039;MUX4&#039;&#039;&#039;|| &#039;&#039;&#039;MUX3&#039;&#039;&#039;|| &#039;&#039;&#039;MUX2&#039;&#039;&#039;|| &#039;&#039;&#039;MUX1&#039;&#039;&#039;|| &#039;&#039;&#039;MUX0&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
! &#039;&#039;&#039;R/W&#039;&#039;&#039;&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;
&#039;&#039;&#039;REFS1...REFS0&#039;&#039;&#039; (&#039;&#039;&#039;Ref&#039;&#039;&#039;erence&#039;&#039;&#039;S&#039;&#039;&#039;election Bits)&lt;br /&gt;
:Mit diesen Bits kann die Referenzspannung eingestellt werden:&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;
! &#039;&#039;&#039;REFS1&#039;&#039;&#039;|| &#039;&#039;&#039;REFS0&#039;&#039;&#039;|| &#039;&#039;&#039;Referenzspanung&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0|| 0|| Externes AREF&lt;br /&gt;
|-&lt;br /&gt;
| 0|| 1|| AVCC als Referenz&lt;br /&gt;
|-&lt;br /&gt;
| 1|| 0|| Reserviert&lt;br /&gt;
|-&lt;br /&gt;
| 1|| 1|| Interne 2,56 Volt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ADLAR&#039;&#039;&#039; (&#039;&#039;&#039;ADC &#039;&#039;&#039; &#039;&#039;&#039;L&#039;&#039;&#039;eft &#039;&#039;&#039;A&#039;&#039;&#039;djust &#039;&#039;&#039;R&#039;&#039;&#039;esult)&lt;br /&gt;
:Das ADLAR Bit verändert das Aussehen des Ergebnisses der AD-Wandlung. Bei einer logischen 1 wird das Ergebnis linksbündig ausgegeben, bei einer 0 rechtsbündig. Eine Änderung in diesem Bit beeinflusst das Ergebnis sofort, ganz egal ob bereits eine Wandlung läuft.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MUX4...MUX0&#039;&#039;&#039;&lt;br /&gt;
:Mit diesen 5 Bits wird der zu messende Kanal bestimmt. Wenn man einen einfachen 1-kanaligen ADC verwendet wird einfach die entsprechende Pinnummer des Ports in die Bits 0...2 eingeschrieben.&lt;br /&gt;
:Wenn das Register beschrieben wird, während dem eine Umwandlung läuft, so wird zuerst die aktuelle Umwandlung auf dem bisherigen Kanal beendet. Dies ist vor allem beim frei laufenden Betrieb zu berücksichtigen.&lt;br /&gt;
&lt;br /&gt;
:Eine Empfehlung ist deswegen diese, dass der frei laufende Betrieb nur bei einem einzelnen zu verwendenden Analogeingang verwendet werden sollte, wenn man sich Probleme bei der Umschalterei ersparen will.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Aktivieren des ADC ====&lt;br /&gt;
&lt;br /&gt;
Um den &#039;&#039;&#039; ADC&#039;&#039;&#039; zu aktivieren, müssen wir das &#039;&#039;&#039;ADEN&#039;&#039;&#039;-Bit im &#039;&#039;&#039;ADCSR&#039;&#039;&#039;-Register&lt;br /&gt;
setzen. Im gleichen Schritt legen wir auch gleich die Betriebsart fest. &lt;br /&gt;
&lt;br /&gt;
Ein kleines Beispiel für den &amp;quot;single conversion&amp;quot;-Mode bei einem ATmega169 und Nutzung der internen Referenzspannung (beim &#039;169 1,1V bei anderen AVRs auch 2,56V). D.h. das Eingangssignal darf diese Spannung nicht überschreiten, gegebenenfalls mit Spannungsteiler einstellen. Ergebnis der Routine ist der ADC-Wert, also 0 für 0-Volt und 1023 für V_ref-Volt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
uint16_t ReadChannel(uint8_t mux)&lt;br /&gt;
{&lt;br /&gt;
  uint8_t i;&lt;br /&gt;
  uint16_t result;&lt;br /&gt;
&lt;br /&gt;
  ADMUX = mux;                      // Kanal waehlen&lt;br /&gt;
  ADMUX |= (1&amp;lt;&amp;lt;REFS1) | (1&amp;lt;&amp;lt;REFS0); // interne Referenzspannung nutzen&lt;br /&gt;
&lt;br /&gt;
  ADCSRA = (1&amp;lt;&amp;lt;ADEN) | (1&amp;lt;&amp;lt;ADPS1) | (1&amp;lt;&amp;lt;ADPS0);    // Frequenzvorteiler &lt;br /&gt;
                               // setzen auf 8 (1) und ADC aktivieren (1)&lt;br /&gt;
&lt;br /&gt;
  /* nach Aktivieren des ADC wird ein &amp;quot;Dummy-Readout&amp;quot; empfohlen, man liest&lt;br /&gt;
     also einen Wert und verwirft diesen, um den ADC &amp;quot;warmlaufen zu lassen&amp;quot; */&lt;br /&gt;
  ADCSRA |= (1&amp;lt;&amp;lt;ADSC);              // eine ADC-Wandlung &lt;br /&gt;
  while ( ADCSRA &amp;amp; (1&amp;lt;&amp;lt;ADSC) ) {&lt;br /&gt;
     ;     // auf Abschluss der Konvertierung warten &lt;br /&gt;
  }&lt;br /&gt;
  result = ADCW;  // ADCW muss einmal gelesen werden,&lt;br /&gt;
                  // sonst wird Ergebnis der nächsten Wandlung&lt;br /&gt;
                  // nicht übernommen.&lt;br /&gt;
&lt;br /&gt;
  /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */&lt;br /&gt;
  result = 0; &lt;br /&gt;
  for( i=0; i&amp;lt;4; i++ )&lt;br /&gt;
  {&lt;br /&gt;
    ADCSRA |= (1&amp;lt;&amp;lt;ADSC);            // eine Wandlung &amp;quot;single conversion&amp;quot;&lt;br /&gt;
    while ( ADCSRA &amp;amp; (1&amp;lt;&amp;lt;ADSC) ) {&lt;br /&gt;
      ;   // auf Abschluss der Konvertierung warten&lt;br /&gt;
    }&lt;br /&gt;
    result += ADCW;		    // Wandlungsergebnisse aufaddieren&lt;br /&gt;
  }&lt;br /&gt;
  ADCSRA &amp;amp;= ~(1&amp;lt;&amp;lt;ADEN);             // ADC deaktivieren (2)&lt;br /&gt;
&lt;br /&gt;
  result /= 4;                     // Summe durch vier teilen = arithm. Mittelwert&lt;br /&gt;
&lt;br /&gt;
  return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
/* Beispielaufrufe: */&lt;br /&gt;
&lt;br /&gt;
void foo(void)&lt;br /&gt;
{&lt;br /&gt;
  uint16_t adcval;&lt;br /&gt;
&lt;br /&gt;
  adcval = ReadChannel(0); /* MUX-Bits auf 0b0000 -&amp;gt; Channel 0 */&lt;br /&gt;
  ...&lt;br /&gt;
  adcval = ReadChannel(2); /* MUX-Bits auf 0b0010 -&amp;gt; Channel 2 */&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Beispiel wird bei jedem Aufruf der ADC aktiviert und nach der Wandlung wieder abgeschaltet, das spart Strom. Will man dies nicht, verschiebt man die mit (1) gekennzeichneten Zeilen in eine Funktion adc_init() o.ä. und löscht die mit (2) markierten Zeilen. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Das Löschen des ADIF-Flags sollte, &#039;&#039;&#039;entgegen&#039;&#039;&#039; der [http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_intbits FAQ], mit&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  ADCSRA |= (1&amp;lt;&amp;lt;ADIF);&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
erfolgen. Die Methode in der FAQ eignet sich nur für Register in denen &#039;&#039;&#039;nur&#039;&#039;&#039; Interrupt-Flags stehen.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Analog-Digital-Wandlung ohne internen ADC ===&lt;br /&gt;
&lt;br /&gt;
==== Messen eines Widerstandes ====&lt;br /&gt;
&lt;br /&gt;
[[Image:Poti.gif|framed|right]]&lt;br /&gt;
Analoge Werte lassen sich ohne Analog-Digital-Wandler auch indirekt ermitteln. Im Folgenden wird die Messung des an einem Potentiometer eingestellten Widerstands anhand der Ladekurve eines Kondensators erläutert. Bei dieser Methode wird nur ein Portpin benötigt, ein Analog-Digital-Wandler oder Analog-Comparator ist nicht erforderlich. Es wird dazu ein Kondensator und der Widerstand (das Potentiometer) in Reihe zwischen Vorsorgungsspannung und Masse/GND geschaltet (sogen. RC-Netzwerk). Zusätzlich wird eine Verbindung der Leitung zwischen Kondensator und Potentiometer zu einem Portpin des Controllers hergestellt. Die folgende Abbildung verdeutlicht die erforderliche Schaltung. &lt;br /&gt;
&lt;br /&gt;
Wird der Portpin des Controllers auf Ausgang konfiguriert (im Beispiel &#039;&#039;DDRD&amp;amp;nbsp;|=&amp;amp;nbsp;(1&amp;lt;&amp;lt;PD2)&#039;&#039;) und dieser Ausgang auf Logisch 1 (&amp;quot;High&amp;quot;, &#039;&#039;PORTD&amp;amp;nbsp;|=&amp;amp;nbsp;(1&amp;lt;&amp;lt;PD2)&#039;&#039;) geschaltet, liegt an beiden &amp;quot;Platten&amp;quot; des Kondensators das gleiche Potential &#039;&#039;&#039;VCC&#039;&#039;&#039; an und der Kondensator somit entladen. (Klingt komisch, mit &#039;&#039;&#039; Vcc&#039;&#039;&#039; entladen, ist aber so, da an beiden Seiten des Kondensators das gleiche Potential anliegt und somit eine Potentialdifferenz von 0V besteht =&amp;gt; Kondensator ist entladen).&lt;br /&gt;
&lt;br /&gt;
Nach einer gewissen Zeit ist der Kondensator entladen und der Portpin wird als Eingang konfiguriert (&#039;&#039;DDRD&amp;amp;nbsp;&amp;amp;=&amp;amp;nbsp;~(1&amp;lt;&amp;lt;PD2); PORTD&amp;amp;nbsp;&amp;amp;=&amp;amp;nbsp;~(1&amp;lt;&amp;lt;PD2)&#039;&#039;), wodurch dieser hochohmig wird. Der Status des Eingangspin (in PIND) ist Logisch 1 (High). Der Kondensator lädt sich jetzt über das Poti auf, dabei steigt der Spannungsabfall über dem Kondensator und derjenige über dem Poti sinkt. Fällt nun der Spannungsabfall über dem Poti unter die Thresholdspannung des Eingangspins (2/5 Vcc, also ca. 2V), wird das Eingangssignal als LOW erkannt (Bit in PIND wird 0). Die Zeitspanne zwischen der Umschaltung von Entladung auf Aufladung und dem Wechsel des Eingangssignals von High auf Low ist ein Maß für den am Potentiometer eingestellten Widerstand. Zur Zeitmessung kann einer der im Controller vorhandenen Timer genutzt werden. Der 220 Ohm Widerstand dient dem Schutz des Controllers. Es würde sonst bei Maximaleinstellung des Potentionmeters (hier 0 Ohm) ein zu hoher Strom fließen, der die Ausgangsstufe des Controllers zerstört. &lt;br /&gt;
&lt;br /&gt;
Mit einem weiteren Eingangspin und ein wenig Software können wir auch eine Kalibrierung realisieren, um den Messwert in einen vernünftigen Bereich (z.B: 0...100 % oder so) umzurechnen. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Link 404 =&amp;gt; auskommentiert, mthomas 9.2.2008 &lt;br /&gt;
Ein Beispielprogramm findet sich auf [http://www.mypage.bluewin.ch/ch_schifferle/ Christian Schifferles Web-Seite] im Archiv &#039;&#039;ATMEL.ZIP&#039;&#039;, welches unter den Titel &#039;&#039;Tutorial &amp;quot;Programmieren mit C für Atmel Mikrocontroller&#039;&#039; heruntergeladen werden kann. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ADC über Komparator ====&lt;br /&gt;
&lt;br /&gt;
[[Image:ADC ueber Komparator.gif|framed|right]]&lt;br /&gt;
Es gibt einen weiteren Weg, eine analoge Spannung mit Hilfe des&lt;br /&gt;
Komparators, welcher in fast jedem AVR integriert ist, zu messen. Siehe dazu&lt;br /&gt;
auch die Application Note AVR400 von Atmel.&lt;br /&gt;
&lt;br /&gt;
Dabei wird das zu messende Signal auf den invertierenden Eingang&lt;br /&gt;
des Komparators geführt. Zusätzlich wird ein Referenzsignal an den nicht&lt;br /&gt;
invertierenden Eingang des Komparators angeschlossen. Das Referenzsignal wird&lt;br /&gt;
hier auch wieder über ein RC-Glied erzeugt, allerdings mit festen Werten für R&lt;br /&gt;
und C.&lt;br /&gt;
&lt;br /&gt;
Das Prinzip der Messung ist nun dem vorhergehenden recht&lt;br /&gt;
ähnlich. Durch Anlegen eines LOW-Pegels an Pin 2 wird der Kondensator zuerst&lt;br /&gt;
einmal entladen. Auch hier muss darauf geachtet werden, dass der Entladevorgang&lt;br /&gt;
genügend lang dauert.&lt;br /&gt;
Nun wird Pin 2 auf HIGH gelegt. Der Kondensator wird geladen. Wenn die Spannung&lt;br /&gt;
über dem Kondensator die am Eingangspin anliegende Spannung erreicht hat&lt;br /&gt;
schaltet der Komparator durch. Die Zeit, welche benötigt wird, um den&lt;br /&gt;
Kondensator zu laden kann nun auch wieder als Maß für die Spannung an Pin 1&lt;br /&gt;
herangezogen werden.&lt;br /&gt;
&lt;br /&gt;
Ich habe es mir gespart, diese Schaltung auch aufzubauen und&lt;br /&gt;
zwar aus mehreren Gründen:&lt;br /&gt;
&lt;br /&gt;
# 3 Pins notwendig.&lt;br /&gt;
# Genauigkeit vergleichbar mit einfacherer Lösung.&lt;br /&gt;
# War einfach zu faul.&lt;br /&gt;
&lt;br /&gt;
Der Vorteil dieser Schaltung liegt allerdings darin, dass damit&lt;br /&gt;
direkt Spannungen gemessen werden können.&lt;br /&gt;
&lt;br /&gt;
== DAC (Digital Analog Converter) ==&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe eines Digital-Analog-Konverters (&#039;&#039;&#039;DAC&#039;&#039;&#039;) können wir nun auch Analogsignale ausgeben. Es gibt hier mehrere Verfahren. &amp;lt;!-- Wenn wir beim ADC die Möglichkeit haben, mit externen Komponenten zu operieren, müssen wir bei der DAC-Wandlung mit dem auskommen, was der Controller selber zu bieten hat. --mt: hmm, richtig? verstaendlich? redundant? --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAC über mehrere digitale Ausgänge ===&lt;br /&gt;
&lt;br /&gt;
Wenn wir an den Ausgängen des Controllers ein entsprechendes&lt;br /&gt;
Widerstandsnetzwerk aufbauen haben wir die Möglichkeit, durch die Ansteuerung&lt;br /&gt;
der Ausgänge über den Widerständen einen Addierer aufzubauen, mit dessen&lt;br /&gt;
Hilfe wir eine dem Zahlenwert proportionale Spannung erzeugen können. Das&lt;br /&gt;
Schaltbild dazu kann etwa so aussehen:&lt;br /&gt;
&lt;br /&gt;
[[Image:DAC R2R.gif]]&lt;br /&gt;
&lt;br /&gt;
Es sollten selbstverständlich möglichst genaue Widerstände verwendet&lt;br /&gt;
werden, also nicht unbedingt solche mit einer Toleranz von 10% oder mehr.&lt;br /&gt;
Weiterhin empfiehlt es sich, je nach Anwendung den Ausgangsstrom über einen&lt;br /&gt;
Operationsverstärker zu verstärken.&lt;br /&gt;
&lt;br /&gt;
=== PWM (Pulsweitenmodulation) ===&lt;br /&gt;
&lt;br /&gt;
Wir kommen nun zu einem Thema, welches in aller Munde ist, aber viele&lt;br /&gt;
Anwender verstehen nicht ganz, wie [[PWM]] eigentlich funktioniert.&lt;br /&gt;
&lt;br /&gt;
Wie wir alle wissen, ist ein Mikrocontroller ein rein digitales Bauteil.&lt;br /&gt;
Definieren wir einen Pin als Ausgang, dann können wir diesen Ausgang entweder&lt;br /&gt;
auf HIGH setzen, worauf am Ausgang die Versorgungsspannung &#039;&#039;&#039; Vcc&#039;&#039;&#039; anliegt, oder aber wir setzen den Ausgang auf LOW, wonach dann &#039;&#039;&#039; 0V&#039;&#039;&#039; am Ausgang liegt. Was passiert aber nun, wenn wir periodisch mit einer festen Frequenz zwischen HIGH und LOW umschalten? - Richtig, wir erhalten eine Rechteckspannung, wie die folgende Abbildung zeigt:&lt;br /&gt;
&lt;br /&gt;
[[Image:PWM Theorie 1.gif]]&lt;br /&gt;
&lt;br /&gt;
Diese Rechteckspannung hat nun einen arithmetischen Mittelwert, &lt;br /&gt;
der je nach Pulsbreite kleiner oder größer ist.&lt;br /&gt;
&lt;br /&gt;
[[Image:PWM Theorie 2.gif]]&lt;br /&gt;
&lt;br /&gt;
Wenn wir nun diese pulsierende Ausgangsspannung noch über ein RC-Glied filtern/&amp;quot;glätten&amp;quot;, dann haben wir schon eine entsprechende Gleichspannung erzeugt.&lt;br /&gt;
&lt;br /&gt;
Mit den AVRs können wir direkt PWM-Signale erzeugen. &lt;br /&gt;
Dazu dient der 16-Bit Zähler, welcher im sogenannten PWM-Modus betrieben werden kann.&lt;br /&gt;
&lt;br /&gt;
;Hinweis: In den folgenden Überlegungen wird als Controller der 90S2313 vorausgesetzt. Die Theorie ist bei anderen AVR-Controllern vergleichbar, die Pinbelegung allerdings nicht unbedingt, weshalb ein Blick ins entsprechende Datenblatt dringend angeraten wird.&lt;br /&gt;
&lt;br /&gt;
Um den PWM-Modus zu aktivieren, müssen im Timer/Counter1 Control&lt;br /&gt;
Register A TCCR1A die Pulsweiten-Modulatorbits PWM10 bzw. PWM11 entsprechend nachfolgender Tabelle gesetzt werden:&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;
! PWM11 || PWM10 || Bedeutung&lt;br /&gt;
|- &lt;br /&gt;
| 0 || 0 || PWM-Modus des Timers ist nicht aktiv&lt;br /&gt;
|- &lt;br /&gt;
| 0 || 1 || 8-Bit PWM&lt;br /&gt;
|- &lt;br /&gt;
| 1 || 0 || 9-Bit PWM&lt;br /&gt;
|- &lt;br /&gt;
| 1 || 1 || 10-Bit PWM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Timer/Counter zählt nun permanent von 0 bis zur Obergrenze&lt;br /&gt;
und wieder zurück, er wird also als sogenannter Auf-/Ab Zähler betrieben. &lt;br /&gt;
Die Obergrenze hängt davon ab, ob wir mit 8, 9 oder 10-Bit PWM arbeiten wollen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
! Auflösung || Obergrenze || Frequenz&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 8&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 255&lt;br /&gt;
| f&amp;lt;sub&amp;gt;TC1&amp;lt;/sub&amp;gt; / 510&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 9&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 511&lt;br /&gt;
| f&amp;lt;sub&amp;gt;TC1&amp;lt;/sub&amp;gt; / 1022&lt;br /&gt;
|- &lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 10&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | 1023&lt;br /&gt;
| f&amp;lt;sub&amp;gt;TC1&amp;lt;/sub&amp;gt; / 2046&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss mit den Bits &#039;&#039;&#039;COM1A1&#039;&#039;&#039; und &#039;&#039;&#039;COM1A0&#039;&#039;&#039; desselben&lt;br /&gt;
Registers die gewünschte Ausgabeart des Signals definiert werden:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
! COM1A1 || COM1A0 || Bedeutung&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;
| Keine Wirkung, Pin wird nicht geschaltet.&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;
| Keine Wirkung, Pin wird nicht geschaltet.&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;
| Nicht invertierende PWM.&amp;lt;br /&amp;gt;&lt;br /&gt;
Der Ausgangspin wird gelöscht beim Hochzählen und gesetzt beim&lt;br /&gt;
Herunterzählen.&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;
| Invertierende PWM.&amp;lt;br /&amp;gt;&lt;br /&gt;
Der Ausgangspin wird gelöscht beim Herunterzählen und gesetzt beim&lt;br /&gt;
Hochzählen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der entsprechende Befehl, um beispielsweise den Timer/Counter als&lt;br /&gt;
nicht invertierenden 10-Bit PWM zu verwenden, heißt dann:&lt;br /&gt;
&lt;br /&gt;
alte Schreibweise (PWMxx wird nicht mehr akzeptiert)&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
TCCR1A = (1&amp;lt;&amp;lt;PWM11)|(1&amp;lt;&amp;lt;PWM10)|(1&amp;lt;&amp;lt;COM1A1);&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
neue Schreibweise&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
TCCR1A = (1&amp;lt;&amp;lt;WGM11)|(1&amp;lt;&amp;lt;WGM10)|(1&amp;lt;&amp;lt;COM1A1);&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit der Timer/Counter überhaupt läuft, müssen wir im Control&lt;br /&gt;
Register B &#039;&#039;&#039;TCCR1B&#039;&#039;&#039; noch den gewünschten Takt (Vorteiler) einstellen und&lt;br /&gt;
somit auch die Frequenz des &#039;&#039;&#039;PWM&#039;&#039;&#039;-Signals bestimmen.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
! CS12 || CS11 || CS10 || Bedeutung&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;
| Stop. Der Timer/Counter wird gestoppt.&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;
| CK&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;
| CK / 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;
| CK / 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;
| CK / 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;
| CK / 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 1, negative 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 1, positive Flanke&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Also um einen Takt von CK / 1024 zu generieren, verwenden wir&lt;br /&gt;
folgenden Befehl:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
TCCR1B = (1&amp;lt;&amp;lt;CS12) | (1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt muss nur noch der Vergleichswert festgelegt werden. Diesen&lt;br /&gt;
schreiben wir in das 16-Bit Timer/Counter Output Compare Register &#039;&#039;&#039;OCR1A&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
OCR1A = xxx;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die folgende Grafik soll den Zusammenhang zwischen dem Vergleichswert und dem generierten &#039;&#039;&#039;PWM&#039;&#039;&#039;-Signal aufzeigen.&lt;br /&gt;
&lt;br /&gt;
[[Image:PWM Theorie 3.gif]]&lt;br /&gt;
&lt;br /&gt;
[[Image:PWM Theorie 4.gif]]&lt;br /&gt;
&lt;br /&gt;
Ach ja, fast hätte ich&#039;s vergessen. Das generierte &#039;&#039;&#039;PWM&#039;&#039;&#039;-Signal&lt;br /&gt;
wird am Output Compare Pin &#039;&#039;&#039;OC1&#039;&#039;&#039; des Timers ausgegeben und leider können wir&lt;br /&gt;
deshalb auch beim AT90S2313 nur ein einzelnes &#039;&#039;&#039;PWM&#039;&#039;&#039;-Signal mit dieser Methode generieren. Andere AVR-Typen verfügen über bis zu vier PWM-Ausgänge. Zu beachten ist außerdem, das wenn der OC Pin aktiviert ist, er nichtmehr wie üblich funktioniert und z.B. nicht einfach über PINx ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
Ein Programm, welches an einem ATmega8 den Fast-PWM Modus verwendet, den Modus 14, könnte so aussehen&lt;br /&gt;
&amp;lt;C&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  // OC1A auf Ausgang&lt;br /&gt;
  DDRB = (1 &amp;lt;&amp;lt; PB1 );  //ATMega8&lt;br /&gt;
  // DDRD = (1 &amp;lt;&amp;lt; PD5 ); //ATMega16&lt;br /&gt;
  //&lt;br /&gt;
  // Timer 1 einstellen&lt;br /&gt;
  //  &lt;br /&gt;
  // Modus 14:&lt;br /&gt;
  //    Fast PWM, Top von ICR1&lt;br /&gt;
  //&lt;br /&gt;
  //    WGM13    WGM12   WGM11    WGM10&lt;br /&gt;
  //      1        1       1        0&lt;br /&gt;
  //&lt;br /&gt;
  //    Timer Vorteiler: 1&lt;br /&gt;
  //     CS12     CS11    CS10&lt;br /&gt;
  //       0        0       1&lt;br /&gt;
  //&lt;br /&gt;
  //  Steuerung des Ausgangsport: Set at BOTTOM, Clear at match&lt;br /&gt;
  //     COM1A1   COM1A0&lt;br /&gt;
  //       1        0&lt;br /&gt;
 &lt;br /&gt;
  TCCR1A = (1&amp;lt;&amp;lt;COM1A1) | (1&amp;lt;&amp;lt;WGM11);&lt;br /&gt;
  TCCR1B = (1&amp;lt;&amp;lt;WGM13) | (1&amp;lt;&amp;lt;WGM12) | (1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
 &lt;br /&gt;
  //  den Endwert (TOP) für den Zähler setzen&lt;br /&gt;
  //  der Zähler zählt bis zu diesem Wert&lt;br /&gt;
&lt;br /&gt;
  ICR1 = 0x6FFF;&lt;br /&gt;
 &lt;br /&gt;
  // der Compare Wert&lt;br /&gt;
  // Wenn der Zähler diesen Wert erreicht, wird mit&lt;br /&gt;
  // obiger Konfiguration der OC1A Ausgang abgeschaltet&lt;br /&gt;
  // Sobald der Zähler wieder bei 0 startet, wird der&lt;br /&gt;
  // Ausgang wieder auf 1 gesetzt&lt;br /&gt;
  //&lt;br /&gt;
  // Durch Verändern dieses Wertes, werden die unterschiedlichen&lt;br /&gt;
  // PWM Werte eingestellt.&lt;br /&gt;
&lt;br /&gt;
  OCR1A = 0x3FFF;&lt;br /&gt;
&lt;br /&gt;
  while( 1 )&lt;br /&gt;
    ;  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/C&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;PWM-Mode Tabelle aus dem Datenblatt des ATmega8515&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
!Mode || WGM13 || WGM12 || WGM11 || WGM10 || Timer/Counter Mode of Operation&lt;br /&gt;
! TOP|| Update of OCR1x at || TOV1 Flag set on&lt;br /&gt;
|- &lt;br /&gt;
! 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| Normal&lt;br /&gt;
| 0xFFFF&lt;br /&gt;
| Immediate&lt;br /&gt;
| MAX&lt;br /&gt;
|-&lt;br /&gt;
! 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| PWM, Phase Correct, 8-Bit&lt;br /&gt;
| 0x00FF&lt;br /&gt;
| TOP&lt;br /&gt;
| BOTTOM&lt;br /&gt;
|- &lt;br /&gt;
! 2&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| PWM, Phase Correct, 9-Bit&lt;br /&gt;
| 0x01FF&lt;br /&gt;
| TOP&lt;br /&gt;
| BOTTOM&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| PWM, Phase Correct, 10-Bit&lt;br /&gt;
| 0x03FF&lt;br /&gt;
| TOP&lt;br /&gt;
| BOTTOM&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| CTC&lt;br /&gt;
| OCR1A&lt;br /&gt;
| Immediate&lt;br /&gt;
| MAX&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| Fast PWM, 8-Bit&lt;br /&gt;
| 0x00FF&lt;br /&gt;
| BOTTOM&lt;br /&gt;
| TOP&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| Fast PWM, 9-Bit&lt;br /&gt;
| 0x01FF&lt;br /&gt;
| BOTTOM&lt;br /&gt;
| TOP&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| Fast PWM, 10-Bit&lt;br /&gt;
| 0x03FF&lt;br /&gt;
| BOTTOM&lt;br /&gt;
| TOP&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| PWM, Phase an Frequency Correct&lt;br /&gt;
| ICR1&lt;br /&gt;
| BOTTOM&lt;br /&gt;
| BOTTOM&lt;br /&gt;
|-    &lt;br /&gt;
! 9&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| PWM, Phase an Frequency Correct&lt;br /&gt;
| OCR1A&lt;br /&gt;
| BOTTOM&lt;br /&gt;
| BOTTOM&lt;br /&gt;
|-&lt;br /&gt;
! 10&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| PWM, Phase Correct&lt;br /&gt;
| ICR1&lt;br /&gt;
| TOP&lt;br /&gt;
| BOTTOM&lt;br /&gt;
|-&lt;br /&gt;
! 11&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| PWM, Phase an Frequency Correct&lt;br /&gt;
| OCR1A&lt;br /&gt;
| TOP&lt;br /&gt;
| BOTTOM&lt;br /&gt;
|-&lt;br /&gt;
! 12&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| CTC&lt;br /&gt;
| ICR1&lt;br /&gt;
| Immediate&lt;br /&gt;
| MAX&lt;br /&gt;
|-&lt;br /&gt;
! 13&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| Reserved&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
! 14&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| Fast PWM&lt;br /&gt;
| ICR1&lt;br /&gt;
| BOTTOM&lt;br /&gt;
| TOP&lt;br /&gt;
|-&lt;br /&gt;
! 15&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| Fast PWM&lt;br /&gt;
| OCR1A&lt;br /&gt;
| BOTTOM&lt;br /&gt;
| TOP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Für Details der PWM Möglichkeiten, muß immer das jeweilge Datenblatt des Prozessors konsultiert werden, da sich die unterschiedlichen Prozessoren in ihren Möglichkeiten doch stark unterscheiden. Auch muß man aufpassen, welches zu setzende Bit in welchem Register sind. Auch hier kann es sein, dass gleichnamige Konfigurationsbits in unterschiedlichen Konfigurationsregistern (je nach konkretem Prozessortyp) sitzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Warteschleifen (delay.h) =&lt;br /&gt;
&lt;br /&gt;
Der Programmablauf kann verschiedene Arten von Wartefunktionen erfordern:&lt;br /&gt;
&lt;br /&gt;
* Warten im Sinn von Zeitvertrödeln&lt;br /&gt;
* Warten auf einen bestimmten Zustand an den I/O-Pins&lt;br /&gt;
* Warten auf einen bestimmten Zeitpunkt (siehe Timer)&lt;br /&gt;
* Warten auf einen bestimmten Zählerstand (siehe Counter)&lt;br /&gt;
&lt;br /&gt;
Der einfachste Fall, das Zeitvertrödeln, kann in vielen Fällen und mit großer Genauigkeit anhand der avr-libc Bibliotheksfunktionen _delay_ms() und _delay_us() erledigt werden. Die Bibliotheksfunktionen sind einfachen Zählschleifen (Warteschleifen) vorzuziehen, da leere Zählschleifen ohne besondere Vorkehrungen sonst bei eingeschalteter Optimierung vom avr-gcc-Compiler wegoptimiert werden. Weiterhin sind die Bibliotheksfunktionen bereits darauf vorbereitet, die in F_CPU definierte Taktfrequenz zu verwenden. Ausserdem sind die Funktionen der Bibliothek wirklich getestet.&lt;br /&gt;
&lt;br /&gt;
Einfach!? Schon, aber während gewartet wird, macht der µC nichts anderes mehr. Die Wartefunktion blockiert den Programmablauf. Möchte man einerseits warten, um z.B. eine LED blinken zu lassen und gleichzeitig andere Aktionen ausführen z.B. weitere LED bedienen, sollten die Timer/Counter des AVR verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Die Bibliotheksfunktionen funktionieren allerdings nur dann korrekt, wenn sie mit zur Übersetzungszeit (beim Compilieren) bekannten konstanten Werten aufgerufen werden. Der Quellcode muss mit eingeschalteter Optimierung übersetzt werden, sonst wird sehr viel Maschinencode erzeugt und die Wartezeiten stimmen nicht mehr mit dem Parameter überein.&lt;br /&gt;
&lt;br /&gt;
Abhängig von der Version der Bibliothek verhalten sich die Bibliotheksfunktionen etwas unterschiedlich.&lt;br /&gt;
&lt;br /&gt;
== avr-libc Versionen kleiner 1.6 ==&lt;br /&gt;
&lt;br /&gt;
Die Wartezeit der Funktion _delay_ms() ist auf 262,14ms/F_CPU (in MHz) begrenzt, d.h. bei 20 MHz kann man nur max. 13,1ms warten. Die Wartezeit der Funktion _delay_us() ist auf 768us/F_CPU (in MHz) begrenzt, d.h. bei 20 MHz kann man nur max. 38,4us warten. Längere Wartezeiten müssen dann über einen mehrfachen Aufruf in einer Schleife gelöst werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Blinken einer LED an PORTB Pin PB0 im ca. 1s Rhythmus&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;
/* Definiere F_CPU, wenn F_CPU nicht bereits vorher definiert &lt;br /&gt;
   (z.B. durch Übergabe als Parameter zum Compiler innerhalb &lt;br /&gt;
   des Makefiles). Zusätzlich Ausgabe einer Warnung, die auf die&lt;br /&gt;
   &amp;quot;nachträgliche&amp;quot; Definition hinweist */&lt;br /&gt;
#warning &amp;quot;F_CPU war noch nicht definiert, wird nun mit 3686400 definiert&amp;quot;&lt;br /&gt;
#define F_CPU 3686400UL     /* Quarz mit 3.6864 Mhz */&lt;br /&gt;
#endif&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;     /* in älteren avr-libc Versionen &amp;lt;avr/delay.h&amp;gt; */ &lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 lange, variable Verzögerungszeit, Einheit in Millisekunden&lt;br /&gt;
&lt;br /&gt;
Die maximale Zeit pro Funktionsaufruf ist begrenzt auf &lt;br /&gt;
262.14 ms / F_CPU in MHz (im Beispiel: &lt;br /&gt;
262.1 / 3.6864 = max. 71 ms) &lt;br /&gt;
&lt;br /&gt;
Daher wird die kleine Warteschleife mehrfach aufgerufen,&lt;br /&gt;
um auf eine längere Wartezeit zu kommen. Die zusätzliche &lt;br /&gt;
Prüfung der Schleifenbedingung lässt die Wartezeit geringfügig&lt;br /&gt;
ungenau werden (macht hier vielleicht 2-3ms aus).&lt;br /&gt;
*/&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;
    DDRB = ( 1 &amp;lt;&amp;lt; PB0 );        // PB0 an PORTB als Ausgang setzen&lt;br /&gt;
&lt;br /&gt;
    while( 1 ) {                // Endlosschleife&lt;br /&gt;
        PORTB ^= ( 1 &amp;lt;&amp;lt; PB0 );  // Toggle PB0 z.B. angeschlossene LED&lt;br /&gt;
        long_delay(1000);       // Eine Sekunde warten...&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== avr-libc Versionen ab 1.6 ==&lt;br /&gt;
&lt;br /&gt;
_delay_ms() kann mit einem Argument bis 6553,5 ms (= 6,5535 Sekunden) benutzt werden. Wird die früher gültige Grenze von 262,14 ms/F_CPU (in MHz) überschritten, so arbeitet _delay_ms() einfach etwas ungenauer und zählt nur noch mit einer Auflösung von 1/10 ms. Eine Verzögerung von 1000,10 ms ließe sich nicht mehr von einer von 1000,19 ms unterscheiden. Ein Verlust, der sich im Allgemeinen verschmerzen lässt. Dem Programmierer wird keine Rückmeldung gegeben, dass die Funktion ggf. gröber arbeitet, d.h. wenn es darauf ankommt, bitte den Parameter wie bisher geschickt wählen.&lt;br /&gt;
&lt;br /&gt;
Die Funktion _delay_us() wurde ebenfalls erweitert. Wenn deren maximal als genau behandelbares Argument überschritten wird, benutzt diese intern _delay_ms(). Damit gelten in diesem Fall die _delay_ms() Einschränkungen.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Blinken einer LED an PORTB Pin PB0 im ca. 1s Rhythmus, avr-libc ab Version 1.6&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;
/* Definiere F_CPU, wenn F_CPU nicht bereits vorher definiert &lt;br /&gt;
   (z.B. durch Übergabe als Parameter zum Compiler innerhalb &lt;br /&gt;
   des Makefiles). Zusätzlich Ausgabe einer Warnung, die auf die&lt;br /&gt;
   &amp;quot;nachträgliche&amp;quot; Definition hinweist */&lt;br /&gt;
#warning &amp;quot;F_CPU war noch nicht definiert, wird nun mit 3686400 definiert&amp;quot;&lt;br /&gt;
#define F_CPU 3686400UL     /* Quarz mit 3.6864 Mhz */&lt;br /&gt;
#endif&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main( void )&lt;br /&gt;
{&lt;br /&gt;
    DDRB = ( 1 &amp;lt;&amp;lt; PB0 );        // PB0 an PORTB als Ausgang setzen&lt;br /&gt;
&lt;br /&gt;
    while( 1 ) {                // Endlosschleife&lt;br /&gt;
        PORTB ^= ( 1 &amp;lt;&amp;lt; PB0 );  // Toggle PB0 z.B. angeschlossene LED&lt;br /&gt;
        _delay_ms(1000);        // Eine Sekunde +/-1/10000 Sekunde warten...&lt;br /&gt;
                                // funktioniert nicht mit Bibliotheken vor 1.6&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Programmieren mit Interrupts =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:right; margin:2em;&amp;quot;&amp;gt;&lt;br /&gt;
[[Image:Interrupt Programme.gif]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Nachdem wir nun alles Wissenswerte für die serielle Programmerstellung&lt;br /&gt;
gelernt haben nehmen wir jetzt ein völlig anderes Thema in Angriff, nämlich&lt;br /&gt;
die Programmierung unter Zuhilfenahme der Interrupts des AVR.&lt;br /&gt;
&lt;br /&gt;
Als erstes wollen wir uns noch einmal den allgemeinen Programmablauf bei der&lt;br /&gt;
Interrupt-Programmierung zu Gemüte führen.&lt;br /&gt;
&lt;br /&gt;
Man sieht, dass die Interruptroutine quasi parallel zum Hauptprogramm&lt;br /&gt;
abläuft. Da wir nur eine CPU haben ist es natürlich keine echte Parallelität,&lt;br /&gt;
sondern das Hauptprogramm wird beim Eintreffen eines Interrupts unterbrochen,&lt;br /&gt;
die Interruptroutine wird ausgeführt und danach erst wieder zum Hauptprogramm&lt;br /&gt;
zurückgekehrt.&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/forum/read-1-235092.html#new Ausführlicher Thread im Forum]&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
== Anforderungen an Interrupt-Routinen ==&lt;br /&gt;
&lt;br /&gt;
Um unliebsamen Überraschungen vorzubeugen, sollten einige Grundregeln bei der Implementierung der Interruptroutinen beachtet werden. Interruptroutinen soll möglichst kurz und schnell abarbeitbar sein, daraus folgt:&lt;br /&gt;
&lt;br /&gt;
* Keine umfangreichen Berechnungen innerhalb der Interruptroutine. (*)&lt;br /&gt;
* Keine langen Programmschleifen.&lt;br /&gt;
* Obwohl es möglich ist, während der Abarbeitung einer Interruptroutine andere oder sogar den gleichen Interrupt wieder zuzulassen, wird davon ohne genaue Kenntnis der internen Abläufe dringend abgeraten.&lt;br /&gt;
&lt;br /&gt;
Interruptroutinen (ISRs) sollten also möglichst kurz sein und keine Schleifen mit vielen Durchläufen enthalten. Längere Operationen können meist in einen &amp;quot;Interrupt-Teil&amp;quot; in einer ISR und einen &amp;quot;Arbeitsteil&amp;quot; im Hauptprogramm aufgetrennt werden. Z.B. Speichern des Zustands aller Eingänge im EEPROM in bestimmten Zeitabständen: ISR-Teil: Zeitvergleich (Timer,RTC) mit Logzeit/-intervall. Bei Übereinstimmung ein globales Flag setzen (volatile bei Flag-Deklaration nicht vergessen, s.u.). Dann im Hauptprogramm prüfen, ob das Flag gesetzt ist. Wenn ja: die Daten im EEPROM ablegen und Flag löschen.&lt;br /&gt;
&lt;br /&gt;
(*)&lt;br /&gt;
Hinweis: &lt;br /&gt;
Es gibt allerdings die seltene Situation, dass man gerade eingelesene&lt;br /&gt;
ADC-Werte sofort verarbeiten muss. Besonders dann, wenn man mehrere Werte sehr&lt;br /&gt;
schnell hintereinander bekommt. Dann bleibt einem nichts anderes übrig, als die&lt;br /&gt;
Werte noch in der ISR zu verarbeiten. Kommt aber sehr selten vor und sollte&lt;br /&gt;
durch geeignete Wahl des Systemtaktes bzw. Auswahl des Controllers vermieden werden!&lt;br /&gt;
&lt;br /&gt;
== Interrupt-Quellen ==&lt;br /&gt;
&lt;br /&gt;
Die folgenden Ereignisse können einen Interrupt auf einem AVR AT90S2313 auslösen, wobei die Reihenfolge der Auflistung auch die Priorität der Interrupts aufzeigt.&lt;br /&gt;
&lt;br /&gt;
* Reset&lt;br /&gt;
* Externer Interrupt 0&lt;br /&gt;
* Externer Interrupt 1&lt;br /&gt;
* Timer/Counter 1 Capture Ereignis&lt;br /&gt;
* Timer/Counter 1 Compare Match&lt;br /&gt;
* Timer/Counter 1 Überlauf&lt;br /&gt;
* Timer/Counter 0 Überlauf&lt;br /&gt;
* UART Zeichen empfangen&lt;br /&gt;
* UART Datenregister leer&lt;br /&gt;
* UART Zeichen gesendet&lt;br /&gt;
* Analoger Komparator&lt;br /&gt;
&lt;br /&gt;
Die Anzahl der möglichen Interruptquellen variiert zwischen den verschiedenen Typen. Im Zweifel hilft ein Blick ins Datenblatt (&amp;quot;Interrupt Vectors&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Register ==&lt;br /&gt;
&lt;br /&gt;
Der AT90S2313 verfügt über 2 Register die mit den&lt;br /&gt;
Interrupts zusammen hängen.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;GIMSK&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;G&#039;&#039;&#039;eneral &#039;&#039;&#039;I&#039;&#039;&#039;nterrupt &#039;&#039;&#039;M&#039;&#039;&#039;ask &#039;&#039;&#039;R&#039;&#039;&#039;egister.&amp;lt;br /&amp;gt;&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;INT1&#039;&#039;&#039; || &#039;&#039;&#039;INT0&#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; || &#039;&#039;&#039;-&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
! R/W&lt;br /&gt;
| R/W || R/W || R || R || R || R || R || 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;INT1&#039;&#039;&#039; (External &#039;&#039;&#039;Int&#039;&#039;&#039;errupt Request &#039;&#039;&#039;1&#039;&#039;&#039; Enable)&lt;br /&gt;
:Wenn dieses Bit gesetzt ist, wird ein Interrupt ausgelöst, wenn am &#039;&#039;&#039;INT1&#039;&#039;&#039;-Pin eine steigende oder fallende (je nach Konfiguration im &#039;&#039;&#039;MCUCR&#039;&#039;&#039;) Flanke erkannt wird.&lt;br /&gt;
:Das Global Enable Interrupt Flag muss selbstverständlich auch gesetzt sein.&lt;br /&gt;
:Der Interrupt wird auch ausgelöst, wenn der Pin als Ausgang geschaltet ist. Auf diese Weise bietet sich die Möglichkeit, Software-Interrupts zu realisieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;INT0&#039;&#039;&#039; (External &#039;&#039;&#039;Int&#039;&#039;&#039;errupt Request &#039;&#039;&#039;0&#039;&#039;&#039; Enable)&lt;br /&gt;
:Wenn dieses Bit gesetzt ist, wird ein Interrupt ausgelöst, wenn am &#039;&#039;&#039;INT0&#039;&#039;&#039;-Pin eine steigende oder fallende (je nach Konfiguration im &#039;&#039;&#039;MCUCR&#039;&#039;&#039;) Flanke erkannt wird.&lt;br /&gt;
:Das Global Enable Interrupt Flag muss selbstverständlich auch gesetzt sein.&lt;br /&gt;
:Der Interrupt wird auch ausgelöst, wenn der Pin als Ausgang geschaltet ist. Auf diese Weise bietet sich die Möglichkeit, Software-Interrupts zu realisieren.&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;GIFR&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;G&#039;&#039;&#039;eneral &#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;INTF1&#039;&#039;&#039; || &#039;&#039;&#039;INTF0&#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; || &#039;&#039;&#039;-&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
! R/W&lt;br /&gt;
| R/W || R/W || R || R || R || R || R || 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;INTF1&#039;&#039;&#039; (External &#039;&#039;&#039;Int&#039;&#039;&#039;errupt Flag &#039;&#039;&#039;1&#039;&#039;&#039;)&lt;br /&gt;
:Dieses Bit wird gesetzt, wenn am &#039;&#039;&#039;INT1&#039;&#039;&#039;-Pin eine Interrupt-Kondition, entsprechend der Konfiguration, erkannt wird. Wenn das Global Enable Interrupt Flag gesetzt ist, wird die Interruptroutine angesprungen.&lt;br /&gt;
:Das Flag wird automatisch gelöscht, wenn die Interruptroutine beendet ist. Alternativ kann das Flag gelöscht werden, indem der Wert &#039;&#039;&#039;1(!)&#039;&#039;&#039; eingeschrieben wird.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;INTF0&#039;&#039;&#039; (External &#039;&#039;&#039;Int&#039;&#039;&#039;errupt Flag &#039;&#039;&#039;0&#039;&#039;&#039;)&lt;br /&gt;
:Dieses Bit wird gesetzt, wenn am &#039;&#039;&#039;INT0&#039;&#039;&#039;-Pin eine Interrupt-Kondition, entsprechend der Konfiguration, erkannt wird. Wenn das Global Enable Interrupt Flag gesetzt ist, wird die Interruptroutine angesprungen.&lt;br /&gt;
:Das Flag wird automatisch gelöscht, wenn die Interruptroutine beendet ist. Alternativ kann das Flag gelöscht werden, indem der Wert &#039;&#039;&#039;1(!)&#039;&#039;&#039; eingeschrieben wird.&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;MCUCR&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;MCU&#039;&#039;&#039; &#039;&#039;&#039;C&#039;&#039;&#039;ontrol &#039;&#039;&#039;R&#039;&#039;&#039;egister.&lt;br /&gt;
&lt;br /&gt;
Das MCU Control Register enthält Kontrollbits für allgemeine&lt;br /&gt;
MCU-Funktionen.&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;SE&#039;&#039;&#039;|| &#039;&#039;&#039;SM&#039;&#039;&#039;|| &#039;&#039;&#039;ISC11&#039;&#039;&#039;|| &#039;&#039;&#039;ISC10&#039;&#039;&#039;|| &#039;&#039;&#039;ISC01&#039;&#039;&#039;|| &#039;&#039;&#039;ISC00&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
! R/W&lt;br /&gt;
| R || R || 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;
&#039;&#039;&#039;SE&#039;&#039;&#039; (&#039;&#039;&#039;S&#039;&#039;&#039;leep &#039;&#039;&#039;E&#039;&#039;&#039;nable)&lt;br /&gt;
:Dieses Bit muss gesetzt sein, um den Controller mit dem &#039;&#039;&#039;SLEEP&#039;&#039;&#039;-Befehl in den Schlafzustand versetzen zu können.&lt;br /&gt;
:Um den Schlafmodus nicht irrtümlich einzuschalten, wird empfohlen, das Bit erst unmittelbar vor Ausführung des &#039;&#039;&#039;SLEEP&#039;&#039;&#039;-Befehls zu setzen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SM&#039;&#039;&#039; (&#039;&#039;&#039;S&#039;&#039;&#039;leep &#039;&#039;&#039;M&#039;&#039;&#039;ode)&lt;br /&gt;
:Dieses Bit bestimmt der Schlafmodus.&lt;br /&gt;
:Ist das Bit gelöscht, so wird der &#039;&#039;&#039;Idle&#039;&#039;&#039;-Modus ausgeführt. Ist das Bit gesetzt, so wird der &#039;&#039;&#039;Power-Down&#039;&#039;&#039;-Modus ausgeführt. (für andere AVR Controller siehe Abschnitt &amp;quot;Sleep-Mode&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ISC11&#039;&#039;&#039;, &#039;&#039;&#039;ISC10&#039;&#039;&#039; (&#039;&#039;&#039;I&#039;&#039;&#039;nterrupt &#039;&#039;&#039;S&#039;&#039;&#039;ense &#039;&#039;&#039;C&#039;&#039;&#039;ontrol &#039;&#039;&#039;1&#039;&#039;&#039; Bits)&lt;br /&gt;
:Diese beiden Bits bestimmen, ob die steigende oder die fallende Flanke für die Interrupterkennung am &#039;&#039;&#039;INT1&#039;&#039;&#039;-Pin ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
! ISC11 || ISC10 || Bedeutung&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;
| Low Level an &#039;&#039;&#039;INT1&#039;&#039;&#039; erzeugt einen Interrupt.&lt;br /&gt;
&lt;br /&gt;
In der Beschreibung heißt es, der Interrupt wird getriggert, solange der Pin auf 0 bleibt, also eigentlich unbrauchbar.&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;
| Reserviert&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;
| Die fallende Flanke an &#039;&#039;&#039;INT1&#039;&#039;&#039; erzeugt einen Interrupt.&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;
| Die steigende Flanke an &#039;&#039;&#039;INT1&#039;&#039;&#039; erzeugt einen Interrupt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ISC01&#039;&#039;&#039;, &#039;&#039;&#039;ISC00&#039;&#039;&#039; (&#039;&#039;&#039;I&#039;&#039;&#039;nterrupt &#039;&#039;&#039;S&#039;&#039;&#039;ense &#039;&#039;&#039;C&#039;&#039;&#039;ontrol &#039;&#039;&#039;0&#039;&#039;&#039; Bits)&lt;br /&gt;
:Diese beiden Bits bestimmen, ob die steigende oder die fallende Flanke für die Interrupterkennung am &#039;&#039;&#039;INT0&#039;&#039;&#039;-Pin ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
! ISC01 || ISC00 || Bedeutung&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;
| Low Level an &#039;&#039;&#039;INT0&#039;&#039;&#039; erzeugt einen Interrupt.&lt;br /&gt;
&lt;br /&gt;
In der Beschreibung heißt es, der Interrupt wird getriggert, solange der Pin auf 0 bleibt, also eigentlich unbrauchbar.&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;
| Reserviert&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;
| Die fallende Flanke an &#039;&#039;&#039;INT0&#039;&#039;&#039; erzeugt einen Interrupt.&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;
| Die steigende Flanke an &#039;&#039;&#039;INT0&#039;&#039;&#039; erzeugt einen Interrupt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Allgemeines über die Interrupt-Abarbeitung ==&lt;br /&gt;
&lt;br /&gt;
Wenn ein Interrupt eintrifft, wird automatisch das &#039;&#039;&#039;Global Interrupt Enable&#039;&#039;&#039; Bit im Status Register &#039;&#039;&#039;SREG&#039;&#039;&#039; gelöscht und alle weiteren Interrupts unterbunden. Obwohl es möglich ist, zu diesem Zeitpunkt bereits wieder das GIE-bit zu setzen, wird dringend davon abgeraten. Dieses wird nämlich automatisch gesetzt, wenn die Interruptroutine beendet wird. Wenn in der Zwischenzeit weitere Interrupts eintreffen, werden die zugehörigen Interrupt-Bits gesetzt und die Interrupts bei Beendigung der laufenden Interrupt-Routine in der Reihenfolge ihrer Priorität ausgeführt. Dies kann&lt;br /&gt;
eigentlich nur dann zu Problemen führen, wenn ein hoch priorisierter Interrupt ständig und in kurzer Folge auftritt. Dieser sperrt dann möglicherweise alle anderen Interrupts mit niedrigerer Priorität. Dies ist einer der Gründe, weshalb die Interrupt-Routinen sehr kurz gehalten werden sollen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Das Status-Register ===&lt;br /&gt;
&lt;br /&gt;
Es gilt auch zu beachten, dass das Status-Register während der Abarbeitung einer Interruptroutine nicht automatisch gesichert wird. Falls notwendig, muss dies vom Programmierer selber vorgesehen werden. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Interrupts mit dem AVR GCC Compiler (WinAVR) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Selbstverständlich können alle interruptspezifischen Registerzugriffe wie gewohnt über I/O-Adressierung vorgenommen werden. Etwas einfacher geht es jedoch, wenn wir die vom Compiler zur Verfügung gestellten Mittel einsetzen.--&amp;gt;&lt;br /&gt;
Funktionen zur Interrupt-Verarbeitung werden in den Includedateien &#039;&#039;interrupt.h&#039;&#039;  der avr-libc zur Verfügung gestellt (bei älterem Quellcode zusätzlich &#039;&#039;signal.h&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// fuer sei(), cli() und ISR():&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Makro &#039;&#039;&#039;sei()&#039;&#039;&#039; schaltet die Interrupts ein. Eigentlich wird nichts anderes gemacht, als das &#039;&#039;&#039;Global Interrupt Enable&#039;&#039;&#039; Bit im Status Register gesetzt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    sei();&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Makro &#039;&#039;&#039;cli()&#039;&#039;&#039; schaltet die Interrupts aus, oder anders gesagt, das &#039;&#039;&#039;Global Interrupt Enable&#039;&#039;&#039; Bit im Status Register wird gelöscht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    cli();&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oft steht man vor der Aufgabe, dass eine Codesequenz nicht unterbrochen werden darf. Es liegt dann nahe, zu Beginn dieser Sequenz ein cli() und am Ende ein sei() einzufügen. Dies ist jedoch ungünstig, wenn die Interrupts vor Aufruf der Sequenz deaktiviert waren und danach auch weiterhin deaktiviert bleiben sollen. Ein sei() würde ungeachtet des vorherigen  Zustands die Interrupts aktivieren, was zu unerwünschten Seiteneffekten führen kann. Die aus dem folgenden Beispiel ersichtliche Vorgehensweise ist in solchen Fällen vorzuziehen:&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;
#include &amp;lt;inttypes.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
void NichtUnterbrechenBitte(void)&lt;br /&gt;
{&lt;br /&gt;
   uint8_t tmp_sreg;  // temporaerer Speicher fuer das Statusregister&lt;br /&gt;
&lt;br /&gt;
   tmp_sreg = SREG;   // Statusregister (also auch das I-Flag darin) sichern&lt;br /&gt;
   cli();             // Interrupts global deaktivieren&lt;br /&gt;
&lt;br /&gt;
   /* hier &amp;quot;unterbrechnungsfreier&amp;quot; Code */&lt;br /&gt;
&lt;br /&gt;
   /* Beispiel Anfang&lt;br /&gt;
     JTAG-Interface eines ATmega16 per Software deaktivieren &lt;br /&gt;
     und damit die JTAG-Pins an PORTC für &amp;quot;general I/O&amp;quot; nutzbar machen&lt;br /&gt;
     ohne die JTAG-Fuse-Bit zu aendern. Dazu ist eine &amp;quot;timed sequence&amp;quot;&lt;br /&gt;
     einzuhalten (vgl Datenblatt ATmega16, Stand 10/04, S. 229): &lt;br /&gt;
     Das JTD-Bit muss zweimal innerhalb von 4 Taktzyklen geschrieben &lt;br /&gt;
     werden. Ein Interrupt zwischen den beiden Schreibzugriffen wuerde &lt;br /&gt;
     die erforderliche Sequenz &amp;quot;brechen&amp;quot;, das JTAG-Interface bliebe&lt;br /&gt;
     weiterhin aktiv und die IO-Pins weiterhin für JTAG reserviert. */&lt;br /&gt;
&lt;br /&gt;
   MCUCSR |= (1&amp;lt;&amp;lt;JTD);&lt;br /&gt;
   MCUCSR |= (1&amp;lt;&amp;lt;JTD); // 2 mal in Folge ,vgl. Datenblatt fuer mehr Information&lt;br /&gt;
&lt;br /&gt;
   /* Beispiel Ende */&lt;br /&gt;
  &lt;br /&gt;
   SREG = tmp_sreg;     // Status-Register wieder herstellen &lt;br /&gt;
                      // somit auch das I-Flag auf gesicherten Zustand setzen&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void NichtSoGut(void)&lt;br /&gt;
{&lt;br /&gt;
   cli();&lt;br /&gt;
   &lt;br /&gt;
   /* hier &amp;quot;unterbrechnungsfreier&amp;quot; Code */&lt;br /&gt;
   &lt;br /&gt;
   sei();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
   //...&lt;br /&gt;
&lt;br /&gt;
   cli();  &lt;br /&gt;
   // Interrupts global deaktiviert &lt;br /&gt;
&lt;br /&gt;
   NichtUnterbrechenBitte();&lt;br /&gt;
   // auch nach Aufruf der Funktion deaktiviert&lt;br /&gt;
&lt;br /&gt;
   sei();&lt;br /&gt;
   // Interrupts global aktiviert &lt;br /&gt;
&lt;br /&gt;
   NichtUnterbrechenBitte();&lt;br /&gt;
   // weiterhin aktiviert&lt;br /&gt;
   //...&lt;br /&gt;
&lt;br /&gt;
   /* Verdeutlichung der unguenstigen Vorgehensweise mit cli/sei: */&lt;br /&gt;
   cli();  &lt;br /&gt;
   // Interrupts jetzt global deaktiviert &lt;br /&gt;
&lt;br /&gt;
   NichtSoGut();&lt;br /&gt;
   // nach Aufruf der Funktion sind Interrupts global aktiviert &lt;br /&gt;
   // dies ist mglw. ungewollt!&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;
&amp;lt;!-- mt: besser so nicht(?), lieber &amp;quot;datenblattkonform&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font face=&amp;quot;Courier New&amp;quot;&amp;gt;&#039;&#039;&#039;timer_enable_int (unsigned char ints);&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;/font&amp;gt;Schaltet Timerbezogene Interrupts ein bzw. aus.&amp;lt;br /&amp;gt;&lt;br /&gt;
Wenn als Argument &#039;&#039;&#039;ints&#039;&#039;&#039; der Wert 0 übergeben wird so werden alle&lt;br /&gt;
Timerinterrupts ausgeschaltet, ansonsten muss in &#039;&#039;&#039;ints&#039;&#039;&#039; angegeben werden,&lt;br /&gt;
welche Interrupts zu aktivieren sind. Dabei müssen einfach die entsprechend zu&lt;br /&gt;
setzenden Bits definiert werden.&amp;lt;br /&amp;gt;&lt;br /&gt;
Beispiel: &#039;&#039;&#039;&amp;lt;font face=&amp;quot;Courier New&amp;quot;&amp;gt;timer_enable_int (1 &amp;lt;&amp;lt; TOIE1));&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&#039;&#039;&#039;Achtung: Wenn ein Timerinterrupt eingeschaltet wird während ein&lt;br /&gt;
anderer Timerinterrupt bereits läuft, dann müssen beide Bits angegeben werden&lt;br /&gt;
sonst wird der andere Timerinterrupt versehentlich ausgeschaltet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font face=&amp;quot;Courier New&amp;quot;&amp;gt;&#039;&#039;&#039;enable_external_int (unsigned char ints);&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;/font&amp;gt;Schaltet die externen Interrupts ein bzw. aus.&amp;lt;br /&amp;gt;&lt;br /&gt;
Wenn als Argument &#039;&#039;&#039;ints&#039;&#039;&#039; der Wert 0 übergeben wird so werden alle externen&lt;br /&gt;
Interrrups ausgeschaltet, ansonsten muss in &#039;&#039;&#039;ints&#039;&#039;&#039; angegeben werden, welche&lt;br /&gt;
Interrupts zu aktivieren sind. Dabei müssen einfach die entsprechend zu&lt;br /&gt;
setzenden Bits definiert werden.&amp;lt;br /&amp;gt;&lt;br /&gt;
Beispiel: &#039;&#039;&#039;&amp;lt;font face=&amp;quot;Courier New&amp;quot;&amp;gt;enable_external_int ((1&amp;lt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&#039;&#039;&#039;Schaltet die externen Interrupts 0 und 1 ein.&lt;br /&gt;
&lt;br /&gt;
Nachdem nun die Interrupts aktiviert sind, braucht es selbstverständlich noch den auszuführenden Code, der ablaufen soll, wenn ein Interrupt eintrifft.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Zu den aktivierten Interrupts ist eine Funktion zu programmieren, deren Code aufgerufen wird, wenn der betreffende Interrupt auftritt (Interrupt-Handler, Interrupt-Service-Routine). Dazu existiert die Definition (ein Makro) &#039;&#039;&#039;ISR&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== ISR ===&lt;br /&gt;
&lt;br /&gt;
(&#039;&#039;ISR()&#039;&#039; ersetzt bei neueren Versionen der avr-libc &#039;&#039;SIGNAL()&#039;&#039;. SIGNAL sollte nicht mehr genutzt werden, zur Portierung von SIGNAL nach ISR siehe den [[AVR-GCC-Tutorial#Anhang|Anhang]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
//...&lt;br /&gt;
ISR(Vectorname) /* vormals: SIGNAL(siglabel) dabei Vectorname != siglabel ! */&lt;br /&gt;
{&lt;br /&gt;
    /* Interrupt Code */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit &#039;&#039;ISR&#039;&#039; wird eine Funktion für die Bearbeitung eines Interrupts eingeleitet. Als Argument muss dabei die Benennung des entsprechenden Interruptvektors angegeben werden. Diese sind in den jeweiligen Includedateien IOxxxx.h zu finden. Die Bezeichnung entspricht dem Namen aus dem Datenblatt, bei dem die Leerzeichen durch Unterstriche ersetzt sind und ein &#039;&#039;_vect&#039;&#039; angehängt ist.&lt;br /&gt;
&lt;br /&gt;
Als Beispiel ein Ausschnitt aus der Datei für den ATmega8 (bei WinAVR Standardinstallation in C:\WinAVR\avr\include\avr\iom8.h) in der neben den aktuellen Namen für &#039;&#039;ISR&#039;&#039; (*_vect) noch die Bezeichnungen für das inzwischen nicht mehr aktuelle &#039;&#039;SIGNAL&#039;&#039; (SIG_*) enthalten sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//...&lt;br /&gt;
/* $Id: iom8.h,v 1.13 2005/10/30 22:11:23 joerg_wunsch Exp $ */&lt;br /&gt;
&lt;br /&gt;
/* avr/iom8.h - definitions for ATmega8 */&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
/* Interrupt vectors */&lt;br /&gt;
&lt;br /&gt;
/* External Interrupt Request 0 */&lt;br /&gt;
#define INT0_vect                       _VECTOR(1)&lt;br /&gt;
#define SIG_INTERRUPT0                  _VECTOR(1)&lt;br /&gt;
&lt;br /&gt;
/* External Interrupt Request 1 */&lt;br /&gt;
#define INT1_vect                       _VECTOR(2)&lt;br /&gt;
#define SIG_INTERRUPT1                  _VECTOR(2)&lt;br /&gt;
&lt;br /&gt;
/* Timer/Counter2 Compare Match */&lt;br /&gt;
#define TIMER2_COMP_vect                _VECTOR(3)&lt;br /&gt;
#define SIG_OUTPUT_COMPARE2             _VECTOR(3)&lt;br /&gt;
&lt;br /&gt;
/* Timer/Counter2 Overflow */&lt;br /&gt;
#define TIMER2_OVF_vect                 _VECTOR(4)&lt;br /&gt;
#define SIG_OVERFLOW2                   _VECTOR(4)&lt;br /&gt;
&lt;br /&gt;
/* Timer/Counter1 Capture Event */&lt;br /&gt;
#define TIMER1_CAPT_vect                _VECTOR(5)&lt;br /&gt;
#define SIG_INPUT_CAPTURE1              _VECTOR(5)&lt;br /&gt;
&lt;br /&gt;
/* Timer/Counter1 Compare Match A */&lt;br /&gt;
#define TIMER1_COMPA_vect               _VECTOR(6)&lt;br /&gt;
#define SIG_OUTPUT_COMPARE1A            _VECTOR(6)&lt;br /&gt;
&lt;br /&gt;
/* Timer/Counter1 Compare Match B */&lt;br /&gt;
#define TIMER1_COMPB_vect               _VECTOR(7)&lt;br /&gt;
#define SIG_OUTPUT_COMPARE1B            _VECTOR(7)&lt;br /&gt;
&lt;br /&gt;
//...&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Vor Nutzung von SIGNAL muss ebenfalls die Header-Datei signal.h eingebunden werden.--&amp;gt; &lt;br /&gt;
Mögliche Funktionsrümpfe für Interruptfunktionen sind zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
/* veraltet: #include &amp;lt;avr/signal.h&amp;gt; */&lt;br /&gt;
&lt;br /&gt;
ISR(INT0_vect)       /* veraltet: SIGNAL(SIG_INTERRUPT0) */&lt;br /&gt;
{&lt;br /&gt;
    /* Interrupt Code */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER0_OVF_vect) /* veraltet: SIGNAL(SIG_OVERFLOW0) */&lt;br /&gt;
{&lt;br /&gt;
    /* Interrupt Code */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(USART_RXC_vect) /* veraltet: SIGNAL(SIG_UART_RECV) */&lt;br /&gt;
{&lt;br /&gt;
    /* Interrupt Code */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// und so weiter und so fort...&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf die korrekte Schreibweise der Vektorbezeichnung ist zu achten. Der gcc-Compiler prüft erst ab Version 4.x, ob ein Signal/Interrupt der angegebenen Bezeichnung tatsächlich in der Includedatei definiert ist und gibt andernfalls eine Warnung aus. Bei WinAVR (ab 2/2005) wurde die Überprüfung auch in den mitgelieferten Compiler der Version 3.x integriert. Aus dem gcc-Quellcode Version 3.x selbst erstellte Compiler enthalten die Prüfung nicht (vgl. [[AVR-GCC]]). &lt;br /&gt;
&lt;br /&gt;
Während der Ausführung der Funktion sind alle weiteren Interrupts automatisch gesperrt. Beim Verlassen der Funktion werden die Interrupts wieder zugelassen.&lt;br /&gt;
&lt;br /&gt;
Sollte während der Abarbeitung der Interruptroutine ein weiterer Interrupt (gleiche oder andere Interruptquelle) auftreten, so wird das entsprechende Bit im zugeordneten Interrupt Flag Register gesetzt und die entsprechende Interruptroutine automatisch nach dem Beenden der aktuellen Funktion aufgerufen.&lt;br /&gt;
&lt;br /&gt;
Ein Problem ergibt sich eigentlich nur dann, wenn während der Abarbeitung der aktuellen Interruptroutine mehrere gleichartige Interrupts auftreten. Die entsprechende Interruptroutine wird im Nachhinein zwar aufgerufen jedoch wissen wir nicht, ob nun der entsprechende Interrupt einmal, zweimal oder gar noch öfter aufgetreten ist. Deshalb soll hier noch einmal betont werden, dass Interruptroutinen so schnell wie nur irgend möglich wieder verlassen werden sollten.&lt;br /&gt;
&lt;br /&gt;
=== Unterbrechbare Interruptroutinen ===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Faustregel&amp;quot;: im Zweifel &#039;&#039;&#039;ISR&#039;&#039;&#039;. Die nachfolgend beschriebene Methode nur dann verwenden, wenn man sich über die unterschiedliche Funktionsweise im Klaren ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
INTERRUPT (signame)&lt;br /&gt;
{&lt;br /&gt;
    /* Interrupt Code */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
//...&lt;br /&gt;
void XXX_vect(void) __attribute__((interrupt));&lt;br /&gt;
void XXX_vect(void) {&lt;br /&gt;
  //...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hierbei steht XXX für den oben beschriebenen Namen des Vektors (also z.B. &#039;&#039;void TIMER0_OVF_vect(void)...&#039;&#039;). Der Unterschied im Vergleich zu ISR ist, dass hier beim Aufrufen der Funktion das &#039;&#039;&#039;Global Enable Interrupt&#039;&#039;&#039; Bit automatisch wieder gesetzt und somit weitere Interrupts zugelassen werden. Dies kann zu nicht unerheblichen Problemen von im einfachsten Fall einem Stack overflow bis zu sonstigen unerwarteten Effekten führen und sollte wirklich &#039;&#039;&#039;nur dann&#039;&#039;&#039; angewendet werden, wenn man sich absolut sicher ist, das Ganze auch im Griff zu haben.&lt;br /&gt;
&lt;br /&gt;
siehe auch: Hinweise in [[AVR-GCC]]&lt;br /&gt;
&lt;br /&gt;
siehe dazu: http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html&lt;br /&gt;
&lt;br /&gt;
== Datenaustausch mit Interrupt-Routinen ==&lt;br /&gt;
&lt;br /&gt;
Variablen die sowohl in Interrupt-Routinen (ISR = Interrupt Service Routine(s)), als auch vom übrigen Programmcode geschrieben oder gelesen werden, müssen mit einem &#039;&#039;&#039;volatile&#039;&#039;&#039; deklariert werden. Damit wird dem Compiler mitgeteilt, dass der Inhalt der Variablen vor jedem Lesezugriff aus dem Speicher gelesen und nach jedem Schreibzugriff in den Speicher geschrieben wird. Ansonsten könnte der Compiler den Code so optimieren, dass der Wert der Variablen nur in Prozessorregistern zwischengespeichert wird, die nichts von der Änderung woanders mitbekommen.&lt;br /&gt;
&lt;br /&gt;
Zur Veranschaulichung ein Codefragment für eine Tastenentprellung mit Erkennung einer &amp;quot;lange gedrückten&amp;quot; Taste.&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;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
// Schwellwerte&lt;br /&gt;
// Entprellung: &lt;br /&gt;
#define CNTDEBOUNCE 10&lt;br /&gt;
// &amp;quot;lange gedrueckt:&amp;quot;&lt;br /&gt;
#define CNTREPEAT 200&lt;br /&gt;
&lt;br /&gt;
// hier z.B. Taste an Pin2 PortA &amp;quot;active low&amp;quot; = 0 wenn gedrueckt&lt;br /&gt;
#define KEY_PIN  PINA&lt;br /&gt;
#define KEY_PINNO PA2&lt;br /&gt;
&lt;br /&gt;
// beachte: volatile! &lt;br /&gt;
volatile uint8_t gKeyCounter;&lt;br /&gt;
&lt;br /&gt;
// Timer-Compare Interrupt ISR, wird z.B. alle 10ms ausgefuehrt&lt;br /&gt;
ISR(TIMER1_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
   // hier wird gKeyCounter veraendert. Die übrigen&lt;br /&gt;
   // Programmteile müssen diese Aenderung &amp;quot;sehen&amp;quot;:&lt;br /&gt;
   // volatile -&amp;gt; aktuellen Wert immer in den Speicher schreiben&lt;br /&gt;
   if ( !(KEY_PIN &amp;amp; (1&amp;lt;&amp;lt;KEY_PINNO)) ) {&lt;br /&gt;
      if (gKeyCounter &amp;lt; CNTREPEAT) gKeyCounter++;&lt;br /&gt;
   }&lt;br /&gt;
   else {&lt;br /&gt;
      gKeyCounter = 0;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
//...&lt;br /&gt;
    /* hier: Initialisierung der Ports und des Timer-Interrupts */&lt;br /&gt;
//... &lt;br /&gt;
   // hier wird auf gKeyCounter zugegriffen. Dazu muss der in der&lt;br /&gt;
   // ISR geschriebene Wert bekannt sein:&lt;br /&gt;
   // volatile -&amp;gt; aktuellen Wert immer aus dem Speicher lesen&lt;br /&gt;
   if ( gKeyCounter &amp;gt; CNTDEBOUNCE ) { // Taste mind. 10*10 ms &amp;quot;prellfrei&amp;quot;&lt;br /&gt;
       if (gKeyCounter == CNTREPEAT) {&lt;br /&gt;
          /* hier: Code fuer &amp;quot;Taste lange gedrueckt&amp;quot; */&lt;br /&gt;
       }&lt;br /&gt;
       else {&lt;br /&gt;
          /* hier: Code fuer &amp;quot;Taste kurz gedrueckt&amp;quot; */&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;
Wird innerhalb einer ISR mehrfach auf eine mit volatile deklarierte Variable zugegriffen, wirkt sich dies ungünstig auf die Verarbeitungsgeschwindigkeit aus, da bei jedem Zugriff mit dem Speicherinhalt abgeglichen wird. Da bei AVR-Controllern &#039;&#039;innerhalb&#039;&#039; einer ISR keine Unterbrechungen zu erwarten sind, bietet es sich an, einen Zwischenspeicher in Form einer lokalen Variable zu verwenden, deren Inhalt zu Beginn und am Ende mit dem der volatile Variable synchronisiert wird. Lokale Variable werden bei eingeschalteter Optimierung mit hoher Wahrscheinlichkeit in Prozessorregistern verwaltet und der Zugriff darauf ist daher nur mit wenigen internen Operationen verbunden. Die ISR aus dem vorherigen Beispiel lässt sich so optimieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//...&lt;br /&gt;
ISR(TIMER1_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
   uint8_t tmp_kc;&lt;br /&gt;
&lt;br /&gt;
   tmp_kc = gKeyCounter; // Uebernahme in lokale Arbeitsvariable&lt;br /&gt;
&lt;br /&gt;
   if ( !(KEY_PIN &amp;amp; (1&amp;lt;&amp;lt;KEY_PINNO)) ) {&lt;br /&gt;
      if (tmp_kc &amp;lt; CNTREPEAT) {&lt;br /&gt;
         tmp_kc++;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   else {&lt;br /&gt;
      tmp_kc = 0;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   gKeyCounter = tmp_kc; // Zurueckschreiben&lt;br /&gt;
}&lt;br /&gt;
//...&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Vergleich die Disassemblies (Ausschnitte der &amp;quot;lss-Dateien&amp;quot;, compiliert für ATmega162) im Anschluss. Man erkennt den viermaligen Zugriff auf die Speicheraddresse von &#039;&#039;gKeyCounter&#039;&#039; (hier 0x032A) in der ISR ohne &amp;quot;Cache&amp;quot;-Variable und den zweimaligen Zugriff in der Variante mit Zwischenspeicher. Im Beispiel ist der Vorteil gering, bei komplexeren Routinen kann die Zwischenspeicherung in lokalen Variablen jedoch zu deutlicheren Verbesserungen führen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
     86a:	1f 92       	push	r1&lt;br /&gt;
     86c:	0f 92       	push	r0&lt;br /&gt;
     86e:	0f b6       	in	r0, 0x3f	; 63&lt;br /&gt;
     870:	0f 92       	push	r0&lt;br /&gt;
     872:	11 24       	eor	r1, r1&lt;br /&gt;
     874:	8f 93       	push	r24&lt;br /&gt;
    if ( !(KEY_PIN &amp;amp; (1&amp;lt;&amp;lt;KEY_PINNO)) ) {&lt;br /&gt;
     876:	ca 99       	sbic	0x19, 2	; 25&lt;br /&gt;
     878:	0a c0       	rjmp	.+20     	; 0x88e &amp;lt;__vector_13+0x24&amp;gt;&lt;br /&gt;
      if (gKeyCounter &amp;lt; CNTREPEAT) gKeyCounter++;&lt;br /&gt;
     87a:	80 91 2a 03 	lds	r24, 0x032A&lt;br /&gt;
     87e:	88 3c       	cpi	r24, 0xC8	; 200 &lt;br /&gt;
     880:	40 f4       	brcc	.+16     	; 0x892 &amp;lt;__vector_13+0x28&amp;gt;&lt;br /&gt;
     882:	80 91 2a 03 	lds	r24, 0x032A&lt;br /&gt;
     886:	8f 5f       	subi	r24, 0xFF	; 255&lt;br /&gt;
     888:	80 93 2a 03 	sts	0x032A, r24&lt;br /&gt;
     88c:	02 c0       	rjmp	.+4      	; 0x892 &amp;lt;__vector_13+0x28&amp;gt;&lt;br /&gt;
   }&lt;br /&gt;
   else {&lt;br /&gt;
      gKeyCounter = 0;&lt;br /&gt;
     88e:	10 92 2a 03 	sts	0x032A, r1&lt;br /&gt;
     892:	8f 91       	pop	r24&lt;br /&gt;
     894:	0f 90       	pop	r0&lt;br /&gt;
     896:	0f be       	out	0x3f, r0	; 63&lt;br /&gt;
     898:	0f 90       	pop	r0&lt;br /&gt;
     89a:	1f 90       	pop	r1&lt;br /&gt;
     89c:	18 95       	reti&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
     86a:	1f 92       	push	r1&lt;br /&gt;
     86c:	0f 92       	push	r0&lt;br /&gt;
     86e:	0f b6       	in	r0, 0x3f	; 63&lt;br /&gt;
     870:	0f 92       	push	r0&lt;br /&gt;
     872:	11 24       	eor	r1, r1&lt;br /&gt;
     874:	8f 93       	push	r24&lt;br /&gt;
   uint8_t tmp_kc;&lt;br /&gt;
 &lt;br /&gt;
   tmp_kc = gKeyCounter;&lt;br /&gt;
     876:	80 91 2a 03 	lds	r24, 0x032A&lt;br /&gt;
 &lt;br /&gt;
   if ( !(KEY_PIN &amp;amp; (1&amp;lt;&amp;lt;KEY_PINNO)) ) {&lt;br /&gt;
     87a:	ca 9b       	sbis	0x19, 2	; 25&lt;br /&gt;
     87c:	02 c0       	rjmp	.+4      	; 0x882 &amp;lt;__vector_13+0x18&amp;gt;&lt;br /&gt;
     87e:	80 e0       	ldi	r24, 0x00	; 0&lt;br /&gt;
     880:	03 c0       	rjmp	.+6      	; 0x888 &amp;lt;__vector_13+0x1e&amp;gt;&lt;br /&gt;
      if (tmp_kc &amp;lt; CNTREPEAT) {&lt;br /&gt;
     882:	88 3c       	cpi	r24, 0xC8	; 200&lt;br /&gt;
     884:	08 f4       	brcc	.+2      	; 0x888 &amp;lt;__vector_13+0x1e&amp;gt;&lt;br /&gt;
         tmp_kc++;&lt;br /&gt;
     886:	8f 5f       	subi	r24, 0xFF	; 255&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   else {&lt;br /&gt;
      tmp_kc = 0;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   gKeyCounter = tmp_kc;&lt;br /&gt;
     888:	80 93 2a 03 	sts	0x032A, r24&lt;br /&gt;
     88c:	8f 91       	pop	r24&lt;br /&gt;
     88e:	0f 90       	pop	r0&lt;br /&gt;
     890:	0f be       	out	0x3f, r0	; 63&lt;br /&gt;
     892:	0f 90       	pop	r0&lt;br /&gt;
     894:	1f 90       	pop	r1&lt;br /&gt;
     896:	18 95       	reti&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== volatile und Pointer ===&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;volatile&#039;&#039;&#039; in Verbindung mit Pointern ist zu beachten, ob der Pointer selbst oder die Variable auf die der Pointer zeigt &#039;&#039;&#039;volatile&#039;&#039;&#039; ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
volatile uint8_t *a;   // das Ziel von a ist volatile&lt;br /&gt;
&lt;br /&gt;
uint8_t *volatile a;   // a selbst ist volatile&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls der Pointer volatile ist (zweiter Fall im Beispiel), ist zu beachten, dass der Wert des Pointers, also eine Speicheradresse, intern in mehr als einem Byte verwaltet wird. Lese- und Schreibzugriffe im Hauptprogramm (ausserhalb von Interrupt-Routinen) sind daher so zu implementieren, dass alle Teilbytes der Adresse konsistent bleiben, vgl. dazu den folgenden Abschnitt.&lt;br /&gt;
&lt;br /&gt;
=== Variablen größer 1 Byte ===&lt;br /&gt;
&lt;br /&gt;
Bei Variablen größer ein Byte, auf die in Interrupt-Routinen und im Hauptprogramm zugegriffen wird, muss darauf geachtet werden, dass die Zugriffe auf die einzelnen Bytes außerhalb der ISR nicht durch einen Interrupt unterbrochen werden. (Allgemeinplatz: AVRs sind 8-bit Controller). Zur Veranschaulichung ein Codefragment:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//...&lt;br /&gt;
volatile uint16_t gMyCounter16bit;&lt;br /&gt;
//...&lt;br /&gt;
ISR(...)&lt;br /&gt;
{&lt;br /&gt;
//...&lt;br /&gt;
   gMyCounter16Bit++;&lt;br /&gt;
//...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
   uint16_t tmpCnt;&lt;br /&gt;
//...&lt;br /&gt;
   // nicht gut: Mglw. hier ein Fehler, wenn ein Byte von MyCounter &lt;br /&gt;
   // schon in tmpCnt kopiert ist aber vor dem Kopieren des zweiten Bytes &lt;br /&gt;
   // ein Interrupt auftritt, der den Inhalt von MyCounter verändert.&lt;br /&gt;
   tmpCnt = gMyCounter16bit; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   // besser: Änderungen &amp;quot;außerhalb&amp;quot; verhindern -&amp;gt; alle &amp;quot;Teilbytes&amp;quot;&lt;br /&gt;
   // bleiben konsistent&lt;br /&gt;
   cli();  // Interupts deaktivieren&lt;br /&gt;
   tmpCnt = gMyCounter16Bit;&lt;br /&gt;
   sei();  // wieder aktivieren&lt;br /&gt;
&lt;br /&gt;
   // oder: vorheriger Status des globalen Interrupt-Flags bleibt erhalten&lt;br /&gt;
   uint8_t sreg_tmp;&lt;br /&gt;
   sreg_tmp = SREG;    /* Sichern */&lt;br /&gt;
   cli()&lt;br /&gt;
   tmpCnt = gMyCounter16Bit;&lt;br /&gt;
   SREG = sreg_tmp;    /* Wiederherstellen */&lt;br /&gt;
&lt;br /&gt;
   // oder: mehrfach lesen, bis man konsistente Daten hat&lt;br /&gt;
   uint16_t count1 = gMyCounter16Bit;&lt;br /&gt;
   uint16_t count2 = gMyCounter16Bit;&lt;br /&gt;
   while (count1 != count2) {&lt;br /&gt;
       count1 = count2;&lt;br /&gt;
       count2 = gMyCounter16Bit;&lt;br /&gt;
   }&lt;br /&gt;
   tmpCnt = count1;&lt;br /&gt;
//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die avr-libc bietet ab Version 1.6.0(?) einige Hilfsfunktionen/Makros, mit der im Beispiel oben gezeigten Funktionalität, die zusätzlich auch so genannte [http://en.wikipedia.org/wiki/Memory_barrier memory barriers] beinhalten. Diese stehen nach #include &amp;lt;util/atomic.h&amp;gt; zur Verfügung.&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//...&lt;br /&gt;
#include &amp;lt;util/atomic.h&amp;gt;&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
    // analog zu cli, Zugriff, sei:&lt;br /&gt;
    ATOMIC_BLOCK(ATOMIC_FORCEON) {&lt;br /&gt;
        tmpCnt = gMyCounter16Bit;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// oder:&lt;br /&gt;
&lt;br /&gt;
    // analog zu Sicherung des SREG, cli, Zugriff und Zurückschreiben des SREG:&lt;br /&gt;
    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {&lt;br /&gt;
        tmpCnt = gMyCounter16Bit;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//...&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* siehe auch [http://www.nongnu.org/avr-libc/user-manual/group__util__atomic.html Dokumentation der avr-libc zu atomic.h]&lt;br /&gt;
&lt;br /&gt;
== Interrupt-Routinen und Registerzugriffe ==&lt;br /&gt;
&lt;br /&gt;
Falls Register sowohl im Hauptprogramm als auch in Interrupt-Routinen verändert werden, ist darauf zu achten, dass diese Zugriffe sich nicht überlappen. Nur wenige Anweisungen lassen sich in sogenannte &amp;quot;atomare&amp;quot; Zugriffe übersetzen, die nicht von Interrupt-Routinen unterbrochen werden können. &lt;br /&gt;
&lt;br /&gt;
Zur Veranschaulichung eine Anweisung, bei der ein Bit und im Anschluss drei Bits in einem Register gesetzt werden:&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;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
//...&lt;br /&gt;
	PORTA |= (1&amp;lt;&amp;lt;PA0);&lt;br /&gt;
	&lt;br /&gt;
	PORTA |= (1&amp;lt;&amp;lt;PA2)|(1&amp;lt;&amp;lt;PA3)|(1&amp;lt;&amp;lt;PA4);&lt;br /&gt;
//...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Compiler übersetzt diese Anweisungen für einen ATmega128 bei Optimierungsstufe &amp;quot;S&amp;quot; nach:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
        PORTA |= (1&amp;lt;&amp;lt;PA0);&lt;br /&gt;
  d2:	d8 9a       	sbi	0x1b, 0	; 27 (a)&lt;br /&gt;
	&lt;br /&gt;
        PORTA |= (1&amp;lt;&amp;lt;PA2)|(1&amp;lt;&amp;lt;PA3)|(1&amp;lt;&amp;lt;PA4);&lt;br /&gt;
  d4:	8b b3       	in	r24, 0x1b	; 27 (b)&lt;br /&gt;
  d6:	8c 61       	ori	r24, 0x1C	; 28 (c)&lt;br /&gt;
  d8:	8b bb       	out	0x1b, r24	; 27 (d)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Setzen des einzelnen Bits wird bei eingeschalteter Optimierung für Register im unteren Speicherbereich in eine einzige Assembler-Anweisung (sbi) übersetzt und ist nicht anfällig für Unterbrechnungen durch Interrupts. Die Anweisung zum Setzen von drei Bits wird jedoch in drei abhängige Assembler-Anweisungen übersetzt und bietet damit zwei &amp;quot;Angriffspunkte&amp;quot; für Unterbrechnungen. Eine Interrupt-Routine könnte nach dem Laden des Ausgangszustands in den Zwischenspeicher (hier Register 24) den Wert des Registers ändern, z.B. ein Bit löschen. Damit würde der Zwischenspeicher nicht mehr mit dem tatsächlichen Zustand übereinstimmen aber dennoch nach der Bitoperation (hier ori) in das Register zurückgeschrieben. &lt;br /&gt;
&lt;br /&gt;
Beispiel: PORTA sei anfangs 0b00000000. Die erste Anweisung (a) setzt Bit 0, PORTA ist danach 0b00000001. Nun wird im ersten Teil der zweiten Anweisung der Portzustand in ein Register eingelesen (b). Unmittelbar darauf (vor (c)) &amp;quot;feuert&amp;quot; ein Interrupt, in dessen Interrupt-Routine Bit 0 von PORTA gelöscht wird. Nach Verlassen der Interrupt-Routine hat PORTA den Wert 0b00000000. In den beiden noch folgenden Anweisungen des Hauptprogramms wird nun der zwischengespeicherte &amp;quot;alte&amp;quot; Zustand 0b00000001 mit 0b00011100 logisch-oder-verknüft (c) und das Ergebnis 0b00011101 in PortA geschrieben (d). Obwohl zwischenzeitlich Bit 0 gelöscht wurde, ist es nach (d) wieder gesetzt. &lt;br /&gt;
&lt;br /&gt;
Lösungsmöglichkeiten:&lt;br /&gt;
* Register ohne besondere Vorkehrungen nicht in Interruptroutinen &#039;&#039;und&#039;&#039; im Hauptprogramm verändern.&lt;br /&gt;
* Interrupts vor Veränderungen in Registern, die auch in ISRs verändert werden, deaktivieren (&amp;quot;cli&amp;quot;).&lt;br /&gt;
* Bits einzeln löschen oder setzen. sbi und cbi können nicht unterbrochen werden. Vorsicht: nur Register im unteren Speicherbereich sind mittels sbi/cbi ansprechbar. Der Compiler kann nur für diese sbi/cbi-Anweisungen generieren. Für Register außerhalb dieses Adressbereichs (&amp;quot;Memory-Mapped&amp;quot;-Register) werden auch zur Manipulation einzelner Bits abhängige Anweisungen erzeugt (lds,...,sts).&lt;br /&gt;
&lt;br /&gt;
* siehe auch: [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Frequently asked Questions/Fragen Nr. 1 und 8. (Stand: avr-libc Vers. 1.0.4)&lt;br /&gt;
&lt;br /&gt;
== Was macht das Hauptprogramm? ==&lt;br /&gt;
&lt;br /&gt;
Im einfachsten (Ausnahme-)Fall gar nichts mehr. Es ist also durchaus denkbar, ein Programm zu schreiben, welches in der main-Funktion lediglich noch die Interrupts aktiviert und dann in einer Endlosschleife verharrt. Sämtliche Funktionen werden dann in den ISRs abgearbeitet. Diese Vorgehensweise ist jedoch bei den meisten Anwendungen schlecht: man verschenkt eine Verarbeitungsebene und hat außerdem möglicherweise Probleme durch Interruptroutinen, die zu viel Verarbeitungszeit benötigen.&lt;br /&gt;
&lt;br /&gt;
Normalerweise wird man in den Interruptroutinen nur die bei Auftreten des jeweiligen Interruptereignisses unbedingt notwendigen Operationen ausführen lassen. Alle weniger kritischen Aufgaben werden dann im Hauptprogramm abgearbeitet.&lt;br /&gt;
&lt;br /&gt;
* siehe auch: [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Modules/Interrupts and Signals&lt;br /&gt;
&lt;br /&gt;
= Timer =&lt;br /&gt;
Siehe: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR&lt;br /&gt;
&lt;br /&gt;
= Sleep-Modes =&lt;br /&gt;
&lt;br /&gt;
AVR Controller verfügen über eine Reihe von sogenannten &#039;&#039;Sleep-Modes&#039;&#039; (&amp;quot;Schlaf-Modi&amp;quot;). Diese ermöglichen es, Teile des Controllers abzuschalten. Zum Einen kann damit besonders bei Batteriebetrieb Strom gespart werden, zum Anderen können Komponenten des Controllers deaktiviert werden, die die Genauigkeit des Analog-Digital-Wandlers bzw. des Analog-Comparators negativ beeinflussen. Der Controller wird durch Interrupts aus dem Schlaf geweckt. Welche Interrupts den jeweiligen Schlafmodus beenden, ist einer Tabelle im Datenblatt des jeweiligen Controllers zu entnehmen.&lt;br /&gt;
Die Funktionen (eigentlich Makros) der avr-libc stehen nach Einbinden der header-Datei &#039;&#039;sleep.h&#039;&#039; zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;set_sleep_mode(uint8_t mode)&#039;&#039;&#039;&lt;br /&gt;
:Setzt den Schlafmodus, der bei Aufruf von sleep() aktiviert wird. In sleep.h sind einige Konstanten definiert (z.B. SLEEP_MODE_PWR_DOWN). Die definierten Modi werden jedoch nicht alle von sämtlichten AVR-Controllern unterstützt.&lt;br /&gt;
* &#039;&#039;&#039;sleep_enable()&#039;&#039;&#039;&lt;br /&gt;
:aktiviert den gesetzten Schlafmodus, versetzt den Controller aber noch nicht in den Schlafmodus&lt;br /&gt;
* &#039;&#039;&#039;sleep_cpu()&#039;&#039;&#039;&lt;br /&gt;
: Versetzt den Controller in den Schlafmodus (sleep_cpu wird im Prinzip durch die Assembler-Anweisung &#039;&#039;sleep&#039;&#039; ersetzt)&lt;br /&gt;
* &#039;&#039;&#039;sleep_disable()&#039;&#039;&#039;&lt;br /&gt;
:deaktiviert den gesetzten Schlafmodus&lt;br /&gt;
* &#039;&#039;&#039;sleep_mode()&#039;&#039;&#039;&lt;br /&gt;
:Versetzt den Controller in den mit set_sleep_mode gewählten Schlafmodus. Das Makro entspricht sleep_enable()+sleep_cpu()+sleep_disable(), beinhaltet also nicht die Aktivierung von Interrupts (besser nicht benutzen).&lt;br /&gt;
&lt;br /&gt;
Bei Anwendung von sleep_cpu() müssen Interrupts also bereits freigeben sein (sei()), da der Controller sonst nicht mehr &amp;quot;aufwachen&amp;quot; kann. sleep_mode() ist nicht geeignet für die Verwendung in ISR Interrupt-Service-Routinen, da bei deren Abarbeitung Interrupts global deaktiviert sind und somit auch die möglichen &amp;quot;Aufwachinterrupts&amp;quot;. Abhilfe: stattdessen sleep_enable(), sei(), sleep_cpu(), sleep_disable() und evtl. cli() verwenden (vgl. Dokumentation der avr-libc).&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/sleep.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
   while (1) {&lt;br /&gt;
...&lt;br /&gt;
      set_sleep_mode(SLEEP_MODE_PWR_DOWN);&lt;br /&gt;
      sleep_mode();&lt;br /&gt;
   &lt;br /&gt;
      // Code hier wird erst nach Auftreten eines entsprechenden&lt;br /&gt;
      // &amp;quot;Aufwach-Interrupts&amp;quot; verarbeitet&lt;br /&gt;
...&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In älteren Versionenen der avr-libc wurden nicht alle AVR-Controller durch die sleep-Funktionen richtig angesteuert. Mit avr-libc 1.2.0 wurde die Anzahl der unterstützten Typen jedoch deutlich erweitert. Bei nicht-unterstützten Typen erreicht man die gewünschte Funktionalität durch direkte &amp;quot;[[Bitmanipulation]]&amp;quot; der entsprechenden Register (vgl. Datenblatt) und Aufruf des Sleep-Befehls via Inline-Assembler oder sleep_cpu():&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;
...&lt;br /&gt;
   // Sleep-Mode &amp;quot;Power-Save&amp;quot; beim ATmega169 &amp;quot;manuell&amp;quot; aktivieren&lt;br /&gt;
   SMCR = (3&amp;lt;&amp;lt;SM0) | (1&amp;lt;&amp;lt;SE);&lt;br /&gt;
   asm volatile (&amp;quot;sleep&amp;quot;::); // alternativ sleep_cpu() aus sleep.h&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sleep Modi ==&lt;br /&gt;
Zu beachten ist, dass unterschiedliche Prozessoren aus der AVR Familie unterschiedliche Sleep-Modi unterstützen oder nicht unterstützen. Auskunft über die tatsächlichen Gegebenheiten gibt, wie immer, das zum Prozessor gehörende Datenblatt. Die unterschiedlichen Modi unterscheiden sich dadurch, welche Bereiche des Prozessors abgeschaltet werden. Damit korrespondiert unmittelbar welche Möglichkeiten es gibt, den Prozessor aus den jeweiligen Sleep Modus wieder aufzuwecken.&lt;br /&gt;
&lt;br /&gt;
=== Idle Mode ===&lt;br /&gt;
Die CPU kann durch SPI, USART, Analog Comperator, ADC, TWI, Timer, Watchdog und irgendeinen anderen Interrupt wieder aufgeweckt werden.&lt;br /&gt;
&lt;br /&gt;
=== ADC Noise Reduction Mode ===&lt;br /&gt;
In diesem Modus liegt das Hauptaugenmerk darauf, die CPU soweit stillzulegen, dass der ADC möglichst keine Störungen aus dem inneren der CPU auffangen kann. Aufwachen aus diesem Modus kann ausgelöst werden durch den ADC, externe Interrupts, TWI, Timer und Watchdog.&lt;br /&gt;
&lt;br /&gt;
=== Power-Down Mode ===&lt;br /&gt;
In diesem Modus wird ein externer Oszillator (Quarz, Quarzoszillator) gestoppt. &lt;br /&gt;
Geweckt werden kann die CPU durch einen externen Level Interrupt, TWI, Watchdog, Brown-Out-Reset&lt;br /&gt;
&lt;br /&gt;
=== Power-Save-Mode ===&lt;br /&gt;
Power-Save ist identisch zu Power-Down mit einer Ausnahme: Ist der Timer 2 auf die Verwendung eines externen Taktes konfiguriert, so läuft dieser Timer auch im Power-Save weiter und kann die CPU mit einem Interrupt aufwecken.&lt;br /&gt;
&lt;br /&gt;
=== Standby-Mode ===&lt;br /&gt;
Voraussetzung für den Standby Modus ist die Verwendung eines Quarzes oder eines Quarzoszillators (also einer externen Taktquelle). Ansonsten ist dieser Modus identisch zum Power-Down Modus. Vorteil dieses Modus ist eine kürzere Aufwachzeit.&lt;br /&gt;
&lt;br /&gt;
* siehe auch: [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Modules/Power Management and Sleep-Modes&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/96369#832712 Forenbeitrag] zur &amp;quot;Nichtverwendung&amp;quot; von sleep_mode in ISRs.&lt;br /&gt;
&lt;br /&gt;
= Speicherzugriffe =&lt;br /&gt;
&lt;br /&gt;
Atmel AVR-Controller verfügen typisch über drei Speicher:&lt;br /&gt;
&lt;br /&gt;
* [[RAM]]: Im RAM (genauer statisches RAM/SRAM) wird vom gcc-Compiler Platz für Variablen reserviert. Auch der Stack befindet sich im RAM. Dieser Speicher ist &amp;quot;flüchtig&amp;quot;, d.h. der Inhalt der Variablen geht beim Ausschalten oder einem Zusammenbruch der Spannungsversorgung verloren.&lt;br /&gt;
&lt;br /&gt;
* Programmspeicher: Ausgeführt als FLASH-Speicher, seitenweise wiederbeschreibbar. Darin ist das Anwendungsprogramm abgelegt.&lt;br /&gt;
&lt;br /&gt;
* [[EEPROM]]: Nichtflüchtiger Speicher, d.h. der einmal geschriebene Inhalt bleibt auch ohne Stromversorgung erhalten. Byte-weise schreib/lesbar. Im EEPROM werden typischerweise gerätespezifische Werte wie z.B. Kalibrierungswerte von Sensoren abgelegt.&lt;br /&gt;
&lt;br /&gt;
Einige AVRs besitzen keinen RAM-Speicher, lediglich die Register können als &amp;quot;Arbeitsvariablen&amp;quot;&lt;br /&gt;
genutzt werden. Da die Anwendung des avr-gcc auf solch &amp;quot;kleinen&amp;quot; Controllern ohnehin selten sinnvoll ist und auch nur bei einigen RAM-losen Typen nach [http://lightner.net/avr/ATtinyAvrGcc.html &amp;quot;Bastelarbeiten&amp;quot;] möglich ist, werden diese Controller hier nicht weiter berücksichtigt. Auch EEPROM-Speicher ist nicht auf allen Typen verfügbar. Generell sollten die nachfolgenden Erläuterungen auf alle ATmega-Controller und die größeren AT90-Typen übertragbar sein. Für die Typen ATtiny2313, ATtiny26 und viele weitere der &amp;quot;ATtiny-Reihe&amp;quot; gelten die Ausführungen ebenfalls.&lt;br /&gt;
&lt;br /&gt;
== RAM ==&lt;br /&gt;
&lt;br /&gt;
Die Verwaltung des RAM-Speichers erfolgt durch den Compiler, im Regelfall ist beim Zugriff auf Variablen im RAM nichts Besonderes zu beachten. Die Erläuterungen in jedem brauchbaren C-Buch gelten auch für den vom avr-gcc-Compiler erzeugten Code.&lt;br /&gt;
&lt;br /&gt;
Um Speicher dynamisch (während der Laufzeit) zu reservieren, kann &#039;&#039;&#039;malloc()&#039;&#039;&#039; verwendet werden. malloc(size) &amp;quot;alloziert&amp;quot; (~reserviert) einen gewissen Speicherblock mit &#039;&#039;&#039;size&#039;&#039;&#039; Bytes. Ist kein Platz für den neuen Block, wird NULL (0) zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
Wird der angelegte Block zu klein (groß), kann die Größe mit realloc() verändert werden. Den allozierten Speicherbereich kann man mit free() wieder freigeben. Wenn das Freigeben eines Blocks vergessen wird spricht man von einem &amp;quot;Speicherleck&amp;quot; (memory leak).&lt;br /&gt;
&lt;br /&gt;
malloc() legt Speicherblöcke im &#039;&#039;&#039;Heap&#039;&#039;&#039; an, belegt man zuviel Platz, dann wächst der Heap zu weit nach oben und überschreibt den Stack, und der Controller kommt in Teufels Küche. Das kann leider nicht nur passieren wenn man insgesamt zu viel Speicher anfordert, sondern auch wenn man Blöcke unterschiedlicher Größe in ungünstiger Reihenfolge alloziert/freigibt (siehe Artikel [[Heap-Fragmentierung]]). Aus diesem Grund sollte man malloc() auf Mikrocontrollern sehr sparsam (am besten gar nicht) verwenden.&lt;br /&gt;
&lt;br /&gt;
Beispiel zur Verwendung von malloc():&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void foo(void) {&lt;br /&gt;
  // neuen speicherbereich anlegen,&lt;br /&gt;
  // platz für 10 uint16&lt;br /&gt;
  uint16_t* pBuffer = malloc(10 * sizeof(uint16_t));&lt;br /&gt;
&lt;br /&gt;
  // darauf zugreifen, als wärs ein gewohnter Buffer&lt;br /&gt;
  pBuffer[2] = 5;&lt;br /&gt;
&lt;br /&gt;
  // Speicher (unbedingt!) wieder freigeben&lt;br /&gt;
  free(pBuffer);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn (wie in obigem Beispiel) dynamischer Speicher nur für die Dauer einer Funktion benötigt und am Ende wieder freigegeben wird, bietet es sich an, statt malloc() &#039;&#039;&#039;alloca()&#039;&#039;&#039; zu verwenden. Der Unterschied zu malloc() ist, dass der Speicher auf dem Stack reserviert wird, und beim Verlassen der Funktion automatisch wieder freigegeben wird. Es kann somit kein Speicherleck und keine Fragmentierung entstehen.&lt;br /&gt;
&lt;br /&gt;
siehe auch:&lt;br /&gt;
* http://www.nongnu.org/avr-libc/user-manual/malloc.html&lt;br /&gt;
&lt;br /&gt;
== Programmspeicher (Flash) ==&lt;br /&gt;
&lt;br /&gt;
Ein Zugriff auf Konstanten im Programmspeicher ist mittels avr-gcc nicht &amp;quot;transparent&amp;quot; möglich. D.h. es sind besondere Zugriffsfunktionen erforderlich, um Daten aus diesem Speicher zu lesen. Grundsätzlich basieren alle Zugriffsfunktionen auf der Assembler-Anweisung lpm (load program memory, bei AVR Controllern mit mehr als 64kB Flash auch elpm). Die Standard-Laufzeitbibliothek des avr-gcc (die avr-libc) stellt diese Funktionen nach Einbinden der Header-Datei pgmspace.h zur Verfügung. Mit diesen Funktionen können einzelne Bytes, Datenworte (16bit) und Datenblöcke gelesen werden. &lt;br /&gt;
&lt;br /&gt;
Deklarationen von Variablen im Flash-Speicher werden durch das &amp;quot;Attribut&amp;quot; PROGMEM ergänzt. Lokale Variablen (eigentlich Konstanten) innerhalb von Funktionen können ebenfalls im Programmspeicher abgelegt werden. Dazu ist bei der Definition jedoch ein &#039;&#039;static&#039;&#039; voranzustellen, da solche &amp;quot;Variablen&amp;quot; nicht auf dem Stack bzw. (bei Optimierung) in Registern verwaltet werden können. Der Compiler &amp;quot;wirft&amp;quot; eine Warnung falls static fehlt.&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/pgmspace.h&amp;gt;&lt;br /&gt;
#include &amp;lt;inttypes.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
/* Byte */&lt;br /&gt;
const uint8_t pgmFooByte PROGMEM = 123;&lt;br /&gt;
&lt;br /&gt;
/* Wort */&lt;br /&gt;
const uint16_t pgmFooWort PROGMEM = 12345;&lt;br /&gt;
&lt;br /&gt;
/* Byte-Feld */&lt;br /&gt;
const uint8_t pgmFooByteArray1[] PROGMEM = { 18, 3 ,70 };&lt;br /&gt;
const uint8_t pgmFooByteArray2[] PROGMEM = { 30, 7 ,79 };&lt;br /&gt;
&lt;br /&gt;
/* Zeiger */&lt;br /&gt;
const uint8_t *pgmPointerToArray1 PROGMEM = pgmFooByteArray1;&lt;br /&gt;
const uint8_t *pgmPointerArray[] PROGMEM = { pgmFooByteArray1, pgmFooByteArray2 };&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
void foo(void)&lt;br /&gt;
{&lt;br /&gt;
  static /*const*/ uint8_t pgmTestByteLocal PROGMEM = 0x55;&lt;br /&gt;
  static /*const*/ char pgmTestStringLocal[] PROGMEM = &amp;quot;im Flash&amp;quot;;&lt;br /&gt;
  // so nicht (static fehlt): char pgmTestStringLocalFalsch [] PROGMEM = &amp;quot;so nicht&amp;quot;;&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;
=== Byte lesen ===&lt;br /&gt;
&lt;br /&gt;
Mit der Funktion pgm_read_byte aus pgmspace.h erfolgt der Zugriff auf die Daten. Parameter der Funktion ist die Adresse des Bytes im Flash-Speicher.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
const uint8_t pgmFooByte PROGMEM = 123;&lt;br /&gt;
const uint8_t pgmFooByteArray1[] PROGMEM = { 18, 3 ,70 };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // Wert der Ram-Variablen myByte auf den Wert von pgmFooByte setzen:&lt;br /&gt;
    uint8_t myByte;&lt;br /&gt;
&lt;br /&gt;
    myByte = pgm_read_byte(&amp;amp;pgmFooByte);&lt;br /&gt;
    // myByte hat nun den Wert 123&lt;br /&gt;
&lt;br /&gt;
    //...&lt;br /&gt;
&lt;br /&gt;
    // Schleife ueber ein Array aus Byte-Werten im Flash&lt;br /&gt;
    uint8_t i;&lt;br /&gt;
&lt;br /&gt;
    for (i=0;i&amp;lt;3;i++) {&lt;br /&gt;
        myByte = pgm_read_byte(&amp;amp;pgmFooByteArray1[i]);&lt;br /&gt;
        // mach&#039; was mit myByte....&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Wort lesen ===&lt;br /&gt;
&lt;br /&gt;
Für &amp;quot;einfache&amp;quot; 16-bit breite Variablen erfolgt der Zugriff analog zum Byte-Beispiel, jedoch mit der Funktion pgm_read_word.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
const uint16_t pgmFooWort PROGMEM = 12345;&lt;br /&gt;
&lt;br /&gt;
    uint16_t myWord;&lt;br /&gt;
&lt;br /&gt;
    myWord = pgm_read_word(&amp;amp;pgmFooWort);&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zeiger auf Werte im Flash sind ebenfalls 16 Bits &amp;quot;groß&amp;quot; (Stand avr-gcc 3.4.x). Damit ist der mögliche Speicherbereich für &amp;quot;Flash-Konstanten&amp;quot; auf 64kB begrenzt.  &amp;lt;!-- Einige avr-libc/pgmspace-Funktionen ermöglichen den Lesezugriff auf den gesamten Flash-Speicher) (intern via Assembler Anweisung ELPM). Die Initialisierungswerde des Speicherinhalts jenseits der 64kB-Marke müssen dann jedoch auf anderem Weg angelegt werden (nicht PROGMEM, evtl. eigene Section und Linker-Optionen - TODO) /// alt - und nicht ganz korrekt: (Die avr-libc pgmspace-Funktionen unterstützen nur die unteren 64kB Flash bei Controllern mit mehr als 64kB.)--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    uint8_t *ptrToArray;&lt;br /&gt;
&lt;br /&gt;
    ptrToArray = (uint8_t*)(pgm_read_word(&amp;amp;pgmPointerToArray1));&lt;br /&gt;
    // ptrToArray enthält nun die Startadresse des Byte-Arrays pgmFooByteArray1&lt;br /&gt;
    // Allerdings würde ein direkter Zugriff mit diesem Pointer (z.B. temp=*ptrToArray)&lt;br /&gt;
    // &#039;&#039;&#039;nicht&#039;&#039;&#039; den Inhalt von pgmFooByteArray1[0] liefern, sondern von einer Speicherstelle&lt;br /&gt;
    // im &#039;&#039;&#039;RAM&#039;&#039;&#039;, die die gleiche Adresse hat wie pgmFooByteArray1[0]&lt;br /&gt;
    // Daher muss nun die Funktion pgm_read_byte() benutzt werden, die die in ptrToArray&lt;br /&gt;
    // enthaltene Adresse benutzt und auf das Flash zugreift.&lt;br /&gt;
&lt;br /&gt;
    for (i=0;i&amp;lt;3;i++) {&lt;br /&gt;
        myByte = pgm_read_byte(ptrToArray+i);&lt;br /&gt;
        // mach&#039; was mit myByte... (18, 3, 70)&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ptrToArray = (uint8_t*)(pgm_read_word(&amp;amp;pgmPointerArray[1]));&lt;br /&gt;
    &lt;br /&gt;
    // ptrToArray enthält nun die Adresse des ersten Elements des Byte-Arrays pgmFooByteArray2&lt;br /&gt;
    // da im zweiten Element des Pointer-Arrays pgmPointerArray die Adresse&lt;br /&gt;
    // von pgmFooByteArray2 abgelegt ist&lt;br /&gt;
&lt;br /&gt;
    for (i=0;i&amp;lt;3;i++) {&lt;br /&gt;
        myByte = pgm_read_byte(ptrToArray+i);&lt;br /&gt;
        // mach&#039; was mit myByte... (30, 7, 79)&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Strings lesen ===&lt;br /&gt;
Strings sind in C ja nichts anderes als eine Abfolge von Zeichen. Der prinzipielle Weg ist daher identisch zu &amp;quot;Bytes lesen&amp;quot; wobei allerdings auf die [http://www.mikrocontroller.net/articles/FAQ#Wie_funktioniert_String-Verarbeitung_in_C.3F Besonderheiten von Strings] (0-Terminierung) geachtet werden muss, bzw. diese zur Steuerung einer Schleife über die Zeichen im String ausgenutzt werden kann&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/pgmspace.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
const char pgmString[] PROGMEM = &amp;quot;Hallo world&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  char c;&lt;br /&gt;
  const char* addr;&lt;br /&gt;
&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
  addr = &amp;amp;pgmString;&lt;br /&gt;
  while( ( c = pgm_read_byte( addr++ ) != &#039;\0&#039; ) {&lt;br /&gt;
    // mach was mit c&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur Unterstützung des Programmierers steht das Repertoir der str... Funktionen auch in jeweils eine Variante zur Verfügung, die mit dem Flash Speicher arbeiten kann. Die Funktionsnamen wurden dabei um ein &#039;_P&#039; ergänzt.&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/pgmspace.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
const char pgmString[] PROGMEM = &amp;quot;Hallo world&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  char string[40];&lt;br /&gt;
&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
  strcpy_P( string, pgmString );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Floats und Structs lesen ===&lt;br /&gt;
&lt;br /&gt;
Um komplexe Datentypen (structs), nicht-integer Datentypen (floats) aus dem Flash auszulesen, sind Hilfsfunktionen erforderlich. Einige Beispiele:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* Beispiel float aus Flash */&lt;br /&gt;
&lt;br /&gt;
float pgmFloatArray[3] PROGMEM = {1.1, 2.2, 3.3};&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
/* liest float von Flash-Addresse addr und gibt diese als return-value zurueck */&lt;br /&gt;
inline float pgm_read_float(const float *addr)&lt;br /&gt;
{	&lt;br /&gt;
	union&lt;br /&gt;
	{&lt;br /&gt;
		uint16_t i[2];	// 2 16-bit-Worte&lt;br /&gt;
		float f;&lt;br /&gt;
	} u;&lt;br /&gt;
	&lt;br /&gt;
	u.i[0]=pgm_read_word((PGM_P)addr);&lt;br /&gt;
	u.i[1]=pgm_read_word((PGM_P)addr+2);&lt;br /&gt;
	&lt;br /&gt;
	return u.f;&lt;br /&gt;
} &lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
void egal(void)&lt;br /&gt;
{&lt;br /&gt;
   int i;&lt;br /&gt;
   float f;&lt;br /&gt;
&lt;br /&gt;
   for (i=0;i&amp;lt;3;i++) {&lt;br /&gt;
      f = pgm_read_float(&amp;amp;pgmFloatArray[i]); // entspr. &amp;quot;f = pgmFloatArray[i];&amp;quot;&lt;br /&gt;
      // mach&#039; was mit f &lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TODO: Beispiele fuer structs und pointer aus flash auf struct im flash (menues, state-machines etc.). Eine kleine Einleitung insbesondere auch in Bezug auf die auftretenden Schwierigkeiten liefert [http://www.mail-archive.com/avr-gcc-list@nongnu.org/msg05652.html].&lt;br /&gt;
&lt;br /&gt;
=== Array aus Strings im Flash-Speicher ===&lt;br /&gt;
&lt;br /&gt;
Arrays aus Strings im Flash-Speicher werden in zwei Schritten angelegt: Zuerst die einzelnen Elemente des Arrays und im Anschluss ein Array, in dem die Startaddressen der Strings abgelegt werden. Zum Auslesen wird zuerst die Adresse des i-ten Elements aus dem Array im Flash-Speicher gelesen, die im Anschluss dazu genutzt wird, auf das Element (den String) selbst zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
const char str1[] PROGMEM = &amp;quot;first_A&amp;quot;;&lt;br /&gt;
const char str2[] PROGMEM = &amp;quot;second_A&amp;quot;;&lt;br /&gt;
const char str3[] PROGMEM = &amp;quot;third_A&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
const char *strarray1[] PROGMEM = {&lt;br /&gt;
	str1,&lt;br /&gt;
	str2,&lt;br /&gt;
	str3&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	int i, j, l;&lt;br /&gt;
	const char *pstrflash;&lt;br /&gt;
	char work[20], work2[20];&lt;br /&gt;
	// fuer Simulation: per volatile Optimierung verhindern, &lt;br /&gt;
	//                  da c nicht genutzt&lt;br /&gt;
	volatile char c;&lt;br /&gt;
	&lt;br /&gt;
	for ( i = 0; i &amp;lt; (sizeof(strarray1)/sizeof(strarray1[0]) ); i++ ) {&lt;br /&gt;
&lt;br /&gt;
		// setze Pointer auf die Addresse des i-ten Elements des&lt;br /&gt;
		// &amp;quot;Flash-Arrays&amp;quot; (str1, str2, ...)&lt;br /&gt;
		pstrflash = (const char*)( pgm_read_word( &amp;amp;(strarray1[i]) ) );&lt;br /&gt;
		&lt;br /&gt;
		// kopiere den Inhalt der Zeichenkette von der&lt;br /&gt;
		// in pstrflash abgelegten Adresse in das work-Array&lt;br /&gt;
		// analog zu strcpy( work, strarray1[i]) wenn alles im RAM&lt;br /&gt;
		strcpy_P( work, pstrflash );&lt;br /&gt;
		// verkuerzt:&lt;br /&gt;
		strcpy_P( work2, (const char*)( pgm_read_word( &amp;amp;(strarray1[i]) ) ) );&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
		// Zeichen-fuer-Zeichen&lt;br /&gt;
		l = strlen_P( pstrflash );&lt;br /&gt;
		for ( j=0; j &amp;lt; l; j++ ) {&lt;br /&gt;
			// analog zu c=strarray[i][j] wenn alles im RAM&lt;br /&gt;
			c = (char)( pgm_read_byte( pstrflash++ ) );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	while (1) { ; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch die avr-libc FAQ: &amp;quot;How do I put an array of strings completely in ROM?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Vereinfachung für Zeichenketten (Strings) im Flash ===&lt;br /&gt;
&lt;br /&gt;
Zeichenketten können innerhalb des Quellcodes als &amp;quot;Flash-Konstanten&amp;quot; ausgewiesen werden. Dazu dient das Makro PSTR aus pgmspace.h. Dies erspart die getrennte Deklaration mit PROGMEM-Attribut.&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/pgmspace.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define MAXLEN 30&lt;br /&gt;
&lt;br /&gt;
char StringImFlash[] PROGMEM = &amp;quot;Erwin Lindemann&amp;quot;; // im &amp;quot;Flash&amp;quot;&lt;br /&gt;
char StringImRam[MAXLEN];&lt;br /&gt;
&lt;br /&gt;
//...&lt;br /&gt;
    strcpy(StringImRam, &amp;quot;Mueller-Luedenscheidt&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    if (!strncmp_P(StringImRam, StringImFlash, 5)) { &lt;br /&gt;
        // mach&#039; was, wenn die ersten 5 Zeichen identisch - hier nicht&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        // der Code hier wuerde ausgefuehrt &lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    if (!strncmp_P(StringImRam, PSTR(&amp;quot;Mueller-Schmitt&amp;quot;), 5)) {&lt;br /&gt;
        // der Code hier wuerde ausgefuehrt, die ersten 5 Zeichen stimmen ueberein&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        // wuerde bei nicht-Uebereinstimmung ausgefuehrt&lt;br /&gt;
    }&lt;br /&gt;
//...&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aber Vorsicht: Ersetzt man zum Beispiel&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
const char textImFlashOK[] PROGMEM = &amp;quot;mit[]&amp;quot;; &lt;br /&gt;
// = Daten im &amp;quot;Flash&amp;quot;, textImFlashOK* zeigt auf Flashadresse&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
durch&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
const char* textImFlashProblem PROGMEM = &amp;quot;mit*&amp;quot;;&lt;br /&gt;
// Konflikt: Daten im BSS (lies: RAM), textImFlashFAIL* zeigt auf Flashadresse&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
dann kann es zu Problemen mit AVR-GCC kommen. Zu erkennen daran, dass der Initialisierungsstring von &amp;quot;textImFlashProblem&amp;quot; zu den Konstanten ans Ende des Programmcodes gelegt wird (BSS), von dem aus er zur Benutzung eigentlich ins RAM kopiert werden sollte (und wird). Da der lesende Code (mittels pgm_read*) trotzdem an einer Stelle vorne im Flash sucht, wird Unsinn gelesen. Dies scheint ein weiters Problem des AVR-GCC (gesehen bei avr-gcc 3.4.1 und 3.4.2) bei der Anpassung an die Harvard-Architektur zu sein (konstanter Pointer auf variable Daten?!). Abhilfe (&amp;quot;Workaround&amp;quot;): Initialisierung bei Zeichenketten mit [] oder gleich im Code PSTR(&amp;quot;...&amp;quot;) nutzen.&lt;br /&gt;
&lt;br /&gt;
Übergibt man Zeichenketten (genauer: die Adresse des ersten Zeichens), die im Flash abglegt sind an eine Funktion, muss diese entsprechend programmiert sein. Die Funktion selbst hat keine Möglichkeit zu unterscheiden, ob es sich um eine Adresse im Flash oder im RAM handelt. Die avr-libc und viele andere avr-gcc-Bibliotheken halten sich an die Konvention, dass Namen von Funktionen die Flash-Adressen erwarten mit dem Suffix _p (oder _P) versehen sind.&lt;br /&gt;
&lt;br /&gt;
Eine Funktion, die einen im Flash abgelegten String z.B. an eine UART ausgibt, würde dann so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void uart_puts_p(const char *text)&lt;br /&gt;
{&lt;br /&gt;
    char Zeichen;&lt;br /&gt;
&lt;br /&gt;
    while (Zeichen = pgm_read_byte(text))&lt;br /&gt;
    {   /* so lange, wie mittels pgm_read_byte ein Zeichen vom Flash gelesen&lt;br /&gt;
           werden konnte, welches nicht das &amp;quot;String-Endezeichen&amp;quot; darstellt */&lt;br /&gt;
&lt;br /&gt;
        /* Das gelesene Zeichen über die normalen Kanäle verschicken */&lt;br /&gt;
        uart_putc(Zeichen);&lt;br /&gt;
        text++;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Von einigen Bibliotheken werden Makros definiert, die &amp;quot;automatisch&amp;quot; ein PSTR bei Verwendung einer Funktion einfügen. Ein Blick in den Header-File der Bibliothek zeigt, ob dies der Fall ist. Ein Beispiel aus P. Fleurys lcd-Library:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// Ausschnitt aus dem Header-File lcd.h der &amp;quot;Fleury-LCD-Lib.&amp;quot;&lt;br /&gt;
//...&lt;br /&gt;
extern void lcd_puts_p(const char *progmem_s);&lt;br /&gt;
#define lcd_puts_P(__s) lcd_puts_p(PSTR(__s))&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
// in einer Anwendung (wieauchimmmer.c)&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;quot;lcd.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
char StringImFlash[] PROGMEM = &amp;quot;Erwin Lindemann&amp;quot;; // im &amp;quot;Flash&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//...&lt;br /&gt;
    lcd_puts_p(StringImFlash); &lt;br /&gt;
    lcd_puts_P(&amp;quot;Dr. Kloebner&amp;quot;); &lt;br /&gt;
    // daraus wird wg. #define lcd_put_P...:  lcd_puts_p( PSTR(&amp;quot;Dr. Kloebner&amp;quot;) );&lt;br /&gt;
//...&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Flash in der Anwendung schreiben ===&lt;br /&gt;
&lt;br /&gt;
Bei AVRs mit &amp;quot;self-programming&amp;quot;-Option (auch bekannt als Bootloader-Support) können Teile des Flash-Speichers auch vom Anwendungsprogramm selbst beschrieben werden. Dies ist nur möglich, wenn die Schreibfunktionen in einem besonderen Speicherbereich (boot-section) des Programmspeichers/Flash abgelegt sind. Bei wenigen &amp;quot;kleinen&amp;quot; AVRs gibt es keine gesonderte Boot-Section, bei diesen kann der Flashspeicher von jeder Stelle des Programms geschrieben werden. Für Details sei hier auf das jeweilige Controller-Datenblatt und die Erläuterungen zum Modul boot.h der avr-libc verwiesen. Es existieren auch Application-Notes dazu bei atmel.com, die auf avr-gcc-Code übertragbar sind.&lt;br /&gt;
&lt;br /&gt;
=== Warum so kompliziert? ===&lt;br /&gt;
&lt;br /&gt;
Zu dem Thema, warum die Verabeitung von Werten aus dem Flash-Speicher so &amp;quot;kompliziert&amp;quot; ist, sei hier nur kurz erläutert: Die Harvard-Architektur des AVR weist getrennte Adressräume für Programm(Flash)- und Datenspeicher(RAM) auf. Der C-Standard und der gcc-Compiler sehen keine unterschiedlichen Adressräume vor. &lt;br /&gt;
Hat man zum Beispiel eine Funktion string_an_uart(const char* s) und übergibt an diese Funktion die Adresse einer Zeichenkette (einen Pointer, z.B. 0x01fe), &amp;quot;weiß&amp;quot; die Funktion nicht, ob die Adresse auf den Flash-Speicher oder den/das RAM zeigt. Allein aus dem Pointer-Wert (der Zahl) kann nicht geschlossen werden, ob ein &amp;quot;einfaches&amp;quot; zeichen_an_uart(s[i]) oder zeichen_an_uart(pgm_read_byte(&amp;amp;s[i]) genutzt werden muss, um das i-te Zeichen auszugeben.&lt;br /&gt;
&lt;br /&gt;
Einige AVR-Compiler &amp;quot;tricksen&amp;quot; etwas, in dem sie für einen Pointer nicht nur die Adresse anlegen, sondern zusätzlich zu jedem Pointer den Ablageort (Flash oder RAM) intern sichern. Bei Aufruf einer Funktion wird dann bei Pointer-Parametern neben der Adresse auch der Speicherbereich, auf den der Pointer zeigt, übergeben. Dies hat jedoch nicht nur Vorteile; Erläuterungen warum dies so ist, führen an dieser Stelle zu weit.&lt;br /&gt;
&lt;br /&gt;
* siehe auch: [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitte Modules/Program Space String Utilities und Abschnitt Modules/Bootloader Support Utilities&lt;br /&gt;
&lt;br /&gt;
== EEPROM ==&lt;br /&gt;
&lt;br /&gt;
Man beachte, dass der EEPROM-Speicher nur eine begrenzte Anzahl von Schreibzugriffen zulässt. Beschreibt man eine EEPROM-Zelle öfter als die im Datenblatt zugesicherte Anzahl (typisch 100.000), wird die Funktion der Zelle nicht mehr garantiert. &lt;br /&gt;
Dies gilt für jede einzelne Zelle. Bei geschickter Programmierung (z.B. Ring-Puffer), bei der die zu beschreibenden Zellen regelmäßig gewechselt werden, kann man eine deutlich höhere Anzahl an Schreibzugriffen, bezogen auf den Gesamtspeicher, erreichen.&lt;br /&gt;
&lt;br /&gt;
Schreib- und Lesezugriffe auf den EEPROM-Speicher erfolgen über die im Modul eeprom.h definierten Funktionen. Mit diesen Funktionen können einzelne Bytes, Datenworte (16bit) und Datenblöcke geschrieben und gelesen werden. &lt;br /&gt;
&lt;br /&gt;
Bei Nutzung des EEPROMs ist zu beachten, dass vor dem Zugriff auf diesen Speicher abgefragt wird, ob der Controller die vorherige EEPROM-Operation abgeschlossen hat. Die avr-libc-Funktionen beinhalten diese Prüfung, man muss sie nicht selbst implementieren. Man sollte auch verhindern, dass der Zugriff durch die Abarbeitung einer Interrupt-Routine unterbrochen wird, da bestimme Befehlsabfolgen vorgegeben sind, die innerhalb weniger Taktzyklen aufeinanderfolgen müssen (&amp;quot;timed sequence&amp;quot;). Auch dies muss bei Nutzung der Funktionen aus der avr-libc/eeprom.h-Datei nicht selbst implementiert werden. Innerhalb der Funktionen werden Interrupts vor der &amp;quot;EEPROM-Sequenz&amp;quot; global deaktiviert und im Anschluss, falls vorher auch schon eingeschaltet, wieder aktiviert.&lt;br /&gt;
&lt;br /&gt;
Bei der Deklaration einer Variable im EEPROM, ist das Attribut für die Section &amp;quot;.eeprom&amp;quot; zu ergänzen. Siehe dazu folgendes Beispiel:&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/eeprom.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;inttypes.h&amp;gt; // wird in aktuellen Versionen der avr-lib mit xx.h eingebunden&lt;br /&gt;
&lt;br /&gt;
// EEMEM wird bei aktuellen Versionen der avr-lib in eeprom.h definiert&lt;br /&gt;
// hier: definiere falls noch nicht bekannt (&amp;quot;alte&amp;quot; avr-libc)&lt;br /&gt;
#ifndef EEMEM&lt;br /&gt;
// alle Textstellen EEMEM im Quellcode durch __attribute__ ... ersetzen&lt;br /&gt;
#define EEMEM  __attribute__ ((section (&amp;quot;.eeprom&amp;quot;)))&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
/* Byte */&lt;br /&gt;
uint8_t eeFooByte EEMEM = 123;&lt;br /&gt;
&lt;br /&gt;
/* Wort */&lt;br /&gt;
uint16_t eeFooWord EEMEM = 12345;&lt;br /&gt;
&lt;br /&gt;
/* float */&lt;br /&gt;
float eeFooFloat EEMEM;&lt;br /&gt;
&lt;br /&gt;
/* Byte-Feld */&lt;br /&gt;
uint8_t eeFooByteArray1[] EEMEM = { 18, 3 ,70 };&lt;br /&gt;
uint8_t eeFooByteArray2[] EEMEM = { 30, 7 ,79 };&lt;br /&gt;
&lt;br /&gt;
/* 16-bit unsigned short feld */&lt;br /&gt;
uint16_t eeFooWordArray1[4] EEMEM;&lt;br /&gt;
//...&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bytes lesen/schreiben ===&lt;br /&gt;
&lt;br /&gt;
Die avr-libc Funktion zum Lesen eines Bytes heißt eeprom_read_byte. Parameter ist die Adresse des Bytes im EEPROM. Geschrieben wird über die Funktion eeprom_write_byte mit den Parametern Adresse und Inhalt. Anwendungsbeispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//...&lt;br /&gt;
    uint8_t myByte;&lt;br /&gt;
&lt;br /&gt;
    myByte = eeprom_read_byte(&amp;amp;eeFooByte); // lesen&lt;br /&gt;
    // myByte hat nun den Wert 123&lt;br /&gt;
//...&lt;br /&gt;
    myByte = 99;&lt;br /&gt;
    eeprom_write_byte(&amp;amp;eeFooByte, myByte); // schreiben&lt;br /&gt;
    // der Wert 99 wird im EEPROM an die Adresse der&lt;br /&gt;
    // &#039;Variablen&#039; eeFooByte geschrieben&lt;br /&gt;
//...&lt;br /&gt;
    myByte = eeprom_read_byte(&amp;amp;eeFooByteArray1[1]); &lt;br /&gt;
    // myByte hat nun den Wert 3&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
    // Beispiel zur &amp;quot;Sicherung&amp;quot; gegen leeres EEPROM nach &amp;quot;Chip Erase&amp;quot;&lt;br /&gt;
    // (z.B. wenn die .eep-Datei nach Programmierung einer neuen Version&lt;br /&gt;
    // des Programms nicht in den EEPROM uebertragen wurde und EESAVE&lt;br /&gt;
    // deaktiviert ist (unprogrammed/1)&lt;br /&gt;
    // &lt;br /&gt;
    // Vorsicht: wenn EESAVE &amp;quot;programmed&amp;quot; ist, hilft diese Sicherung nicht&lt;br /&gt;
    // weiter, da die Speicheraddressen in einem neuen/erweiterten Programm&lt;br /&gt;
    // moeglicherweise verschoben wurden. An der Stelle &amp;amp;eeFooByte steht&lt;br /&gt;
    // dann u.U. der Wert einer anderen Variable aus einer &amp;quot;alten&amp;quot; Version.&lt;br /&gt;
&lt;br /&gt;
    #define EEPROM_DEF 0xFF&lt;br /&gt;
    uint8_t fooByteDefault = 222;&lt;br /&gt;
    if ( ( myByte = eeprom_read_byte(&amp;amp;eeFooByte) ) == EEPROM_DEF ) {&lt;br /&gt;
        myByte = fooByteDefault;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Wort lesen/schreiben ===&lt;br /&gt;
&lt;br /&gt;
Schreiben und Lesen von Datenworten erfolgt analog zur Vorgehensweise bei Bytes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//...&lt;br /&gt;
    uint16_t myWord;&lt;br /&gt;
&lt;br /&gt;
    myWord = eeprom_read_word(&amp;amp;eeFooWord); // lesen&lt;br /&gt;
    // myWord hat nun den Wert 12345&lt;br /&gt;
//...&lt;br /&gt;
    myWord = 2222;&lt;br /&gt;
    eeprom_write_word(&amp;amp;eeFooWord, myWord); // schreiben&lt;br /&gt;
//...&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Block lesen/schreiben ===&lt;br /&gt;
&lt;br /&gt;
Lesen und Schreiben von Datenblöcken erfolgt über die Funktionen &#039;&#039;eeprom_read_block()&#039;&#039; bzw. &#039;&#039;eeprom_write_block()&#039;&#039;. Die Funktionen erwarten drei Parameter: die Adresse der Quell- bzw. Zieldaten im RAM, die EEPROM-Addresse und die Länge des Datenblocks in Bytes (size_t).&lt;br /&gt;
&lt;br /&gt;
TODO: &#039;&#039;&#039;Vorsicht!&#039;&#039;&#039; die folgenden Beispiele sind noch nicht geprüft, erstmal nur als Hinweis auf &amp;quot;das Prinzip&amp;quot;. Evtl. fehlen &amp;quot;casts&amp;quot; und möglicherweise noch mehr.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//...&lt;br /&gt;
    uint8_t  myByteBuffer[3];&lt;br /&gt;
    uint16_t myWordBuffer[4];&lt;br /&gt;
&lt;br /&gt;
    /* Datenblock aus EEPROM LESEN  */&lt;br /&gt;
&lt;br /&gt;
    /* liest 3 Bytes ab der von eeFooByteArray1 definierten EEPROM-Adresse&lt;br /&gt;
       in das RAM-Array myByteBuffer */&lt;br /&gt;
    eeprom_read_block(myByteBuffer,eeFooByteArray1,3);&lt;br /&gt;
&lt;br /&gt;
    /* dito etwas anschaulicher aber &amp;quot;unnütze Tipparbeit&amp;quot;: */&lt;br /&gt;
    eeprom_read_block(&amp;amp;myByteBuffer[0],&amp;amp;eeFooByteArray1[0],3);&lt;br /&gt;
&lt;br /&gt;
    /* dito mit etwas Absicherung betr. der Länge */&lt;br /&gt;
    eeprom_read_block(myByteBuffer,eeFooByteArray1,sizeof(myByteBuffer));&lt;br /&gt;
&lt;br /&gt;
    /* und nun mit &amp;quot;16bit&amp;quot; */&lt;br /&gt;
    eeprom_read_block(myWordBuffer,eeFooWordArray1,sizeof(myWordBuffer));&lt;br /&gt;
&lt;br /&gt;
    /* Datenblock in EEPROM SCHREIBEN */&lt;br /&gt;
    eeprom_write_block(myByteBuffer,eeFooByteArray1,sizeof(myByteBuffer));&lt;br /&gt;
    eeprom_write_block(myWordBuffer,eeFooWordArray1,sizeof(myWordBuffer));&lt;br /&gt;
//...&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Nicht-Integer&amp;quot;-Datentypen wie z.B. Fließkommazahlen lassen sich recht praktisch über eine &#039;&#039;union&#039;&#039; in &amp;quot;Byte-Arrays&amp;quot; konvertieren und wieder &amp;quot;zurückwandeln&amp;quot;. Dies erweist sich hier (aber nicht nur hier) als nützlich.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//...&lt;br /&gt;
   float myFloat = 12.34;&lt;br /&gt;
&lt;br /&gt;
   union {&lt;br /&gt;
      float r;&lt;br /&gt;
      uint8_t i[sizeof(float)];&lt;br /&gt;
   } u;&lt;br /&gt;
&lt;br /&gt;
   u.r = myFloat;&lt;br /&gt;
   &lt;br /&gt;
   /* float in EEPROM */&lt;br /&gt;
   eeprom_write_block(&amp;amp;(u.i),&amp;amp;eeFooFloat,sizeof(float));&lt;br /&gt;
&lt;br /&gt;
   /* float aus EEPROM */&lt;br /&gt;
   eeprom_read_block(&amp;amp;(u.i),&amp;amp;eeFooFloat,sizeof(float));&lt;br /&gt;
   /* u.r wieder 12.34 */&lt;br /&gt;
&lt;br /&gt;
//...&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auch zusammengesetzte Typen lassen sich mit den Block-Routinen verarbeiten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//...&lt;br /&gt;
typedef struct {&lt;br /&gt;
    uint8_t   label[8];&lt;br /&gt;
    uint8_t   rom_code[8];&lt;br /&gt;
} tMyStruct;&lt;br /&gt;
&lt;br /&gt;
#define MAXSENSORS 3&lt;br /&gt;
tMyStruct eeMyStruct[MAXSENSORS] EEMEM;&lt;br /&gt;
&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
void egal(void)&lt;br /&gt;
{&lt;br /&gt;
   tMyStruct work;&lt;br /&gt;
   &lt;br /&gt;
   strcpy(work.label,&amp;quot;Flur&amp;quot;);&lt;br /&gt;
   GetRomCode(work.rom_code);     // Dummy zur Veranschaulichung - setzt rom-code&lt;br /&gt;
&lt;br /&gt;
   /* Sichern von &amp;quot;work&amp;quot; im EEPROM */&lt;br /&gt;
   eeprom_write_block(&amp;amp;work,&amp;amp;eeMyStruct[0],sizeof(tMyStruct)); // f. Index 0&lt;br /&gt;
   strcpy(work.label,&amp;quot;Bad&amp;quot;);&lt;br /&gt;
   GetRomCode(work.rom_code);&lt;br /&gt;
   eeprom_write_block(&amp;amp;work,&amp;amp;eeMyStruct[1],sizeof(tMyStruct)); // f. Index 1&lt;br /&gt;
//...&lt;br /&gt;
   /* Lesen der Daten EEPROM Index 0 in &amp;quot;work&amp;quot; */&lt;br /&gt;
   eeprom_read_block(&amp;amp;work,&amp;amp;eeMyStruct[0],sizeof(tMyStruct));&lt;br /&gt;
   // work.label hat nun den Inhalt &amp;quot;Flur&amp;quot;&lt;br /&gt;
//...&lt;br /&gt;
}&lt;br /&gt;
//...&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== EEPROM-Speicherabbild in .eep-Datei ===&lt;br /&gt;
&lt;br /&gt;
Mit den zum Compiler gehörenden Werkzeugen kann der aus den Variablendeklarationen abgeleitete EEPROM-Inhalt in eine Datei geschrieben werden (übliche Dateiendung: .eep, Daten im Intel Hex-Format). Damit können recht elegant Standardwerte für den EEPROM-Inhalt im Quellcode definiert werden. Makefiles nach WinAVR/MFile-Vorlage enthalten bereits die notwendigen Einstellungen (siehe dazu die Erläuterungen im Abschnitt Exkurs: Makefiles). Der Inhalt der eep-Datei muss ebenfalls zum Mikrocontroller übertragen werden (Write EEPROM), wenn die Initialisierungswerte aus der Deklaration vom Programm erwartet werden. Ansonsten enthält der EEPROM-Speicher nach der Übertragung des Programmers mittels ISP abhängig von der Einstellung der EESAVE-Fuse (vgl. Datenblatt Abschnitt Fuse Bits) die vorherigen Daten (EESAVE programmed = 0), deren Position möglicherweise nicht mehr mit der Belegung im aktuellen Programm übereinstimmt oder den Standardwert nach &amp;quot;Chip Erase&amp;quot;: 0xFF (EESAVE unprogrammed = 1). Als Sicherung kann man im Programm nochmals die Standardwerte vorhalten, beim Lesen auf 0xFF prüfen und gegebenfalls einen Standardwert nutzen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Eine besondere Funktion des avr-gcc ist, dass mit entsprechenden Optionen im Makefile aus den Initialisierungswerten der Variablen im Quellcode eine Datei erzeugt werden kann, die man auf den Controller programmieren kann (.eep-Datei). Damit können sehr elegant Standardwerte für den EEPROM-Inhalt im Quellcode definiert werden. Die Vorgehensweise wird aus dem WinAVR-Beispielmakefile ersichtlich. Siehe dazu die Erläuterungen im Abschnitt Exkurs: Makefiles.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== EEPROM-Variable auf feste Adressen legen ===&lt;br /&gt;
&lt;br /&gt;
Gleich zu Beginn möchte ich darauf hinweisen, dass dieses Verfahren nur ein Workaround ist, mit dem man das Problem der anscheinend &amp;quot;zufälligen&amp;quot; Verteilung&lt;br /&gt;
der EEPROM-Variablen durch den Compiler etwas in den Griff bekommen kann.&lt;br /&gt;
&lt;br /&gt;
Hilfreich kann dies vor allem dann sein, wenn man z.B. über einen Kommandointerpreter (o.ä. Funktionen) direkt bestimmte EEPROM-Adressen manipulieren möchte. Auch wenn man über einen JTAG-Adapter (mk I oder mkII) den Programmablauf manipulieren möchte, indem man die EEPROM-Werte direkt ändert, kann diese Technik hilfreich sein.&lt;br /&gt;
&lt;br /&gt;
Im folgenden nun zwei Sourcelistings mit einem Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/////////////////////////////////////////////////&lt;br /&gt;
// Datei &amp;quot;eeprom.h&amp;quot; eines eigenen Projektes&lt;br /&gt;
/////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
#inlcude &amp;lt;avr/eeprom.h&amp;gt;     // Die EEPROM-Definitionen/Macros der avr-libc einbinden&lt;br /&gt;
&lt;br /&gt;
#define   EESIZE   512      // Maximale Größe des EEPROMS&lt;br /&gt;
&lt;br /&gt;
#define   EE_DUMMY   0x000  // Dummyelement (Adresse 0 sollte nicht genutzt werden)&lt;br /&gt;
#define   EE_VALUE1  0x001  // Eine Bytevariable  &lt;br /&gt;
#define   EE_WORD1L  0x002  // Eine Wordvariable (Lowbyte)&lt;br /&gt;
#define   EE_WORD1H  0x003  // Eine Wordvariable (Highbyte)&lt;br /&gt;
#define   EE_VALUE2  0x004  // Eine weitere Bytevariable&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit den Macros &#039;&#039;&#039;#define EE_VALUE1&#039;&#039;&#039; legt man den Namen und die Adresse der&lt;br /&gt;
&#039;Variablen&#039; fest.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=$FF0000&amp;gt;WICHTIG:&amp;lt;/font&amp;gt;Die Adressen sollten fortlaufend, zumindest aber aufsteigend sortiert sein! Ansonsten besteht die Gefahr, daß man sehr schnell ein Durcheinander im EEPROM Speicher veranstaltet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=$FF0000&amp;gt;WICHTIG:&amp;lt;/font&amp;gt;Für den Compiler sind das lediglich Speicher-Adressen, über die auf das EEPROM zugegriffen wird. Der Compiler sieht nichts davon als eine echte Variable an und stößt sich daher auch nicht daran, wenn 2 Makros mit der gleichen Speicheradresse, bzw. überlappenden Speicherbereichen definiert werden. Es liegt einzig und alleine in der Hand des Programmierers, hier keinen Fehler zu machen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/////////////////////////////////////////////////&lt;br /&gt;
// Datei &amp;quot;eeprom.c&amp;quot; eines eigenen Projektes&lt;br /&gt;
/////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;eeprom.h&amp;quot;          // Eigene EEPROM-Headerdatei einbinden&lt;br /&gt;
&lt;br /&gt;
uint8_t ee_mem[EESIZE] EEMEM =&lt;br /&gt;
{&lt;br /&gt;
   [EE_DUMMY]   = 0x00,&lt;br /&gt;
   [EE_VALUE1]  = 0x05,&lt;br /&gt;
   [EE_WORD1L]  = 0x01,   &lt;br /&gt;
   [EE_WORD1H]  = 0x00,&lt;br /&gt;
   [EE_VALUE2]  = 0xFF&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Durch die Verwendung eines Array, welches das gesamte EEPROM umfasst, bleibt&lt;br /&gt;
dem Compiler nicht anderes übrig, als das Array so zu platzieren, dass Element 0&lt;br /&gt;
des Arrays der Adresse 0 des EEPROMs entspricht. (&#039;&#039;Ich hoffe nur, dass die Compilerbauer daran nichts ändern!&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Wie man in dem obigen Codelisting auch sehen kann, hat das Verfahren einen kleinen Haken. Variablen die größer sind als 1 Byte, müssen etwas umständlicher&lt;br /&gt;
definiert werden. Benötigt man keine Initialisierung durch das Programm (was der Normalfall sein dürfte), dann kann man das auch so machen:&lt;br /&gt;
&lt;br /&gt;
Möchte man im EEPROM hintereinander beispielsweise Variablen, mit den Namen &#039;&#039;&#039;Wert&#039;&#039;&#039;, &#039;&#039;&#039;Anzahl&#039;&#039;&#039;, &#039;&#039;&#039;Name&#039;&#039;&#039; und &#039;&#039;&#039;Wertigkeit&#039;&#039;&#039; definieren, wobei Wert und Wertigkeit 1 Byte belegen sollen, Anzahl als 1 Wort (also 2 Bytes) und Name mit 10 Bytes reserviert werden soll, so geht auch folgendes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define EE_DUMMY      0x000&lt;br /&gt;
#define EE_WERT       ( 0x000 + sizeof( uint8_t ) )&lt;br /&gt;
#define EE_ANZAHL     ( EE_WERT + sizeof( uint8_t ) )&lt;br /&gt;
#define EE_NAME       ( EE_ANZAHL + sizeof( uint16_t ) )&lt;br /&gt;
#define EE_WERTIGKEIT ( EE_NAME + 10 * sizeof( uint8_t ) )&lt;br /&gt;
#define EE_LAST       ( EE_WERTIGKEIT + sizeof( uint8_t ) )&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jedes Makro definiert also seine Startadresse durch die Startadresse der unmittelbar vorhergehende &#039;Variablen&#039; plus der Anzahl der Bytes die von der vorhergehenden &#039;Variablen&#039; verbraucht werden. Dadurch ist man zumindest etwas auf der sicheren Seite, dass keine 2 &#039;Variablen&#039; im EEPROM überlappend definiert werden. Möchte man eine weitere &#039;Variable&#039; hinzufügen, so wird deren&lt;br /&gt;
Name, einfach anstelle der EE_LAST eingesetzt und eine neue Zeile für EE_LAST eingefügt, in der dann die Größe der &#039;Variablen&#039; festgelegt wird. Zb.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define EE_DUMMY      0x000&lt;br /&gt;
#define EE_WERT       ( 0x000 + sizeof( uint8_t ) )&lt;br /&gt;
#define EE_ANZAHL     ( EE_WERT + sizeof( uint8_t ) )&lt;br /&gt;
#define EE_NAME       ( EE_ANZAHL + sizeof( uint16_t ) )&lt;br /&gt;
#define EE_WERTIGKEIT ( EE_NAME + 10 * sizeof( uint8_t ) )&lt;br /&gt;
#define EE_PROZENT    ( EE_WERTIGKEIT + sizeof( uint8_t ) )&lt;br /&gt;
#define EE_LAST       ( EE_PROZENT + sizeof( double ) )&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EE_PROZENT legt die Startadresse für eine neue &#039;Variable&#039; des Datentyps double fest.&lt;br /&gt;
&lt;br /&gt;
Der Zugriff auf die EEPROM Werte kann dann z.B.so erfolgen:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
uint8_t   temp1;&lt;br /&gt;
uint16_t  temp2;&lt;br /&gt;
&lt;br /&gt;
temp1 = eeprom_read_byte(EE_VALUE1);&lt;br /&gt;
temp2 = eeprom_read_word(EE_WORD1L);&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ob die in der avr-libc vorhandenen Funktionen dafür verwendet werden können, weiß ich nicht. Aber in einigen Fällen muss man sich sowieso eigene Funktionen&lt;br /&gt;
bauen, welche die spezifischen Anforderungen (Interrupt - Atom Problem, etc.)&lt;br /&gt;
erfüllen.&lt;br /&gt;
&lt;br /&gt;
Die oben beschriebene Möglichkeit ist nur eine Möglichkeit, wie man dies realisieren kann. Sie bietet einem eine relativ einfache Art die EEPROM-Werte&lt;br /&gt;
auf beliebige Adressen zu legen oder Adressen zu ändern. Die Andere Möglichkeit besteht darin, die EEPROM-Werte wie folgt zu belegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/////////////////////////////////////////////////&lt;br /&gt;
// Datei &amp;quot;eeprom.c&amp;quot; eines eigenen Projektes&lt;br /&gt;
/////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;eeprom.h&amp;quot;          // Eigene EEPROM-Headerdatei einbinden&lt;br /&gt;
&lt;br /&gt;
uint8_t ee_mem[EESIZE] EEMEM =&lt;br /&gt;
{&lt;br /&gt;
  0x00,                     //  ee_dummy&lt;br /&gt;
  0x05,                     //  ee_value1&lt;br /&gt;
  0x01,                     //  ee_word1L&lt;br /&gt;
  0x00,                     // (ee_word1H)&lt;br /&gt;
  0xFF                      //  ee_value2&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hierbei kann man Variablen, die größer sind als 1 Byte einfacher definieren und&lt;br /&gt;
man muss nur die Highbyte- oder Lowbyte-Adresse in der &amp;quot;eeprom.h&amp;quot; definieren.&lt;br /&gt;
Allerdings muss man hier höllisch aufpassen, dass man nicht um eine oder mehrere&lt;br /&gt;
Positionen verrutscht!&lt;br /&gt;
&lt;br /&gt;
Welche der beiden Möglichkeiten man einsetzt, hängt vor allem davon ab, wieviele&lt;br /&gt;
Byte, Word und sonstige Variablen man benutzt. Gewöhnen sollte man sich an beide Varianten können ;)&lt;br /&gt;
&lt;br /&gt;
Kleine Schlussbemerkung:&lt;br /&gt;
&lt;br /&gt;
* Der avr-gcc unterstützt die Variante 1 und die Variante 2&lt;br /&gt;
* Der icc-avr Compiler unterstützt nur die Variante 2!&lt;br /&gt;
&lt;br /&gt;
=== Bekannte Probleme bei den EEPROM-Funktionen ===&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Bei alten Versionen der avr-libc wurden nicht alle AVR Controller  unterstützt. Z.B. bei der avr-libc Version 1.2.3 insbesondere bei AVRs &amp;quot;der neuen Generation&amp;quot; (ATmega48/88/168/169) funktionieren die Funktionen nicht korrekt (Ursache: unterschiedliche Speicheradressen der EEPROM-Register). In neueren Versionen (z.B. avr-libc 1.4.3 aus WinAVR 20050125) wurde die Zahl der unterstüzten Controller deutlich erweitert und eine Methode zur leichten Anpassung an zukünftige Controller eingeführt.&lt;br /&gt;
&lt;br /&gt;
In jedem Datenblatt zu AVR-Controllern mit EEPROM sind kurze Beispielecodes für den Schreib- und Lesezugriff enthalten. Will oder kann man nicht auf die neue Version aktualisieren, kann der dort gezeigte Code auch mit dem avr-gcc (ohne avr-libc/eeprom.h) genutzt werden (&amp;quot;copy/paste&amp;quot;, gegebenfalls Schutz vor Unterbrechnung/Interrupt ergänzen &#039;&#039;uint8_t sreg; sreg=SREG; cli(); [EEPROM-Code] ; SREG=sreg; return;&#039;&#039;, siehe Abschnitt Interrupts). Im Zweifel hilft ein Blick in den vom Compiler erzeugten Assembler-Code (lst/lss-Dateien).&lt;br /&gt;
&lt;br /&gt;
* siehe auch: [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Modules/EEPROM handling&lt;br /&gt;
&lt;br /&gt;
=== EEPROM Register ===&lt;br /&gt;
Um das EEPROM anzusteuern sind drei Register von Bedeutung:&lt;br /&gt;
;EEAR: Hier werden die Adressen eingetragen zum Schreiben oder Lesen. Dieses Register unterteilt sich nochmal in EEARH und EEARL da in einem 8 Bit Register keine 512 Adressen adressiert werden können&lt;br /&gt;
;EEDR: Hier werden die Daten eingetragen die geschrieben werden sollen bzw. es enthält die gelesenen Daten&lt;br /&gt;
;EECR: Ist das Kontrollregister für das EEPROM&lt;br /&gt;
&lt;br /&gt;
Das EECR steuert den Zugriff auf das EEPROM und 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;
|+ &#039;&#039;&#039;Aufbau des EECR-Registers&#039;&#039;&#039;&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;
| - || - || - ||- || EERIE || EEMWE || EEWE || EERE&lt;br /&gt;
|-&lt;br /&gt;
! Read/Write&lt;br /&gt;
| R || R || R || R || R/W || R/W || R/W || R/W&lt;br /&gt;
|-&lt;br /&gt;
!Init Value&lt;br /&gt;
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bedeutung der Bits&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
;Bit 4-7: nicht belegt&lt;br /&gt;
&lt;br /&gt;
;Bit 3 (EERIE): &#039;&#039;EEPROM Ready Interrupt Enable&#039;&#039;: Wenn das Bit gesetzt ist und globale Interrupts erlaubt sind in Register SREG (Bit 7) wird ein Interrupt ausgelöst nach Beendigung des Schreibzyklus (EEPROM Ready Interrupt). Ist einer der beiden Bits 0 wird kein Interrupt ausgelöst.&lt;br /&gt;
&lt;br /&gt;
;Bit 2 EEMWE): &#039;&#039;EEPROM Master Write Enable&#039;&#039;: Dieses Bit bestimmt, daß wenn EEWE = 1 gesetzt wird (innerhalb von 4 Taktzyklen), das EEPROM beschrieben wird mit den Daten in EEDR bei Adresse EEAR. Wenn EEMWE =0 ist und EEWE = 1 gesetzt wird hat das keine Auswirkungen. Der Schreibvorgang wird dann nicht ausgelöst. Nach 4 Taktzyklen wird das Bit EEMWE automatisch wieder auf 0 gesetzt. Dieses Bit löst den Schreibvorgang nicht aus, es dient sozusagen als Sicherungsbit für EEWE.&lt;br /&gt;
&lt;br /&gt;
;Bit 1 (EEWE): &#039;&#039;EEPROM Write Enable&#039;&#039;: Dieses Bit löst den Schreibvorgang aus wenn es auf 1 gesetzt wird, sofern vorher EEMWE gesetzt wurde und seitdem nicht mehr als 4 Taktzyklen vergangen sind. Wenn der Schreibvorgang abgeschlossen ist wird dieses Bit automatisch wieder auf 0 gesetzt und sofern EERIE gesetzt ist ein Interrupt ausgelöst. Ein Schreibvorgang sieht typischerweise wie folgt aus:&lt;br /&gt;
:# EEPROM Bereitschaft abwarten (EEWE=0) &lt;br /&gt;
:# Adresse übergeben an EEAR&lt;br /&gt;
:# Daten übergeben an EEDR&lt;br /&gt;
:# Schreibvorgang auslösen in EECR mit Bit EEMWE=1 und EEWE=1&lt;br /&gt;
:# (Optinal) Warten bis Schreibvorgang abgeschlossen ist&lt;br /&gt;
&lt;br /&gt;
;Bit 0 EERE: &#039;&#039;EEPROM Read Enable&#039;&#039;: Wird dieses Bit auf 1 gesetzt wird das EEPROM an der Adresse in EEAR ausgelesen und die Daten in EEDR gespeichert. Das EEPROM kann nicht ausgelesen werden wenn bereits eine Schreiboperation gestartet wurde. Es ist daher zu empfehlen die Bereitschaft vorher zu prüfen. Das EEPROM ist lesebereit wenn das Bit EEWE=0 ist. Ist der Lesevorgang abgeschlossen wird das Bit wieder auf 0 gesetzt und das EEPROM ist für neue Lese/Schreibbefehle wieder bereit. Ein typischer Lesevorgang kann wie folgt aufgebaut sein:&lt;br /&gt;
:# Bereitschaft zum lesen prüfen (EEWE=0)&lt;br /&gt;
:# Adresse übergeben an EEAR&lt;br /&gt;
:# Lesezyklus auslösen mit EERE = 1&lt;br /&gt;
:# Warten bis Lesevorgang abgeschlossen EERE = 0&lt;br /&gt;
:# Daten abholen aus EEDR&lt;br /&gt;
&lt;br /&gt;
= Die Nutzung von sprintf und printf =&lt;br /&gt;
&lt;br /&gt;
Um komfortabel, d.h. formatiert, Ausgaben auf ein Display oder die serielle Schnittstelle zu tätigen, bieten sich &#039;&#039;&#039;sprintf&#039;&#039;&#039; oder &#039;&#039;&#039;printf&#039;&#039;&#039; an. &lt;br /&gt;
&lt;br /&gt;
Alle *printf-Varianten sind jedoch ziemlich speicherintensiv und der Einsatz in einem Mikrocontroller mit knappem Speicher muss sorgsam abgewogen werden.&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;sprintf&#039;&#039;&#039; wird die Ausgabe zunächst in einem Puffer vorbereitet und anschliessend mit einfachen Funktionen zeichenweise ausgegeben. Es liegt in der Verantwortung des Programmierers genügend Platz im Puffer für die erwarteten Zeichen bereitzuhalten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// ...&lt;br /&gt;
// nicht dargestellt: Implementierung von uart_puts (vgl. Abschnitt UART)&lt;br /&gt;
// ...&lt;br /&gt;
&lt;br /&gt;
uint16_t counter;&lt;br /&gt;
&lt;br /&gt;
// Ausgabe eines unsigned Integerwertes&lt;br /&gt;
void uart_puti( uint16_t value )&lt;br /&gt;
{&lt;br /&gt;
    uint8_t puffer[20];&lt;br /&gt;
&lt;br /&gt;
    sprintf( puffer, &amp;quot;Zählerstand: %u&amp;quot;, value );&lt;br /&gt;
    uart_puts( puffer );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  counter = 5;&lt;br /&gt;
&lt;br /&gt;
  uart_puti( counter );&lt;br /&gt;
  uart_puti( 42 );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine weitere elegante Möglichkeit besteht darin, den STREAM stdout (Standardausgabe) auf eine eigene Ausgabefunktion umzuleiten. Dazu wird dem Ausgabemechanismus der C-Bibliothek eine neue Ausgabefunktion bekannt gemacht, deren Aufgabe es ist, ein einzelnes Zeichen auszugeben. Wohin die Ausgabe dann tatsächlich stattfindet, ist Sache der Ausgabefunktion. Im Beispiel unten wird auf UART ausgegeben. Alle anderen, höheren  Funktionen wie z.B. &#039;&#039;&#039;printf&#039;&#039;&#039; greifen letztendlich auf diese primitive Ausgabefunktion zurück. &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;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void uart_init(void);&lt;br /&gt;
&lt;br /&gt;
// a. Deklaration der primitiven Ausgabefunktion&lt;br /&gt;
int uart_putchar(char c, FILE *stream);&lt;br /&gt;
&lt;br /&gt;
// b. Umleiten der Standardausgabe stdout (Teil 1)&lt;br /&gt;
static FILE mystdout = FDEV_SETUP_STREAM( uart_putchar, NULL, _FDEV_SETUP_WRITE );&lt;br /&gt;
&lt;br /&gt;
// c. Definition der Ausgabefunktion&lt;br /&gt;
int uart_putchar( char c, FILE *stream )&lt;br /&gt;
{&lt;br /&gt;
    if( c == &#039;\n&#039; )&lt;br /&gt;
        uart_putchar( &#039;\r&#039;, stream );&lt;br /&gt;
&lt;br /&gt;
    loop_until_bit_is_set( UCSRA, UDRE );&lt;br /&gt;
    UDR = c;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_init(void)&lt;br /&gt;
{&lt;br /&gt;
    /* hier µC spezifischen Code zur Initialisierung */&lt;br /&gt;
    /* des UART einfügen... s.o. im AVR-GCC-Tutorial */&lt;br /&gt;
&lt;br /&gt;
    // Beispiel: &lt;br /&gt;
    //&lt;br /&gt;
    // myAVR Board 1.5 mit externem Quarz Q1 3,6864 MHz&lt;br /&gt;
    // 9600 Baud 8N1&lt;br /&gt;
&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
#define F_CPU 3686400&lt;br /&gt;
#endif&lt;br /&gt;
#define UART_BAUD_RATE 9600&lt;br /&gt;
&lt;br /&gt;
// Hilfsmakro zur UBRR-Berechnung (&amp;quot;Formel&amp;quot; laut Datenblatt)&lt;br /&gt;
#define UART_UBRR_CALC(BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1)&lt;br /&gt;
&lt;br /&gt;
    UCSRB |= (1&amp;lt;&amp;lt;TXEN) | (1&amp;lt;&amp;lt;RXEN);    // UART TX und RX einschalten&lt;br /&gt;
    UCSRC |= (1&amp;lt;&amp;lt;URSEL)|(3&amp;lt;&amp;lt;UCSZ0);    // Asynchron 8N1 &lt;br /&gt;
 &lt;br /&gt;
    UBRRH = (uint8_t)( UART_UBRR_CALC( UART_BAUD_RATE, F_CPU ) &amp;gt;&amp;gt; 8 );&lt;br /&gt;
    UBRRL = (uint8_t)UART_UBRR_CALC( UART_BAUD_RATE, F_CPU );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    int16_t antwort = 42;&lt;br /&gt;
    uart_init();&lt;br /&gt;
&lt;br /&gt;
    // b. Umleiten der Standardausgabe stdout (Teil 2)&lt;br /&gt;
    stdout = &amp;amp;mystdout;&lt;br /&gt;
&lt;br /&gt;
    // Anwendung&lt;br /&gt;
    printf( &amp;quot;Die Antwort ist %d.\n&amp;quot;, antwort );&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Quelle: avr-libc-user-manual-1.4.3.pdf, S.74&lt;br /&gt;
//         + Ergänzungen&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sollen Fließkommazahlen ausgegeben werden, muss im Makefile eine andere (größere) Version der [[FAQ#Aktivieren_der_Floating_Point_Version_von_sprintf_beim_WinAVR_mit_AVR-Studio|printflib]] eingebunden werden.&lt;br /&gt;
&lt;br /&gt;
= Assembler und Inline-Assembler =&lt;br /&gt;
&lt;br /&gt;
Gelegentlich erweist es sich als nützlich, C- und Assembler-Code in einer Anwendung zu nutzen. Typischerweise wird das Hauptprogramm in C verfasst und wenige, extrem zeitkritische oder hardwarenahe Operationen in Assembler.&lt;br /&gt;
&lt;br /&gt;
Die &amp;quot;gnu-Toolchain&amp;quot; bietet dazu zwei Möglichkeiten:&lt;br /&gt;
&lt;br /&gt;
* Inline-Assembler: Die Assembleranweisungen werden direkt in den C-Code integriert. Eine Quellcode-Datei enthält somit C- und Assembleranweisungen&lt;br /&gt;
* Assembler-Dateien: Der Assemblercode befindet sich in eigenen Quellcodedateien. Diese werden vom gnu-Assembler (avr-as) zu Object-Dateien assembliert (&amp;quot;compiliert&amp;quot;) und mit den aus dem C-Code erstellten Object-Dateien zusammengebunden (gelinkt).&lt;br /&gt;
&lt;br /&gt;
== Inline-Assembler ==&lt;br /&gt;
&lt;br /&gt;
Inline-Assembler bietet sich an, wenn nur wenig Assembleranweisungen benötigt werden. Typische Anwendung sind kurze Codesequenzen für zeitkritische Operationen in Interrupt-Routinen oder sehr präzise Warteschleifen (z.B. 1-Wire). Inline-Assembler wird mit &#039;&#039;&#039;asm volatile&#039;&#039;&#039; eingeleitet, die Assembler-Anweisungen werden in einer Zeichenkette zusammengefasst, die als &amp;quot;Parameter&amp;quot; übergeben wird. Durch Doppelpunkte getrennt werden die Ein- und Ausgaben sowie die &amp;quot;Clobber-Liste&amp;quot; angegeben.&lt;br /&gt;
&lt;br /&gt;
Ein einfaches Beispiel für Inline-Assembler ist das Einfügen einer NOP-Anweisung (NOP steht für No Operation). Dieser Assembler-Befehl benötigt genau einen Taktzyklus, ansonsten &amp;quot;tut sich nichts&amp;quot;. Sinnvolle Anwendungen für NOP sind genaue Delay(=Warte)-Funktionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
   /* Verzögern der weiteren Programmausführung um&lt;br /&gt;
      genau 3 Taktzyklen */&lt;br /&gt;
    asm volatile (&amp;quot;nop&amp;quot;);&lt;br /&gt;
    asm volatile (&amp;quot;nop&amp;quot;);&lt;br /&gt;
    asm volatile (&amp;quot;nop&amp;quot;);&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weiterhin kann mit einem NOP verhindert werden, dass leere Schleifen, die als Warteschleifen gedacht sind, wegoptimiert werden. Der Compiler erkennt ansonsten die vermeintlich nutzlose Schleife und erzeugt dafür keinen Code im ausführbaren Programm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    uint16_t i;&lt;br /&gt;
&lt;br /&gt;
    /* leere Schleife - wird bei eingeschalteter Compiler-Optimierung   wegoptimiert */&lt;br /&gt;
    for (i = 0; i &amp;lt; 1000; i++)&lt;br /&gt;
      ;&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
    /* Schleife erzwingen (keine Optimierung): &amp;quot;NOP-Methode&amp;quot; */&lt;br /&gt;
    for (i = 0; i &amp;lt; 1000; i++)&lt;br /&gt;
      asm volatile(&amp;quot;NOP&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
    /* alternative Methode (keine Optimierung): */&lt;br /&gt;
    volatile uint16_t j;&lt;br /&gt;
    for (j = 0; j &amp;lt; 1000; j++)&lt;br /&gt;
      ;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein weiterer nützlicher &amp;quot;Assembler-Einzeiler&amp;quot; ist der Aufruf von sleep (&#039;&#039;asm volatile (&amp;quot;sleep&amp;quot;);&#039;&#039;), da hierzu in älteren Versionen der avr-libc keine eigene Funktion existiert (in neueren Versionen &#039;&#039;sleep_cpu()&#039;&#039; aus sleep.h).&lt;br /&gt;
&lt;br /&gt;
Als Beispiel für mehrzeiligen Inline-Assembler eine präzise Delay-Funktion. Die Funktion erhält ein 16-bit Wort als Parameter, prüft den Parameter auf 0 und beendet die Funktion in diesem Fall oder durchläuft die folgende Schleife sooft wie im Wert des Parameters angegeben. Inline-Assembler hat hier den Vorteil, dass die Laufzeit unabhängig von der Optimierungsstufe (Parameter -O, vgl. makefile) und der Compiler-Version ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
static inline void delayloop16 (uint16_t count)&lt;br /&gt;
{&lt;br /&gt;
    asm volatile (&amp;quot;cp  %A0, __zero_reg__ \n\t&amp;quot;&lt;br /&gt;
                  &amp;quot;cpc %B0, __zero_reg__ \n\t&amp;quot;&lt;br /&gt;
                  &amp;quot;breq 2f               \n\t&amp;quot;&lt;br /&gt;
                  &amp;quot;1:                    \n\t&amp;quot;&lt;br /&gt;
                  &amp;quot;sbiw %0,1             \n\t&amp;quot;&lt;br /&gt;
                  &amp;quot;brne 1b               \n\t&amp;quot;&lt;br /&gt;
                  &amp;quot;2:                    &amp;quot;  &lt;br /&gt;
                  : &amp;quot;=w&amp;quot; (count)&lt;br /&gt;
	          : &amp;quot;0&amp;quot;  (count)&lt;br /&gt;
    );                            &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Jede Anweisung wird mit &#039;&#039;&#039;\n\t&#039;&#039;&#039; abgeschlossen. Der Zeilenumbruch teilt dem Assembler mit, dass ein neuer Befehl beginnt.&lt;br /&gt;
* Als Sprung-Marken (Labels) werden Ziffern verwendet. Diese speziellen Labels sind mehrfach im Code verwendbar. Gesprungen wird jeweils zurück (b) oder vorwärts (f) zum nächsten auffindbaren Label.&lt;br /&gt;
&lt;br /&gt;
Das Resultat zeigt ein Blick in die Assembler-Datei, die der Compiler mit der option &amp;lt;tt&amp;gt;-save-temps&amp;lt;/tt&amp;gt; nicht löscht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
	cp  r24, __zero_reg__ 	 ;  count&lt;br /&gt;
	cpc r25, __zero_reg__ 	 ;  count&lt;br /&gt;
	breq 2f               &lt;br /&gt;
	1:                    &lt;br /&gt;
	sbiw r24,1             	 ;  count&lt;br /&gt;
	brne 1b               &lt;br /&gt;
	2:&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detaillierte Ausführungen zum Thema Inline-Assembler finden sich in der Dokumentation der avr-libc im Abschnitt [http://www.nongnu.org/avr-libc/user-manual/inline_asm.html Related Pages/Inline Asm]. &lt;br /&gt;
&lt;br /&gt;
Siehe auch: &lt;br /&gt;
* [http://www.atmel.com/dyn/resources/prod_documents/doc0856.pdf AVR Assembler-Anweisungsliste]&lt;br /&gt;
* [http://www.roboternetz.de/wissen/index.php/Inline-Assembler_in_avr-gcc Deutsche Einführung in Inline-Assembler]&lt;br /&gt;
&lt;br /&gt;
== Assembler-Dateien ==&lt;br /&gt;
&lt;br /&gt;
Assembler-Dateien erhalten die Endung .S (&#039;&#039;grosses&#039;&#039; S) und werden im makefile nach WinAVR/mfile-Vorlage hinter &#039;&#039;ASRC=&#039;&#039; durch Leerzeichen getrennt aufgelistet.&lt;br /&gt;
&lt;br /&gt;
Wenn man mit dem AVR Studio arbeitet, kann alternativ auch das standardmäßig erstellte Makefile bearbeitet und folgende Zeilen eingefügt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
## Objects that must be built in order to link&lt;br /&gt;
OBJECTS = (alte Dateien...) useful.o&lt;br /&gt;
&lt;br /&gt;
## Compile&lt;br /&gt;
## Hier folgt eine Liste der gelinkten Dateien, darunter einfügen:&lt;br /&gt;
useful.o: ../useful.S&lt;br /&gt;
	$(CC) $(INCLUDES) $(ASMFLAGS) -c  $&amp;lt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Das war es schon. Allerdings gilt es zu beachten, dass das makefile über &amp;quot;Project -&amp;gt; Configuration options&amp;quot; selbst einzubinden ist, sonst wird es natürlich wieder überschrieben.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel eine Funktion &#039;&#039;superFunc&#039;&#039;, die alle Pins des Ports D auf &amp;quot;Ausgang&amp;quot; schaltet, eine Funktion &#039;&#039;ultraFunc&#039;&#039;, die die Ausgänge entsprechend des übergebenen Parameters schaltet, eine Funktion &#039;&#039;gigaFunc&#039;&#039;, die den Status von Port A zurückgibt und eine Funktion &#039;&#039;addFunc&#039;&#039;, die zwei Bytes zu einem 16-bit-Wort addiert. Die Zuweisungen im C-Code (PORTx = ...) verhindern, dass der Compiler die Aufrufe wegoptimiert und dienen nur zur Veranschaulichung der Parameterübergaben.&lt;br /&gt;
&lt;br /&gt;
Zuerst der Assembler-Code. Der Dateiname sei useful.S:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
#include &amp;quot;avr/io.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//; Arbeitsregister (ohne &amp;quot;r&amp;quot;) &lt;br /&gt;
workreg  = 16&lt;br /&gt;
workreg2 = 17&lt;br /&gt;
&lt;br /&gt;
//; Konstante:&lt;br /&gt;
ALLOUT = 0xff&lt;br /&gt;
&lt;br /&gt;
//; ** Setze alle Pins von PortD auf Ausgang **&lt;br /&gt;
//; keine Parameter, keine Rückgabe&lt;br /&gt;
.global superFunc&lt;br /&gt;
.func superFunc&lt;br /&gt;
superFunc:&lt;br /&gt;
   push workreg&lt;br /&gt;
   ldi workreg, ALLOUT&lt;br /&gt;
   out  _SFR_IO_ADDR(DDRD), workreg  // beachte: _SFR_IO_ADDR()&lt;br /&gt;
   pop workreg&lt;br /&gt;
   ret&lt;br /&gt;
.endfunc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//; ** Setze PORTD auf übergebenen Wert **&lt;br /&gt;
//; Parameter in r24 (LSB immer bei &amp;quot;graden&amp;quot; Nummern)&lt;br /&gt;
.global ultraFunc&lt;br /&gt;
.func ultraFunc&lt;br /&gt;
ultraFunc:&lt;br /&gt;
   out  _SFR_IO_ADDR(PORTD), 24&lt;br /&gt;
   ret&lt;br /&gt;
.endfunc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//; ** Zustand von PINA zurückgeben **&lt;br /&gt;
//; Rückgabewerte in r24:r25 (LSB:MSB), hier nur LSB genutzt&lt;br /&gt;
.global gigaFunc&lt;br /&gt;
.func gigaFunc&lt;br /&gt;
gigaFunc:&lt;br /&gt;
   in 24, _SFR_IO_ADDR(PINA)&lt;br /&gt;
   ret&lt;br /&gt;
.endfunc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//; ** Zwei Bytes addieren und 16-bit-Wort zurückgeben **&lt;br /&gt;
//; Parameter in r24 (Summand1) und r22 (Summand2) -&lt;br /&gt;
//;  Parameter sind Word-&amp;quot;aligned&amp;quot; d.h. LSB immer auf &amp;quot;graden&amp;quot;&lt;br /&gt;
//;  Registernummern. Bei 8-Bit und 16-Bit Paramtern somit &lt;br /&gt;
//;  beginnend bei r24 dann r22 dann r20 etc.&lt;br /&gt;
//; Rückgabewert in r24:r25&lt;br /&gt;
.global addFunc&lt;br /&gt;
.func addFunc&lt;br /&gt;
addFunc:&lt;br /&gt;
   push workreg&lt;br /&gt;
   push workreg2&lt;br /&gt;
   clr workreg2&lt;br /&gt;
   mov workreg, 22&lt;br /&gt;
   add workreg, 24&lt;br /&gt;
   adc workreg2, 1    // r1 - assumed to be always zero ...&lt;br /&gt;
   movw r24, workreg&lt;br /&gt;
   pop workreg2&lt;br /&gt;
   pop workreg&lt;br /&gt;
   ret&lt;br /&gt;
.endfunc&lt;br /&gt;
&lt;br /&gt;
//; oh je - sorry - Mein AVR-Assembler ist eingerostet, hoffe das stimmt so...&lt;br /&gt;
&lt;br /&gt;
.end&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Makefile ist der Name der Assembler-Quellcodedatei einzutragen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
ASRC = useful.S&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Aufruf erfolgt dann im C-Code so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
extern void superFunc(void);&lt;br /&gt;
extern void ultraFunc(uint8_t setVal);&lt;br /&gt;
extern uint8_t gigaFunc(void);&lt;br /&gt;
extern uint16_t addFunc(uint8_t w1, uint8_t w2);&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
[...]&lt;br /&gt;
  superFunc();&lt;br /&gt;
  &lt;br /&gt;
  ultraFunc(0x55);&lt;br /&gt;
  &lt;br /&gt;
  PORTD = gigaFunc();&lt;br /&gt;
&lt;br /&gt;
  PORTA = (addFunc(0xF0, 0x11) &amp;amp; 0xff);&lt;br /&gt;
  PORTB = (addFunc(0xF0, 0x11) &amp;gt;&amp;gt; 8);&lt;br /&gt;
[...]&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis wird wieder in der lss-Datei ersichtlich:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
   superFunc();&lt;br /&gt;
 148:	0e 94 f6 00 	call	0x1ec&lt;br /&gt;
  &lt;br /&gt;
  ultraFunc(0x55);&lt;br /&gt;
 14c:	85 e5       	ldi	r24, 0x55	; 85&lt;br /&gt;
 14e:	0e 94 fb 00 	call	0x1f6&lt;br /&gt;
  &lt;br /&gt;
  PORTD = gigaFunc();&lt;br /&gt;
 152:	0e 94 fd 00 	call	0x1fa&lt;br /&gt;
 156:	82 bb       	out	0x12, r24	; 18&lt;br /&gt;
  &lt;br /&gt;
  PORTA = (addFunc(0xF0, 0x11) &amp;amp; 0xff);&lt;br /&gt;
 158:	61 e1       	ldi	r22, 0x11	; 17&lt;br /&gt;
 15a:	80 ef       	ldi	r24, 0xF0	; 240&lt;br /&gt;
 15c:	0e 94 ff 00 	call	0x1fe&lt;br /&gt;
 160:	8b bb       	out	0x1b, r24	; 27&lt;br /&gt;
  PORTB = (addFunc(0xF0, 0x11) &amp;gt;&amp;gt; 8);&lt;br /&gt;
 162:	61 e1       	ldi	r22, 0x11	; 17&lt;br /&gt;
 164:	80 ef       	ldi	r24, 0xF0	; 240&lt;br /&gt;
 166:	0e 94 fc 00 	call	0x1f8&lt;br /&gt;
 16a:	89 2f       	mov	r24, r25&lt;br /&gt;
 16c:	99 27       	eor	r25, r25&lt;br /&gt;
 16e:	88 bb       	out	0x18, r24	; 24&lt;br /&gt;
&lt;br /&gt;
[...]&lt;br /&gt;
000001ec &amp;lt;superFunc&amp;gt;:&lt;br /&gt;
// setze alle Pins von PortD auf Ausgang&lt;br /&gt;
.global superFunc&lt;br /&gt;
.func superFunc&lt;br /&gt;
superFunc:&lt;br /&gt;
   push workreg&lt;br /&gt;
 1ec:	0f 93       	push	r16&lt;br /&gt;
   ldi workreg, ALLOUT&lt;br /&gt;
 1ee:	0f ef       	ldi	r16, 0xFF	; 255&lt;br /&gt;
   out  _SFR_IO_ADDR(DDRD), workreg&lt;br /&gt;
 1f0:	01 bb       	out	0x11, r16	; 17&lt;br /&gt;
   pop workreg&lt;br /&gt;
 1f2:	0f 91       	pop	r16&lt;br /&gt;
   ret&lt;br /&gt;
 1f4:	08 95       	ret&lt;br /&gt;
&lt;br /&gt;
000001f6 &amp;lt;ultraFunc&amp;gt;:&lt;br /&gt;
.endfunc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// setze PORTD auf übergebenen Wert&lt;br /&gt;
.global ultraFunc&lt;br /&gt;
.func ultraFunc&lt;br /&gt;
ultraFunc:&lt;br /&gt;
   out  _SFR_IO_ADDR(PORTD), 24&lt;br /&gt;
 1f6:	82 bb       	out	0x12, r24	; 18&lt;br /&gt;
   ret&lt;br /&gt;
 1f8:	08 95       	ret&lt;br /&gt;
&lt;br /&gt;
000001fa &amp;lt;gigaFunc&amp;gt;:&lt;br /&gt;
.endfunc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Zustand von PINA zurückgeben&lt;br /&gt;
.global gigaFunc&lt;br /&gt;
.func gigaFunc&lt;br /&gt;
gigaFunc:&lt;br /&gt;
   in 24, _SFR_IO_ADDR(PINA)&lt;br /&gt;
 1fa:	89 b3       	in	r24, 0x19	; 25&lt;br /&gt;
   ret&lt;br /&gt;
 1fc:	08 95       	ret&lt;br /&gt;
&lt;br /&gt;
000001fe &amp;lt;addFunc&amp;gt;:&lt;br /&gt;
.endfunc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// zwei Bytes addieren und 16-bit-Wort zurückgeben&lt;br /&gt;
.global addFunc&lt;br /&gt;
.func addFunc&lt;br /&gt;
addFunc:&lt;br /&gt;
   push workreg&lt;br /&gt;
 1fe:	0f 93       	push	r16&lt;br /&gt;
   push workreg2&lt;br /&gt;
 200:	1f 93       	push	r17&lt;br /&gt;
   clr workreg2&lt;br /&gt;
 202:	11 27       	eor	r17, r17&lt;br /&gt;
   mov workreg, 22&lt;br /&gt;
 204:	06 2f       	mov	r16, r22&lt;br /&gt;
   add workreg, 24&lt;br /&gt;
 206:	08 0f       	add	r16, r24&lt;br /&gt;
   adc workreg2, 1    // r1 - assumed to be always zero ...&lt;br /&gt;
 208:	11 1d       	adc	r17, r1&lt;br /&gt;
   movw r24, workreg&lt;br /&gt;
 20a:	c8 01       	movw	r24, r16&lt;br /&gt;
   pop workreg2&lt;br /&gt;
 20c:	1f 91       	pop	r17&lt;br /&gt;
   pop workreg&lt;br /&gt;
 20e:	0f 91       	pop	r16&lt;br /&gt;
   ret&lt;br /&gt;
 210:	08 95       	ret&lt;br /&gt;
&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zuweisung von Registern zu Parameternummer und die Register für die Rückgabewerte sind in den &amp;quot;Register Usage Guidelines&amp;quot; der avr-libc-Dokumentation erläutert.&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* [http://www.nongnu.org/avr-libc/user-manual/assembler.html avr-libc-Dokumentation: Related Pages/avr-libc and assembler programs]&lt;br /&gt;
* [http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_reg_usage avr-libc-Dokumentation: Related Pages/FAQ/&amp;quot;What registers are used by the C compiler?&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
== Globale Variablen für Datenaustausch ==&lt;br /&gt;
&lt;br /&gt;
Oftmals kommt man um globale Variablen nicht herum, z.B. um den Datenaustausch zwischen Hauptprogramm und Interrupt-Routinen zu realisieren. &lt;br /&gt;
Hierzu muss man im Assembler wissen, wo genau die Variable vom C-Compiler abgespeichert wird.&lt;br /&gt;
&lt;br /&gt;
Hierzu muss die Variable, hier &amp;quot;zaehler&amp;quot; genannt, zuerst im C-Code als Global definiert werden, z.B. so:&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;
&lt;br /&gt;
volatile uint8_t zaehler;&lt;br /&gt;
&lt;br /&gt;
int16_t main (void)&lt;br /&gt;
{&lt;br /&gt;
    // irgendein Code, in dem zaehler benutzt werden kann&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im folgenden Assembler-Beispiel wird der Externe Interrupt0  verwendet, um den Zähler hochzuzählen. Es fehlen die Initialisierungen des Interrupts und die Interrupt-Freigabe, so richtig sinnvoll ist der Code auch nicht, aber er zeigt (hoffentlich) wie es geht.&lt;br /&gt;
&lt;br /&gt;
Im Umgang mit Interrupt-Vektoren gilt beim GCC-Assembler das Gleiche, wie bei C: Man muss die exakte Schreibweise beachten, ansonsten wird nicht der Interrupt-Vektor angelegt, sondern eine neue Funktion - und man wundert sich, dass nichts funktionert (vgl. das AVR-GCC-Handbuch).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
#include &amp;quot;avr/io.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
temp = 16&lt;br /&gt;
&lt;br /&gt;
.extern zaehler&lt;br /&gt;
&lt;br /&gt;
.global INT0_vect&lt;br /&gt;
INT0_vect:&lt;br /&gt;
&lt;br /&gt;
     push temp                      //; wichtig: Benutzte Register und das&lt;br /&gt;
     in temp,_SFR_IO_ADDR(SREG)     //; Status-Register (SREG) sichern!&lt;br /&gt;
     push temp&lt;br /&gt;
&lt;br /&gt;
     lds temp,zaehler               //; Wert aus dem Speicher lesen&lt;br /&gt;
     inc temp                       //; bearbeiten&lt;br /&gt;
     sts zaehler,temp               //; und wieder zurückschreiben&lt;br /&gt;
&lt;br /&gt;
     pop temp                       //; die benutzten Register wiederherstellen&lt;br /&gt;
     out _SFR_IO_ADDR(SREG),temp&lt;br /&gt;
     pop temp&lt;br /&gt;
     reti&lt;br /&gt;
&lt;br /&gt;
.end&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Globale Variablen im Assemblerfile anlegen ===&lt;br /&gt;
&lt;br /&gt;
Alternativ können Variablen aber auch im Assemblerfile angelegt werden. Dadurch kann auf eine .c-Datei verzichtet werden. Für das obige Beispiel könnte der Quelltext dann die Dateien zaehl_asm.S und zaehl_asm.h abgelegt werden, so dass nur noch zaehl_asm.S mit kompiliert werden müsste.&lt;br /&gt;
&lt;br /&gt;
Anstatt im Assemblerfile über das Schlüsselwort &#039;&#039;.extern &#039;&#039; auf eine vorhandene Variable zu verweisen, wird dazu mit dem Schlüsselwort &#039;&#039;.comm&#039;&#039; die benötigte Anzahl von Bytes für eine Variable reserviert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;zaehl_asm.S&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
#include &amp;quot;avr/io.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
temp = 16&lt;br /&gt;
&lt;br /&gt;
//; 1 Byte im RAM für den Zähler reservieren&lt;br /&gt;
.comm zaehler, 1&lt;br /&gt;
&lt;br /&gt;
.global INT0_vect&lt;br /&gt;
INT0_vect:&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Headerdatei wird dann auf die Variable nur noch verwiesen (Schlüsselwort &#039;&#039;extern&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;zaehl_asm.h&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#ifndef ZAEHL_ASM_H&lt;br /&gt;
#define ZAEHL_ASM_H&lt;br /&gt;
&lt;br /&gt;
extern volatile uint8_t zaehler;&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zu globalen Variablen in C werden so angelegte Variablen nicht automatisch mit dem Wert 0 initialisiert. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Variablen größer als 1 Byte ===&lt;br /&gt;
&lt;br /&gt;
Variablen, die größer als &#039;&#039;&#039;ein&#039;&#039;&#039; Byte sind, können in Assembler auf ähnliche Art angesprochen werden. Hierzu müssen nur genug Bytes angefordert werden, um die Variable aufzunehmen. Soll z.B. für den Zähler eine Variable vom Typ &#039;&#039;unsigned long&#039;&#039;, also &#039;&#039;uint32_t&#039;&#039; verwendet werden, so müssen 4 Bytes reserviert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
// 4 Byte im RAM für den Zähler reservieren&lt;br /&gt;
.comm zaehler, 4&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die dazugehörige Deklaration im Headerfile wäre dann:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
extern volatile uint32_t zaehler;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Variablen, die größer als ein Byte sind, werden die Werte beginnend mit dem niederwertigsten Byte im RAM abgelegt. Das folgende Codeschnippsel zeigt, wie unter Assembler auf die einzelnen Bytes zugegriffen werden kann. Dazu wird im Interrupt nun ein 32-Bit Zähler erhöht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
#include &amp;quot;avr/io.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
temp = 16&lt;br /&gt;
&lt;br /&gt;
// 4 Byte im RAM für den Zähler reservieren&lt;br /&gt;
.comm zaehler, 4&lt;br /&gt;
&lt;br /&gt;
.global INT0_vect&lt;br /&gt;
INT0_vect:&lt;br /&gt;
&lt;br /&gt;
     push temp                      // wichtig: Benutzte Register und das&lt;br /&gt;
     in temp,_SFR_IO_ADDR(SREG)     // Status-Register (SREG) sichern !&lt;br /&gt;
     push temp&lt;br /&gt;
&lt;br /&gt;
     // 32-Bit-Zähler incrementieren&lt;br /&gt;
     lds temp, (zaehler + 0)        // 0. Byte (niederwertigstes Byte)&lt;br /&gt;
     inc temp&lt;br /&gt;
     sts (zaehler + 0), temp&lt;br /&gt;
     brne RAUS&lt;br /&gt;
	&lt;br /&gt;
     lds temp, (zaehler + 1)        // 1. Byte&lt;br /&gt;
     inc temp&lt;br /&gt;
     sts (zaehler + 1), temp&lt;br /&gt;
     brne RAUS&lt;br /&gt;
&lt;br /&gt;
     lds temp, (zaehler + 2)        // 2. Byte&lt;br /&gt;
     inc temp&lt;br /&gt;
     sts (zaehler + 2), temp&lt;br /&gt;
     brne RAUS&lt;br /&gt;
&lt;br /&gt;
     lds temp, (zaehler + 3)        // 3. Byte (höchstwertigstes Byte)&lt;br /&gt;
     inc temp&lt;br /&gt;
     sts (zaehler + 3), temp&lt;br /&gt;
     brne RAUS&lt;br /&gt;
	&lt;br /&gt;
RAUS:&lt;br /&gt;
     pop temp                       // die benutzten Register wiederherstellen&lt;br /&gt;
     out _SFR_IO_ADDR(SREG),temp&lt;br /&gt;
     pop temp&lt;br /&gt;
     reti&lt;br /&gt;
&lt;br /&gt;
.end&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; 16-Bit / 32-Bit Variablen, Zugriff auf Arrays (Strings)&lt;br /&gt;
&lt;br /&gt;
= Anhang =&lt;br /&gt;
&lt;br /&gt;
== Besonderheiten bei der Anpassung bestehenden Quellcodes ==&lt;br /&gt;
&lt;br /&gt;
Einige Funktionen aus früheren Versionen der avr-libc werden inzwischen als veraltet angesehen. Sie sind nicht mehr vorhanden oder als &#039;&#039;deprecated&#039;&#039; (missbilligt) ausgewiesen und Definitionen in &amp;lt;compat/deprecated.h&amp;gt; verschoben. Es empfiehlt sich, vorhandenen Code zu portieren und die alten Funktionen nicht mehr zu nutzen, auch wenn diese noch zur Verfügung stehen.&lt;br /&gt;
&lt;br /&gt;
=== Veraltete Funktionen zur Deklaration von Interrupt-Routinen ===&lt;br /&gt;
&lt;br /&gt;
Die Funktionen (eigentlich Makros) &#039;&#039;SIGNAL&#039;&#039; und &#039;&#039;INTERRUPT&#039;&#039; zur Deklaration von Interruptroutinen sollten nicht mehr genutzt werden. &lt;br /&gt;
&lt;br /&gt;
In aktuellen Versionen der avr-libc (z.B. avr-libc 1.4.3 aus WinAVR 20060125) werden Interruptroutinen, die &#039;&#039;&#039;nicht&#039;&#039;&#039; durch andere Interrupts &#039;&#039;&#039;unterbrechbar&#039;&#039;&#039; sind, mit ISR deklariert (siehe Abschnitt im Hauptteil). Auch die Benennung wurden vereinheitlicht und an die üblichen Bezeichnungen in den AVR Datenblättern angepasst. In der Dokumentation der avr-libc sind alte und neue Bezeichnungen in der Tabelle gegenübergestellt. Die erforderlichen Schritte zur Portierung:&lt;br /&gt;
&lt;br /&gt;
* #include von avr/signal.h entfernen&lt;br /&gt;
* SIGNAL durch ISR ersetzen&lt;br /&gt;
* Name des Interrupt-Vektors anpassen (SIG_* durch entsprechendes *_vect)&lt;br /&gt;
&lt;br /&gt;
Als Beispiel für die Anpassung zuerst ein &amp;quot;alter&amp;quot; Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/signal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
/* Timer2 Output Compare bei einem ATmega8 */&lt;br /&gt;
SIGNAL(SIG_OUTPUT_COMPARE2)&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Datenblatt wird der Vektor mit TIMER2 COMP bezeichnet. Die Bezeichnung in der avr-libc entspricht dem Namen im Datenblatt, Leerzeichen werden durch Unterstriche (_) ersetzt und ein _vect angehängt. &lt;br /&gt;
&lt;br /&gt;
Der neue Code sieht dann so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt; &lt;br /&gt;
/* signal.h entfällt */&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER2_COMP_vect)&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Unklarheiten bezüglich der neuen Vektorlabels hilft (noch) ein Blick in die Headerdatei des entsprechenden Controllers. Für das vorherige Beispiel also der Blick in die Datei iom8.h für den ATmega8, dort findet man die veraltete Bezeichnung unterhalb der aktuellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
/* $Id: iom8.h,v 1.13 2005/10/30 22:11:23 joerg_wunsch Exp $ */&lt;br /&gt;
/* avr/iom8.h - definitions for ATmega8 */&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
/* Timer/Counter2 Compare Match */&lt;br /&gt;
#define TIMER2_COMP_vect		_VECTOR(3)&lt;br /&gt;
#define SIG_OUTPUT_COMPARE2		_VECTOR(3)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für &#039;&#039;&#039;unterbrechbare&#039;&#039;&#039; Interruptroutinen, die mittels &#039;&#039;INTERRUPT&#039;&#039; deklariert sind, gibt es keinen direkten Ersatz in Form eines Makros. Solche Routinen sind laut Dokumentation der avr-libc in folgender Form zu deklarieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
void XXX_vect(void) __attribute__((interrupt));&lt;br /&gt;
void XXX_vect(void) {&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/* ** alt ** */&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;
//...&lt;br /&gt;
&lt;br /&gt;
INTERRUPT(SIG_OVERFLOW0)&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ** neu: ** */&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//...&lt;br /&gt;
&lt;br /&gt;
void TIMER0_OVF_vect(void) __attribute__((interrupt));&lt;br /&gt;
void TIMER0_OVF_vect(void) &lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will oder kann man den Code nicht portieren, ist zur weiteren Verwendung von &#039;&#039;INTERRUPT&#039;&#039; die Header-Datei &#039;&#039;compat/deprecated.h&#039;&#039; einzubinden. Man sollte bei dieser Gelegenheit jedoch nochmals überprüfen, ob die Funktionalität von &#039;&#039;INTERRUPT&#039;&#039; tatsächlich gewollt ist. In vielen Fällen wurde &#039;&#039;INTERRUPT&#039;&#039; dort genutzt, wo eigentlich &#039;&#039;SIGNAL&#039;&#039; (nunmehr &#039;&#039;ISR&#039;&#039;) hätte genutzt werden sollen.&lt;br /&gt;
&lt;br /&gt;
=== Veraltete Funktionen zum Portzugriff ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;inp&#039;&#039; und &#039;&#039;outp&#039;&#039; zum Einlesen bzw. Schreiben von Registern sind nicht mehr erforderlich, der Compiler unterstützt dies ohne diesen Umweg.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
unsigned char i, j;&lt;br /&gt;
&lt;br /&gt;
// alt:&lt;br /&gt;
  i = inp(PINA);&lt;br /&gt;
  j = 0xff;&lt;br /&gt;
  outp(PORTB, j);&lt;br /&gt;
&lt;br /&gt;
// neu (nicht mehr wirklich neu...):&lt;br /&gt;
  i = PINA&lt;br /&gt;
  j = 0xff;&lt;br /&gt;
  PORTB = j;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will oder kann man den Code nicht portieren, ist zur weiteren Verwendung von inp und outp die Header-Datei &#039;&#039;&#039;compat/deprecated.h&#039;&#039;&#039; einzubinden.&lt;br /&gt;
&lt;br /&gt;
=== Veraltete Funktionen zum Zugriff auf Bits in Registern ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;cbi&#039;&#039; und &#039;&#039;sbi&#039;&#039; zum Löschen und Setzen von Bits sind nicht mehr erforderlich, der Compiler unterstützt dies ohne diesen Umweg. Die Bezeichnung ist ohnehin irreführend da die Funktionen nur für Register mit Adressen im unteren Speicherbereich tatsächlich in die Assembleranweisungen cbi und sbi übersetzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// alt:&lt;br /&gt;
  sbi(PORTB, PB2);&lt;br /&gt;
  cbi(PORTC, PC1);&lt;br /&gt;
&lt;br /&gt;
// neu (auch nicht mehr wirklich neu...):&lt;br /&gt;
  PORTB |=  (1&amp;lt;&amp;lt;PB2);&lt;br /&gt;
  PORTC &amp;amp;= ~(1&amp;lt;&amp;lt;PC1);&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will oder kann man den Code nicht portieren, ist zur weiteren Verwendung von sbi und cbi die Header-Datei &#039;&#039;&#039;compat/deprecated.h&#039;&#039;&#039; einzubinden. Wer unbedingt will, kann sich natürlich eigene Makros mit aussagekräftigeren Namen definieren. Zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define SET_BIT(PORT, BITNUM)    ((PORT) |=  (1&amp;lt;&amp;lt;(BITNUM)))&lt;br /&gt;
#define CLEAR_BIT(PORT, BITNUM)  ((PORT) &amp;amp;= ~(1&amp;lt;&amp;lt;(BITNUM)))&lt;br /&gt;
#define TOGGLE_BIT(PORT, BITNUM) ((PORT) ^=  (1&amp;lt;&amp;lt;(BITNUM)))&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selbstdefinierte (nicht-standardisierte) ganzzahlige Datentypen ===&lt;br /&gt;
&lt;br /&gt;
Bei den im Folgenden genannten Typdefinitionen ist zu beachten, dass die Bezeichnungen für &amp;quot;Worte&amp;quot; teilweise je nach Prozessorplattform unterschiedlich verwendet werden. Die angegebenen Definitionen beziehen sich auf die im Zusammenhang mit AVR/8-bit-Controllern üblichen &amp;quot;Bit-Breiten&amp;quot; (In Erläuterungen zum ARM7TDMI z.B. werden oft 32-bit Integer mit &amp;quot;Wort&amp;quot; ohne weitere Ergänzung bezeichnet). Es empfiehlt sich, bei der Überarbeitung von altem Code die im Abschnitt &#039;&#039;standardisierten ganzzahligen Datentypen&#039;&#039; beschriebenen Datentypen zu nutzen (stdint.h) und damit &amp;quot;Missverständnissen&amp;quot; vorzubeugen, die z.B. bei der Portierung von C-Code zwischen verschiedenen Plattformen auftreten können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
typedef unsigned char      BYTE;       // besser: uint8_t  aus &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
typedef unsigned short     WORD;       // besser: uint16_t aus &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
typedef unsigned long      DWORD;      // besser: uint32_t aus &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
typedef unsigned long long QWORD;      // besser: uint64_t aus &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; BYTE : Der Datentyp BYTE definiert eine Variable mit 8 Bit Breite zur Darstellung von ganzen Zahlen im Bereich zwischen 0 ... 255. &lt;br /&gt;
&lt;br /&gt;
; WORD : Der Datentyp WORD definiert eine Variable mit 16 Bit Breite zur Darstellung von ganzen Zahlen im Bereich zwischen 0 ... 65535. &lt;br /&gt;
&lt;br /&gt;
; DWORD : Der Datentyp DWORD (gesprochen: Double-Word) definiert eine Variable mit 32 Bit Breite zur Darstellung von ganzen Zahlen im Bereich zwischen 0 ... 4294967295.&lt;br /&gt;
&lt;br /&gt;
; QWORD : Der Datentyp QWORD (gesprochen: Quad-Word) definiert eine Variable mit 64 Bit Breite zur Darstellung von ganzen Zahlen im Bereich zwischen 0 ... 18446744073709551615.&lt;br /&gt;
&lt;br /&gt;
== Zusätzliche Funktionen im Makefile ==&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheken (Libraries/.a-Dateien) hinzufügen ===&lt;br /&gt;
&lt;br /&gt;
Um Funktionen aus Bibliotheken (&amp;quot;echte&amp;quot; Libraries, *.a-Dateien) zu nutzen, sind dem Linker die Namen der Bibliotheken als Parameter zu übergeben. Dazu ist die Option -l (kleines L) vorgesehen, an die der Name der Library angehängt wird. &lt;br /&gt;
&lt;br /&gt;
Dabei ist zu beachten, dass der Name der Library und der Dateiname der Library nicht identisch sind. Der hinter -l angegebene Name entspricht dem Dateinamen der Library ohne die Zeichenfolge &#039;&#039;lib&#039;&#039; am Anfang des Dateinamens und ohne die Endung &#039;&#039;.a&#039;&#039;. Sollen z.B. Funktionen aus einer Library mit dem Dateinamen &#039;&#039;libefsl.a&#039;&#039; eingebunden (gelinkt) werden, lautet der entsprechende Parameter -lefsl (vergl. auch -lm zum Anbinden von libm.a). &lt;br /&gt;
&lt;br /&gt;
In Makefiles wird traditonell eine make-Variable LDLIBS genutzt, in die &amp;quot;l-Parameter&amp;quot; abgelegt werden. Die WinAVR-makefile-Vorlage enthält diese Variable zwar nicht, dies stellt jedoch keine Einschränkung dar, da alle in der make-Variable LDFLAGS abgelegten Parameter an den Linker weitergereicht werden. &lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# Einbinden von Funktionen aus einer Library efsl (Dateiname libefsl.a)&lt;br /&gt;
LDFLAGS += -lefsl&lt;br /&gt;
# Einbinden von Funktionen aus einer Library xyz (Dateiname libxyz.a)&lt;br /&gt;
LDFLAGS += -lxyz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Liegen die Library-Dateien nicht im Standard Library-Suchpfad, sind die Pfade mittels Parameter &#039;&#039;-L&#039;&#039; ebenfalls anzugeben. (Der vordefinierte Suchpfad kann mittels &#039;&#039;avr-gcc --print-search-dirs&#039;&#039; angezeigt werden.)&lt;br /&gt;
&lt;br /&gt;
Als Beispiel ein Projekt (&amp;quot;superapp2&amp;quot;), in dem der Quellcode von zwei Libraries (efsl und xyz) und der Quellcode der eigentlichen Anwendung in verschiedenen Verzeichnissen mit der folgenden &amp;quot;Baumstruktur&amp;quot; abgelegt sind:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
superapp2&lt;br /&gt;
|&lt;br /&gt;
+----- efslsource (darin libefsl.a)&lt;br /&gt;
|&lt;br /&gt;
+----- xyzsource (darin libxyz.a)&lt;br /&gt;
|&lt;br /&gt;
+----- firmware (darin Anwendungs-Quellcode und Makefile)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Daraus folgt, dass im Makefile die Verzeichnis efslsource und xyzsource in den Library-Suchpfad aufzunehmen sind:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
LDFLAGS += -L../efslsource/ -L../xyzsource/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Fuse-Bits ===&lt;br /&gt;
&lt;br /&gt;
Zur Berechnung der Fuse-Bits bietet sich neben dem Studium des Datenblattes auch der [http://palmavr.sourceforge.net/cgi-bin/fc.cgi AVR Fuse Calculator] an. Gewarnt werden muss vor der Benutzung von PonyProg, weil dort durch die negierte Darstellung gern Fehler gemacht werden.&lt;br /&gt;
&lt;br /&gt;
Soll die Programmierung von Fuse- und Lockbits automatisiert werden, kann man dies ebenfalls durch Einträge im Makefile vornehmen, die beim Aufruf von &amp;quot;make program&amp;quot; an die genutzte Programmiersoftware übergeben werden. In der makefile-Vorlage von WinAVR (und mfile) gibt es dafuer jedoch keine &amp;quot;Ausfüllhilfe&amp;quot; (Stand 9/2006). Die folgenden Ausführungen gelten für die Programmiersoftware [[AVRDUDE]] (Standard in der WinAVR-Vorlage), können jedoch sinngemäß auf andere Programmiersoftware übertragen werden, die die Angabe der Fuse- und Lockbits-Einstellungen per Kommandozeilenparameter unterstützt (z.B. stk500.exe). Im einfachsten Fall ergänzt man im Makefile einige Variablen, deren Werte natürlich vom verwendeten Controller und den gewünschten Einstellungen abhängen (vgl. Datenblatt Fuse-/Lockbits):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#---------------- Programming Options (avrdude) ----------------&lt;br /&gt;
&lt;br /&gt;
#...&lt;br /&gt;
#Beispiel! f. ATmega16 - nicht einfach uebernehmen! Zahlenwerte anhand&lt;br /&gt;
#--------- des Datenblatts nachvollziehen und gegebenenfalls aendern.&lt;br /&gt;
#&lt;br /&gt;
AVRDUDE_WRITE_LFUSE = -U lfuse:w:0xff:m&lt;br /&gt;
AVRDUDE_WRITE_HFUSE = -U hfuse:w:0xd8:m&lt;br /&gt;
AVRDUDE_WRITE_LOCK  = -U lock:w:0x2f:m&lt;br /&gt;
#...&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit diese Variablen auch genutzt werden, ist der Aufruf von avrdude im Makefile entsprechend zu ergänzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
# Program the device.  &lt;br /&gt;
program: $(TARGET).hex $(TARGET).eep&lt;br /&gt;
# ohne Fuse-/Lock-Einstellungen (nach WinAVR Vorlage Stand 4/2006)&lt;br /&gt;
#	$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) \&lt;br /&gt;
#        $(AVRDUDE_WRITE_EEPROM)&lt;br /&gt;
# mit Fuse-/Lock-Einstellungen&lt;br /&gt;
        $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_LFUSE) \&lt;br /&gt;
        $(AVRDUDE_WRITE_HFUSE) $(AVRDUDE_WRITE_FLASH) \&lt;br /&gt;
        $(AVRDUDE_WRITE_EEPROM) $(AVRDUDE_WRITE_LOCK)&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit besteht darin, die Fuse- und Lockbit-Einstellungen vom Preprozessor/Compiler generieren zu lassen. Die Fuse-Bits werden dann bei Verwendung von AVRDUDE in eigene Hex-Files geschrieben. Hierzu kann man z.B. folgendes Konstrukt verwenden:&lt;br /&gt;
&lt;br /&gt;
In eine der C-Sourcen wird eine Variable je Fuse-Byte vom Typ &#039;&#039;unsigned char&#039;&#039; deklariert und in eine extra Section gepackt. Dies kann entweder in einem vorhandenen File passieren oder in ein neues (z.B. fuses.c) geschrieben werden. Das File muss im Makefile aber auf jeden Fall mit kompiliert und gelinkt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// tiny 2313 fuses low byte&lt;br /&gt;
#define CKDIV8  7&lt;br /&gt;
#define CKOUT   6&lt;br /&gt;
#define SUT1    5&lt;br /&gt;
#define SUT0    4&lt;br /&gt;
#define CKSEL3  3&lt;br /&gt;
#define CKSEL2  2&lt;br /&gt;
#define CKSEL1  1&lt;br /&gt;
#define CKSEL0  0&lt;br /&gt;
&lt;br /&gt;
// tiny2313 fuses high byte&lt;br /&gt;
#define DWEN       7&lt;br /&gt;
#define EESAVE     6&lt;br /&gt;
#define SPIEN      5&lt;br /&gt;
#define WDTON      4&lt;br /&gt;
#define BODLEVEL2  3&lt;br /&gt;
#define BODLEVEL1  2&lt;br /&gt;
#define BODLEVEL0  1&lt;br /&gt;
#define RSTDISBL   0&lt;br /&gt;
&lt;br /&gt;
// tiny2313 fuses extended byte&lt;br /&gt;
#define SELFPRGEN  0&lt;br /&gt;
&lt;br /&gt;
#define LFUSE         __attribute__ ((section (&amp;quot;lfuses&amp;quot;)))&lt;br /&gt;
#define HFUSE         __attribute__ ((section (&amp;quot;hfuses&amp;quot;)))&lt;br /&gt;
#define EFUSE         __attribute__ ((section (&amp;quot;efuses&amp;quot;)))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// select ext crystal 3-8Mhz&lt;br /&gt;
unsigned char lfuse LFUSE =&lt;br /&gt;
    ( (1&amp;lt;&amp;lt;CKDIV8) | (1&amp;lt;&amp;lt;CKOUT) | (1&amp;lt;&amp;lt;CKSEL3) | (1&amp;lt;&amp;lt;CKSEL2) | &lt;br /&gt;
      (0&amp;lt;&amp;lt;CKSEL1) | (1&amp;lt;&amp;lt;CKSEL0) | (0&amp;lt;&amp;lt;SUT1) | (1&amp;lt;&amp;lt;SUT0) );&lt;br /&gt;
unsigned char hfuse HFUSE =&lt;br /&gt;
    ( (1&amp;lt;&amp;lt;DWEN) | (1&amp;lt;&amp;lt;EESAVE) | (0&amp;lt;&amp;lt;SPIEN) | (1&amp;lt;&amp;lt;WDTON) | &lt;br /&gt;
      (1&amp;lt;&amp;lt;BODLEVEL2) | (1&amp;lt;&amp;lt;BODLEVEL1) | (0&amp;lt;&amp;lt;BODLEVEL0) | (1&amp;lt;&amp;lt;RSTDISBL) );&lt;br /&gt;
unsigned char efuse EFUSE =&lt;br /&gt;
    ((0&amp;lt;&amp;lt;SELFPRGEN));&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG: Die Bitpositionen wurden nicht vollständig getestet!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Eine &amp;quot;1&amp;quot; bedeutet hier, dass das Fuse-Bit &#039;&#039;nicht&#039;&#039; programmiert wird - die Funktion also i.A. nicht aktiviert ist. Eine &amp;quot;0&amp;quot; hingegen aktiviert die meisten Funktionen. Dies ist wie im Datenblatt (1 = unprogrammed, 0 = programmed).&lt;br /&gt;
&lt;br /&gt;
Das Makefile muss nun noch um folgende Targets erweitert werden (mit Tabulator einrücken - nicht mit Leerzeichen):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
lfuses: build&lt;br /&gt;
        -$(OBJCOPY) -j lfuses --change-section-address lfuses=0 \&lt;br /&gt;
          -O ihex $(TARGET).elf $(TARGET)-lfuse.hex&lt;br /&gt;
        @if [ -f $(TARGET)-lfuse.hex ]; then \&lt;br /&gt;
         $(AVRDUDE) $(AVRDUDE_FLAGS) -U lfuse:w:$(TARGET)-lfuse.hex; \&lt;br /&gt;
        fi;&lt;br /&gt;
&lt;br /&gt;
hfuses: build&lt;br /&gt;
        -$(OBJCOPY) -j hfuses --change-section-address hfuses=0 \&lt;br /&gt;
          -O ihex $(TARGET).elf $(TARGET)-hfuse.hex&lt;br /&gt;
        @if [ -f $(TARGET)-hfuse.hex ]; then \&lt;br /&gt;
         $(AVRDUDE) $(AVRDUDE_FLAGS) -U hfuse:w:$(TARGET)-hfuse.hex; \&lt;br /&gt;
        fi;&lt;br /&gt;
&lt;br /&gt;
efuses: build&lt;br /&gt;
        -$(OBJCOPY) -j efuses --change-section-address efuses=0 \&lt;br /&gt;
         -O ihex $(TARGET).elf $(TARGET)-efuse.hex&lt;br /&gt;
        @if [ -f $(TARGET)-efuse.hex ]; then \&lt;br /&gt;
         $(AVRDUDE) $(AVRDUDE_FLAGS) -U efuse:w:$(TARGET)-efuse.hex;&lt;br /&gt;
        fi;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Target &amp;quot;clean&amp;quot; muss noch um die Zeilen&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
        $(REMOVE) $(TARGET)-lfuse.hex&lt;br /&gt;
        $(REMOVE) $(TARGET)-hfuse.hex&lt;br /&gt;
        $(REMOVE) $(TARGET)-efuse.hex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
erweitert werden, wenn auch die Fuse-Dateien gelöscht werden sollen.&lt;br /&gt;
&lt;br /&gt;
Um nun die Fusebits des angeschlossenen Controllers zu programmieren muss lediglichein &amp;quot;make lfuses&amp;quot;, &amp;quot;make hfuses&amp;quot; oder &amp;quot;make efuses&amp;quot; gestartet werden.&lt;br /&gt;
Bei den Fuse-Bits ist besondere Vorsicht geboten, da diese das Programmieren des Controllers unmöglich machen können. Also erst programmieren, wenn man einen HV-Programmierer hat oder ein paar Reserve-AVRs zur Hand ;-)&lt;br /&gt;
&lt;br /&gt;
Um weiterhin den &amp;quot;normalen&amp;quot; Flash beschreiben zu können, ist es wichtig, für das Target &amp;quot;*.hex&amp;quot; im Makefile nicht nur &amp;quot;-R .eeprom&amp;quot; als Parameter zu übergeben sondern zusätzlich noch &amp;quot;-R lfuses -R efuses -R hfuses&amp;quot;. Sonst bekommt AVRDUDE Probleme diese Sections in den Flash (wo sie ja nicht hingehören) zu schreiben.&lt;br /&gt;
&lt;br /&gt;
Siehe auch: [[AVR_Fuses#Vergleich_der_Fuses_bei_verschiedenen_Programmen|Vergleich der Fuses bei verschiedenen Programmen]]&lt;br /&gt;
&lt;br /&gt;
== Externe Referenzspannung des internen Analog-Digital-Wandlers ==&lt;br /&gt;
&lt;br /&gt;
Die minimale (externe) Referenzspannung des ADC darf nicht beliebig niedrig sein, vgl. dazu das (aktuellste) Datenblatt des verwendeten Controllers. z.B. beim ATMEGA8 darf sie laut Datenblatt (S.245, Tabelle 103, Zeile &amp;quot;VREF&amp;quot;) 2,0V nicht unterschreiten. HINWEIS: diese Information findet sich erst in der letzten Revision (Rev. 2486O-10/04) des Datenblatts.&lt;br /&gt;
&lt;br /&gt;
Meiner &amp;lt;!-- Wer? - es gibt inzwischen x Leute die mehr oder weniger viel in diesem Artikel geschrieben haben --&amp;gt; eigenen Erfahrung nach kann man aber (auf eigene Gefahr und natürlich nicht für Seriengeräte) durchaus noch ein klein wenig weiter heruntergehen, bei dem von mir unter die Lupe genommenen ATMEGA8L (also die Low-Voltage-Variante) funktioniert der ADC bei 5V Betriebsspannung mit bis zu VREF=1,15V hinunter korrekt, ab 1,1V und darunter digitalisiert er jedoch nur noch Blödsinn). Ich würde sicherheitshalber nicht unter 1,5V gehen und bei niedrigeren Betriebsspannungen mag sich die Untergrenze für VREF am Pin AREF ggf. nach oben&#039;&#039;&#039;(!)&#039;&#039;&#039; verschieben.&lt;br /&gt;
&lt;br /&gt;
In der letzten Revision des Datenblatts ist außerdem korrigiert, dass ADC4 und ADC5 sehr wohl 10 Bit Genauigkeit bieten (und nicht bloß 8 Bit, wie in älteren Revisionen irrtümlich angegeben.)&lt;br /&gt;
&lt;br /&gt;
= Siehe auch =&lt;br /&gt;
&lt;br /&gt;
Um diese riesige Seite etwas überschaubarer zu gestalten, wurden einige Kapitel ausgelagert, die nicht unmittelbar mit den Grundlagen von avr-gcc in Verbindung stehen. All diese Seiten gehören zur [[:Kategorie:avr-gcc Tutorial]].&lt;br /&gt;
* &amp;amp;rarr; [[AVR-GCC-Tutorial/Der UART|Der UART]]&lt;br /&gt;
* &amp;amp;rarr; [[AVR-GCC-Tutorial/Der Watchdog|Der Watchdog]]&lt;br /&gt;
* &amp;amp;rarr; [[AVR-GCC-Tutorial/Die Timer und Zähler des AVR|Die Timer und Zähler des AVR]]&lt;br /&gt;
* &amp;amp;rarr; [[AVR-GCC-Tutorial/Exkurs Makefiles|Exkurs Makefiles]]&lt;br /&gt;
* &amp;amp;rarr; [[AVR-GCC-Tutorial/LCD-Ansteuerung|LCD-Ansteuerung]]&lt;br /&gt;
&lt;br /&gt;
= TODO =&lt;br /&gt;
* Aktualisierung Register- und Bitbeschreibungen an aktuelle AVR&lt;br /&gt;
* stdio.h, malloc() &lt;br /&gt;
* &amp;quot;naked&amp;quot;-Funktionen&lt;br /&gt;
* Bootloader (bez. auf boot.h)&lt;br /&gt;
* Übersicht zu den C bzw. GCC-predefined Makros (__DATE__, __TIME__,...)&lt;br /&gt;
&lt;br /&gt;
= Softwareentwicklung =&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Wild drauflos&amp;quot; zu programmieren kann nach einiger Zeit frustrieren, da mehr Zeit erforderlich wird, das Programm neuen Anforderungen anzupassen.&lt;br /&gt;
Wer erst etwas Zeit darauf verwendet, ein offenes Konzept (erweiterbare Prodrammstruktur, Algorithmen) zu entwickeln (ggf. in Ruhe mit Papier und Bleistift), wird später schneller ans Ziel gelangen.&lt;br /&gt;
&lt;br /&gt;
http://de.wikipedia.org/wiki/Softwareentwicklung&lt;br /&gt;
&lt;br /&gt;
= Programmierstil =&lt;br /&gt;
&lt;br /&gt;
Damit ein größeres Programm (nach längerer Zeit) überschaubar bleibt, sollte man sich bei der Gliederung, Namensgebung, Formatierung und Kommentierung an bewährten, begründeten Konzepten orientieren.&lt;br /&gt;
* http://www.avrfreaks.net/index.php?name=PNphpBB2&amp;amp;file=viewtopic&amp;amp;t=48535&amp;amp;postdays=0&amp;amp;postorder=asc&amp;amp;sid=9098c3a3c0cdfcdafbd8187255136d26 Modularizing C Code: Managing large projects &lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/articles/Include-Files_(C)&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/topic/130218&lt;br /&gt;
&lt;br /&gt;
* http://www.elektroniknet.de/home/embeddedsystems/fachwissen/uebersicht/software/entwicklungssoftware/der-programmierstandard-misra/&lt;br /&gt;
&lt;br /&gt;
* http://www.mikrocontroller.net/topic/132304&lt;br /&gt;
&lt;br /&gt;
* http://de.wikipedia.org/wiki/Programmierstil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:avr-gcc Tutorial| ]]&lt;br /&gt;
[[Kategorie:AVR]]&lt;/div&gt;</summary>
		<author><name>129.247.247.240</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Digitalfilter_mit_ATmega&amp;diff=36209</id>
		<title>Digitalfilter mit ATmega</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Digitalfilter_mit_ATmega&amp;diff=36209"/>
		<updated>2009-05-20T09:26:19Z</updated>

		<summary type="html">&lt;p&gt;129.247.247.240: /* Literatur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auch mit 8-Bit-Mikrocontrollern der ATmega-Reihe ist es möglich, einfache digitale Signalverarbeitungen auszuführen. Mittels kostenloser Mathematiksoftware ist die Berechnung eigener Filter möglich.&lt;br /&gt;
&lt;br /&gt;
Viele von uns haben schon analoge Filterschaltungen aufgebaut, als passive LC-Filter oder aktive Filter mit Operationsverstärkern. Dank kostenloser Berechnungssoftware, wie z.B. [http://www.aade.com AADE], ist die Auswahl der Schaltung und Berechnung der Bauteilwerte kein Problem mehr. Die gleichen Filter in digitaler Technik zu erstellen gilt dagegen immer noch als kompliziert, obwohl sie in professionellen Schaltungen die Analogtechnik weitgehend verdrängt haben. Ihr großer Vorteil ist der fehlende Abgleich. Dank Quarzoszillator wird ein einmal berechneter Frequenzgang ohne Präzisionsbauteile reproduzierbar eingehalten.&lt;br /&gt;
 &lt;br /&gt;
Die Software ist im Grunde sehr einfach aufgebaut, besteht nur aus Schiebeoperationen, Additionen und einigen Multiplikationen. Die ATmega-Controller enthalten alle dazu nötigen Funktionen, einen A/D-Wandler, einen 8-Bit Multiplizierer und mehrere D/A-Wandler durch Pulsbreitenmodulation. Am Ausgang muß nur noch ein einfacher Tiefpaß die PWM-Frequenz wegfiltern. Die Programmbeispiele wurden auf Grundlage der [http://www.atmel.com/dyn/resources/prod_documents/doc2527.pdf Applikationsschrift AVR223] mit [http://atmel.com/avrstudio AVRStudio] entwickelt.&lt;br /&gt;
&lt;br /&gt;
Am Ende der Programme befindet sich eine Koeffiziententabelle, deren Werte die Filtereigenschaften bestimmen. Um eigene Filter entwickeln zu können sollen dazu die Grundbegriffe sehr kurz erläutert und dann einfache „Kochrezepte“ vorgestellt werden.&lt;br /&gt;
&lt;br /&gt;
===Ein IIR-Filter 6.Ordnung===&lt;br /&gt;
Als erstes wird ein Filter berechnet, das nur durch Änderung der Koeffizienten als Tiefpaß, Hochpaß, Bandpaß oder Bandsperre wirkt. Im Beispielprogramm soll es ein 1750 Hz Sperrfilter werden, das laute Ruftöne beim Zuhören auf Amateur-Relaisfunkstellen unterdrücken kann.&lt;br /&gt;
Dieser Filtertyp heißt „IIR“, &#039;&#039;infinite impulse response&#039;&#039;, weil er nach Anregung mit einem Impuls und schlecht gewählten Einstellungen zum Oszillator wird. Der verwendete Aufbau aus drei hintereinandergeschalteten Teilfiltern zweiter Ordnung ist als gutmütig bekannt. Diese &#039;&#039;kaskadierten&#039;&#039; Teilfilter nennt man „SOS“ &#039;&#039;second order sections&#039;&#039; oder auch &#039;&#039;biquad sections&#039;&#039;. Der Aufbau mit einem einzigen Filter 6. Ordnung, wie er in der AVR223 von 2001 noch beschrieben ist, schwingt dagegen sehr zuverlässig.&lt;br /&gt;
&lt;br /&gt;
===Software zur Koeffizientenberechnung===&lt;br /&gt;
Es gibt einige spezialisierte Programme, die aber nur eine kleine Anzahl von Digitalfilterkonfigurationen kennen, z.B. [http://www.nuhertz.com/filter/ FilterFree]. Wesentlich universeller sind umfangreiche Programmpakete für numerische Mathematik.&lt;br /&gt;
Neben dem kommerziellen[http://www.mathworks.de Matlab] das auch in einer eingeschränkten Studentenversion angeboten wird, und zu dem zahlreiche Literatur existiert, z.B. ISBN 9783486584271 , gibt es auch zwei kostenlose Nachahmer: [http://www.octave.org Octave] und [http://www.scilab.org Scilab]. Spezialitäten der digitalen Signalverarbeitung bilden nur einen kleinen Teil des Gesamtpakets, und die Hilfetexte dazu sind sehr knapp oder auch mal ein Jahrzehnt alt. Zum Glück sind beide Programme dem Vorbild so nahe, daß man vieles der Literatur zu Matlab entnehmen kann.&lt;br /&gt;
Die eigentliche Koeffizientenberechnung besteht meistens aus nur wenigen Textzeilen. Man gibt wie beim analogen Filter die gewünschten Durchlaß- und Sperrfrequenzen, die Filtercharakteristik und Ordnung ein. Auf eine grafische Benutzeroberfläche muß man allerdings verzichten. Immerhin können der Frequenzgang und andere Kurven grafisch ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
===Transformationen und komplexe Zahlen===&lt;br /&gt;
Die mathematischen Grundbegriffe der Digitalfilterberechnung sollen hier nur stichwortartig erwähnt werden:&lt;br /&gt;
&lt;br /&gt;
Von der &#039;&#039;Fourier-Transformation&#039;&#039; hat man schon mal gehört, ihre Bedeutung ist noch einigermaßen begreifbar. Von einem periodischen Signal x(t) wie es das Oszilloskop zeigt, also im &#039;&#039;Zeitbereich&#039;&#039;, gelangt man über sie zur spektralen Darstellung x(f) im &#039;&#039;Frequenzbereich&#039;&#039; auf dem Spektrumanalysator. &lt;br /&gt;
Das ist aber nur die halbe Information, eigentlich gehört zu jeder Harmonischen außer der angezeigten Amplitude auch noch ihre Phasenlage. &lt;br /&gt;
x(f) ist also eine zweidimensionale Variable, Amplitude (Betrag) und Phase (Winkel) sind polare Koordinaten. Wenn wir zu kartesischen Koordinaten übergehen, und die x- Achse als &#039;&#039;reelle&#039;&#039;, die y-Achse als &#039;&#039;imaginäre&#039;&#039; Achse bezeichnen, kommen wir zur komplexen Zahlendarstellung.&lt;br /&gt;
Für die Berechnung analoger Filter ist die &#039;&#039;Laplace-Transformation&#039;&#039; zuständig, für digitale Filter die nahe verwandte &#039;&#039;z-Transformation&#039;&#039;. Im ersten Fall wird x(t) in ein X(s) transformiert, in unserem Fall, wie der Name schon sagt in ein X(z). Zur besseren Unterscheidung wird das X groß geschrieben. Auch hier rechnen wir mit komplexen Zahlen, wir befinden uns nach der Transformation in der komplexen &#039;&#039;z-Ebene&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Übertragungsfunktion und Koeffizienten===&lt;br /&gt;
Das Digitalfilter ist für uns zunächst ein schwarzer Kasten, in den ein Signal x(t) hineinläuft und als gefiltertes Signal y(t) wieder herauskommt. Die z-transformierten Signale heißen X(z) und Y(z). Der Quotient Y(z)/X(z) = H(z) wird &#039;&#039;Übertragungsfunktion&#039;&#039;, engl. &#039;&#039;transfer function&#039;&#039; genannt. Für bestimmte Werte von z wird der Zähler oder Nenner der Übertragungsfunktion Null, diese heißen &#039;&#039;Nullstellen&#039;&#039; und &#039;&#039;Pole&#039;&#039; der Funktion. Diese Werte der komplexen Zahl z können im &#039;&#039;Pol/Nullstellendiagramm&#039;&#039; als Punkte in der z-Ebene dargestellt werden, das hilft beispielsweise bei der Untersuchung der &#039;&#039;Stabilität&#039;&#039; des Filters gegen Schwingneigung.&lt;br /&gt;
&lt;br /&gt;
Die genannten Mathematikprogramme berechnen uns aus den gewünschten Filterdaten die Übertragungsfunktion. Im einfachsten Fall können wir daraus die Zahlenwerte direkt in die Filtersoftware als Koeffiziententabelle eintragen. Die Aufteilung in Teilfilter macht die Berechnung etwas umständlicher. Die einzelnen Übertragungsfunktionen werden multipliziert, also Y(z)/X(z) = H&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;(z)*H&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;(z)*H&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;(z). Wir müssen also H(z) in geeignete Faktoren zerlegen, auch dabei hilft uns die Mathematiksoftware.&lt;br /&gt;
&lt;br /&gt;
===Octave und Scilab===&lt;br /&gt;
Am besten installieren wir gleich beide Softwarepakete. Beide bieten unterschiedliche Lösungswege zur Berechnung der gewünschten SOS-Teilfilter.&lt;br /&gt;
In Scilab werden Frequenzen als Bruchteile der Abtastfrequenz, engl. &#039;&#039;sample rate&#039;&#039; des Analog-Digitalwandlers angegeben. Der AD-Wandler im ATmega wird hier mit einer Taktfrequenz von 1/64 des Quarzoszillators betrieben und braucht pro Wandlung 13 Takte. Mit einem 15 MHz – Quarz ergibt sich also ein Abtastfrequenz von 15MHz/(64*13) = 18029 Hz. Octave rechnet mit Bruchteilen der halben Abtastfrequenz, auch &#039;&#039;Nyquist-Frequenz&#039;&#039; genannt.&lt;br /&gt;
Die Filterordnung bezieht sich in beiden Programmen auf Tief- und Hochpassfilter. Für Bandpässe und -sperren muß die Hälfte angegeben werden, hier also 3 statt 6.&lt;br /&gt;
&lt;br /&gt;
Beginnen wir mit Scilab. Das kurze Programm in Bild 1 speichern wir als Textdatei z.B. unter „Sperrfilter1750Hz.sci“ ab, dann lädt es durch Anklicken direkt in den bunten Scilab-Editor und wird mit „Ausführen – in Scilab laden“ gestartet. Ein neues Fenster mit der Frequenzgangkurve Bild 2 öffnet sich und im Scilab-Hauptfenster stehen die Übertragungsfunktionen der drei Teilfilter, sowie die Gesamtverstärkung gain. Die Filterordnung kann nicht direkt vorgegeben werden, wir müssen die vier Grenzfrequenzen und die beiden Dämpfungswerte variieren bis genau drei SOS-Teilfilter herauskommen.&lt;br /&gt;
In Octave werden nur zwei Grenzfrequenzen verlangt, dafür können wir die Filterordnung vorgeben. Wieder wird eine Textdatei ausgeführt und liefert Übertragungsfunktionen für drei Teilfilter.&lt;br /&gt;
&lt;br /&gt;
Einen Schönheitsfehler haben die berechneten Funktionen noch. In der Regelungstechnik und auch in Scilab/Octave wird mit positiven Exponenten von z gerechnet, die Literatur zur digitalen Signalverarbeitung benutzt dagegen negative. Wenn wir aber Zähler und Nenner jeder Teil-Übertragungsfunktion durch z&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; teilen, ändert sie sich nicht und wir haben die Formel wie sie für digitale Filter üblich ist.&lt;br /&gt;
&lt;br /&gt;
Jetzt könne wir die Koeffizienten direkt aus den Übertragungsfunktionen ablesen. Wir müssen sie noch &#039;&#039;skalieren&#039;&#039;, also mit einer geeigneten Zweierpotenz multiplizieren und zu einer ganzen Zahl auf/abrunden. Sie sollen hier zu einer 16 Bit-Zahl (Festkommadarstellung mit Vorzeichenbit) werden, also alle Koeffizienten im Bereich -32768...+32767 liegen.&lt;br /&gt;
&lt;br /&gt;
===Frequenzgang maßgeschneidert===&lt;br /&gt;
Mit der Funktion &#039;&#039;&#039;yulewalk&#039;&#039;&#039; können wir auch kompliziertere Frequenzgangkurven erreichen. In Octave fehlt sie, drei ähnlich lautende Funktionen haben nichts mit Filtern zu tun. Die gewünschte Funktion wird mit Geradenstücken zwischen beliebigen Kurvenpunkten vorgegeben. Als Beispiel nehmen wir einen Bandpass für SSTV &#039;&#039;slow scan television&#039;&#039;, der 1974 in der &amp;quot;CQ-DL&amp;quot; vorgestellt wurde. Synchronimpuls (1200 Hz) und Bildinformation (1500-2300 Hz) sollen durchgelassen, Störungen außerhalb dieser Bereiche unterdrückt werden.&lt;br /&gt;
Nach längerem Ausprobieren verschiedener Vorgabewerte und Reduktion der Abtastfrequenz auf die Hälfte ergibt sich eine gute Übereinstimmung mit dem Frequenzgang des Originals. Jetzt haben wir eine Übertragungsfunktion 6.Ordnung, die wieder in SOS-Teilfilter zerlegt werden muß. Diese Funktion &#039;&#039;&#039;tf2sos&#039;&#039;&#039; &#039;&#039;transfer function to second order sections&#039;&#039; fehlt in Scilab, deshalb übertragen wir die Zahlen aus Scilab nach  Octave und erhalten so schließlich unsere Koeffizienten.&lt;br /&gt;
&lt;br /&gt;
===Scilab-Berechnung mit eqiir===&lt;br /&gt;
Bild 1:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// Stopband-Filter für 1750 Hz, Samplerate =18029Hz&lt;br /&gt;
// Eckfrequenzen 1400Hz, 1700Hz, 1800 Hz, 2100Hz:&lt;br /&gt;
omega=[2*%pi*(1400/18029),2*%pi*(1700/18029),2*%pi*(1800/18029),2*%pi*(2100/18029)];&lt;br /&gt;
// Maximale Durchgangswelligkeit 0,5 dB&lt;br /&gt;
deltapass = (1-10**(-0.5/20)) ;&lt;br /&gt;
// minimale Sperrband-Dämpfung 50 dB&lt;br /&gt;
deltastop = 10**(-50/20);&lt;br /&gt;
// IIR-Filter berechnen, &amp;quot;stopband&amp;quot;, &amp;quot;elliptic&amp;quot;:&lt;br /&gt;
[sos,gain,zeroes,poles] = eqiir(&#039;sb&#039;,&#039;el&#039;,omega,deltapass,deltastop);&lt;br /&gt;
// Second order sections anzeigen:&lt;br /&gt;
sos&lt;br /&gt;
gain&lt;br /&gt;
//Frequenzgang berechnen und plotten:&lt;br /&gt;
zaehlerprodukt = prod(sos(2));&lt;br /&gt;
nennerprodukt = prod(sos(3));&lt;br /&gt;
frequenzgang = gain*abs(freq(zaehlerprodukt,nennerprodukt,exp(%i*(0:0.01:%pi))));&lt;br /&gt;
// frequenzgang = gain*abs(freq(zaehlerprodukt,nennerprodukt,exp(%i*(0:0.01:%pi))));&lt;br /&gt;
n = prod(size(frequenzgang));&lt;br /&gt;
//plot(20*log(frequenzgang(2:n))/log(10),(n*18029/(200*%pi)));&lt;br /&gt;
plot(20*log(frequenzgang (2:n))/log(10))&lt;br /&gt;
&lt;br /&gt;
(Ergebnis:)&lt;br /&gt;
                            2                             2                           2&lt;br /&gt;
          1 - 1.6219938z + z            1 - 1.6396794z + z           1 - 1.656616z + z&lt;br /&gt;
sos = --------------------------  *  ------------------------  *  -------------------------&lt;br /&gt;
                                2                             2                            2&lt;br /&gt;
      0.9383702 - 1.5100165z + z     0.8466245 - 1.513936z + z    0.9485511 - 1.663563z + z&lt;br /&gt;
&lt;br /&gt;
gain = 0.8683583&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
===Yulewalk===&lt;br /&gt;
[[Bild:Yulewalk.png|Massgeschneiderter Frequenzgang mit yulewalk|640px]]&lt;br /&gt;
&lt;br /&gt;
===Quelltext des ATmega48-Programms===&lt;br /&gt;
basierend auf AVR223, zerlegt in 3 SOS-Teilfilter, mit Überlaufbegrenzung &lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
;***************************************************************************&lt;br /&gt;
;* Digital filter with ATmega48P   6th-order IIR, AVR223 application note  *&lt;br /&gt;
;* 15 MHz xtal, input ADC0, PWM-output OCR1a/b, test output PD0            *&lt;br /&gt;
;* Christoph Kessler 2008                         db1uq_at_t-online_dot_de *&lt;br /&gt;
;***************************************************************************&lt;br /&gt;
.nolist&lt;br /&gt;
.include &amp;quot;m48pdef.inc&amp;quot;&lt;br /&gt;
.list&lt;br /&gt;
;***************************************************************************&lt;br /&gt;
;* register 0-15 (no &amp;quot;immediate&amp;quot;-operations possible):&lt;br /&gt;
;***************************************************************************&lt;br /&gt;
.def	MltLo	= r0	; multiplier result&lt;br /&gt;
.def	MltHi	= r1	; multiplier result&lt;br /&gt;
.def	Zero	= r2	; Zero register (used to add carry flag)&lt;br /&gt;
.def	SavSrg	= r3	; save status register during interrupt routine&lt;br /&gt;
.def	reg04	= r4	; free&lt;br /&gt;
.def	reg05	= r5	; free&lt;br /&gt;
.def	reg06	= r6	; free&lt;br /&gt;
.def	reg07	= r7	; free&lt;br /&gt;
.def	reg08	= r8	; free&lt;br /&gt;
.def	reg09	= r9	; free&lt;br /&gt;
.def	reg10	= r10	; free&lt;br /&gt;
.def	reg11	= r11	; free&lt;br /&gt;
.def	reg12	= r12	; free&lt;br /&gt;
.def	accu0	= r13	; Accumulator - 32bit for Interrupt routine&lt;br /&gt;
.def	accu1	= r14	; Accumulator - 32bit for Interrupt routine&lt;br /&gt;
.def	accu2	= r15	; Accumulator - 32bit for Interrupt routine&lt;br /&gt;
;***************************************************************************&lt;br /&gt;
;* register 16-23 (&amp;quot;immediate&amp;quot;-operations possible):&lt;br /&gt;
;***************************************************************************&lt;br /&gt;
.def	accu3	= r16	; Accumulator - 32bit for Interrupt routine&lt;br /&gt;
.def	reg17	= r17	; free&lt;br /&gt;
.def	reg18	= r18	; free&lt;br /&gt;
.def	reg19	= r19	; free&lt;br /&gt;
.def	datal	= r20	; Data samples mul register&lt;br /&gt;
.def	datah	= r21	;  for Interrupt routine&lt;br /&gt;
.def	coefl	= r22	; Filter coefficient mul register&lt;br /&gt;
.def	coefh	= r23	;  for Interrupt routine&lt;br /&gt;
;***************************************************************************&lt;br /&gt;
;* register 24-31    (16Bit-registers) &lt;br /&gt;
;***************************************************************************&lt;br /&gt;
.def	Tmp1	= r24	; general temporary register&lt;br /&gt;
.def	Tmp2	= r25	; general temporary register&lt;br /&gt;
;	XL	= r26	; free&lt;br /&gt;
;	XH	= r27	; free&lt;br /&gt;
;	YL	= r28	; used by Interrupt routine&lt;br /&gt;
;	YH	= r29	; used by Interrupt routine&lt;br /&gt;
;	ZL	= r30	; init routine only, free for main program&lt;br /&gt;
;	ZH	= r31	; init routine only, free for main program&lt;br /&gt;
;*************************************************************************&lt;br /&gt;
;* constants :&lt;br /&gt;
;*************************************************************************&lt;br /&gt;
; 1st SOS filter&lt;br /&gt;
.equ 	x11	= 0&lt;br /&gt;
.equ 	x21	= 2&lt;br /&gt;
.equ 	y11	= 4&lt;br /&gt;
.equ 	y21	= 6&lt;br /&gt;
; 2nd SOS filter&lt;br /&gt;
.equ 	x12	= 8&lt;br /&gt;
.equ 	x22	= 10&lt;br /&gt;
.equ 	y12	= 12&lt;br /&gt;
.equ 	y22	= 14&lt;br /&gt;
; 3rd SOS filter&lt;br /&gt;
.equ 	x13	= 16&lt;br /&gt;
.equ 	x23	= 18&lt;br /&gt;
.equ 	y13	= 20&lt;br /&gt;
.equ 	y23	= 22&lt;br /&gt;
; 1st SOS filter&lt;br /&gt;
.equ 	b01	= 24&lt;br /&gt;
.equ 	b11	= 26&lt;br /&gt;
.equ 	b21	= 28&lt;br /&gt;
.equ 	a11	= 30&lt;br /&gt;
.equ 	a21	= 32&lt;br /&gt;
; 2nd SOS filter&lt;br /&gt;
.equ 	b02	= 34&lt;br /&gt;
.equ 	b12	= 36&lt;br /&gt;
.equ 	b22	= 38&lt;br /&gt;
.equ 	a12	= 40&lt;br /&gt;
.equ 	a22	= 42&lt;br /&gt;
; 3rd SOS filter&lt;br /&gt;
.equ 	b03	= 44&lt;br /&gt;
.equ 	b13	= 46&lt;br /&gt;
.equ 	b23	= 48&lt;br /&gt;
.equ 	a13	= 50&lt;br /&gt;
.equ 	a23	= 52&lt;br /&gt;
;*****************************************************&lt;br /&gt;
;* Macros&lt;br /&gt;
;*****************************************************&lt;br /&gt;
.MACRO load_node&lt;br /&gt;
	ldd	datal,Y+@0	; Load low byte of node &lt;br /&gt;
	ldd	datah,Y+@0+1	; Load high byte of node&lt;br /&gt;
.ENDMACRO&lt;br /&gt;
.MACRO update_node&lt;br /&gt;
	std	Y+@0,datal	; Update low byte of node to prepare next filter run&lt;br /&gt;
	std	Y+@0+1,datah	; Update high byte of node to prepare next filter run&lt;br /&gt;
.ENDMACRO&lt;br /&gt;
.MACRO load_coef&lt;br /&gt;
	ldd	coefl,Y+@0	; Load low byte of node &lt;br /&gt;
	ldd	coefh,Y+@0+1	; Load high byte of node&lt;br /&gt;
.ENDMACRO&lt;br /&gt;
.MACRO mul_move_32&lt;br /&gt;
	muls	coefh,datah	; Signed multiply, coefficient high byte and data high byte&lt;br /&gt;
	mov     accu2,MltLo	; Copy result word into accumulator byte 2:3&lt;br /&gt;
	mov     accu3,MltHi	; Copy result word into accumulator byte 2:3&lt;br /&gt;
	mul	coefl,datal	; Unsigned multiply, coefficient low byte and data low byte&lt;br /&gt;
	mov	accu0,MltLo	; Copy result word into accumulator byte 2:3&lt;br /&gt;
	mov	accu1,MltHi	; Copy result word into accumulator byte 2:3&lt;br /&gt;
	mulsu	coefh,datal	; Signed-unsigned multiply, coefficient high byte and data low byte&lt;br /&gt;
	sbc	accu3,Zero	; Sign extention&lt;br /&gt;
	add	accu1,MltLo	; Add low byte of result to accumulator byte 1&lt;br /&gt;
	adc	accu2,MltHi	; Add with carry high byte of result to accumulator byte 2&lt;br /&gt;
	adc	accu3,Zero	; Add carry to accumulator byte 3&lt;br /&gt;
	mulsu	datah,coefl	; Signed-unsigned multiply, data high byte and coefficient low byte&lt;br /&gt;
	sbc	accu3,Zero	; Sign extention&lt;br /&gt;
	add	accu1,MltLo	; Add low byte of result to accumulator byte 1&lt;br /&gt;
	adc	accu2,MltHi	; Add with carry high byte of result to accumulator byte 2&lt;br /&gt;
	adc	accu3,Zero	; Add carry to accumulator byte 3&lt;br /&gt;
.ENDMACRO&lt;br /&gt;
.MACRO smac32&lt;br /&gt;
	muls	coefh,datah	; Signed multiply, coefficient high byte and data high byte&lt;br /&gt;
	add	accu2,MltLo	; Add low byte of result to accumulator byte 2&lt;br /&gt;
	adc	accu3,MltHi	; Add with carry high byte of result to accumulator byte 3&lt;br /&gt;
	mul	coefl,datal	; Unsigned multiply, coefficient low byte and data low byte&lt;br /&gt;
	add	accu0,MltLo	; Add low byte of result to accumulator byte 0&lt;br /&gt;
	adc	accu1,MltHi	; Add with carry high byte of result to accumulator byte 1&lt;br /&gt;
	adc	accu2,Zero	; Add carry to accumulator byte 2&lt;br /&gt;
	adc	accu3,Zero	; Add carry to accumulator byte 3&lt;br /&gt;
	mulsu	coefh,datal	; Signed-unsigned multiply, coefficient high byte and data low byte &lt;br /&gt;
	sbc	accu3,Zero	; Sign extention&lt;br /&gt;
	add	accu1,MltLo	; Add low byte of result to accumulator byte 1&lt;br /&gt;
	adc	accu2,MltHi	; Add with carry high byte of result to accumulator byte 2&lt;br /&gt;
	adc	accu3,Zero	; Add carry to accumulator byte 3&lt;br /&gt;
	mulsu	datah,coefl 	; Signed-unsigned multiply, data high byte and coefficient low byte&lt;br /&gt;
	sbc	accu3,Zero	; Sign extention&lt;br /&gt;
	add	accu1,MltLo	; Add low byte of result to accumulator byte 1&lt;br /&gt;
	adc	accu2,MltHi	; Add with carry high byte of result to accumulator byte 2&lt;br /&gt;
	adc	accu3,Zero	; Add carry to accumulator byte 3&lt;br /&gt;
;	ret&lt;br /&gt;
.ENDMACRO&lt;br /&gt;
.LISTMAC&lt;br /&gt;
;*************************************************************************&lt;br /&gt;
;* reset/interrupt-vectors:&lt;br /&gt;
;*************************************************************************&lt;br /&gt;
.cseg&lt;br /&gt;
	rjmp	Initial		; after RESET to main program&lt;br /&gt;
	reti			; External Interrupt Request 0&lt;br /&gt;
	reti			; External Interrupt Request 1&lt;br /&gt;
;	reti			; External Interrupt Request 2   mega644&lt;br /&gt;
	reti			; Pin Change Interrupt Request 0&lt;br /&gt;
	reti			; Pin Change Interrupt Request 1&lt;br /&gt;
	reti			; Pin Change Interrupt Request 2&lt;br /&gt;
;	reti			; Pin Change Interrupt Request 3 mega644&lt;br /&gt;
	reti			; Watchdog Time-out Interrupt&lt;br /&gt;
	reti			; Timer/Counter2 Compare Match A&lt;br /&gt;
	reti			; Timer/Counter2 Compare Match B&lt;br /&gt;
	reti			; Timer/Counter2 Overflow&lt;br /&gt;
	reti			; Timer/Counter1 Capture Event&lt;br /&gt;
	reti			; Timer/Counter1 Compare Match A&lt;br /&gt;
	reti			; Timer/Counter1 Compare Match B&lt;br /&gt;
	reti			; Timer/Counter1 Overflow&lt;br /&gt;
	reti			; Timer/Counter0 Compare Match A&lt;br /&gt;
	reti			; Timer/Counter0 Compare Match B&lt;br /&gt;
	reti			; Timer/Counter0 Overflow&lt;br /&gt;
	reti			; SPI Serial Transfer Complete&lt;br /&gt;
	reti			; USART0, Rx Complete&lt;br /&gt;
	reti			; USART0 Data register Empty&lt;br /&gt;
	reti			; USART0, Tx Complete&lt;br /&gt;
;	reti			; Analog Comparator 		 mega644&lt;br /&gt;
	rjmp	ADCint		; ADC Conversion Complete&lt;br /&gt;
	reti			; EEPROM Ready   &lt;br /&gt;
	reti			; 2-wire Serial Interface&lt;br /&gt;
	reti			; Store Program Memory Read&lt;br /&gt;
;*************************************************************************&lt;br /&gt;
;* after reset: initialise stack,ports&lt;br /&gt;
;*************************************************************************&lt;br /&gt;
Initial: &lt;br /&gt;
	ldi	Tmp1,Low(RAMEND)&lt;br /&gt;
	out	SPL,Tmp1	;&lt;br /&gt;
	ldi	Tmp1,High(RAMEND)&lt;br /&gt;
	out	SPH,Tmp1	; stack initialised&lt;br /&gt;
	clr	Zero		; always Zero&lt;br /&gt;
	ldi	Tmp1,$FF	; &lt;br /&gt;
	out	PortB,Tmp1	; PortB = % 1111 1111&lt;br /&gt;
	out	PortC,Zero	; PortC = % 0000 0000&lt;br /&gt;
	out	PortD,Tmp1	; PortD = % 1111 1111&lt;br /&gt;
	out	DDRB,Tmp1	; PortB direction = % 1111 1111&lt;br /&gt;
	out	DDRC,Zero	; PortC direction = % 0000 0000&lt;br /&gt;
	out	DDRD,Tmp1	; PortD direction = % 1111 1111&lt;br /&gt;
	ldi	Tmp1,$A1	; pos. outputs, fast PWM 8Bit&lt;br /&gt;
	sts	TCCR1A,Tmp1	;&lt;br /&gt;
	ldi	Tmp1,$09	; fast PWM 8Bit, clk/1 (no prescaling)&lt;br /&gt;
	sts	TCCR1B,Tmp1	;&lt;br /&gt;
	sts	OCR1AH,Zero	;&lt;br /&gt;
	sts	OCR1AL,Zero	;&lt;br /&gt;
	sts	OCR1BH,Zero	;&lt;br /&gt;
	sts	OCR1BL,Zero	;&lt;br /&gt;
	ldi	Tmp1,$40	; Ref=Vcc, right-adj, ADC0=input&lt;br /&gt;
	sts	ADMUX,Tmp1	;&lt;br /&gt;
;	ldi	Tmp1,$EE	; Start,Auto, enable Int, Clk/64&lt;br /&gt;
	ldi	Tmp1,$EF	; Start,Auto, enable Int, Clk/128&lt;br /&gt;
	sts	ADCSRA,Tmp1	;&lt;br /&gt;
	ldi	Tmp1,$00	; free running&lt;br /&gt;
	sts	ADCSRB,Tmp1	;&lt;br /&gt;
	ldi	Tmp1,$01	; disable ADC0 dig.inp (optional)&lt;br /&gt;
	sts	DIDR0,Tmp1	;&lt;br /&gt;
	ldi	ZL,low(CoTblF&amp;lt;&amp;lt;1)	; move filter coefficents&lt;br /&gt;
	ldi	ZH,high(CoTblF&amp;lt;&amp;lt;1)	; from program-flash&lt;br /&gt;
	ldi	YL,low(CoTblS)	; to SRAM&lt;br /&gt;
	ldi	YH,high(CoTblS)	;&lt;br /&gt;
	ldi	Tmp1,30		; count 15 * 16 Bit coefficients&lt;br /&gt;
TbLoop:&lt;br /&gt;
	lpm	Tmp2,Z+		; fetch 1 byte from coefficient table&lt;br /&gt;
	st	Y+,Tmp2		; copy coefficient to Sram, increment Y&lt;br /&gt;
	dec	Tmp1&lt;br /&gt;
	brne	TbLoop&lt;br /&gt;
	ldi	YL,low(DatTbl)	; load SRAM-Pointer for Interrupt routine&lt;br /&gt;
	ldi	YH,high(DatTbl)	;&lt;br /&gt;
	sei			; enable interrupts&lt;br /&gt;
;*************************************************************************&lt;br /&gt;
;* Main program:&lt;br /&gt;
;*************************************************************************&lt;br /&gt;
Endless:&lt;br /&gt;
	rjmp	Endless		; &lt;br /&gt;
;*************************************************************************&lt;br /&gt;
;* ADC-Interrupt routine: compute filter and update PWM output&lt;br /&gt;
;*************************************************************************&lt;br /&gt;
ADCint:&lt;br /&gt;
	sbi	PortD,0		; just to measure INT-Time&lt;br /&gt;
	in	SavSrg,SREG	; save status register&lt;br /&gt;
;*************************************************************************&lt;br /&gt;
;* 1st SOS filter&lt;br /&gt;
;*************************************************************************&lt;br /&gt;
	load_coef 	b21	; b21*x1[t-2]&lt;br /&gt;
	load_node 	x21	; &lt;br /&gt;
	mul_move_32		; &lt;br /&gt;
	load_coef 	b11	; b11*x1[t-1]&lt;br /&gt;
	load_node	x11	; &lt;br /&gt;
	update_node 	x21	; &lt;br /&gt;
	smac32			; &lt;br /&gt;
	load_coef 	b01	; b01*x1[t]&lt;br /&gt;
	lds	datal,ADCL	; Load new sample &lt;br /&gt;
	lds	datah,ADCH	; into data multiply register&lt;br /&gt;
	dec	datah		; convert 10 bit unsigned $03FF -&amp;gt; $01FF&lt;br /&gt;
	dec	datah		; to 16 Bit signed        $0000 -&amp;gt; $FE00&lt;br /&gt;
&lt;br /&gt;
	lsl	datal&lt;br /&gt;
	rol	datah&lt;br /&gt;
	lsl	datal&lt;br /&gt;
	rol	datah&lt;br /&gt;
	lsl	datal&lt;br /&gt;
	rol	datah&lt;br /&gt;
	lsl	datal&lt;br /&gt;
	rol	datah&lt;br /&gt;
	lsl	datal&lt;br /&gt;
	rol	datah&lt;br /&gt;
	lsl	datal&lt;br /&gt;
	rol	datah&lt;br /&gt;
&lt;br /&gt;
	update_node 	x11	; &lt;br /&gt;
	smac32			; &lt;br /&gt;
	load_coef 	a21	; a21*y1[t-2]&lt;br /&gt;
	load_node 	y21	; &lt;br /&gt;
	smac32			; &lt;br /&gt;
	load_coef 	a11	; a11*y1[t-1]&lt;br /&gt;
	load_node 	y11	; &lt;br /&gt;
	update_node 	y21	; &lt;br /&gt;
	smac32			; &lt;br /&gt;
	cpi	accu3,$20	; accu &amp;lt;   $20000000 ?&lt;br /&gt;
	brlo	NoLimit1	;&lt;br /&gt;
	cpi	accu3,-$20	; accu &amp;gt;= -$20000000 ?&lt;br /&gt;
	brsh	NoLimit1	;&lt;br /&gt;
	clr	accu2		; accu2 = $00&lt;br /&gt;
	cpi	accu3,0		;&lt;br /&gt;
	brge	PosLim1		; &lt;br /&gt;
	ldi	accu3,$80	; accu3 = $80&lt;br /&gt;
	rjmp	Limit1		; &lt;br /&gt;
PosLim1:&lt;br /&gt;
	ldi	accu3,$7F	; accu3 = $7F	&lt;br /&gt;
	com	accu2		; accu2 = $FF	&lt;br /&gt;
	rjmp	Limit1		; &lt;br /&gt;
NoLimit1:&lt;br /&gt;
	lsl	accu1		; Scaling to gain factor 2^15&lt;br /&gt;
	rol	accu2		; &lt;br /&gt;
	rol	accu3		; &lt;br /&gt;
	lsl	accu1		; Scaling to gain factor 2^16&lt;br /&gt;
	rol	accu2		; &lt;br /&gt;
	rol	accu3		; &lt;br /&gt;
Limit1:&lt;br /&gt;
	std	Y+y11,accu2	; Updating y1[t-1] node to prepare next filter run &lt;br /&gt;
	std	Y+y11+1,accu3	; and save it for following SOS filter&lt;br /&gt;
;*************************************************************************&lt;br /&gt;
;* 2nd SOS filter&lt;br /&gt;
;*************************************************************************&lt;br /&gt;
	load_coef 	b22	; b22*x2[t-2]&lt;br /&gt;
	load_node 	x22	; &lt;br /&gt;
	mul_move_32		; &lt;br /&gt;
	load_coef 	b12	; b12*x2[t-1]&lt;br /&gt;
	load_node	x12	; &lt;br /&gt;
	update_node 	x22	; &lt;br /&gt;
	smac32			; &lt;br /&gt;
	load_coef 	b02	; b02*x2[t]&lt;br /&gt;
	load_node 	y11	; result of 1st SOS&lt;br /&gt;
	update_node 	x12	; &lt;br /&gt;
	smac32			;  &lt;br /&gt;
	load_coef 	a22	; a22*y2[t-2]&lt;br /&gt;
	load_node 	y22	; &lt;br /&gt;
	smac32			; &lt;br /&gt;
	load_coef 	a12	; a12*y2[t-1]&lt;br /&gt;
	load_node 	y12	; &lt;br /&gt;
	update_node 	y22	; &lt;br /&gt;
	smac32			; &lt;br /&gt;
	cpi	accu3,$20	; accu &amp;lt;   $20000000 ?&lt;br /&gt;
	brlo	NoLimit2	;&lt;br /&gt;
	cpi	accu3,-$20	; accu &amp;gt;= -$20000000 ?&lt;br /&gt;
	brsh	NoLimit2	;&lt;br /&gt;
	clr	accu2		; accu2 = $00&lt;br /&gt;
	cpi	accu3,0		;&lt;br /&gt;
	brge	PosLim2		; &lt;br /&gt;
	ldi	accu3,$80	; accu3 = $80&lt;br /&gt;
	rjmp	Limit2		; &lt;br /&gt;
PosLim2:&lt;br /&gt;
	ldi	accu3,$7F	; accu3 = $7F	&lt;br /&gt;
	com	accu2		; accu2 = $FF	&lt;br /&gt;
	rjmp	Limit2		; &lt;br /&gt;
NoLimit2:&lt;br /&gt;
	lsl	accu1		; Scaling to gain factor 2^15&lt;br /&gt;
	rol	accu2		; &lt;br /&gt;
	rol	accu3		; &lt;br /&gt;
	lsl	accu1		; Scaling to gain factor 2^16&lt;br /&gt;
	rol	accu2		; &lt;br /&gt;
	rol	accu3		; &lt;br /&gt;
Limit2:&lt;br /&gt;
	std	Y+y12,accu2	; Updating y2[t-1] node to prepare next filter run &lt;br /&gt;
	std	Y+y12+1,accu3	; and save it for following SOS filter&lt;br /&gt;
;*************************************************************************&lt;br /&gt;
;* 3rd SOS filter&lt;br /&gt;
;*************************************************************************&lt;br /&gt;
	load_coef 	b23	; b23*x3[t-2]&lt;br /&gt;
	load_node 	x23	; &lt;br /&gt;
	mul_move_32		; &lt;br /&gt;
	load_coef 	b13	; b13*x3[t-1]&lt;br /&gt;
	load_node	x13	; &lt;br /&gt;
	update_node 	x23	; &lt;br /&gt;
	smac32			; &lt;br /&gt;
	load_coef 	b03	; b03*x3[t]&lt;br /&gt;
	load_node 	y12	; result of 2nd SOS&lt;br /&gt;
	update_node 	x13	; &lt;br /&gt;
	smac32			; &lt;br /&gt;
	load_coef 	a23	; a23*y3[t-2]&lt;br /&gt;
	load_node 	y23	; &lt;br /&gt;
	smac32			; &lt;br /&gt;
	load_coef 	a13	; a13*y3[t-1]&lt;br /&gt;
	load_node 	y13	; &lt;br /&gt;
	update_node 	y23	; &lt;br /&gt;
	smac32			; &lt;br /&gt;
	cpi	accu3,$20	; accu &amp;lt;   $20000000 ?&lt;br /&gt;
	brlo	NoLimit3	;&lt;br /&gt;
	cpi	accu3,-$20	; accu &amp;gt;= -$20000000 ?&lt;br /&gt;
	brsh	NoLimit3	;&lt;br /&gt;
	clr	accu2		; accu2 = $00&lt;br /&gt;
	cpi	accu3,0		;&lt;br /&gt;
	brge	PosLim3		; &lt;br /&gt;
	ldi	accu3,$80	; accu3 = $80&lt;br /&gt;
	rjmp	Limit3		; &lt;br /&gt;
PosLim3:&lt;br /&gt;
	ldi	accu3,$7F	; accu3 = $7F	&lt;br /&gt;
	com	accu2		; accu2 = $FF	&lt;br /&gt;
	rjmp	Limit3		; &lt;br /&gt;
NoLimit3:&lt;br /&gt;
	lsl	accu1		; Scaling to gain factor 2^15&lt;br /&gt;
	rol	accu2		; &lt;br /&gt;
	rol	accu3		; &lt;br /&gt;
	lsl	accu1		; Scaling to gain factor 2^16&lt;br /&gt;
	rol	accu2		; &lt;br /&gt;
	rol	accu3		; &lt;br /&gt;
Limit3:&lt;br /&gt;
	std	Y+y13,accu2	; Updating y3[t-1] node to prepare next filter run &lt;br /&gt;
	std	Y+y13+1,accu3	; &lt;br /&gt;
;*************************************************************************&lt;br /&gt;
;* PWM - D/A-output&lt;br /&gt;
;*************************************************************************&lt;br /&gt;
	subi	accu3,$80	; signed to unsigned  $8000 -&amp;gt;$0000, $7FFF -&amp;gt;$FFFF&lt;br /&gt;
	sts	OCR1AH,Zero	; &lt;br /&gt;
	sts	OCR1AL,Tmp1	; fast PWM 8 bit input signal to OCR1A&lt;br /&gt;
	sts	OCR1BH,Zero	; &lt;br /&gt;
	sts	OCR1BL,accu3	; fast PWM 8 bit result to OCR1B&lt;br /&gt;
	cbi	PortD,0		; just to measure INT-Time&lt;br /&gt;
	out	SREG,SavSrg	; restore status register&lt;br /&gt;
	reti			; &lt;br /&gt;
;*************************************************************************&lt;br /&gt;
;* coefficient table in flash memory&lt;br /&gt;
;*************************************************************************&lt;br /&gt;
CoTblF:&lt;br /&gt;
/* &lt;br /&gt;
;1750 Hz Sperrfilter:&lt;br /&gt;
	.dw 	16384	 	;  b01 *16384 ( 1        )&lt;br /&gt;
	.dw 	-26575	 	;  b11 *16384 (-1,6219938)&lt;br /&gt;
	.dw 	16384	 	;  b21 *16384 ( 1        )&lt;br /&gt;
	.dw 	24740		; -a11 *16384 ( 1,5100165)&lt;br /&gt;
	.dw 	-15374	 	; -a21 *16384 (-0,9383702)&lt;br /&gt;
&lt;br /&gt;
	.dw 	16384	 	;  b02 *16384 ( 1        )&lt;br /&gt;
	.dw 	-26865	 	;  b12 *16384 (-1,6396794)&lt;br /&gt;
	.dw 	16384	 	;  b22 *16384 ( 1        )&lt;br /&gt;
	.dw 	24804	 	; -a12 *16384 ( 1,5139300)&lt;br /&gt;
	.dw 	-13871	 	; -a22 *16384 (-0,8466245)&lt;br /&gt;
&lt;br /&gt;
	.dw 	16384		;  b03 *16384 ( 1        )&lt;br /&gt;
	.dw 	-27142	 	;  b13 *16384 (-1,6566160)&lt;br /&gt;
	.dw 	16384		;  b23 *16384 ( 1        )&lt;br /&gt;
	.dw 	27256	 	; -a13 *16384 ( 1,6635630)&lt;br /&gt;
	.dw 	-15541	 	; -a23 *16384 (-0,9485511) */&lt;br /&gt;
&lt;br /&gt;
;SSTV-Bandpass nach DJ6HP 015:&lt;br /&gt;
	.dw 	16384	 	;  b01 *16384 ( 1        )&lt;br /&gt;
	.dw 	18847	 	;  b11 *16384 ( 1.1503168)&lt;br /&gt;
	.dw 	16386	 	;  b21 *16384 ( 1.0001280)&lt;br /&gt;
	.dw 	-978		; -a11 *16384 (-0.0596667)&lt;br /&gt;
	.dw 	-11721	 	; -a21 *16384 (-0.7154071)&lt;br /&gt;
&lt;br /&gt;
	.dw 	16384	 	;  b02 *16384 ( 1        )&lt;br /&gt;
	.dw 	-13748	 	;  b12 *16384 (-0.8390889)&lt;br /&gt;
	.dw 	12107	 	;  b22 *16384 ( 0.7389315)&lt;br /&gt;
	.dw 	12211	 	; -a12 *16384 ( 0.7453174&lt;br /&gt;
	.dw 	-11666	 	; -a22 *16384 (-0.7120574)&lt;br /&gt;
;&lt;br /&gt;
	.dw 	16384		;  b03 *16384 ( 1        )&lt;br /&gt;
	.dw 	40	 	;  b13 *16384 ( 0.0024186)&lt;br /&gt;
	.dw 	-16374		;  b23 *16384 (-0.9993911)&lt;br /&gt;
	.dw 	17671	 	; -a13 *16384 ( 1.0785309)&lt;br /&gt;
	.dw 	-9516	 	; -a23 *16384 (-0.5808050)&lt;br /&gt;
&lt;br /&gt;
;*************************************************************************&lt;br /&gt;
;* data memory in SRAM&lt;br /&gt;
;*************************************************************************&lt;br /&gt;
.dseg&lt;br /&gt;
.org	$0100&lt;br /&gt;
DatTbl:&lt;br /&gt;
	.dw 	$0000 	 	; x11&lt;br /&gt;
	.dw 	$0000 	 	; x21&lt;br /&gt;
	.dw 	$0000 	 	; y11&lt;br /&gt;
	.dw 	$0000 	 	; y21&lt;br /&gt;
;&lt;br /&gt;
	.dw 	$0000 	 	; x12&lt;br /&gt;
	.dw 	$0000 	 	; x22&lt;br /&gt;
	.dw 	$0000 	 	; y12&lt;br /&gt;
	.dw 	$0000 	 	; y22&lt;br /&gt;
;&lt;br /&gt;
	.dw 	$0000 	 	; x13&lt;br /&gt;
	.dw 	$0000 	 	; x23&lt;br /&gt;
	.dw 	$0000 	 	; y13&lt;br /&gt;
	.dw 	$0000 		; y23&lt;br /&gt;
;*************************************************************************&lt;br /&gt;
;* coefficient table in SRAM&lt;br /&gt;
;*************************************************************************&lt;br /&gt;
CoTblS:&lt;br /&gt;
	.dw 	$0000 	 	;  b01 *16384&lt;br /&gt;
	.dw 	$0000 	 	;  b11 *16384&lt;br /&gt;
	.dw 	$0000		;  b21 *16384&lt;br /&gt;
	.dw 	$0000	 	; -a11 *16384&lt;br /&gt;
	.dw 	$0000	 	; -a21 *16384&lt;br /&gt;
;&lt;br /&gt;
	.dw 	$0000	 	;  b02 *16384&lt;br /&gt;
	.dw 	$0000 		;  b12 *16384&lt;br /&gt;
	.dw 	$0000	 	;  b22 *16384&lt;br /&gt;
	.dw 	$0000		; -a12 *16384&lt;br /&gt;
	.dw 	$0000	 	; -a22 *16384&lt;br /&gt;
;&lt;br /&gt;
	.dw 	$0000 		;  b03 *16384&lt;br /&gt;
	.dw 	$0000	 	;  b13 *16384&lt;br /&gt;
	.dw 	$0000		;  b23 *16384&lt;br /&gt;
	.dw 	$0000 		; -a13 *16384&lt;br /&gt;
	.dw 	$0000	 	; -a23 *16384&lt;br /&gt;
;*************************************************************************&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
===Literatur===&lt;br /&gt;
Der wichtigste Artikel zur Signalverarbeitung mit Scilab ist&lt;br /&gt;
[http://www.scilab.org/doc/signal.pdf Signal.pdf (1,2MByte) von 1998].&lt;br /&gt;
Die dazugehörigen Programme sind etwas schwerer zu finden, hier habe ich sie daher zu [http://www.mikrocontroller.net/wikifiles/8/82/SignalFiles.pdf SignalFiles.pdf (980kB)] zusammengefasst.&lt;/div&gt;</summary>
		<author><name>129.247.247.240</name></author>
	</entry>
</feed>