<?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=Max5v</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=Max5v"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Max5v"/>
	<updated>2026-04-10T22:15:45Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-GCC-Tutorial/LCD-Ansteuerung&amp;diff=90655</id>
		<title>AVR-GCC-Tutorial/LCD-Ansteuerung</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-GCC-Tutorial/LCD-Ansteuerung&amp;diff=90655"/>
		<updated>2015-12-11T13:48:18Z</updated>

		<summary type="html">&lt;p&gt;Max5v: Vandalismus entfernt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Das LCD und sein Controller==&lt;br /&gt;
&lt;br /&gt;
Die meisten Text-LCDs verwenden den Controller [[HD44780]] oder einen kompatiblen (z.&amp;amp;nbsp;B. KS0070) und haben 14 oder 16 Pins. Hier ist die häufigste Anschluss-Belegung angegeben. &lt;br /&gt;
&lt;br /&gt;
;Achtung: Es gibt Displays mit abweichender Anschluss-Belegung, z.B. TC1602E (Pollin 120420). Falscher Anschluss kann zur Zerstörung führen! Daher immer das zugehörige Datenblatt zu Rate ziehen. Einzelheiten unter Artikel zum Controller [[HD44780]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Pin # || Bezeichnung || Funktion&lt;br /&gt;
|-&lt;br /&gt;
! 1&lt;br /&gt;
| Vss  || GND (beim TC1602E Vdd=Vcc)&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| Vdd/Vcc  || 5V  (beim TC1602E Vss=Gnd)&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| Vee  || Kontrastspannung (0V bis 5V)&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| RS   || Register Select (Befehle/Daten)&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| RW   || Read/Write&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| E&lt;br /&gt;
| Enable&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| DB0  ||rowspan=&amp;quot;8&amp;quot;| Datenbits 0&amp;amp;minus;7&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| DB1&lt;br /&gt;
|-&lt;br /&gt;
! 9&lt;br /&gt;
| DB2&lt;br /&gt;
|-&lt;br /&gt;
! 10&lt;br /&gt;
| DB3&lt;br /&gt;
|-&lt;br /&gt;
! 11&lt;br /&gt;
| DB4&lt;br /&gt;
|-&lt;br /&gt;
! 12&lt;br /&gt;
| DB5&lt;br /&gt;
|-&lt;br /&gt;
! 13&lt;br /&gt;
| DB6&lt;br /&gt;
|-&lt;br /&gt;
! 14&lt;br /&gt;
| DB7&lt;br /&gt;
|-&lt;br /&gt;
! 15&lt;br /&gt;
| A   || LED-Beleuchtung, Anode&lt;br /&gt;
|-&lt;br /&gt;
! 16&lt;br /&gt;
| K   || LED-Beleuchtung, Kathode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Warnung|&lt;br /&gt;
;Achtung: Unbedingt von der richtigen Seite zu zählen anfangen! Meistens ist neben Pin 1 eine kleine 1 auf der LCD-Platine. Ansonsten im Datenblatt nachschauen! Oft ist Pin 1 auch durch ein rechteckiges statt rundes Pad gekennzeichnet.&lt;br /&gt;
&lt;br /&gt;
:Bei LCDs mit 16-poligem Anschluss sind die beiden letzten Pins für die Hintergrundbeleuchtung reserviert. Hier unbedingt das Datenblatt zu Rate ziehen, die beiden Anschlüsse sind je nach Hersteller oft anders beschaltet. Falls kein Datenblatt vorliegt, kann man mit einem Durchgangsprüfer feststellen, welcher Anschluss mit Masse (GND) verbunden ist.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Vss wird ganz einfach an GND angeschlossen und Vcc an 5V. Vee kann man testweise auch an GND legen. Wenn das LCD dann zu dunkel sein sollte muss man ein 10k-Potentiometer zwischen GND und 5V schalten, mit dem Schleifer an Vee: &lt;br /&gt;
&lt;br /&gt;
[[Bild:LCD_Vee.gif]]&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei verschiedene Möglichkeiten zur Ansteuerung eines solchen Displays: den &#039;&#039;&#039;8-bit-&#039;&#039;&#039; und den &#039;&#039;&#039;4-bit-&#039;&#039;&#039;Modus.&lt;br /&gt;
* Für den &#039;&#039;&#039;8-bit-Modus&#039;&#039;&#039; werden (wie der Name schon sagt) alle acht Datenleitungen zur Ansteuerung verwendet, somit kann durch einen Zugriff immer ein ganzes Byte übertragen werden.&lt;br /&gt;
* Der &#039;&#039;&#039;4-bit-Modus&#039;&#039;&#039; verwendet nur die oberen vier Datenleitungen (&#039;&#039;&#039;DB4-DB7&#039;&#039;&#039;). Um ein Byte zu übertragen braucht man somit zwei Zugriffe, wobei zuerst das höherwertige &#039;&#039;&#039;&amp;quot;Nibble&amp;quot;&#039;&#039;&#039; (= 4 Bits), also Bit 4 bis Bit 7 übertragen wird und dann das niederwertige, also Bit 0 bis Bit 3. Die unteren Datenleitungen des LCDs, die beim Lesezyklus Ausgänge sind, lässt man offen (siehe Datasheets, z.&amp;amp;nbsp;B. vom KS0070).&lt;br /&gt;
&lt;br /&gt;
Der 4-bit-Modus hat den Vorteil, dass man 4 IO-Pins weniger benötigt als beim 8-bit-Modus, weshalb ich mich hier für eine Ansteuerung mit 4bit entschieden habe. &lt;br /&gt;
&lt;br /&gt;
Neben den vier Datenleitungen (DB4, DB5, DB6 und DB7) werden noch die Anschlüsse &#039;&#039;&#039;RS&#039;&#039;&#039;, &#039;&#039;&#039;RW&#039;&#039;&#039; und &#039;&#039;&#039;E&#039;&#039;&#039; (ist in manchen Unterlagen auch &#039;&#039;&#039;EN&#039;&#039;&#039;  für &#039;&#039;Enable&#039;&#039; abgekürzt) benötigt. &lt;br /&gt;
&lt;br /&gt;
* Über &#039;&#039;&#039;RS&#039;&#039;&#039; wird ausgewählt, ob man einen Befehl oder ein Datenbyte an das LCD schicken möchte. Ist RS Low, dann wird das ankommende Byte als Befehl interpretiert, ist RS high, dann wird das Byte auf dem LCD angezeigt. &lt;br /&gt;
* &#039;&#039;&#039;RW&#039;&#039;&#039; legt fest, ob geschrieben oder gelesen werden soll. High bedeutet lesen, low bedeutet schreiben. Wenn man RW auf lesen einstellt und RS auf Befehl, dann kann man das &#039;&#039;&#039;Busy-Flag&#039;&#039;&#039; an DB7 lesen, das anzeigt, ob das LCD den vorhergehenden Befehl fertig verarbeitetet hat (diese Methode u.a. in der LCD-Library von Peter Fleury verwendet). Ist RS auf Daten eingestellt, dann kann man z.&amp;amp;nbsp;B. den Inhalt des Displays lesen - was jedoch nur in den wenigsten Fällen Sinn macht. Deshalb kann man RW dauerhaft auf low lassen (= an GND anschließen), so dass man noch ein IO-Pin am Controller einspart. Der Nachteil ist, dass man dann das Busy-Flag nicht lesen kann, weswegen man nach jedem Befehl vorsichtshalber ein paar Mikrosekunden warten sollte, um dem LCD Zeit zum Ausführen des Befehls zu geben. Dummerweise schwankt die Ausführungszeit von Display zu Display und ist auch von der Betriebsspannung abhängig. Für professionellere Sachen also lieber den IO-Pin opfern und Busy abfragen.&lt;br /&gt;
* Der &#039;&#039;&#039;E&#039;&#039;&#039; Anschluss schließlich signalisiert dem LCD, dass die übrigen Datenleitungen jetzt korrekte Pegel angenommen haben und es die gewünschten Daten von den Datenleitungen bzw. Kommandos von den Datenleitungen übernehmen kann.&lt;br /&gt;
&lt;br /&gt;
== Anschluss an den Controller ==&lt;br /&gt;
&lt;br /&gt;
Jetzt da wir wissen, welche Anschlüsse das LCDs benötigt, können wir das LCD mit dem Mikrocontroller verbinden: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;ACHTUNG: Es gibt Displays mit abweichender Anschluss-Belegung, falscher Anschluss kann zur Zerstörung führen! Daher immer das zugehörige Datenblatt zu Rate ziehen.&amp;lt;/span&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Einzelheiten unter [http://www.mikrocontroller.net/articles/HD44780 Artikel zum Controller HD44780]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Pin #-LCD  || Bezeichnung-LCD || Pin-µC&lt;br /&gt;
|-&lt;br /&gt;
!1&lt;br /&gt;
| Vss || GND&lt;br /&gt;
|-&lt;br /&gt;
!2&lt;br /&gt;
| Vcc || 5V&lt;br /&gt;
|-&lt;br /&gt;
!3&lt;br /&gt;
| Vee || GND oder Poti (siehe oben)&lt;br /&gt;
|-&lt;br /&gt;
!4&lt;br /&gt;
| RS  || PD4 am AVR&lt;br /&gt;
|-&lt;br /&gt;
!5&lt;br /&gt;
| RW  || GND&lt;br /&gt;
|-&lt;br /&gt;
!6&lt;br /&gt;
| E   || PD5 am AVR&lt;br /&gt;
|-&lt;br /&gt;
!7&lt;br /&gt;
| DB0 ||rowspan=&amp;quot;4&amp;quot;| offen (unbenutzt)&lt;br /&gt;
|-&lt;br /&gt;
!8&lt;br /&gt;
| DB1&lt;br /&gt;
|-&lt;br /&gt;
!9&lt;br /&gt;
| DB2&lt;br /&gt;
|-&lt;br /&gt;
!10&lt;br /&gt;
| DB3&lt;br /&gt;
|-&lt;br /&gt;
!11&lt;br /&gt;
| DB4 || PD0 am AVR&lt;br /&gt;
|-&lt;br /&gt;
!12&lt;br /&gt;
| DB5 || PD1 am AVR&lt;br /&gt;
|-&lt;br /&gt;
!13&lt;br /&gt;
| DB6 || PD2 am AVR&lt;br /&gt;
|-&lt;br /&gt;
!14&lt;br /&gt;
| DB7 || PD3 am AVR&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wenn man die Steuerleitungen EN und RS auf Pins an einem anderen Port legen möchte, kann man so wie in diesem [http://www.mikrocontroller.net/topic/88543#751982 Forumsbeitrag] oder wie im Artikel [[Erweiterte LCD-Ansteuerung]] vorgehen.&lt;br /&gt;
&lt;br /&gt;
Ok, alles ist verbunden, wenn man jetzt den Strom einschaltet sollten ein oder zwei schwarze Balken auf dem Display angezeigt werden. Erscheint trotz korrektem Anschluss nichts auf dem Display, so kann das auch am Kontrast des LCDs liegen. Die Balken werden dann zwar theoretisch angezeigt, sind aber nicht sichtbar, weil die Kontrastspannung zu hoch ist. Abhilfe schafft es hier, wenn man die Spannung am Schleifer des Potis nachmisst und in Richtung 0V verstellt. Zwischen 1V und 0V treten die Balken dann meist hervor.&lt;br /&gt;
Doch wie bekommt man jetzt die Befehle und Daten in das Display?&lt;br /&gt;
&lt;br /&gt;
== Programmierung ==&lt;br /&gt;
&lt;br /&gt;
=== Die LCD Routinen ===&lt;br /&gt;
&lt;br /&gt;
Der folgende Satz von Ansteuerroutinen für ein Text-LCD ist in der Datei &#039;&#039;&#039;lcd-routines.c&#039;&#039;&#039; zusammengefasst. Diese Datei muss man beim Einrichten zusätzlich zum eigenen Hauptprogramm in sein Projekt aufnehmen. Dies geschieht beim AVR Studio unter Source Files im Fenster AVR GCC oder bei WinAVR im Makefile (z.&amp;amp;nbsp;B. durch SRC += lcd-routines.c). &lt;br /&gt;
&lt;br /&gt;
Wichtig ist außerdem, dass die Optimierung bei der Compilierung eingeschaltet ist, sonst stimmen die Zeiten der Funktionen _delay_us() und _delay_ms() nicht und der Code wird wesentlich länger (Siehe Dokumentation der libc im WinAVR).&lt;br /&gt;
&lt;br /&gt;
Als weitere Datei ist die Includedatei &#039;&#039;&#039;lcd-routines.h&#039;&#039;&#039; notwendig, die im Hauptprogramm und in &#039;&#039;&#039;lcd-routines.c&#039;&#039;&#039; eingebunden wird. Die Anpassung der Pinbelegung etc. macht man in dieser Datei.&lt;br /&gt;
&lt;br /&gt;
==== Datei &#039;&#039;&#039;lcd-routines.h&#039;&#039;&#039; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus&lt;br /&gt;
// http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung&lt;br /&gt;
//&lt;br /&gt;
 &lt;br /&gt;
#ifndef LCD_ROUTINES_H&lt;br /&gt;
#define LCD_ROUTINES_H&lt;br /&gt;
 &lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Hier die verwendete Taktfrequenz in Hz eintragen, wichtig!&lt;br /&gt;
 &lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
#define F_CPU 8000000&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Pinbelegung für das LCD, an verwendete Pins anpassen&lt;br /&gt;
// Alle LCD Pins müssen an einem Port angeschlossen sein und die 4&lt;br /&gt;
// Datenleitungen müssen auf aufeinanderfolgenden Pins liegen&lt;br /&gt;
 &lt;br /&gt;
//  LCD DB4-DB7 &amp;lt;--&amp;gt;  PORTD Bit PD0-PD3&lt;br /&gt;
#define LCD_PORT      PORTD&lt;br /&gt;
#define LCD_DDR       DDRD&lt;br /&gt;
#define LCD_DB        PD0&lt;br /&gt;
 &lt;br /&gt;
//  LCD RS      &amp;lt;--&amp;gt;  PORTD Bit PD4     (RS: 1=Data, 0=Command)&lt;br /&gt;
#define LCD_RS        PD4&lt;br /&gt;
 &lt;br /&gt;
//  LCD EN      &amp;lt;--&amp;gt;  PORTD Bit PD5     (EN: 1-Impuls für Daten)&lt;br /&gt;
#define LCD_EN        PD5&lt;br /&gt;
 &lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// LCD Ausführungszeiten (MS=Millisekunden, US=Mikrosekunden)&lt;br /&gt;
 &lt;br /&gt;
#define LCD_BOOTUP_MS           15&lt;br /&gt;
#define LCD_ENABLE_US           20&lt;br /&gt;
#define LCD_WRITEDATA_US        46&lt;br /&gt;
#define LCD_COMMAND_US          42&lt;br /&gt;
 &lt;br /&gt;
#define LCD_SOFT_RESET_MS1      5&lt;br /&gt;
#define LCD_SOFT_RESET_MS2      1&lt;br /&gt;
#define LCD_SOFT_RESET_MS3      1&lt;br /&gt;
#define LCD_SET_4BITMODE_MS     5&lt;br /&gt;
 &lt;br /&gt;
#define LCD_CLEAR_DISPLAY_MS    2&lt;br /&gt;
#define LCD_CURSOR_HOME_MS      2&lt;br /&gt;
 &lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Zeilendefinitionen des verwendeten LCD&lt;br /&gt;
// Die Einträge hier sollten für ein LCD mit einer Zeilenlänge von 16 Zeichen passen&lt;br /&gt;
// Bei anderen Zeilenlängen müssen diese Einträge angepasst werden&lt;br /&gt;
 &lt;br /&gt;
#define LCD_DDADR_LINE1         0x00&lt;br /&gt;
#define LCD_DDADR_LINE2         0x40&lt;br /&gt;
#define LCD_DDADR_LINE3         0x10&lt;br /&gt;
#define LCD_DDADR_LINE4         0x50&lt;br /&gt;
 &lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Initialisierung: muss ganz am Anfang des Programms aufgerufen werden.&lt;br /&gt;
void lcd_init( void );&lt;br /&gt;
 &lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// LCD löschen&lt;br /&gt;
void lcd_clear( void );&lt;br /&gt;
 &lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Cursor in die 1. Zeile, 0-te Spalte&lt;br /&gt;
void lcd_home( void );&lt;br /&gt;
 &lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Cursor an eine beliebige Position &lt;br /&gt;
void lcd_setcursor( uint8_t spalte, uint8_t zeile );&lt;br /&gt;
 &lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Ausgabe eines einzelnen Zeichens an der aktuellen Cursorposition &lt;br /&gt;
void lcd_data( uint8_t data );&lt;br /&gt;
 &lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Ausgabe eines Strings an der aktuellen Cursorposition &lt;br /&gt;
void lcd_string( const char *data );&lt;br /&gt;
 &lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Definition eines benutzerdefinierten Sonderzeichens.&lt;br /&gt;
// data muss auf ein Array[8] mit den Zeilencodes des zu definierenden Zeichens&lt;br /&gt;
// zeigen&lt;br /&gt;
void lcd_generatechar( uint8_t code, const uint8_t *data );&lt;br /&gt;
 &lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Ausgabe eines Kommandos an das LCD.&lt;br /&gt;
void lcd_command( uint8_t data );&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// LCD Befehle und Argumente.&lt;br /&gt;
// Zur Verwendung in lcd_command&lt;br /&gt;
 &lt;br /&gt;
// Clear Display -------------- 0b00000001&lt;br /&gt;
#define LCD_CLEAR_DISPLAY       0x01&lt;br /&gt;
 &lt;br /&gt;
// Cursor Home ---------------- 0b0000001x&lt;br /&gt;
#define LCD_CURSOR_HOME         0x02&lt;br /&gt;
 &lt;br /&gt;
// Set Entry Mode ------------- 0b000001xx&lt;br /&gt;
#define LCD_SET_ENTRY           0x04&lt;br /&gt;
 &lt;br /&gt;
#define LCD_ENTRY_DECREASE      0x00&lt;br /&gt;
#define LCD_ENTRY_INCREASE      0x02&lt;br /&gt;
#define LCD_ENTRY_NOSHIFT       0x00&lt;br /&gt;
#define LCD_ENTRY_SHIFT         0x01&lt;br /&gt;
 &lt;br /&gt;
// Set Display ---------------- 0b00001xxx&lt;br /&gt;
#define LCD_SET_DISPLAY         0x08&lt;br /&gt;
 &lt;br /&gt;
#define LCD_DISPLAY_OFF         0x00&lt;br /&gt;
#define LCD_DISPLAY_ON          0x04&lt;br /&gt;
#define LCD_CURSOR_OFF          0x00&lt;br /&gt;
#define LCD_CURSOR_ON           0x02&lt;br /&gt;
#define LCD_BLINKING_OFF        0x00&lt;br /&gt;
#define LCD_BLINKING_ON         0x01&lt;br /&gt;
 &lt;br /&gt;
// Set Shift ------------------ 0b0001xxxx&lt;br /&gt;
#define LCD_SET_SHIFT           0x10&lt;br /&gt;
 &lt;br /&gt;
#define LCD_CURSOR_MOVE         0x00&lt;br /&gt;
#define LCD_DISPLAY_SHIFT       0x08&lt;br /&gt;
#define LCD_SHIFT_LEFT          0x00&lt;br /&gt;
#define LCD_SHIFT_RIGHT         0x04&lt;br /&gt;
 &lt;br /&gt;
// Set Function --------------- 0b001xxxxx&lt;br /&gt;
#define LCD_SET_FUNCTION        0x20&lt;br /&gt;
 &lt;br /&gt;
#define LCD_FUNCTION_4BIT       0x00&lt;br /&gt;
#define LCD_FUNCTION_8BIT       0x10&lt;br /&gt;
#define LCD_FUNCTION_1LINE      0x00&lt;br /&gt;
#define LCD_FUNCTION_2LINE      0x08&lt;br /&gt;
#define LCD_FUNCTION_5X7        0x00&lt;br /&gt;
#define LCD_FUNCTION_5X10       0x04&lt;br /&gt;
 &lt;br /&gt;
#define LCD_SOFT_RESET          0x30&lt;br /&gt;
 &lt;br /&gt;
// Set CG RAM Address --------- 0b01xxxxxx  (Character Generator RAM)&lt;br /&gt;
#define LCD_SET_CGADR           0x40&lt;br /&gt;
 &lt;br /&gt;
#define LCD_GC_CHAR0            0&lt;br /&gt;
#define LCD_GC_CHAR1            1&lt;br /&gt;
#define LCD_GC_CHAR2            2&lt;br /&gt;
#define LCD_GC_CHAR3            3&lt;br /&gt;
#define LCD_GC_CHAR4            4&lt;br /&gt;
#define LCD_GC_CHAR5            5&lt;br /&gt;
#define LCD_GC_CHAR6            6&lt;br /&gt;
#define LCD_GC_CHAR7            7&lt;br /&gt;
 &lt;br /&gt;
// Set DD RAM Address --------- 0b1xxxxxxx  (Display Data RAM)&lt;br /&gt;
#define LCD_SET_DDADR           0x80&lt;br /&gt;
 &lt;br /&gt;
#endif &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Datei &#039;&#039;&#039;lcd-routines.c&#039;&#039;&#039;: ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus&lt;br /&gt;
// http://www.mikrocontroller.net/articles/HD44780&lt;br /&gt;
// http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung&lt;br /&gt;
//&lt;br /&gt;
// Die Pinbelegung ist über defines in lcd-routines.h einstellbar&lt;br /&gt;
 &lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;quot;lcd-routines.h&amp;quot;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Erzeugt einen Enable-Puls&lt;br /&gt;
static void lcd_enable( void )&lt;br /&gt;
{&lt;br /&gt;
    LCD_PORT |= (1&amp;lt;&amp;lt;LCD_EN);     // Enable auf 1 setzen&lt;br /&gt;
    _delay_us( LCD_ENABLE_US );  // kurze Pause&lt;br /&gt;
    LCD_PORT &amp;amp;= ~(1&amp;lt;&amp;lt;LCD_EN);    // Enable auf 0 setzen&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Sendet eine 4-bit Ausgabeoperation an das LCD&lt;br /&gt;
static void lcd_out( uint8_t data )&lt;br /&gt;
{&lt;br /&gt;
    data &amp;amp;= 0xF0;                       // obere 4 Bit maskieren&lt;br /&gt;
 &lt;br /&gt;
    LCD_PORT &amp;amp;= ~(0xF0&amp;gt;&amp;gt;(4-LCD_DB));    // Maske löschen&lt;br /&gt;
    LCD_PORT |= (data&amp;gt;&amp;gt;(4-LCD_DB));     // Bits setzen&lt;br /&gt;
    lcd_enable();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Initialisierung: muss ganz am Anfang des Programms aufgerufen werden.&lt;br /&gt;
void lcd_init( void )&lt;br /&gt;
{&lt;br /&gt;
    // verwendete Pins auf Ausgang schalten&lt;br /&gt;
    uint8_t pins = (0x0F &amp;lt;&amp;lt; LCD_DB) |           // 4 Datenleitungen&lt;br /&gt;
                   (1&amp;lt;&amp;lt;LCD_RS) |                // R/S Leitung&lt;br /&gt;
                   (1&amp;lt;&amp;lt;LCD_EN);                 // Enable Leitung&lt;br /&gt;
    LCD_DDR |= pins;&lt;br /&gt;
 &lt;br /&gt;
    // initial alle Ausgänge auf Null&lt;br /&gt;
    LCD_PORT &amp;amp;= ~pins;&lt;br /&gt;
 &lt;br /&gt;
    // warten auf die Bereitschaft des LCD&lt;br /&gt;
    _delay_ms( LCD_BOOTUP_MS );&lt;br /&gt;
    &lt;br /&gt;
    // Soft-Reset muss 3mal hintereinander gesendet werden zur Initialisierung&lt;br /&gt;
    lcd_out( LCD_SOFT_RESET );&lt;br /&gt;
    _delay_ms( LCD_SOFT_RESET_MS1 );&lt;br /&gt;
 &lt;br /&gt;
    lcd_enable();&lt;br /&gt;
    _delay_ms( LCD_SOFT_RESET_MS2 );&lt;br /&gt;
 &lt;br /&gt;
    lcd_enable();&lt;br /&gt;
    _delay_ms( LCD_SOFT_RESET_MS3 );&lt;br /&gt;
 &lt;br /&gt;
    // 4-bit Modus aktivieren &lt;br /&gt;
    lcd_out( LCD_SET_FUNCTION |&lt;br /&gt;
             LCD_FUNCTION_4BIT );&lt;br /&gt;
    _delay_ms( LCD_SET_4BITMODE_MS );&lt;br /&gt;
 &lt;br /&gt;
    // 4-bit Modus / 2 Zeilen / 5x7&lt;br /&gt;
    lcd_command( LCD_SET_FUNCTION |&lt;br /&gt;
                 LCD_FUNCTION_4BIT |&lt;br /&gt;
                 LCD_FUNCTION_2LINE |&lt;br /&gt;
                 LCD_FUNCTION_5X7 );&lt;br /&gt;
 &lt;br /&gt;
    // Display ein / Cursor aus / Blinken aus&lt;br /&gt;
    lcd_command( LCD_SET_DISPLAY |&lt;br /&gt;
                 LCD_DISPLAY_ON |&lt;br /&gt;
                 LCD_CURSOR_OFF |&lt;br /&gt;
                 LCD_BLINKING_OFF); &lt;br /&gt;
 &lt;br /&gt;
    // Cursor inkrement / kein Scrollen&lt;br /&gt;
    lcd_command( LCD_SET_ENTRY |&lt;br /&gt;
                 LCD_ENTRY_INCREASE |&lt;br /&gt;
                 LCD_ENTRY_NOSHIFT );&lt;br /&gt;
 &lt;br /&gt;
    lcd_clear();&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Sendet ein Datenbyte an das LCD&lt;br /&gt;
void lcd_data( uint8_t data )&lt;br /&gt;
{&lt;br /&gt;
    LCD_PORT |= (1&amp;lt;&amp;lt;LCD_RS);    // RS auf 1 setzen&lt;br /&gt;
 &lt;br /&gt;
    lcd_out( data );            // zuerst die oberen, &lt;br /&gt;
    lcd_out( data&amp;lt;&amp;lt;4 );         // dann die unteren 4 Bit senden&lt;br /&gt;
 &lt;br /&gt;
    _delay_us( LCD_WRITEDATA_US );&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Sendet einen Befehl an das LCD&lt;br /&gt;
void lcd_command( uint8_t data )&lt;br /&gt;
{&lt;br /&gt;
    LCD_PORT &amp;amp;= ~(1&amp;lt;&amp;lt;LCD_RS);    // RS auf 0 setzen&lt;br /&gt;
 &lt;br /&gt;
    lcd_out( data );             // zuerst die oberen, &lt;br /&gt;
    lcd_out( data&amp;lt;&amp;lt;4 );           // dann die unteren 4 Bit senden&lt;br /&gt;
 &lt;br /&gt;
    _delay_us( LCD_COMMAND_US );&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Sendet den Befehl zur Löschung des Displays&lt;br /&gt;
void lcd_clear( void )&lt;br /&gt;
{&lt;br /&gt;
    lcd_command( LCD_CLEAR_DISPLAY );&lt;br /&gt;
    _delay_ms( LCD_CLEAR_DISPLAY_MS );&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Sendet den Befehl: Cursor Home&lt;br /&gt;
void lcd_home( void )&lt;br /&gt;
{&lt;br /&gt;
    lcd_command( LCD_CURSOR_HOME );&lt;br /&gt;
    _delay_ms( LCD_CURSOR_HOME_MS );&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Setzt den Cursor in Spalte x (0..15) Zeile y (1..4) &lt;br /&gt;
 &lt;br /&gt;
void lcd_setcursor( uint8_t x, uint8_t y )&lt;br /&gt;
{&lt;br /&gt;
    uint8_t data;&lt;br /&gt;
 &lt;br /&gt;
    switch (y)&lt;br /&gt;
    {&lt;br /&gt;
        case 1:    // 1. Zeile&lt;br /&gt;
            data = LCD_SET_DDADR + LCD_DDADR_LINE1 + x;&lt;br /&gt;
            break;&lt;br /&gt;
 &lt;br /&gt;
        case 2:    // 2. Zeile&lt;br /&gt;
            data = LCD_SET_DDADR + LCD_DDADR_LINE2 + x;&lt;br /&gt;
            break;&lt;br /&gt;
 &lt;br /&gt;
        case 3:    // 3. Zeile&lt;br /&gt;
            data = LCD_SET_DDADR + LCD_DDADR_LINE3 + x;&lt;br /&gt;
            break;&lt;br /&gt;
 &lt;br /&gt;
        case 4:    // 4. Zeile&lt;br /&gt;
            data = LCD_SET_DDADR + LCD_DDADR_LINE4 + x;&lt;br /&gt;
            break;&lt;br /&gt;
 &lt;br /&gt;
        default:&lt;br /&gt;
            return;                                   // für den Fall einer falschen Zeile&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    lcd_command( data );&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Schreibt einen String auf das LCD&lt;br /&gt;
 &lt;br /&gt;
void lcd_string( const char *data )&lt;br /&gt;
{&lt;br /&gt;
    while( *data != &#039;\0&#039; )&lt;br /&gt;
        lcd_data( *data++ );&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Schreibt ein Zeichen in den Character Generator RAM&lt;br /&gt;
 &lt;br /&gt;
void lcd_generatechar( uint8_t code, const uint8_t *data )&lt;br /&gt;
{&lt;br /&gt;
    // Startposition des Zeichens einstellen&lt;br /&gt;
    lcd_command( LCD_SET_CGADR | (code&amp;lt;&amp;lt;3) );&lt;br /&gt;
 &lt;br /&gt;
    // Bitmuster übertragen&lt;br /&gt;
    for ( uint8_t i=0; i&amp;lt;8; i++ )&lt;br /&gt;
    {&lt;br /&gt;
        lcd_data( data[i] );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LCD Beispiel 1 ===&lt;br /&gt;
Ein Hauptprogramm, welches die LCD Funktionen benutzt, sieht zb. so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// &lt;br /&gt;
// Anpassungen im makefile:&lt;br /&gt;
//    ATMega8 =&amp;gt; MCU=atmega8 im makefile einstellen&lt;br /&gt;
//    lcd-routines.c in SRC = ... Zeile anhängen&lt;br /&gt;
// &lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;quot;lcd-routines.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  // Initialisierung des LCD&lt;br /&gt;
  // Nach der Initialisierung müssen auf dem LCD vorhandene schwarze Balken&lt;br /&gt;
  // verschwunden sein&lt;br /&gt;
  lcd_init();&lt;br /&gt;
&lt;br /&gt;
  // Text in einzelnen Zeichen ausgeben&lt;br /&gt;
  lcd_data( &#039;T&#039; );&lt;br /&gt;
  lcd_data( &#039;e&#039; );&lt;br /&gt;
  lcd_data( &#039;s&#039; );&lt;br /&gt;
  lcd_data( &#039;t&#039; );&lt;br /&gt;
&lt;br /&gt;
  // Die Ausgabemarke in die 2te Zeile setzen&lt;br /&gt;
  lcd_setcursor( 0, 2 );&lt;br /&gt;
&lt;br /&gt;
  // erneut Text ausgeben, aber diesmal komfortabler als String&lt;br /&gt;
  lcd_string(&amp;quot;Hello World!&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LCD Beispiel 2 ===&lt;br /&gt;
Ein Hauptprogramm, welches eine Variable ausgibt, sieht zb. so aus.&lt;br /&gt;
Mittels der itoa() Funktion (itoa = &amp;lt;b&amp;gt;I&amp;lt;/b&amp;gt;nteger &amp;lt;b&amp;gt;To&amp;lt;/b&amp;gt; &amp;lt;b&amp;gt;A&amp;lt;/b&amp;gt;scii ) wird von einem Zahlenwert eine textuelle Repräsentierung ermittelt (sprich: ein String erzeugt) und dieser String mit der bereits vorhandenen Funktion lcd_string ausgegeben. Das Einrichten des Projekts ist wie in Beispiel 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// &lt;br /&gt;
// Anpassungen im makefile:&lt;br /&gt;
//    ATMega8 =&amp;gt; MCU=atmega8 im makefile einstellen&lt;br /&gt;
//    lcd-routines.c in SRC = ... Zeile anhängen &lt;br /&gt;
// &lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;quot;lcd-routines.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Beispiel&lt;br /&gt;
int variable = 42;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  lcd_init();&lt;br /&gt;
&lt;br /&gt;
  // Ausgabe des Zeichens dessen ASCII-Code gleich dem Variablenwert ist&lt;br /&gt;
  // (Im Beispiel entspricht der ASCII-Code 42 dem Zeichen *)&lt;br /&gt;
  // http://www.code-knacker.de/ascii.htm&lt;br /&gt;
  lcd_data( variable );&lt;br /&gt;
&lt;br /&gt;
  lcd_setcursor( 0, 2 );&lt;br /&gt;
 &lt;br /&gt;
  // Ausgabe der Variable als Text in dezimaler Schreibweise&lt;br /&gt;
  {&lt;br /&gt;
     // ... umwandeln siehe FAQ Artikel bei http://www.mikrocontroller.net/articles/FAQ&lt;br /&gt;
     // WinAVR hat eine itoa()-Funktion, das erfordert obiges #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
     char Buffer[20]; // in diesem {} lokal&lt;br /&gt;
     itoa( variable, Buffer, 10 ); &lt;br /&gt;
&lt;br /&gt;
     // ... ausgeben  &lt;br /&gt;
     lcd_string( Buffer );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[Erweiterte LCD-Ansteuerung]]&lt;br /&gt;
* [[Pseudo-Graphische LCD-Ansteuerung]]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/316826#3431235 Ermittlung der Startadresse der einzelnen Zeilen]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/350554#3899961 LCD-Ansteuerung mit freier Wahl von Pins und Portregistern am Controller]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://homepage.hispeed.ch/peterfleury/avr-software.html#libs Lib zur HD44780 Ansteuerung (AVR)]&lt;br /&gt;
* [http://pic-projekte.de/wordpress/?p=908 Lib zur HD44780 Ansteuerung (PIC)]&lt;br /&gt;
* [http://www.nongnu.org/avr-libc/user-manual/group__stdiodemo.html Using the standard IO facilities] - Demoprojekt zur Text-LCD Ansteuerung (HD44780 komp.) in der avr-libc&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Avr-gcc Tutorial]]&lt;br /&gt;
[[Kategorie:LCD]]&lt;/div&gt;</summary>
		<author><name>Max5v</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Arithmetik8&amp;diff=90654</id>
		<title>AVR-Tutorial: Arithmetik8</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Arithmetik8&amp;diff=90654"/>
		<updated>2015-12-11T13:45:53Z</updated>

		<summary type="html">&lt;p&gt;Max5v: Vandalismus entfernt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine der Hauptaufgaben eines Mikrokontrollers bzw. eines Computers allgemein, ist es, irgendwelche Berechnungen anzustellen. Der Löwenanteil an den meisten Berechnungen entfällt dabei auf einfache Additionen bzw. Subtraktionen. Multiplikationen bzw. Divisionen kommen schon seltener vor, bzw. können oft durch entsprechende Additionen bzw. Subtraktionen ersetzt werden. Weitergehende mathematische Konstrukte werden zwar auch ab und an benötigt, können aber in der Assemblerprogrammierung durch geschickte Umformungen oft vermieden werden.&lt;br /&gt;
&lt;br /&gt;
== Hardwareunterstützung ==&lt;br /&gt;
&lt;br /&gt;
Praktisch alle Mikroprozessoren unterstützen Addition und Subtraktion direkt in Hardware, das heißt: Sie haben eigene Befehle dafür. Einige bringen auch Unterstützung für eine Hardwaremultiplikation mit (so zum Beispiel der [[ATmega8]]), während Division in Hardware schon seltener zu finden ist.&lt;br /&gt;
&lt;br /&gt;
== 8 Bit versus 16 Bit ==&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt des Tutorials wird gezielt auf 8 Bit Arithmetik eingegangen, um zunächst die Grundlagen des Rechnens mit einem µC zu zeigen. Die Erweiterung von 8 Bit auf 16 Bit Arithmetik ist in einigen Fällen wie Addition und Subtraktion trivial, kann sich aber bei Multiplikation und Division in einem beträchtlichen Codezuwachs niederschlagen.&lt;br /&gt;
&lt;br /&gt;
Der im Tutorial verwendete ATmega8 besitzt eine sog. 8-Bit Architektur. Das heißt, dass seine Rechenregister (mit Ausnahmen) nur 8 Bit breit sind und sich daher eine 8-Bit Arithmetik als die natürliche Form der Rechnerei auf diesem Prozessor anbietet. Berechnungen, die mehr als 8 Bit erfordern, müssen dann durch Kombinationen von Rechenvorgängen realisiert werden. Eine Analogie wäre z.&amp;amp;nbsp;B. das Rechnen, wie wir alle es in der Grundschule gelernt haben. Auch wenn wir in der Grundschule (in den Anfängen) nur die Additionen mit Zahlen kleiner als 10 auswendig gelernt haben, so können wir dennoch durch die Kombination von mehreren derartigen Additionen beliebig große Zahlen addieren. Das gleiche gilt für Multiplikationen. In der Grundschule musste wohl jeder von uns das &#039;Kleine Einmaleins&#039; auswendig lernen, um Multiplikationen im Zahlenraum bis 100 quasi &#039;in Hardware&#039; zu berechnen. Und doch können wir durch Kombinationen solcher Einfachmultiplikationen und zusätzlichen Additionen in beliebig große Zahlenräume vorstoßen.&lt;br /&gt;
&lt;br /&gt;
Die Einschränkung auf 8 Bit ist also keineswegs eine Einschränkung in dem Sinne, dass es eine prinzipielle Obergrenze für Berechnungen gäbe. Sie bedeutet lediglich eine obere Grenze dafür, bis zu welchen Zahlen in einem Rutsch gerechnet werden kann. Alles, was darüber hinausgeht, muss dann mittels Kombinationen von Berechnungen gemacht werden.&lt;br /&gt;
&lt;br /&gt;
== 8-Bit Arithmetik ohne Berücksichtigung eines Vorzeichens ==&lt;br /&gt;
&lt;br /&gt;
Die Bits des Registers besitzen dabei eine Wertigkeit, die sich aus der Stelle des Bits im Byte ergibt. Dies ist völlig analog zu dem uns vertrauten Dezimalsystem. Auch dort besitzt eine Ziffer in einer Zahl eine bestimmte Wertigkeit, je nach dem, an welcher Position diese Ziffer in der Zahl auftaucht. So hat z.&amp;amp;nbsp;B. die Ziffer 1 in der Zahl 12 die Wertigkeit &#039;Zehn&#039;, während sie in der Zahl 134 die Wertigkeit &#039;Hundert&#039; besitzt. Und so wie im Dezimalsystem die Wertigkeit einer Stelle immer das Zehnfache der Wertigkeit der Stelle unmittelbar rechts von ihr ist, so ist im Binärsystem die Wertigkeit einer Stelle immer das 2-fache der Stelle rechts von ihr.&lt;br /&gt;
&lt;br /&gt;
Die Zahl 4632 im Dezimalsystem kann also so aufgefasst werden:&lt;br /&gt;
&lt;br /&gt;
   4632  =     4 * 1000          ( 1000 = 10 hoch 3 )&lt;br /&gt;
            +  6 * 100           (  100 = 10 hoch 2 )&lt;br /&gt;
            +  3 * 10            (   10 = 10 hoch 1 )&lt;br /&gt;
            +  2 * 1             (    1 = 10 hoch 0 )&lt;br /&gt;
&lt;br /&gt;
=== Die Umwandlung von Binär in das Dezimalystem ===&lt;br /&gt;
&lt;br /&gt;
Völlig analog ergibt sich daher folgendes für z.&amp;amp;nbsp;B. die 8 Bit Binärzahl &amp;lt;b&amp;gt;0b10011011&amp;lt;/b&amp;gt; (um Binärzahlen von Dezimalzahlen zu unterscheiden, wird ein &amp;lt;b&amp;gt;0b&amp;lt;/b&amp;gt; vorangestellt):&lt;br /&gt;
&lt;br /&gt;
  0b10011011     =    1 * 128    ( 128 = 2 hoch 7 )&lt;br /&gt;
                   +  0 * 64     (  64 = 2 hoch 6 )&lt;br /&gt;
                   +  0 * 32     (  32 = 2 hoch 5 )&lt;br /&gt;
                   +  1 * 16     (  16 = 2 hoch 4 )&lt;br /&gt;
                   +  1 * 8      (   8 = 2 hoch 3 )&lt;br /&gt;
                   +  0 * 4      (   4 = 2 hoch 2 )&lt;br /&gt;
                   +  1 * 2      (   2 = 2 hoch 1 )&lt;br /&gt;
                   +  1 * 1      (   1 = 2 hoch 0 )&lt;br /&gt;
&lt;br /&gt;
Ausgerechnet (um die entsprechende Dezimalzahl zu erhalten) ergibt das&lt;br /&gt;
128 + 16 + 8 + 2 + 1 = 155. Die Binärzahl &amp;lt;b&amp;gt;0b10011011&amp;lt;/b&amp;gt; entspricht also der Dezimalzahl &amp;lt;b&amp;gt;155&amp;lt;/b&amp;gt;. Es ist wichtig, sich klar zu machen, dass es zwischen Binär- und Dezimalzahlen keinen grundsätzlichen Unterschied gibt. Beides sind nur verschiedene Schreibweisen für das Gleiche: Eine Zahl. Während wir Menschen an das Dezimalsystem gewöhnt sind, ist das Binärsystem für einen Computer geeigneter, da es nur aus den 2 Ziffern 0 und 1 besteht, welche sich leicht in einem Computer darstellen lassen (Spannung, keine Spannung).&lt;br /&gt;
&lt;br /&gt;
Welches ist nun die größte Zahl, die mit 8 Bit dargestellt werden kann? Dabei handelt es sich offensichtlich um die Zahl &amp;lt;b&amp;gt;0b11111111&amp;lt;/b&amp;gt;. In Dezimalschreibweise wäre das die Zahl&lt;br /&gt;
&lt;br /&gt;
    0b11111111   =   1  *  128&lt;br /&gt;
                   + 1  *  64&lt;br /&gt;
                   + 1  *  32&lt;br /&gt;
                   + 1  *  16&lt;br /&gt;
                   + 1  *  8&lt;br /&gt;
                   + 1  *  4&lt;br /&gt;
                   + 1  *  2&lt;br /&gt;
                   + 1  *  1&lt;br /&gt;
&lt;br /&gt;
oder ausgerechnet: &amp;lt;b&amp;gt;255&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird also mit 8 Bit Arithmetik betrieben, wobei alle 8 Bit als signifikante Ziffern benutzt werden (also kein Vorzeichenbit, dazu später mehr), so kann damit im Zahlenraum &amp;lt;b&amp;gt;0&amp;lt;/b&amp;gt; bis &amp;lt;b&amp;gt;255&amp;lt;/b&amp;gt; gerechnet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Binär          Dezimal               Binär         Dezimal&lt;br /&gt;
&lt;br /&gt;
   0b00000000        0                 0b10000000       128&lt;br /&gt;
   0b00000001        1                 0b10000001       129&lt;br /&gt;
   0b00000010        2                 0b10000010       130&lt;br /&gt;
   0b00000011        3                 0b10000011       131&lt;br /&gt;
   0b00000100        4                 0b10000100       132&lt;br /&gt;
   0b00000101        5                 0b10000101       133&lt;br /&gt;
     ...                                      ...&lt;br /&gt;
   0b01111100      124                 0b11111100       252&lt;br /&gt;
   0b01111101      125                 0b11111101       253&lt;br /&gt;
   0b01111110      126                 0b11111110       254&lt;br /&gt;
   0b01111111      127                 0b11111111       255&lt;br /&gt;
&lt;br /&gt;
=== Die Umwandlung von Dezimal in das Binärsystem ===&lt;br /&gt;
&lt;br /&gt;
Aus dem vorhergehenden ergibt sich völlig zwanglos die Vorschrift, wie Binärzahlen ins Dezimalsystem umgewandelt werden können (nicht vergessen: Die Zahl selber wird ja gar nicht verändert. Binär- und Dezimalsystem sind ja nur verschiedene Schreibweisen): Durch Anwendung der Vorschrift, wie denn eigentlich ein Stellenwertsystem aufgebaut ist.&lt;br /&gt;
Aber wie macht man den umgekehrten Schritt, die Wandlung vom Dezimal ins Binärsystem. Der Weg führt über die Umkehrung des vorhergehenden Prinzips. Fortgesetzte Division durch 2&lt;br /&gt;
&lt;br /&gt;
Es sei die Zahl 92 ins Binärsystem zu wandeln.&lt;br /&gt;
&lt;br /&gt;
     92 / 2   =   46   Rest 0&lt;br /&gt;
     46 / 2   =   23   Rest 0&lt;br /&gt;
     23 / 2   =   11   Rest 1&lt;br /&gt;
     11 / 2   =    5   Rest 1&lt;br /&gt;
      5 / 2   =    2   Rest 1&lt;br /&gt;
      2 / 2   =    1   Rest 0&lt;br /&gt;
      1 / 2   =    0   Rest 1&lt;br /&gt;
&lt;br /&gt;
Die Division wird solange durchgeführt, bis sich ein Divisionergebnis von 0 ergibt. Die Reste, von unten nach oben gelesen, ergeben dann die Binärzahl. Die zu 92 gehörende Binärzahl lautet also 1011100. Es wird noch eine führende 0 ergänzt um sie auf die standardmässigen 8-Bit zu bringen: &amp;lt;b&amp;gt;0b01011100&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 8-Bit Arithmetik mit Berücksichtigung eines Vorzeichens ==&lt;br /&gt;
&lt;br /&gt;
Soll mit Vorzeichen (also positiven und negativen Zahlen) gerechnet werden, so erhebt sich die Frage: Wie werden eigentlich positive bzw. negative Zahlen dargestellt? Alles was wir haben sind ja 8 Bit in einem Byte.&lt;br /&gt;
&lt;br /&gt;
=== Problem der Kodierung des Vorzeichens ===&lt;br /&gt;
&lt;br /&gt;
Die Lösung des Problems besteht darin, dass ein Bit zur Anzeige des Vorzeichens benutzt wird. Im Regelfall wird dazu das am weitesten links stehende Bit benutzt. Von den verschiedenen Möglichkeiten, die sich hiermit bieten, wird in der Praxis fast ausschließlich mit dem sog. 2-er Komplement gearbeitet, da es Vorteile bei der Addition bzw. Subtraktion von Zahlen bringt. In diesem Fall muß nämlich das Vorzeichen einer Zahl überhaupt nicht berücksichtigt werden. Durch die Art und Weise der Bildung von negativen Zahlen kommt am Ende das Ergebnis mit dem korrekten Vorzeichen heraus.&lt;br /&gt;
&lt;br /&gt;
=== 2-er Komplement ===&lt;br /&gt;
&lt;br /&gt;
Das 2-er Komplement verwendet das höchstwertige Bit eines Byte, das sog. MSB (= &amp;lt;b&amp;gt;M&amp;lt;/b&amp;gt;ost &amp;lt;b&amp;gt;S&amp;lt;/b&amp;gt;ignificant &amp;lt;b&amp;gt;B&amp;lt;/b&amp;gt;it) zur Anzeige des Vorzeichens. Ist dieses Bit 0, so ist die Zahl positiv. Ist es 1, so handelt es sich um eine negative Zahl. Die 8-Bit Kombination &amp;lt;b&amp;gt;0b10010011&amp;lt;/b&amp;gt; stellt also eine negative Zahl dar, &amp;lt;b&amp;gt;wenn und nur wenn diese Bitkombination überhaupt als vorzeichenbehaftete Zahl aufgefasst werden soll&amp;lt;/b&amp;gt;. Anhand der Bitkombination alleine ist es also nicht möglich, eine definitive Aussage zu treffen, ob es sich um eine vorzeichenbehaftete Zahl handelt oder nicht. Erst wenn durch den Zusammenhang klar ist, dass man es mit vorzeichenbehafteten Zahlen zu tun hat, bekommt das MSB die Sonderbedeutung des Vorzeichens.&lt;br /&gt;
&lt;br /&gt;
Um bei einer Zahl das Vorzeichen zu wechseln, geht man wie folgt vor:&lt;br /&gt;
* Zunächst wird das 1-er Komplement gebildet, indem alle Bits umgedreht werden. Aus 0 wird 1 und aus 1 wird 0&lt;br /&gt;
* Danach wird aus diesem Zwischenergebnis das 2-er Komplement gebildet, indem noch 1 addiert wird.&lt;br /&gt;
&lt;br /&gt;
Diese Vorschrift kann immer dann benutzt werden, wenn das Vorzeichen einer Zahl gewechselt werden soll. Er macht aus positiven Zahlen negative und aus negativen Zahlen positive.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; Es soll die Binärdarstellung für -92 gebildet werden. Dazu benötigt man zunächst die Binärdarstellung für +92, welche &amp;lt;b&amp;gt;0b01011100&amp;lt;/b&amp;gt; lautet. Diese wird jetzt nach der Vorschrift für 2-er Komplemente negiert und damit negativ gemacht.&lt;br /&gt;
&lt;br /&gt;
   0b01011100            Ausgangszahl&lt;br /&gt;
   0b10100011            1-er Komplement, alle Bits umdrehen&lt;br /&gt;
   0b10100100            noch 1 addieren&lt;br /&gt;
&lt;br /&gt;
Die Binärdarstellung für -92 lautet also &amp;lt;b&amp;gt;0b10100100&amp;lt;/b&amp;gt;. Das gesetzte MSB weist diese Binärzahl auch tatsächlich als negative Zahl aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; Gegeben sei die Binärzahl &amp;lt;b&amp;gt;0b00111000&amp;lt;/b&amp;gt;, welche als vorzeichenbehaftete Zahl anzusehen ist. Welcher Dezimalzahl entspricht diese Binärzahl?&lt;br /&gt;
&lt;br /&gt;
Da das MSB nicht gesetzt ist, handelt es sich um eine positive Zahl und die Umrechnung kann wie im Fall der vorzeichenlosen 8-Bit Zahlen erfolgen. Das Ergebnis lautet also +56 ( = 0 * 128 + 0 * 64 + 1 * 32 + 1 * 16 + 1 * 8 + 0 * 4 + 0 * 2 + 0 * 1 )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; Gegeben sei die Binärzahl &amp;lt;b&amp;gt;0b10011001&amp;lt;/b&amp;gt;, welche als vorzeichenbehaftete Zahl anzusehen ist. Welcher Dezimalzahl entspricht diese Binärzahl?&lt;br /&gt;
&lt;br /&gt;
Da das MSB gesetzt ist, handelt es sich um eine negative Zahl. Daher wird diese Zahl zunächst negiert um dadurch eine positive Zahl zu erhalten.&lt;br /&gt;
&lt;br /&gt;
    0b10011001       Originalzahl&lt;br /&gt;
    0b01100110       1-er Komplement, alle Bits umdrehen&lt;br /&gt;
    0b01100111       2-er Komplement, noch 1 addiert&lt;br /&gt;
&lt;br /&gt;
Die zu 0b10011001 gehörende positive Binärzahl lautet also 0b01100111. Da es sich um eine positive Zahl handelt, kann sie wiederum ganz normal, wie vorzeichenlose Zahlen, in eine Dezimalzahl umgerechnet werden. Das Ergebnis lautet 103 ( = 0 * 128 + 1 * 64 + 1 * 32 + 0 * 16 + 0 * 8 + 1 * 4 + 1 * 2 + 1 * 1). Da aber von einer negativen Zahl ausgegangen wurde, ist &amp;lt;b&amp;gt;0b10011001&amp;lt;/b&amp;gt; die binäre Darstellung der Dezimalzahl -103.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; Gegeben sei dieselbe Binärzahl &amp;lt;b&amp;gt;0b10011001&amp;lt;/b&amp;gt;. Aber diesmal sei sie als vorzeichenlose Zahl aufzufassen. Welcher Dezimalzahl entspricht diese Binärzahl?&lt;br /&gt;
&lt;br /&gt;
Da die Binärzahl als vorzeichenlose Zahl aufzufassen ist, hat das MSB keine spezielle Bedeutung. Die Umrechnung erfolgt also ganz normal: 0b10011001 = 1 * 128 + 0 * 64 + 0 * 32 + 1 * 16 + 1 * 8 + 0 * 4 + 0 * 2 + 1 * 1 = 153.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; Wie lautet die Binärzahl zu -74?&lt;br /&gt;
&lt;br /&gt;
Da es sich hier offensichtlich im eine vorzeichenbehaftete Zahl handelt, müssen die Regeln des 2-er Komplemnts angewendet werden. Zunächst ist also die Binärrepräsentierung von +74 zu bestimmen, welche dann durch Anwendung des 2-er Komplements negiert wird.&lt;br /&gt;
&lt;br /&gt;
  74 / 2 = 37  Rest 0&lt;br /&gt;
  37 / 2 = 18  Rest 1&lt;br /&gt;
  18 / 2 =  9  Rest 0&lt;br /&gt;
   9 / 2 =  4  Rest 1&lt;br /&gt;
   4 / 2 =  2  Rest 0&lt;br /&gt;
   2 / 2 =  1  Rest 0&lt;br /&gt;
   1 / 2 =  0  Rest 1&lt;br /&gt;
&lt;br /&gt;
Die Binärdarstellung für +74 lautet daher &amp;lt;b&amp;gt;0b01001010&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    0b01001010     +74&lt;br /&gt;
    0b10110101     1-er Komplement, alle Bits umdrehen&lt;br /&gt;
    0b10110110     noch 1 addieren&lt;br /&gt;
&lt;br /&gt;
Die Binärdarstellung für -74 lautet daher &amp;lt;b&amp;gt;0b10110110&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Arithmetikflags ==&lt;br /&gt;
&lt;br /&gt;
Im Statusregister des Prozessors gibt es eine Reihe von Flags, die durch Rechenergebnisse beeinflusst werden, bzw. in Berechnungen einfließen können.&lt;br /&gt;
&lt;br /&gt;
=== Carry ===&lt;br /&gt;
Das Carry-Flag &#039;&#039;&#039;C&#039;&#039;&#039; zeigt an, ob bei einer Berechnung mit vorzeichenlosen Zahlen ein Über- oder Unterlauf erfolgt ist, d.h. das Ergebnis der Berechnung liegt außerhalb des darstellbaren Bereiches 0...255.&lt;br /&gt;
&lt;br /&gt;
Wie das?&lt;br /&gt;
&lt;br /&gt;
Angenommen es müssen zwei 8-Bit-Zahlen addiert werden.&lt;br /&gt;
&lt;br /&gt;
    10100011&lt;br /&gt;
  + 11110011&lt;br /&gt;
   ---------&lt;br /&gt;
   110010110&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis der Addition umfasst neun Bit und liegt außerhalb des in einem Register darstellbaren Zahlenbereiches 0...255; die Addition &#039;&#039;ist übergelaufen&#039;&#039;.  &lt;br /&gt;
&lt;br /&gt;
Werden dieselben Zahlen subtrahiert,&lt;br /&gt;
&lt;br /&gt;
    10100011&lt;br /&gt;
  - 11110011&lt;br /&gt;
   ---------&lt;br /&gt;
    10110000&lt;br /&gt;
&lt;br /&gt;
verbleibt an der höchstwertigsten Stelle ein &amp;quot;geborgtes&amp;quot; Bit, welches durch das Carry angezeigt wird.&lt;br /&gt;
&lt;br /&gt;
=== Signed- und Overflowflag ===&lt;br /&gt;
Wird mit vorzeichenbehafteten Zahlen gerechnet, so wird das Verlassen des 8-Bit-Zahlenbereiches -128...+127 durch die Flags &#039;&#039;&#039;S&#039;&#039;&#039; und &#039;&#039;&#039;V&#039;&#039;&#039; angezeigt. Der Prozessor selbst unterscheidet nicht zwischen vorzeichenlosen und -behafteten Zahlen. Der Programmierer legt durch Wahl der ausgewerteten Flags (C bei vorzeichenlosen bzw. S/V bei vorzeichenbehafteten) die Interpretation der Zahlen fest.&lt;br /&gt;
&lt;br /&gt;
=== Weitere Flags ===&lt;br /&gt;
Das Zero-Flag &#039;&#039;&#039;Z&#039;&#039;&#039; wird gesetzt, wenn das 8-Bit-Ergebnis der Berechnung null ist. Dies kann bei der Addition auch durch Überlauf geschehen, was durch ein zusätzliches Carryflag angezeigt wird.&lt;br /&gt;
&lt;br /&gt;
Das Negative-Flag &#039;&#039;&#039;N&#039;&#039;&#039; wird gesetzt, wenn im Ergebnis das höchstwertige Bit gesetzt ist. Bei vorzeichenbehafteter Arithmetik ist dies als negative Zahl zu interpretieren, sofern nicht durch das V-Flag ein Verlassen des Zahlbereichs angezeigt wird.&lt;br /&gt;
&lt;br /&gt;
Das Half-Carry-Flag &#039;&#039;&#039;H&#039;&#039;&#039; zeigt, analog zum Carry-Flag, einen Übertrag zwischen Bit 3 und 4 an. Dies kann in speziellen Anwendungen (z.&amp;amp;nbsp;B. zwei simultane Vier-Bit-Berechnungen mit einem Befehl) nützlich sein.&lt;br /&gt;
&lt;br /&gt;
=== Übersicht über die arithmetischen Flags ===&lt;br /&gt;
&lt;br /&gt;
Ergebnis des Befehls &#039;&#039;&#039;ADD Rd, Rr&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
          Rr|    0 |    1 |   64 |  127 |  128 |  129 |  192 |  255&lt;br /&gt;
   Rd       |(  +0)|(  +1)|( +64)|(+127)|(-128)|(-127)|( -64)|(  -1)&lt;br /&gt;
  ----------+------+------+------+------+------+------+------+------&lt;br /&gt;
    0 (  +0)|    Z |      |      |      |S N   |S N   |S N   |S N&lt;br /&gt;
    1 (  +1)|      |      |      | VN   |S N   |S N   |S N   |   CZ&lt;br /&gt;
   64 ( +64)|      |      | VN   | VN   |S N   |S N   |   CZ |   C&lt;br /&gt;
  127 (+127)|      | VN   | VN   | VN   |S N   |   CZ |   C  |   C&lt;br /&gt;
  128 (-128)|S N   |S N   |S N   |S N   |SV CZ |SV C  |SV C  |SV C&lt;br /&gt;
  129 (-127)|S N   |S N   |S N   |   CZ |SV C  |SV C  |SV C  |S NC&lt;br /&gt;
  192 ( -64)|S N   |S N   |   CZ |   C  |SV C  |SV C  |S NC  |S NC&lt;br /&gt;
  255 (  -1)|S N   |   CZ |   C  |   C  |SV C  |S NC  |S NC  |S NC&lt;br /&gt;
&lt;br /&gt;
Man erkennt: C=1 genau dann wenn die Addition Rd + Rr mit vorzeichenlosen Zahlen überläuft.  V=1 genau dann wenn die Addition mit vorzeichenbehafteten Zahlen überläuft.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ergebnis des Befehls &#039;&#039;&#039;SUB Rd, Rr&#039;&#039;&#039; bzw. &#039;&#039;&#039;CP Rd, Rr&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
          Rr|    0 |   63 |   64 |  127 |  128 |  191 |  192 |  255&lt;br /&gt;
   Rd       |(  +0)|( +63)|( +64)|(+127)|(-128)|( -65)|( -64)|(  -1)&lt;br /&gt;
  ----------+------+------+------+------+------+------+------+------&lt;br /&gt;
    0 (  +0)|    Z |S NC  |S NC  |S NC  | VNC  |   C  |   C  |   C&lt;br /&gt;
   63 ( +63)|      |    Z |S NC  |S NC  | VNC  | VNC  |   C  |   C&lt;br /&gt;
   64 ( +64)|      |      |    Z |S NC  | VNC  | VNC  | VNC  |   C&lt;br /&gt;
  127 (+127)|      |      |      |    Z | VNC  | VNC  | VNC  | VNC&lt;br /&gt;
  128 (-128)|S N   |SV    |SV    |SV    |    Z |S NC  |S NC  |S NC&lt;br /&gt;
  191 ( -65)|S N   |S N   |SV    |SV    |      |    Z |S NC  |S NC&lt;br /&gt;
  192 ( -64)|S N   |S N   |S N   |SV    |      |      |    Z |S NC&lt;br /&gt;
  255 (  -1)|S N   |S N   |S N   |S N   |      |      |      |    Z&lt;br /&gt;
&lt;br /&gt;
Man erkennt: C=1 genau dann wenn die Subtraktion Rd - Rr mit vorzeichenlosen Zahlen unterläuft; äquivalent dazu ist Rd &amp;lt; Rr (vorzeichenlos).  S=1 genau dann wenn die Subtraktion mit vorzeichenbehafteten Zahlen unterläuft bzw. Rd &amp;gt; Rr (vorzeichenbehaftet).&lt;br /&gt;
&lt;br /&gt;
== Inkrementieren / Dekrementieren ==&lt;br /&gt;
&lt;br /&gt;
Erstaunlich viele Operationen in einem Computer-Programm entfallen auf die Operationen &#039;Zu einer Zahl 1 addieren&#039; bzw. &#039;Von einer Zahl 1 subtrahieren&#039;. Dementsprechend enthalten die meisten Mikroprozessoren die Operationen &#039;&#039;Inkrementieren&#039;&#039; (um 1 erhöhen) bzw. &#039;&#039;Dekrementieren&#039;&#039; (um 1 verringern) als eigenständigen Assemblerbefehl. So auch der ATmega8.&lt;br /&gt;
&lt;br /&gt;
=== AVR-Befehle ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
        inc  r16&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bzw.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
        dec  r16&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Operation ist einfach zu verstehen. Das jeweils angegebene Register (hier wieder am Register r16 gezeigt) wird um 1 erhöht bzw. um 1 verringert. Dabei wird die Zahl im Register als vorzeichenlose Zahl angesehen. Enthält das Register bereits die größtmögliche Zahl (0b11111111 oder dezimal 255), so erzeugt ein weiteres Inkrementieren die kleinstmögliche Zahl (0b00000000 oder dezimal 0) bzw. umgekehrt dekrementiert 0 zu 255.&lt;br /&gt;
&lt;br /&gt;
== Addition ==&lt;br /&gt;
Auf einem Mega8 gibt es nur eine Möglichkeit, um eine Addition durchzuführen: Die beiden zu addierenden Zahlen müssen in zwei Registern stehen.&lt;br /&gt;
&lt;br /&gt;
=== AVR-Befehle ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
     add  r16, r17      ; Addition der Register r16 und r17. Das Ergebnis wird&lt;br /&gt;
                        ; im Register r16 abgelegt&lt;br /&gt;
     adc  r16, r17      ; Addition der Register r16 und r17, wobei das Carry-Bit&lt;br /&gt;
                        ; noch zusätzlich mit addiert wird.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei der Addition zweier Register wird ein möglicher Überlauf in allen Fällen im Carry Bit abgelegt. Daraus erklärt sich dann auch das Vorhandensein eines Additionsbefehls, der das Carry-Bit noch zusätzlich mitaddiert: Man benötigt ihn zum Aufbau einer Addition die mehr als 8 Bit umfasst. Die niederwertigsten Bytes werden mit einem &amp;lt;b&amp;gt;add&amp;lt;/b&amp;gt; addiert und alle weiteren höherwertigen Bytes werden, vom Niederwertigsten zum Höchstwertigsten, mittels &amp;lt;b&amp;gt;adc&amp;lt;/b&amp;gt; addiert. Dadurch werden eventuelle Überträge automatisch berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
== Subtraktion ==&lt;br /&gt;
Subtraktionen können auf einem AVR in zwei unterschiedlichen Arten ausgeführt werden. Entweder es werden zwei Register voneinander subtrahiert oder es wird von einem Register eine konstante Zahl abgezogen. Beide Varianten gibt es wiederum in den Ausführungen mit und ohne Berücksichtigung des Carry Flags&lt;br /&gt;
&lt;br /&gt;
=== AVR-Befehle ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
     sub  r16, r17      ; Subtraktion des Registers r17 von r16. Das Ergebnis wird&lt;br /&gt;
                        ; im Register r16 abgelegt&lt;br /&gt;
     sbc  r16, r17      ; Subtraktion des Registers r17 von r16, wobei das Carry-Bit&lt;br /&gt;
                        ; noch zusätzlich mit subtrahiert wird. Das Ergebnis wird&lt;br /&gt;
                        ; im Register r16 abgelegt&lt;br /&gt;
     subi r16, zahl     ; Die Zahl (als Konstante) wird vom Register r16 subtrahiert.&lt;br /&gt;
                        ; Das Ergebnis wird im Register r16 abgelegt&lt;br /&gt;
     sbci r16, zahl     ; Subtraktion einer konstanten Zahl vom Register r16, wobei&lt;br /&gt;
                        ; zusätzlich noch das Carry-Bit mit subtrahiert wird.&lt;br /&gt;
                        ; Das Ergebnis wird im Register r16 abgelegt.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Multiplikation ==&lt;br /&gt;
Multiplikation kann auf einem AVR je nach konkretem Typ auf zwei unterschiedliche Arten ausgeführt werden. Während die größeren ATMega Prozessoren über einen Hardwaremultiplizierer verfügen, ist dieser bei den kleineren Tiny Prozessoren nicht vorhanden. Hier muß die Multiplikation quasi zu Fuß durch entsprechende Addition von Teilresultaten erfolgen.&lt;br /&gt;
&lt;br /&gt;
=== Hardwaremultiplikation ===&lt;br /&gt;
Vorzeichenbehaftete und vorzeichenlose Zahlen werden unterschiedlich multipliziert. Denn im Falle eines Vorzeichens darf ein gesetztes 7. Bit natürlich nicht in die eigentliche Berechnung mit einbezogen werden. Statt dessen steuert dieses Bit (eigentlich die beiden MSB der beiden beteiligten Zahlen) das Vorzeichen des Ergebnisses. Die Hardwaremultiplikation ist auch dahingehend eingeschränkt, dass das Ergebnis einer Multiplikation immer in den Registerpärchen &#039;&#039;r0&#039;&#039; und &#039;&#039;r1&#039;&#039; zu finden ist. Dabei steht das LowByte (also die unteren 8 Bit) des Ergebnisses in &#039;&#039;r0&#039;&#039; und das HighByte in &#039;&#039;r1&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== AVR-Befehl ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    mul   r16, r17      ; multipliziert r16 mit r17. Beide Registerinhalte werden&lt;br /&gt;
                        ; als vorzeichenlose Zahlen aufgefasst.&lt;br /&gt;
                        ; Das Ergebnis der Multiplikation ist in den Registern r0 und r1&lt;br /&gt;
                        ; zu finden.&lt;br /&gt;
&lt;br /&gt;
    muls  r16, r17      ; multipliziert r16 mit r17. Beide Registerinhalte werden&lt;br /&gt;
                        ; als vorzeichenbehaftete Zahlen aufgefasst.&lt;br /&gt;
                        ; Das Ergebnis der Multiplikation ist in den Registern r0 und r1&lt;br /&gt;
                        ; zu finden und stellt ebenfalls eine vorzeichenbehaftete&lt;br /&gt;
                        ; Zahl dar.&lt;br /&gt;
&lt;br /&gt;
    mulsu r16, r17      ; multipliziert r16 mit r17, wobei r16 als vorzeichenbehaftete&lt;br /&gt;
                        ; Zahl aufgefasst wird und r17 als vorzeichenlose Zahl.&lt;br /&gt;
                        ; Das Ergebnis der Multiplikation ist in den Registern r0 und r1&lt;br /&gt;
                        ; zu finden und stellt eine vorzeichenbehaftete Zahl dar.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Multiplikation in Software ===&lt;br /&gt;
Multiplikation in Software ist nicht weiter schwierig. Man erinnere sich daran, wie Multiplikationen in der Grundschule gelehrt wurden:&lt;br /&gt;
Zunächst stand da das kleine Einmal-Eins, welches auswendig gelernt wurde. Mit diesen Kenntnissen konnten dann auch größere Multiplikationen angegangen werden, indem der Multiplikand mit jeweils einer Stelle des Multiplikators multipliziert wurde und die Zwischenergebnisse, geeignet verschoben, addiert wurden. Die Verschiebung um eine Stelle entspricht dabei einer Multiplikation mit 10.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; Zu multiplizieren sei 3456 * 7812&lt;br /&gt;
&lt;br /&gt;
       3456     * 7812&lt;br /&gt;
       ---------------&lt;br /&gt;
      24192     &amp;lt;-+|||&lt;br /&gt;
  +    27648    &amp;lt;--+||&lt;br /&gt;
  +      3456   &amp;lt;---+|&lt;br /&gt;
  +       6912  &amp;lt;----+&lt;br /&gt;
      --------&lt;br /&gt;
      26998272&lt;br /&gt;
&lt;br /&gt;
Im Binärsystem funktioniert Multiplikation völlig analog. Nur ist hier das kleine Einmaleins sehr viel einfacher! Es gibt nur 4 Multiplikationen (anstatt 100 im Dezimalsystem):&lt;br /&gt;
&lt;br /&gt;
    0 * 0   = 0&lt;br /&gt;
    0 * 1   = 0&lt;br /&gt;
    1 * 0   = 0&lt;br /&gt;
    1 * 1   = 1&lt;br /&gt;
&lt;br /&gt;
Es gibt lediglich einen kleinen Unterschied gegenüber dem Dezimalsystem: Anstatt zunächst alle Zwischenergebnisse aufzulisten und erst danach die Summe zu bestimmen, werden wir ein neues Zwischenergebnis gleich in die Summe einrechnen. Dies deshalb, da Additionen von mehreren Zahlen im Binärsystem im Kopf sehr leicht zu Flüchtigkeitsfehlern führen (durch die vielen 0-en und 1-en). Weiters wird eine einfache Tatsache benutzt: 1 mal eine Zahl ergibt wieder die Zahl, während 0 mal eine Zahl immer 0 ergibt. Dadurch braucht man im Grunde bei einer Multiplikation überhaupt nicht zu multiplizieren, sondern eigentlich nur die Entscheidung treffen: Muss die Zahl geeignet verschoben addiert werden oder nicht?&lt;br /&gt;
&lt;br /&gt;
    0b00100011         * 0b10001001&lt;br /&gt;
    --------------------------------&lt;br /&gt;
      00100011          &amp;lt;--+|||||||&lt;br /&gt;
 +     00000000         &amp;lt;---+||||||&lt;br /&gt;
      ---------              ||||||&lt;br /&gt;
      001000110              ||||||&lt;br /&gt;
 +      00000000        &amp;lt;----+|||||&lt;br /&gt;
      ----------              |||||&lt;br /&gt;
      0010001100              |||||&lt;br /&gt;
 +       00000000       &amp;lt;-----+||||&lt;br /&gt;
      -----------              ||||&lt;br /&gt;
      00100011000              ||||&lt;br /&gt;
 +        00100011      &amp;lt;------+|||&lt;br /&gt;
      ------------              |||&lt;br /&gt;
      001001010011              |||&lt;br /&gt;
 +         00000000     &amp;lt;-------+||&lt;br /&gt;
      -------------              ||&lt;br /&gt;
      0010010100110              ||&lt;br /&gt;
 +          00000000    &amp;lt;--------+|&lt;br /&gt;
      --------------              |&lt;br /&gt;
      00100101001100              |&lt;br /&gt;
 +           00100011   &amp;lt;---------+&lt;br /&gt;
      ---------------&lt;br /&gt;
      001001010111011&lt;br /&gt;
&lt;br /&gt;
Man sieht auch, wie bei der Multiplikation zweier 8 Bit Zahlen sehr schnell ein 16 Bit Ergebnis entsteht. Dies ist auch der Grund, warum die Hardwaremultiplikation immer 2 Register zur Aufnahme des Ergebnisses benötigt.&lt;br /&gt;
&lt;br /&gt;
Ein Assembler Code, der diese Strategie im Wesentlichen verwirklicht, sieht z.&amp;amp;nbsp;B. so aus. Dieser Code wurde nicht auf optimale Laufzeit getrimmt, sondern es soll im Wesentlichen eine 1:1 Umsetzung des oben gezeigten Schemas sein. Einige der verwendeten Befehle wurden im Rahmen dieses Tutorials an dieser Stelle noch nicht besprochen. Speziell die Schiebe- (&amp;lt;b&amp;gt;lsl&amp;lt;/b&amp;gt;) und Rotier- (&amp;lt;b&amp;gt;rol&amp;lt;/b&amp;gt;) Befehle sollten in der AVR Befehlsübersicht genau studiert werden, um ihr Zusammenspiel mit dem Carry Flag zu verstehen. Nur soviel als Hinweis: Das Carry Flag dient in der &amp;lt;b&amp;gt;lsl&amp;lt;/b&amp;gt; / &amp;lt;b&amp;gt;rol&amp;lt;/b&amp;gt; Sequenz als eine Art Zwischenspeicher, um das höherwertigste Bit aus dem Register r0 beim Verschieben in das Register r1 verschieben zu können. Der &amp;lt;b&amp;gt;lsl&amp;lt;/b&amp;gt; verschiebt alle Bits des Registers um 1 Stelle nach links, wobei das vorhergehende MSB ins Carry Bit wandert und rechts ein 0-Bit nachrückt. Der &amp;lt;b&amp;gt;rol&amp;lt;/b&amp;gt; verschiebt ebenfalls alle Stellen eines Registers um 1 Stelle nach links. Diesmal wird aber rechts nicht mit einem 0-Bit aufgefüllt, sondern an dieser Stelle wird der momentane Inhalt des Carry Bits eingesetzt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    ldi  r16, 0b00100011  ; Multiplikator&lt;br /&gt;
    ldi  r17, 0b10001001  ; Multiplikand&lt;br /&gt;
                          ; Berechne r16 * r17&lt;br /&gt;
&lt;br /&gt;
    ldi  r18, 8          ; 8 mal verschieben und gegebenenfalls addieren&lt;br /&gt;
    clr  r19             ; 0 wird für die 16 Bit Addition benötigt&lt;br /&gt;
    clr  r0              ; Ergebnis Low Byte auf 0 setzen&lt;br /&gt;
    clr  r1              ; Ergebnis High Byte auf 0 setzen&lt;br /&gt;
&lt;br /&gt;
mult:&lt;br /&gt;
    lsl  r0              ; r1:r0 einmal nach links verschieben&lt;br /&gt;
    rol  r1&lt;br /&gt;
    lsl  r17             ; Das MSB von r17 ins Carry schieben&lt;br /&gt;
    brcc noadd           ; Ist dieses MSB (jetzt im Carry) eine 1?&lt;br /&gt;
    add  r0,r16          ; Wenn ja, dann r16 zum Ergebnis addieren&lt;br /&gt;
    adc  r1,r19&lt;br /&gt;
&lt;br /&gt;
noadd:&lt;br /&gt;
    dec  r18             ; Wurden alle 8 Bit von r17 abgearbeitet?&lt;br /&gt;
    brne mult            ; Wenn nicht, dann ein erneuter Verschiebe/Addier Zyklus&lt;br /&gt;
&lt;br /&gt;
                         ; r0 enthält an dieser Stelle den Wert 0b10111011&lt;br /&gt;
                         ; r1 enthält 0b00010010&lt;br /&gt;
                         ; Gemeinsam bilden r1 und r0 also die Zahl&lt;br /&gt;
                         ; 0b0001001010111011&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Division ==&lt;br /&gt;
Anders als bei der Multiplikation, gibt es auch auf einem ATMega-Prozessor keine hardwaremässige Divisionseinheit. Divisionen müssen also in jedem Fall mit einer speziellen Routine, die im wesentlichen auf Subtraktionen beruht, erledigt werden.&lt;br /&gt;
=== Division in Software ===&lt;br /&gt;
&lt;br /&gt;
Um die Vorgangsweise bei der binären Division zu verstehen, wollen wir wieder zunächst anhand der gewohnten dezimalen Division untersuchen wie sowas abläuft.&lt;br /&gt;
&lt;br /&gt;
Angenommen es soll dividiert werden: 938 / 4 ( 938 ist der Dividend, 4 ist der Divisor)&lt;br /&gt;
&lt;br /&gt;
Wie haben Sie es in der Grundschule gelernt? Wahrscheinlich so wie der Autor auch:&lt;br /&gt;
&lt;br /&gt;
    938 : 4 = 234&lt;br /&gt;
   ---&lt;br /&gt;
   -8&lt;br /&gt;
   ----&lt;br /&gt;
    1&lt;br /&gt;
    13&lt;br /&gt;
   -12&lt;br /&gt;
    ---&lt;br /&gt;
     1&lt;br /&gt;
     18&lt;br /&gt;
    -16&lt;br /&gt;
     --&lt;br /&gt;
      2 Rest&lt;br /&gt;
&lt;br /&gt;
Der Vorgang war: Man nimmt die erste Stelle des Dividenden (9) und ruft seine gespeicherte Einmaleins Tabelle ab, um festzustellen, wie oft der Divisor in dieser Stelle enthalten ist. In diesem konkreten Fall ist die erste Stelle 9 und der Divisor 4. 4 ist in 9 zweimal enthalten. Also ist 2 die erste Ziffer des Ergebnisses. 2 mal 4 ergibt aber 8 und diese 8 werden von den 9 abgezogen, übrig bleibt 1.&lt;br /&gt;
Aus dem Dividenden wird die nächste Ziffer (3) heruntergezogen und man erhält mit der 1 aus dem vorhergehenden Schritt 13.&lt;br /&gt;
Wieder dasselbe Spiel: Wie oft ist 4 in 13 enthalten? 3 mal (3 ist die nächste Ziffer des Ergebnisses) und 3 * 4 ergibt 12. Diese 12 von den 13 abgezogen macht 1. Zu dieser 1 gesellt sich wieder die nächste Ziffer des Dividenden, 8, um so 18 zu bilden.&lt;br /&gt;
Wie oft ist 4 in 18 enthalten? 4 mal (4 ist die nächste Ziffer des Ergebnisses), denn 4 mal 4 macht 16, und das von den 18 abgezogen ergibt 2.&lt;br /&gt;
Da es keine nächste Ziffer im Dividenden mehr gibt, lautet also das Resultat:&lt;br /&gt;
938 : 4 ergibt 234 und es bleiben 2 Rest.&lt;br /&gt;
&lt;br /&gt;
Die binäre Division funktioniert dazu völlig analog. Es gibt nur einen kleinen Unterschied, der einem sogar das Leben leichter macht. Es geht um den Schritt: Wie oft ist x in y enthalten?&lt;br /&gt;
Dieser Schritt ist in der binären Division besonders einfach, da das Ergebnis dieser Fragestellung nur 0 oder 1 sein kann. Das bedeutet aber auch: Entweder ist der Divisior in der zu untersuchenden Zahl enthalten, oder er ist es nicht. Das kann aber ganz leicht entschieden werden: Ist die Zahl größer oder gleich dem Divisior, dann ist der Divisor enthalten und zum Ergebnis kann eine 1 hinzugefügt werden. Ist die Zahl kleiner als der Divisior, dann ist der Divisior nicht enthalten und die nächste Ziffer des Ergebnisses ist eine 0.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Es soll die Division 0b01101100 : 0b00001001 ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Es wird wieder mit der ersten Stelle begonnen und die oben ausgeführte Vorschrift angewandt.&lt;br /&gt;
&lt;br /&gt;
   0b01101101 : 0b00001001 = 0b00001100&lt;br /&gt;
                               ^^^^^^^^&lt;br /&gt;
                               ||||||||&lt;br /&gt;
     0                ---------+|||||||   1001 ist in 0 0-mal enthalten&lt;br /&gt;
    -0                          |||||||&lt;br /&gt;
    --                          |||||||&lt;br /&gt;
     0                          |||||||&lt;br /&gt;
     01               ----------+||||||   1001 ist in 1 0-mal enthalten&lt;br /&gt;
    - 0                          ||||||&lt;br /&gt;
     --                          ||||||&lt;br /&gt;
     01                          ||||||&lt;br /&gt;
     011              -----------+|||||   1001 ist in 11 0-mal enthalten&lt;br /&gt;
    -  0                          |||||&lt;br /&gt;
     ---                          |||||&lt;br /&gt;
     011                          |||||&lt;br /&gt;
     0110             ------------+||||   1001 ist in 110 0-mal enthalten&lt;br /&gt;
    -   0                          ||||&lt;br /&gt;
     ----                          ||||&lt;br /&gt;
     0110                          ||||&lt;br /&gt;
     01101            -------------+|||   1001 ist in 1101 1-mal enthalten&lt;br /&gt;
    - 1001                          |||&lt;br /&gt;
     -----                          |||&lt;br /&gt;
      0100                          |||&lt;br /&gt;
      01001           --------------+||   1001 ist in 1001 1-mal enthalten&lt;br /&gt;
     - 1001                          ||&lt;br /&gt;
      -----                          ||&lt;br /&gt;
      00000                          ||&lt;br /&gt;
      000000          ---------------+|   1001 ist in 0 0-mal enthalten&lt;br /&gt;
    -      0                          |&lt;br /&gt;
      ------                          |&lt;br /&gt;
      0000001         ----------------+   1001 ist in 1 0-mal enthalten&lt;br /&gt;
     -      0&lt;br /&gt;
      -------&lt;br /&gt;
            1 Rest&lt;br /&gt;
&lt;br /&gt;
Die Division liefert also das Ergebnis 0b00001100, wobei ein Rest von 1 bleibt. Der Dividend 0b01101101 entspricht der Dezimalzahl 109, der Divisor 0b00001001 der Dezimalzahl 9. Und wie man sich mit einem Taschenrechner leicht überzeugen kann, ergibt die Division von 109 durch 9 einen Wert von 12, wobei 1 Rest bleibt. Die Binärzahl für 12 lautet 0b00001100, das Ergebnis stimmt also.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    ldi  r16, 109   ; Dividend&lt;br /&gt;
    ldi  r17,   9   ; Divisor&lt;br /&gt;
&lt;br /&gt;
                    ; Division r16 : r17&lt;br /&gt;
&lt;br /&gt;
    ldi  r18,   8   ; 8 Bit Division&lt;br /&gt;
    clr  r19        ; Register für die Zwischenergebnisse / Rest&lt;br /&gt;
    clr  r20        ; Ergebnis&lt;br /&gt;
&lt;br /&gt;
divloop:&lt;br /&gt;
    lsl  r16        ; Zwischenergebnis mal 2 nehmen und das&lt;br /&gt;
    rol  r19        ; nächste Bit des Dividenden anhängen&lt;br /&gt;
&lt;br /&gt;
    lsl  r20        ; das Ergebnis auf jeden Fall mal 2 nehmen,&lt;br /&gt;
                    ; das hängt effektiv eine 0 an das Ergebnis an.&lt;br /&gt;
                    ; Sollte das nächste Ergebnis-Bit 1 sein, dann wird&lt;br /&gt;
                    ; diese 0 in Folge durch eine 1 ausgetauscht&lt;br /&gt;
&lt;br /&gt;
    cp   r19, r17   ; ist der Divisor größer?&lt;br /&gt;
    brlo div_zero   ; wenn nein, dann bleibt die 0&lt;br /&gt;
    sbr  r20, 1     ; wenn ja, dann jetzt die 0 durch eine 1 austauschen ...&lt;br /&gt;
    sub  r19, r17   ; ... und den Divisor abziehen&lt;br /&gt;
&lt;br /&gt;
div_zero:&lt;br /&gt;
    dec  r18        ; das Ganze 8 mal wiederholen&lt;br /&gt;
    brne divloop&lt;br /&gt;
&lt;br /&gt;
                    ; in r20 steht das Ergebnis der Division&lt;br /&gt;
                    ; in r19 steht der bei der Division entstehende Rest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Arithmetik mit mehr als 8 Bit ==&lt;br /&gt;
&lt;br /&gt;
Es gibt eine [[AVR_Arithmetik|Sammlung von Algorithmen zur AVR-Arithmetik]] mit mehr als 8 Bit, deren Grundprinzipien im wesentlichen identisch zu den in diesem Teil ausgeführten Prinzipien sind.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{{Navigation_zurückhochvor|&lt;br /&gt;
zurücktext=Logik|&lt;br /&gt;
zurücklink=AVR-Tutorial: Logik|&lt;br /&gt;
hochtext=Inhaltsverzeichnis|&lt;br /&gt;
hochlink=AVR-Tutorial|&lt;br /&gt;
vortext=Stack|&lt;br /&gt;
vorlink=AVR-Tutorial: Stack}}&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Tutorial|Arithmetik8]]&lt;br /&gt;
[[Kategorie:AVR-Arithmetik]]&lt;/div&gt;</summary>
		<author><name>Max5v</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Stack&amp;diff=90653</id>
		<title>AVR-Tutorial: Stack</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Stack&amp;diff=90653"/>
		<updated>2015-12-11T13:35:24Z</updated>

		<summary type="html">&lt;p&gt;Max5v: Vandalismus entfernt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Motivation ==&lt;br /&gt;
bisher war es so, dass wenn die Programmausführung an einer anderen Stelle fortgesetzt werden soll, als sich durch die Abfolge der Befehle ergibt, mittels &amp;lt;b&amp;gt;rjmp&amp;lt;/b&amp;gt; an diese andere Stelle gesprungen wurde.&lt;br /&gt;
Das ist aber oft nicht ausreichend. Oft möchte man den Fall haben, dass man aus der normalen Befehlsreihenfolge heraus eine andere Sequenz von Befehlen ausgeführt wird und wenn diese abgearbeitet ist, genau an die Aufrufstelle zurückgesprungen wird. Da diese eingeschobene Sequenz an vielen Stellen aufrufbar sein soll, gelingt es daher auch nicht, mittels eines &amp;lt;b&amp;gt;rjmp&amp;lt;/b&amp;gt; wieder zur aufrufenden Stelle zurück zu kommen, denn dann müsste ja dieser Rücksprung je nachdem von wo der Hinsprung gekommen ist entsprechend modifiziert werden.&lt;br /&gt;
&lt;br /&gt;
Die Lösung dieses Dilemmas besteht in einem eigenen Befehl &amp;lt;b&amp;gt;rcall&amp;lt;/b&amp;gt;. Ein &amp;lt;b&amp;gt;rcall&amp;lt;/b&amp;gt; macht prinzipiell auch den Sprung zu einem Ziel, legt aber gleichzeitig auch  noch die Adresse von wo der Sprung erfolgt ist in einem speziellen Speicherbereich ab, so dass sein &#039;Gegenspieler&#039;, der Befehl &amp;lt;b&amp;gt;ret&amp;lt;/b&amp;gt; (wie Return) anhand dieser abgelegten Information wieder genau zu dieser Aufrufstelle zurückspringen kann. Diesen speziellen Speicherbereich nennt man den &amp;quot;[[Stack]]&amp;quot;. Stack bedeutet übersetzt soviel wie Stapel. Damit ist ein Speicher nach dem LIFO-Prinzip (&amp;quot;last in first out&amp;quot;) gemeint. Das bedeutet, dass das zuletzt auf den Stapel gelegte Element auch zuerst wieder heruntergenommen wird. Es ist nicht möglich, Elemente irgendwo in der Mitte des Stapels herauszuziehen oder hineinzuschieben. Ein Stack (oder Stapel) funktioniert wie ein Stapel Teller. Der Teller, welcher zuletzt auf den Stapel gelegt wird, ist auch der erste, welcher wieder vom Stapel heruntergenommen wird. Und genau das wird in diesem Fall ja auch benötigt: jeder &amp;lt;b&amp;gt;rcall&amp;lt;/b&amp;gt; legt seine Rücksprungadresse auf den Stack, so dass alle nachfolgenden &amp;lt;b&amp;gt;ret&amp;lt;/b&amp;gt; jeweils in umgekehrter Reihenfolge wieder die richtigen Rücksprungadressen anspringen.&lt;br /&gt;
&lt;br /&gt;
Bei allen aktuellen AVR-Controllern wird der Stack im [[Speicher#RAM|RAM]] angelegt. Der Stack wächst dabei von oben nach unten: Am Anfang wird der Stackpointer (Adresse der aktuellen Stapelposition) auf das Ende des RAMs gesetzt. Wird nun ein Element hinzugefügt, wird dieses an der momentanen Stackpointerposition abgespeichert und der Stackpointer um 1 erniedrigt. Soll ein Element vom Stack heruntergenommen werden, wird zuerst der Stackpointer um 1 erhöht und dann das Byte von der vom Stackpointer angezeigten Position gelesen.&lt;br /&gt;
&lt;br /&gt;
== Aufruf von Unterprogrammen ==&lt;br /&gt;
Dem Prozessor dient der Stack hauptsächlich dazu, Rücksprungadressen beim Aufruf von Unterprogrammen zu speichern, damit er später noch weiß, an welche Stelle zurückgekehrt werden muss, wenn das Unterprogramm mit &#039;&#039;&#039;ret&#039;&#039;&#039; oder die Interruptroutine mit &#039;&#039;&#039;reti&#039;&#039;&#039; beendet wird. &lt;br /&gt;
&lt;br /&gt;
Das folgende Beispielprogramm (AT90S4433) zeigt, wie der Stack dabei beeinflusst wird: &lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/sourcecode/tutorial/stack.asm Download stack.asm]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include &amp;quot;4433def.inc&amp;quot;     ; bzw. 2333def.inc&lt;br /&gt;
&lt;br /&gt;
.def temp = r16&lt;br /&gt;
&lt;br /&gt;
         ldi temp, RAMEND  ; Stackpointer initialisieren&lt;br /&gt;
         out SP, temp&lt;br /&gt;
&lt;br /&gt;
         rcall sub1        ; sub1 aufrufen&lt;br /&gt;
&lt;br /&gt;
loop:    rjmp loop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub1:&lt;br /&gt;
                           ; hier könnten ein paar Befehle stehen&lt;br /&gt;
         rcall sub2        ; sub2 aufrufen&lt;br /&gt;
                           ; hier könnten auch ein paar Befehle stehen&lt;br /&gt;
         ret               ; wieder zurück&lt;br /&gt;
&lt;br /&gt;
sub2:&lt;br /&gt;
                           ; hier stehen normalerweise die Befehle,&lt;br /&gt;
                           ; die in sub2 ausgeführt werden sollen&lt;br /&gt;
         ret               ; wieder zurück&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;.def temp = r16&#039;&#039;&#039; ist eine Assemblerdirektive. Diese sagt dem Assembler, dass er überall, wo er &amp;quot;temp&amp;quot; findet, stattdessen &amp;quot;r16&amp;quot; einsetzen soll. Das ist oft praktisch, damit man nicht mit den Registernamen durcheinander kommt. Eine Übersicht über die Assemblerdirektiven findet man [http://www.avr-asm-tutorial.net/avr_de/beginner/diraus.html hier]. &lt;br /&gt;
&lt;br /&gt;
Bei Controllern, die mehr als 256 Byte RAM besitzen (z.&amp;amp;nbsp;B. ATmega8), passt die Adresse nicht mehr in ein Byte. Deswegen gibt es bei diesen Controllern das Stack-Pointer-Register aufgeteilt in &#039;&#039;&#039;SPL&#039;&#039;&#039; (Low) und &#039;&#039;&#039;SPH&#039;&#039;&#039; (High), in denen das Low- und das High-Byte der Adresse gespeichert wird. Damit es funktioniert, muss das Programm dann folgendermaßen geändert werden: &lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/sourcecode/tutorial/stack-bigmem.asm Download stack-bigmem.asm]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
.def temp = r16&lt;br /&gt;
&lt;br /&gt;
         ldi temp, HIGH(RAMEND)            ; HIGH-Byte der obersten RAM-Adresse&lt;br /&gt;
         out SPH, temp&lt;br /&gt;
         ldi temp, LOW(RAMEND)             ; LOW-Byte der obersten RAM-Adresse&lt;br /&gt;
         out SPL, temp&lt;br /&gt;
&lt;br /&gt;
         rcall sub1                        ; sub1 aufrufen&lt;br /&gt;
&lt;br /&gt;
loop:    rjmp loop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub1:&lt;br /&gt;
                                           ; hier könnten ein paar Befehle stehen&lt;br /&gt;
         rcall sub2                        ; sub2 aufrufen&lt;br /&gt;
                                           ; hier könnten auch Befehle stehen&lt;br /&gt;
         ret                               ; wieder zurück&lt;br /&gt;
&lt;br /&gt;
sub2:&lt;br /&gt;
                                           ; hier stehen normalerweise die Befehle,&lt;br /&gt;
                                           ; die in sub2 ausgeführt werden sollen&lt;br /&gt;
         ret                               ; wieder zurück&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Natürlich ist es unsinnig, dieses Programm in einen Controller zu programmieren. Stattdessen sollte man es mal mit dem AVR-Studio simulieren, um die Funktion des Stacks zu verstehen. &lt;br /&gt;
&lt;br /&gt;
Als erstes wird mit &#039;&#039;&#039;Project/New&#039;&#039;&#039; ein neues Projekt erstellt, zu dem man dann mit &#039;&#039;&#039;Project/Add File&#039;&#039;&#039; eine Datei mit dem oben gezeigten Programm (stack.asm) hinzufügt. Nachdem man unter &#039;&#039;&#039;Project/Project Settings&#039;&#039;&#039; das &#039;&#039;&#039;Object Format for AVR-Studio&#039;&#039;&#039; ausgewählt hat, kann man das Programm mit Strg+F7 assemblieren und den Debug-Modus starten. &lt;br /&gt;
&lt;br /&gt;
Danach sollte man im Menu &#039;&#039;&#039;View&#039;&#039;&#039; die Fenster &#039;&#039;&#039;Processor&#039;&#039;&#039; und &#039;&#039;&#039;Memory&#039;&#039;&#039; öffnen und im Memory-Fenster &#039;&#039;&#039;Data&#039;&#039;&#039; auswählen. &lt;br /&gt;
&lt;br /&gt;
Das Fenster &#039;&#039;&#039;Processor&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;Program Counter&#039;&#039;: Adresse im Programmspeicher (FLASH), die gerade abgearbeitet wird&lt;br /&gt;
* &#039;&#039;Stack Pointer&#039;&#039;: Adresse im Datenspeicher (RAM), auf die der Stackpointer gerade zeigt&lt;br /&gt;
* &#039;&#039;Cycle Counter&#039;&#039;: Anzahl der Taktzyklen seit Beginn der Simulation&lt;br /&gt;
* &#039;&#039;Time Elapsed&#039;&#039;: Zeit, die seit dem Beginn der Simulation vergangen ist &lt;br /&gt;
&lt;br /&gt;
Im Fenster &#039;&#039;&#039;Memory&#039;&#039;&#039; wird der Inhalt des RAMs angezeigt. &lt;br /&gt;
&lt;br /&gt;
Sind alle 3 Fenster gut auf einmal sichtbar, kann man anfangen, das Programm (in diesem Fall &amp;quot;stack.asm&amp;quot;) mit der Taste F11 langsam Befehl für Befehl zu simulieren. &lt;br /&gt;
&lt;br /&gt;
Wenn der gelbe Pfeil in der Zeile &#039;&#039;&#039;out SPL, temp&#039;&#039;&#039; vorbeikommt, kann man im Prozessor-Fenster sehen, wie der Stackpointer auf 0xDF (&#039;&#039;ATmega8&#039;&#039;: 0x45F) gesetzt wird. Wie man im Memory-Fenster sieht, ist das die letzte RAM-Adresse. &lt;br /&gt;
&lt;br /&gt;
Wenn der Pfeil auf dem Befehl &#039;&#039;&#039;rcall sub1&#039;&#039;&#039; steht, sollte man sich den Program Counter anschauen: Er steht auf 0x02 (&#039;&#039;ATmega8&#039;&#039;: 0x04). &lt;br /&gt;
&lt;br /&gt;
Drückt man jetzt nochmal auf F11, springt der Pfeil zum Unterprogramm sub1. Im RAM erscheint an der Stelle, auf die der Stackpointer vorher zeigte, die Zahl 0x03 (&#039;&#039;ATmega8&#039;&#039;: 0x05). Das ist die Adresse im ROM, an der das Hauptprogramm nach dem Abarbeiten des Unterprogramms fortgesetzt wird. Doch warum wurde der Stackpointer um 2 verkleinert? Das liegt daran, dass eine Programmspeicheradresse bis zu 2 Byte breit sein kann, und somit auch 2 Byte auf dem Stack benötigt werden, um die Adresse zu speichern. &lt;br /&gt;
&lt;br /&gt;
Das gleiche passiert beim Aufruf von sub2. &lt;br /&gt;
&lt;br /&gt;
Zur Rückkehr aus dem mit rcall aufgerufenen Unterprogramm gibt es den Befehl &#039;&#039;&#039;ret&#039;&#039;&#039;. Dieser Befehl sorgt dafür, dass der Stackpointer wieder um 2 erhöht wird und die dabei eingelesene Adresse in den &amp;quot;Program Counter&amp;quot; kopiert wird, so dass das Programm dort fortgesetzt wird. &lt;br /&gt;
&lt;br /&gt;
Apropos Program Counter: Wer sehen will, wie so ein Programm aussieht, wenn es assembliert ist, sollte mal die Datei mit der Endung &amp;quot;.lst&amp;quot; im Projektverzeichnis öffnen. Die Datei sollte ungefähr so aussehen: &lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/images/listfile.gif&lt;br /&gt;
&lt;br /&gt;
Im blau umrahmten Bereich steht die Adresse des Befehls im Programmspeicher. Das ist auch die Zahl, die im Program Counter angezeigt wird, und die beim Aufruf eines Unterprogramms auf den Stack gelegt wird. Der grüne Bereich rechts daneben ist der OP-Code des Befehls, so wie er in den Programmspeicher des Controllers programmiert wird, und im roten Kasten stehen die &amp;quot;mnemonics&amp;quot;: Das sind die Befehle, die man im Assembler eingibt.&lt;br /&gt;
Der nicht eingerahmte Rest besteht aus Assemblerdirektiven, Labels (Sprungmarkierungen) und Kommentaren, die nicht direkt in OP-Code umgewandelt werden.&lt;br /&gt;
Der grün eingerahmte Bereich ist das eigentliche Programm, so wie es der µC versteht. Die jeweils erste Zahl im grünen Bereich steht für einen Befehl, den sog. OP-Code (OP = Operation). Die zweite Zahl codiert Argumente für diesen Befehl.&lt;br /&gt;
&lt;br /&gt;
== Sichern von Registern ==&lt;br /&gt;
Eine weitere Anwendung des Stacks ist das &amp;quot;Sichern&amp;quot; von Registern. Wenn man z.&amp;amp;nbsp;B. im Hauptprogramm die Register R16, R17 und R18 verwendet, dann ist es i.d.R. erwünscht, dass diese Register durch aufgerufene Unterprogramme nicht beeinflusst werden. Man muss also nun entweder auf die Verwendung dieser Register innerhalb von Unterprogrammen verzichten, oder man sorgt dafür, dass am Ende jedes Unterprogramms der ursprüngliche Zustand der Register wiederhergestellt wird. Wie man sich leicht vorstellen kann ist ein &amp;quot;Stapelspeicher&amp;quot; dafür ideal: Zu Beginn des Unterprogramms legt man die Daten aus den zu sichernden Registern oben auf den Stapel, und am Ende holt man sie wieder (in der umgekehrten Reihenfolge) in die entsprechenden Register zurück. Das Hauptprogramm bekommt also wenn es fortgesetzt wird überhaupt nichts davon mit, dass die Register inzwischen anderweitig verwendet wurden. &lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/sourcecode/tutorial/stack-saveregs.asm Download stack-saveregs.asm]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;  &lt;br /&gt;
.include &amp;quot;4433def.inc&amp;quot;            ; bzw. 2333def.inc&lt;br /&gt;
&lt;br /&gt;
.def temp = R16&lt;br /&gt;
&lt;br /&gt;
         ldi temp, RAMEND         ; Stackpointer initialisieren&lt;br /&gt;
         out SP, temp&lt;br /&gt;
&lt;br /&gt;
         ldi temp, 0xFF&lt;br /&gt;
         out DDRB, temp           ; Port B = Ausgang&lt;br /&gt;
&lt;br /&gt;
         ldi R17, 0b10101010      ; einen Wert ins Register R17 laden&lt;br /&gt;
&lt;br /&gt;
         rcall sub1                ; Unterprogramm &amp;quot;sub1&amp;quot; aufrufen&lt;br /&gt;
 &lt;br /&gt;
         out PORTB, R17           ; Wert von R17 an den Port B ausgeben&lt;br /&gt;
&lt;br /&gt;
loop:    rjmp loop                ; Endlosschleife&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub1:&lt;br /&gt;
         push R17                 ; Inhalt von R17 auf dem Stack speichern&lt;br /&gt;
&lt;br /&gt;
         ; hier kann nach belieben mit R17 gearbeitet werden,&lt;br /&gt;
         ; als Beispiel wird es hier auf 0 gesetzt&lt;br /&gt;
&lt;br /&gt;
         ldi R17, 0&lt;br /&gt;
&lt;br /&gt;
         pop R17                  ; R17 zurückholen&lt;br /&gt;
         ret                      ; wieder zurück zum Hauptprogramm&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wenn man dieses Programm assembliert und in den Controller lädt, dann wird man feststellen, dass jede zweite LED an Port B leuchtet. Der ursprüngliche Wert von R17 blieb also erhalten, obwohl dazwischen ein Unterprogramm aufgerufen wurde, das R17 geändert hat. &lt;br /&gt;
&lt;br /&gt;
Auch in diesem Fall kann man bei der Simulation des Programms im AVR-Studio die Beeinflussung des Stacks durch die Befehle &#039;&#039;&#039;push&#039;&#039;&#039; und &#039;&#039;&#039;pop&#039;&#039;&#039; genau nachvollziehen.&lt;br /&gt;
&lt;br /&gt;
== Sprung zu beliebiger Adresse ==&lt;br /&gt;
&#039;&#039;Dieser Abschnitt ist veraltet, da nahezu alle ATmega/ATtiny Typen IJMP/ICALL unterstützen.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kleinere AVR besitzen keinen Befehl, um direkt zu einer Adresse zu springen, die in einem Registerpaar gespeichert ist. Man kann dies aber mit etwas Stack-Akrobatik erreichen. Dazu einfach zuerst den niederen Teil der Adresse, dann den höheren Teil der Adresse mit &#039;&#039;&#039;push&#039;&#039;&#039; auf den Stack legen und ein &#039;&#039;&#039;ret&#039;&#039;&#039; ausführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
	ldi ZH, high(testRoutine)&lt;br /&gt;
	ldi ZL, low(testRoutine)&lt;br /&gt;
	&lt;br /&gt;
	push ZL&lt;br /&gt;
	push ZH&lt;br /&gt;
	ret&lt;br /&gt;
&lt;br /&gt;
        ...&lt;br /&gt;
testRoutine:&lt;br /&gt;
	rjmp testRoutine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Auf diese Art und Weise kann man auch Unterprogrammaufrufe durchführen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
	ldi ZH, high(testRoutine)&lt;br /&gt;
	ldi ZL, low(testRoutine)&lt;br /&gt;
	rcall indirectZCall&lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
indirectZCall:&lt;br /&gt;
	push ZL&lt;br /&gt;
	push ZH&lt;br /&gt;
	ret&lt;br /&gt;
&lt;br /&gt;
testRoutine:&lt;br /&gt;
	...&lt;br /&gt;
	ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Größere AVR haben dafür die Befehle &amp;lt;code&amp;gt;ijmp&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;icall&amp;lt;/code&amp;gt;.&lt;br /&gt;
Bei diesen Befehlen muss das Sprungziel in ZH:ZL stehen.&lt;br /&gt;
&lt;br /&gt;
== Weitere Informationen (von Lothar Müller): ==&lt;br /&gt;
* [http://www.mikrocontroller.net/attachment/301/Der-Stack-1.pdf Der Stack - Funktion und Nutzen (pdf)]&lt;br /&gt;
* [http://www.mikrocontroller.net/attachment/299/Der-Stack-2.pdf Der Stack - Parameterübergabe an Unterprogramme (pdf)]&lt;br /&gt;
* [http://www.mikrocontroller.net/attachment.php/676/Der-Stack-3.pdf Der Stack - Unterprogramme mit variabler Parameteranzahl (pdf) ]&lt;br /&gt;
&lt;br /&gt;
(Der in dieser Abhandlung angegebene Befehl &#039;&#039;MOV ZLow, SPL&#039;&#039; muss &#039;&#039;IN ZL, SPL&#039;&#039; heißen, da SPL und SPH I/O-Register sind. Ggf ist auch SPH zu berücksichtigen --&amp;gt; 2byte Stack-Pointer)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{{Navigation_zurückhochvor|&lt;br /&gt;
zurücktext=logische Operatoren|&lt;br /&gt;
zurücklink=AVR-Tutorial: Logik|&lt;br /&gt;
hochtext=Inhaltsverzeichnis|&lt;br /&gt;
hochlink=AVR-Tutorial|&lt;br /&gt;
vortext=LCD|&lt;br /&gt;
vorlink=AVR-Tutorial: LCD}}&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Tutorial|Stack]]&lt;/div&gt;</summary>
		<author><name>Max5v</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_LCD&amp;diff=90652</id>
		<title>AVR-Tutorial: LCD</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_LCD&amp;diff=90652"/>
		<updated>2015-12-11T13:17:04Z</updated>

		<summary type="html">&lt;p&gt;Max5v: Vandalismus entfernt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Kaum ein elektronisches Gerät kommt heutzutage noch ohne ein LCD daher. Ist doch auch praktisch, Informationen im Klartext anzeigen zu können, ohne irgendwelche LEDs blinken zu lassen. Kein Wunder also, dass die häufigste Frage in Mikrocontroller-Foren ist: &amp;quot;Wie kann ich ein LCD anschließen?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Das LCD und sein Controller==&lt;br /&gt;
&lt;br /&gt;
Die meisten Text-LCDs verwenden den Controller [[HD44780|&#039;&#039;&#039;HD44780&#039;&#039;&#039;]] oder einen kompatiblen (z.&amp;amp;nbsp;B. KS0070) und haben 14 oder 16 Pins.&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Pinbelegung ist meist (Ausnahme z.&amp;amp;nbsp;B. TC1602E (Pollin 120420): V&amp;lt;sub&amp;gt;DD&amp;lt;/sub&amp;gt; und V&amp;lt;sub&amp;gt;SS&amp;lt;/sub&amp;gt; vertauscht) folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;ACHTUNG: Es gibt Displays mit abweichender Anschluss-Belegung, falscher Anschluss kann zur Zerstörung führen! Daher immer das zugehörige Datenblatt zu Rate ziehen!&amp;lt;/span&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Einzelheiten unter [http://www.mikrocontroller.net/articles/HD44780 Artikel zum Controller HD44780]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
! Pin # || Bezeichnung || Funktion&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  V&amp;lt;sub&amp;gt;SS&amp;lt;/sub&amp;gt; (selten: V&amp;lt;sub&amp;gt;DD&amp;lt;/sub&amp;gt;)&lt;br /&gt;
||  GND (selten: +5 V)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  2&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  V&amp;lt;sub&amp;gt;DD&amp;lt;/sub&amp;gt; (selten: V&amp;lt;sub&amp;gt;SS&amp;lt;/sub&amp;gt;)&lt;br /&gt;
||  +5 V (selten: GND)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  3&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  V&amp;lt;sub&amp;gt;EE&amp;lt;/sub&amp;gt;, V0, V5&lt;br /&gt;
||  Kontrastspannung (-5 V / 0 V bis 5 V)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  4&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  RS&lt;br /&gt;
||  Register Select (0=Befehl/Status 1=Daten)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  5&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  RW&lt;br /&gt;
||  1=Read 0=Write&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  6&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  E&lt;br /&gt;
||  0=Disable 1=Enable&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  7&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  DB0&lt;br /&gt;
||  Datenbit 0&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  8&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  DB1&lt;br /&gt;
||  Datenbit 1&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  9&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  DB2&lt;br /&gt;
||  Datenbit 2&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  10&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  DB3&lt;br /&gt;
||  Datenbit 3&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  11&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  DB4&lt;br /&gt;
||  Datenbit 4&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  12&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  DB5&lt;br /&gt;
||  Datenbit 5&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  13&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  DB6&lt;br /&gt;
||  Datenbit 6&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  14&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  DB7&lt;br /&gt;
||  Datenbit 7&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  15&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  A&lt;br /&gt;
||  LED-Beleuchtung, meist Anode&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  16&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  K&lt;br /&gt;
||  LED-Beleuchtung, meist Kathode&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung: Unbedingt von der richtigen Seite zu zählen anfangen! Meistens ist das Pin1-Pad eckig oder daneben eine kleine 1 auf der LCD-Platine, ansonsten im Datenblatt nachschauen.&lt;br /&gt;
&lt;br /&gt;
Bei der DIL-Version (2x7, 2x8 Kontakte) auch darauf achten, auf welcher Platinen-Seite der Stecker montiert wird: auf der falschen (meist hinteren) Seite sind dann die Flachbandleitungen 1 und 2, 3 und 4  usw. vertauscht. Das kann man kompensieren, indem man es auf der anderen Kabelseite genauso permutiert oder es auf dem Layout bewusst so legt (Stecker auf der Bottom-Seite plazieren). Man kann es NICHT kompensieren, indem man das Flachbandkabel auf der anderen Seite in den Stecker führt.&lt;br /&gt;
&lt;br /&gt;
Bei LCDs mit 16-poligem Anschluss sind die beiden letzten Pins für die Hintergrundbeleuchtung reserviert. Hier unbedingt das Datenblatt zu Rate ziehen. Die beiden Anschlüsse sind je nach Hersteller verdreht beschaltet. Falls kein Datenblatt vorliegt, kann man mit einem Durchgangsprüfer feststellen, welcher Anschluss mit Masse (GND) verbunden ist.&lt;br /&gt;
&lt;br /&gt;
V&amp;lt;sub&amp;gt;SS&amp;lt;/sub&amp;gt; wird ganz einfach an GND angeschlossen und V&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt;=V&amp;lt;sub&amp;gt;DD&amp;lt;/sub&amp;gt; an +5 V. V&amp;lt;sub&amp;gt;EE&amp;lt;/sub&amp;gt; = V0 = V5 kann man testweise auch an GND legen. Wenn das LCD dann zu dunkel sein sollte, muss man ein 10k&amp;amp;Omega;-Potentiometer zwischen GND und 5 V schalten, mit dem Schleifer an V&amp;lt;sub&amp;gt;EE&amp;lt;/sub&amp;gt;. Meist kann man den +5 V-Anschluss am Poti weglassen, da im Display ein Pull-up-Widerstand ist:&lt;br /&gt;
&lt;br /&gt;
[[Bild:LCD_Vee.gif|framed|center| Gewinnung der Kontrastspannung]]&lt;br /&gt;
&lt;br /&gt;
Wenn der Kontrast zu schwach sein sollte (z.B. bei tiefen Temperaturen oder bei Betrieb mit 3.3V), kann man anstelle von GND eine negative Spannung ans Kontrast-Poti legen. Diese kann bis -5 V gehen und kann leicht aus einem Timerpin des µC, einem Widerstand, zwei Dioden und zwei Kondensatoren erzeugt werden. So wird auch ein digital einstellbarer Kontrast mittels PWM ermöglicht. ACHTUNG: Es gibt jedoch auch Displaycontroller wie den Epson SED1278, die zwar Software-kompatibel sind, aber keine negativen Kontrastspannung verkraften. Wird der Kontrast also bei negativer Spannung schlechter oder geht das Display ganz aus, ist davon auszugehen, dass der Controller diesen Betriebsmodus nicht unterstützt.&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei verschiedene Möglichkeiten zur Ansteuerung eines solchen Displays: den &#039;&#039;&#039;8-Bit-&#039;&#039;&#039; und den &#039;&#039;&#039;4-Bit-&#039;&#039;&#039;Modus.&lt;br /&gt;
* Für den &#039;&#039;&#039;8-Bit-Modus&#039;&#039;&#039; werden (wie der Name schon sagt) alle acht Datenleitungen zur Ansteuerung verwendet, somit kann durch einen Zugriff immer ein ganzes Byte übertragen werden.&lt;br /&gt;
* Der &#039;&#039;&#039;4-Bit-Modus&#039;&#039;&#039; verwendet nur die oberen vier Datenleitungen (&#039;&#039;&#039;DB4-DB7&#039;&#039;&#039;). Um ein Byte zu übertragen, braucht man somit zwei Zugriffe, wobei zuerst das höherwertige &#039;&#039;&#039;&amp;quot;Nibble&amp;quot;&#039;&#039;&#039; (= 4 Bits), also Bit 4 bis Bit 7 übertragen wird und dann das niederwertige, also Bit 0 bis Bit 3. Die unteren Datenleitungen des LCDs, die beim Lesezyklus Ausgänge sind, lässt man offen (siehe Datasheets, z.&amp;amp;nbsp;B. vom KS0070).&lt;br /&gt;
&lt;br /&gt;
Der 4-Bit-Modus hat den Vorteil, dass man 4 IO-Pins weniger benötigt als beim 8-Bit-Modus. 6 bzw. 7 Pins (eines Portes) reichen aus.&lt;br /&gt;
&lt;br /&gt;
Neben den vier Datenleitungen (DB4, DB5, DB6 und DB7) werden noch die Anschlüsse &#039;&#039;&#039;RS&#039;&#039;&#039;, &#039;&#039;&#039;RW&#039;&#039;&#039; und &#039;&#039;&#039;E&#039;&#039;&#039; benötigt. &lt;br /&gt;
&lt;br /&gt;
* Über &#039;&#039;&#039;RS&#039;&#039;&#039; wird ausgewählt, ob man einen Befehl oder ein Datenbyte an das LCD schicken möchte. Beim Schreiben gilt: ist RS Low, dann wird das ankommende Byte als Befehl interpretiert; Ist RS high, wird das Byte auf dem LCD angezeigt (genauer: ins Data-Register geschrieben, kann auch für den CG bestimmt sein). &lt;br /&gt;
* &#039;&#039;&#039;RW&#039;&#039;&#039; legt fest, ob geschrieben oder gelesen werden soll. High bedeutet lesen, low bedeutet schreiben. Wenn man RW auf lesen einstellt und RS auf Befehl, dann kann man das &#039;&#039;&#039;Busy-Flag&#039;&#039;&#039; an DB7 lesen, das anzeigt, ob das LCD den vorhergehenden Befehl fertig verarbeitet hat. Ist RS auf Daten eingestellt, dann kann man z.&amp;amp;nbsp;B. den Inhalt des Displays lesen - was jedoch nur in den wenigsten Fällen Sinn macht. Deshalb kann man RW dauerhaft auf low lassen (= an GND anschließen), so dass man noch ein IO-Pin am Controller einspart. Der Nachteil ist, dass man dann das Busy-Flag nicht lesen kann, weswegen man nach jedem Befehl ca. 50 µs (beim Return Home 2 ms, beim Clear Display 20 ms) warten sollte, um dem LCD Zeit zum Ausführen des Befehls zu geben. Dummerweise schwankt die Ausführungszeit von Display zu Display und ist auch von der Betriebsspannung abhängig. Für professionellere Sachen also lieber den IO-Pin opfern und Busy abfragen.&lt;br /&gt;
* Der &#039;&#039;&#039;E&#039;&#039;&#039; Anschluss schließlich signalisiert dem LCD, dass die übrigen Datenleitungen jetzt korrekte Pegel angenommen haben und es die gewünschten Daten von den Datenleitungen bzw. Kommandos von den Datenleitungen übernehmen kann. Beim Lesen gibt das Display die Daten / Status so lange aus, wie E high ist. Beim Schreiben übernimmt das Display die Daten mit der fallenden Flanke.&lt;br /&gt;
&lt;br /&gt;
== Anschluss an den Controller ==&lt;br /&gt;
&lt;br /&gt;
Jetzt, da wir wissen, welche Anschlüsse das LCD benötigt, können wir das LCD mit dem Mikrocontroller verbinden: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;ACHTUNG: Es gibt Displays mit abweichender Anschluss-Belegung (z. B. TC1602E (Pollin 120420): Vdd und Vss vertauscht), falscher Anschluss kann zur Zerstörung führen! Daher immer das zugehörige Datenblatt zu Rate ziehen.&amp;lt;/span&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Einzelheiten unter [[HD44780|Artikel zum Controller HD44780]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!Pinnummer&amp;lt;BR&amp;gt;LCD || Bezeichnung || Anschluss&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |1 || V&amp;lt;sub&amp;gt;SS&amp;lt;/sub&amp;gt; || GND (beim TC1602E: V&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |2 || V&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt; || +5 V (beim TC1602E: Gnd)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |3 || V&amp;lt;sub&amp;gt;EE&amp;lt;/sub&amp;gt; || GND , [[Potentiometer | Poti]] oder [[Pulsweitenmodulation | PWM]] am AVR&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |4 || RS || PD4 am AVR&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |5 || RW || GND &lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |6 || E || PD5 am AVR&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |7 || DB0 || nicht angeschlossen &lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |8 || DB1 || nicht angeschlossen&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |9 || DB2 || nicht angeschlossen&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |10 || DB3 || nicht angeschlossen&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |11 || DB4 || PD0 am AVR&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |12 || DB5 || PD1 am AVR&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |13 || DB6 || PD2 am AVR&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |14 || DB7 || PD3 am AVR&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |15 || A || Vorsicht! Meistens nicht direkt an +5 V anschließbar,&amp;lt;br /&amp;gt; sondern nur über einen Vorwiderstand, der an die Daten&amp;lt;br /&amp;gt;der Hintergrundbeleuchtung angepasst werden muss.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |16 || K || GND&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ok. Alles ist verbunden. Wenn man jetzt den Strom einschaltet, sollten ein oder zwei schwarze Balken auf dem Display angezeigt werden. &lt;br /&gt;
&lt;br /&gt;
Doch wie bekommt man jetzt die Befehle und Daten in das Display? Dazu muss das LCD initialisiert werden und man muss Befehle (Commands) und seine Daten an das LCD senden. Weil die Initialisierung ein Spezialfall der Übertragung von Befehlen ist, im Folgenden zunächst die Erklärung für die Übertragung von Werten an das LCD.&lt;br /&gt;
&lt;br /&gt;
== Ansteuerung des LCDs im 4-Bit-Modus ==&lt;br /&gt;
&lt;br /&gt;
Um ein Byte zu übertragen, muss man es erstmal in die beiden Nibbles zerlegen, die getrennt übertragen werden. Da das obere Nibble (Bit 4 - Bit 7) als erstes übertragen wird, die 4 Datenleitungen jedoch an die vier unteren Bits des Port D angeschlossen sind, muss man die beiden Nibbles des zu übertragenden Bytes erstmal vertauschen. Der AVR kennt dazu praktischerweise einen eigenen Befehl: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
           swap r16               ; vertauscht die beiden Nibbles von r16&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aus 0b00100101 wird so z.&amp;amp;nbsp;B. 0b01010010. &lt;br /&gt;
&lt;br /&gt;
Jetzt sind die Bits für die erste Phase der Übertragung an der richtigen Stelle. Trotzdem wollen wir das Ergebnis nicht einfach so mit &#039;&#039;&#039;out PORTD, r16&#039;&#039;&#039; an den Port geben. Um die Hälfte des Bytes, die jetzt nicht an die Datenleitungen des LCDs gegeben wird auf null zu setzen, verwendet man folgenden Befehl: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
           andi r16, 0b00001111   ; Nur die vier unteren (mit 1 markierten)&lt;br /&gt;
                                  ; Bits werden übernommen, alle anderen werden null&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also: Das obere Nibble wird erst mit dem unteren vertauscht, damit es unten ist. Dann wird das obere (das wir jetzt noch nicht brauchen) auf null gesetzt. &lt;br /&gt;
&lt;br /&gt;
Jetzt müssen wir dem LCD noch mitteilen, ob wir Daten oder Befehle senden wollen. Das machen wir, indem wir das Bit, an dem RS angeschlossen ist (PD4), auf 0 (Befehl senden) oder auf 1 (Daten senden) setzen. Um ein Bit in einem normalen Register zu setzen, gibt es den Befehl sbr (Set Bits in Register). Dieser Befehl unterscheidet sich jedoch von sbi (das nur für IO-Register gilt) dadurch, dass man nicht die Nummer des zu setzenden Bits angibt, sondern eine Bitmaske. Das geht so: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
           sbr r16, 0b00010000     ; Bit 4 setzen, alle anderen Bits bleiben gleich&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RS ist an PD4 angeschlossen. Wenn wir r16 an den Port D ausgeben, ist RS jetzt also high und das LCD erwartet Daten anstatt von Befehlen. &lt;br /&gt;
&lt;br /&gt;
Das Ergebnis können wir jetzt endlich direkt an den Port D übergeben: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
           out PORTD, r16&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Natürlich muss vorher der Port D auf Ausgang geschaltet werden, indem man 0xFF ins Datenrichtungsregister DDRD schreibt. &lt;br /&gt;
&lt;br /&gt;
Um dem LCD zu signalisieren, dass es das an den Datenleitungen anliegende Nibble übernehmen kann, wird die E-Leitung (Enable, an PD5 angeschlossen) auf high und kurz darauf wieder auf low gesetzt. Ein Puls an dieser Leitung teilt also dem LCD mit, das die restlichen Leitungen jetzt ihren vom Programm gewollten Pegel eingenommen haben und gültig sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
           sbi PORTD, 5              ; Enable high&lt;br /&gt;
           nop                       ; 3 Taktzyklen warten (&amp;quot;nop&amp;quot; = nichts tun)&lt;br /&gt;
           nop&lt;br /&gt;
           nop&lt;br /&gt;
           cbi PORTD, 5              ; Enable wieder low&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die eine Hälfte des Bytes wäre damit geschafft! Die andere Hälfte kommt direkt hinterher: Alles, was an der obenstehenden Vorgehensweise geändert werden muss, ist, das &amp;quot;swap&amp;quot; (Vertauschen der beiden Nibbles) wegzulassen.&lt;br /&gt;
&lt;br /&gt;
== Initialisierung des Displays ==&lt;br /&gt;
&lt;br /&gt;
Allerdings gibt es noch ein Problem. Wenn ein LCD eingeschaltet wird, dann läuft es zunächst im 8 Bit Modus. Irgendwie muss das Display initialisiert und auf den 4 Bit Modus umgeschaltet werden, und zwar nur mit den 4 zur Verfügung stehenden Datenleitungen.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn es Probleme gibt, dann meistens an diesem Punkt. Die &amp;quot;kompatiblen&amp;quot; Kontroller sind gelegentlich doch nicht 100% identisch. Es lohnt sich, das Datenblatt (siehe Weblinks im Artikel [[LCD]]) genau zu lesen, in welcher Reihenfolge und mit welchen Abständen (Delays) die Initialisierungbefehle gesendet werden. Eine weitere Hilfe können Ansteuerungsbeispiele in Forenbeiträgen geben z.&amp;amp;nbsp;B.&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/79609#664268 (A) KS0066U oder Ähnliche --- LCD Treiber]&lt;br /&gt;
&lt;br /&gt;
=== Initialisierung für 4 Bit Modus ===&lt;br /&gt;
&lt;br /&gt;
Achtung: Im Folgenden sind alle Bytes aus Sicht des LCD-Kontrollers angegeben! Da LCD-seitig nur die Leitungen DB4 - DB7 verwendet werden, ist daher immer nur das höherwertige Nibble gültig. Durch die Art der Verschaltung (DB4 - DB7 wurde auf dem PORT an PD0 bis PD3 angeschlossen) ergibt sich eine Verschiebung, so dass das am Kontroller auszugebende Byte nibblemässig vertauscht ist!&lt;br /&gt;
&lt;br /&gt;
Die Sequenz, aus Sicht des Kontrollers, sieht so aus:&lt;br /&gt;
&lt;br /&gt;
* Nach dem Anlegen der Betriebsspannung muss eine Zeit von mindestens ca. 15ms gewartet werden, um dem LCD-Kontroller Zeit für seine eigene Initialisierung zu geben&lt;br /&gt;
* $3 ins Steuerregister schreiben (RS = 0)&lt;br /&gt;
* Mindestens 4.1ms warten&lt;br /&gt;
* $3 ins Steuerregister schreiben (RS = 0)&lt;br /&gt;
* Mindestens 100µs warten&lt;br /&gt;
* $3 ins Steuerregister schreiben (RS = 0)&lt;br /&gt;
* $2 ins Steuerregister schreiben (RS = 0), dadurch wird auf 4 Bit Daten umgestellt&lt;br /&gt;
* Ab jetzt muss für die Übertragung eines Bytes jeweils zuerst das höherwertige Nibble und dann das niederwertige Nibble übertragen werden, wie oben beschrieben&lt;br /&gt;
* Mit dem Konfigurier-Befehl $20 das Display konfigurieren (4-Bit, 1 oder 2 Zeilen, 5x7 Format)&lt;br /&gt;
* Mit den restlichen Konfigurierbefehlen die Konfiguration vervollständigen: Display ein/aus, Cursor ein/aus, etc.&lt;br /&gt;
&lt;br /&gt;
Eine Begründung, warum die ersten Befehle dreifach geschickt werden sollen, findet sich [http://www.mikrocontroller.net/topic/158983#1508510 im Forum].&lt;br /&gt;
&lt;br /&gt;
=== Initialisierung für 8 Bit Modus ===&lt;br /&gt;
&lt;br /&gt;
Der Vollständigkeit halber hier noch die notwendige Initialiserungssequenz für den 8 Bit Modus. Da hier die Daten komplett als 1 Byte übertragen werden können, sind einige Klimmzüge wie im 4 Bit Modus nicht notwendig. Begründung für die anfänglichen Wiederholungen siehe oben.&lt;br /&gt;
&lt;br /&gt;
* Nach dem Anlegen der Betriebsspannung muss eine Zeit von mindestens ca. 15ms gewartet werden, um dem LCD-Kontroller Zeit für seine eigene Initialisierung zu geben&lt;br /&gt;
* $30 ins Steuerregister schreiben (RS = 0)&lt;br /&gt;
* Mindestens 4.1ms warten&lt;br /&gt;
* $30 ins Steuerregister schreiben (RS = 0)&lt;br /&gt;
* Mindestens 100µs warten&lt;br /&gt;
* $30 ins Steuerregister schreiben (RS = 0)&lt;br /&gt;
* Mit dem Konfigurier-Befehl 0x30 das Display konfigurieren (8-Bit, 1 oder 2 Zeilen, 5x7 Format)&lt;br /&gt;
* Mit den restlichen Konfigurierbefehlen die Konfiguration vervollständigen: Display ein/aus, Cursor ein/aus, etc.&lt;br /&gt;
&lt;br /&gt;
== Routinen zur LCD-Ansteuerung im 4-Bit-Modus ==&lt;br /&gt;
&lt;br /&gt;
Im Folgenden werden die bisherigen Grundroutinen zur LCD-Ansteuerung im 4-Bit-Modus zusammengefasst und kommentiert. Die darin enthaltenen Symbole (temp1, PORTD,...) müssen in einem dazugehörenden Hauptprogramm definiert werden. Dies wird nächsten Abschnitt &#039;&#039;Anwendung&#039;&#039; weiter erklärt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;br /&gt;
;;                 LCD-Routinen                ;;&lt;br /&gt;
;;                 ============                ;;&lt;br /&gt;
;;              (c)andreas-s@web.de            ;;&lt;br /&gt;
;;                                             ;;&lt;br /&gt;
;; 4bit-Interface                              ;;&lt;br /&gt;
;; DB4-DB7:       PD0-PD3                      ;;&lt;br /&gt;
;; RS:            PD4                          ;;&lt;br /&gt;
;; E:             PD5                          ;;&lt;br /&gt;
;;                                             ;;&lt;br /&gt;
;; Takt:          4 MHz                        ;;&lt;br /&gt;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 ;sendet ein Datenbyte an das LCD&lt;br /&gt;
lcd_data:&lt;br /&gt;
           mov temp2, temp1             ; &amp;quot;Sicherungskopie&amp;quot; für&lt;br /&gt;
                                        ; die Übertragung des 2.Nibbles&lt;br /&gt;
           swap temp1                   ; Vertauschen&lt;br /&gt;
           andi temp1, 0b00001111       ; oberes Nibble auf Null setzen&lt;br /&gt;
           sbr temp1, 1&amp;lt;&amp;lt;4              ; entspricht 0b00010000 (Anm.1)&lt;br /&gt;
           out PORTD, temp1             ; ausgeben&lt;br /&gt;
           rcall lcd_enable             ; Enable-Routine aufrufen&lt;br /&gt;
                                        ; 2. Nibble, kein swap da es schon&lt;br /&gt;
                                        ; an der richtigen stelle ist&lt;br /&gt;
           andi temp2, 0b00001111       ; obere Hälfte auf Null setzen &lt;br /&gt;
           sbr temp2, 1&amp;lt;&amp;lt;4              ; entspricht 0b00010000&lt;br /&gt;
           out PORTD, temp2             ; ausgeben&lt;br /&gt;
           rcall lcd_enable             ; Enable-Routine aufrufen&lt;br /&gt;
           rcall delay50us              ; Delay-Routine aufrufen&lt;br /&gt;
           ret                          ; zurück zum Hauptprogramm&lt;br /&gt;
&lt;br /&gt;
 ; sendet einen Befehl an das LCD&lt;br /&gt;
lcd_command:                            ; wie lcd_data, nur RS=0&lt;br /&gt;
           mov temp2, temp1&lt;br /&gt;
           swap temp1&lt;br /&gt;
           andi temp1, 0b00001111&lt;br /&gt;
           out PORTD, temp1&lt;br /&gt;
           rcall lcd_enable&lt;br /&gt;
           andi temp2, 0b00001111&lt;br /&gt;
           out PORTD, temp2&lt;br /&gt;
           rcall lcd_enable&lt;br /&gt;
           rcall delay50us&lt;br /&gt;
           ret&lt;br /&gt;
&lt;br /&gt;
 ; erzeugt den Enable-Puls&lt;br /&gt;
 ;&lt;br /&gt;
 ; Bei höherem Takt (&amp;gt;= 8 MHz) kann es notwendig sein, &lt;br /&gt;
 ; vor dem Enable High 1-2 Wartetakte (nop) einzufügen. &lt;br /&gt;
 ; Siehe dazu http://www.mikrocontroller.net/topic/81974#685882&lt;br /&gt;
lcd_enable:&lt;br /&gt;
           sbi PORTD, 5                 ; Enable high&lt;br /&gt;
           nop                          ; mindestens 3 Taktzyklen warten&lt;br /&gt;
           nop&lt;br /&gt;
           nop&lt;br /&gt;
           cbi PORTD, 5                 ; Enable wieder low&lt;br /&gt;
           ret                          ; Und wieder zurück                     &lt;br /&gt;
&lt;br /&gt;
 ; Pause nach jeder Übertragung&lt;br /&gt;
delay50us:                              ; 50µs Pause (bei 4 MHz)&lt;br /&gt;
           ldi  temp1, $42&lt;br /&gt;
delay50us_:dec  temp1&lt;br /&gt;
           brne delay50us_&lt;br /&gt;
           ret                          ; wieder zurück&lt;br /&gt;
&lt;br /&gt;
 ; Längere Pause für manche Befehle&lt;br /&gt;
delay5ms:                               ; 5ms Pause (bei 4 MHz)&lt;br /&gt;
           ldi  temp1, $21&lt;br /&gt;
WGLOOP0:   ldi  temp2, $C9&lt;br /&gt;
WGLOOP1:   dec  temp2&lt;br /&gt;
           brne WGLOOP1&lt;br /&gt;
           dec  temp1&lt;br /&gt;
           brne WGLOOP0&lt;br /&gt;
           ret                          ; wieder zurück&lt;br /&gt;
&lt;br /&gt;
 ; Initialisierung: muss ganz am Anfang des Programms aufgerufen werden&lt;br /&gt;
lcd_init:&lt;br /&gt;
           ldi  temp3,50&lt;br /&gt;
powerupwait:&lt;br /&gt;
           rcall  delay5ms&lt;br /&gt;
           dec  temp3&lt;br /&gt;
           brne powerupwait&lt;br /&gt;
           ldi temp1, 0b00000011        ; muss 3mal hintereinander gesendet&lt;br /&gt;
           out PORTD, temp1             ; werden zur Initialisierung&lt;br /&gt;
           rcall lcd_enable             ; 1&lt;br /&gt;
           rcall delay5ms&lt;br /&gt;
           rcall lcd_enable             ; 2&lt;br /&gt;
           rcall delay5ms&lt;br /&gt;
           rcall lcd_enable             ; und 3!&lt;br /&gt;
           rcall delay5ms&lt;br /&gt;
           ldi temp1, 0b00000010        ; 4bit-Modus einstellen&lt;br /&gt;
           out PORTD, temp1&lt;br /&gt;
           rcall lcd_enable&lt;br /&gt;
           rcall delay5ms&lt;br /&gt;
           ldi temp1, 0b00101000        ; 4Bit / 2 Zeilen / 5x8&lt;br /&gt;
           rcall lcd_command&lt;br /&gt;
           ldi temp1, 0b00001100        ; Display ein / Cursor aus / kein Blinken&lt;br /&gt;
           rcall lcd_command&lt;br /&gt;
           ldi temp1, 0b00000100        ; inkrement / kein Scrollen&lt;br /&gt;
           rcall lcd_command&lt;br /&gt;
           ret&lt;br /&gt;
&lt;br /&gt;
 ; Sendet den Befehl zur Löschung des Displays&lt;br /&gt;
lcd_clear:&lt;br /&gt;
           ldi temp1, 0b00000001   ; Display löschen&lt;br /&gt;
           rcall lcd_command&lt;br /&gt;
           rcall delay5ms&lt;br /&gt;
           ret&lt;br /&gt;
&lt;br /&gt;
 ; Sendet den Befehl: Cursor Home&lt;br /&gt;
lcd_home:&lt;br /&gt;
           ldi temp1, 0b00000010   ; Cursor Home&lt;br /&gt;
           rcall lcd_command&lt;br /&gt;
           rcall delay5ms&lt;br /&gt;
           ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anm.1: Siehe [[Bitmanipulation]]&lt;br /&gt;
&lt;br /&gt;
Weitere Funktionen (wie z.&amp;amp;nbsp;B. Cursorposition verändern) sollten mit Hilfe der [[AVR-Tutorial:_LCD#Welche_Befehle_versteht_das_LCD.3F|Befehlscodeliste]] nicht schwer zu realisieren sein. Einfach den Code in temp laden, lcd_command aufrufen und ggf. eine Pause einfügen.&amp;lt;br&amp;gt; &lt;br /&gt;
Natürlich kann man die LCD-Ansteuerung auch an einen anderen Port des Mikrocontrollers &amp;quot;verschieben&amp;quot;: Wenn das LCD z.&amp;amp;nbsp;B. an Port B angeschlossen ist, dann reicht es, im Programm alle &amp;quot;PORTD&amp;quot; durch &amp;quot;PORTB&amp;quot; und &amp;quot;DDRD&amp;quot; durch &amp;quot;DDRB&amp;quot; zu ersetzen.&amp;lt;br&amp;gt; &lt;br /&gt;
Wer eine höhere Taktfrequenz als 4 MHz verwendet, der sollte daran denken, die Dauer der Verzögerungsschleifen anzupassen.&lt;br /&gt;
&lt;br /&gt;
==Anwendung==&lt;br /&gt;
&lt;br /&gt;
Ein Programm, das diese Routinen zur Anzeige von Text verwendet, kann z.&amp;amp;nbsp;B. so aussehen (die Datei lcd-routines.asm muss sich im gleichen Verzeichnis befinden). Nach der Initialisierung wird zuerst der Displayinhalt gelöscht. Um dem LCD ein Zeichen zu schicken, lädt man es in temp1 und ruft die Routine &amp;quot;lcd_data&amp;quot; auf. Das folgende Beispiel zeigt das Wort &amp;quot;Test&amp;quot; auf dem LCD an. &lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/sourcecode/tutorial/lcd-test.asm Download lcd-test.asm] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; .def definiert ein Synonym (Namen) für ein µC Register&lt;br /&gt;
.def temp1 = r16&lt;br /&gt;
.def temp2 = r17&lt;br /&gt;
.def temp3 = r18&lt;br /&gt;
&lt;br /&gt;
           ldi temp1, LOW(RAMEND)      ; LOW-Byte der obersten RAM-Adresse&lt;br /&gt;
           out SPL, temp1&lt;br /&gt;
           ldi temp1, HIGH(RAMEND)     ; HIGH-Byte der obersten RAM-Adresse&lt;br /&gt;
           out SPH, temp1&lt;br /&gt;
&lt;br /&gt;
           ldi temp1, 0xFF    ; Port D = Ausgang&lt;br /&gt;
           out DDRD, temp1&lt;br /&gt;
&lt;br /&gt;
           rcall lcd_init     ; Display initialisieren&lt;br /&gt;
           rcall lcd_clear    ; Display löschen&lt;br /&gt;
&lt;br /&gt;
           ldi temp1, &#039;T&#039;     ; Zeichen anzeigen&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
&lt;br /&gt;
           ldi temp1, &#039;e&#039;     ; Zeichen anzeigen&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
           &lt;br /&gt;
           ldi temp1, &#039;s&#039;     ; Zeichen anzeigen&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
&lt;br /&gt;
           ldi temp1, &#039;t&#039;     ; Zeichen anzeigen&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
&lt;br /&gt;
loop:&lt;br /&gt;
           rjmp loop&lt;br /&gt;
&lt;br /&gt;
.include &amp;quot;lcd-routines.asm&amp;quot;            ; LCD-Routinen werden hier eingefügt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für längere Texte ist die Methode, jedes Zeichen einzeln in das Register zu laden und &amp;quot;lcd_data&amp;quot; aufzurufen natürlich nicht sehr praktisch. Dazu später aber mehr.&lt;br /&gt;
&lt;br /&gt;
Bisher wurden in Register immer irgendwelche Zahlenwerte geladen, aber in diesem Programm kommt plötzlich die Anweisung&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
           ldi temp1, &#039;T&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
vor. Wie ist diese zu verstehen? Passiert hier etwas grundlegend anderes als beim Laden einer Zahl in ein Register?&lt;br /&gt;
&lt;br /&gt;
Die Antwort darauf lautet: Nein. Auch hier wird letztendlich nur eine Zahl in ein Register geladen. Der Schlüssel zum Verständnis beruht darauf, dass zum LCD, so wie zu allen Ausgabegeräten, für die Ausgabe von Texten immer nur Zahlen übertragen werden, sog. Codes. Zum Beispiel könnte man vereinbaren, dass ein LCD, wenn es den Ausgabecode 65 erhält, ein &#039;A&#039; anzeigt, bei einem Ausgabecode von 66 ein &#039;B&#039; usw. Naturgemäß gibt es daher viele verschiedene Code-Buchstaben Zuordnungen. Damit hier etwas Ordnung in das potentielle Chaos kommt, hat man sich bereits in der Steinzeit der Programmierung auf bestimmte Codetabellen geeinigt, von denen die verbreitetste sicherlich die ASCII-Zuordnung ist.&lt;br /&gt;
&lt;br /&gt;
==ASCII==&lt;br /&gt;
&lt;br /&gt;
ASCII steht für &#039;&#039;American Standard Code for Information Interchange&#039;&#039; und ist ein standardisierter Code zur Zeichenumsetzung. Die Codetabelle sieht hexadezimal dabei wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
!   ||x0||x1||x2||x3||x4||x5||x6||x7||x8||x9||xA||xB||xC||xD||xE||xF&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background-color:#ffddcc&amp;quot;| 0x&lt;br /&gt;
|NUL||SOH||STX||ETX||EOT||ENQ||ACK||BEL||BS||HT||LF||VT||FF||CR||SO||SI&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background-color:#ffddcc&amp;quot;| 1x&lt;br /&gt;
|DLE||DC1||DC2||DC3||DC4||NAK||SYN||ETB||CAN||EM||SUB||ESC||FS||GS||RS||US&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background-color:#ffddcc&amp;quot;| 2x&lt;br /&gt;
|SP||!||&amp;quot;||#||$||%||&amp;amp;||&#039;||(||)||*||+||,||-||.||/&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background-color:#ffddcc&amp;quot;| 3x&lt;br /&gt;
|0||1||2||3||4||5||6||7||8||9||:||;||&amp;lt;||=||&amp;gt;||?&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background-color:#ffddcc&amp;quot;| 4x&lt;br /&gt;
|@||A||B||C||D||E||F||G||H||I||J||K||L||M||N||O&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background-color:#ffddcc&amp;quot;| 5x&lt;br /&gt;
|P||Q||R||S||T||U||V||W||X||Y||Z||[||\||]||^||_&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background-color:#ffddcc&amp;quot;| 6x&lt;br /&gt;
|`||a||b||c||d||e||f||g||h||i||j||k||l||m||n||o&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background-color:#ffddcc&amp;quot;| 7x&lt;br /&gt;
|p||q||r||s||t||u||v||w||x||y||z||{|| &amp;amp;#124; ||}||~||DEL&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die ersten beiden Zeilen enthalten die Codes für einige Steuerzeichen, ihre vollständige Beschreibung würde hier zu weit führen. Das Zeichen &#039;&#039;&#039;SP&#039;&#039;&#039; steht für ein &#039;&#039;Space&#039;&#039;, also ein Leerzeichen. &#039;&#039;&#039;BS&#039;&#039;&#039; steht für &#039;&#039;Backspace&#039;&#039;, also ein Zeichen zurück. &#039;&#039;&#039;DEL&#039;&#039;&#039; steht für &#039;&#039;Delete&#039;&#039;, also das Löschen eines Zeichens. &#039;&#039;&#039;CR&#039;&#039;&#039; steht für &#039;&#039;Carriage Return&#039;&#039;, also wörtlich: der Wagenrücklauf (einer Schreibmaschine), während &#039;&#039;&#039;LF&#039;&#039;&#039; für &#039;&#039;Line feed&#039;&#039;, also einen Zeilenvorschub steht.&lt;br /&gt;
&lt;br /&gt;
Der Assembler kennt diese Codetabelle und ersetzt die Zeile&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
           ldi temp1, &#039;T&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
durch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
           ldi temp1, $54&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
was letztendlich auch der Lesbarkeit des Programmes zugute kommt. Funktional besteht kein Unterschied zwischen den beiden Anweisungen. Beide bewirken, dass das Register temp1 mit dem Bitmuster 01010100 ( = hexadezimal 54, = dezimal 84 oder eben der ASCII Code für &#039;&#039;&#039;T&#039;&#039;&#039;) geladen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das LCD wiederrum kennt diese Code-Tabelle ebenfalls und wenn es über den Datenbus die Codezahl $54 zur Anzeige empfängt, dann schreibt es ein &#039;&#039;&#039;T&#039;&#039;&#039; an die aktuelle Cursorposition. Genauer gesagt, weiss das LCD nichts von einem &#039;&#039;&#039;T&#039;&#039;&#039;. Es sieht einfach in seinen internen Tabellen nach, welche Pixel beim Empfang der Codezahl $54 auf schwarz zu setzen sind. &#039;Zufällig&#039; sind das genau jene Pixel, die für uns Menschen ein &#039;&#039;&#039;T&#039;&#039;&#039; ergeben.&lt;br /&gt;
&lt;br /&gt;
==Welche Befehle versteht das LCD?==&lt;br /&gt;
&lt;br /&gt;
Auf dem LCD arbeitet ein Controller vom Typ HD44780. Dieser Kontroller versteht eine Reihe von Befehlen, die allesamt mittels lcd_command gesendet werden können. Ein Kommando ist dabei nichts anderes als ein Befehlsbyte, in dem die verschiedenen Bits verschiedene Bedeutungen haben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
! Bitwert   || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
||dieses Bit muss 0 sein&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
||dieses Bit muss 1 sein&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  x&lt;br /&gt;
||der Zustand dieses Bits ist egal&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; | sonstige Buchstaben&lt;br /&gt;
||das Bit muss je nach gewünschter Funktionalität gesetzt werden.&amp;lt;br /&amp;gt;Die mögliche Funktionalität des jeweiligen Bits geht aus der Befehlsbeschreibung hervor.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel: Das Kommando &#039;ON/OFF Control&#039; soll benutzt werden, um das Display einzuschalten, der Cursor soll eingeschaltet werden und der Cursor soll blinken.&lt;br /&gt;
Das Befehlsbyte ist so aufgebaut:&lt;br /&gt;
   0b00001dcb&lt;br /&gt;
Aus der Befehlsbeschreibung entnimmt man:&lt;br /&gt;
* Display ein bedeutet, dass an der Bitposition d eine 1 stehen muss.&amp;lt;br&amp;gt;&lt;br /&gt;
* Cursor ein bedeutet, dass an der Bitposition c ein 1 stehen muss.&amp;lt;br&amp;gt;&lt;br /&gt;
* Cursor blinken bedeutet, dass an der Bitposition b eine 1 stehen muss.&amp;lt;br&amp;gt;&lt;br /&gt;
Das dafür zu übertragende Befehlsbyte hat also die Gestalt 0b00001111 oder in hexadezimaler Schreibweise $0F.&lt;br /&gt;
&lt;br /&gt;
===Clear display: 0b00000001===&lt;br /&gt;
&lt;br /&gt;
Die Anzeige wird gelöscht und der Ausgabecursor kehrt an die Home Position (links, erste Zeile) zurück.&lt;br /&gt;
&lt;br /&gt;
Ausführungszeit: 1.64ms&lt;br /&gt;
&lt;br /&gt;
===Cursor home: 0b0000001x===&lt;br /&gt;
&lt;br /&gt;
Der Cursor kehrt an die Home Position (links, erste Zeile) zurück. Ein verschobenes Display wird auf die Grundeinstellung zurückgesetzt.&lt;br /&gt;
&lt;br /&gt;
Ausführungszeit: 40µs bis 1.64ms&lt;br /&gt;
&lt;br /&gt;
===Entry mode: 0b000001is===&lt;br /&gt;
&lt;br /&gt;
Legt die Cursor Richtung sowie eine mögliche Verschiebung des Displays fest&lt;br /&gt;
* i = 1, Cursorposition bei Ausgabe eines Zeichens erhöhen&lt;br /&gt;
* i = 0, Cursorposition bei Ausgabe eines Zeichens vermindern&lt;br /&gt;
* s = 1, Display wird gescrollt, wenn der Cursor das Ende/Anfang, je nach Einstellung von i, erreicht hat.&lt;br /&gt;
&lt;br /&gt;
Ausführungszeit: 40µs&lt;br /&gt;
&lt;br /&gt;
===On/off control: 0b00001dcb===&lt;br /&gt;
&lt;br /&gt;
Display insgesamt ein/ausschalten; den Cursor ein/ausschalten; den Cursor auf blinken schalten/blinken aus. Wenn das Display ausgeschaltet wird, geht der Inhalt des Displays nicht verloren. Der vorher angezeigte Text wird nach wiedereinschalten erneut angezeigt.&lt;br /&gt;
Ist der Cursor eingeschaltet, aber Blinken ausgeschaltet, so wird der Cursor als Cursorzeile in Pixelzeile 8 dargestellt. Ist Blinken eingeschaltet, wird der Cursor als blinkendes ausgefülltes Rechteck dargestellt, welches abwechselnd mit dem Buchstaben an dieser Stelle angezeigt wird.&lt;br /&gt;
&lt;br /&gt;
* d = 0, Display aus&lt;br /&gt;
* d = 1, Display ein&lt;br /&gt;
* c = 0, Cursor aus&lt;br /&gt;
* c = 1, Cursor ein&lt;br /&gt;
* b = 0, Cursor blinken aus&lt;br /&gt;
* b = 1, Cursor blinken ein&lt;br /&gt;
 &lt;br /&gt;
Ausführungszeit: 40µs&lt;br /&gt;
&lt;br /&gt;
===Cursor/Scrollen: 0b0001srxx===&lt;br /&gt;
&lt;br /&gt;
Bewegt den Cursor oder scrollt das Display um eine Position entweder nach rechts oder nach links.&lt;br /&gt;
&lt;br /&gt;
* s = 1, Display scrollen&lt;br /&gt;
* s = 0, Cursor bewegen&lt;br /&gt;
* r = 1, nach rechts&lt;br /&gt;
* r = 0, nach links &lt;br /&gt;
&lt;br /&gt;
Ausführungszeit: 40µs&lt;br /&gt;
&lt;br /&gt;
===Konfiguration: 0b001dnfxx===&lt;br /&gt;
&lt;br /&gt;
Einstellen der Interface Art, Modus, Font&lt;br /&gt;
* d = 0, 4-Bit Interface&lt;br /&gt;
* d = 1, 8-Bit Interface&lt;br /&gt;
* n = 0, 1 zeilig&lt;br /&gt;
* n = 1, 2 zeilig&lt;br /&gt;
* f = 0, 5x7 Pixel&lt;br /&gt;
* f = 1, 5x11 Pixel&lt;br /&gt;
&lt;br /&gt;
Ausführungszeit: 40µs&lt;br /&gt;
&lt;br /&gt;
===Character RAM Address Set: 0b01aaaaaa===&lt;br /&gt;
&lt;br /&gt;
Mit diesem Kommando werden maximal 8 selbst definierte Zeichen definiert. Dazu wird der Character RAM Zeiger auf den Anfang des Character Generator (CG) RAM gesetzt und das Zeichen durch die Ausgabe von 8 Byte definiert. Der Adresszeiger wird nach Ausgabe jeder Pixelspalte (8 Bit) vom LCD selbst erhöht. Nach Beendigung der Zeichendefinition muss die Schreibposition explizit mit dem Kommando &amp;quot;Display RAM Address Set&amp;quot; wieder in den DD-RAM Bereich gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
aaaaaa 6-bit CG RAM Adresse&lt;br /&gt;
&lt;br /&gt;
Ausführungszeit: 40µs&lt;br /&gt;
&lt;br /&gt;
===Display RAM Address Set: 0b1aaaaaaa===&lt;br /&gt;
&lt;br /&gt;
Den Cursor neu positionieren. Display Data (DD) Ram ist vom Character Generator (CG) Ram unabhängig. Der Adresszeiger wird bei Ausgabe eines Zeichens ins DD Ram automatisch erhöht. Das Display verhält sich so, als ob eine Zeile immer aus 40 logischen Zeichen besteht, von der, je nach konkretem Displaytyp (16 Zeichen, 20 Zeichen) immer nur ein Teil sichtbar ist.&lt;br /&gt;
&lt;br /&gt;
aaaaaaa 7-bit DD RAM Adresse. Auf 2-zeiligen Displays (und den meisten 16x1 Displays), kann die Adressangabe wie folgt interpretiert werden:&lt;br /&gt;
&lt;br /&gt;
1laaaaaa&lt;br /&gt;
* l = Zeilennummer (0 oder 1)&lt;br /&gt;
* a = 6-Bit Spaltennummer&lt;br /&gt;
&lt;br /&gt;
 --------------------------------&lt;br /&gt;
 DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0&lt;br /&gt;
 --- --- --- --- --- --- --- ---&lt;br /&gt;
  1   A   A   A   A   A   A   A &lt;br /&gt;
&lt;br /&gt;
Setzt die DDRAM Adresse:&lt;br /&gt;
&lt;br /&gt;
Wenn N = 0 (1 line display)&lt;br /&gt;
    AAAAAAA = &amp;quot;00h&amp;quot; - &amp;quot;4Fh&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wenn N = 1 (2 line display) ((1x16))&lt;br /&gt;
    AAAAAAA = &amp;quot;00h&amp;quot; - &amp;quot;27h&amp;quot; Zeile 1. (0x80) &lt;br /&gt;
    AAAAAAA = &amp;quot;40h&amp;quot; - &amp;quot;67h&amp;quot; Zeile 2. (0xC0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ausführungszeit: 40µs&lt;br /&gt;
&lt;br /&gt;
==Einschub: Code aufräumen==&lt;br /&gt;
&lt;br /&gt;
Es wird Zeit, sich einmal etwas kritisch mit den bisher geschriebenen Funktionen auseinander zu setzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Portnamen aus dem Code herausziehen===&lt;br /&gt;
&lt;br /&gt;
Wenn wir die LCD-Funktionen einmal genauer betrachten, dann fällt sofort auf, dass über die Funktionen verstreut immer wieder das &#039;&#039;&#039;PORTD&#039;&#039;&#039; sowie einzelne Zahlen für die Pins an diesem Port auftauchen. Wenn das LCD an einem anderen Port betrieben werden soll, oder sich die Pin-Belegung ändert, dann muss an all diesen Stellen eine Anpassung vorgenommen werden. Dabei darf keine einzige Stelle übersehen werden, ansonsten würden die LCD-Funktionen nicht oder nicht vollständig funktionieren.&lt;br /&gt;
&lt;br /&gt;
Eine Möglichkeit, dem vorzubeugen, ist es, diese immer gleichbleibenden Dinge an den Anfang der LCD-Funktionen vorzuziehen. Anstelle von PORTD wird dann im Code ein anderer Name benutzt, den man frei vergeben kann. Dem Assembler wird nur noch mitgeteilt, das dieser Name für PORTD steht. Muss das LCD an einen anderen Port angeschlossen werden, so wird nur diese Zurodnung geändert und der Assembler passt dann im restlichen Code alle davon abhängigen Anweisungen an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;br /&gt;
;;                 LCD-Routinen                ;;&lt;br /&gt;
;;                 ============                ;;&lt;br /&gt;
;;              (c)andreas-s@web.de            ;;&lt;br /&gt;
;;                                             ;;&lt;br /&gt;
;; 4bit-Interface                              ;;&lt;br /&gt;
;; DB4-DB7:       PD0-PD3                      ;;&lt;br /&gt;
;; RS:            PD4                          ;;&lt;br /&gt;
;; E:             PD5                          ;;&lt;br /&gt;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;br /&gt;
 &lt;br /&gt;
; .equ definiert ein Symbol und dessen Wert&lt;br /&gt;
.equ LCD_PORT = PORTD&lt;br /&gt;
.equ LCD_DDR  = DDRD&lt;br /&gt;
.equ PIN_E    = 5&lt;br /&gt;
.equ PIN_RS   = 4&lt;br /&gt;
&lt;br /&gt;
 ;sendet ein Datenbyte an das LCD&lt;br /&gt;
lcd_data:&lt;br /&gt;
           mov temp2, temp1             ; &amp;quot;Sicherungskopie&amp;quot; für&lt;br /&gt;
                                        ; die Übertragung des 2.Nibbles&lt;br /&gt;
           swap temp1                   ; Vertauschen&lt;br /&gt;
           andi temp1, 0b00001111       ; oberes Nibble auf Null setzen&lt;br /&gt;
           sbr temp1, 1&amp;lt;&amp;lt;PIN_RS         ; entspricht 0b00010000&lt;br /&gt;
           out LCD_PORT, temp1          ; ausgeben&lt;br /&gt;
           rcall lcd_enable             ; Enable-Routine aufrufen&lt;br /&gt;
                                        ; 2. Nibble, kein swap da es schon&lt;br /&gt;
                                        ; an der richtigen stelle ist&lt;br /&gt;
           andi temp2, 0b00001111       ; obere Hälfte auf Null setzen &lt;br /&gt;
           sbr temp2, 1&amp;lt;&amp;lt;PIN_RS         ; entspricht 0b00010000&lt;br /&gt;
           out LCD_PORT, temp2          ; ausgeben&lt;br /&gt;
           rcall lcd_enable             ; Enable-Routine aufrufen&lt;br /&gt;
           rcall delay50us              ; Delay-Routine aufrufen&lt;br /&gt;
           ret                          ; zurück zum Hauptprogramm&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 ; sendet einen Befehl an das LCD&lt;br /&gt;
&lt;br /&gt;
lcd_command:                            ; wie lcd_data, nur RS=0&lt;br /&gt;
           mov temp2, temp1&lt;br /&gt;
           swap temp1&lt;br /&gt;
           andi temp1, 0b00001111&lt;br /&gt;
           out LCD_PORT, temp1&lt;br /&gt;
           rcall lcd_enable&lt;br /&gt;
           andi temp2, 0b00001111&lt;br /&gt;
           out LCD_PORT, temp2&lt;br /&gt;
           rcall lcd_enable&lt;br /&gt;
           rcall delay50us&lt;br /&gt;
           ret&lt;br /&gt;
 &lt;br /&gt;
 ; erzeugt den Enable-Puls&lt;br /&gt;
lcd_enable:&lt;br /&gt;
           sbi LCD_PORT, PIN_E          ; Enable high&lt;br /&gt;
           nop                          ; 3 Taktzyklen warten&lt;br /&gt;
           nop&lt;br /&gt;
           nop&lt;br /&gt;
           cbi LCD_PORT, PIN_E          ; Enable wieder low&lt;br /&gt;
           ret                          ; Und wieder zurück                     &lt;br /&gt;
 &lt;br /&gt;
 ; Pause nach jeder Übertragung&lt;br /&gt;
delay50us:                              ; 50µs Pause&lt;br /&gt;
           ldi  temp1, $42&lt;br /&gt;
delay50us_:dec  temp1&lt;br /&gt;
           brne delay50us_&lt;br /&gt;
           ret                          ; wieder zurück&lt;br /&gt;
 &lt;br /&gt;
 ; Längere Pause für manche Befehle&lt;br /&gt;
delay5ms:                               ; 5ms Pause&lt;br /&gt;
           ldi  temp1, $21&lt;br /&gt;
WGLOOP0:   ldi  temp2, $C9&lt;br /&gt;
WGLOOP1:   dec  temp2&lt;br /&gt;
           brne WGLOOP1&lt;br /&gt;
           dec  temp1&lt;br /&gt;
           brne WGLOOP0&lt;br /&gt;
           ret                          ; wieder zurück&lt;br /&gt;
 &lt;br /&gt;
 ; Initialisierung: muss ganz am Anfang des Programms aufgerufen werden&lt;br /&gt;
lcd_init:&lt;br /&gt;
           ldi   temp1, 0xFF            ; alle Pins am Ausgabeport auf Ausgang&lt;br /&gt;
           out   LCD_DDR, temp1&lt;br /&gt;
&lt;br /&gt;
           ldi   temp3,6&lt;br /&gt;
powerupwait:&lt;br /&gt;
           rcall delay5ms&lt;br /&gt;
           dec   temp3&lt;br /&gt;
           brne  powerupwait&lt;br /&gt;
           ldi   temp1,    0b00000011   ; muss 3mal hintereinander gesendet&lt;br /&gt;
           out   LCD_PORT, temp1        ; werden zur Initialisierung&lt;br /&gt;
           rcall lcd_enable             ; 1&lt;br /&gt;
           rcall delay5ms&lt;br /&gt;
           rcall lcd_enable             ; 2&lt;br /&gt;
           rcall delay5ms&lt;br /&gt;
           rcall lcd_enable             ; und 3!&lt;br /&gt;
           rcall delay5ms&lt;br /&gt;
           ldi   temp1, 0b00000010      ; 4bit-Modus einstellen&lt;br /&gt;
           out   LCD_PORT, temp1&lt;br /&gt;
           rcall lcd_enable&lt;br /&gt;
           rcall delay5ms&lt;br /&gt;
           ldi   temp1, 0b00101000      ; 4 Bit, 2 Zeilen&lt;br /&gt;
           rcall lcd_command&lt;br /&gt;
           ldi   temp1, 0b00001100      ; Display on, Cursor off&lt;br /&gt;
           rcall lcd_command&lt;br /&gt;
           ldi   temp1, 0b00000100      ; endlich fertig&lt;br /&gt;
           rcall lcd_command&lt;br /&gt;
           ret&lt;br /&gt;
 &lt;br /&gt;
 ; Sendet den Befehl zur Löschung des Displays&lt;br /&gt;
lcd_clear:&lt;br /&gt;
           ldi   temp1, 0b00000001      ; Display löschen&lt;br /&gt;
           rcall lcd_command&lt;br /&gt;
           rcall delay5ms&lt;br /&gt;
           ret&lt;br /&gt;
&lt;br /&gt;
 ; Sendet den Befehl: Cursor Home&lt;br /&gt;
lcd_home:&lt;br /&gt;
           ldi   temp1, 0b00000010      ; Cursor Home&lt;br /&gt;
           rcall lcd_command&lt;br /&gt;
           rcall delay5ms&lt;br /&gt;
           ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittels &#039;&#039;&#039;.equ&#039;&#039;&#039; werden mit dem Assembler Textersetzungen vereinbart. Der Assembler ersetzt alle Vorkomnisse des Quelltextes durch den zu ersetzenden Text. Dadurch ist es z.&amp;amp;nbsp;B. möglich, alle Vorkommnisse von &#039;&#039;&#039;PORTD&#039;&#039;&#039; durch &#039;&#039;&#039;LCD_PORT&#039;&#039;&#039; auszutauschen. Wird das LCD an einen anderen Port, z.&amp;amp;nbsp;B. &#039;&#039;&#039;PORTB&#039;&#039;&#039; gelegt, dann genügt es, die Zeilen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.equ LCD_PORT = PORTD&lt;br /&gt;
.equ LCD_DDR  = DDRD&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
durch&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.equ LCD_PORT = PORTB&lt;br /&gt;
.equ LCD_DDR  = DDRB&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
zu ersetzen. Der Assembler sorgt dann dafür, dass diese Portänderung an den relevanten Stellen im Code über die Textersetzungen einfließt. Selbiges natürlich mit der Pin-Zuordnung.&lt;br /&gt;
&lt;br /&gt;
===Registerbenutzung===&lt;br /&gt;
&lt;br /&gt;
Bei diesen Funktionen mussten einige Register des Prozessors benutzt werden, um darin Zwischenergebnisse zu speichern bzw. zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
Beachtet werden muss dabei natürlich, dass es zu keinen Überschneidungen kommt. Solange nur jede Funktion jeweils für sich betrachtet wird, ist das kein Problem. In 20 oder 30 Code-Zeilen kann man gut verfolgen, welches Register wofür benutzt wird. Schwieriger wird es, wenn Funktionen wiederum andere Funktionen aufrufen, die ihrerseits wieder Funktionen aufrufen usw. Jede dieser Funktionen benutzt einige Register und mit zunehmender Programmgröße wird es immer schwieriger, zu verfolgen, welches Register zu welchem Zeitpunkt wofür benutzt wird.&lt;br /&gt;
&lt;br /&gt;
Speziell bei Basisfunktionen wie diesen LCD-Funktionen, ist es daher oft ratsam, dafür zu sorgen, dass jede Funktion die Register wieder in dem Zustand hinterlässt, indem sie sie auch vorgefunden hat. Wir benötigen dazu wieder den Stack, auf dem die Registerinhalte bei Betreten einer Funktion zwischengespeichert werden und von dem die Register bei Verlassen einer Funktion wiederhergestellt werden.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir die Funktion&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
 ; Sendet den Befehl zur Löschung des Displays&lt;br /&gt;
lcd_clear:&lt;br /&gt;
           ldi   temp1, 0b00000001      ; Display löschen&lt;br /&gt;
           rcall lcd_command&lt;br /&gt;
           rcall delay5ms&lt;br /&gt;
           ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Funktion verändert das Register temp1. Um das Register abzusichern, schreiben wir die Funktion um:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
 ; Sendet den Befehl zur Löschung des Displays&lt;br /&gt;
lcd_clear:&lt;br /&gt;
           push  temp1                  ; temp1 auf dem Stack sichern&lt;br /&gt;
           ldi   temp1, 0b00000001      ; Display löschen&lt;br /&gt;
           rcall lcd_command&lt;br /&gt;
           rcall delay5ms&lt;br /&gt;
           pop   temp1                  ; temp1 vom Stack wiederherstellen&lt;br /&gt;
           ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Am besten hält man sich an die Regel: Jede Funktion ist dafür zuständig, die Register zu sichern und wieder herzustellen, die sie auch selbst verändert. &#039;&#039;&#039;lcd_clear&#039;&#039;&#039; ruft die Funktionen &#039;&#039;&#039;lcd_command&#039;&#039;&#039; und &#039;&#039;&#039;delay5ms&#039;&#039;&#039; auf. Wenn diese Funktionen selbst wieder Register verändern (und das tun sie), so ist es die Aufgabe dieser Funktionen, sich um die Sicherung und das Wiederherstellen der entsprechenden Register zu kümmern. &#039;&#039;&#039;lcd_clear&#039;&#039;&#039; sollte sich nicht darum kümmern müssen. Auf diese Weise ist das Schlimmste, das einem passieren kann, dass ein paar Register unnütz gesichert und wiederhergestellt werden. Das kostet zwar etwas Rechenzeit und etwas Speicherplatz auf dem Stack, ist aber immer noch besser als das andere Extrem: Nach einem Funktionsaufruf haben einige Register nicht mehr den Wert, den sie haben sollten, und das Programm rechnet mit falschen Zahlen weiter.&lt;br /&gt;
&lt;br /&gt;
===Lass den Assembler rechnen===&lt;br /&gt;
Betrachtet man den Code genauer, so fallen einige konstante Zahlenwerte auf (Das vorangestellte $ kennzeichnet die Zahl als Hexadezimalzahl):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
delay50us:                              ; 50µs Pause&lt;br /&gt;
           ldi  temp1, $42&lt;br /&gt;
delay50us_:&lt;br /&gt;
           dec  temp1&lt;br /&gt;
           brne delay50us_&lt;br /&gt;
           ret                          ; wieder zurück&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Code benötigt eine Warteschleife, die mindestens 50µs dauert. Die beiden Befehle innerhalb der Schleife benötigen 3 Takte: 1 Takt für den &#039;&#039;&#039;dec&#039;&#039;&#039; und der &#039;&#039;&#039;brne&#039;&#039;&#039; benötigt 2 Takte, wenn die Bedingung zutrifft, der Branch also genommen wird. Bei 4 Mhz werden also 4000000 / 3 * 50 / 1000000 = 66.6 Durchläufe durch die Schleife benötigt, um eine Verzögerungszeit von 50µs (0.000050 Sekunden) zu erreichen, hexadezimal ausgedrückt: $42.&lt;br /&gt;
&lt;br /&gt;
Der springende Punkt ist: Bei anderen Taktfrequenzen müsste man nun jedesmal diese Berechnung machen und den entsprechenden Zahlenwert einsetzen. Das kann aber der Assembler genausogut erledigen. Am Anfang des Codes wird ein Eintrag definiert, der die Taktfrequenz festlegt. Traditionell heißt dieser Eintrag &amp;lt;i&amp;gt;XTAL&amp;lt;/i&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.equ XTAL  = 4000000&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
delay50us:                              ; 50µs Pause&lt;br /&gt;
           ldi  temp1, ( XTAL * 50 / 3 ) / 1000000&lt;br /&gt;
delay50us_:&lt;br /&gt;
           dec  temp1&lt;br /&gt;
           brne delay50us_&lt;br /&gt;
           ret                          ; wieder zurück&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An einer anderen Codestelle gibt es weitere derartige magische Zahlen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
 ; Längere Pause für manche Befehle&lt;br /&gt;
delay5ms:                               ; 5ms Pause&lt;br /&gt;
           ldi  temp1, $21&lt;br /&gt;
WGLOOP0:   ldi  temp2, $C9&lt;br /&gt;
WGLOOP1:   dec  temp2&lt;br /&gt;
           brne WGLOOP1&lt;br /&gt;
           dec  temp1&lt;br /&gt;
           brne WGLOOP0&lt;br /&gt;
           ret                          ; wieder zurück&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was geht hier vor?&lt;br /&gt;
Die innere Schleife benötigt wieder 3 Takte pro Durchlauf. Bei $C9 = 201 Durchläufen werden also 201 * 3 = 603 Takte verbraucht. In der äußeren Schleife werden pro Durchlauf also 603 + 1 + 2 = 606 Takte verbraucht und einmal 605 Takte (weil der brne nicht genommen wird). Da die äußere Schleife $21 = 33 mal wiederholt wird, werden 32 * 606 + 605 = 19997 Takte verbraucht. Noch 1 Takt mehr für den allerersten ldi und 4 Takte für den ret, macht 20002 Takte. Bei 4Mhz benötigt der Prozessor 20002 / 4000000 = 0.0050005 Sekunden, also rund 5 ms. Die 7. nachkommastelle kann man an dieser Stelle getrost ignorieren. Vor allen Dingen auch deshalb, weil auch der Quarz nicht exakt 4000000 Schwingungen in der Sekunde durchführen wird.&lt;br /&gt;
Wird der Wiederholwert für die innere Schleife bei $C9 belassen, so werden 4000000 / 607 * 5 / 1000 Wiederholungen der äusseren Schleife benötigt. (Die Berechnung wurde hier etwas vereinfacht, die nicht berücksichtigten Takte fallen zeitmässig nicht weiter ins Gewicht bzw. wurden dadurch berücksichtigt, dass mit 607 anstelle von 606 gerechnet wird). Auch diese Berechnung kann wieder der Assembler übernehmen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
 ; Längere Pause für manche Befehle&lt;br /&gt;
delay5ms:                               ; 5ms Pause&lt;br /&gt;
           ldi  temp1, ( XTAL * 5 / 607 ) / 1000&lt;br /&gt;
WGLOOP0:   ldi  temp2, $C9&lt;br /&gt;
WGLOOP1:   dec  temp2&lt;br /&gt;
           brne WGLOOP1&lt;br /&gt;
           dec  temp1&lt;br /&gt;
           brne WGLOOP0&lt;br /&gt;
           ret                          ; wieder zurück&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein kleines Problem kann bei der Verwendung dieses Verfahrens entstehen: Bei hohen Taktfrequenzen und großen Wartezeiten kann der berechnete Wert größer als 255 werden und man bekommt die Fehlermeldung &amp;quot;Operand(s) out of range&amp;quot; beim Assemblieren. Dieser Fall tritt zum Beispiel für obige Konstruktion bei einer Taktfrequenz von 16 MHz ein (genauer gesagt ab 15,3 MHz), während darunter XTAL beliebig geändert werden kann. Als einfachste Lösung bietet es sich an, die Zahl der Takte pro Schleifendurchlauf durch das Einfügen von &#039;&#039;&#039;nop&#039;&#039;&#039; zu erhöhen und die Berechnungsvorschrift anzupassen.&lt;br /&gt;
&lt;br /&gt;
== Ausgabe eines konstanten Textes ==&lt;br /&gt;
&lt;br /&gt;
Weiter oben wurde schon einmal ein Text ausgegeben. Dies geschah durch Ausgabe von einzelnen Zeichen. Das können wir auch anders machen. Wir können den Text im Speicher ablegen und eine Funktion schreiben, die die einzelnen Zeichen aus dem Speicher liest und aus gibt. Dabei stellt sich Frage: Woher &#039;weiß&#039; die Funktion eigentlich, wie lang der Text ist? Die Antwort darauf lautet: Sie kann es nicht wissen. Wir müssen irgendwelche Vereinbarungen treffen, woran die Funktion erkennen kann, dass der Text zu Ende ist. Im Wesentlichen werden dazu 2 Methoden benutzt:&lt;br /&gt;
* Der Text enthält ein spezielles Zeichen, welches das Ende des Textes markiert&lt;br /&gt;
* Wir speichern nicht nur den Text selbst, sondern auch die Länge des Textes&lt;br /&gt;
Mit einer der beiden Methoden ist es der Textausgabefunktion dann ein Leichtes, den Text vollständig auszugeben.&lt;br /&gt;
&lt;br /&gt;
Wir werden uns im Weiteren dafür entscheiden, ein spezielles Zeichen, eine 0 (den Wert 0, nicht das Zeichen &#039;0&#039;), dafür zu benutzen. Die Ausgabefunktionen werden dann etwas einfacher, als wenn bei der Ausgabe die Anzahl der bereits ausgegebenen Zeichen mitgezählt werden muss.&lt;br /&gt;
&lt;br /&gt;
Den Text selbst speichern wir im Flash-Speicher, also dort, wo auch das Programm gespeichert ist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
 ; Einen konstanten Text aus dem Flash Speicher&lt;br /&gt;
 ; ausgeben. Der Text wird mit einer 0 beendet&lt;br /&gt;
lcd_flash_string:&lt;br /&gt;
           push  temp1&lt;br /&gt;
           push  ZH&lt;br /&gt;
           push  ZL&lt;br /&gt;
&lt;br /&gt;
lcd_flash_string_1:&lt;br /&gt;
           lpm   temp1, Z+&lt;br /&gt;
           cpi   temp1, 0&lt;br /&gt;
           breq  lcd_flash_string_2&lt;br /&gt;
           rcall  lcd_data&lt;br /&gt;
           rjmp  lcd_flash_string_1&lt;br /&gt;
&lt;br /&gt;
lcd_flash_string_2:&lt;br /&gt;
           pop   ZL&lt;br /&gt;
           pop   ZH&lt;br /&gt;
           pop   temp1&lt;br /&gt;
           ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Funktion benutzt den Befehl &#039;&#039;&#039;lpm&#039;&#039;&#039;, um das jeweils nächste Zeichen aus dem Flash Speicher in ein Register zur Weiterverarbeitung zu laden. Dazu wird der sog. &#039;&#039;&#039;Z-Pointer&#039;&#039;&#039; benutzt. So nennt man das Registerpaar &#039;&#039;&#039;R30&#039;&#039;&#039; und &#039;&#039;&#039;R31&#039;&#039;&#039;. Nach jedem Ladevorgang wird dabei durch den Befehl&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
           lpm   temp1, Z+&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
dieser Z-Pointer um 1 erhöht. Mittels &#039;&#039;&#039;cpi&#039;&#039;&#039; wird das in das Register &#039;&#039;&#039;temp1&#039;&#039;&#039; geladene Zeichen mit 0 verglichen. &#039;&#039;&#039;cpi&#039;&#039;&#039; vergleicht die beiden Zahlen und merkt sich das Ergebnis in einem speziellen Register in Form von Status Bits. &#039;&#039;&#039;cpi&#039;&#039;&#039; zieht dabei ganz einfach die beiden Zahlen voneinander ab. Sind sie gleich, so kommt da als Ergebnis 0 heraus und &#039;&#039;&#039;cpi&#039;&#039;&#039; setzt daher konsequenter Weise das Zero-Flag, das anzeigt, dass die vorhergegangene Operation eine 0 als Ergebnis hatte.&#039;&#039;&#039;breq&#039;&#039;&#039; wertet diese Status-Bits aus. Wenn die vorhergegangene Operation ein 0-Ergebnis hatte, das Zero-Flag also gesetzt ist, dann wird ein Sprung zum angegebenen Label durchgeführt. In Summe bewirkt also die Sequenz&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
           cpi   temp1, 0&lt;br /&gt;
           breq  lcd_flash_string_2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
dass das gelesene Zeichen mit 0 verglichen wird und falls das gelesene&lt;br /&gt;
Zeichen tatsächlich 0 war, an der Stelle lcd_flash_string_2 weiter gemacht wird. Im anderen Fall wird die bereits geschriebene Funktion &#039;&#039;&#039;lcd_data&#039;&#039;&#039; aufgerufen, welche das Zeichen ausgibt. &#039;&#039;&#039;lcd_data&#039;&#039;&#039; erwartet dabei das Zeichen im Register &#039;&#039;&#039;temp1&#039;&#039;&#039;, genau in dem Register, in welches wir vorher mittels &#039;&#039;&#039;lpm&#039;&#039;&#039; das Zeichen geladen hatten.&lt;br /&gt;
&lt;br /&gt;
Das verwendende Programm sieht dann so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
.def temp1 = r16&lt;br /&gt;
.def temp2 = r17&lt;br /&gt;
.def temp3 = r18&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
           ldi temp1, LOW(RAMEND)      ; LOW-Byte der obersten RAM-Adresse&lt;br /&gt;
           out SPL, temp1&lt;br /&gt;
           ldi temp1, HIGH(RAMEND)     ; HIGH-Byte der obersten RAM-Adresse&lt;br /&gt;
           out SPH, temp1&lt;br /&gt;
 &lt;br /&gt;
           rcall lcd_init              ; Display initialisieren&lt;br /&gt;
           rcall lcd_clear             ; Display löschen&lt;br /&gt;
 &lt;br /&gt;
           ldi ZL, LOW(text*2)         ; Adresse des Strings in den&lt;br /&gt;
           ldi ZH, HIGH(text*2)        ; Z-Pointer laden&lt;br /&gt;
&lt;br /&gt;
           rcall lcd_flash_string      ; Unterprogramm gibt String aus der&lt;br /&gt;
                                       ; durch den Z-Pointer adressiert wird&lt;br /&gt;
loop:&lt;br /&gt;
           rjmp loop&lt;br /&gt;
&lt;br /&gt;
text:&lt;br /&gt;
           .db &amp;quot;Test&amp;quot;,0                ; Stringkonstante, durch eine 0&lt;br /&gt;
                                       ; abgeschlossen  &lt;br /&gt;
&lt;br /&gt;
.include &amp;quot;lcd-routines.asm&amp;quot;            ; LCD Funktionen&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Genaueres über die Verwendung unterschiedlicher Speicher findet sich im Kapitel [[AVR-Tutorial:_Speicher|Speicher]]&lt;br /&gt;
&lt;br /&gt;
==Zahlen ausgeben==&lt;br /&gt;
Um Zahlen, die beispielsweise in einem Register gespeichert sind, ausgeben zu können, ist es notwendig sich eine Textrepräsentierung der Zahl zu generieren. Die Zahl 123 wird also in den Text &amp;quot;123&amp;quot; umgewandelt welcher dann ausgegeben wird. Aus praktischen Gründen wird allerdings der Text nicht vollständig generiert (man müsste ihn ja irgendwo zwischenspeichern) sondern die einzelnen Buchstaben werden sofort ausgegeben, sobald sie bekannt sind.&lt;br /&gt;
&lt;br /&gt;
===Dezimal ausgeben===&lt;br /&gt;
Das Prinzip der Umwandlung ist einfach. Um herauszufinden wieviele Hunderter in der Zahl 123 enthalten sind, genügt es in einer Schleife immer wieder 100 von der Zahl abzuziehen und mitzuzählen wie oft dies gelang, bevor das Ergebnis negativ wurde. In diesem Fall lautet die Antwort: 1 mal, denn 123 - 100 macht 23. Versucht man erneut 100 anzuziehen, so ergibt sich eine negative Zahl.&lt;br /&gt;
Also muss eine &#039;1&#039; ausgeben werden. Die verbleibenden 23 werden weiter behandelt, indem festgestellt wird wieviele Zehner darin enthalten sind. Auch hier wiederum: In einer Schleife solange 10 abziehen, bis das Ergebnis negativ wurde. Konkret geht das 2 mal gut, also muss das nächste auszugebende Zeichen ein &#039;2&#039; sein. Damit verbleiben noch die Einer, welche direkt in das entsprechende Zeichen umgewandelt werden können. In Summe hat man also an das Display die Zeichen &#039;1&#039; &#039;2&#039; &#039;3&#039; ausgegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;**********************************************************************&lt;br /&gt;
;&lt;br /&gt;
; Eine 8 Bit Zahl ohne Vorzeichen ausgeben&lt;br /&gt;
;&lt;br /&gt;
; Übergabe:            Zahl im Register temp1&lt;br /&gt;
; veränderte Register: keine&lt;br /&gt;
;&lt;br /&gt;
lcd_number:&lt;br /&gt;
           push  temp1            ; die Funktion verändert temp1 und temp2,&lt;br /&gt;
           push  temp2            ; also sichern wir den Inhalt, um ihn am Ende&lt;br /&gt;
                                  ; wieder herstellen zu können&lt;br /&gt;
&lt;br /&gt;
           mov   temp2, temp1     ; das Register temp1 frei machen&lt;br /&gt;
                                  ; abzählen wieviele Hunderter&lt;br /&gt;
                                  ; in der Zahl enthalten sind&lt;br /&gt;
;** Hunderter ** &lt;br /&gt;
           ldi   temp1, &#039;0&#039;-1     ; temp1 mit ASCII &#039;0&#039;-1 vorladen&lt;br /&gt;
lcd_number_1:&lt;br /&gt;
           inc   temp1            ; ASCII erhöhen (somit ist nach dem ersten&lt;br /&gt;
                                  ; Durchlauf eine &#039;0&#039; in temp1)&lt;br /&gt;
           subi  temp2, 100       ; 100 abziehen&lt;br /&gt;
           brcc  lcd_number_1     ; ist dadurch kein Unterlauf entstanden?&lt;br /&gt;
                                  ; nein, dann zurück zu lcd_number_1&lt;br /&gt;
           subi  temp2, -100      ; 100 wieder dazuzählen, da die&lt;br /&gt;
                                  ; vorherhgehende Schleife 100 zuviel&lt;br /&gt;
                                  ; abgezogen hat&lt;br /&gt;
           rcall lcd_data         ; die Hunderterstelle ausgeben&lt;br /&gt;
&lt;br /&gt;
;** Zehner  **&lt;br /&gt;
           ldi   temp1, &#039;0&#039;-1     ; temp1 mit ASCII &#039;0&#039;-1 vorladen&lt;br /&gt;
lcd_number_2:&lt;br /&gt;
           inc   temp1            ; ASCII erhöhen (somit ist nach dem ersten&lt;br /&gt;
                                  ; Durchlauf eine &#039;0&#039; in temp1)&lt;br /&gt;
           subi  temp2, 10        ; 10 abziehen&lt;br /&gt;
           brcc  lcd_number_2     ; ist dadurch kein Unterlauf enstanden?&lt;br /&gt;
                                  ; nein, dann zurück zu lcd_number_2&lt;br /&gt;
           subi  temp2, -10       ; 10 wieder dazuzählen, da die&lt;br /&gt;
                                  ; vorherhgehende Schleife 10 zuviel&lt;br /&gt;
                                  ; abgezogen hat&lt;br /&gt;
           rcall lcd_data         ; die Zehnerstelle ausgeben&lt;br /&gt;
 &lt;br /&gt;
;** Einer **        &lt;br /&gt;
           ldi   temp1, &#039;0&#039;       ; die Zahl in temp2 ist jetzt im Bereich&lt;br /&gt;
           add   temp1, temp2     ; 0 bis 9. Einfach nur den ASCII Code für&lt;br /&gt;
           rcall lcd_data         ; &#039;0&#039; dazu addieren und wir erhalten dierekt&lt;br /&gt;
                                  ; den ASCII Code für die Ziffer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
           pop   temp2            ; den gesicherten Inhalt von temp2 und temp1&lt;br /&gt;
           pop   temp1            ; wieder herstellen&lt;br /&gt;
           ret                    ; und zurück&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beachte: Diese Funktion benutzt wiederrum die Funktion &#039;&#039;&#039;lcd_data&#039;&#039;&#039;. Anders als bei den bisherigen Aufrufen ist &#039;&#039;&#039;lcd_number&#039;&#039;&#039; aber darauf angewiesen, dass &#039;&#039;&#039;lcd_data&#039;&#039;&#039; das Register &#039;&#039;&#039;temp2&#039;&#039;&#039; unangetastet lässt. Falls sie es noch nicht getan haben, dann ist das jetzt die perfekte Gelegenheit, &#039;&#039;&#039;lcd_data&#039;&#039;&#039; mit den entsprechenden &#039;&#039;&#039;push&#039;&#039;&#039; und &#039;&#039;&#039;pop&#039;&#039;&#039; Befehlen zu versehen. Sie sollten dies unbedingt zur Übung selbst machen. Am Ende muß die Funktion dann wie diese hier aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
 ;sendet ein Datenbyte an das LCD&lt;br /&gt;
lcd_data:&lt;br /&gt;
           push  temp2&lt;br /&gt;
           mov   temp2, temp1           ; &amp;quot;Sicherungskopie&amp;quot; für&lt;br /&gt;
                                        ; die Übertragung des 2.Nibbles&lt;br /&gt;
           swap  temp1                  ; Vertauschen&lt;br /&gt;
           andi  temp1, 0b00001111      ; oberes Nibble auf Null setzen&lt;br /&gt;
           sbr   temp1, 1&amp;lt;&amp;lt;PIN_RS       ; entspricht 0b00010000&lt;br /&gt;
           out   LCD_PORT, temp1        ; ausgeben&lt;br /&gt;
           rcall lcd_enable             ; Enable-Routine aufrufen&lt;br /&gt;
                                        ; 2. Nibble, kein swap da es schon&lt;br /&gt;
                                        ; an der richtigen stelle ist&lt;br /&gt;
           andi  temp2, 0b00001111      ; obere Hälfte auf Null setzen &lt;br /&gt;
           sbr   temp2, 1&amp;lt;&amp;lt;PIN_RS       ; entspricht 0b00010000&lt;br /&gt;
           out   LCD_PORT, temp2        ; ausgeben&lt;br /&gt;
           rcall lcd_enable             ; Enable-Routine aufrufen&lt;br /&gt;
           rcall delay50us              ; Delay-Routine aufrufen&lt;br /&gt;
           pop   temp2&lt;br /&gt;
           ret                          ; zurück zum Hauptprogramm&lt;br /&gt;
 &lt;br /&gt;
 ; sendet einen Befehl an das LCD&lt;br /&gt;
lcd_command:                            ; wie lcd_data, nur ohne RS zu setzen&lt;br /&gt;
           push  temp2&lt;br /&gt;
           mov   temp2, temp1&lt;br /&gt;
           swap  temp1&lt;br /&gt;
           andi  temp1, 0b00001111&lt;br /&gt;
           out   LCD_PORT, temp1&lt;br /&gt;
           rcall lcd_enable&lt;br /&gt;
           andi  temp2, 0b00001111&lt;br /&gt;
           out   LCD_PORT, temp2&lt;br /&gt;
           rcall lcd_enable&lt;br /&gt;
           rcall delay50us&lt;br /&gt;
           pop   temp2&lt;br /&gt;
           ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kurz zur Funktionsweise der Funktion &#039;&#039;&#039;lcd_number&#039;&#039;&#039;: Die Zahl in einem Register bewegt sich im Wertebereich 0 bis 255. Um herauszufinden, wie die Hunderterstelle lautet, zieht die Funktion einfach in einer Schleife immer wieder 100 von der Schleife ab, bis bei der Subtraktion ein Unterlauf, angezeigt durch das Setzen des Carry-Bits bei der Subtraktion, entsteht. Die Anzahl wird im Register &#039;&#039;&#039;temp1&#039;&#039;&#039; mitgezählt. Da dieses Register mit dem ASCII Code von &#039;0&#039; initialisiert wurde, und dieser ASCII Code bei jedem Schleifendurchlauf um 1 erhöht wird, können wir das Register &#039;&#039;&#039;temp1&#039;&#039;&#039; direkt zur Ausgabe des Zeichens für die Hunderterstelle durch die Funktion &#039;&#039;&#039;lcd_data&#039;&#039;&#039; benutzen. Völlig analog funktioniert auch die Ausgabe der Zehnerstelle.&lt;br /&gt;
&lt;br /&gt;
===Unterdrückung von führenden Nullen===&lt;br /&gt;
&lt;br /&gt;
Diese Funktion gibt jede Zahl im Register &#039;&#039;&#039;temp1&#039;&#039;&#039; immer mit 3 Stellen aus. Führende Nullen werden nicht unterdrückt. Möchte man dies ändern, so ist das ganz leicht möglich: Vor Ausgabe der Hunderterstelle muss lediglich überprüft werden, ob die Entsprechende Ausgabe eine &#039;0&#039; wäre. Ist sie das, so wird die Ausgabe übersprungen. Ist es allerdings eine Zahl 1..9, so muss sie der Zehner Stelle signalisieren, daß eine Prüfung auf eine &#039;0&#039; nicht stattfinden darf. Und dazu wird das T-Flag im SREG genutzt. Lediglich in der Einerstelle wird jede Ziffer wie errechnet ausgegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
           ...&lt;br /&gt;
                                  ; die Hunderterstelle ausgeben, wenn&lt;br /&gt;
                                  ; sie nicht &#039;0&#039; ist&lt;br /&gt;
           clt                    ; T-Flag löschen&lt;br /&gt;
           cpi   temp1, &#039;0&#039;&lt;br /&gt;
           breq  lcd_number_1a&lt;br /&gt;
           rcall lcd_data         ; die Hunderterstelle ausgeben&lt;br /&gt;
           set                    ; T-Flag im SREG setzen da 100er Stelle eine&lt;br /&gt;
                                  ; 1..9 war&lt;br /&gt;
&lt;br /&gt;
lcd_number_1a:&lt;br /&gt;
           ...&lt;br /&gt;
&lt;br /&gt;
           ...&lt;br /&gt;
           brts  lcd_number_2a    ; Test auf &#039;0&#039; überspringen, da 100er eine&lt;br /&gt;
                                  ; 1..9 war (unbedingt anzeigen&lt;br /&gt;
                                  ; auch wenn der Zehner eine &#039;0&#039; ist)&lt;br /&gt;
           cpi   temp1, &#039;0&#039;       ; ansonsten Test auf &#039;0&#039;&lt;br /&gt;
           breq  lcd_number_2b&lt;br /&gt;
lcd_number_2a:        &lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
lcd_number_2b:&lt;br /&gt;
           ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Verfahren, die einzelnen Stellen durch Subtraktion zu bestimmen, ist bei kleinen Zahlen eine durchaus gängige Alternative. Vor allem dann, wenn keine hardwaremäßige Unterstützung für Multiplikation und Division zur Verfügung steht. Ansonsten könnte man die die einzelnen Ziffern auch durch Division bestimmen. Das Prinzip ist folgendes (beispielhaft an der Zahl 52783 gezeigt)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   52783 / 10          -&amp;gt; 5278&lt;br /&gt;
   52783 - 5278 * 10   -&amp;gt;          3&lt;br /&gt;
&lt;br /&gt;
   5278 / 10           -&amp;gt; 527&lt;br /&gt;
   5278 - 527 * 10     -&amp;gt;          8&lt;br /&gt;
&lt;br /&gt;
   527 / 10            -&amp;gt; 52&lt;br /&gt;
   527 - 52 * 10       -&amp;gt;          7&lt;br /&gt;
&lt;br /&gt;
   52 / 10             -&amp;gt; 5&lt;br /&gt;
   52 - 5 * 10         -&amp;gt;          2&lt;br /&gt;
&lt;br /&gt;
   5 / 10              -&amp;gt; 0&lt;br /&gt;
   5 - 0 * 10          -&amp;gt;          5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Prinzip ist also die Restbildung bei einer fortgesetzten Division durch 10, wobei die einzelnen Ziffern in umgekehrter Reihenfolge ihrer Wertigkeit entstehen. Dadurch hat man aber ein Problem: Damit die Zeichen in der richtigen Reihenfolge ausgegeben werden können, muß man sie meistens zwischenspeichern um sie in der richtigen Reihenfole ausgeben zu können. Wird die Zahl in einem Feld von immer gleicher Größe ausgegeben, dann kann man auch die Zahl von rechts nach links ausgeben (bei einem LCD ist das möglich).&lt;br /&gt;
&lt;br /&gt;
===Hexadezimal ausgeben===&lt;br /&gt;
&lt;br /&gt;
Zu guter letzt hier noch eine Funktion, die eine Zahl aus dem Register &#039;&#039;&#039;temp1&#039;&#039;&#039; in hexadezimaler Form ausgibt. Die Funktion weist keine Besonderheiten auf und sollte unmittelbar verständlich sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;**********************************************************************&lt;br /&gt;
;&lt;br /&gt;
; Eine 8 Bit Zahl ohne Vorzeichen hexadezimal ausgeben&lt;br /&gt;
;&lt;br /&gt;
; Übergabe:            Zahl im Register temp1&lt;br /&gt;
; veränderte Register: keine&lt;br /&gt;
;&lt;br /&gt;
lcd_number_hex:&lt;br /&gt;
           swap  temp1&lt;br /&gt;
           rcall lcd_number_hex_digit&lt;br /&gt;
           swap  temp1&lt;br /&gt;
&lt;br /&gt;
lcd_number_hex_digit:&lt;br /&gt;
           push  temp1&lt;br /&gt;
&lt;br /&gt;
           andi  temp1, $0F&lt;br /&gt;
           cpi   temp1, 10&lt;br /&gt;
           brlt  lcd_number_hex_digit_1&lt;br /&gt;
           subi  temp1, -( &#039;A&#039; - &#039;9&#039; - 1 ) ; es wird subi mit negativer&lt;br /&gt;
                                           ; Konstante verwendet,&lt;br /&gt;
                                           ; weil es kein addi gibt&lt;br /&gt;
lcd_number_hex_digit_1:&lt;br /&gt;
           subi  temp1, -&#039;0&#039;               ; ditto&lt;br /&gt;
           rcall  lcd_data&lt;br /&gt;
           &lt;br /&gt;
           pop   temp1&lt;br /&gt;
           ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Binär ausgeben===&lt;br /&gt;
Um die Sache komplett zu machen; Hier eine Routine mit der man eine 8 Bit-Zahl binär auf das LC-Display ausgeben kann:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;**********************************************************************&lt;br /&gt;
;&lt;br /&gt;
; Eine 8 Bit Zahl ohne Vorzeichen binär ausgeben&lt;br /&gt;
;&lt;br /&gt;
; Übergabe:            Zahl im Register temp1&lt;br /&gt;
; veränderte Register: keine&lt;br /&gt;
&lt;br /&gt;
; eine Zahl aus dem Register temp1 binär ausgeben&lt;br /&gt;
lcd_number_bit:&lt;br /&gt;
	   push temp1		  ; temp1 gesichert&lt;br /&gt;
           push temp2&lt;br /&gt;
	   push temp3&lt;br /&gt;
&lt;br /&gt;
	   mov temp2, temp1;&lt;br /&gt;
&lt;br /&gt;
	   ldi temp3, 8;      ; 8 Bits werden ausgelesen&lt;br /&gt;
lcd_number_loop:           &lt;br /&gt;
	   dec temp3;&lt;br /&gt;
	   rol temp2;         ; Datenbits ins Carry geschoben ...&lt;br /&gt;
	   brcc lcd_number_bit_carryset_0; &lt;br /&gt;
	   brcs lcd_number_bit_carryset_1;&lt;br /&gt;
           rjmp lcd_number_loop;&lt;br /&gt;
&lt;br /&gt;
lcd_number_bit_carryset_0:	 &lt;br /&gt;
	   ldi temp1, &#039;0&#039;     ; Bit low ausgeben&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
	   tst temp3;&lt;br /&gt;
	   breq lcd_number_ende;&lt;br /&gt;
	   rjmp lcd_number_loop;&lt;br /&gt;
&lt;br /&gt;
lcd_number_bit_carryset_1:&lt;br /&gt;
           ldi temp1, &#039;1&#039;     ; Bit high ausgeben&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
           tst temp3;&lt;br /&gt;
	   breq lcd_number_ende;&lt;br /&gt;
	   rjmp lcd_number_loop;&lt;br /&gt;
&lt;br /&gt;
lcd_number_ende:&lt;br /&gt;
	   pop temp3&lt;br /&gt;
	   pop temp2&lt;br /&gt;
	   pop temp1&lt;br /&gt;
	   ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Eine 16-Bit Zahl aus einem Registerpärchen ausgeben===&lt;br /&gt;
&lt;br /&gt;
Um eine 16 Bit Zahl auszugeben wird wieder das bewährte Schema benutzt die einzelnen Stellen durch Subtraktion abzuzählen. Da es sich hierbei allerdings um eine 16 Bit Zahl handelt, müssen die Subtraktionen als 16-Bit Arithmetik ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;**********************************************************************&lt;br /&gt;
;&lt;br /&gt;
; Eine 16 Bit Zahl ohne Vorzeichen ausgeben&lt;br /&gt;
;&lt;br /&gt;
; Übergabe:            Zahl im Register temp2 (low Byte) / temp3 (high Byte)&lt;br /&gt;
; veränderte Register: keine&lt;br /&gt;
;&lt;br /&gt;
lcd_number16:&lt;br /&gt;
           push  temp1&lt;br /&gt;
           push  temp2&lt;br /&gt;
           push  temp3&lt;br /&gt;
&lt;br /&gt;
; ** Zehntausender **&lt;br /&gt;
           ldi   temp1, &#039;0&#039;-1&lt;br /&gt;
lcd_number1:&lt;br /&gt;
           inc   temp1&lt;br /&gt;
           subi  temp2, low(10000)&lt;br /&gt;
           sbci  temp3, high(10000)&lt;br /&gt;
           brcc  lcd_number1&lt;br /&gt;
           subi  temp2, low(-10000)&lt;br /&gt;
           sbci  temp3, high(-10000)&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
&lt;br /&gt;
; ** Tausender **&lt;br /&gt;
           ldi   temp1, &#039;0&#039;-1&lt;br /&gt;
lcd_number2:&lt;br /&gt;
           inc   temp1&lt;br /&gt;
           subi  temp2, low(1000)&lt;br /&gt;
           sbci  temp3, high(1000)&lt;br /&gt;
           brcc  lcd_number2&lt;br /&gt;
           subi  temp2, low(-1000)&lt;br /&gt;
           sbci  temp3, high(-1000)&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
&lt;br /&gt;
; ** Hunderter **&lt;br /&gt;
           ldi   temp1, &#039;0&#039;-1&lt;br /&gt;
lcd_number3:&lt;br /&gt;
           inc   temp1&lt;br /&gt;
           subi  temp2, low(100)&lt;br /&gt;
           sbci  temp3, high(100)&lt;br /&gt;
           brcc  lcd_number3&lt;br /&gt;
           subi  temp2, -100             ; + 100 High-Byte nicht mehr erforderlich&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
&lt;br /&gt;
; ** Zehner **&lt;br /&gt;
           ldi   temp1, &#039;0&#039;-1&lt;br /&gt;
lcd_number4:&lt;br /&gt;
           inc   temp1&lt;br /&gt;
           subi  temp2, 10&lt;br /&gt;
           brcc  lcd_number4&lt;br /&gt;
           subi  temp2, -10&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
&lt;br /&gt;
; ** Einer **&lt;br /&gt;
           ldi   temp1, &#039;0&#039;&lt;br /&gt;
           add   temp1, temp2&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
&lt;br /&gt;
; ** Stack aufräumen **&lt;br /&gt;
           pop   temp3&lt;br /&gt;
           pop   temp2&lt;br /&gt;
           pop   temp1&lt;br /&gt;
&lt;br /&gt;
           ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Eine BCD Zahl ausgeben===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;**********************************************************************&lt;br /&gt;
;&lt;br /&gt;
; Übergabe:            BCD Zahl in temp1&lt;br /&gt;
; veränderte Register: keine&lt;br /&gt;
;&lt;br /&gt;
lcd_bcd:&lt;br /&gt;
           push  temp2&lt;br /&gt;
          &lt;br /&gt;
           mov   temp2, temp1           ; temp1 sichern&lt;br /&gt;
           swap  temp1                  ; oberes mit unterem Nibble tauschen&lt;br /&gt;
           andi  temp1, 0b00001111      ; und &amp;quot;oberes&amp;quot; ausmaskieren&lt;br /&gt;
           subi  temp1, -0x30           ; in ASCII umrechnen&lt;br /&gt;
           rcall lcd_data               ; und ausgeben&lt;br /&gt;
           mov   temp1, temp2           ; ... danach unteres&lt;br /&gt;
           andi  temp1, 0b00001111&lt;br /&gt;
           subi  temp1, -0x30&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
           mov   temp1, temp2           ; temp1 rekonstruieren&lt;br /&gt;
&lt;br /&gt;
           pop   temp2&lt;br /&gt;
           ret &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Benutzerdefinierte Zeichen ==&lt;br /&gt;
[[Bild:LCD_Character_Grid.png | framed | right| Zeichenraster für 1 Zeichen]]&lt;br /&gt;
&lt;br /&gt;
Das LCD erlaubt für spezielle Zeichen, welche sich nicht im Zeichensatz finden, eigene Zeichen zu definieren. Dazu werden die ersten 8 ASCII Codes reserviert, auf denen sich laut ASCII Tabelle spezielle Steuerzeichen befinden, die normalerweise keine sichtbare Anzeige hervorrufen sondern zur Steuerung von angeschlossenen Geräten dienen. Da diese Zeichen auf einem LCD keine Rolle spielen, können diese Zeichen benutzt werden um sich selbst Sonderzeichen zu erzeugen, die für die jeweilige Anwendung massgeschneidert sind.&lt;br /&gt;
&lt;br /&gt;
Das LCD stellt für jedes Zeichen eine 8*5 Matrix zur Verfügung. Um sich selbst massgeschneiderte Zeichen zu erstellen, ist es am einfachsten sich zunächst auf einem Stück karriertem Papier zu erstellen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:BellCharacter.png | framed | right| Zeichenraster für ein Glockensymbol]]&lt;br /&gt;
&lt;br /&gt;
In diesem Raster markiert man sich dann diejenigen Pixel, die im fertigen Zeichen dunkel erscheinen sollen. Als Beispiel sei hier ein Glockensymbol gezeichnet, welches in einer Telefonapplikation zb als Kennzeichnung für einen Anruf dienen könnte.&lt;br /&gt;
&lt;br /&gt;
Eine Zeile in diesem Zeichen repräsentiert ein an das LCD zu übergebendes Byte, wobei nur die Bits 0 bis 4 relevant sind. Gesetzte Pixel stellen ein 1 Bit dar, nicht gesetzte Pixel sind ein 0-Bit. Das niederwertigste Bit einer Zeile befindet sich rechts. Auf diese Art wird jede Zeile in eine Binärzahl übersetzt, und 8 Bytes repräsentieren ein komplettes Zeichen. Am Beispiel des Glockensymboles: Die 8 Bytes, welches das Symbol repräsentiern, lauten: 0x00, 0x04, 0x0A, 0x0A, 0x0A, 0x1F, 0x04, 0x00,&lt;br /&gt;
&lt;br /&gt;
Dem LCD wird die neue Definition übertragen, indem man dem LCD die &#039;Schreibposition&#039; mittels des Kommandos &#039;&#039;Character RAM Address Set&#039;&#039; in den Zeichensatzgenerator verschiebt. Danach werden die 8 Bytes ganz normal als Daten ausgegeben, die das LCD damit in seine Zeichensatztabelle schreibt.&lt;br /&gt;
&lt;br /&gt;
Durch die Wahl der Speicheradresse definiert man, welches Zeichen (0 bis 7) man eigentlich durch eine eigene Definition ersetzen will.&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
! ASCII Code || Zeichensatzadresse&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0x00&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0x08&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 0x10&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 0x18&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 0x20&lt;br /&gt;
|-&lt;br /&gt;
| 5 || 0x28&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0x30&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 0x38&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nach erfolgter Definition des Zeichens, muss die Schreibposition wieder explizit in den DDRAM-Bereich gesetzt werden.&lt;br /&gt;
Danach kann ein entsprechendes Zeichen mit dem definierten ASCII Code ausgegeben werden, wobei das LCD die von uns definierte Pixelform zur Anzeige benutzt.&lt;br /&gt;
&lt;br /&gt;
Zuerst müssen natürlich erstmal die Zeichen definiert werden.&lt;br /&gt;
Dieses geschieht einmalig durch den Aufruf der Routine &amp;quot;lcd_load_user_chars&amp;quot;&lt;br /&gt;
unmittelbar nach der Initialisierung des LCD-Displays.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
           .&lt;br /&gt;
           .&lt;br /&gt;
           rcall lcd_init              ; Display initialisieren&lt;br /&gt;
           rcall lcd_load_user_chars   ; User Zeichen in das Display laden&lt;br /&gt;
           rcall lcd_clear             ; Display löschen&lt;br /&gt;
           .&lt;br /&gt;
           .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Durch diesen Aufruf werden die im Flash definierten Zeichen in den&lt;br /&gt;
GC-Ram übertragen. Diese Zeichen werden ab Adresse 0 im GC-Ram&lt;br /&gt;
gespeichert und sind danach wie jedes andere Zeichen nutzbar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
           .&lt;br /&gt;
           .&lt;br /&gt;
           ldi   temp1, 0              ; Ausgabe des User-Char &amp;quot;A&amp;quot;&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
           ldi   temp1, 6              ; Ausgabe des User-Char &amp;quot;G&amp;quot;&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
           ldi   temp1, 5              ; Ausgabe des User-Char &amp;quot;E&amp;quot;&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
           ldi   temp1, 4              ; Ausgabe des User-Char &amp;quot;M&amp;quot;&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
           ldi   temp1, 3              ; Ausgabe des User-Char &amp;quot;-&amp;quot;&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
           ldi   temp1, 2              ; Ausgabe des User-Char &amp;quot;R&amp;quot;&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
           ldi   temp1, 1              ; Ausgabe des User-Char &amp;quot;V&amp;quot;&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
           ldi   temp1, 0              ; Ausgabe des User-Char &amp;quot;A&amp;quot;&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
           .&lt;br /&gt;
           .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt sollte der Schriftzug &amp;quot;AVR-MEGA&amp;quot;&lt;br /&gt;
verkehrt herum (180 Grad gedreht) erscheinen.&lt;br /&gt;
&lt;br /&gt;
Es fehlt natürlich noch die Laderoutine:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;**********************************************************************&lt;br /&gt;
;&lt;br /&gt;
; Lädt User Zeichen in den GC-Ram des LCD bis Tabellenende (0xFF)&lt;br /&gt;
; gelesen wird. (max. 8 Zeichen können geladen werden)&lt;br /&gt;
;&lt;br /&gt;
; Übergabe:            -   &lt;br /&gt;
; veränderte Register: temp1, temp2, temp3, zh, zl&lt;br /&gt;
; Bemerkung:           ist einmalig nach lcd_init aufzurufen&lt;br /&gt;
;       &lt;br /&gt;
&lt;br /&gt;
lcd_load_user_chars:&lt;br /&gt;
        ldi    zl, LOW (ldc_user_char * 2) ; Adresse der Zeichentabelle&lt;br /&gt;
        ldi    zh, HIGH(ldc_user_char * 2) ; in den Z-Pointer laden&lt;br /&gt;
        clr    temp3                       ; aktuelles Zeichen = 0 &lt;br /&gt;
&lt;br /&gt;
lcd_load_user_chars_2:&lt;br /&gt;
        clr    temp2                       ; Linienzähler = 0&lt;br /&gt;
&lt;br /&gt;
lcd_load_user_chars_1:&lt;br /&gt;
        ldi    temp1, 0b01000000           ; Kommando:    0b01aaalll&lt;br /&gt;
        add    temp1, temp3                ; + akt. Zeichen  (aaa)&lt;br /&gt;
        add    temp1, temp2                ; + akt. Linie       (lll)&lt;br /&gt;
        rcall  lcd_command                 ; Kommando schreiben&lt;br /&gt;
&lt;br /&gt;
        lpm    temp1, Z+                   ; Zeichenline laden &lt;br /&gt;
        rcall  lcd_data                    ; ... und ausgeben&lt;br /&gt;
&lt;br /&gt;
        ldi    temp1, 0b01001000           ; Kommando:    0b01aa1lll         &lt;br /&gt;
        add    temp1, temp3                ; + akt. Zeichen  (aaa)       &lt;br /&gt;
        add    temp1, temp2                ; + akt. Linie       (lll)&lt;br /&gt;
        rcall  lcd_command&lt;br /&gt;
&lt;br /&gt;
        lpm    temp1, Z+                   ; Zeichenline laden&lt;br /&gt;
        rcall  lcd_data                    ; ... und ausgeben &lt;br /&gt;
        &lt;br /&gt;
        inc    temp2                       ; Linienzähler + 1&lt;br /&gt;
        cpi    temp2, 8                    ; 8 Linien fertig?&lt;br /&gt;
        brne   lcd_load_user_chars_1       ; nein, dann nächste Linie &lt;br /&gt;
		&lt;br /&gt;
        subi   temp3, -0x10                ; zwei Zeichen weiter (addi 0x10)&lt;br /&gt;
        lpm    temp1, Z                    ; nächste Linie laden&lt;br /&gt;
        cpi    temp1, 0xFF                 ; Tabellenende erreicht? &lt;br /&gt;
        brne   lcd_load_user_chars_2       ; nein, dann die nächsten&lt;br /&gt;
                                           ; zwei Zeichen&lt;br /&gt;
        ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
... und die Zeichendefinition:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
ldc_user_char:&lt;br /&gt;
                              ;    Zeichen &lt;br /&gt;
                              ;   0       1&lt;br /&gt;
       .db 0b10001, 0b00100   ; @   @ ,   @&lt;br /&gt;
       .db 0b10001, 0b01010   ; @   @ ,  @ @&lt;br /&gt;
       .db 0b11111, 0b10001   ; @@@@@ , @   @&lt;br /&gt;
       .db 0b10001, 0b10001   ; @   @ , @   @&lt;br /&gt;
       .db 0b10001, 0b10001   ; @   @ , @   @&lt;br /&gt;
       .db 0b10001, 0b10001   ; @   @ , @   @&lt;br /&gt;
       .db 0b01110, 0b10001   ;  @@@  , @   @&lt;br /&gt;
       .db 0b00000, 0b00000   ;       , &lt;br /&gt;
&lt;br /&gt;
                              ;    Zeichen&lt;br /&gt;
                              ;   2       3&lt;br /&gt;
       .db 0b10001, 0b00000   ; @   @ , &lt;br /&gt;
       .db 0b01001, 0b00000   ;  @  @ , &lt;br /&gt;
       .db 0b00101, 0b00000   ;   @ @ , &lt;br /&gt;
       .db 0b11111, 0b11111   ; @@@@@ , @@@@@ &lt;br /&gt;
       .db 0b10001, 0b00000   ; @   @ , &lt;br /&gt;
       .db 0b10001, 0b00000   ; @   @ , &lt;br /&gt;
       .db 0b01111, 0b00000   ;  @@@@ , &lt;br /&gt;
       .db 0b00000, 0b00000   ;       ,  &lt;br /&gt;
&lt;br /&gt;
                              ;    Zeichen&lt;br /&gt;
                              ;   4       5&lt;br /&gt;
       .db 0b10001, 0b11111   ; @   @ , @@@@@  &lt;br /&gt;
       .db 0b10001, 0b00001   ; @   @ ,     @&lt;br /&gt;
       .db 0b10001, 0b00001   ; @   @ ,     @&lt;br /&gt;
       .db 0b10001, 0b01111   ; @   @ ,  @@@@ &lt;br /&gt;
       .db 0b10101, 0b00001   ; @ @ @ ,     @&lt;br /&gt;
       .db 0b11011, 0b00001   ; @@ @@ ,     @&lt;br /&gt;
       .db 0b10001, 0b11111   ; @   @ , @@@@@&lt;br /&gt;
       .db 0b00000, 0b00000   ;       ,  &lt;br /&gt;
&lt;br /&gt;
                              ;    Zeichen&lt;br /&gt;
                              ;   6       7&lt;br /&gt;
       .db 0b11110, 0b11111   ; @@@@  , @@@@@  &lt;br /&gt;
       .db 0b10001, 0b01010   ; @   @ ,  @ @ &lt;br /&gt;
       .db 0b10001, 0b00100   ; @   @ ,   @&lt;br /&gt;
       .db 0b11101, 0b01110   ; @@@ @ ,  @@@&lt;br /&gt;
       .db 0b00001, 0b00100   ;     @ ,   @&lt;br /&gt;
       .db 0b10001, 0b01010   ; @   @ ,  @ @&lt;br /&gt;
       .db 0b01110, 0b11111   ;  @@@  , @@@@@&lt;br /&gt;
       .db 0b00000, 0b00000   ;       ,  &lt;br /&gt;
&lt;br /&gt;
       ; End of Tab&lt;br /&gt;
       .db 0xFF, 0xFF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Der überarbeitete, komplette Code==&lt;br /&gt;
&lt;br /&gt;
Hier also die komplett überarbeitete Version der LCD Funktionen.&lt;br /&gt;
&lt;br /&gt;
Die für die Benutzung relevanten Funktionen&lt;br /&gt;
* &#039;&#039;&#039;lcd_init&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;lcd_clear&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;lcd_home&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;lcd_data&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;lcd_command&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;lcd_flash_string&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;lcd_number&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;lcd_number_hex&#039;&#039;&#039;&lt;br /&gt;
sind so ausgeführt, dass sie kein Register (ausser dem Statusregister &#039;&#039;&#039;SREG&#039;&#039;&#039;) verändern. Die bei manchen Funktionen notwendige Argumente werden immer im Register &#039;&#039;&#039;temp1&#039;&#039;&#039; übergeben, wobei &#039;&#039;&#039;temp1&#039;&#039;&#039; vom Usercode definiert werden muss.&lt;br /&gt;
&lt;br /&gt;
[[Media:lcd-routines.asm|Download lcd-routines.asm]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{{Navigation_zurückhochvor|&lt;br /&gt;
zurücktext=Stack|&lt;br /&gt;
zurücklink=AVR-Tutorial: Stack|&lt;br /&gt;
hochtext=Inhaltsverzeichnis|&lt;br /&gt;
hochlink=AVR-Tutorial|&lt;br /&gt;
vortext=Interrupts|&lt;br /&gt;
vorlink=AVR-Tutorial: Interrupts}}&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Tutorial|LCD]]&lt;br /&gt;
[[Category:LCD]]&lt;/div&gt;</summary>
		<author><name>Max5v</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=74xx&amp;diff=90506</id>
		<title>74xx</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=74xx&amp;diff=90506"/>
		<updated>2015-12-07T21:22:38Z</updated>

		<summary type="html">&lt;p&gt;Max5v: Änderung 90498 von 31.184.196.106 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die 74xx-Serie ist die am weitesten verbreitete [[Digital]]-IC-Familie. Das Präfix gibt Auskunft über den verwendbaren Temperaturbereich.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Familie || Temperaturbereich || Einsatzgebiet&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|74||0°C bis +70°C || Standard (engl. commercial)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|54||-55°C bis +125°C || Militärisch (engl. military)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|84||-25°C bis +85°C || Industriell (engl. industrial)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Baureihen ==&lt;br /&gt;
Eine ausführliche Beschreibung der verschiedenen Logikbaureihen gibt es im [http://www.ti.com/lit/sg/sdyu001aa/sdyu001aa.pdf Logic Guide 2014] von Texas Instruments. &lt;br /&gt;
&lt;br /&gt;
* TTL (&#039;&#039;&#039;T&#039;&#039;&#039;ransistor &#039;&#039;&#039;T&#039;&#039;&#039;ransistor &#039;&#039;&#039;L&#039;&#039;&#039;ogic, Logik auf Bipolartransistorbasis, veraltet)&lt;br /&gt;
** 74 = TTL&lt;br /&gt;
** 74H = Highspeed TTL&lt;br /&gt;
** 74ALS = Advanced Low Power Schottky TTL&lt;br /&gt;
** 74AS = Advanced Schottky TTL&lt;br /&gt;
** 74F = Fast TTL&lt;br /&gt;
** 74L = Low Power TTL&lt;br /&gt;
** 74LS = Low Power Schottky TTL (Ersatz für 74 und 74L)&lt;br /&gt;
** 74S = Schottky TTL&lt;br /&gt;
&lt;br /&gt;
* CMOS (&#039;&#039;&#039;C&#039;&#039;&#039;omplementary &#039;&#039;&#039;M&#039;&#039;&#039;etal &#039;&#039;&#039;O&#039;&#039;&#039;xide &#039;&#039;&#039;S&#039;&#039;&#039;emiconductor, Feldeffekttransistoren mit gegensätzlicher Polarität)&lt;br /&gt;
** 74AC = Advanced CMOS&lt;br /&gt;
** 74ACT = AC mit TTL-kompatiblen Eingängen&lt;br /&gt;
** 74HC = High Speed CMOS&lt;br /&gt;
** 74HCT = HC mit TTL-kompatiblen Eingängen&lt;br /&gt;
** 74AHC =  Advanced High-Speed CMOS&lt;br /&gt;
** 74AHCT = AHC mit TTL-kompatiblen Eingängen&lt;br /&gt;
** 74VHC = Very High Speed CMOS&lt;br /&gt;
** 74VHCT = VHC mit TTL-kompatiblen Eingängen&lt;br /&gt;
** 74LV =  Low-Voltage CMOS&lt;br /&gt;
** 74LVC =  Low-Voltage CMOS (Vcc 1,65 bis 3,60 Volt, Eingänge sind auch bei niedriger Vcc bis 5,5 Volt tolerant)&lt;br /&gt;
** 74LVX =  Low-Voltage CMOS (Vcc 2,00 bis 3,60 Volt, Eingänge sind auch bei niedriger Vcc bis 5,5 Volt tolerant)&lt;br /&gt;
&lt;br /&gt;
* ECL (&#039;&#039;&#039;E&#039;&#039;&#039;mitter &#039;&#039;&#039;C&#039;&#039;&#039;oupled &#039;&#039;&#039;L&#039;&#039;&#039;ogic, Emittergekoppelte Logik)&lt;br /&gt;
** 74ECL&lt;br /&gt;
** 74ECTL&lt;br /&gt;
&lt;br /&gt;
* Langsame störsichere Logik&lt;br /&gt;
** 74LSL&lt;br /&gt;
** 74SZL&lt;br /&gt;
&lt;br /&gt;
* BICMOS [[Bus]]-Interface-Logik (CMOS und Bipolartechnik kombiniert)&lt;br /&gt;
** 74BCT (siehe [http://focus.ti.com/docs/logic/catalog/overview/overview.jhtml?templateId=5020&amp;amp;path=templatedata/cm/ovw/data/bct_overview Texas Instruments])&lt;br /&gt;
** 74ABT&lt;br /&gt;
&lt;br /&gt;
== Typen ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- übersetzen! --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|- style=&amp;quot;background:#ffdead;&amp;quot;&lt;br /&gt;
! Typ || Pins || Anzahl || Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 00 || 14 || 4 || 2 Input NAND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 01 || 14 || 4 || 2 Input NAND (OC=[[Ausgangsstufen Logik-ICs#Open_Collector|Open Collector]])&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 02 || 14 || 4 || 2 Input NOR&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 03 || 14 || 4 || 2 Input NAND (OC) Andere Belegung als 7401&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 04 || 14 || 6 || Inverter&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 05 || 14 || 6 || Inverter (OC)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 06 || 14 || 6 || Inverter Buffer/Treiber (OC)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 07 || 14 || 6 || Buffer/Treiber (OC)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 08 || 14 || 4 || 2 Input AND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 09 || 14 || 4 || 2 Input AND (OC)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 10 || 14 || 3 || 3 Input NAND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 11 || 14 || 3 || 3 Input AND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 12 || 14 || 3 || 3 Input NAND (OC)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 13 || 14 || 2 || 4 Input NAND [[Schmitt-Trigger]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 14 || 14 || 6 || Inverter Schmitt-Trigger&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 15 || 14 || 3 || 3 Input AND (OC)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 16 || 14 || 6 || Inverter Treiber (OC)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 17 || 14 || 6 || Treiber (OC)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 18 || 14 || 2 || 4 Input NAND Schmitt-Trigger&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 19 || 14 || 6 || Inverter Schmitt-Trigger&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 20 || 14 || 2 || 4 Input NAND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 21 || 14 || 2 || 4 Input AND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 22 || 14 || 2 || 4 Input NAND (OC)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 24 || 14 || 4 || 2 Input NAND Schmitt-Trigger&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 25 || 14 || 2 || 4 Input NOR&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 26 || 14 || 4 || 2 Input NAND (OC)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 27 || 14 || 3 || 3 Input NOR&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 28 || 14 || 4 || 2 Input NOR&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 30 || 14 || 1 || 8 Input NAND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 31 || 16 || - || Verzögerungs-Element (je 2 Non-Inverting, Inverting, 2 Input NAND)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 32 || 14 || 4 || 2 Input OR&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 33 || 14 || 4 || 2 Input NOR (OC)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 34 || 14 || 6 || Treiber&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 35 || 14 || 6 || Treiber (OC)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 36 || 14 || 4 || 2 Input NOR&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 37 || 14 || 4 || 2 Input NAND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 38 || 14 || 4 || 2 Input NAND (OC)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 39 || 14 || 4 || 2 Input NAND Treiber (OC)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 40 || 14 || 2 || 4 Input NAND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 41 || 16 || - || BCD -&amp;gt; Decimal Decoder (OC)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 42 || 16 || - || BCD -&amp;gt; Decimal Decoder&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 43 || 16 || - || Excess-3 -&amp;gt; Decimal Decoder&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 44 || 16 || - || Excess-3-Gray -&amp;gt; Decimal Decoder&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 45 || 16 || - || BCD -&amp;gt; Decimal Decoder (OC)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 46 || 16 || - || BCD -&amp;gt; 7-Segment Decoder (OC)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 47 || 16 || - || BCD -&amp;gt; 7-Segment Decoder (OC)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 48 || 16 || - || BCD -&amp;gt; 7-Segment Decoder (OC)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 49 || 14 || - || BCD -&amp;gt; 7-Segment Decoder (OC)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 50 || 14 || - || Dual 2-Wide 2-Input AND-OR-INVERT (1 expandable)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 51 || 14 || 2 || AND-OR-INVERT&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 52 || 14 || ? || Expandable AND-OR&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 53 || 14 || 1 || Expandable 4-Wide AND-OR-INVERT&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 54 || 14 || 1 || 3-2-2-3 Input AND-OR-INVERT&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 55 || 14 || 1 || 2-Wide 4-Input AND-OR-INVERT&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 72 || 14 || 1 || And-Gated-JK-MS [[Flipflop]] with preset &amp;amp;  clear&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 73 || 14 || 2 || JK [[Flipflop]] with clear&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 74 || 14 || 2 || D [[Flipflop]] with preset &amp;amp; clear&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 75 || 16 || - || 4-Bit Bistable [[Latch]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 76 || 16 || 2 || JK [[Flipflop]] with preset &amp;amp; clear&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 78 || 14 || 2 || JK [[Flipflop]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 86 || 14 || 4 || 2 Input XOR&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 90 || 14 || - || Decade Counter&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 92 || 14 || - || Divide By-Twelve Counter&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 93 || 14 || - || 4-Bit Binary Counter&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 95 || 14 || - || 4 Bit Parallel Access Shift Register&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 107 || 14 || 2 || JK [[Flipflop]] with clear&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 109 || 16 || 2 || JK [[Flipflop]] with preset &amp;amp; clear&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 112 || 16 || 2 || JK [[Flipflop]] with preset &amp;amp; clear, inverted clock inputs&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 121 || 14 || - || Monostable Multivibrator With Schmitt-Trigger&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 122 || 14 || - || Retriggerable Monostable Multivibrator&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 123 || 16 || 2 || Retriggerable Monostable Multivibrator&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 125 || 14 || 4 || [[Ausgangsstufen Logik-ICs#Tri-state|Tri-State]] Buffer&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 126 || 14 || 4 || Tri-State Buffer&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 132 || 14 || 4 || 2 Input NAND Schmitt-Trigger&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 133 || 16 || 1 || 13 Input NAND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 136 || 14 || 4 || 2 Input XOR&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 137 || 16 || 1 || 3-to-8 line decoder / demultiplexer with address latches, low-active outputs&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 138 || 16 || 1 || 3-to-8 line decoder / demultiplexer , low-active outputs&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 139 || 16 || 2 || 2-to-4 line decoder / demultiplexer , low-active outputs&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 146 || 16 || - || BCD -&amp;gt; Decimal Decoder (OC)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 147 || 16 || - || 10-Line -&amp;gt; 4-Line BCD Priority Encoder&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 148 || 16 || - || 8-Line -&amp;gt; 3-Line Priority Encoder&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 151 || 16 || 1 || 8:1 Multiplexer&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 154 || 24 || 1 || 4-Line -&amp;gt; 16-Line Decoder/Demultiplexer&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 155 || 16 || 2 || 2-Line -&amp;gt; 4-Line Decoder/Demultiplexer&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 156 || 16 || 2 || 2-Line -&amp;gt; 4-Line Decoder/Demultiplexer (OC)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 157 || 16 || 4 || 2:1 Multiplexer&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 158 || 16 || 4 || 2:1 Multiplexer , inverted outputs&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 161 || 16 || - || Sync 4 Bit Binary Counter Async Reset&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 164 || 14 || - || 8 Bit Serial Shift Register&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 165 || 16 || - || 8-Bit Parallel -&amp;gt; Serial (PISO) Shift Register&amp;lt;br&amp;gt;siehe auch [[AVR-Tutorial: Schieberegister]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 177 || 14 || - || Presetable Binary Counter/[[Latch]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 190 || 16 || - || Decimal Up/Down Counter&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 191 || 16 || - || 4-Bit Up/Down Binary Converter&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 192 || 16 || - || Decimal Up/Down Counter mit Clear&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 193 || 16 || - || 4-Bit Up/Down Binary Counter mit Clear&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 194 || 16 || - || 4-Bit Bidirectional Universal Shift Register&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 221 || 16 || 2 || Monostable Multivibrator with Reset&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 238 || 16 || 1 || 3-to-8 line decoder / demultiplexer , high-active outputs&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 239 || 16 || 2 || 2-to-4 line decoder / demultiplexer , high-active outputs&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 240 || 20 || - || 8-Bit Tri-State Buffer/Line Driver (invertierend)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 241 || 20 || - || 8-Bit Tri-State Buffer/Line Driver&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 242 || 14 || - || 4-Bit Bus Transceiver (invertierend)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 243 || 14 || - || 4-Bit Bus Transceiver (nicht invertierend)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 244 || 20 || - || 8-Bit Tri-State Buffer/Line Driver (nicht invertierend) - Variante: 16244: 16-Bit-Version&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 245 || 20 || - || 8-Bit Bus Transceiver - Variante: 16T245: 16-Bit-Version&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 251 || 16 || - || 8-Bit Input Multiplexer; 3-State&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 259 || 16 || - || 8-Bit Adressable [[Latch]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 260 || 14 || 2 || 5 Input NOR&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 266 || 14 || 4 || 2 Input Exclusive NOR (OC)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 273 || 20 || 8 || Octal D-Type Edge-Triggered Flip-Flop with Clear&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 283 || 16 || - || 4-Bit Volladdierer&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 288 || 16 || - || 256-bit PROM&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 299 || 20 || - || 8-Bit Universal Shift Register, Common IO-Pins, 3-State&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 365 || 16 || - || 6-Bit Buffer; 3-State&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 366 || 16 || 6 || Tri-State Inverting Buffer&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 367 || 16 || 6 || Tri-State Buffer&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 373 || 20 || - || 8-Bit Transparent [[Latch]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 374 || 20 || - || 8-Bit Positiv Edge Triggerd Register&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 393 || 14 || 2 || 4-Bit Binary Counter&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 541 || 20 || - || 8-Bit Tri-State Buffer/Line Driver&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 573 || 20 || - || 8-Bit Tri-State D-Type [[Latch]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 574 || 20 || 8 || Tri-State [[Flipflop]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 590 || 16 || - || 8-Bit binary counter, 3-state output register&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 595 || 16 || - || 8-Bit Serial -&amp;gt; Parallel (SIPO) Shift Register&amp;lt;br&amp;gt;siehe auch [[AVR-Tutorial: Schieberegister]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 4040 || 16 || - || 12-Bit Binary counter&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 4051 || 16 || - || 1:8 Multiplexer/Demultiplexer&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#efefef; text-align:right; font-weight: bold;&amp;quot; | 4066 || 14 || 4 || Bilateral Switch&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/topic/322862?goto=new#3514909 Forumsbeitrag]: Datumszähler von 2000-2099 aus TTL-Schaltkreisen&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.kingswood-consulting.co.uk/giicm/ Giant Internet IC Masturbator] Umfassende Übersicht mit Pinouts über 4000, 7400 und Co (nach GIICM suchen, falls der Link mal ins Leere zeigen sollte)&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/3725 &amp;quot;Ende der &#039;244 Verwirrung ???&amp;quot;] im Forum&lt;br /&gt;
* [http://www.ti.com/lit/pdf/sdyu001 Logic Selection Guide] (2014) Umfassende Zusammenfassung unterschiedlicher Logik Technologien&lt;br /&gt;
* [http://www.samengstrom.com/nxl/7901/cmos_functional_diagram_page.en.html 4000B Series CMOS Functional Diagrams] Übersicht für 40xx-CMOS-Bausteine&lt;br /&gt;
* [http://web.archive.org/web/20141127121818/http://www.fh-sw.de/sw/fachb/et/halbl/stdlogik.htm Vergleich verschiedener Technologiefamilien]&lt;br /&gt;
* [http://atanua.org Atanua] is a real-time logic simulator for the 7400 series, designed to help in learning of basic boolean logic and electronics. (Non-commercial free version available)&lt;br /&gt;
* [http://www.msarnoff.org/chipdb/ ChipDB] - Pinouts von gängigen 74xx&lt;br /&gt;
* [http://www.interfacebus.com/voltage_threshold.html Logic Threshold Voltage Levels], Die Schaltschwellen der verschiedenen Logikfamilien&lt;br /&gt;
* [http://www.interfacebus.com/IC_Output_Slew_Rate.html Output slew rate], die Anstiegszeiten der verschiedenen Logikfamilien&lt;br /&gt;
* [http://design.stanford.edu/spdl/ME218a/logic/which_is_best.html Motorola Logic Families, Which Is Best for You?], Vergleich der verschiedenen Logikfamilien, engl.&lt;br /&gt;
&lt;br /&gt;
[[Category:Bauteile]]&lt;/div&gt;</summary>
		<author><name>Max5v</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Schieberegister&amp;diff=90505</id>
		<title>AVR-Tutorial: Schieberegister</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Schieberegister&amp;diff=90505"/>
		<updated>2015-12-07T21:21:33Z</updated>

		<summary type="html">&lt;p&gt;Max5v: Änderung 90503 von 31.184.196.106 (Diskussion) rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ab und an stellt sich folgendes Problem: Man würde wesentlich mehr Ausgangspins oder Eingangspins benötigen als der [[Mikrocontroller]] zur Verfügung stellt. Ein möglicher Ausweg ist eine Porterweiterung mit einem Schieberegister. Zwei beliebte Schieberegister sind beispielsweise der 74xx595 bzw. der 74xx165.&lt;br /&gt;
&lt;br /&gt;
== Porterweiterung für Ausgänge ==&lt;br /&gt;
&lt;br /&gt;
Um neue Ausgangspins zu gewinnen kann der [[74xx | 74xx595]] verwendet werden. Dabei handelt es sich um ein &#039;&#039;8-Bit 3-state Serial-in/Serial-out or Parallel-Out Schieberegister mit einem Ausgangsregister und einem asynchronen Reset&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Hinter dieser kompliziert anmutenden Beschreibung verbirgt sich eine einfache Funktionalität: Das Schieberegister besteht aus zwei Funktionseinheiten: Dem eigentlichen Schieberegister und dem Ausgangsregister. In das Schieberegister können die Daten seriell hineingetaktet werden und durch ein bestimmtes Signal werden die Daten des Schieberegisters in das Ausgangsregister übernommen und können von dort auf die Ausgangspins geschaltet werden.&lt;br /&gt;
&lt;br /&gt;
Im Einzelnen bedeuten die Begriffe:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
! Begriff || Erklärung&lt;br /&gt;
|-&lt;br /&gt;
||8-Bit&lt;br /&gt;
|align=&amp;quot;left&amp;quot;| Acht Ausgangs[[Bit|bit]]s&lt;br /&gt;
|-&lt;br /&gt;
||3-state&lt;br /&gt;
|align=&amp;quot;left&amp;quot;| Die acht Registerausgänge können drei Zustände, Low, High und High-Impedanz annehmen.&amp;lt;BR&amp;gt;Siehe [[Ausgangsstufen Logik-ICs]]&lt;br /&gt;
|-&lt;br /&gt;
||Serial-in&lt;br /&gt;
|align=&amp;quot;left&amp;quot;| Serieller Eingang des Schieberegisters&lt;br /&gt;
|-&lt;br /&gt;
||Serial-out&lt;br /&gt;
|align=&amp;quot;left&amp;quot;| Serieller Ausgang des Schieberegisters&lt;br /&gt;
|-&lt;br /&gt;
||Parallel-Out&lt;br /&gt;
|align=&amp;quot;left&amp;quot;| Parallele Ausgänge des Ausgangsregisters&lt;br /&gt;
|-&lt;br /&gt;
||Schieberegister&lt;br /&gt;
|align=&amp;quot;left&amp;quot;| Serielle Daten werden durch den Baustein durchgeschoben&lt;br /&gt;
|-&lt;br /&gt;
|Ausgangsregister&lt;br /&gt;
|align=&amp;quot;left&amp;quot;| Ein Speicher, welcher die Daten des Schieberegisters zwischenspeichern kann.&amp;lt;BR&amp;gt;Dieses besteht aus acht [[FlipFlop]]s.&lt;br /&gt;
|-&lt;br /&gt;
|Asynchroner Reset&lt;br /&gt;
|align=&amp;quot;left&amp;quot;| Die Daten im Schieberegister können asynchron zurückgesetzt werden.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aufbau 74xx595 ===&lt;br /&gt;
&lt;br /&gt;
[[Bild:74xx595-1.png|framed|center|Pinbelegung eines 595]]&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Benennung der Pins in den Datenblättern verschiedener Hersteller unterscheidet sich zum Teil. Die Funktionen der Pins sind jedoch gleich. &lt;br /&gt;
&lt;br /&gt;
Achtung: Es gibt auch noch einen IC von TI mit eingebauten Treibern 50 V 150 mA, den TPIC6B595, der hat 20 Pins und eine abweichende Pinbelegung http://www.ti.com/product/tpic6b595&lt;br /&gt;
&lt;br /&gt;
==== HC oder HCT? ====&lt;br /&gt;
&lt;br /&gt;
[ACHTUNG: HIER STEHT VIEL MÜLL BEZUEGLICH DER SCHALTSCHWELLEN !!!&lt;br /&gt;
Schaltschwellen von HC, HCT, AHCT, etc. lassen sich im jeweiligen Datenblatt nachschlagen:&lt;br /&gt;
 V_IH --&amp;gt; HIGH-level input voltage&lt;br /&gt;
 V_IL --&amp;gt; LOW-level input voltage&lt;br /&gt;
&lt;br /&gt;
74AHCT595 kann direkt von Low-Voltage MCUs angesteuert werden (2V minimum)&lt;br /&gt;
bei HC/HCT etc liegt die High Schaltschwelle bei 3,5V (minimum)&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
Mal gibt es 74&#039;&#039;&#039;HC&#039;&#039;&#039;595, mal 74&#039;&#039;&#039;HCT&#039;&#039;&#039;595.&lt;br /&gt;
Diese beiden Typen unterscheiden sich nur bei der Festlegung der Schaltschwelle an Eingangspins:&lt;br /&gt;
* HC: Schaltschwelle = halbe Betriebsspannung&lt;br /&gt;
* HCT: Schaltschwelle TTL-kompatibel bei 1,4 V&lt;br /&gt;
Es gibt auch 74LS595. In der modernen CMOS-Welt sollte man sich Low-Power-Schottky (= bipolar = Ruhestrom fressend) nicht mehr antun.&lt;br /&gt;
&lt;br /&gt;
Im allgemeinen kann man alle Typen gleichermaßen verwenden und nimmt einfach den billigsten oder verfügbarsten. Nur beim Übergang zu echtem TTL oder verschiedenen Speisespannungen für Mikrocontroller und Portexpander wird es interessant.&lt;br /&gt;
&lt;br /&gt;
Ein häufiges Szenario ist ein Mikrocontroller mit 3-V-Speisung (etwa ein ARM7 oder MSP430). Dann kann man mit einem 74&#039;&#039;&#039;HCT&#039;&#039;&#039;595, an 5 V betrieben, echte 5-V-Ausgänge und die Pegelkonvertierung dazu haben.&lt;br /&gt;
74&#039;&#039;&#039;HC&#039;&#039;&#039;595 funktionieren hier nur mit Glück, und bei noch geringerer Speisespannung des Controllers — etwa 2,5 V — gar nicht.&lt;br /&gt;
&lt;br /&gt;
=== Pinbelegung 74xx595 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|-  style=&amp;quot;background-color:#ffddcc&amp;quot;&lt;br /&gt;
! DIL Pin-Nummer || Funktion || Dieses Tutorial || Motorola / ON Semi || Philips / NXP         || Fairchild     || SGS|| Texas Instruments&lt;br /&gt;
|-&lt;br /&gt;
|  1 || Ausgang B           || QB || Q&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt;  || Q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;   || Q&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt;  || QB|| Q&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt;  &lt;br /&gt;
|-&lt;br /&gt;
|  2 || Ausgang C           || QC || Q&amp;lt;sub&amp;gt;C&amp;lt;/sub&amp;gt;  || Q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;   || Q&amp;lt;sub&amp;gt;C&amp;lt;/sub&amp;gt;  || QC|| Q&amp;lt;sub&amp;gt;C&amp;lt;/sub&amp;gt;  &lt;br /&gt;
|-&lt;br /&gt;
|  3 || Ausgang D           || QD || Q&amp;lt;sub&amp;gt;D&amp;lt;/sub&amp;gt;  || Q&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;   || Q&amp;lt;sub&amp;gt;D&amp;lt;/sub&amp;gt;  || QD|| Q&amp;lt;sub&amp;gt;D&amp;lt;/sub&amp;gt;  &lt;br /&gt;
|-&lt;br /&gt;
|  4 || Ausgang E           || QE || Q&amp;lt;sub&amp;gt;E&amp;lt;/sub&amp;gt;  || Q&amp;lt;sub&amp;gt;4&amp;lt;/sub&amp;gt;   || Q&amp;lt;sub&amp;gt;E&amp;lt;/sub&amp;gt;  || QE|| Q&amp;lt;sub&amp;gt;E&amp;lt;/sub&amp;gt;  &lt;br /&gt;
|-&lt;br /&gt;
|  5 || Ausgang F           || QF || Q&amp;lt;sub&amp;gt;F&amp;lt;/sub&amp;gt;  || Q&amp;lt;sub&amp;gt;5&amp;lt;/sub&amp;gt;   || Q&amp;lt;sub&amp;gt;F&amp;lt;/sub&amp;gt;  || QF|| Q&amp;lt;sub&amp;gt;F&amp;lt;/sub&amp;gt;  &lt;br /&gt;
|-&lt;br /&gt;
|  6 || Ausgang G           || QG || Q&amp;lt;sub&amp;gt;G&amp;lt;/sub&amp;gt;  || Q&amp;lt;sub&amp;gt;6&amp;lt;/sub&amp;gt;   || Q&amp;lt;sub&amp;gt;G&amp;lt;/sub&amp;gt;  || QG|| Q&amp;lt;sub&amp;gt;G&amp;lt;/sub&amp;gt;  &lt;br /&gt;
|-&lt;br /&gt;
|  7 || Ausgang H           || QH || Q&amp;lt;sub&amp;gt;H&amp;lt;/sub&amp;gt;  || Q&amp;lt;sub&amp;gt;7&amp;lt;/sub&amp;gt;   || Q&amp;lt;sub&amp;gt;H&amp;lt;/sub&amp;gt;  || QH|| Q&amp;lt;sub&amp;gt;H&amp;lt;/sub&amp;gt;  &lt;br /&gt;
|-&lt;br /&gt;
|  8 || Masse, 0 V || [nicht dargestellt] || GND            || GND             || GND             || GND|| GND&lt;br /&gt;
|-&lt;br /&gt;
|  9 || Serieller Ausgang || QH* || SQ&amp;lt;sub&amp;gt;H&amp;lt;/sub&amp;gt; || Q&amp;lt;sub&amp;gt;7&amp;lt;/sub&amp;gt;´  ||Q&#039;&amp;lt;sub&amp;gt;H&amp;lt;/sub&amp;gt;  ||  QH´||Q&amp;lt;sub&amp;gt;H&#039;&amp;lt;/sub&amp;gt;  &lt;br /&gt;
|-&lt;br /&gt;
| 10 || Reset für Schieberegister             || SCL || RESET          || /MR             || /SCLR        || /SCLR || /SRCLR&lt;br /&gt;
|-&lt;br /&gt;
| 11 || Schiebetakt        || SCK || SHIFT CLOCK    || SH&amp;lt;sub&amp;gt;CP&amp;lt;/sub&amp;gt; || SCK          || SCK || SRCLK&lt;br /&gt;
|-&lt;br /&gt;
| 12 || Speichertakt        || RCK || LATCH CLOCK    || ST&amp;lt;sub&amp;gt;CP&amp;lt;/sub&amp;gt; || RCK          || RCK || RCLK&lt;br /&gt;
|-&lt;br /&gt;
| 13 || Ausgangssteuerung      || G || OUTPUT ENABLE  || /OE             || /G           || /G || /OE&lt;br /&gt;
|-&lt;br /&gt;
| 14 || Serieller Dateneingang  || SER || A              || D&amp;lt;sub&amp;gt;S&amp;lt;/sub&amp;gt;   || SER          || SI || SER&lt;br /&gt;
|-&lt;br /&gt;
| 15 || Ausgang A           || QA || Q&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;  || Q&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;   || Q&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;  || QA|| Q&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;  &lt;br /&gt;
|-&lt;br /&gt;
| 16 || Betriebsspannung || [nicht dargestellt] || V&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt; || V&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt;  || V&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt;  || V&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt;|| V&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Baustein besteht aus zwei Einheiten:&lt;br /&gt;
* dem Schieberegister&lt;br /&gt;
* dem Ausgangsregister&lt;br /&gt;
&lt;br /&gt;
Im Schieberegister werden die einzelnen Bits durchgeschoben. Mit jeder positiven Taktflanke(LOW -&amp;gt; HIGH) an &#039;&#039;&#039;SCK&#039;&#039;&#039; wird eine Schiebeoperation durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Das Ausgangsregister hat die Aufgabe die Ausgangspins des Bausteins anzusteuern. Durch dieses Ausgangsregister ist es möglich, die Schiebeoperationen im Hintergrund durchzuführen, ohne dass IC Pins ihren Wert ändern. Erst wenn die Schiebeoperation abgeschlossen ist, wird der aktuelle Zustand der Schieberegisterkette durch einen Puls an &#039;&#039;&#039;RCK&#039;&#039;&#039; in das Ausgangsregister übernommen.&lt;br /&gt;
&lt;br /&gt;
===Funktionsweise===&lt;br /&gt;
&lt;br /&gt;
Am Eingang &#039;&#039;&#039;SER&#039;&#039;&#039; (Pin 14) wird das gewünschte nächste Datum (0 oder 1) angelegt. Durch einen positiven Puls an &#039;&#039;&#039;SCK&#039;&#039;&#039; (Pin 11) wird der momentan an &#039;&#039;&#039;SER&#039;&#039;&#039; anliegende Wert als neuer Wert für Bit 0, das unterste Bit des Schieberegisters, übernommen. Gleichzeitig werden alle anderen Bits im Schieberegister um eine Stelle verschoben: Das Bit 6 wird ins Bit 7 übernommen, Bit 5 ins Bit 6, Bit 4 ins Bit 5, etc. sodass das Bit 0 zur Aufnahme des &#039;&#039;&#039;SER&#039;&#039;&#039; Bits frei wird.&lt;br /&gt;
&lt;br /&gt;
[[Bild:74xx595-2.png|center]]&lt;br /&gt;
&lt;br /&gt;
Eine Sonderstellung nimmt das ursprüngliche Bit 7 ein. Dieses Bit steht direkt auch am Ausgang &#039;&#039;&#039;QH*&#039;&#039;&#039; (Pin 9) zur Verfügung. Dadurch ist es möglich an ein Schieberegister einen weiteren Baustein 74xxx595 anzuschließen und so beliebig viele Schieberegister hintereinander zu schalten (kaskadieren). Auf diese Art lassen sich Schieberegister mit beliebig vielen Stufen aufbauen.&lt;br /&gt;
&lt;br /&gt;
Wurde das Schieberegister mit den Daten gefüllt, so wird mit einem LOW-HIGH Puls am Pin 12, &#039;&#039;&#039;RCK&#039;&#039;&#039; der Inhalt des Schieberegisters in das Ausgangsregister übernommen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:74xx595-3.png|center]]&lt;br /&gt;
&lt;br /&gt;
Mit dem Eingang &#039;&#039;&#039;G&#039;&#039;&#039; (Pin 13) kann das Ausgangsregister freigegeben werden. Liegt &#039;&#039;&#039;G&#039;&#039;&#039; auf 0, so führen die Ausgänge &#039;&#039;&#039;QA&#039;&#039;&#039; bis &#039;&#039;&#039;QH&#039;&#039;&#039; entsprechende Pegel. Liegt &#039;&#039;&#039;G&#039;&#039;&#039; auf 1, so schalten die Ausgänge &#039;&#039;&#039;QA&#039;&#039;&#039; bis &#039;&#039;&#039;QH&#039;&#039;&#039; auf [[Ausgangsstufen Logik-ICs |Tristate]]. D.h. sie treiben aktiv weder LOW oder HIGH, sondern sind hochohmig wie ein Eingang und nehmen jeden Pegel an, der ihnen von außen aufgezwungen wird.&lt;br /&gt;
&lt;br /&gt;
Bleibt nur noch der Eingang &#039;&#039;&#039;SCL&#039;&#039;&#039;(Pin 10). Mit ihm kann das Schieberegister im Baustein gelöscht, also auf eine definierte 0, gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Die Ansteuerung eines 74xxx595 Schieberegisters gestaltet sich sehr einfach. Im Grunde gibt es 2 Möglichkeiten:&lt;br /&gt;
* Mittels [[SPI]] kann der [[AVR]] das Schieberegister direkt und autark ansteuern. Das ist sehr schnell und verbraucht nur wenig CPU-Leistung&lt;br /&gt;
* Sind die entsprechenden SPI-Pins am AVR nicht frei, so ist auch eine softwaremäßige Ansteuerung des Schieberegisters mit einfachen Mitteln durchführbar.&lt;br /&gt;
&lt;br /&gt;
=== Ansteuerung per Software===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mega8-595.gif|framed|right|Anschluss eines 595]]&lt;br /&gt;
Für eine komplette Softwarelösung kann das Schieberegister an jede beliebige Port-Pin Kombination angeschlossen werden. Wir wählen die Pins &#039;&#039;&#039;PB0&#039;&#039;&#039;, &#039;&#039;&#039;PB1&#039;&#039;&#039;, &#039;&#039;&#039;PB2&#039;&#039;&#039; und &#039;&#039;&#039;PB3&#039;&#039;&#039; um dort die Schieberegisteranschlüsse &#039;&#039;&#039;SER&#039;&#039;&#039;, &#039;&#039;&#039;SCK&#039;&#039;&#039;, &#039;&#039;&#039;SCL&#039;&#039;&#039; und &#039;&#039;&#039;RCK&#039;&#039;&#039; anzuschließen. Des Weiteren muss das Schieberegister mit Spannung versorgt werden, auch wenn das rechts im Bild nicht eingezeichnet ist. Pin 16 muss auf +5V und Pin 8 auf GND geschaltet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Programmierung gestaltet sich dann nach folgendem Schema: Die 8 Bits eines Bytes werden nacheinander an den Ausgang &#039;&#039;&#039;PB0&#039;&#039;&#039; (&#039;&#039;&#039;SER&#039;&#039;&#039;) ausgegeben. Durch Generierung eines Pulses 0-1-0 an Pin &#039;&#039;&#039;PB1&#039;&#039;&#039; (&#039;&#039;&#039;SCK&#039;&#039;&#039;) übernimmt das Schieberegister nacheinander die einzelnen Bits. Dabei ist zu beachten, dass die Ausgabe mit dem höherwertigen Bit beginnen muss, denn dieses Bit wandert ja am weitesten zur Stelle &#039;&#039;&#039;QH&#039;&#039;&#039;. Sind alle 8 Bits ausgegeben, so wird durch einen weiteren 0-1-0 Impuls am Pin &#039;&#039;&#039;PB3&#039;&#039;&#039; (&#039;&#039;&#039;RCK&#039;&#039;&#039;) der Inhalt der Schieberegisterbits 0 bis 7 in die Ausgaberegister &#039;&#039;&#039;QA&#039;&#039;&#039; bis &#039;&#039;&#039;QH&#039;&#039;&#039; übernommen. Dadurch, dass am Schieberegister der Eingang &#039;&#039;&#039;G&#039;&#039;&#039; konstant auf 0-Pegel gehalten wird, erscheint dann auch die Ausgabe sofort an den entsprechenden Pins und kann zb. mit LEDs (low-current LEDs + Vorwiderstand verwenden) sichtbar gemacht werden.&lt;br /&gt;
&lt;br /&gt;
Der Schieberegistereingang &#039;&#039;&#039;SCL&#039;&#039;&#039; wird auf einer 1 gehalten. Würde er&lt;br /&gt;
auf 0 gehen, so würde die Schieberegisterkette gelöscht. Möchte man einen weiteren Prozessorpin einsparen, so kann man diesen Pin auch generell auf Vcc legen. Das Schieberegister könnte man in so einem Fall durch Einschreiben von 0x00 immer noch löschen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
.def temp1 = r16&lt;br /&gt;
.def temp2 = r17&lt;br /&gt;
&lt;br /&gt;
.equ SCHIEBE_DDR  = DDRB&lt;br /&gt;
.equ SCHIEBE_PORT = PORTB&lt;br /&gt;
.equ RCK          = 3&lt;br /&gt;
.equ SCK          = 1&lt;br /&gt;
.equ SCL          = 2&lt;br /&gt;
.equ SIN          = 0&lt;br /&gt;
&lt;br /&gt;
    ldi   temp1, LOW(RAMEND)     ; Stackpointer initialisieren&lt;br /&gt;
    out   SPL, temp1&lt;br /&gt;
    ldi   temp1, HIGH(RAMEND)&lt;br /&gt;
    out   SPH, temp1&lt;br /&gt;
&lt;br /&gt;
;&lt;br /&gt;
; Die Port Pins auf Ausgang konfigurieren&lt;br /&gt;
;&lt;br /&gt;
    ldi   temp1, (1&amp;lt;&amp;lt;RCK) | (1&amp;lt;&amp;lt;SCK) | (1&amp;lt;&amp;lt;SCL) | (1&amp;lt;&amp;lt;SIN) ; Anm.1&lt;br /&gt;
    out   SCHIEBE_DDR, temp1&lt;br /&gt;
&lt;br /&gt;
;&lt;br /&gt;
; die Clear Leitung am Schieberegister auf 1 stellen&lt;br /&gt;
;&lt;br /&gt;
    sbi   SCHIEBE_PORT, SCL&lt;br /&gt;
&lt;br /&gt;
;&lt;br /&gt;
; Ein Datenbyte ausgeben&lt;br /&gt;
;&lt;br /&gt;
    ldi   temp1, 0b10101010&lt;br /&gt;
    rcall Schiebe&lt;br /&gt;
    rcall SchiebeOut&lt;br /&gt;
&lt;br /&gt;
loop:&lt;br /&gt;
    rjmp  loop&lt;br /&gt;
&lt;br /&gt;
;-----------------------------------------------------------------------------&lt;br /&gt;
;&lt;br /&gt;
; Die Ausgabe im Schieberegister in das Ausgaberegister übernehmen&lt;br /&gt;
;&lt;br /&gt;
; Dazu am RCK Eingang am Schieberegister einen 0-1-0 Puls erzeugen&lt;br /&gt;
;&lt;br /&gt;
SchiebeOut:&lt;br /&gt;
    sbi   SCHIEBE_PORT, RCK&lt;br /&gt;
    cbi   SCHIEBE_PORT, RCK&lt;br /&gt;
    ret&lt;br /&gt;
&lt;br /&gt;
;-----------------------------------------------------------------------------&lt;br /&gt;
;&lt;br /&gt;
; 8 Bits aus temp1 an das Schieberegister ausgeben&lt;br /&gt;
Schiebe:&lt;br /&gt;
    push  temp2&lt;br /&gt;
    ldi   temp2, 8             ; 8 Bits müssen ausgegeben werden&lt;br /&gt;
&lt;br /&gt;
Schiebe_1:&lt;br /&gt;
     ;&lt;br /&gt;
     ; jeweils das höchstwertige Bit aus temp1 ins Carry-Flag schieben&lt;br /&gt;
     ; Je nach Zustand des Carry-Flags wird die Datenleitung entsprechend&lt;br /&gt;
     ; gesetzt oder gelöscht&lt;br /&gt;
     ;&lt;br /&gt;
    rol  temp1                 ; MSB -&amp;gt; Carry&lt;br /&gt;
    brcs Schiebe_One           ; Carry gesetzt? -&amp;gt; weiter bei Schiebe_One&lt;br /&gt;
    cbi  SCHIEBE_PORT, SIN     ; Eine 0 ausgeben&lt;br /&gt;
    rjmp Schiebe_Clock         ; und Sprung zur Clock Puls Generierung&lt;br /&gt;
Schiebe_One:&lt;br /&gt;
    sbi  SCHIEBE_PORT, SIN     ; Eine 1 ausgeben&lt;br /&gt;
&lt;br /&gt;
     ;&lt;br /&gt;
     ; einen Impuls an SCK zur Übernahme des Bits nachschieben&lt;br /&gt;
     ;&lt;br /&gt;
Schiebe_Clock:&lt;br /&gt;
    sbi   SCHIEBE_PORT, SCK    ; Clock-Ausgang auf 1 ...&lt;br /&gt;
    cbi   SCHIEBE_PORT, SCK    ; und wieder zurück auf 0&lt;br /&gt;
&lt;br /&gt;
    dec   temp2                ; Anzahl der ausgegebenen Bits runterzählen&lt;br /&gt;
    brne  Schiebe_1            ; Wenn noch keine 8 Bits ausgegeben -&amp;gt; Schleife bilden&lt;br /&gt;
&lt;br /&gt;
    pop   temp2&lt;br /&gt;
    ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anm.1: Siehe [[Bitmanipulation]]&lt;br /&gt;
&lt;br /&gt;
=== Ansteuerung per SPI-Modul===&lt;br /&gt;
[[Bild:Mega8-595-SPI.png|framed|right|Anschluss eines 595 per SPI]]&lt;br /&gt;
Noch schneller geht die Ansteuerung des Schieberegisters mittels [[Serial_Peripheral_Interface | SPI]]-Modul, welches in fast allen AVRs vorhanden ist. Hier wird der Pin &#039;&#039;&#039;SCL&#039;&#039;&#039; nicht benutzt, da das praktisch keinen Sinn hat. Er muss also fest auf VCC gelegt werden. (Oder mit den Reset-Pin des AVRs, das mit einer RC Schaltung versehen ist, verbunden werden. Damit erreicht man einen definierten Anfangszustand des Schieberegisters.) Die Pins für &#039;&#039;&#039;SCK&#039;&#039;&#039; und &#039;&#039;&#039;SIN&#039;&#039;&#039; sind durch den jeweiligen AVR fest vorgegeben. &#039;&#039;&#039;SCK&#039;&#039;&#039; vom 74xxx595 wird mit &#039;&#039;&#039;SCK&#039;&#039;&#039; vom AVR verbunden sowie &#039;&#039;&#039;SIN&#039;&#039;&#039; mit &#039;&#039;&#039;MOSI&#039;&#039;&#039; (&#039;&#039;&#039;M&#039;&#039;&#039;aster &#039;&#039;&#039;O&#039;&#039;&#039;ut, &#039;&#039;&#039;S&#039;&#039;&#039;lave &#039;&#039;&#039;I&#039;&#039;&#039;n). &#039;&#039;&#039;MISO&#039;&#039;&#039; (&#039;&#039;&#039;M&#039;&#039;&#039;aster &#039;&#039;&#039;I&#039;&#039;&#039;n, &#039;&#039;&#039;S&#039;&#039;&#039;lave &#039;&#039;&#039;O&#039;&#039;&#039;ut) ist hier ungenutzt. Es kann NICHT für &#039;&#039;&#039;RCK&#039;&#039;&#039; verwendet werden, da es im SPI-Master Modus immer ein Eingang ist! Es kann aber als allgemeiner Eingang oder für 74HC165 ([[#Porterweiterung_für_Eingänge|siehe unten]]) verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Der AVR-Pin &#039;&#039;&#039;SS&#039;&#039;&#039; wird sinnvollerweise als &#039;&#039;&#039;RCK&#039;&#039;&#039; benutzt, da er sowieso als Ausgang geschaltet werden &#039;&#039;&#039;muss&#039;&#039;&#039;, sonst gibt es böse Überaschungen (siehe Datenblatt „SS Pin Functionality“). Dieser sollte mit einem Widerstand von 10 kΩ nach Masse, während der Start- und Initialisierungsphase, auf L-Potential  gehalten werden. `(&#039;&#039;&#039;SS&#039;&#039;&#039; ist während dieser Zeit noch im Tri-State und es könnte passieren, dass die zufälligen Daten des Schieberegisters in das Ausgangslatch übernommen werden.)&lt;br /&gt;
&lt;br /&gt;
Bei den kleineren ATtinys mit &#039;&#039;&#039;USI&#039;&#039;&#039; (Universal Serial Interface) darf man sich von den Pin-Bezeichnungen MOSI und MISO nicht [http://de.wikipedia.org/wiki/Bockshorn_(Redensart) ins Bockshorn jagen] lassen: Hier ist MISO der Ausgang(!) &#039;&#039;&#039;DO&#039;&#039;&#039; und MOSI der Eingang(!) &#039;&#039;&#039;DI&#039;&#039;&#039;. Die Pinbezeichnungen MOSI und MISO sind nur zum Programmieren und irreführend, weil ohnehin nur für den Slave-Betrieb.&lt;br /&gt;
&lt;br /&gt;
Je nach Bedarf kann man die Taktrate des SPI-Moduls zwischen 1/2 ... 1/128 des CPU-Taktes wählen. Es spricht kaum etwas dagegen mit maximaler Geschwindigkeit zu arbeiten. Die AVRs können zur Zeit mit maximal 20 MHz getaktet werden, d.h. es sind maximal 10 MHz SPI-Takt möglich. Das ist für ein 74xxx595 kein Problem. Die Übertragung von 8 Bit dauert dann gerade mal 800 ns!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
.def temp1 = r16&lt;br /&gt;
&lt;br /&gt;
; Die Definitionen müssen an den jeweiligen AVR angepasst werden&lt;br /&gt;
&lt;br /&gt;
.equ SCHIEBE_DDR  = DDRB&lt;br /&gt;
.equ SCHIEBE_PORT = PORTB&lt;br /&gt;
.equ RCK          = PB2     ; SS&lt;br /&gt;
.equ SCK          = PB5     ; SCK&lt;br /&gt;
.equ SIN          = PB3     ; MOSI&lt;br /&gt;
&lt;br /&gt;
    ldi   temp1, LOW(RAMEND)     ; Stackpointer initialisieren&lt;br /&gt;
    out   SPL, temp1&lt;br /&gt;
    ldi   temp1, HIGH(RAMEND)&lt;br /&gt;
    out   SPH, temp1&lt;br /&gt;
;&lt;br /&gt;
; SCK, MOSI, SS als Ausgänge schalten&lt;br /&gt;
;&lt;br /&gt;
    in    temp1, SCHIEBE_DDR&lt;br /&gt;
    ori   temp1, (1&amp;lt;&amp;lt;SIN) | (1&amp;lt;&amp;lt;SCK) | (1&amp;lt;&amp;lt;RCK) &lt;br /&gt;
    out   SCHIEBE_DDR,temp1     &lt;br /&gt;
;&lt;br /&gt;
; SPI Modul konfigurieren&lt;br /&gt;
;&lt;br /&gt;
    ldi   temp1, (1&amp;lt;&amp;lt;SPE) | (1&amp;lt;&amp;lt;MSTR)&lt;br /&gt;
    out   SPCR, temp1           ; keine Interrupts, MSB first, Master&lt;br /&gt;
                                ; CPOL = 0, CPHA =0&lt;br /&gt;
                                ; SCK Takt = 1/2 XTAL&lt;br /&gt;
    ldi   temp1, (1&amp;lt;&amp;lt;SPI2X)&lt;br /&gt;
    out   SPSR, temp1           ; double speed aktivieren&lt;br /&gt;
    out   SPDR, temp1           ; Dummy Daten, um SPIF zu setzen&lt;br /&gt;
;&lt;br /&gt;
; Ein Datenbyte ausgeben&lt;br /&gt;
;&lt;br /&gt;
    ldi   temp1, 0b10101010&lt;br /&gt;
    rcall Schiebe               ; Daten schieben&lt;br /&gt;
    rcall SchiebeOut            ; Daten in Ausgangsregister übernehmen&lt;br /&gt;
&lt;br /&gt;
loop:&lt;br /&gt;
    rjmp  loop&lt;br /&gt;
&lt;br /&gt;
;-----------------------------------------------------------------------------&lt;br /&gt;
;&lt;br /&gt;
; Die Daten im Schieberegister in das Ausgaberegister übernehmen&lt;br /&gt;
;&lt;br /&gt;
; Dazu am RCK Eingang am Schieberegister einen 0-1-0 Puls erzeugen&lt;br /&gt;
;&lt;br /&gt;
SchiebeOut:&lt;br /&gt;
    sbis  SPSR, SPIF            ; prüfe ob eine alte Übertragung beendet ist&lt;br /&gt;
    rjmp  SchiebeOut&lt;br /&gt;
    sbi   SCHIEBE_PORT, RCK&lt;br /&gt;
    cbi   SCHIEBE_PORT, RCK&lt;br /&gt;
    ret&lt;br /&gt;
&lt;br /&gt;
;-----------------------------------------------------------------------------&lt;br /&gt;
;&lt;br /&gt;
; 8 Bits aus temp1 an das Schieberegister ausgeben&lt;br /&gt;
;&lt;br /&gt;
Schiebe:&lt;br /&gt;
    sbis    SPSR, SPIF      ; prüfe ob eine alte Übertragung beendet ist&lt;br /&gt;
    rjmp    Schiebe&lt;br /&gt;
    out     SPDR, temp1     ; Daten ins SPI Modul schreiben, Übertragung beginnt automatisch&lt;br /&gt;
    ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kaskadieren von Schieberegistern===&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mega8-595-2.gif|framed|right|Kaskadieren mehrerer 595]]&lt;br /&gt;
Um ein Schieberegister anzuschließen genügen also im einfachsten Fall 4 freie Prozessorpins (3 wenn &#039;&#039;&#039;SCL&#039;&#039;&#039; nicht benutzt wird) um weitere 8 Ausgangsleitungen zu bekommen. Genügen diese 8 Leitungen nicht, so kann ohne Probleme ein weiteres Schieberegister an das bereits vorhandene angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Das nächste Schieberegister wird mit seinem Dateneingang &#039;&#039;&#039;SER&#039;&#039;&#039; einfach an den dafür vorgesehenen Ausgang &#039;&#039;&#039;QH*&#039;&#039;&#039; des vorhergehenden Schieberegisters angeschlossen. Die Steuerleitungen &#039;&#039;&#039;SCK&#039;&#039;&#039;, &#039;&#039;&#039;RCK&#039;&#039;&#039; und &#039;&#039;&#039;SCL&#039;&#039;&#039; werden parallel zu den bereits vorhandenen geschaltet. Konzeptionell erhält man dadurch ein Schieberegister mit einer Breite von 16 Bit. Werden weiter Bausteine in derselben Manier angeschlossen, so erhöht sich die Anzahl der zur Verfügung stehenden Ausgabeleitungen mit jedem Baustein um 8 ohne dass sich die Anzahl der am Prozessor notwendigen Ausgabepins erhöhen würde. Um diese weiteren Register zu nutzen, muss man in der reinen Softwarelösung nur mehrfach die Funktion &#039;&#039;&#039;Schiebe&#039;&#039;&#039; aufrufen, um alle Daten auszugeben. Am Ende werden dann mit &#039;&#039;&#039;SchiebeOut&#039;&#039;&#039; die Daten in die Ausgangsregister übernommen.&lt;br /&gt;
&lt;br /&gt;
Bei der SPI Lösung werden ebenfalls ganz einfach mehrere Bytes über SPI ausgegeben, ehe dann mittels &#039;&#039;&#039;RCK&#039;&#039;&#039; die in die Schieberegisterkette eingetakteten Bits in das Ausgangsregister übernommen werden.&lt;br /&gt;
Um das Ganze ein wenig zu vereinfachen, soll hier eine Funktion zur Ansteuerung mehrerer kaskadierter Schieberegister über das SPI-Modul gezeigt werden. Dabei wird die Ausgabe mehrerer Bytes über eine Schleife realisiert, mehrfache Aufrufe der Funktion sind damit nicht nötig. Statt dessen übergibt man einen Zeiger auf einen Datenblock im RAM sowie die Anzahl der zu übertragenden Bytes. Außerdem wird die Datenübernahme durch &#039;&#039;&#039;RCK&#039;&#039;&#039; standardkonform integriert. Denn bei nahezu allen ICs mit SPI wird ein sog. CS-Pin verwendet (&#039;&#039;&#039;C&#039;&#039;&#039;hip &#039;&#039;&#039;S&#039;&#039;&#039;elect) Dieser Pin ist meist LOW aktiv, d.h. wenn er HIGH ist, ignoriert der IC alle Signale an &#039;&#039;&#039;SCK&#039;&#039;&#039; und &#039;&#039;&#039;MOSI&#039;&#039;&#039; und gibt keine Daten an MISO aus. Ist er LOW, dann ist der IC aktiv und funktioniert normal. Bei der steigenden Flanke an &#039;&#039;&#039;CS&#039;&#039;&#039; werden die Daten ins Ausgangsregister übernommen. Die Funktion ist sehr schnell, da die Zeit während der die Übertragung eines Bytes läuft, dazu genutzt wird, den Schleifenzähler zu verringern und zu prüfen sowie neue Sendedaten zu laden. Zwischen den einzelnen Bytes gibt es somit nur eine Pause von max. 6 Systemtakten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
.def temp1 = r16&lt;br /&gt;
&lt;br /&gt;
; Die Definitionen müssen an den jeweiligen AVR angepasst werden&lt;br /&gt;
&lt;br /&gt;
.equ SCHIEBE_DDR  = DDRB&lt;br /&gt;
.equ SCHIEBE_PORT = PORTB&lt;br /&gt;
.equ RCK          = PB2     ; SS&lt;br /&gt;
.equ SCK          = PB5     ; SCK&lt;br /&gt;
.equ SIN          = PB3     ; MOSI&lt;br /&gt;
&lt;br /&gt;
;-----------------------------------------------------------------------------&lt;br /&gt;
;&lt;br /&gt;
; Datensegment im RAM&lt;br /&gt;
;&lt;br /&gt;
;-----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
.dseg&lt;br /&gt;
.org $60&lt;br /&gt;
Schiebedaten:       .byte 2&lt;br /&gt;
&lt;br /&gt;
;-----------------------------------------------------------------------------&lt;br /&gt;
;&lt;br /&gt;
; Programmsegment im FLASH&lt;br /&gt;
;&lt;br /&gt;
;-----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
.cseg&lt;br /&gt;
    ldi     temp1, LOW(RAMEND)     ; Stackpointer initialisieren&lt;br /&gt;
    out     SPL, temp1&lt;br /&gt;
    ldi     temp1, HIGH(RAMEND)&lt;br /&gt;
    out     SPH, temp1&lt;br /&gt;
;&lt;br /&gt;
; SCK, MOSI, SS als Ausgänge schalten&lt;br /&gt;
;&lt;br /&gt;
    in      temp1,SCHIEBE_DDR&lt;br /&gt;
    ori     temp1,(1&amp;lt;&amp;lt;SIN) | (1&amp;lt;&amp;lt;SCK) | (1&amp;lt;&amp;lt;RCK) &lt;br /&gt;
    out     SCHIEBE_DDR,temp1&lt;br /&gt;
&lt;br /&gt;
    sbi     SCHIEBE_PORT, RCK   ; Slave select inaktiv&lt;br /&gt;
;&lt;br /&gt;
; SPI Modul konfigurieren&lt;br /&gt;
;&lt;br /&gt;
    ldi     temp1, 0b01010000&lt;br /&gt;
    out     SPCR, temp1         ; keine Interrupts, MSB first, Master&lt;br /&gt;
                                ; CPOL = 0, CPHA =0&lt;br /&gt;
                                ; SCK Takt = 1/2 XTAL&lt;br /&gt;
    ldi     r16,1&lt;br /&gt;
    out     SPSR,r16            ; Double Speed&lt;br /&gt;
    out     SPDR,temp1          ; Dummy Daten, um SPIF zu setzen&lt;br /&gt;
&lt;br /&gt;
; den Datenblock mit Daten füllen&lt;br /&gt;
&lt;br /&gt;
    ldi     temp1,$F0&lt;br /&gt;
    sts     Schiebedaten,temp1&lt;br /&gt;
    ldi     temp1,$55&lt;br /&gt;
    sts     Schiebedaten+1,temp1&lt;br /&gt;
&lt;br /&gt;
loop:&lt;br /&gt;
; den Datenblock ausgeben&lt;br /&gt;
&lt;br /&gt;
    ldi     r16,2&lt;br /&gt;
    ldi     zl,low(Schiebedaten)&lt;br /&gt;
    ldi     zh, high(Schiebedaten)&lt;br /&gt;
    rcall   Schiebe_alle                    ; Daten ausgeben&lt;br /&gt;
&lt;br /&gt;
    rjmp  loop                              ; nur zur Simulation&lt;br /&gt;
&lt;br /&gt;
;-----------------------------------------------------------------------------&lt;br /&gt;
;&lt;br /&gt;
; N Bytes an das Schieberegister ausgeben und in das Ausgaberegister übernehmen&lt;br /&gt;
;&lt;br /&gt;
; r16: Anzahl der Datenbytes&lt;br /&gt;
; Z: Zeiger auf Datenblock im RAM&lt;br /&gt;
;&lt;br /&gt;
;-----------------------------------------------------------------------------&lt;br /&gt;
Schiebe_alle:&lt;br /&gt;
    cbi     SCHIEBE_PORT, RCK   ; RCK LOW, SPI Standardverfahren&lt;br /&gt;
    push    r17&lt;br /&gt;
&lt;br /&gt;
Schiebe_alle_2:&lt;br /&gt;
    ld      r17,Z+&lt;br /&gt;
Schiebe_alle_3:&lt;br /&gt;
    sbis    SPSR,SPIF           ; prüfe ob eine alte Übertragung beendet ist&lt;br /&gt;
    rjmp    Schiebe_alle_3&lt;br /&gt;
    out     SPDR,r17            ; Daten ins SPI Modul schreiben, Übertragung beginnt automatisch&lt;br /&gt;
    dec     r16&lt;br /&gt;
    brne    Schiebe_alle_2&lt;br /&gt;
&lt;br /&gt;
Schiebe_alle_4:&lt;br /&gt;
    sbis    SPSR,SPIF           ; prüfe ob die letzte Übertragung beendet ist&lt;br /&gt;
    rjmp    Schiebe_alle_4&lt;br /&gt;
&lt;br /&gt;
    pop     r17&lt;br /&gt;
    sbi     SCHIEBE_PORT, RCK   ; RCK inaktiv, Datenübernahme&lt;br /&gt;
    ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Nachteil von Schieberegistern ist allerdings, dass sich die Zeit zum Setzen aller Ausgabeleitungen mit jedem weiteren Baustein immer weiter erhöht. Dies deshalb, da ja die einzelnen Bits im Gänsemarsch durch alle Bausteine geschleust werden müssen und für jeden einzelnen Schiebevorgang etwas Zeit notwendig ist. Ein Ausweg ist die Verwendung des SPI-Moduls, welches schneller arbeitet als die reine Softwarelösung. Ist noch mehr Geschwindigkeit gefragt, so sind mehr Port-Pins nötig. Kann ein kompletter Port mit 8 Pins für die Daten genutzt werden, sowie ein paar weitere Steuerleitungen, so können ein oder mehrere 74xxx573 eine Alternative sein, um jeweils ein vollständiges Byte auszugeben. Natürlich kann der 74xxx573 (oder ein ähnliches Schieberegister) auch mit dem 74xxx595 zusammen eingesetzt werden, beispielsweise in dem über das Schieberegister verschiedene 74xxx595 nacheinander aktiviert werden. Weitere Tips und Tricks dazu gibt es vielleicht in einem weiteren Tutorial...&lt;br /&gt;
&lt;br /&gt;
=== Acht LEDs mit je 20mA pro Schieberegister ===&lt;br /&gt;
&lt;br /&gt;
Will man nun acht [[LED]]s mit dem Schieberegister ansteuern, kann man diese direkt über Vorwiderstände anschließen. Doch ein genauer Blick ins Datenblatt verrät, dass der 74xx595 nur maximal 70mA über VCC bzw. GND ableiten kann. Und wenn man den IC nicht gnadenlos quälen, und damit die Lebensdauer und Zuverlässigkeit drastisch reduzieren will, gibt es nur zwei Auswege.&lt;br /&gt;
&lt;br /&gt;
* Den Strom pro LED auf 70/8 = 8,75mA begrenzen; Das reicht meistens aus um die LEDs schön leuchten zu lassen, vor allem bei low-current und ultrahellen LEDs&lt;br /&gt;
* Wenn doch 20 mA pro LED gebraucht werden, kann man die folgende Trickschaltung anwenden.&lt;br /&gt;
&lt;br /&gt;
[[bild:8x20mA_LED_mit_74xx595.png|framed|center|Mehrere LED anschließen]]&lt;br /&gt;
&lt;br /&gt;
Der Trick besteht darin, dass 4 LEDs ihren Strom über das Schieberegister von VCC beziehen (HIGH aktiv) während die anderen vier ihren Strom über GND leiten (LOW aktiv). Damit bleiben ganz offiziell für jede LED 70/4 = 17,5mA. Um die Handhabung in der Software zu vereinfachen muss nur vor der Ausgabe der Daten das jeweilige Byte mit 0x0F XOR verknüpft werden, bevor es in das Schieberegister getaktet wird. Dadurch werden die LOW-aktiven LEDs richtig angesteuert und die Datenhandhabung in der Software muss nur mit HIGH-aktiven rechnen. Außerdem wird der G Eingang verwendet, um die Helligkeit aller LEDs per [[PWM]] zu steuern. Beachtet werden muss, dass die PWM im invertierten Modus generiert werden muss, da der Eingang G LOW aktiv ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;B&amp;gt;Achtung!&amp;lt;/B&amp;gt; Die Widerstände sind auf blaue LEDs mit 3,3V Flussspannung ausgelegt. Bei roten, gelben und grünen [[LED]]s ist die Flussspannung geringer und dementsprechend muss der Vorwiderstand größer sein.&lt;br /&gt;
&lt;br /&gt;
Wenn 20mA immer noch nicht reichen sollten oder z.B. RGB-LEDs mit gemeinsamer Anode angesteuert werden müssen, dann hilft nur ein stärkerer IC. Der Klassiker ist der TPIC6A595 von TI, er kombiniert ein Schieberegister mit MOSFETs, sodass hier 250mA pro Kanal zur Verfügung stehen.&lt;br /&gt;
&lt;br /&gt;
=== Achtung beim Startup! ===&lt;br /&gt;
&lt;br /&gt;
Die Ausgänge des &#039;595 führen beim Einschalten undefinierte, also zufällige Pegel! Und der Eingang ¬SCL löscht nur die Schieberegister (= unnütz, um mit ¬RESET zu verbinden). Sind deshalb &#039;&#039;definierte&#039;&#039; Pegel beim Einschalten unerlässlich, muss man ¬OE beschalten:&lt;br /&gt;
* Entweder mit einem weiteren Mikrocontroller-Ausgang (der mit einem externen Pull-Up-Widerstand zu beschalten ist und nach dem ersten Durchschieben dauerhaft auf LOW gelegt wird)&lt;br /&gt;
* Oder mit einer RC(D)-Kombination, die die Ausgänge für eine gewisse Zeit auf Tristate hält. Spart einen Mikrocontroller-Pin.&lt;br /&gt;
Obendrein sind, wie sonst am Mikrocontroller, die betreffenden Ausgänge mit externen Pull-Up- oder Pull-Down-Widerständen zu beschalten.&lt;br /&gt;
&lt;br /&gt;
== Porterweiterung für Eingänge ==&lt;br /&gt;
&lt;br /&gt;
Ein naher Verwandter des 74xx595 ist der [[74xx | 74xx165]], er ist quasi das Gegenstück. Hierbei handet es sich um ein &#039;&#039;8-bit parallel-in/serial-out shift register&#039;&#039;. Auf Deutsch: Ein 8 Bit Schieberegister mit parallelem Eingang und seriellem Ausgang. Damit kann man eine große Anzahl Eingänge sehr einfach und preiswert zu seinem Mikrocontroller hinzufügen.&lt;br /&gt;
&lt;br /&gt;
=== Aufbau ===&lt;br /&gt;
&lt;br /&gt;
[[bild:74xx165-1.png|framed|center|Pinbelegung eines 165]]&lt;br /&gt;
&lt;br /&gt;
Der Aufbau ist sehr ähnlich zum 74xx595. Allerdings gibt es kein Register zum Zwischenspeichern. Das ist auch gar nicht nötig, da der IC ja einen parallelen Eingang hat. Der muss nicht zwischengespeichert werden. Es gibt hier also wirklich nur das Schieberegister. Dieses wird über den Eingang PL mit den parallelen Daten geladen. Dann können die Daten seriell mit Takten an CLK aus dem Ausgang Q7 geschoben werden.&lt;br /&gt;
&lt;br /&gt;
=== Funktionsweise ===&lt;br /&gt;
&lt;br /&gt;
DS ist der serielle Dateneingang, welcher im Falle von kaskadierten Schieberegistern mit dem Ausgang des vorhergehenden ICs verbunden wird.&lt;br /&gt;
&lt;br /&gt;
D0..D7 sind die parallelen Dateneingänge.&lt;br /&gt;
&lt;br /&gt;
Mittels des Eingangs PL (&#039;&#039;&#039;P&#039;&#039;&#039;arallel &#039;&#039;&#039;L&#039;&#039;&#039;oad) werden die Daten vom parallelen Eingang in das Schieberegister übernommen, wenn dieses Signal LOW ist. Hier muss man aber ein klein wenig aufpassen. Auf Grund der Schaltungsstruktur ist der Eingang PL mit dem Takt CLK verknüpft (obwohl es dafür keinen logischen Grund gibt :-0). Damit es nicht zu unerwünschten Fehlschaltungen kommt, muss der Takt CLK während des Ladens auf HIGH liegen. Wird PL wieder auf HIGH gesetzt, sind die Daten geladen. Das erste Bit liegt direkt am Ausgang Q7 an. Die restlichen Bits können nach und nach durch das Register geschoben werden.&lt;br /&gt;
&lt;br /&gt;
Der Eingang CE (&#039;&#039;&#039;C&#039;&#039;&#039;lock &#039;&#039;&#039;E&#039;&#039;&#039;nable) steuert, ob das Schieberegister auf den Takt CLK reagieren soll oder nicht. Ist CE gleich HIGH werden alle Takte an CLK ignoriert. Bei LOW werden mit jeder positiven Flanke die Daten um eine Stufe weiter geschoben.&lt;br /&gt;
&lt;br /&gt;
Wird am Eingang CLK eine LOW-HIGH Flanke angelegt und ist dabei CE auf LOW, dann werden die Daten im Schieberegister um eine Position weiter geschoben: DS-&amp;gt;Q0, Q0-&amp;gt;Q1, Q1-&amp;gt;Q2, Q2-&amp;gt;Q3, Q3-&amp;gt;Q4, Q4-&amp;gt;Q5, Q5-&amp;gt;Q6, Q6-&amp;gt;Q7. Q0..Q6 sind interne Signale, siehe [http://www.nxp.com/acrobat/datasheets/74HC_HCT165_CNV_2.pdf Datenblatt].&lt;br /&gt;
&lt;br /&gt;
Q7 ist der serielle Ausgang des Schieberegisters. Dort Werden Takt für Takt die Daten ausgegeben. Hier wird normalerweise der Eingang des Mikrocontrollers oder der Eingang des nächsten Schieberegisters angeschlossen.&lt;br /&gt;
&lt;br /&gt;
Q7\ ist der invertierte Ausgang des Schieberegisters. Er wird meist nicht verwendet.&lt;br /&gt;
&lt;br /&gt;
=== Schaltung ===&lt;br /&gt;
&lt;br /&gt;
Um nun beispielsweise zwei Schieberegister zu kaskadieren um 16 Eingangspins zu erhalten sollte man folgende Verschaltung vornehmen. Beachten sollte man dabei, dass&lt;br /&gt;
&lt;br /&gt;
* der serielle Eingang DS des ersten Schieberegisters (hier IC1) auf einen festen Pegel gelegt wird (LOW oder HIGH).&lt;br /&gt;
* der serielle Datenausgang bei der Benutzung des SPI-Moduls an MISO und nicht an MOSI angeschlossen wird.&lt;br /&gt;
&lt;br /&gt;
[[bild:74xx165-2.png|framed|center|Anschluss eines 165]]&lt;br /&gt;
&lt;br /&gt;
Nachfolgend werden zwei Beispiele gezeigt, welche die Ansteuerung nach bekanntem Muster übernehmen. Nur dass hier eben Daten gelesen anstatt geschrieben werden. Zu beachten ist, dass hier ein anderer Modus der SPI-Ansteuerung verwendet werden muss, weil der Baustein das nötig macht. Das muss beachtet werden, wenn auch Schieberegister für Ausgänge verwendet werden. Dabei muss jeweils vor dem Zugriff auf die Ein- oder Ausgangsregister der Modus des Taktes (CPOL) umgeschaltet werden.&lt;br /&gt;
&lt;br /&gt;
=== Ansteuerung per Software ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
; Porterweiterung für Eingänge mit Schieberegister 74xx165&lt;br /&gt;
; Ansteuerung per Software&lt;br /&gt;
&lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
.def temp1 = r16&lt;br /&gt;
.def temp2 = r17&lt;br /&gt;
.def temp3 = r18&lt;br /&gt;
&lt;br /&gt;
; Pins anpassen, frei wählbar&lt;br /&gt;
&lt;br /&gt;
.equ SCHIEBE_DDR  = DDRB&lt;br /&gt;
.equ SCHIEBE_PORT = PORTB&lt;br /&gt;
.equ SCHIEBE_PIN  = PINB&lt;br /&gt;
.equ CLK          = PB3&lt;br /&gt;
.equ PL           = PB1&lt;br /&gt;
.equ DIN          = PB2&lt;br /&gt;
&lt;br /&gt;
;-----------------------------------------------------------------------------&lt;br /&gt;
;&lt;br /&gt;
; Datensegment im RAM&lt;br /&gt;
;&lt;br /&gt;
;-----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
.dseg&lt;br /&gt;
.org 0x60&lt;br /&gt;
Daten:      .byte 2             ; Speicherplatz für Eingangsdaten&lt;br /&gt;
&lt;br /&gt;
;-----------------------------------------------------------------------------&lt;br /&gt;
;&lt;br /&gt;
; Programmsegment im FLASH&lt;br /&gt;
;&lt;br /&gt;
;-----------------------------------------------------------------------------&lt;br /&gt;
.cseg&lt;br /&gt;
    ldi     temp1, LOW(RAMEND)  ; Stackpointer initialisieren&lt;br /&gt;
    out     SPL, temp1&lt;br /&gt;
    ldi     temp1, HIGH(RAMEND)&lt;br /&gt;
    out     SPH, temp1&lt;br /&gt;
&lt;br /&gt;
; CLK und PL als Ausgänge schalten&lt;br /&gt;
&lt;br /&gt;
    ldi     temp1, (1&amp;lt;&amp;lt;clk) | (1&amp;lt;&amp;lt;pl)&lt;br /&gt;
    out     SCHIEBE_DDR, temp1&lt;br /&gt;
&lt;br /&gt;
    sbi     schiebe_port, clk   ; Takt im Ruhezustand immer auf 1&lt;br /&gt;
                                ; komische Schaltung im 74xx165&lt;br /&gt;
&lt;br /&gt;
; Zwei Bytes einlesen&lt;br /&gt;
&lt;br /&gt;
    ldi     ZL,low(Daten)&lt;br /&gt;
    ldi     ZH,high(Daten)&lt;br /&gt;
    ldi     temp1,2&lt;br /&gt;
    rcall   schiebe_eingang&lt;br /&gt;
&lt;br /&gt;
loop:&lt;br /&gt;
    rjmp    loop&lt;br /&gt;
&lt;br /&gt;
;-----------------------------------------------------------------------------&lt;br /&gt;
;&lt;br /&gt;
; N Bytes seriell einlesen&lt;br /&gt;
;&lt;br /&gt;
; temp1 : N, Anzahl der Bytes&lt;br /&gt;
; Z     : Zeiger auf einen Datenbereich im SRAM&lt;br /&gt;
;-----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
schiebe_eingang:&lt;br /&gt;
    push    temp2               ; Register sichern&lt;br /&gt;
    push    temp3&lt;br /&gt;
&lt;br /&gt;
    cbi     schiebe_port, pl    ; Daten parallel laden&lt;br /&gt;
    sbi     schiebe_port, pl&lt;br /&gt;
&lt;br /&gt;
schiebe_eingang_byte_schleife:&lt;br /&gt;
&lt;br /&gt;
    ldi     temp3, 8            ; Bitzähler&lt;br /&gt;
schiebe_eingang_bit_schleife:&lt;br /&gt;
    lsl     temp2               ; Daten weiterschieben&lt;br /&gt;
&lt;br /&gt;
; das IO Bit Din in das niederwerigste Bit von temp2 kopieren&lt;br /&gt;
&lt;br /&gt;
    sbic    schiebe_pin, din    ; wenn Null, nächsten Befehl überspringen&lt;br /&gt;
    ori     temp2,1             ; nein, Bit setzen&lt;br /&gt;
&lt;br /&gt;
    cbi     SCHIEBE_PORT, CLK   ; Taktausgang auf 0&lt;br /&gt;
    sbi     SCHIEBE_PORT, CLK   ; und wieder zurück auf 1, dabei Daten schieben &lt;br /&gt;
&lt;br /&gt;
    dec     temp3               ; Bitzähler um eins verringern&lt;br /&gt;
    brne    schiebe_eingang_bit_schleife ;wenn noch keine 8 Bits ausgegeben, nochmal&lt;br /&gt;
&lt;br /&gt;
    st      z+,temp2            ; Datenbyte speichern&lt;br /&gt;
    dec     temp1               ; Anzahl Bytes um eins verringern&lt;br /&gt;
    brne    schiebe_eingang_byte_schleife   ; wenn noch mehr Bytes zu lesen sind&lt;br /&gt;
&lt;br /&gt;
    pop     temp3&lt;br /&gt;
    pop     temp2&lt;br /&gt;
    ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ansteuerung per SPI-Modul ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
; Porterweiterung für Eingänge mit Schieberegister 74xx165&lt;br /&gt;
; Ansteuerung per SPI-Modul&lt;br /&gt;
&lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
.def temp1 = r16&lt;br /&gt;
.def temp2 = r17&lt;br /&gt;
.def temp3 = r18&lt;br /&gt;
&lt;br /&gt;
; Pins anpassen&lt;br /&gt;
; diese müssen mit den SPI-Pins des AVR Typs übereinstimmen!&lt;br /&gt;
&lt;br /&gt;
.equ SCHIEBE_DDR  = DDRB&lt;br /&gt;
.equ SCHIEBE_PORT = PORTB&lt;br /&gt;
.equ PL           = PB2         ; SS&lt;br /&gt;
.equ CLK          = PB5         ; SCK&lt;br /&gt;
.equ DIN          = PB4         ; MISO&lt;br /&gt;
&lt;br /&gt;
;-----------------------------------------------------------------------------&lt;br /&gt;
;&lt;br /&gt;
; Datensegment im RAM&lt;br /&gt;
;&lt;br /&gt;
;-----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
.dseg&lt;br /&gt;
.org 0x60&lt;br /&gt;
Daten:      .byte 2             ; Speicherplatz für Eingangsdaten&lt;br /&gt;
&lt;br /&gt;
;-----------------------------------------------------------------------------&lt;br /&gt;
;&lt;br /&gt;
; Programmsegment im FLASH&lt;br /&gt;
;&lt;br /&gt;
;-----------------------------------------------------------------------------&lt;br /&gt;
.cseg&lt;br /&gt;
    ldi     temp1, LOW(RAMEND)  ; Stackpointer initialisieren&lt;br /&gt;
    out     SPL, temp1&lt;br /&gt;
    ldi     temp1, HIGH(RAMEND)&lt;br /&gt;
    out     SPH, temp1&lt;br /&gt;
&lt;br /&gt;
; CLK und PL als Ausgänge schalten&lt;br /&gt;
&lt;br /&gt;
    ldi     temp1,(1&amp;lt;&amp;lt;CLK) | (1&amp;lt;&amp;lt;PL)&lt;br /&gt;
    out     SCHIEBE_DDR,temp1     &lt;br /&gt;
;&lt;br /&gt;
; SPI Modul konfigurieren&lt;br /&gt;
;&lt;br /&gt;
    ldi     temp1, (1&amp;lt;&amp;lt;SPE) | (1&amp;lt;&amp;lt;MSTR) | (1&amp;lt;&amp;lt;CPOL)&lt;br /&gt;
    out     SPCR, temp1         ; keine Interrupts, MSB first, Master&lt;br /&gt;
                                ; CPOL = 1, CPHA =0&lt;br /&gt;
                                ; SCK Takt = 1/2 XTAL&lt;br /&gt;
    ldi     temp1, (1&amp;lt;&amp;lt;SPI2X)&lt;br /&gt;
    out     SPSR,temp1          ; double speed aktivieren&lt;br /&gt;
    out     SPDR,temp1          ; Dummy Daten, um SPIF zu setzen&lt;br /&gt;
&lt;br /&gt;
; Zwei Bytes einlesen&lt;br /&gt;
&lt;br /&gt;
    ldi     ZL,low(Daten)&lt;br /&gt;
    ldi     ZH,high(Daten)&lt;br /&gt;
    ldi     temp1,2&lt;br /&gt;
    rcall   schiebe_eingang&lt;br /&gt;
&lt;br /&gt;
loop:&lt;br /&gt;
    rjmp    loop&lt;br /&gt;
&lt;br /&gt;
;-----------------------------------------------------------------------------&lt;br /&gt;
;&lt;br /&gt;
; N Bytes seriell einlesen&lt;br /&gt;
;&lt;br /&gt;
; temp1 : N, Anzahl der Bytes&lt;br /&gt;
; Z     : Zeiger auf einen Datenbereich im SRAM&lt;br /&gt;
;-----------------------------------------------------------------------------&lt;br /&gt;
schiebe_eingang:&lt;br /&gt;
    push    temp2               ; Register sichern&lt;br /&gt;
&lt;br /&gt;
    ; CLK ist im Ruhezustand schon auf HIGH, CPOL=1&lt;br /&gt;
&lt;br /&gt;
dummyende:&lt;br /&gt;
    sbis    SPSR,7              ; prüfe ob Dummy Übertragung beendet ist, sonst&lt;br /&gt;
    rjmp    dummyende           ; kann es bei langsameren Übertragungsraten zu&lt;br /&gt;
	                        ; Überschneidungen kommen.&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
    cbi     schiebe_port, pl    ; Daten parallel laden&lt;br /&gt;
    sbi     schiebe_port, pl&lt;br /&gt;
&lt;br /&gt;
schiebe_eingang_1:&lt;br /&gt;
    sbis    SPSR,7              ; prüfe ob eine alte Übertragung beendet ist&lt;br /&gt;
    rjmp    schiebe_eingang_1&lt;br /&gt;
&lt;br /&gt;
schiebe_eingang_byte_schleife:&lt;br /&gt;
    out     SPDR,temp1          ; beliebige Daten ins SPI Modul schreiben&lt;br /&gt;
                                ; um die Übertragung zu starten&lt;br /&gt;
schiebe_eingang_2:&lt;br /&gt;
    sbis    SPSR,7              ; auf das Ende der Übertragung warten&lt;br /&gt;
    rjmp    schiebe_eingang_2&lt;br /&gt;
&lt;br /&gt;
    in      temp2, spdr         ; Daten lesen&lt;br /&gt;
    st      z+,temp2            ; Datenbyte speichern&lt;br /&gt;
    dec     temp1               ; Anzahl Bytes um eins verringern&lt;br /&gt;
    brne    schiebe_eingang_byte_schleife   ; wenn noch mehr Bytes zu lesen sind&lt;br /&gt;
&lt;br /&gt;
    pop     temp2&lt;br /&gt;
    ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beides in &#039;&#039;einer&#039;&#039; Kette ==&lt;br /&gt;
&lt;br /&gt;
Kann man die &#039;595 und die &#039;165 an &#039;&#039;einem&#039;&#039; SPI-Anschluss betreiben?&lt;br /&gt;
&lt;br /&gt;
Ja, einfach verketten. Das geht auch „durcheinander“. Dafür gibt es zwei Möglichkeiten:&lt;br /&gt;
&lt;br /&gt;
* Man verwendet &#039;&#039;getrennte&#039;&#039; Anschlüsse am Mikrocontroller für die Parallelübernahme der &#039;595 (Ausgänge) und &#039;165 (Eingänge). Dann sollten die Ausgänge am Ketten-Anfang (MOSI) und die Eingänge am Ketten-Ende (MISO) liegen. Beispielsweise werden für 3 Stück &#039;595 und 2 Stück &#039;165 24 Schiebetakte zum Ausgeben (mit anschließendem ↑RCLK) und 16 Schiebetakte (mit vorausgehendem ¬PL) zum Einlesen benötigt.&lt;br /&gt;
&lt;br /&gt;
* Man verwendet einen &#039;&#039;gemeinsamen&#039;&#039; Anschluss &#039;&#039;&#039;¬L&#039;&#039;&#039; für ↑RCLK und ¬PL, ein Pin sparend. Die o.g. Reihenfolge der &#039;595 und &#039;165 ist weiterhin vorteilhaft. Nach dem o.g. Beispiel gilt folgendes Regime zum Ausgeben und Einlesen in einem Rutsch:&lt;br /&gt;
** Low-Nadel an ¬L (zum Laden der &#039;165-Flipflops; die &#039;595-Ausgänge verändern sich nicht)&lt;br /&gt;
** 8 x 3 = 24 Schiebetakte (auch zum Nur-Einlesen müssen die Ausgabedaten wiederholt ausgegeben werden)&lt;br /&gt;
** Low-Nadel an ¬L (zum Aktualisieren der &#039;595-Ausgänge; das erneute Einlesen in den &#039;165 ist ohne Belang)&lt;br /&gt;
&lt;br /&gt;
Kann man per Software messen, wie lang die Kette ist?&lt;br /&gt;
&lt;br /&gt;
Für bestimmte PnP-artige Lösungen ist es zweckmäßig, die Länge der Kette zu kennen:&lt;br /&gt;
Man schiebt einfach eine einzelne 1 (oder eine einzelne 0) durch die Kette, ohne Parallelübernahmen. Vorher muss man die Kette in ihrer zu erwartenden Maximallänge initialisieren. Benutzt man byteweise arbeitende Hardware-SPI, wird man auf ganze Byte-Längen vertrauen und kann für mehr Sicherheit ein bestimmtes Kennbyte durchschicken.&lt;br /&gt;
&lt;br /&gt;
Kann man per Software messen, &#039;&#039;wo&#039;&#039; die &#039;595 und die &#039;165 liegen?&lt;br /&gt;
&lt;br /&gt;
Nur wenn man davon ausgeht, dass sich die Eingänge nicht allzu schnell ändern. Das ist bei Tastern klar der Fall. Eine 100-prozentige Sicherheit gibt es nicht. Man schiebt ein bestimmtes Bitmuster (Byte) durch und nimmt &#039;595 dort an, wo das Bitmuster auch zurückkommt. Man verwende mindestens 2 verschiedene Bitmuster, um eine derartige Eingangskombination auszuschließen. Wer ziemlich sicher gehen will, schiebt in einer Schleife alle 256 verschiedenen Kombinationen durch. Wenn (bei gemeinsamen ¬L) die Ausgänge unzulässig zappeln, muss man ¬OE beschalten, oder genau jene Bitkombinationen vermeiden.&lt;br /&gt;
&lt;br /&gt;
Kann man andere SPI-Hardware in die Kette einfügen?&lt;br /&gt;
&lt;br /&gt;
Genau dafür ist SPI gemacht! Aber nicht jeder (bspw.) A/D-Wandler ist dafür geeignet: Es muss möglich sein, Daten &#039;&#039;unverändert&#039;&#039; durchzuschieben. Oder wenigstens herumzuleiten. Wenn nicht, ist die einzig mögliche Anordnung &#039;&#039;zwischen&#039;&#039; den &#039;595 (am Kettenanfang) und den &#039;165 (am Kettenende). In der Regel wird eine gesonderte Chipselect-Leitung vom Mikrocontroller benötigt; nur in Ausnahmefällen ist o.g. &#039;&#039;&#039;¬L&#039;&#039;&#039; dafür geeignet (Datenblatt studieren!). Das Chipselect aus einem &#039;595 zu generieren geht auch.&lt;br /&gt;
&lt;br /&gt;
Was für Vorteile bringen &#039;595 und &#039;165 gegenüber einem größeren Mikrocontroller?&lt;br /&gt;
&lt;br /&gt;
* Preis! Controller mit mehr Beinchen kosten oftmals deutlich mehr&lt;br /&gt;
* Günstigeres Routing zu weiter entfernten Schaltungsteilen&lt;br /&gt;
* Kleinere Steckverbinder zu weiteren Platinen, etwa Anzeige- und Bedien-Frontplatten&lt;br /&gt;
* Beliebige Verlängerbarkeit&lt;br /&gt;
* ESD-Schutz und Überlastschutz des Controllers&lt;br /&gt;
* Verbleib beim „gewohnten“ Mikrocontroller möglich&lt;br /&gt;
&lt;br /&gt;
Und welche Nachteile handelt man sich ein?&lt;br /&gt;
&lt;br /&gt;
* Fehlende Sonderfunktionen (etwa Hardware-PWM, Interrupts)&lt;br /&gt;
* Fehlende Bidirektionalität&lt;br /&gt;
* Geringere Geschwindigkeit sowie zusätzliche Verzögerung beim Startup&lt;br /&gt;
* Fehlende Weak-Pullups (bei den Eingängen, es sei denn, man verwendet veraltete 74LS165)&lt;br /&gt;
* Höherer Bestückungsaufwand durch das Mehr an Bauteilen&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
AVR Studio 4.12 (Build 498) hat Probleme bei der korrekten Simulation des SPI-Moduls.&lt;br /&gt;
&lt;br /&gt;
* Der Double-Speed Modus funktioniert nicht.&lt;br /&gt;
&lt;br /&gt;
* Das Bit SPIF im Register SPSR, welches laut Dokumentation nur lesbar ist, ist im Simulator auch schreibbar! Das kann zu Verwirrung und Fehlern in der Simulation führen.&lt;br /&gt;
&lt;br /&gt;
Hardwareprobleme&lt;br /&gt;
&lt;br /&gt;
* Wenn das SPI-Modul aktiviert wird, wird &#039;&#039;&#039;NICHT&#039;&#039;&#039; automatisch SPIF gesetzt, es bleibt auf Null. Damit würde die erste Abfrage in &#039;&#039;Schiebe_alles&#039;&#039; in einer Endlosschleife hängen bleiben. Deshalb muss nach der Initialisierung des SPI-Moduls ein Dummy-Byte gesendet werden, damit am Ende der Übertragung SPIF gesetzt wird&lt;br /&gt;
&lt;br /&gt;
* Da das SPI-Modul in Senderichtung nur einfach gepuffert ist, ist es nicht möglich absolut lückenlos Daten zu senden, auch wenn man mit &#039;&#039;&#039;nop&#039;&#039;&#039; eine feste minimale Zeit zwischen zwei Bytes warten würde. Zwischen zwei Bytes muss immer eine Pause von mind. 2 Systemtakten eingehalten werden.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.atmel.com/dyn/resources/prod_documents/doc2585.pdf AVR151: Setup And Use of The SPI] Atmel Application Note (PDF)&lt;br /&gt;
* [http://www.datasheetcatalog.com/datasheets_pdf/7/4/H/C/74HC595.shtml datasheetcatalog.com: 74HC595]&lt;br /&gt;
* [http://www.rn-wissen.de/index.php/Portexpander_am_AVR Roboternetz: Portexpander am AVR]&lt;br /&gt;
* [http://conductiveresistance.com/interactive-595-shift-register-simulator/ Interactive 595 Shift Register Simulator]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/215399#2145277 48 I/O Porterweiterung mit Schieberegister 74HC595 und 74HC165]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{{Navigation_zurückhochvor|&lt;br /&gt;
zurücktext=PWM|&lt;br /&gt;
zurücklink=AVR-Tutorial: PWM|&lt;br /&gt;
hochtext=Inhaltsverzeichnis|&lt;br /&gt;
hochlink=AVR-Tutorial|&lt;br /&gt;
vortext=SRAM|&lt;br /&gt;
vorlink=AVR-Tutorial: SRAM}}&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Tutorial|Schieberegister]]&lt;br /&gt;
[[Category:SPI]]&lt;br /&gt;
[[Category:Portexpander]]&lt;/div&gt;</summary>
		<author><name>Max5v</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Standardbauelemente&amp;diff=84413</id>
		<title>Standardbauelemente</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Standardbauelemente&amp;diff=84413"/>
		<updated>2014-08-10T13:49:27Z</updated>

		<summary type="html">&lt;p&gt;Max5v: Link zu LED wider hergestellt.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Gerade Neulinge kennen das Problem: Man hat eine tolle Schaltung mit vielen Operationsverstärkern, Spannungsreglern, Logikbausteinen, ADCs, was auch immer entwickelt und jetzt geht&#039;s an die Realisierung.&lt;br /&gt;
&lt;br /&gt;
Aber welche Bausteine nehmen in dem Wust der Angebote? Also erstmal auf die Seiten der Hersteller und die Produktpalette durchforsten. Nach einigen Stunden gewissenhafter Recherche hat man dann endlich alle Bauteile beisammen und will bestellen. Und dann kommt das böse Erwachen: Einige Bauelemente gibt&#039;s nur bei Reichelt, andere nur bei Conrad. Farnell hat zwar das meiste, aber da kann man als Privatperson leider nicht bestellen. Manche ICs bekommt man nur in 1000er Stückzahlen oder sind halt einfach nur viel zu teuer.&lt;br /&gt;
&lt;br /&gt;
Nach einigen Jahren praktischer Erfahrung hat man dann seine &amp;quot;Standardbauelemente&amp;quot;, die man immer wieder verwendet. Dieser Artikel soll helfen andere von dieser Erfahrung profitieren zu lassen. Ähnliche Anregungen findet man auch in der de.sci.electronics-FAQ: Grundausstattung des Bastlers [[http://dse-faq.elektronik-kompendium.de/dse-faq.htm#F.2]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
Hier soll eine Liste von häufig anzutreffenden, preiswerten und verfügbaren Standardbauelementen entstehen. Diese Liste soll knapp und bündig sein, für technische Daten wird auf die Datenblätter verwiesen. Hier gilt: &amp;quot;weniger ist mehr&amp;quot;, exotische Bauelemente sind also unerwünscht. Für hier gelistete Typen sollte gelten:&lt;br /&gt;
* für Privatpersonen verfügbar&lt;br /&gt;
* preiswert (nicht billig)&lt;br /&gt;
&lt;br /&gt;
Nicht gelistet werden sollen:&lt;br /&gt;
* hunderte Typen, die alle den gleichen Zweck erfüllen, aber keinen Mehrwert bringen. Stattdessen auf die bekanntesten / preiswertesten beschränken.&lt;br /&gt;
* Details. Stattdessen die Felder &amp;quot;Besonderheiten&amp;quot; und &amp;quot;Anwendungen&amp;quot; benutzen, z.&amp;amp;nbsp;B. &amp;quot;I²C, 12bit&amp;quot; bei Besonderheiten für einen ADC oder &amp;quot;Präzision, Audio&amp;quot; bei Anwendungen für einen OpAmp.&lt;br /&gt;
&lt;br /&gt;
Wer eine Sparte, oder eine Anwendung vermisst, aber selber nichts dazu beitragen kann: Einfach hinzufügen. Wer z.&amp;amp;nbsp;B. einen HF OpAmp sucht und hier nicht fündig wird sollte also eine neue Zeile einfügen und in die Spalte Anwendungen &amp;quot;HF&amp;quot; eintragen. Vielleicht kann ja jemand den Rest der Zeile füllen.&lt;br /&gt;
&lt;br /&gt;
Immer den Grundtypen listen und nicht eine der Varianten, und schon gar nicht alle Varianten einzeln! Also z.&amp;amp;nbsp;B. &amp;quot;LM324&amp;quot; statt &amp;quot;LM324N&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Wenn möglich Direktlinks auf Datenblätter vermeiden und eine Suchmaschine befragen: &amp;quot;http://www.datasheetarchive.com/search.php?q=lm324&amp;quot;&lt;br /&gt;
* so werden alle Varianten gefunden&lt;br /&gt;
* und tote Links vermieden&lt;br /&gt;
&lt;br /&gt;
Die wichtigsten, allgemeinen Standard-Typen ganz oben in der Tabelle listen, danach erst die Spezialtypen für bestimmte Anwendungen.&lt;br /&gt;
&lt;br /&gt;
Und weil es mir so wichtig ist nochmal: Ich rufe geradezu dazu auf, überflüssige, unverfügbare Typen zu löschen!&lt;br /&gt;
&lt;br /&gt;
= Aktive Bauelemente =&lt;br /&gt;
== Analog ==&lt;br /&gt;
&lt;br /&gt;
=== Transistoren ===&lt;br /&gt;
&#039;&#039;Siehe auch:&#039;&#039; &#039;&#039;&#039;[[Transistor-Übersicht#NPN|Transistor-Übersicht]]&#039;&#039;&#039;&lt;br /&gt;
====NPN====&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;transistors-npn&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BC337 BC337]&lt;br /&gt;
| 0,04&lt;br /&gt;
| Standardtyp (SMD: [http://www.mikrocontroller.net/part/BC817 BC817])&lt;br /&gt;
| bis ~300mA sinnvoll&lt;br /&gt;
| R,D,P,[https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.google.de/search?num=100&amp;amp;hl=de&amp;amp;q=datasheet+bc337+filetype%3Apdf&amp;amp;btnG=Suche&amp;amp;meta=lr%3Dlang_de%7Clang_en PDF]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MMBT2222A MMBT2222A]&lt;br /&gt;
| 0,05&lt;br /&gt;
| SMD TO-23 Gehäuse, Ptot bis 350mW&lt;br /&gt;
| bis ~ 300mA sinnvoll &lt;br /&gt;
| R,D&lt;br /&gt;
| [http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=1;INDEX=0;FILENAME=A100%252F2N2222ASMD%2523FAI.pdf;SID=29Jo9LE6wQAR0AADnPx904c70c3257c398b8b92e44b2052e44b2f PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BC547 BC547]&lt;br /&gt;
| 0,03&lt;br /&gt;
| Standardtyp, [http://www.mikrocontroller.net/part/BC847 in SMD BC847]&lt;br /&gt;
| bis ~50mA sinnvoll&lt;br /&gt;
| R,D,[https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.semiconductors.philips.com/acrobat_download/datasheets/BC847_BC547_SER_6.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BC635 BC635]/[http://www.mikrocontroller.net/part/BC639 BC639]&lt;br /&gt;
| 0,07&lt;br /&gt;
| andere Pinbelegung als BC547 (= BD135 in anderem Gehäuse)&lt;br /&gt;
| bis ~500mA sinnvoll&lt;br /&gt;
| R,D&lt;br /&gt;
| [http://www.semiconductors.philips.com/acrobat/datasheets/BC635_BCP54_BCX54_6.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BD433 BD433]/[http://www.mikrocontroller.net/part/BD437 BD437]&lt;br /&gt;
| 0,19&lt;br /&gt;
| niedrige Sättigungsspannung&lt;br /&gt;
| bis ~2A sinnvoll&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.fairchildsemi.com/ds/BD%2FBD435.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TIP41C TIP41C]&lt;br /&gt;
| 0,24&lt;br /&gt;
| Ptot: 65W, geringe Stromverstärkung (max.75)&lt;br /&gt;
| Grenzwert 10A&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.datasheetcatalog.org/datasheet/fairchild/TIP41C.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TIP102 TIP102]&lt;br /&gt;
| 0,42&lt;br /&gt;
| Ptot bis 80W mit Kühlkörper, hohe Stromverstärkung von über 1000 über einen sehr großen Bereich (Darlington).&lt;br /&gt;
| Grenzwert 8A&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.fairchildsemi.com/ds/TI%2FTIP102.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TIP3055 TIP3055]&lt;br /&gt;
| 0,75&lt;br /&gt;
| Ptot bis 90W mit Kühlkörper, Stromverstärkung sehr niedrig (bei großen Strömen &amp;lt;&amp;lt; 100)&lt;br /&gt;
| Grenzwert 15A &lt;br /&gt;
| R&lt;br /&gt;
| [http://www.ortodoxism.ro/datasheets/PowerInnovations/mXvutwr.pdf PDF]&lt;br /&gt;
|-====&lt;br /&gt;
| [http://www.mikrocontroller.net/part/2N6284 2N6284]&lt;br /&gt;
| 4,50&lt;br /&gt;
| Lin. NPN-PowerDarlington, Ptot bis 160W, Stromverstärkung ~ 750&lt;br /&gt;
| 100V Ic 20A &lt;br /&gt;
| R&lt;br /&gt;
| [http://www.ortodoxism.ro/datasheets/SGSThomsonMicroelectronics/mXvsruq.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====PNP====&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;transistors-pnp&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BC327 BC327]&lt;br /&gt;
| 0,04&lt;br /&gt;
| Komplementärtyp zu [http://www.mikrocontroller.net/part/BC337 BC337]&lt;br /&gt;
| bis ~300mA sinnvoll&lt;br /&gt;
| R,D,[https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.google.de/search?num=100&amp;amp;hl=de&amp;amp;q=datasheet+bc327+filetype%3Apdf&amp;amp;btnG=Suche&amp;amp;meta=lr%3Dlang_de%7Clang_en PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BC557 BC557]&lt;br /&gt;
| 0,03&lt;br /&gt;
| Komplementärtyp zu [http://www.mikrocontroller.net/part/BC547 BC547]&lt;br /&gt;
| bis ~50mA sinnvoll&lt;br /&gt;
| R,D,[https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.semiconductors.philips.com/acrobat_download/datasheets/BC556_557_4.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BC636 BC636]/[http://www.mikrocontroller.net/part/BC640 BC640]&lt;br /&gt;
| 0,07&lt;br /&gt;
| Komplementärtyp zu [http://www.mikrocontroller.net/part/BC635 BC635]&lt;br /&gt;
| bis ~500mA sinnvoll&lt;br /&gt;
| R,D&lt;br /&gt;
| [http://www.semiconductors.philips.com/acrobat/datasheets/BC640_BCP53_BCX53_6.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TIP2955 TIP2955]&lt;br /&gt;
| 0,75&lt;br /&gt;
| Ptot bis 90W mit Kühlkörper&lt;br /&gt;
| Grenzwert 15A&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.ortodoxism.ro/datasheets/motorola/TIP2955.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====N-MOSFET====&lt;br /&gt;
&#039;&#039;Siehe auch:&#039;&#039; &#039;&#039;&#039;[[MOSFET-Übersicht#N-Kanal_MOSFET|MOSFET-Übersicht]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
BUZ10, BUZ11 etc. sind wie alle BUZ Typen ziemlich veraltet. Bitte nicht listen; es gibt fast immer was besseres von IRF.&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;mosfet-n&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF1010N IRF1010N]&lt;br /&gt;
| 0,78&lt;br /&gt;
| max 50V, max 85A, 11 mOhm On-Widerstand&lt;br /&gt;
| Alles, was mit POWER zu tun hat ...&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.irf.com/product-info/datasheets/data/irf1010n.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF1404 IRF1404]&lt;br /&gt;
| 0,96&lt;br /&gt;
| max 40V, max 162A, 4 mOhm, 200W&lt;br /&gt;
| sehr geringer Rds, TO-220&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.irf.com/product-info/datasheets/data/irf1404.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRLZ34N IRLZ34N]&lt;br /&gt;
| 0,43&lt;br /&gt;
| max 55V, max 30A, 35 mOhm On-Widerstand&lt;br /&gt;
| Gatespannung kompatibel mit 5V-Controllern.&lt;br /&gt;
| R, D, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.irf.com/product-info/datasheets/data/irlz34n.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRLML2502 IRLML2502]&lt;br /&gt;
| 0,17&lt;br /&gt;
| max 20V, max 4,2A (cont.), 45 mOhm On-Widerstand&lt;br /&gt;
| SOT23 SMD-FET, extrem niedrige V_GS_th, bei niedrigem R_DS_on&lt;br /&gt;
| R, D&lt;br /&gt;
| [http://www.irf.com/product-info/datasheets/data/irlml2502.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BS170 BS170]&lt;br /&gt;
| 0,10&lt;br /&gt;
| max 60V, bis 500mA, 5Ω On-Widerstand&lt;br /&gt;
| veraltete Technik, aber in bastelfreundlichem TO-92 Gehäuse&lt;br /&gt;
| R,D&lt;br /&gt;
| [http://www.fairchildsemi.com/ds/BS/BS170.pdf PDF] (Fairchild)&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BSS123 BSS123]&lt;br /&gt;
| 0,05&lt;br /&gt;
| max 100V, max 170mA (cont.), Thresholdspannung 1,7V, On-Widerstand 1,3Ω&lt;br /&gt;
| SOT23 SMD-FET, auch für 3V3-versorgte Schaltungen bestens geeignet&lt;br /&gt;
| R,D&lt;br /&gt;
| [http://www.fairchildsemi.com/ds/BS/BSS123.pdf PDF] (Fairchild)&lt;br /&gt;
|-&lt;br /&gt;
| BUK100-50GL &lt;br /&gt;
| 1,15&lt;br /&gt;
| Logic-Level Power&lt;br /&gt;
| &lt;br /&gt;
| R&lt;br /&gt;
| [http://www.nxp.com/pip/BUK100-50GL_1.html PDF] (NXP)&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRLIZ44N IRLIZ44N]&lt;br /&gt;
| 1,45&lt;br /&gt;
| Logic-Level Power 30A 55V 22mohm&lt;br /&gt;
| TO-220&lt;br /&gt;
| R, [https://www.IT-WNS.de/ I]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRLR2905 IRLR2905]/[http://www.mikrocontroller.net/part/IRLU2905 IRLU2905]&lt;br /&gt;
| 0,60&lt;br /&gt;
| Logic-Level Power 36A 55V RDS=27 mOhm&lt;br /&gt;
| D-Pak &lt;br /&gt;
| C, P&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRLU3410 IRLU3410]&lt;br /&gt;
| 0,71&lt;br /&gt;
| Logic-Level Power, 100V, 17A, 105mOhm RDS(on), I-PAK&lt;br /&gt;
| &lt;br /&gt;
| R&lt;br /&gt;
| [http://www.datasheetarchive.com/pdf-datasheets/Datasheets-303/37622.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF7301 IRF7301]&lt;br /&gt;
| 0,91&lt;br /&gt;
| Dual N-MOSFET mit nur 70mOhm RDS(on) bei 2.7 V, SO-8&lt;br /&gt;
| Laststromschaltung bei kleinen Spannungen, z.&amp;amp;nbsp;B. an Akkus&lt;br /&gt;
| C, R&lt;br /&gt;
| [http://www.irf.com/product-info/datasheets/data/irf7301.pdf PDF] &lt;br /&gt;
|-&lt;br /&gt;
| PMV30UN,&lt;br /&gt;
| 0.35&lt;br /&gt;
| max 20V, 5.7A (5s), &amp;lt;36mOhm(@4.5V), &amp;lt;63mOhm(@1.8V) On-Widerstand, Ultra-Low-Level: 1.8V.&lt;br /&gt;
| SOT-23 SMD, Treiber f&amp;amp;uuml;r Microcontroller-Ausg&amp;amp;auml;nge, Motortreiber, Verpolschutz.&lt;br /&gt;
| D&lt;br /&gt;
| (NXP)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====P-MOSFET====&lt;br /&gt;
&#039;&#039;Siehe auch:&#039;&#039; &#039;&#039;&#039;[[MOSFET-Übersicht#P-Kanal_MOSFET|MOSFET-Übersicht]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;mosfet-p&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRLML6401 IRLML6401]&lt;br /&gt;
| 0,18&lt;br /&gt;
| max -12V, ca -4,3A (cont.), ca. 0,05Ω On-Widerstand&lt;br /&gt;
| SOT-23 SMD FET, extrem niedrige V_GS_th, bei niedrigem R_DS_on&lt;br /&gt;
| R, D&lt;br /&gt;
| [http://www.irf.com/product-info/datasheets/data/irlml6401.pdf]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF7220 IRF7220]&lt;br /&gt;
| 0,50&lt;br /&gt;
| max -14V, ca -10A (cont.), ca. 0,02Ω On-Widerstand&lt;br /&gt;
| Gehäuse SO-8, brauchbar in 3,3V Systemen&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.irf.com/product-info/datasheets/data/irf7220.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRFR5305 IRFR5305]&lt;br /&gt;
| 0,56&lt;br /&gt;
| max -55V, -31A (cont.), ca. 0,065Ω On-Widerstand&lt;br /&gt;
| Gehäuse D-Pak (SMD, TO-252AA), Uth=-2 bis -4V&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.irf.com/product-info/datasheets/data/irfr5305.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BS250 BS250]&lt;br /&gt;
| 0,26&lt;br /&gt;
| max -45V, bis -230mA (cont.), 14 (und mehr) Ohm On-Widerstand&lt;br /&gt;
| veraltete Technik aber in bastelfreundlichem TO-92 Gehäuse von R lieferbar &lt;br /&gt;
| R&lt;br /&gt;
| [http://www.vishay.com/docs/70209/70209.pdf PDF] (Vishay)&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/NDS0610 NDS0610]&lt;br /&gt;
| 0,07&lt;br /&gt;
| max -60V, bis -120mA (cont.), 20 (und mehr) Ohm On-Widerstand&lt;br /&gt;
| SOT-23 SMD Gehäuse Anwendung z.&amp;amp;nbsp;B. als [http://www.mikrocontroller.net/topic/42113#317220 Verpolschutz mit geringem Spannungsabfall]&lt;br /&gt;
| R, D DK&lt;br /&gt;
| [http://www.fairchildsemi.com/ds/ND%2FNDS0610.pdf PDF] (Fairchild)&lt;br /&gt;
|-&lt;br /&gt;
| PMV33UPE,&lt;br /&gt;
| 0.52&lt;br /&gt;
| max -20V, 5.3A (5s), &amp;lt;36mOhm(@4.5V), &amp;lt;65mOhm(@1.8V) On-Widerstand, Ultra-Low-Level: 1.8V.&lt;br /&gt;
| SOT-23 SMD, Treiber f&amp;amp;uuml;r Microcontroller-Ausg&amp;amp;auml;nge, Motortreiber, Verpolschutz.&lt;br /&gt;
| D&lt;br /&gt;
| (NXP)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====MOSFET-Pärchen====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;mosfet-n-p&amp;quot;&lt;br /&gt;
|-  bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/IRF7389 IRF7389]&lt;br /&gt;
| 0,51&lt;br /&gt;
| 30 V, &amp;gt;2,5 A, 30/60 mOhm On-Widerstand&lt;br /&gt;
| Gehäuse SO-8&lt;br /&gt;
| D,R&lt;br /&gt;
| [http://www.irf.com/product-info/datasheets/data/irf7389.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Dioden ===&lt;br /&gt;
==== Standarddioden ====&lt;br /&gt;
&#039;&#039;Siehe auch:&#039;&#039; &#039;&#039;&#039;[[Dioden-Übersicht]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;mosfet-p&amp;quot;&lt;br /&gt;
|-  bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/1N4148 1N4148]&lt;br /&gt;
| 0,02&lt;br /&gt;
| Kleinsignal-Gleichrichterdiode&lt;br /&gt;
| 75V/150mA&lt;br /&gt;
| R,D,[https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.fairchildsemi.com/ds/1N/1N4148.pdf D]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/1N4007 1N4001]..[http://www.mikrocontroller.net/part/1N4007 1N4007]&lt;br /&gt;
| 0,02&lt;br /&gt;
| Mehrzweck-Gleichrichterdiode, 1N4001..1N4007 mit gestaffelter Sperrspannung&lt;br /&gt;
| 1A 50..1000V&lt;br /&gt;
| R,D,[https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.fairchildsemi.com/ds/1N/1N4001.pdf D]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/UF4001 UF4001]..[http://www.mikrocontroller.net/part/UF4007 UF4007]&lt;br /&gt;
| 0,06 - 0,07&lt;br /&gt;
| UltraFast-Gleichrichterdiode, gestaffelte Sperrspannung, trr&amp;lt;50ns bzw 75ns&lt;br /&gt;
| 1A&lt;br /&gt;
| R, D&lt;br /&gt;
| [http://www.ortodoxism.ro/datasheets/vishay/uf4001.pdf Datenblatt]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/1N5400 1N5400]..[http://www.mikrocontroller.net/part/1N5408 1N5408]&lt;br /&gt;
| 0,06&lt;br /&gt;
| Mehrzweck-Gleichrichterdiode, 1N5400..1N5408 mit gestaffelter Sperrspannung&lt;br /&gt;
| 3A, 50..1000V&lt;br /&gt;
| R, D&lt;br /&gt;
| [http://www.ortodoxism.ro/datasheets/fairchild/1N5401.pdf D]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/UF5404 UF5404], [http://www.mikrocontroller.net/part/UF5408 UF5408]&lt;br /&gt;
| 0,11 bzw 0,22&lt;br /&gt;
| UltraFast-Gleichrichterdiode, gestaffelte Sperrspannung, trr&amp;lt;50ns bzw 75ns&lt;br /&gt;
| 3A, 50..1000V&lt;br /&gt;
| R&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BAT46 BAT46]&lt;br /&gt;
| 0,10&lt;br /&gt;
| Kleinsignal-Schottky-Diode&lt;br /&gt;
| 150mA&lt;br /&gt;
| D,R&lt;br /&gt;
| [http://www.alldatasheet.com/view.jsp?Searchword=BAT46 D]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BAT54 BAT54(A/C/S)]&lt;br /&gt;
| 0,072&lt;br /&gt;
| sehr schnelle Kleinsignal-(Doppel-)Schottky-Diode&lt;br /&gt;
| 200mA&lt;br /&gt;
| R,D,[https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.alldatasheet.com/view.jsp?Searchword=BAT54 D]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/SB120 SB120]..[http://www.mikrocontroller.net/part/SB160 SB160]&lt;br /&gt;
| 0,13&lt;br /&gt;
| Schottky-Diode&lt;br /&gt;
| 1A 20-60V&lt;br /&gt;
| R,[https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.alldatasheet.com/view.jsp?Searchword=SB140 D]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/1N5817 1N5817]..[http://www.mikrocontroller.net/part/1N5819 1N5819]&lt;br /&gt;
| 0,15&lt;br /&gt;
| Schottky-Diode, sehr ähnlich zu SB120-140&lt;br /&gt;
| 1A 20/30/40V&lt;br /&gt;
| R, D, C, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.alldatasheet.com/view.jsp?Searchword=1N5819 D]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BA159 BA159]&lt;br /&gt;
| 0,051&lt;br /&gt;
| Standard-Diode&lt;br /&gt;
| HF 1A 1000V&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.alldatasheet.com/view.jsp?Searchword=BA159 D]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BAV99 BAV99]&lt;br /&gt;
| 0,041&lt;br /&gt;
| Standard-Doppeldiode, SOT-23&lt;br /&gt;
| ESD-Schutz&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.alldatasheet.com/view.jsp?Searchword=BAV99 D]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Z-Dioden ====&lt;br /&gt;
Nahezu jeder Lieferant von Elektronikbauteilen hat [[Diode#Z-Diode|Z-Dioden]] im Sortiment. Meist gliedert sich das Angebot in die 0,5W und 1,3W-Typen. Für den Handapparat sind fertig gefüllte Sortierkästen eine gute Wahl. Sie enthalten 10-20 Stück jeder Spannung einer Leistungsklasse. Wer weniger braucht, dem seien einige Standardanwendungsfälle angeraten:&lt;br /&gt;
* Querregler für kleinste Leistungen, typ. Spannungen 3.3V, 5,1V, 9V, 12V&lt;br /&gt;
* Spannungsbegrenzung an MOSFET-Gates 10V&lt;br /&gt;
* Bereitstellung von Referenzspannungen 2,4V-15V (bis 10V in 0,3V-Schritten, darüber 1V-Schritte)&lt;br /&gt;
* Die Spannung von Z-Dioden unterhalb von 5V ist stark vom Strom abhängig und die Nennspannung wird je nach Typ bei unterschiedlichem Strom spezifiziert, so dass bei verschiedenen 3,3V Typen recht verschiedene Spannungen auftreten können&lt;br /&gt;
&lt;br /&gt;
==== Suppressordioden ====&lt;br /&gt;
==== Leuchtdioden====&lt;br /&gt;
Die Auswahl an [[LED|Leuchtdioden]] übersteigt die 2000 Typen. Sie unterscheiden sich nicht nur in der Farbe, der Form und den Bauweisen, auch die Leuchtstärke und der dafür notwendige Strom sind Auswahlkriterien. Wie bei den Z-Dioden sind Sortimente im Fall von Unsicherheit die beste Wahl. Ansonsten sind:&lt;br /&gt;
* für Anzeigezwecke Leuchtstärken von 2-50mcd ausreichend, zumal die Abstrahlwinkel über 90° liegen. &lt;br /&gt;
* Bis 2000mcd sind bereits Schutzmaßnahmen notwendig, denn bei 30° Abstrahlwinkel ist es fürs Auge bereits gefährlich&lt;br /&gt;
* Mehr als 4000mcd sind schon sehr hell, selten sind die Abstrahlwinkel allerdings größer als 15°&lt;br /&gt;
&lt;br /&gt;
RGB-LEDs gibt es in zwei Grundkonfigurationen. Die gemeinsame Anode (common anode) erlaubt die Open-Collector-Ansteuerung der einzelnen Farben per NPN-Transistor. Für die gemeinsame Kathode (common cathode) muss man dann einen PNP-Transistor einsetzen oder spezielle Anzeigentreiber. Letztere setzen zu einem wesentlichen Teil auf gemeinsame Kathode. Die Ansteuerung mit Logik-Ausgängen hängt davon ab, wieviel Strom der Ausgang verträgt (sink, common anode) oder liefert (source, common cathode).&lt;br /&gt;
&lt;br /&gt;
Leistungs-LEDs, die 0,3A und mehr vertragen, gehören nicht zu den Standardbauteilen, erfreuen sich aber großer Beliebtheit. Da sie grundsätzlich der Kühlung bedürfen und in SMD-Bauweise gefertigt werden, ist der Kauf auf fertigen sog. Star-Platinen (deutsch: Stern) empfehlenswert. Eine solche Platine lässt sich leicht auf größere Kühlkörper schrauben und bietet sehr gut lötbare Anschlussflächen.&lt;br /&gt;
&lt;br /&gt;
Ein Handapparat aus je 10 LEDs der Farben rot, grün, gelb und weiß, 5mm Durchmesser und ca. 30mcd, zzgl. 20 Widerstände 330 Ohm (1/4W) sind für 5V und das Steckbrett völlig ausreichend. Für die Unterstützung (warm-)weißer Leistungs-LEDs (je ca. 90lm) müssen schon Typen mit &amp;gt;2000mcd (bevorzugt gelb oder orange) vorgesehen werden.&lt;br /&gt;
&lt;br /&gt;
=== Instrumentenverstärker ===&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/INA128 INA128]&lt;br /&gt;
| 6,37 (F)&lt;br /&gt;
| Verstärkung über 1 Widerstand einstellbar&lt;br /&gt;
| Brückenverstärker , Datenerfassung&lt;br /&gt;
| F&lt;br /&gt;
| [http://focus.ti.com/lit/ds/symlink/ina128.pdf#search=%22ina128%22 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/INA326 INA326]&lt;br /&gt;
| ca. 3 (DK)&lt;br /&gt;
| Low Power, läuft an 3.3 oder 5 V&lt;br /&gt;
| Medizintechnik (EKG), Sensoren&lt;br /&gt;
| DK&lt;br /&gt;
| [http://www.ti.com/lit/gpn/ina326 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/AD620 AD620]&lt;br /&gt;
| ca. 8 (R)&lt;br /&gt;
| Standardtyp&lt;br /&gt;
| EKG, EEG, Brückenverstärker&lt;br /&gt;
| R, RS, DK&lt;br /&gt;
| [http://www.analog.com/UploadedFiles/Data_Sheets/37793330023930AD620_e.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Operationsverstärker ===&lt;br /&gt;
==== Liste ====&lt;br /&gt;
Es sind die &#039;&#039;typical values&#039;&#039; bei &#039;&#039;25°C&#039;&#039; angegeben. Falls es selektierte Versionen gibt (z.&amp;amp;nbsp;B. LM358&#039;&#039;&#039;A&#039;&#039;&#039;) ist der schlechtere Wert des Standardteils angegeben.&lt;br /&gt;
&lt;br /&gt;
Bei den R2R output Werten immer die Last RL in Ohm mitangeben, ansonsten sind die Werte relativ sinnlos. Teilweise steht auch dabei für welche Versorgungsspannung dies gilt.&lt;br /&gt;
Vcc ist Versorgungs-Plus. Vee ist Versorgungs-Minus.&lt;br /&gt;
&lt;br /&gt;
Bei der Stromaufnahme (supply current) ist der Strom pro IC angegeben. Weil es besser aussieht, ist sie in den Datenblättern oft pro OPV angegeben und muss z.&amp;amp;nbsp;B. bei einem Quad noch mit vier multipliziert werden.&lt;br /&gt;
&lt;br /&gt;
Der Preis ist für Einzelstücke angegeben und entspricht meistens dem bei Reichelt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; &#039;&#039;Siehe auch:&#039;&#039; [http://www.rn-wissen.de/index.php/Operationsverst%C3%A4rker#Liste_g.C3.A4ngiger_Typen_von_Operationsverst.C3.A4rkern RN - Liste gängiger Typen von Operationsverstärkern]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;Die Tabelle lässt sich mit einem Klick auf die Überschriften &#039;&#039;&#039;sortieren&#039;&#039;&#039;.&amp;lt;/center&amp;gt;&lt;br /&gt;
{| {{Tabelle}} style=&amp;quot;font-size:80%&amp;quot; class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! OPVs&lt;br /&gt;
! Unity- Gain in&amp;amp;nbsp;MHz&lt;br /&gt;
! Slew-Rate in V/µs&lt;br /&gt;
! &amp;lt;small&amp;gt;Input Offset Spannung in mV&amp;lt;/small&amp;gt;&lt;br /&gt;
! Input Offset Strom&lt;br /&gt;
! Input Bias Strom&lt;br /&gt;
! R2R in&lt;br /&gt;
! R2R out @RL&amp;amp;nbsp;Vcc&lt;br /&gt;
! Strom- aufnahme in mA&lt;br /&gt;
! Bemerkung&lt;br /&gt;
! Daten- blatt&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM358 LM358] / [http://www.mikrocontroller.net/part/LM324 LM324]&lt;br /&gt;
| 2 / 4&lt;br /&gt;
| 1&lt;br /&gt;
| 0,5&lt;br /&gt;
| 3&lt;br /&gt;
| 5 nA&lt;br /&gt;
| 45 nA&lt;br /&gt;
| Vcc-2V Vee-0,1V&lt;br /&gt;
| Vcc-1,5V Vee+5mV @10kΩ 5V&lt;br /&gt;
| 0,8&lt;br /&gt;
| Standard-OP, Vcc=3V-30V, I&amp;lt;sub&amp;gt;sink&amp;lt;/sub&amp;gt;=15mA I&amp;lt;sub&amp;gt;source&amp;lt;/sub&amp;gt;=30mA I&amp;lt;sub&amp;gt;sink-max&amp;lt;/sub&amp;gt;=40mA&lt;br /&gt;
| [http://www.ti.com/lit/gpn/lm358 PDF(358)] / [http://www.ti.com/lit/gpn/lm324 PDF(324)]&lt;br /&gt;
| alle&lt;br /&gt;
| 0,19&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TL072 TL072]&lt;br /&gt;
| 2&lt;br /&gt;
| 3&lt;br /&gt;
| 13&lt;br /&gt;
| 3&lt;br /&gt;
| 5 pA&lt;br /&gt;
| 65 pA&lt;br /&gt;
| Vcc-0V Vee+3V&lt;br /&gt;
| Vcc-1,5V Vee+1,5V @10kΩ 30V&lt;br /&gt;
| 2,8&lt;br /&gt;
| Standard Audio, Low Noise/JFET Eingang, Quad-Version: TL074, single: TL071(mit Offsetkorr.)&lt;br /&gt;
| [http://focus.ti.com/lit/ds/symlink/tl072.pdf PDF]&lt;br /&gt;
| alle&lt;br /&gt;
| 0,17&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/NE5532 NE5532]&lt;br /&gt;
| 2&lt;br /&gt;
| 10&lt;br /&gt;
| 9&lt;br /&gt;
| 0,5&lt;br /&gt;
| 10 nA&lt;br /&gt;
| 500 nA&lt;br /&gt;
| &lt;br /&gt;
| Vcc-2V Vee+2V @600Ω 30V&lt;br /&gt;
| 8&lt;br /&gt;
| Standard Audio OP, treibt 600Ω, Iout=35mA&lt;br /&gt;
| [http://focus.ti.com/lit/ds/symlink/ne5532.pdf PDF]&lt;br /&gt;
| alle&lt;br /&gt;
| 0,23&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MAX4238 MAX4238/4239]&lt;br /&gt;
| 1&lt;br /&gt;
| MAX4238: 1.0, MAX4239: 6.5&lt;br /&gt;
| MAX4238: 0.35, MAX4239: 1.6&lt;br /&gt;
| 0,0001&lt;br /&gt;
| 2 pA&lt;br /&gt;
| 1 pA&lt;br /&gt;
| Vcc+0.3V Vee-0.3V&lt;br /&gt;
| Vcc-4mV Vee+4mV @10kΩ / Vcc-35mV Vee+35mV @1kΩ&lt;br /&gt;
| 0.6 @Vcc=5.5V&lt;br /&gt;
| very low offset (&amp;quot;zero offset&amp;quot;) 0.1µV, Rail2Rail, Vcc=2.7-5.5V, MAX4239: min. Gain x10&lt;br /&gt;
| [http://datasheets.maxim-ic.com/en/ds/MAX4238-MAX4239.pdf PDF]&lt;br /&gt;
| F, (R MAX4238)&lt;br /&gt;
| 2,55 (1,45)&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/OPA333 OPA333]&lt;br /&gt;
| 1&lt;br /&gt;
| 0.350&lt;br /&gt;
| 0.16&lt;br /&gt;
| 0.002&lt;br /&gt;
| 140 pA&lt;br /&gt;
| 70 pA&lt;br /&gt;
| Vcc+0.1V Vee-0.1V&lt;br /&gt;
| Vcc-30mV Vee+30mV @10kΩ&lt;br /&gt;
| 0.017&lt;br /&gt;
| micro power, low offset 2µV, Rail2Rail, Vcc=1.8-5.5V, SOT23-5 SO-8, Dual:OPA2333&lt;br /&gt;
| [http://focus.ti.com/general/docs/lit/getliterature.tsp?genericPartNumber=opa333&amp;amp;fileType=pdf PDF]&lt;br /&gt;
| F&lt;br /&gt;
| 3,60&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/OPA335 OPA335]&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| 1.6&lt;br /&gt;
| 0.001&lt;br /&gt;
| 120 pA&lt;br /&gt;
| 70 pA&lt;br /&gt;
| Vcc-1.5V Vee-0.1V&lt;br /&gt;
| Vcc-15mV Vee+15mV @10kΩ, Vcc-1mV Vee+1mV @100kΩ&lt;br /&gt;
| 0.285&lt;br /&gt;
| low offset 1µV, Rail2Rail, Vcc=2.7-5.5V, SOT23-5 SO-8, Dual:OPA2335&lt;br /&gt;
| [http://focus.ti.com/general/docs/lit/getliterature.tsp?genericPartNumber=opa335&amp;amp;fileType=pdf PDF]&lt;br /&gt;
| F&lt;br /&gt;
| 3,50&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TL062 TL062]&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 3&lt;br /&gt;
| 3&lt;br /&gt;
| 5 pA&lt;br /&gt;
| 30 pA&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| 0,4&lt;br /&gt;
| Low Power/JFET Eingang, veraltet&lt;br /&gt;
| [http://focus.ti.com/lit/ds/symlink/tl062.pdf PDF]&lt;br /&gt;
| alle&lt;br /&gt;
| 0,17&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TS912 TS912]&lt;br /&gt;
| 2&lt;br /&gt;
| 1 @5V&lt;br /&gt;
| 0,8 @5V&lt;br /&gt;
| 2-10&lt;br /&gt;
| 1 pA&lt;br /&gt;
| 1 pA&lt;br /&gt;
| Vcc+0,2V Vee-0,2V over the rail&lt;br /&gt;
| Vcc-0,05V Vee+0,04V @10kΩ 5V&lt;br /&gt;
| 0,4&lt;br /&gt;
| Standard Rail2Rail Typ, Vcc=2,7-16V, Iout=40mA, Quad: TS914&lt;br /&gt;
| [http://www.st.com/stonline/products/literature/ds/2325/ts912.pdf PDF]&lt;br /&gt;
| alle&lt;br /&gt;
| 0,80&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LMC6484 LMC6484]&lt;br /&gt;
| 4&lt;br /&gt;
| 1,5&lt;br /&gt;
| 0,9&lt;br /&gt;
| 3&lt;br /&gt;
| 2 pA&lt;br /&gt;
| 4 pA&lt;br /&gt;
| Vcc+0,2V Vee-0,2V over the rail&lt;br /&gt;
| Vcc-0,2V Vee+0,2V @2kΩ 5V&lt;br /&gt;
| 3&lt;br /&gt;
| Iout=16mA@5V Iout=28mA@15V&lt;br /&gt;
| [http://www.national.com/ds.cgi/LM/LMC6484.pdf PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 2,35&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/OPA2340 OPA2340]&lt;br /&gt;
| 2&lt;br /&gt;
| 5,5&lt;br /&gt;
| 6&lt;br /&gt;
| 0,150&lt;br /&gt;
| 1 pA&lt;br /&gt;
| 1 pA&lt;br /&gt;
| Vcc+0,5V Vee-0,5V over the rail&lt;br /&gt;
| Vcc-0,04V Vee+0,04V @2kΩ&lt;br /&gt;
| 1,5&lt;br /&gt;
| CMOS Vcc=2,5V - 5,5V&lt;br /&gt;
| [http://focus.ti.com/lit/ds/symlink/opa4340.pdf PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 1,65&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LF356 LF356]&lt;br /&gt;
| 1&lt;br /&gt;
| 5&lt;br /&gt;
| 12&lt;br /&gt;
| 3&lt;br /&gt;
| 3 pA&lt;br /&gt;
| 30 pA&lt;br /&gt;
| Vcc&#039;&#039;&#039;+&#039;&#039;&#039;0,1V Vee+3V &lt;br /&gt;
| Vcc-2V Vee+2V  @10kΩ 30V&lt;br /&gt;
| 5&lt;br /&gt;
| high bandwidth J-FET, Settling-Time = 1,5µs @0.01% error-voltage, Eingang knapp über Vcc, &lt;br /&gt;
| [http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=0;INDEX=0;FILENAME=A200%252FLF355_LF356_LF357%2523STM.pdf; PDF]&lt;br /&gt;
| alle&lt;br /&gt;
| 0,50&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/OP07 OP07]&lt;br /&gt;
| 1&lt;br /&gt;
| 0,6&lt;br /&gt;
| 0,3&lt;br /&gt;
| 0,030&lt;br /&gt;
| 0,4 nA&lt;br /&gt;
| 1 nA&lt;br /&gt;
| Vcc-1,5V Vee+1,5V&lt;br /&gt;
| Vcc-2,2V Vee+2,2V @2kΩ 15V&lt;br /&gt;
| 0,7 - 2,5&lt;br /&gt;
| geringer Offset &amp;lt;80µV je nach Hersteller&lt;br /&gt;
| [http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=1;INDEX=0;FILENAME=A200%252FOP07%2523AD.pdf; PDF]&lt;br /&gt;
| alle&lt;br /&gt;
| 0,25&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LMC6062 LMC6062]&lt;br /&gt;
| 2&lt;br /&gt;
| 0,1&lt;br /&gt;
| 0,015&lt;br /&gt;
| 0,1&lt;br /&gt;
| 0,01 pA max:2pA&lt;br /&gt;
| 0,01 pA max:4pA&lt;br /&gt;
| &lt;br /&gt;
| Vcc-0,05V Vee+0,05V @25kΩ 5V&lt;br /&gt;
| 0,045&lt;br /&gt;
| Precision, Micropower, CMOS, Is~40µA (typ.), Iout=8mA&lt;br /&gt;
| [http://www.national.com/ds.cgi/LM/LMC6062.pdf PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 2,05&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM4250 LM4250]&lt;br /&gt;
| 1&lt;br /&gt;
| 0,3-0,01&lt;br /&gt;
| 1-0,001&lt;br /&gt;
| 3-5&lt;br /&gt;
| 3-10 nA&lt;br /&gt;
| 8-50 nA&lt;br /&gt;
| Vcc-0,6V Vee+0,6V&lt;br /&gt;
| Vcc-0,6V Vee+0,6V @10kΩ 3V&lt;br /&gt;
| 0,008 - 0,09&lt;br /&gt;
| Micropower, &amp;quot;programmierbar&amp;quot;, Werte jeweils für Is=8µA und 90µA&lt;br /&gt;
| [http://www.national.com/ds.cgi/LM/LM4250.pdf PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 0,98&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/ICL7621 ICL7621]&lt;br /&gt;
| 2&lt;br /&gt;
| 0,5&lt;br /&gt;
| 0,15&lt;br /&gt;
| 15&lt;br /&gt;
| 30 pA&lt;br /&gt;
| 1 pA&lt;br /&gt;
| Vcc-0,3V Vee+0,3V unklar &amp;lt;!-- Das Datenblatt sagt folgendes. Bedeutet dies R2R input?    Differential Input Voltage [(V+ +0.3) - (V- -0.3)]V --&amp;gt;&lt;br /&gt;
| Vcc-0,1V Vee+0,1V @100kΩ&lt;br /&gt;
| 0,2&lt;br /&gt;
| Micropower CMOS Vcc=2V - 16V &lt;br /&gt;
| [http://datasheets.maxim-ic.com/en/ds/ICL7611-ICL764X.pdf PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 1,10&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/ICL7611 ICL7611] / [http://www.mikrocontroller.net/part/ICL7612 ICL7612]&lt;br /&gt;
| 1&lt;br /&gt;
| 0,5&lt;br /&gt;
| 0,15&lt;br /&gt;
| 15&lt;br /&gt;
| 30 pA&lt;br /&gt;
| 1 pA&lt;br /&gt;
| Vcc-0,3V Vee+0,3V unklar &amp;lt;!-- Das Datenblatt sagt folgendes. Bedeutet dies R2R input?    Differential Input Voltage [(V+ +0.3) - (V- -0.3)]V --&amp;gt;&lt;br /&gt;
| Vcc-0,1V Vee+0,1V @100kΩ&lt;br /&gt;
| 0,010 - 1 &lt;br /&gt;
| gleich mit ICL7621, aber nur 1 OPV und dafür programmierbar: Is= 10µA, 100µA, 1mA&lt;br /&gt;
| [http://datasheets.maxim-ic.com/en/ds/ICL7611-ICL764X.pdf PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 0,82&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM13700 LM13700]&lt;br /&gt;
| 2&lt;br /&gt;
| 2&lt;br /&gt;
| 50&lt;br /&gt;
| 0,5&lt;br /&gt;
| 0,1 µA&lt;br /&gt;
| 0,4 µA&lt;br /&gt;
| &lt;br /&gt;
| Vcc-0,8V Vee+0,6V&lt;br /&gt;
| 2,6&lt;br /&gt;
| OTA - Steilheits-OP 50V/µs&lt;br /&gt;
| [http://www.national.com/ds.cgi/LM/LM13700.pdf PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 0,90&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [http://www.mikrocontroller.net/part/µA733 µA733]&lt;br /&gt;
| 1&lt;br /&gt;
| 1200*&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| 6 µA&lt;br /&gt;
| 40 µA&lt;br /&gt;
| &lt;br /&gt;
| Vcc-3,5V Vee+3,5V @2kΩ&lt;br /&gt;
| 25&lt;br /&gt;
| Video OP,  Vcc=12V, I&amp;lt;sub&amp;gt;sink&amp;lt;/sub&amp;gt;=2mA; Gains of 10, 100, 400; R&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt;=8kΩ; V&amp;lt;sub&amp;gt;Output offset&amp;lt;/sub&amp;gt;=0,6V; &lt;br /&gt;
| [http://www.national.com/ds.cgi/LM/µA733 PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 0,50&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/NE592 NE592]&lt;br /&gt;
| 1&lt;br /&gt;
| 1200*&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| 1 µA&lt;br /&gt;
| 9 µA&lt;br /&gt;
| &lt;br /&gt;
| Vcc-4V Vee+4V @2kΩ&lt;br /&gt;
| 20&lt;br /&gt;
| Video OP,  Vcc=12V, I&amp;lt;sub&amp;gt;sink&amp;lt;/sub&amp;gt;=15mA; R&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt;=4-30kΩ; V&amp;lt;sub&amp;gt;Output offset&amp;lt;/sub&amp;gt;=1,5V; &lt;br /&gt;
| [http://www.national.com/ds.cgi/LM/NE592 PDF]&lt;br /&gt;
| R, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| 0,40&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LT1363 LT1363]&lt;br /&gt;
| 1&lt;br /&gt;
| 70&lt;br /&gt;
| 1000&lt;br /&gt;
| 1,5&lt;br /&gt;
| 120 nA&lt;br /&gt;
| 0,6 µA&lt;br /&gt;
| Vcc-1,6V Vee+1,8V&lt;br /&gt;
| Vcc-0,9V Vee+0,9V @500Ω 10V&lt;br /&gt;
| 7&lt;br /&gt;
| Steilheits OP,  Vcc=5-15V, I&amp;lt;sub&amp;gt;sink/source&amp;lt;/sub&amp;gt;=30-60mA; R&amp;lt;sub&amp;gt;in&amp;lt;/sub&amp;gt;=5MΩ*;&lt;br /&gt;
| [http://www.national.com/ds.cgi/LM/LT1363 PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 3,80&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/CA3140 CA3140]&lt;br /&gt;
| 1&lt;br /&gt;
| 4,5&lt;br /&gt;
| 9&lt;br /&gt;
| 5&lt;br /&gt;
| 0,5 pA&lt;br /&gt;
| 10 pA&lt;br /&gt;
| Vee-0,5V&lt;br /&gt;
| Vcc-2V Vee+0,6V  @2kΩ 15V&lt;br /&gt;
| 4&lt;br /&gt;
| BIMOS-OP - kleiner Eingangsstrom, ideal für Single-Supply, Vcc-min=4V&lt;br /&gt;
| [http://www.intersil.com/data/fn/fn957.pdf PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 0,47&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TCA0372 TCA0372]&lt;br /&gt;
| 2&lt;br /&gt;
| 1,1&lt;br /&gt;
| 1,3&lt;br /&gt;
| 1&lt;br /&gt;
| 10 nA&lt;br /&gt;
| 100 nA&lt;br /&gt;
| Vee to Vcc-1,0V&lt;br /&gt;
| Vcc-0,8V Vee+0,8V @0,1A 30V  Vcc-1,3V Vee+1,3V  @1A 24V &lt;br /&gt;
| 5&lt;br /&gt;
| Power-OPV, Thermal Shutdown, Io=1A Io(max)=1.5A&lt;br /&gt;
| [http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=0;INDEX=0;FILENAME=A200%252FTCA0372%2523MOT.pdf; PDF]&lt;br /&gt;
| alle, R&lt;br /&gt;
| 0,70&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LA6510 LA6510]&lt;br /&gt;
| 2&lt;br /&gt;
| &lt;br /&gt;
| 0,15&lt;br /&gt;
| 2&lt;br /&gt;
| 10 nA&lt;br /&gt;
| 100 nA&lt;br /&gt;
| Vcc-2V Vee+0V&lt;br /&gt;
| Vcc-2V Vee+2V  @33Ω 30V&lt;br /&gt;
| 12&lt;br /&gt;
| Power-OPV, current limiter pin, Imax=1A P=2,5W, Gehäuse:SIP10F&lt;br /&gt;
| [http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=0;INDEX=0;FILENAME=A200%252FLA6510%2523SAN.pdf; PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 0,80&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/L272 L272]&lt;br /&gt;
| 2&lt;br /&gt;
| 0,35&lt;br /&gt;
| 1&lt;br /&gt;
| 15&lt;br /&gt;
| 50 nA&lt;br /&gt;
| 300 nA&lt;br /&gt;
| &lt;br /&gt;
| Vcc-1V Vee+0,3V @0,1A 24V  Vcc-1,5V Vee+0,6V  @0,5A 24V &lt;br /&gt;
| 8&lt;br /&gt;
| Power-OPV, Vcc=4V-28V, Io=0,7A P=1W, Thermal Shutdown @160°C&lt;br /&gt;
| [http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=0;INDEX=0;FILENAME=A200%252FL272fai.pdf; PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 0,70&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TLC272 TLC272]&lt;br /&gt;
| 2&lt;br /&gt;
| 1,7&lt;br /&gt;
| 2,9&lt;br /&gt;
| 1,1&lt;br /&gt;
| 0,1 pA&lt;br /&gt;
| 0,7 pA&lt;br /&gt;
| Vcc-0.8V Vee-0.3V&lt;br /&gt;
| Vcc-1.2V Vee+0V  @10kΩ&lt;br /&gt;
| 5&lt;br /&gt;
| Precision OPV, für hochohmige Messanwendungen, Single: TLC271, Quad: TLC274, weniger Offset: TLC277&lt;br /&gt;
| [http://focus.ti.com/lit/ds/symlink/tlc272.pdf PDF]&lt;br /&gt;
| R, CSD&lt;br /&gt;
| 0,26&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MCP602 MCP602-I/P]&lt;br /&gt;
| 2&lt;br /&gt;
| 2,8&lt;br /&gt;
| 2,3&lt;br /&gt;
| 1&lt;br /&gt;
| 1 pA&lt;br /&gt;
| 1 pA&lt;br /&gt;
| Vcc-1,2V Vee-0,2V&lt;br /&gt;
| Vcc-0,1V Vee+0,1V  @5kΩ&lt;br /&gt;
| 0,5&lt;br /&gt;
| Vcc=2,7V-5,5V Vout=20mA&lt;br /&gt;
| [http://www.chipcatalog.com/Doc/88306CED2FD891755A0736169A8D31C1.pdf PDF]&lt;br /&gt;
| R&lt;br /&gt;
| 0,55&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM393 LM393]&lt;br /&gt;
| 2&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| 1&lt;br /&gt;
| 5 nA&lt;br /&gt;
| 65 nA&lt;br /&gt;
| Vcc-2V Vee+0V&lt;br /&gt;
| Open- Collector&lt;br /&gt;
| 1,6&lt;br /&gt;
| Standard-Komparator, Isink=16mA, Vcc=2V - 36V, Response-Time=1,5µs&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=lm393 PDF]&lt;br /&gt;
| alle&lt;br /&gt;
| 0,10&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM339 LM339]&lt;br /&gt;
| 4&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| 1,4&lt;br /&gt;
| 2,3 nA&lt;br /&gt;
| 60 nA&lt;br /&gt;
| &lt;br /&gt;
| Open- Collector&lt;br /&gt;
| 1,1&lt;br /&gt;
| Standard-Komparator, Isink=16mA, Vcc=2V - 36V, Response-Time=1,5µs&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=lm339 PDF]&lt;br /&gt;
| alle&lt;br /&gt;
| 0,10&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TLC3702 TLC3702]&lt;br /&gt;
| 2&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| 1,2&lt;br /&gt;
| &lt;br /&gt;
| 5pA&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| 0,02&lt;br /&gt;
| Micropower-Komparator (20µA) PushPull Ausgang&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=tlc3702 PDF]&lt;br /&gt;
| F, C&lt;br /&gt;
| 0,80&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
| Bezeichnung&lt;br /&gt;
| OPVs pro Gehäuse&lt;br /&gt;
| Unity-Gain&lt;br /&gt;
| Slew-Rate&lt;br /&gt;
| Input Offset Spannung&lt;br /&gt;
| Input Offset Strom&lt;br /&gt;
| Input Bias Strom&lt;br /&gt;
| R2R in&lt;br /&gt;
| R2R out&lt;br /&gt;
| Stromaufnahme&lt;br /&gt;
| Bemerkung&lt;br /&gt;
| [http://www. PDF]&lt;br /&gt;
| Lieferant&lt;br /&gt;
| Preis&lt;br /&gt;
|-&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Warum findet sich in obiger Liste kein [http://www.mikrocontroller.net/part/LM741 741], war er doch lange Zeit &amp;quot;der&amp;quot; OPV schlechthin? Nun, er wird allgemein als &amp;quot;veraltet&amp;quot; angesehen, da er aus den 60er Jahren stammt (1968 von Fairchild vorgestellt, etwa ab 1969 kommerziell erhältlich) und keine besonderen technischen Daten aufweist. Der immerhin etwa fünf Jahre jüngere 324 (von 1974) kostet häufig ein paar Cent weniger, enthält dafür aber vier statt einen OPV mit besseren Daten.&lt;br /&gt;
&lt;br /&gt;
==== Empfehlungen ====&lt;br /&gt;
===== Lineare NF-Verstärker =====&lt;br /&gt;
Als besonders lineare Verstärker für Audiozwecke eignen sich u.a der LF356.&lt;br /&gt;
&lt;br /&gt;
===== HF-taugliche Verstärker =====&lt;br /&gt;
Für HF-Anwendungen eigenen sich besonders:&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/part/LT1222 LT1222]&lt;br /&gt;
&lt;br /&gt;
===== Komparatoren =====&lt;br /&gt;
Komparatoren müssen schnell aber nicht so genau schalten. Dafür eigenen sich:&lt;br /&gt;
&lt;br /&gt;
=== Spannungsregler ===&lt;br /&gt;
==== Linearregler ====&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;linearregler&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung Datenblatt&lt;br /&gt;
! Preis (€)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LP2950 LP2950]&lt;br /&gt;
| 0,39 - 0,53&lt;br /&gt;
| Festspannungsregler Low-Dropout&lt;br /&gt;
| 3 - 5V 100mA, TO-92, &amp;lt;120µA Ruhestrom&lt;br /&gt;
| R, D&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM2940 LM2940]&lt;br /&gt;
| 0,40&lt;br /&gt;
| Festspannungsregler Low-Dropout&lt;br /&gt;
| z. B. 5V, 1A(@0,5V drop), Verpolschutz, TO-220, SOT-223.&lt;br /&gt;
| R, D&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM1117 LM1117]&lt;br /&gt;
| 0,65&lt;br /&gt;
| Festspannungsregler Low-Dropout (auch LT1117, NCP#, REG#, usw.)&lt;br /&gt;
| z. B. 3V3, 800mA(@1,1V drop), SOT-223. fixed 3V3 oder adjustable&lt;br /&gt;
| D, R, [https://www.IT-WNS.de/ I]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM317 LM317]&lt;br /&gt;
| 0,22&lt;br /&gt;
| Linearer einstellbarer Spannungsregler (LM337 für neg. Spannungen)&lt;br /&gt;
| max 40V -&amp;gt; 1,2 - 37V, max 1.5A, TO220&lt;br /&gt;
| alle&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MAX663 MAX663]&lt;br /&gt;
| 1,80&lt;br /&gt;
| Linearer, einstellbarer Spannungsregler&lt;br /&gt;
| sehr niedriger Eigenstromverbrauch&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM7805 LM78xx]&lt;br /&gt;
| &amp;lt;1,00&lt;br /&gt;
| Festspannungregler (xx=05: 5V, xx=12: 12V ...)&lt;br /&gt;
| &lt;br /&gt;
| alle&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM7905 LM79xx]&lt;br /&gt;
| &amp;lt;1,00&lt;br /&gt;
| Festspannungregler, negative Spannung (xx=05: -5V, xx=12: -12V ...)&lt;br /&gt;
| &lt;br /&gt;
| alle&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LF33 LF33]&lt;br /&gt;
| &amp;lt;1,00&lt;br /&gt;
| Festspannungregler &lt;br /&gt;
| +3,3V, TO-220, 1A&lt;br /&gt;
| R, [https://www.IT-WNS.de/ I]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MCP1700 MCP1700]&lt;br /&gt;
| &amp;lt;1,00&lt;br /&gt;
| Festspannungregler, Low-Dropout, sehr niedriger Eigenstromverbrauch, siehe auch MCP1702/MCP1703, durch geringe PSRR eher nur für Batterieanwendung&lt;br /&gt;
| +3,3V u.a., TO-92, SOT-89, SOT-23, 200mA&lt;br /&gt;
| R, F, [https://www.IT-WNS.de/ I]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM2931 LM2931]&lt;br /&gt;
| ~0,30 - 0,40&lt;br /&gt;
| feste (5V; 3,3V) und variable (3..24V) Low-Dropout Spannungsregler (max. 100mA)&lt;br /&gt;
| TO-220, TO-92, SMD, Automotive, Iq=0,4mA&lt;br /&gt;
| R&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM723 &amp;amp;mu;A723/LM723]&lt;br /&gt;
| ~0,30&lt;br /&gt;
| einstellbar 2-37V&lt;br /&gt;
| Netzteile mit Strombegrenzung, Netzteile mit hohem Ausgangsstrom, Labornetzteile, DIP-14, SO-14&lt;br /&gt;
| alle&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
* [http://www.national.com/an/AN/AN-1148.pdf AN-1148: Application Note 1148 Linear Regulators: Theory of Operation and Compensation] von National Semiconductor Corporation (PDF)&lt;br /&gt;
&lt;br /&gt;
==== Schaltregler ====&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;schaltregler&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM2576 LM2576, LM2575, LM2574]&lt;br /&gt;
| 0,90&lt;br /&gt;
| Step-Down, als ADJ (einstellbare Spannung) und als Festspannungsregler&lt;br /&gt;
| max 40V -&amp;gt; 1,2 - 37V, TO220-5 u.a., LM2576 bis 3A, LM2575 bis 1A, LM2574 bis 0,5A, als HV-Typen Vin bis 63V&lt;br /&gt;
| alle - Achtung: R liefert u.U. den nur zum LM2596 äquivalenten P3596&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=LM2576 PDF] - [http://www.mikrocontroller.net/topic/58094#450561 mit Funk-Entstördrossel FED100µ (Reichelt...) bis 3 A]&lt;br /&gt;
|-&lt;br /&gt;
| [[MC34063]]A&lt;br /&gt;
| 0,29&lt;br /&gt;
| Step-Up ~0,3A / Step-Down 0,7A / Inverter 0,2A-0,6A&lt;br /&gt;
| SO-8/DIP-8; Tool zum Berechnen auf [http://www.nomad.ee/micros/mc34063a/index.shtml www.nomad.ee]&lt;br /&gt;
| R, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.onsemi.com/pub/Collateral/MC34063A-D.PDF PDF], [http://www.mikrocontroller.net/articles/MC34063]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/PR4401 PR4401]&lt;br /&gt;
| 0,50&lt;br /&gt;
| Led-Treiber, Step-Up, Batteriebetrieb mit einer Zelle (bis 0,9 V)&lt;br /&gt;
| SO-23&lt;br /&gt;
| R, [http://www.ak-modul-bus.de/ AK Modul-Bus], [https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.prema.com/pdf/pr4401.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LT1930 LT1930] und [http://www.mikrocontroller.net/part/LT1932 LT1932]&lt;br /&gt;
| ~3 €&lt;br /&gt;
| Leistungs-Led-Treiber, Step-Up&lt;br /&gt;
| SO-23&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.linear.com/pc/productDetail.jsp?navId=H0,C1,C1003,C1042,C1031,C1061,P1813]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Shuntregler/[[Spannungsreferenz]] ====&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;schaltregler&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot; style=&amp;quot;text-align:center&amp;quot; &lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis [&amp;amp;euro;]&lt;br /&gt;
! Spannung [V]&lt;br /&gt;
! Strom [mA]&lt;br /&gt;
! Fehler [%]&lt;br /&gt;
! Temperatur koeffizient typ/max [ppm/K]&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TL431 TL431]&lt;br /&gt;
| 0,15&lt;br /&gt;
| 2,5-36&lt;br /&gt;
| 1-100&lt;br /&gt;
| 2&lt;br /&gt;
| 20/70 &lt;br /&gt;
| Präzise Alternative zur Z-Diode; SO8; TO92&lt;br /&gt;
| C, R, DK&lt;br /&gt;
|[http://www.datasheetarchive.com/search.php?q=TL431 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LT1021 LT1021]&lt;br /&gt;
| 5,00&lt;br /&gt;
| 5; 7; 10&lt;br /&gt;
| 10 &lt;br /&gt;
| 1; 0,05&lt;br /&gt;
| 2/5&lt;br /&gt;
| Präzisionsreferenz, +/-10mA Ausgangsstrom&lt;br /&gt;
| C, R, DK&lt;br /&gt;
|[http://www.datasheetarchive.com/pdf/getfile.php?dir=Datasheets-17&amp;amp;file=DSA-321686.pdf&amp;amp;scan= PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LT1004  LT1004]&lt;br /&gt;
| 1,90&lt;br /&gt;
| 1,235; 2,5 &lt;br /&gt;
| 0.01-20 &lt;br /&gt;
| 0,8&lt;br /&gt;
| 20/50&lt;br /&gt;
| niedriger Stromverbrauch, ab 20 µA; 1,2V bessere Eigenschaften; TI =! LT&lt;br /&gt;
| R, [https://www.IT-WNS.de/ I]&lt;br /&gt;
|[http://www.datasheetarchive.com/search.php?q=LT1004 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LT1009  LT1009]&lt;br /&gt;
| 1,95&lt;br /&gt;
| 2,5 &lt;br /&gt;
| 1-10&lt;br /&gt;
| 0,2&lt;br /&gt;
| 20/30&lt;br /&gt;
| verbesserter Ersatz für LM336&lt;br /&gt;
| R&lt;br /&gt;
|[http://www.datasheetarchive.com/search.php?q=LT1009 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM336-2.5 LM336-2.5]&lt;br /&gt;
| 0,20&lt;br /&gt;
| 2,5; 5,0&lt;br /&gt;
| 0,6-10&lt;br /&gt;
| 4&lt;br /&gt;
| 70/230&lt;br /&gt;
| TO92; SO8; 1% erhältlich&lt;br /&gt;
| C, R, DK&lt;br /&gt;
|[http://www.datasheetarchive.com/search.php?q=LM336 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM385 LM385]&lt;br /&gt;
| 0,35&lt;br /&gt;
| 1,2V; 2,5&lt;br /&gt;
| 0,015-20&lt;br /&gt;
| 2&lt;br /&gt;
| 30/150&lt;br /&gt;
| Präzise Alternative zur Z-Diode; SO8; TO92&lt;br /&gt;
| C, R, DK&lt;br /&gt;
|[http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=0;INDEX=0;FILENAME=A200%252FLM385Z1%252C2%2523TEX.pdf; PDF]&lt;br /&gt;
|-&lt;br /&gt;
| LM 4041 CIDBZT&lt;br /&gt;
| 0,35&lt;br /&gt;
| 1,22V-10,0&lt;br /&gt;
| 0,000045-12&lt;br /&gt;
| 0,5&lt;br /&gt;
| 20/100&lt;br /&gt;
| Battery Powered Equipment&lt;br /&gt;
| elpro.org&lt;br /&gt;
|[http://www.google.de/url?sa=t&amp;amp;rct=j&amp;amp;q=&amp;amp;esrc=s&amp;amp;source=web&amp;amp;cd=5&amp;amp;ved=0CEYQFjAE&amp;amp;url=http%3A%2F%2Fwww.farnell.com%2Fdatasheets%2F36982.pdf&amp;amp;ei=MCbJU9ShJajy7Ab41YDIBw&amp;amp;usg=AFQjCNEhAH7BdMUd-YWQB1HRbdUNmvzA_Q&amp;amp;bvm=bv.71198958,d.ZGU]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LT1029 LT1029]&lt;br /&gt;
| 2,20&lt;br /&gt;
| 5,0&lt;br /&gt;
| 0,6-10&lt;br /&gt;
| 1&lt;br /&gt;
| 8/40&lt;br /&gt;
| Bandgap TO92; 0,2% erhältlich&lt;br /&gt;
| C, R, DK&lt;br /&gt;
|[http://www.datasheetarchive.com/search.php?q=LT1029 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| ADR36x&lt;br /&gt;
| 2,20&lt;br /&gt;
| 2,048; 2,5; 3; 3,3; 4,096; 5 &lt;br /&gt;
| -1, +5&lt;br /&gt;
| 0,1&lt;br /&gt;
| 3/9&lt;br /&gt;
| Bandgap; SOT23&lt;br /&gt;
| DK, RS, FAR&lt;br /&gt;
|[http://www.datasheetarchive.com/search.php?q=ADR363 PDF]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Viele Spannungsreferenzen haben auch [http://www.maxim-ic.com/products/references/ Maxim] und [http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=analog&amp;amp;familyId=401&amp;amp;uiTemplateId=NODE_STRY_PGE_T TI] im Programm.&lt;br /&gt;
&lt;br /&gt;
=== Stromquelle ===&lt;br /&gt;
==== Referenzstromquelle ====&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;referenzstromquelle&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM334 LM334]&lt;br /&gt;
| 0,58 - 1,84&lt;br /&gt;
| Referenzstromquelle, 1µA...10mA, TO-92&lt;br /&gt;
| Referenzstromquelle/Temperatursensor&lt;br /&gt;
| R, C&lt;br /&gt;
| [http://www.national.com/ds/LM/LM134.pdf PDF]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Timer ===&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;can&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/NE555 555]&lt;br /&gt;
| 0,15&lt;br /&gt;
| Universeller Zeitgeber.&lt;br /&gt;
| Für alles, wirklich alles. CMOS-Versionen lassen sich aufgrund ihrer niedrigeren Betriebsspannung besser mit µCs verbinden.&lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.google.de/search?q=555+Datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/DS1307 DS1307]&lt;br /&gt;
| 1,95&lt;br /&gt;
| 64 X 8 Serial Real Time Clock. Quarzuhr / Kalender Baustein mit serieller TWI-Schnittstelle.  &lt;br /&gt;
| Uhrenfunktion, unabhängig vom µC, aber µC-Steuerbar. Batteriepufferbar (3V-Knopfzelle wie CR2032) um die Zeit bei ausgeschalteter Board-Betriebsspannung weiter zu zählen.&lt;br /&gt;
| D, R, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.google.de/search?q=DS1307 Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/PCF8583 PCF8583]&lt;br /&gt;
| 1,50&lt;br /&gt;
| I²C/TWI Real Time Clock, Calendar, SRAM, Alarm, Timer, Eventcounter&lt;br /&gt;
| Auf Basis eines SRAM-chips, deshalb kann ein großer Teil als SRAM genutzt werden (ca 240 bytes). Berechnet Datum (4 Jahre, Jahr 0 = Schaltjahr), Uhrzeit (12/24), Wochentag. ein 32-kHz-Uhrenquarz ist nötig, sonst als Uhr unbrauchbar da  störempfindlich. Möglichkeit eines Interruptausganges bei voreingestellter Alarmzeit. Bemerkenswert einfaches Protokoll. Kann umgeschaltet werden in einen Timer-Modus (einfacher Counter mit bestimmter Timebase) oder Event-Counter-Modus (Eingangssignale zählen).&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.alldatasheet.com/view.jsp?Searchword=PCF8583]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Analogschalter und Multiplexer ===&lt;br /&gt;
Die DG2xx DG3xx DG4xx, teilweise auch DG5xx bezeichnen Analogschalter und Multiplexer die sich zum Industriestandard entwickelt haben. Es gibt sie von vielen Herstellern und zahlreichen Ausführungen in allen R(on) Bereichen und sind Pinkompatibel. Anstelle von &amp;quot;DGxxx&amp;quot; benutzen Hersteller für verbesserte/moderne Versionen ihre eigenen Präfixe wie &amp;quot;ADGxxx&amp;quot; von Analog Devices oder &amp;quot;MAXxxx&amp;quot; von Maxim. Für einfache Schalter werden häufig die letzten zwei Ziffern 01 bis 05 und 11-13 benutzt, 06/07/08/09 bezeichnet 16:1 8:1 und 4:1 Multiplexer in Single Ended und Differential Ended. Spannungsbereich geht bis +/-12 oder +/-15 V, die Steuereingänge haben zum Teil TTL-Kompatibilität, andernfalls einen Pin der den Logikpegel definiert (z.&amp;amp;nbsp;B. VCC).&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;can&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/DG201 DG201]/[http://www.mikrocontroller.net/part/DG202 DG202]/[http://www.mikrocontroller.net/part/DG212 DG212]&lt;br /&gt;
| ~2-3€&lt;br /&gt;
| Vierfach Einzelschalter in SPST, SPDT, &lt;br /&gt;
| Zum µC-gesteuerten schalten von Analogsignalen, in Audio, Video, und Messschaltungen, in OP-Schaltungen für programmierbare Verstärkungen&lt;br /&gt;
| Maxim, Analog Devices, u.a.&lt;br /&gt;
| [http://search.datasheetcatalog.net/cgi-bin/helo.pl?text=DG202&amp;amp;action=Search]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/DG306 DG306]/[http://www.mikrocontroller.net/part/DG406 DG406]&lt;br /&gt;
| ~4-10€&lt;br /&gt;
| 16:1 Analog-Multiplexer&lt;br /&gt;
| Zum Multiplexen von Analogsignalen, Kanalauswahl für ADC-Messschaltungen.&lt;br /&gt;
| Maxim, Analog Devices, u.a.&lt;br /&gt;
| [http://search.datasheetcatalog.net/cgi-bin/helo.pl?text=DG306&amp;amp;action=Search]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/DG307 DG307]/[http://www.mikrocontroller.net/part/DG408 DG408]&lt;br /&gt;
| ~4-10€&lt;br /&gt;
| Zweifach 8:1 bzw Einfach 8:1 differential ended (8 Doppelkanäle)&lt;br /&gt;
| Zum Multiplexen von Analogsignalen, Kanalauswahl für ADC-Messschaltungen auch für differentielle Eingänge. &lt;br /&gt;
| Maxim, Analog Devices, u.a.&lt;br /&gt;
| [http://search.datasheetcatalog.net/cgi-bin/helo.pl?text=DG308&amp;amp;action=Search]&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| 4051, z.&amp;amp;nbsp;B. [http://www.mikrocontroller.net/part/74HC4051 74HC4051]&lt;br /&gt;
| ab 25ct&lt;br /&gt;
| 1:8 Multiplexer, R_on &amp;lt;100Ω, auch 2:4, 1:16 usw  &lt;br /&gt;
| Zum µC-gesteuerten schalten von Analogsignalen, in Audio, Video, und Messschaltungen, in OP-Schaltungen für programmierbare Verstärkungen&lt;br /&gt;
| verschiedende&lt;br /&gt;
| [http://search.datasheetcatalog.net/cgi-bin/helo.pl?text=74HC4051&amp;amp;action=Search]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Digital ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== CAN ===&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;can&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MCP2515 MCP2515]&lt;br /&gt;
| 2,55&lt;br /&gt;
| CAN 2.0B, [[SPI]]-Schnittstelle&lt;br /&gt;
| &lt;br /&gt;
| D,F,R,[https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q= PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/SJA1000 SJA1000]&lt;br /&gt;
| 4,55&lt;br /&gt;
| PellCAN 2.0B, 8 Bit parallele Schnittstelle&lt;br /&gt;
|&lt;br /&gt;
| F,R&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Logik ===&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (€)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/74HC4050 74HC4050]&lt;br /&gt;
| 0,27&lt;br /&gt;
| z.&amp;amp;nbsp;B. 5V =&amp;gt; 3V&lt;br /&gt;
| Pegelwandler unidirektional abwärts&lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=74hc4050 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/HEF4104B HEF4104B]&lt;br /&gt;
| 0,77&lt;br /&gt;
| z.&amp;amp;nbsp;B. 5V =&amp;gt; 12V&lt;br /&gt;
| Pegelwandler unidirektional aufwärts&lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=HEF4104B PDF]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== USB ===&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;usb&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/FT232 FT232]&lt;br /&gt;
| 3,59&lt;br /&gt;
| USB &amp;lt;-&amp;gt; RS232 Wandler&lt;br /&gt;
| Zugriff über virtuellen COM Port&lt;br /&gt;
| D, R, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.ftdichip.com/Support/Documents/DataSheets/ICs/DS_FT232BL_BQ.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/FT245 FT245]&lt;br /&gt;
| 4,79&lt;br /&gt;
| USB &amp;lt;-&amp;gt; Seriell Wandler mit paralleler Schnittstelle&lt;br /&gt;
| Zugriff über virtuellen COM Port&lt;br /&gt;
| D, R&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=ft245 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TUSB3410 TUSB3410]&lt;br /&gt;
| 3,50&lt;br /&gt;
| USB &amp;lt;-&amp;gt; RS232 mit 8052 CPU&lt;br /&gt;
| Zugriff über virtuellen COM Port&lt;br /&gt;
| DK&lt;br /&gt;
| [http://focus.ti.com/docs/prod/folders/print/tusb3410.html PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MCP2200 MCP2200]&lt;br /&gt;
| 1,90&lt;br /&gt;
| USB &amp;lt;-&amp;gt; UART per fest-vorprogrammiertem PIC&lt;br /&gt;
| Zugriff über virtuellen COM Port&lt;br /&gt;
| R, RS, F, M, DK, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://ww1.microchip.com/downloads/en/DeviceDoc/22228B.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== GPS ===&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;usb&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| NL-552ETTL (uBlox5) &lt;br /&gt;
| 25,43&lt;br /&gt;
| GPS-Empfänger&lt;br /&gt;
| Zugriff über TTL (NMEA Protokoll)&lt;br /&gt;
| www.mercateo.com&lt;br /&gt;
| [http://www.navilock.de/produkte/gruppen/13/Boards_und_Module/60721_NL-552ETTL_ublox5.html HTML]&lt;br /&gt;
|-&lt;br /&gt;
| NL-550ERS (uBlox5) &lt;br /&gt;
| 24,95&lt;br /&gt;
| GPS-Empfänger&lt;br /&gt;
| Zugriff über RS232 (NMEA Protokoll)&lt;br /&gt;
| www.mercateo.com&lt;br /&gt;
| [http://www.navilock.de/produkte/gruppen/13/Boards_und_Module/60418_NL-550ERS_ublox5.html HTML]&lt;br /&gt;
|-&lt;br /&gt;
| NL-551EUSB (uBlox5) &lt;br /&gt;
| 22,56&lt;br /&gt;
| GPS-Empfänger&lt;br /&gt;
| Zugriff über USB (NMEA Protokoll)&lt;br /&gt;
| www.mercateo.com&lt;br /&gt;
| [http://www.navilock.de/produkt/60419/pdf.html?sprache=de PDF]&lt;br /&gt;
|-&lt;br /&gt;
| EM-406A (Sirf III)&lt;br /&gt;
| um 35 Euro&lt;br /&gt;
| GPS-Empfänger mit 1PPS-Ausgang&lt;br /&gt;
| Zugriff über TTL (NMEA Protokoll)&lt;br /&gt;
|&lt;br /&gt;
| [http://www.navilock.de/produkte/G_60407/merkmale.html HTML]&lt;br /&gt;
|-&lt;br /&gt;
| CW25-TIM &lt;br /&gt;
| ca. 35 Euro (ab 10 Stk)&lt;br /&gt;
| GPS Empfänger mit zusätzlichen Frequenzausgang(programmierbar von 10Hz..30Mhz)&lt;br /&gt;
| Sehr interesant wenn man einen präzisen Takt braucht.(für Adwandler, Datenlogger usw)&lt;br /&gt;
| [http://www.navsync.com]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Treiber ===&lt;br /&gt;
==== Diverse Treiber ====&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/ULN2003A ULN2003A]&lt;br /&gt;
| 0,29&lt;br /&gt;
| 7-fach Low-Side Treiber&lt;br /&gt;
| 50V/500mA&lt;br /&gt;
| R, D, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=ULN2003 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/ULN2803A ULN2803A]&lt;br /&gt;
| 0,31&lt;br /&gt;
| 8-fach Low-Side Treiber&lt;br /&gt;
| 50V/500mA&lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=ULN2803 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TPIC6B595 TPIC6B595]&lt;br /&gt;
| 1,00&lt;br /&gt;
| 8-fach Low-Side Treiber mit integriertem Schieberegister&lt;br /&gt;
| 45V/250mA&lt;br /&gt;
| F&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=TPIC6B595 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/UDN2981 UDN2981]&lt;br /&gt;
| 1,50&lt;br /&gt;
| 8-fach High-Side Treiber&lt;br /&gt;
| 50V/500mA&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=UDN2981 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/ICL7667 ICL7667]&lt;br /&gt;
| 1&lt;br /&gt;
| Dual inverting MOSFET Treiber&lt;br /&gt;
| 18V, 20ns@1nF&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=ICL7667 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/HCPL3120 HCPL3120]&lt;br /&gt;
| 3.70&lt;br /&gt;
| Optokoppler mit integriertem MOSFET-Treiber&lt;br /&gt;
| Schaltnetzteile, etc.&lt;br /&gt;
| C&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=HCPL3120 PDF]&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/SN75179B SN75179B]&lt;br /&gt;
| 0.36&lt;br /&gt;
| RS-485/422 Receiver/Transmitter, alter IC mit hohem Stromverbrauch (60mA!)&lt;br /&gt;
| Serielle Daten (z.&amp;amp;nbsp;B.UART) über weite Strecken&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=SN75174 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MAX485 MAX485]&lt;br /&gt;
| 1.50&lt;br /&gt;
| RS-485/422 Receiver/Transmitter, moderner CMOS IC mit geringem Stromverbrauch (0,3mA!)&lt;br /&gt;
| Serielle Daten (z.&amp;amp;nbsp;B.UART) über weite Strecken&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=MAX485 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| LTC1480&lt;br /&gt;
| &lt;br /&gt;
| RS-485 Transceiver&lt;br /&gt;
| Betriebsspannung 3,3V, &amp;quot;Ultralow Power&amp;quot;&lt;br /&gt;
| R, C u.a.&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=LTC1480 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| MAX3232&lt;br /&gt;
| &lt;br /&gt;
| RS-232 Transceiver&lt;br /&gt;
| Betriebsspannung 3V bis 5,5V&lt;br /&gt;
| R, D, C, [https://www.IT-WNS.de/ I] u.a.&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=MAX3232 PDF]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== 7-Segment LED-Treiber ====&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;led&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/SAA1064 SAA1064]&lt;br /&gt;
| ~2€&lt;br /&gt;
| Vier-Stellen Treiber mit [[I2C|I²C]] ([[TWI]]) Bus&lt;br /&gt;
| Treibt bis zu vier 7-Segment (plus Dezimalpunkt) Stellen mit gemeinsamer Anode. Bis zu vier SAA1064 können an einem I²C-Bus betrieben werden. Damit kann man insgesamt 16 Stellen treiben.&lt;br /&gt;
| Reichelt&lt;br /&gt;
| [http://www.nxp.com/pip/SAA1064_CNV_2.html NXP]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/STLED316S STLED316S], [http://www.mikrocontroller.net/part/STLED316SMTR STLED316SMTR]&lt;br /&gt;
| ~2€&lt;br /&gt;
| Sechs-Stellen Treiber mit [[SPI]]-ähnlicher Busschnittstelle&lt;br /&gt;
| Sechs-Stellen Treiber, der zusätzlich noch ein 8x2 Tastaturdekoder enthält. Die Busschnittstelle ist [[SPI]]-ähnlich, MOSI und MISO liegen auf einem gemeinsamen PIN als DIN/DOUT.&lt;br /&gt;
| Mouser&lt;br /&gt;
| [http://www.st.com/stonline/products/literature/ds/14307/stled316s.pdf ST]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/ICM7218 ICM7218C]&lt;br /&gt;
| ~6€&lt;br /&gt;
| Acht-Stellen Treiber mit paralleler Busschnittstelle&lt;br /&gt;
| Alt, teuer, benötigt viele µC-Pins für die parallele Schnittstelle&lt;br /&gt;
| Reichelt&lt;br /&gt;
| [http://www.intersil.com/data/fn/FN3159.pdf Intersil]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MAX7221 MAX7221]&lt;br /&gt;
| ~6€&lt;br /&gt;
| Acht-Stellen Treiber mit [[SPI]]-Schnittstelle&lt;br /&gt;
| Mit BCD-Dekoder, kann auch beliebige 8x8 LED-Matrix ansteuern&lt;br /&gt;
| Reichelt&lt;br /&gt;
| [http://datasheets.maxim-ic.com/en/ds/MAX7219-MAX7221.pdf Maxim]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Punkt/Streifen (Dot/Bar) LED-Treiber ====&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;bar&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM3914 LM3914]&lt;br /&gt;
| ~1,20 €&lt;br /&gt;
| 10-Stellen Balkenanzeigetreiber mit Analogeingang&lt;br /&gt;
| Lineare A/D-Wandlung&lt;br /&gt;
| Reichelt&lt;br /&gt;
| [http://www.national.com/pf/LM/LM3914.html National]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM3915 LM3915]&lt;br /&gt;
| ~1,40 €&lt;br /&gt;
| 10-Stellen Balkenanzeigetreiber mit Analogeingang&lt;br /&gt;
| Logarithmische A/D-Wandlung&lt;br /&gt;
| Reichelt&lt;br /&gt;
| [http://www.national.com/pf/LM/LM3915.html National]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Analogschalter aus der 4000 Logikreihe ===&lt;br /&gt;
Die folgenden Schalter werden digital gesteuert, daher sind sie im Kapitel [[#Digital|Digital]] einsortiert. Sie basieren auf standard CMOS-Technologien, sind daher weit verbreitet, günstig, haben aber daher auch nur mäßige Eigenschaften und begrenzte Anwendungsbereiche. Analogschalter für Präzisionsanwendungen sind im Kapitel [[#Analog|Analog]]. Zum Schalten Analog- oder Digitalsignalen. Je nach Typ sind  Analogsignale bis in den 100 MHz Bereich mit einer Schaltfrequenz bis mehrere 10 MHz möglich.&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;can&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/CD4051 4051]&lt;br /&gt;
| 0,25&lt;br /&gt;
| Ein 8:1 Analogmultiplexer.&lt;br /&gt;
| &lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.google.de/search?q=4051+datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/CD4052 4052]&lt;br /&gt;
| 0,11&lt;br /&gt;
| Zwei 4:1 Analogmultiplexer/-demultiplexer&lt;br /&gt;
| &lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.google.de/search?q=4052+datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/CD4053 4053]&lt;br /&gt;
| 0,16&lt;br /&gt;
| Drei 2:1 Analogmultiplexer/-demultiplexer&lt;br /&gt;
| &lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.google.de/search?q=4053+datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/CD4066 4066]&lt;br /&gt;
| 0,15&lt;br /&gt;
| Vier Analogschalter&lt;br /&gt;
| &lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.datasheets.org.uk/pdf/347282.pdf 4066.pdf]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/CD4067 4067]&lt;br /&gt;
| 0,60&lt;br /&gt;
| Ein 16:1 Analogmultiplexer/-demultiplexer&lt;br /&gt;
|&lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.google.de/search?q=4067+datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Galvanische Trennelemente ===&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/CNY17 CNY17]&lt;br /&gt;
| 0,28&lt;br /&gt;
| Optisch, Standardtyp&lt;br /&gt;
| 3,7kV 50-100kHz&lt;br /&gt;
| R,C&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=CNY17 PDF], [http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=0;INDEX=0;FILENAME=A500%252FCNY17-I_CNY17-II_CNY17-III.pdf; PDF Temic]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/6N137 6N137]&lt;br /&gt;
| 0,49&lt;br /&gt;
| Optisch, Logikausgang (5V)&lt;br /&gt;
| sehr schnell 14MHz&lt;br /&gt;
| R,D,[https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=0;INDEX=0;FILENAME=A500%252F6N137.pdf; PDF]&lt;br /&gt;
|-&lt;br /&gt;
| ADUM240*&lt;br /&gt;
| 10&lt;br /&gt;
| Induktiv, 3V/5V Logik&lt;br /&gt;
| extrem schnell, EN90650, 5kV&lt;br /&gt;
| F&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=adum240 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| ISO72*&lt;br /&gt;
| 1,25&lt;br /&gt;
| Kapazitiv, 3V/5V&lt;br /&gt;
| 6kV, bis zu 150MHz&lt;br /&gt;
| DK,F&lt;br /&gt;
| [http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=analog&amp;amp;familyId=897&amp;amp;uiTemplateId=NODE_STRY_PGE_T PDF]&lt;br /&gt;
|-&lt;br /&gt;
| PC817/827/837/847&lt;br /&gt;
| 0,3&lt;br /&gt;
| Optisch&lt;br /&gt;
| 8x7, x=Anzahl der Optokoppler&lt;br /&gt;
| C, R, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?family=analog&amp;amp;familyId=897&amp;amp;uiTemplateId=NODE_STRY_PGE_T PDF]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Displays ===&lt;br /&gt;
Bei den Textdisplays eignet sich praktisch jedes [[HD44780]] kompatible Display.&lt;br /&gt;
Praktisch jeder Elektronikversender hat eine Auswahl an verschiedenen Größen zu bieten. &lt;br /&gt;
Wer keinen besonderen Anforderungen an die Größe der Displays hat sollte sich bei Pollin und in Ebay umschauen.&lt;br /&gt;
&lt;br /&gt;
=== Speicher ===&lt;br /&gt;
&lt;br /&gt;
==== [[RAM]] ====&lt;br /&gt;
&lt;br /&gt;
==== [[EEPROM]] ====&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;EEPROMmemory&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| ST 24C01 BN6, ST 24C02 BN6, ST 24C256 BN6 (allgemein 24C## mit ## Größe in kbit)&lt;br /&gt;
| 0,14€ - 1,50€&lt;br /&gt;
| EEPROM Speicher mit seriellem (I2C) Interface, 1kbit bis 512 kbit Speicher. Viele verschiedene Hersteller.&lt;br /&gt;
| Speichern von Konfigurationsdaten &lt;br /&gt;
| R&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=24C PDF]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Converter ==&lt;br /&gt;
=== ADC ===&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Geschwindigkeit / Sps/s&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/ADC830 ADC830]&lt;br /&gt;
| 6&lt;br /&gt;
| 8-Bit-ADC, Differentiell, Parallel, (DIL-20)&lt;br /&gt;
| 8770&lt;br /&gt;
| C,R&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=adc830 PDF]&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LTC2400 LTC2400CS8]&lt;br /&gt;
| 8,30&lt;br /&gt;
| 24-Bit-ADC, Single Ended, Seriell (SPI), (SO-8) &lt;br /&gt;
| ca. 6&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.linear.com/pc/downloadDocument.do?navId=H0,C1,C1155,C1001,C1152,P1636,D1887]&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LTC2440 LTC2440CGN]&lt;br /&gt;
| 8,40&lt;br /&gt;
| 24-Bit-ADC, Differentiell, Seriell (SPI), (SSOP-16)&lt;br /&gt;
| bis 3500&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=LTC2440 PDF]&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| CS5381&lt;br /&gt;
| 37,50&lt;br /&gt;
| 24 Bit Stereo-Audio-ADC  (SOIC-24) &lt;br /&gt;
| bis 192k&lt;br /&gt;
| &lt;br /&gt;
| [http://www.cirrus.com/en/products/cs5381.html Seite]&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| ADS830&lt;br /&gt;
| 6,10&lt;br /&gt;
| 8 Bit ADC Parallel (SSOP-20) &lt;br /&gt;
| bis 60M&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.datasheetcatalog.com/datasheets_pdf/A/D/S/8/ADS830.shtml PDF]&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/MCP3204 MCP3204]&lt;br /&gt;
| 2,65&lt;br /&gt;
| 12-Bit-SAR-ADC, Single Ended, 4 Kanäle mit MUX, Seriell (SPI), (DIL-14/SO-14) &lt;br /&gt;
| bis 100k&lt;br /&gt;
| C,R&lt;br /&gt;
| [http://ww1.microchip.com/downloads/en/DeviceDoc/21298c.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DAC ===&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/DAC08 DAC08]&lt;br /&gt;
| 0,90&lt;br /&gt;
| 8-Bit DAC mit parallelem Businterface.&lt;br /&gt;
| Alt, preiswert. Benötigt viele µC Pins (min. 8, paralleler Bus) und eine doppelte Spannungsversorgung. Langsamere Version: 0808.&lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.google.de/search?q=DAC08+Datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/AD7524  AD7524]&lt;br /&gt;
| 3,00&lt;br /&gt;
| 8-Bit DAC mit parallelem Businterface&lt;br /&gt;
| Benötigt viele µC Pins. Single-Supply (5V bis 15V).&lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.google.de/search?q=7524+Datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TDA8444  TDA8444]&lt;br /&gt;
| 1,20&lt;br /&gt;
| Achtfach 6-Bit DAC mit seriellem TWI-Businterface. Bezahlbarer sechsfach-DAC, allerdings mit geringer Auflösung.&lt;br /&gt;
| Dort wo µC gesteuert viele Ausgangskanäle mit geringer, ungenauer Auflösung benötigt werden.&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.google.de/search?q=TDA8444+Datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/PCF8591 PCF8591]&lt;br /&gt;
| 2,50&lt;br /&gt;
| 8-Bit DAC, 8-Bit ADC mit seriellem TWI-Businterface.&lt;br /&gt;
| Z.B. in Regelkreisen wo sowohl ein DAC, als auch ein ADC benötigt wird.&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.google.de/search?q=PFC8591+Datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TDA8702 TDA8702]&lt;br /&gt;
| 2,50&lt;br /&gt;
| 8-Bit Video DAC mit parallelem Businterface und Clock-Eingang.&lt;br /&gt;
| Schnelle Wandlung bis 30 MHz. Benötigt viele µC Pins.&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.google.de/search?q=TDA8702+Datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LTC1661 LTC1661]&lt;br /&gt;
| 2,45&lt;br /&gt;
| Dual 10-bit DAC mit seriellem 3-Leitungs-Businterface.&lt;br /&gt;
| Guter Kompromiss aus Preis und Leistung. (Achtung, Micro-SO8-Gehäuse)&lt;br /&gt;
| F, C (Suchfunktion weigert sich manchmal ihn im Conrad-Shop zu finden), R&lt;br /&gt;
| [http://www.google.de/search?q=LTC1661+Datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LTC1257 LTC1257]&lt;br /&gt;
| 6,20&lt;br /&gt;
| 12-bit DAC mit kaskadierbarem seriellen 3-Leitungs-Businterface.&lt;br /&gt;
| Genauer µC-steuerbarer DAC.&lt;br /&gt;
| C, F, R&lt;br /&gt;
| [http://www.google.de/search?q=LTC1257+Datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LTC1456 LTC1456]&lt;br /&gt;
| 10,-&lt;br /&gt;
| 12-bit DAC mit kaskadierbarem seriellen 3-Leitungs-Businterface.&lt;br /&gt;
| Genauer µC-steuerbarer DAC.&lt;br /&gt;
| C&lt;br /&gt;
| [http://www.google.de/search?q=LTC1456+Datasheet Google]&lt;br /&gt;
|-&lt;br /&gt;
| MCP4922&lt;br /&gt;
| 2,25&lt;br /&gt;
| 2Kanal 12-bit DAC mit SPI-Interface&lt;br /&gt;
| Genauer µC-steuerbarer DAC von Microchip.&lt;br /&gt;
| R&lt;br /&gt;
| [http://ww1.microchip.com/downloads/en/devicedoc/21897a.pdf Datenblatt]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sensoren (aktiv) ==&lt;br /&gt;
=== [[Temperatursensor|Temperatur]] ===&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM75 LM75]&lt;br /&gt;
| 1,75&lt;br /&gt;
| Temperatursensor mit I²C (TWI) Bus Interface (3.3V und 5V Version) (SMD)&lt;br /&gt;
| D, R, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=LM75 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/DS1621 DS1621]&lt;br /&gt;
| ~5&lt;br /&gt;
| Temperatursensor mit I²C (TWI) Bus Interface (wie LM75, kein SMD)&lt;br /&gt;
| C, D&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/DS18B20 DS18B20]&lt;br /&gt;
| 2,95&lt;br /&gt;
| Temperatursensor mit 1-Wire Interface&lt;br /&gt;
| D, R, [https://www.IT-WNS.de/ I]&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=DS18B20 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM35 LM35]&lt;br /&gt;
| 1,19&lt;br /&gt;
| Analoger Temperatursensor&lt;br /&gt;
| D, R&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=LM35 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/LM335 LM335]&lt;br /&gt;
| 0,87&lt;br /&gt;
| Analoger Temperatursensor&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=LM335 PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TSIC306 TSIC306]&lt;br /&gt;
| 6&lt;br /&gt;
| Digitaler Temperatursensor (auch analog oder ratiometrisch)&lt;br /&gt;
| R,C&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q=TSIC306 PDF]&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/TSIC506 TSIC506]&lt;br /&gt;
| 6&lt;br /&gt;
| Digitaler Temperatursensor (fertig kalibriert bis zu 0,1K zwischen 0-45°C)&lt;br /&gt;
| F&lt;br /&gt;
| [http://www.zmd.de/pdf/ZMD%20TSic%20Data%20Sheet%20V3%207.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wenn man z.&amp;amp;nbsp;B. einen Übertemperaturschutz bauen will, bei der es nur eine Schaltschwelle gibt, dann empfiehlt sich die Verwendung eines NTCs. Dessen Kennlinie ist gegenüber den Kennlinien von z.&amp;amp;nbsp;B. LM335 dahingehend im Vorteil, dass eine geringe Temperaturänderung besser messbar ist. Eine detailliertere Übersicht findet sich im Artikel [[Temperatursensor]]en, andere Sensoren sind in der [[:Category:Sensorik|Kategorie Sensorik]] zu finden.&lt;br /&gt;
&lt;br /&gt;
= Passive Bauelemente =&lt;br /&gt;
== Sensoren (passiv)==&lt;br /&gt;
=== Licht ===&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BPX65 BPX65]&lt;br /&gt;
| 4,25&lt;br /&gt;
| Fotodiode 10µA, 350-1000nm&lt;br /&gt;
| schnelle Lichtmessungen (bis MHz Bereich), großer Wellenlängenbereich&lt;br /&gt;
| R&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BPW34 BPW34]&lt;br /&gt;
| 0,59&lt;br /&gt;
| Fotodiode 80µA, 400-1100nm&lt;br /&gt;
| großer Wellenlängenbereich, Low Cost model, große Verfügbarkeit&lt;br /&gt;
| R&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/BPW21 BPW21]&lt;br /&gt;
| 5,25&lt;br /&gt;
| Fotodiode 10µA, 550nm&lt;br /&gt;
| Lichtspektrum des menschlichen Auges&lt;br /&gt;
| R&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== [[Temperatursensor|Temperatur]] ===&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/KTY81 KTY81]&lt;br /&gt;
| ~0,50&lt;br /&gt;
| nichtlinear(*), bis 150°C&lt;br /&gt;
| in &amp;amp;#956;C Schaltungen&lt;br /&gt;
| R, D&lt;br /&gt;
| [http://www.semiconductors.philips.com/acrobat/datasheets/KTY84_SERIES_5.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/KTY84 KTY84]&lt;br /&gt;
| 0,72&lt;br /&gt;
| nichtlinear(*), bis 300°C&lt;br /&gt;
| in &amp;amp;#956;C Schaltungen&lt;br /&gt;
| R&lt;br /&gt;
| [http://www.datasheetcatalog.org/datasheet2/e/0l2lc3p1dl8e5dgghsfh2oee43py.pdf PDF]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mikrocontroller.net/part/PT100 Pt100] / [http://www.mikrocontroller.net/part/PT1000 Pt1000]&lt;br /&gt;
| ab 3,00&lt;br /&gt;
| lineare Kennlinie&lt;br /&gt;
| analoge Messschaltungen&lt;br /&gt;
| F C R&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(*) Verschaltet man den Sensor als Spannungsteiler (Abgriff an den ADC), so erhält man dadurch eine meist ausreichende Linearisierung!&lt;br /&gt;
&lt;br /&gt;
== Widerstände ==&lt;br /&gt;
Mit einem Widerstandssortiment, welches die E12-Werte enthält, kann man normalerweise nicht falsch liegen. Denn früher oder später benötigt man jeden Widerstandswert der E12-Reihe einmal. Für einen Einstieg eignen sich die Sortimente vom Pollin. Auch ein Blick in Ebay kann sich lohnen, um ein Einstiegssortiment zu bekommen. Wer Schaltungen an Netzspannung entwickelt, sollte auf die &#039;&#039;Operation Voltage&#039;&#039; achten, denn nicht alle Typen weisen die nötige Spannungsfestigkeit auf. Als Daumenregel gilt: &amp;amp;frac12;-Watt-Widerstände oder größer passen immer, zwei bis drei in Reihe geschaltete &amp;amp;frac14;-Watt-Widerständen tun es auch.&lt;br /&gt;
&lt;br /&gt;
== Kondensatoren ==&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| 100nF Keramik&lt;br /&gt;
| ~0.05&lt;br /&gt;
| &lt;br /&gt;
| [[Kondensator#Entkoppelkondensator | Abblockkondensator]] zwischen VCC und GND vor allem bei Digital-ICs &lt;br /&gt;
| alle&lt;br /&gt;
| [http://www.datasheetarchive.com/search.php?q= PDF]&lt;br /&gt;
|-&lt;br /&gt;
| 100nF Keramik SMD 0603&lt;br /&gt;
| ~0.01 (bei 100 Stück)&lt;br /&gt;
| SMD 0603&lt;br /&gt;
| [[Kondensator#Entkoppelkondensator | Abblockkondensator]] zwischen VCC und GND vor allem bei Digital-ICs&lt;br /&gt;
| D&lt;br /&gt;
| [http://www.google.de/search?num=100&amp;amp;hl=de&amp;amp;q=datasheet+0603+chip-capacitors+filetype%3Apdf&amp;amp;btnG=Suche&amp;amp;meta=lr%3Dlang_de%7Clang_en PDF]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Mechanische Bauelemente =&lt;br /&gt;
&lt;br /&gt;
== Taster / Schalter ==&lt;br /&gt;
&lt;br /&gt;
== Steckverbinder ==&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Preis (&amp;amp;euro;)&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Anwendungen&lt;br /&gt;
! Lieferant&lt;br /&gt;
! Datenblatt&lt;br /&gt;
|-&lt;br /&gt;
| WSL 10G&lt;br /&gt;
| 0,07&lt;br /&gt;
| Wannenstecker, 10-polig, gerade, Raster 2,54 mm&lt;br /&gt;
| Verbindung zwischen zwei Platinen mit Flachbandkabel&lt;br /&gt;
| R, alle&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| PFL 10&lt;br /&gt;
| 0,09&lt;br /&gt;
| Pfostenleiste, 10-polig, Schneidklemmtechnik, Raster 2,54 mm&lt;br /&gt;
| Verbindung zwischen zwei Platinen mit Flachbandkabel&lt;br /&gt;
| R,alle&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| AWG 28-10G&lt;br /&gt;
| 0,70€/m&lt;br /&gt;
| Flachbandkabel, 10-polig, 3 Meter, Raster 1,27 mm&lt;br /&gt;
| Verbindung zwischen zwei Platinen mit Flachbandkabel&lt;br /&gt;
| R,alle&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| D-SUB BU 09FB&lt;br /&gt;
| 0,50&lt;br /&gt;
| D-Sub 9-polig auf 10-polig Pfostenleiste mit Flachbandkabel&lt;br /&gt;
| Anschluss für serielle Schnittstelle am PC&lt;br /&gt;
| R&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| KKxx025C&lt;br /&gt;
| 0,35 - 1,20&lt;br /&gt;
| Flachkabel-IC-Sockelverbinder, xx-polig (08, 14, 16, 18, 20, 28 erhältlich)&lt;br /&gt;
| Übergang von Leiterplatte auf Steckbrett&lt;br /&gt;
| R&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| Anreihklemmen&lt;br /&gt;
| 0,30 &lt;br /&gt;
| Reihenklemme/Anreihklemme (verschieden Typen, für Lochraster: Raster 5.08)&lt;br /&gt;
| Anschluss der Spannungsversorung, leistungsstarke Verbraucher&lt;br /&gt;
| alle&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 0,30&lt;br /&gt;
| Hohlstecker/DC-Stecker&lt;br /&gt;
| siehe englische Wikipedia [http://en.wikipedia.org/wiki/Coaxial_power_connector Coaxial power connector] &lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Lieferanten =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lokale Lieferanten: [[Lokale Anbieter]]&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Allgemeine Lieferantenliste: [[Elektronikversender]]&amp;lt;br&amp;gt;&lt;br /&gt;
Metallteile/Mechanik Lieferantenliste: [[Eisenwarenversender]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| {{Tabelle}} class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;opamps&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
! Kürzel&lt;br /&gt;
! Name&lt;br /&gt;
! Webseite&lt;br /&gt;
! Kommentar&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;b&amp;gt;B&amp;lt;/b&amp;gt;&lt;br /&gt;
|Bürklin&lt;br /&gt;
|[http://www.buerklin.de www.buerklin.de]&lt;br /&gt;
|Ladengeschäft in München&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;b&amp;gt;C&amp;lt;/b&amp;gt;&lt;br /&gt;
|Conrad&lt;br /&gt;
|[http://www.conrad.de www.conrad.de]&lt;br /&gt;
|Gigantisches Sortiment, aber sehr hohe Preise. Nur zu empfehlen, wenn die benötigten Teile nirgendwo anders aufzutreiben sind. Trotzdem kann man auch hier gelegentlich ein Schnäppchen machen. Filialen haben nicht alle Katalogartikel auf Lager&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;b&amp;gt;D&amp;lt;/b&amp;gt;&lt;br /&gt;
|CSD-Electronics&lt;br /&gt;
|[http://www.csd-electronics.de www.csd-electronics.de]&lt;br /&gt;
|Kleiner Shop mit überschaubarem Sortiment und akzeptablen Preisen.&amp;lt;br /&amp;gt;Ladengeschäft in Bonn&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;b&amp;gt;DK&amp;lt;/b&amp;gt;&lt;br /&gt;
|Digikey&lt;br /&gt;
|[http://de.digikey.com www.de.digikey.com]&lt;br /&gt;
|Mindestbestellmenge von 65€, sonst 18€ Versandkosten&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;b&amp;gt;F&amp;lt;/b&amp;gt;&lt;br /&gt;
|Farnell&lt;br /&gt;
|[http://www.farnell.de www.farnell.de]&lt;br /&gt;
|Versand nur Firmen &amp;amp; Studenten.  Farnell-Zwischenhändler für Privatkunden: HBE-Shop [http://www.hbe-shop.de] (wenn Ware im Shop nicht gelistet, einfach Farnell-Bestellnummer eingeben)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;b&amp;gt;I&amp;lt;/b&amp;gt;&lt;br /&gt;
|IT-WNS&lt;br /&gt;
|[http://www.it-wns.de www.it-wns.de]&lt;br /&gt;
|Kein Mindestbestellwert, geringe Versandkosten ab 1,90;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;b&amp;gt;M&amp;lt;/b&amp;gt;&lt;br /&gt;
|Meilhaus&lt;br /&gt;
|[http://www.meilhaus.de www.meilhaus.de]&lt;br /&gt;
|Nur gewerbliche Kunden&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;b&amp;gt;P&amp;lt;/b&amp;gt;&lt;br /&gt;
|Pollin&lt;br /&gt;
|[http://www.pollin.de www.pollin.de]&lt;br /&gt;
|Hier finden sich viele Schnäppchen und Industrierestposten&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;b&amp;gt;U&amp;lt;/b&amp;gt;&lt;br /&gt;
|Mouser&lt;br /&gt;
|[http://www.mouser.com www.mouser.com]&lt;br /&gt;
| 20€ Versand, ab 65€ Versandkostenfrei. Großes Sortiment und meist die niedrigsten Preise wenn man größere Stückzahlen benötigt.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;b&amp;gt;R&amp;lt;/b&amp;gt;&lt;br /&gt;
|Reichelt&lt;br /&gt;
|[http://www.reichelt.de www.reichelt.de]&lt;br /&gt;
| Mindestbestellmenge von 10€, sonst Zuschlag von 3€, 5,60€ Versand, großes Sortiment und meist gute Preise&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Bauteile| ]]&lt;br /&gt;
[[Kategorie:Lieferanten]]&lt;br /&gt;
[[Kategorie:Liste mit Bauteilen]]&lt;/div&gt;</summary>
		<author><name>Max5v</name></author>
	</entry>
</feed>