<?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=Rotoe</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=Rotoe"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Rotoe"/>
	<updated>2026-04-16T06:24:37Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=59037</id>
		<title>Benutzer:Rotoe</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=59037"/>
		<updated>2011-07-29T13:40:32Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: Die Seite wurde geleert.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=52867</id>
		<title>Benutzer:Rotoe</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=52867"/>
		<updated>2010-11-20T19:56:31Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Wunschliste */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Robin Tönniges - ICQ: 216193451=&lt;br /&gt;
&lt;br /&gt;
== Persönliche Daten ==&lt;br /&gt;
Name: Robin Tönniges&amp;lt;br/&amp;gt;&lt;br /&gt;
Alter: 19&amp;lt;br/&amp;gt;&lt;br /&gt;
Geburtsdatum: 07.07.1991&amp;lt;br/&amp;gt;&lt;br /&gt;
Ausbildung seit 01.09.08 als EAT bei K+S&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hobby-Werdegang ==&lt;br /&gt;
Ich bin seit 2002 begeisterter Hobbyelektroniker und habe mich sei dem&lt;br /&gt;
durch das Internet und ein paar gute Bekannte fortgebildet. Unterwegs bin ich auch auf den Modellflug gestoßen was mt meinen Hobby natürlich perfekt harmoniert.&lt;br /&gt;
Seit dem habe ich gelernt AVR&#039;s in C zu programmieren kenne die wichtigesten Grundlagen, Formeln und el. Bauteile.&lt;br /&gt;
&lt;br /&gt;
== Vorhaben ==&lt;br /&gt;
Ich möchte FPGA&#039;s programmieren lernen. Weiß nicht warum. Auf jedefall ist es irgendwie reizvoll. Aber erstmal muss ich AVR-C richtig beherrschen bevor ich was Neues anfange.&lt;br /&gt;
&lt;br /&gt;
== Letze Errungenschaften ==&lt;br /&gt;
* STK600 (2008)&lt;br /&gt;
* Parkzone T-28 Trojan (2008)&lt;br /&gt;
* Digitalkamera Casio EX-Z12 (2008)&lt;br /&gt;
* STK500 (04.04.2008)&lt;br /&gt;
* HAMEG HM-605 (2002)&lt;br /&gt;
* Bosch SPS CL200 (2009)&lt;br /&gt;
&lt;br /&gt;
== Wunschliste ==&lt;br /&gt;
* Digitales Speicher Oszilloskop&lt;br /&gt;
&lt;br /&gt;
== Bisher gebaute Sachen ==&lt;br /&gt;
* NiCd/NiMh Ladegerät&lt;br /&gt;
* RC-Multitester&lt;br /&gt;
* Akkutester mit einstellbarer Zellenzahl und Grafikdisplay&lt;br /&gt;
* LC-Meter&lt;br /&gt;
* 1-30V 0-3A Netzteil&lt;br /&gt;
* 5W Röhrenoszillator&lt;br /&gt;
* ATmega8 Experimentierplatine&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Atmega32_Experimentierplatine ATmega32 Experimentierplatine]&lt;br /&gt;
* Mini-Multimeter&lt;br /&gt;
* PC-Akkutester&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=52866</id>
		<title>Benutzer:Rotoe</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=52866"/>
		<updated>2010-11-20T19:56:18Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Letze Errungenschaften */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Robin Tönniges - ICQ: 216193451=&lt;br /&gt;
&lt;br /&gt;
== Persönliche Daten ==&lt;br /&gt;
Name: Robin Tönniges&amp;lt;br/&amp;gt;&lt;br /&gt;
Alter: 19&amp;lt;br/&amp;gt;&lt;br /&gt;
Geburtsdatum: 07.07.1991&amp;lt;br/&amp;gt;&lt;br /&gt;
Ausbildung seit 01.09.08 als EAT bei K+S&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hobby-Werdegang ==&lt;br /&gt;
Ich bin seit 2002 begeisterter Hobbyelektroniker und habe mich sei dem&lt;br /&gt;
durch das Internet und ein paar gute Bekannte fortgebildet. Unterwegs bin ich auch auf den Modellflug gestoßen was mt meinen Hobby natürlich perfekt harmoniert.&lt;br /&gt;
Seit dem habe ich gelernt AVR&#039;s in C zu programmieren kenne die wichtigesten Grundlagen, Formeln und el. Bauteile.&lt;br /&gt;
&lt;br /&gt;
== Vorhaben ==&lt;br /&gt;
Ich möchte FPGA&#039;s programmieren lernen. Weiß nicht warum. Auf jedefall ist es irgendwie reizvoll. Aber erstmal muss ich AVR-C richtig beherrschen bevor ich was Neues anfange.&lt;br /&gt;
&lt;br /&gt;
== Letze Errungenschaften ==&lt;br /&gt;
* STK600 (2008)&lt;br /&gt;
* Parkzone T-28 Trojan (2008)&lt;br /&gt;
* Digitalkamera Casio EX-Z12 (2008)&lt;br /&gt;
* STK500 (04.04.2008)&lt;br /&gt;
* HAMEG HM-605 (2002)&lt;br /&gt;
* Bosch SPS CL200 (2009)&lt;br /&gt;
&lt;br /&gt;
== Wunschliste ==&lt;br /&gt;
* Tablet PC&lt;br /&gt;
* Digitales Speicher Oszilloskop&lt;br /&gt;
&lt;br /&gt;
== Bisher gebaute Sachen ==&lt;br /&gt;
* NiCd/NiMh Ladegerät&lt;br /&gt;
* RC-Multitester&lt;br /&gt;
* Akkutester mit einstellbarer Zellenzahl und Grafikdisplay&lt;br /&gt;
* LC-Meter&lt;br /&gt;
* 1-30V 0-3A Netzteil&lt;br /&gt;
* 5W Röhrenoszillator&lt;br /&gt;
* ATmega8 Experimentierplatine&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Atmega32_Experimentierplatine ATmega32 Experimentierplatine]&lt;br /&gt;
* Mini-Multimeter&lt;br /&gt;
* PC-Akkutester&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=52865</id>
		<title>Benutzer:Rotoe</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=52865"/>
		<updated>2010-11-20T19:55:49Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Persönliche Daten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Robin Tönniges - ICQ: 216193451=&lt;br /&gt;
&lt;br /&gt;
== Persönliche Daten ==&lt;br /&gt;
Name: Robin Tönniges&amp;lt;br/&amp;gt;&lt;br /&gt;
Alter: 19&amp;lt;br/&amp;gt;&lt;br /&gt;
Geburtsdatum: 07.07.1991&amp;lt;br/&amp;gt;&lt;br /&gt;
Ausbildung seit 01.09.08 als EAT bei K+S&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hobby-Werdegang ==&lt;br /&gt;
Ich bin seit 2002 begeisterter Hobbyelektroniker und habe mich sei dem&lt;br /&gt;
durch das Internet und ein paar gute Bekannte fortgebildet. Unterwegs bin ich auch auf den Modellflug gestoßen was mt meinen Hobby natürlich perfekt harmoniert.&lt;br /&gt;
Seit dem habe ich gelernt AVR&#039;s in C zu programmieren kenne die wichtigesten Grundlagen, Formeln und el. Bauteile.&lt;br /&gt;
&lt;br /&gt;
== Vorhaben ==&lt;br /&gt;
Ich möchte FPGA&#039;s programmieren lernen. Weiß nicht warum. Auf jedefall ist es irgendwie reizvoll. Aber erstmal muss ich AVR-C richtig beherrschen bevor ich was Neues anfange.&lt;br /&gt;
&lt;br /&gt;
== Letze Errungenschaften ==&lt;br /&gt;
* STK600 (2008)&lt;br /&gt;
* Parkzone T-28 Trojan (2008)&lt;br /&gt;
* Digitalkamera Casio EX-Z12 (2008)&lt;br /&gt;
* STK500 (04.04.2008)&lt;br /&gt;
* HAMEG HM-605 (2002)&lt;br /&gt;
* Bosch SPS CL200 (2009&lt;br /&gt;
&lt;br /&gt;
== Wunschliste ==&lt;br /&gt;
* Tablet PC&lt;br /&gt;
* Digitales Speicher Oszilloskop&lt;br /&gt;
&lt;br /&gt;
== Bisher gebaute Sachen ==&lt;br /&gt;
* NiCd/NiMh Ladegerät&lt;br /&gt;
* RC-Multitester&lt;br /&gt;
* Akkutester mit einstellbarer Zellenzahl und Grafikdisplay&lt;br /&gt;
* LC-Meter&lt;br /&gt;
* 1-30V 0-3A Netzteil&lt;br /&gt;
* 5W Röhrenoszillator&lt;br /&gt;
* ATmega8 Experimentierplatine&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Atmega32_Experimentierplatine ATmega32 Experimentierplatine]&lt;br /&gt;
* Mini-Multimeter&lt;br /&gt;
* PC-Akkutester&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=40360</id>
		<title>Benutzer:Rotoe</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=40360"/>
		<updated>2009-11-01T16:47:36Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Letze Errungenschaften */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Robin Tönniges - ICQ: 216193451=&lt;br /&gt;
&lt;br /&gt;
== Persönliche Daten ==&lt;br /&gt;
Name: Robin Tönniges&amp;lt;br/&amp;gt;&lt;br /&gt;
Alter: 18&amp;lt;br/&amp;gt;&lt;br /&gt;
Geburtsdatum: 07.07.1991&amp;lt;br/&amp;gt;&lt;br /&gt;
Ausbildung seit 01.09.08 als EAT bei K+S&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hobby-Werdegang ==&lt;br /&gt;
Ich bin seit 2002 begeisterter Hobbyelektroniker und habe mich sei dem&lt;br /&gt;
durch das Internet und ein paar gute Bekannte fortgebildet. Unterwegs bin ich auch auf den Modellflug gestoßen was mt meinen Hobby natürlich perfekt harmoniert.&lt;br /&gt;
Seit dem habe ich gelernt AVR&#039;s in C zu programmieren kenne die wichtigesten Grundlagen, Formeln und el. Bauteile.&lt;br /&gt;
&lt;br /&gt;
== Vorhaben ==&lt;br /&gt;
Ich möchte FPGA&#039;s programmieren lernen. Weiß nicht warum. Auf jedefall ist es irgendwie reizvoll. Aber erstmal muss ich AVR-C richtig beherrschen bevor ich was Neues anfange.&lt;br /&gt;
&lt;br /&gt;
== Letze Errungenschaften ==&lt;br /&gt;
* STK600 (2008)&lt;br /&gt;
* Parkzone T-28 Trojan (2008)&lt;br /&gt;
* Digitalkamera Casio EX-Z12 (2008)&lt;br /&gt;
* STK500 (04.04.2008)&lt;br /&gt;
* HAMEG HM-605 (2002)&lt;br /&gt;
* Bosch SPS CL200 (2009&lt;br /&gt;
&lt;br /&gt;
== Wunschliste ==&lt;br /&gt;
* Tablet PC&lt;br /&gt;
* Digitales Speicher Oszilloskop&lt;br /&gt;
&lt;br /&gt;
== Bisher gebaute Sachen ==&lt;br /&gt;
* NiCd/NiMh Ladegerät&lt;br /&gt;
* RC-Multitester&lt;br /&gt;
* Akkutester mit einstellbarer Zellenzahl und Grafikdisplay&lt;br /&gt;
* LC-Meter&lt;br /&gt;
* 1-30V 0-3A Netzteil&lt;br /&gt;
* 5W Röhrenoszillator&lt;br /&gt;
* ATmega8 Experimentierplatine&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Atmega32_Experimentierplatine ATmega32 Experimentierplatine]&lt;br /&gt;
* Mini-Multimeter&lt;br /&gt;
* PC-Akkutester&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=40359</id>
		<title>Benutzer:Rotoe</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=40359"/>
		<updated>2009-11-01T16:46:57Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Persönliche Daten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Robin Tönniges - ICQ: 216193451=&lt;br /&gt;
&lt;br /&gt;
== Persönliche Daten ==&lt;br /&gt;
Name: Robin Tönniges&amp;lt;br/&amp;gt;&lt;br /&gt;
Alter: 18&amp;lt;br/&amp;gt;&lt;br /&gt;
Geburtsdatum: 07.07.1991&amp;lt;br/&amp;gt;&lt;br /&gt;
Ausbildung seit 01.09.08 als EAT bei K+S&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hobby-Werdegang ==&lt;br /&gt;
Ich bin seit 2002 begeisterter Hobbyelektroniker und habe mich sei dem&lt;br /&gt;
durch das Internet und ein paar gute Bekannte fortgebildet. Unterwegs bin ich auch auf den Modellflug gestoßen was mt meinen Hobby natürlich perfekt harmoniert.&lt;br /&gt;
Seit dem habe ich gelernt AVR&#039;s in C zu programmieren kenne die wichtigesten Grundlagen, Formeln und el. Bauteile.&lt;br /&gt;
&lt;br /&gt;
== Vorhaben ==&lt;br /&gt;
Ich möchte FPGA&#039;s programmieren lernen. Weiß nicht warum. Auf jedefall ist es irgendwie reizvoll. Aber erstmal muss ich AVR-C richtig beherrschen bevor ich was Neues anfange.&lt;br /&gt;
&lt;br /&gt;
== Letze Errungenschaften ==&lt;br /&gt;
* STK600 (10.10.08)&lt;br /&gt;
* Parkzone T-28 Trojan (06.06.08)&lt;br /&gt;
* Digitalkamera Casio EX-Z12 (06.05.2008)&lt;br /&gt;
* STK500 (04.04.2008)&lt;br /&gt;
* HAMEG HM-605 (2002)&lt;br /&gt;
&lt;br /&gt;
== Wunschliste ==&lt;br /&gt;
* Tablet PC&lt;br /&gt;
* Digitales Speicher Oszilloskop&lt;br /&gt;
&lt;br /&gt;
== Bisher gebaute Sachen ==&lt;br /&gt;
* NiCd/NiMh Ladegerät&lt;br /&gt;
* RC-Multitester&lt;br /&gt;
* Akkutester mit einstellbarer Zellenzahl und Grafikdisplay&lt;br /&gt;
* LC-Meter&lt;br /&gt;
* 1-30V 0-3A Netzteil&lt;br /&gt;
* 5W Röhrenoszillator&lt;br /&gt;
* ATmega8 Experimentierplatine&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Atmega32_Experimentierplatine ATmega32 Experimentierplatine]&lt;br /&gt;
* Mini-Multimeter&lt;br /&gt;
* PC-Akkutester&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Speicher&amp;diff=39617</id>
		<title>AVR-Tutorial: Speicher</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Speicher&amp;diff=39617"/>
		<updated>2009-10-04T13:35:31Z</updated>

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

		<summary type="html">&lt;p&gt;Rotoe: /* Benutzerdefinierten Zeichen */&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.B. KS0070) und haben 14 oder 16 Pins. Die Pinbelegung ist praktisch immer gleich: &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; |  Vss&lt;br /&gt;
||  GND&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  2&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  Vcc&lt;br /&gt;
||  5V&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  3&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  Vee&lt;br /&gt;
||  Kontrastspannung (0V bis 5V)&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 (Befehl/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;
||  Read/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;
||  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, 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, Kathode&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 neben Pin 1 eine kleine 1 auf der LCD-Platine, ansonsten im Datenblatt nachschauen. &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;
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|framed|center| Gewinnung der Kontrastspannung]]&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.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 hier eine 4-Bit-Ansteuerung verwendet wird.&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. 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 verarbeitet hat. Ist RS auf Daten eingestellt, dann kann man z.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 LCD benötigt, können wir das LCD mit dem Mikrocontroller verbinden: &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 || Vss || GND&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |2 || Vcc || 5V&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |3 || Vee || GND oder [[Potentiometer | Poti]] &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 +5V anschließbar,&amp;lt;BR&amp;gt;nur über einen Vorwiderstand (z.B. 330&amp;amp;Omega;)!&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. Doch wie bekommt man jetzt die Befehle und Daten in das Display?&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;avrasm&amp;gt;&lt;br /&gt;
           swap r16               ; vertauscht die beiden Nibbles von r16&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aus 0b00100101 wird so z.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;avrasm&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;/avrasm&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 Bit 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;avrasm&amp;gt;&lt;br /&gt;
           sbr r16, 0b00010000     ; Bit 4 setzen, alle anderen Bits bleiben gleich&lt;br /&gt;
&amp;lt;/avrasm&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;avrasm&amp;gt;&lt;br /&gt;
           out PORTD, r16&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Natürlich muss vorher der Port D auf Ausgang geschalten 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: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&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;/avrasm&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.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 im 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 umstellt&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;
=== Initialisierung im 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.&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 ==&lt;br /&gt;
&lt;br /&gt;
Die Routinen zur Kommunikation mit dem LCD sehen also so aus: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&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;
 &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                          ; 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:                              ; 50us 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  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;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anm.1: Siehe [[Bitmanipulation]]&lt;br /&gt;
&lt;br /&gt;
Weitere Funktionen (wie z.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. &lt;br /&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.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. &lt;br /&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.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;avrasm&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;
           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;/avrasm&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;avrasm&amp;gt;&lt;br /&gt;
           ldi temp1, &#039;T&#039;&lt;br /&gt;
&amp;lt;/avrasm&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;avrasm&amp;gt;&lt;br /&gt;
           ldi temp1, &#039;T&#039;&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
durch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
           ldi temp1, $54&lt;br /&gt;
&amp;lt;/avrasm&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 Kontroller 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. 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 5 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 32 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;
&lt;br /&gt;
RS  R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0&lt;br /&gt;
--- --- --- --- --- --- --- --- --- ---&lt;br /&gt;
 0   0   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:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&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;
 &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:                              ; 50us 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 Bot, 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;/avrasm&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.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.B. &#039;&#039;&#039;PORTB&#039;&#039;&#039; gelegt, dann genügt es, die Zeilen&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
.equ LCD_PORT = PORTD&lt;br /&gt;
.equ LCD_DDR  = DDRD&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
durch&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
.equ LCD_PORT = PORTB&lt;br /&gt;
.equ LCD_DDR  = DDRB&lt;br /&gt;
&amp;lt;/avrasm&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;avrasm&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;/avrasm&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;avrasm&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;/avrasm&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;avrasm&amp;gt;&lt;br /&gt;
delay50us:                              ; 50us 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;/avrasm&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;avrasm&amp;gt;&lt;br /&gt;
.equ XTAL  = 4000000&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
delay50us:                              ; 50us 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;/avrasm&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;avrasm&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;/avrasm&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 alo 1 + 603 + 1 + 2 = 607 Takte verbraucht. Da die äußere Schleife $21 = 33 mal wiederholt wird, werden 20031 Takte verbraucht. Bei 4Mhz benötigt der Prozessor 20031 / 4000000 = 0.005007 Sekunden, also 5 ms.&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. Auch diese Berechnung kann wieder der Assembler übernehmen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&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;/avrasm&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;
&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 holt und ausgibt. Dabei erhebt sich aber eine Fragestellung: Woher weiß die Funktion eigentlich, wie lange 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, 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;avrasm&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;/avrasm&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;avrasm&amp;gt;&lt;br /&gt;
           lpm   temp1, Z+&lt;br /&gt;
&amp;lt;/avrasm&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;avrasm&amp;gt;&lt;br /&gt;
           cpi   temp1, 0&lt;br /&gt;
           breq  lcd_flash_string_2&lt;br /&gt;
&amp;lt;/avrasm&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;avrasm&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;/avrasm&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;avrasm&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;/avrasm&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;avrasm&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;/avrasm&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;avrasm&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;/avrasm&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;avrasm&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 Konstante verwendet, 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;/avrasm&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;avrasm&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;/avrasm&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;avrasm&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;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Eine BCD Zahl ausgeben===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&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;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Benutzerdefinierten 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 benutz 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 5*8 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 Spalte in diesem Zeichen repräsentiert ein an das LCD zu übergebende Byte. Gesetzte Pixel stellen ein 1 Bit dar, nicht gesetzte Pixel sind ein 0-Bit. Das niedrigstwertige Bit einer Spalte befindet sich unten. Auf diese Art wird jede Spalte in eine Binärzahl übersetzt, und 5 Bytes repräsentieren ein komplettes Zeichen. Am Beispiel des Glockensymboles: Die 5 Bytes, welches das Symbol repräsentiern, lauten: 0x04 0x3C 0x46 0x3C 0x04&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 5 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 || 0x05&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 0x0A&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 0x0F&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 0x14&lt;br /&gt;
|-&lt;br /&gt;
| 5 || 0x19&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0x1E&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 0x23&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;avrasm&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;/avrasm&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;avrasm&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;/avrasm&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;avrasm&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;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
... und die Zeichendefinition:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&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;/avrasm&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;
{{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]]&lt;br /&gt;
[[Category:LCD]]&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=36241</id>
		<title>Benutzer:Rotoe</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=36241"/>
		<updated>2009-05-21T17:30:38Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Persönliche Daten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Robin Tönniges - ICQ: 216193451=&lt;br /&gt;
&lt;br /&gt;
== Persönliche Daten ==&lt;br /&gt;
Name: Robin Tönniges&amp;lt;br/&amp;gt;&lt;br /&gt;
Alter: 17&amp;lt;br/&amp;gt;&lt;br /&gt;
Geburtsdatum: 07.07.1991&amp;lt;br/&amp;gt;&lt;br /&gt;
Ausbildung seit 01.09.08 als EAT bei K+S&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hobby-Werdegang ==&lt;br /&gt;
Ich bin seit 2002 begeisterter Hobbyelektroniker und habe mich sei dem&lt;br /&gt;
durch das Internet und ein paar gute Bekannte fortgebildet. Unterwegs bin ich auch auf den Modellflug gestoßen was mt meinen Hobby natürlich perfekt harmoniert.&lt;br /&gt;
Seit dem habe ich gelernt AVR&#039;s in C zu programmieren kenne die wichtigesten Grundlagen, Formeln und el. Bauteile.&lt;br /&gt;
&lt;br /&gt;
== Vorhaben ==&lt;br /&gt;
Ich möchte FPGA&#039;s programmieren lernen. Weiß nicht warum. Auf jedefall ist es irgendwie reizvoll. Aber erstmal muss ich AVR-C richtig beherrschen bevor ich was Neues anfange.&lt;br /&gt;
&lt;br /&gt;
== Letze Errungenschaften ==&lt;br /&gt;
* STK600 (10.10.08)&lt;br /&gt;
* Parkzone T-28 Trojan (06.06.08)&lt;br /&gt;
* Digitalkamera Casio EX-Z12 (06.05.2008)&lt;br /&gt;
* STK500 (04.04.2008)&lt;br /&gt;
* HAMEG HM-605 (2002)&lt;br /&gt;
&lt;br /&gt;
== Wunschliste ==&lt;br /&gt;
* Tablet PC&lt;br /&gt;
* Digitales Speicher Oszilloskop&lt;br /&gt;
&lt;br /&gt;
== Bisher gebaute Sachen ==&lt;br /&gt;
* NiCd/NiMh Ladegerät&lt;br /&gt;
* RC-Multitester&lt;br /&gt;
* Akkutester mit einstellbarer Zellenzahl und Grafikdisplay&lt;br /&gt;
* LC-Meter&lt;br /&gt;
* 1-30V 0-3A Netzteil&lt;br /&gt;
* 5W Röhrenoszillator&lt;br /&gt;
* ATmega8 Experimentierplatine&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Atmega32_Experimentierplatine ATmega32 Experimentierplatine]&lt;br /&gt;
* Mini-Multimeter&lt;br /&gt;
* PC-Akkutester&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Wanderkiste&amp;diff=34097</id>
		<title>Wanderkiste</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Wanderkiste&amp;diff=34097"/>
		<updated>2009-01-31T16:22:17Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Kiste Venus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Worum geht es? ==&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;Große Wanderkiste elektronischer Bauteile&#039;&#039;&#039; erklärt Andreas Jakob in [http://www.mikrocontroller.net/topic/118816#1070509] so:&lt;br /&gt;
&lt;br /&gt;
Hallo Leute,&lt;br /&gt;
&lt;br /&gt;
durch diesen Beitrag :&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/topic/118752#1070168|Beitrag &amp;quot;Bauteile zu verschenken&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
bin ich auf die Idee gekommen, auch in Deutschland so ein Wanderkistenprojekt zu starten.&lt;br /&gt;
&lt;br /&gt;
http://hackaday.com/2008/06/27/the-great-internet-migratory-box-of-electronics-junk/&lt;br /&gt;
&lt;br /&gt;
Das Konzept :&lt;br /&gt;
&lt;br /&gt;
Jeder kann sich in einer Liste eintragen, und erhält dann irgendwann die &#039;&#039;&#039;Wanderkiste&#039;&#039;&#039; vom aktuellen Besitzer zugesandt. Du nimmst dir aus der Kiste raus, was du möchtest, und legst im Gegenzug einige Dinge hinein, die du nicht mehr benötigst, die aber für andere nützlich sein könnten. Dann suchst du dir aus der aktuellen Liste jemand aus, und sendest die Kiste weiter an ihn.&lt;br /&gt;
&lt;br /&gt;
So bekommt man für das Porto für ein Paket (z.B. bei Hermes 5.90€ für bis zu 25 KG) ein Überraschungspaket, und wird seine nicht mehr benötigten Bauteile, Platinen, Motoren, Lautsprecher, Geräte, Ausschlachtplatinen etc. etc. wirklich sinnvoll los. &lt;br /&gt;
&lt;br /&gt;
Im Paket gibt es ein Büchlein, das seinen Lebensweg dokumentiert. Jeder macht ein Foto, wie er die Kiste erhalten hat, und schreibt einen Eintrag in ein Weblog, wann er Sie an wen weitergeschickt hat.&lt;br /&gt;
&lt;br /&gt;
== Die RuleZ ==&lt;br /&gt;
&lt;br /&gt;
Sind im Konzept ganz gut erklärt. Wenn es Ergänzungen gibt, kommen die hierhin. &lt;br /&gt;
&lt;br /&gt;
Auf den Punkt gebracht :&lt;br /&gt;
&lt;br /&gt;
Für alles was ich mir aus der Kiste rausnehme, lege ich etwas &lt;br /&gt;
gleichwertig nützliches wieder hinein.&lt;br /&gt;
+&lt;br /&gt;
&lt;br /&gt;
Die aktuelle Entwicklung und Gedanken zur Wanderkiste kann man im Forum  [http://www.mikrocontroller.net/topic/118816] verfolgen und aktiv diskutieren. &lt;br /&gt;
&lt;br /&gt;
Knackig kurze Vorschläge, Anmerkungen usw. zu den RuleZ können auch auf [[Diskussion:Wanderkiste]] gemacht werden.&lt;br /&gt;
&lt;br /&gt;
== Ich will mitmachen! ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ich finde die Idee klasse und hoffentlich trägt mich einer in die Empfängerliste ein. Meine Kontaktdaten sind:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Username oder Email (ggf. Link zu eigenen Elektronikprojekten)&#039;&#039;&#039;&lt;br /&gt;
* hier Anhängen...&lt;br /&gt;
* Username:&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/agentbsik Agentbsik],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/cowz cowz], [http://www.mikrocontroller.net/user/show/djacme djacme], [http://www.mikrocontroller.net/user/show/stefan stefan], [http://www.mikrocontroller.net/user/show/biertrinker biertrinker], [http://www.mikrocontroller.net/user/show/theborg0815 Theborg0815]([http://www.grautier.com/ Grautier]), [http://www.mikrocontroller.net/user/show/Hotty Hotty] &lt;br /&gt;
([http://www.avrprojekte.de/ Hottys Projekte]),&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/nitram nitram],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/bastelator bastelator] ([http://www.bastelator.de/ Bastelators Basteleien]),&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/dr-robotnik dr-robotnik],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/rotoe rotoe],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/roquema roquema]&lt;br /&gt;
([http://www.ematronik.de.vu/ Ematronik]),&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/matthias00 matthias00],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/Lafkaschar Lafkaschar],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/Easter Easter],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/toybaer toybaer],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/toybaer Esko],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/maesto Maesto],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/andrer AndreR],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/Cyno Cyno],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/Warteschleife Warteschleife],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/fabs fabs],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/derelektroniker derelektroniker],[http://www.mikrocontroller.net/user/show/Pyro-Mike Pyro-Mike],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/juliano julian],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/Benedikt Benedikt],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/johanness johanness],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/netdieter netdieter],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/form form],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/crazor crazor],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/iller iller],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/tien Tien],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/hansilein hansilein], &lt;br /&gt;
[http://www.mikrocontroller.net/user/show/bastelwastel015 bastelwastel015 (b-heeger_AT_t-online.de)],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/fr4 fr4],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/Suelzle-frank Suelzle-frank]&lt;br /&gt;
&lt;br /&gt;
== Karte ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;googlemap version=&amp;quot;0.9&amp;quot; lat=&amp;quot;53.354135&amp;quot; lon=&amp;quot;10.634766&amp;quot; type=&amp;quot;map&amp;quot; zoom=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
6#B2758BC5&lt;br /&gt;
49.77812, 9.983752&lt;br /&gt;
52.23558, 8.169402, Kiste Merkur&lt;br /&gt;
&amp;lt;/googlemap&amp;gt;&lt;br /&gt;
== Fotos, Berichte, Links, ... zur Wanderkiste ==&lt;br /&gt;
&lt;br /&gt;
=== Kiste Merkur ===&lt;br /&gt;
&lt;br /&gt;
Wer diese Kiste haben möchte sollte sich bewusst sein, dass diese&lt;br /&gt;
sehr schwer ist (10-15 KG) !&lt;br /&gt;
&lt;br /&gt;
12.12.2008 - Ist fertig gepackt und wird am 13.12 an Dr. Robotnik&lt;br /&gt;
gesandt. Er wird sie mit einer seiner Kisten durchmischen,&lt;br /&gt;
um einen besseren Mix zu erhalten.&lt;br /&gt;
&lt;br /&gt;
13.12.2008 - Kiste wurde versandt, Trackingnummer wurde dem Empfänger mitgeteilt.&lt;br /&gt;
&lt;br /&gt;
20.12.2008 - Kiste endlich in Gerbrunn angekommen. Ich hab schon einige feine Sachen gefunden mit denen ich was anfangen kann. Werde berichten. dr-robotnik&lt;br /&gt;
&lt;br /&gt;
21.12.2008 - Ich habe jetzt einige Sachen herausgenommen und andere dafür hineingetan. Hier eine Übersicht:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Herausgenommen habe ich&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Bild:vorher.jpg|thumb|180px|right|Was dr-robotnik aus Kiste Merkur entnommen hat]]&lt;br /&gt;
&lt;br /&gt;
- ein altes EGA Display (vermutlich aus einer Kasse ?)&lt;br /&gt;
&lt;br /&gt;
- einen kleinen Ringkerntrafo 2x12V (darüber freue ich mich am meißten,&lt;br /&gt;
werde daraus ein kleines Doppelnetzteil bauen freu)&lt;br /&gt;
&lt;br /&gt;
- eine Biegehilfe für axial bedrahtete Bauteile&lt;br /&gt;
&lt;br /&gt;
- einen kleinen Alu-Kühlkörper (wird auch fürs Netzteil verwendet)&lt;br /&gt;
&lt;br /&gt;
- zwei ältere ISA Grafikkarten (daraus will ich den DAC rausholen, wird&lt;br /&gt;
verwendet für einen einfachen Testbildgenerator, an dem ich zur Zeit&lt;br /&gt;
bastle)&lt;br /&gt;
&lt;br /&gt;
- eine kleine Prototypen-Platine mit MAX232 Beschaltung (einfach toll!)&lt;br /&gt;
&lt;br /&gt;
- einen alten Gameboy (mal sehen, was daraus wird, vieleicht ein kleiner&lt;br /&gt;
Logic Analyzer ?)&lt;br /&gt;
&lt;br /&gt;
- Einen BlueTooth Adapter für Drucker mit Centronics-Schnittstelle&lt;br /&gt;
(Hoffentlich funktioniert er, mein neues Notebook hat keine parallele&lt;br /&gt;
Schnittstelle mehr, so kann ich wieder meinen LaserJet in Betrieb&lt;br /&gt;
nehmen)&lt;br /&gt;
&lt;br /&gt;
- Einige LSTTL Bausteine die ich gut gebrauchen kann&lt;br /&gt;
&lt;br /&gt;
- 10 Stk. kleine Taster mit Kappen&lt;br /&gt;
&lt;br /&gt;
- Einige Transistoren, ältere Typen&lt;br /&gt;
&lt;br /&gt;
- 5 Stk. Zenerdioden&lt;br /&gt;
&lt;br /&gt;
- 2 5Watt Widerstände&lt;br /&gt;
&lt;br /&gt;
- Einige Kondensatoren&lt;br /&gt;
&lt;br /&gt;
- Außerdem habe ich ein großes Stück Steckschaum gegen mehrere kleine&lt;br /&gt;
getauscht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hineingelegt habe ich&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:nachher.jpg|thumb|180px|right|Was dr-robotnik in Kiste Merkur hineingelegt hat]]&lt;br /&gt;
&lt;br /&gt;
- 2 Große Platinen aus einer Industriesteuerung (definitiv defekt, aber&lt;br /&gt;
mit vielen netten Bauteilen zum ausschlachten u.A. viele solid state&lt;br /&gt;
relais)&lt;br /&gt;
&lt;br /&gt;
- 2 große Lüfter aus einem Beamer&lt;br /&gt;
&lt;br /&gt;
- Eine schöne unbenutzte SMD-Prototypenplatine mit Lötstopplack&lt;br /&gt;
&lt;br /&gt;
- Ein TFT-Display aus einem Notebook&lt;br /&gt;
&lt;br /&gt;
- Ein kleiner Alu-Kühlkörper&lt;br /&gt;
&lt;br /&gt;
- Ein Antrieb aus einem Flachbettscanner mit Schrittmotor&lt;br /&gt;
&lt;br /&gt;
- Einige verschiedene Schrittmotoren&lt;br /&gt;
&lt;br /&gt;
- Noch ein kleiner Lüfter&lt;br /&gt;
&lt;br /&gt;
- Mehrere Si-Dioden und jede Menge 9,1V Zener&lt;br /&gt;
&lt;br /&gt;
- Einige verschiedene Transistoren&lt;br /&gt;
&lt;br /&gt;
- Eine kleine zweistellige Siebensegmentanzeige, rot&lt;br /&gt;
&lt;br /&gt;
- Drei Hub- äh.. Zugmagneten (wie heißen die Dinger richtig?)&lt;br /&gt;
&lt;br /&gt;
- Zwei 16Bit ADCs von Burr Brown und ein Sample/Hold-Baustein von&lt;br /&gt;
ANALOGIC&lt;br /&gt;
&lt;br /&gt;
- Ein kleines Gehäuse mit eingefräster Durchführung für Flachbandkabel&lt;br /&gt;
(vieleicht brauchbar für einen kleinen PC-Logic Analyzer?)&lt;br /&gt;
&lt;br /&gt;
- Einige Abblock-Kerkos&lt;br /&gt;
&lt;br /&gt;
- Eine Drehpotentiometer-Skala zum aufkleben auf die Frontplatte&lt;br /&gt;
&lt;br /&gt;
- Einige Steckverbinder und BNC-Buchsen&lt;br /&gt;
&lt;br /&gt;
- Eine Hand voll verschiedene Quarze&lt;br /&gt;
&lt;br /&gt;
- Zwei Hartmetallbohrer (ich glaube 0,3mm hab aber nicht nachgemessen)&lt;br /&gt;
&lt;br /&gt;
- und ein Modellbau-Tipps Buch von Proxxon&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
22.12.2008 Die Kiste geht weiter an Tim Hotfilter (Hotty) nach Bissendorf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ist am 24.12 Bei mir (Tim Hotfilter) angekommen!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sachen die ich aus der Kiste nahm: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- ICs, Transistoren, Widerstände und Kondensatoren&lt;br /&gt;
&lt;br /&gt;
- 3 LCDs&lt;br /&gt;
&lt;br /&gt;
- Schrittmotoren&lt;br /&gt;
&lt;br /&gt;
- SMD Adapterplatienen&lt;br /&gt;
&lt;br /&gt;
- vieles Mehr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sachen die ich in die Kiste tat:&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
- Etliche Platienen (6 Eurokarten aus einen Ansagegerät, LED-Matrix aus einem Bus, Steuerung aus einem Bus (viele Taster mit beleuchtung + LCD) etc...)&lt;br /&gt;
&lt;br /&gt;
- 1 LCD (2x24 sehr große Zeichen 9mm)&lt;br /&gt;
&lt;br /&gt;
- 1 SLM1608 LED-Matrix Modul (RG 16x16)&lt;br /&gt;
&lt;br /&gt;
- Kondensatoren und Kühlkörper&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Venus1a.jpg|thumb|180px|right|Wanderkiste Venus (CD-Spindel zum &lt;br /&gt;
Grössenvergleich)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
29.12.08 Weiter geschickt an Sascha Berkenkamp (Delmenhorst)&lt;br /&gt;
&lt;br /&gt;
=== Kiste Venus ===&lt;br /&gt;
&lt;br /&gt;
Wer diese Kiste haben möchte sollte sich bewusst sein, dass diese&lt;br /&gt;
sehr schwer ist (&lt;br /&gt;
&#039;&#039;&#039;derzeit über 20 KG&#039;&#039;&#039; ) !&lt;br /&gt;
&lt;br /&gt;
12.12.2008 - Ist fertig gepackt, und wird am 13.12. an Stefan versandt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Venus1b.jpg|thumb|180px|right|Wanderkiste Venus offen]]&lt;br /&gt;
13.12.2008 - Kiste wurde versandt, Trackingnummer wurde dem Empfänger mitgeteilt.&lt;br /&gt;
&lt;br /&gt;
15 kg Kiste angekommen. [[Benutzer:Stefan|Stefan]] 18:17, 17. Dez. 2008 (CET). Die Kiste wiegt jetzt 16.5 kg und ist seit heute auf dem Weg zu bastelator (Dirk). [[Benutzer:Stefan|Stefan]] 14:44, 20. Dez. 2008 (CET). Infos zum &lt;br /&gt;
[http://www.mikrocontroller.net/topic/118816#1106912 DIGISOUND F/SK 44GB] in der Kiste.&lt;br /&gt;
&lt;br /&gt;
16,5kg-Kiste ist angekommen [[Benutzer:Bastelator|Bastelator]]. Auf den ersten Blick gigantisch! Weitere Neuigkeiten folgen, wenn die komplette Sichtung erfolgt ist. 21:12, 23. Dez. 2008 (CET)&lt;br /&gt;
&lt;br /&gt;
05.01.2009, 10:16:51 - Die Kiste ist bei mir ([http://www.mikrocontroller.net/user/show/Benedikt Benedikt]) angekommen. Ich hoffe nur ich bekomme alle meine Sachen in die Kiste rein, die ist ja schon randvoll.&lt;br /&gt;
[[Bild:Venus4.jpg|thumb|180px|right|Foto der Wanderkiste Venus wie sie [http://www.mikrocontroller.net/user/show/Benedikt Benedikt] verlassen hat]]&lt;br /&gt;
Die Kiste geht diese Woche noch zu nitram. Momentanes Gewicht: etwa 19kg.&lt;br /&gt;
&lt;br /&gt;
10.01.2009 Die Kiste ist bei mir (nitram) angekommen!!! :-)&lt;br /&gt;
Allerdings liege ich derzeit mit einer Grippe im Bett...&lt;br /&gt;
Sobald es mir besser geht, geht die Kiste wieder auf Reise...&lt;br /&gt;
&lt;br /&gt;
16.01.2009 Die Kiste ist ist neu gepackt (mehr geht jetzt nicht mehr rein) und geht auf Reise zum &amp;quot;derelektroniker&amp;quot;&lt;br /&gt;
&lt;br /&gt;
19.01.2009 Kiste ist bei mit (derelektroniker) angekommen und wird nun an Robin Tönniges (rotoe) verschickt. Aktuell hat sie ein Gewicht von etwas über 20 Kilo.&lt;br /&gt;
&lt;br /&gt;
26.01.2009 Ich (rotoe) habe die Kiste Venus jetzt gezweiteilt weil es einfach zu voll wurde. Ich taufe die neue Kiste Pluto und werde jetzt beide Kisten weiterschicken. Habe schon zwei Leute angeschrieben. Wenn sie die Kisten haben möchten werde ich das hier schreiben.&lt;br /&gt;
&lt;br /&gt;
30.01.2009 Kiste ist nach Ema Tronik (roquema) unterwegs. Als Entschädigung fürs lange Warten ist die Kiste jetzt um ein STK500 erweitert worden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Venus5.jpg|thumb|180px|right|Foto der Wanderkiste Venus wie sie [http://www.mikrocontroller.net/user/show/derelektroniker derelektroniker] verlassen hat]]&lt;br /&gt;
&lt;br /&gt;
=== Kiste Erde ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:kisteErde.jpg|thumb|180px|right|Wanderkiste Erde, wie sie dr-robotnik verlassen hat]]&lt;br /&gt;
&lt;br /&gt;
Die Kiste Erde wurde von Dr. Robotnik eingerichtet und befüllt. Sie ist auf dem Weg zu User [http://www.mikrocontroller.net/user/show/toybaer toybaer].&lt;br /&gt;
&lt;br /&gt;
- die Kiste kam am 13.12. in Hameln an.&lt;br /&gt;
&lt;br /&gt;
- mit Urlaubsbeginn konnte endlich Plünderung und Auffüllen erfolgen, die Erde macht sich zwichen den Tagen auf den Weg nach Esslingen (juliano)&lt;br /&gt;
&lt;br /&gt;
- Angekommen (kurz vor Silvester 08/09)&lt;br /&gt;
&lt;br /&gt;
- am 13.01.09 in Wetter (Ruhr) angekommen&lt;br /&gt;
&lt;br /&gt;
=== Kiste Mars ===&lt;br /&gt;
&lt;br /&gt;
Wird nächste Woche von Dr. Robotnik gepackt und ist demnächst unterwegs zu User [http://www.mikrocontroller.net/user/show/esko Esko]&lt;br /&gt;
&lt;br /&gt;
=== Kiste NINA ===&lt;br /&gt;
&lt;br /&gt;
Die Wanderkiste &#039;&#039;&#039;Codename NINA&#039;&#039;&#039; Ist ursprünglich gedacht für User aus dem Roboternetz. Sie wird von [http://www.mikrocontroller.net/user/show/theborg0815 theborg0815] betreut. Die Webseite zum Eintragen als Empfänger und zur Dokumentation befindet sich auf http://www.grautier.com/wiki/doku.php?id=wanderkiste. Dort gibt es auch das 1. Foto des Inhalts einer solchen Kiste!&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.evilmadscientist.com/article.php/junkbox Evil Mad Scientist Laboratories]&lt;br /&gt;
* [http://www.avrprojekte.de/index.php?site=wanderkiste Wanderkistenseite von Hotty] &lt;br /&gt;
* &#039;&#039;&#039;[[Wanderkiste.at]]&#039;&#039;&#039; ist die entsprechende Seite für die &#039;&#039;&#039;Wanderkiste in Österreich&#039;&#039;&#039;.&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Spezial:Suche?ns2=1&amp;amp;search=&amp;amp;searchx=Suche Suche im Wiki nach Benutzer]&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte]]&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Wanderkiste&amp;diff=34096</id>
		<title>Wanderkiste</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Wanderkiste&amp;diff=34096"/>
		<updated>2009-01-31T16:22:03Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Kiste Venus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Worum geht es? ==&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;Große Wanderkiste elektronischer Bauteile&#039;&#039;&#039; erklärt Andreas Jakob in [http://www.mikrocontroller.net/topic/118816#1070509] so:&lt;br /&gt;
&lt;br /&gt;
Hallo Leute,&lt;br /&gt;
&lt;br /&gt;
durch diesen Beitrag :&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/topic/118752#1070168|Beitrag &amp;quot;Bauteile zu verschenken&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
bin ich auf die Idee gekommen, auch in Deutschland so ein Wanderkistenprojekt zu starten.&lt;br /&gt;
&lt;br /&gt;
http://hackaday.com/2008/06/27/the-great-internet-migratory-box-of-electronics-junk/&lt;br /&gt;
&lt;br /&gt;
Das Konzept :&lt;br /&gt;
&lt;br /&gt;
Jeder kann sich in einer Liste eintragen, und erhält dann irgendwann die &#039;&#039;&#039;Wanderkiste&#039;&#039;&#039; vom aktuellen Besitzer zugesandt. Du nimmst dir aus der Kiste raus, was du möchtest, und legst im Gegenzug einige Dinge hinein, die du nicht mehr benötigst, die aber für andere nützlich sein könnten. Dann suchst du dir aus der aktuellen Liste jemand aus, und sendest die Kiste weiter an ihn.&lt;br /&gt;
&lt;br /&gt;
So bekommt man für das Porto für ein Paket (z.B. bei Hermes 5.90€ für bis zu 25 KG) ein Überraschungspaket, und wird seine nicht mehr benötigten Bauteile, Platinen, Motoren, Lautsprecher, Geräte, Ausschlachtplatinen etc. etc. wirklich sinnvoll los. &lt;br /&gt;
&lt;br /&gt;
Im Paket gibt es ein Büchlein, das seinen Lebensweg dokumentiert. Jeder macht ein Foto, wie er die Kiste erhalten hat, und schreibt einen Eintrag in ein Weblog, wann er Sie an wen weitergeschickt hat.&lt;br /&gt;
&lt;br /&gt;
== Die RuleZ ==&lt;br /&gt;
&lt;br /&gt;
Sind im Konzept ganz gut erklärt. Wenn es Ergänzungen gibt, kommen die hierhin. &lt;br /&gt;
&lt;br /&gt;
Auf den Punkt gebracht :&lt;br /&gt;
&lt;br /&gt;
Für alles was ich mir aus der Kiste rausnehme, lege ich etwas &lt;br /&gt;
gleichwertig nützliches wieder hinein.&lt;br /&gt;
+&lt;br /&gt;
&lt;br /&gt;
Die aktuelle Entwicklung und Gedanken zur Wanderkiste kann man im Forum  [http://www.mikrocontroller.net/topic/118816] verfolgen und aktiv diskutieren. &lt;br /&gt;
&lt;br /&gt;
Knackig kurze Vorschläge, Anmerkungen usw. zu den RuleZ können auch auf [[Diskussion:Wanderkiste]] gemacht werden.&lt;br /&gt;
&lt;br /&gt;
== Ich will mitmachen! ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ich finde die Idee klasse und hoffentlich trägt mich einer in die Empfängerliste ein. Meine Kontaktdaten sind:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Username oder Email (ggf. Link zu eigenen Elektronikprojekten)&#039;&#039;&#039;&lt;br /&gt;
* hier Anhängen...&lt;br /&gt;
* Username:&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/agentbsik Agentbsik],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/cowz cowz], [http://www.mikrocontroller.net/user/show/djacme djacme], [http://www.mikrocontroller.net/user/show/stefan stefan], [http://www.mikrocontroller.net/user/show/biertrinker biertrinker], [http://www.mikrocontroller.net/user/show/theborg0815 Theborg0815]([http://www.grautier.com/ Grautier]), [http://www.mikrocontroller.net/user/show/Hotty Hotty] &lt;br /&gt;
([http://www.avrprojekte.de/ Hottys Projekte]),&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/nitram nitram],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/bastelator bastelator] ([http://www.bastelator.de/ Bastelators Basteleien]),&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/dr-robotnik dr-robotnik],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/rotoe rotoe],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/roquema roquema]&lt;br /&gt;
([http://www.ematronik.de.vu/ Ematronik]),&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/matthias00 matthias00],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/Lafkaschar Lafkaschar],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/Easter Easter],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/toybaer toybaer],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/toybaer Esko],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/maesto Maesto],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/andrer AndreR],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/Cyno Cyno],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/Warteschleife Warteschleife],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/fabs fabs],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/derelektroniker derelektroniker],[http://www.mikrocontroller.net/user/show/Pyro-Mike Pyro-Mike],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/juliano julian],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/Benedikt Benedikt],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/johanness johanness],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/netdieter netdieter],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/form form],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/crazor crazor],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/iller iller],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/tien Tien],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/hansilein hansilein], &lt;br /&gt;
[http://www.mikrocontroller.net/user/show/bastelwastel015 bastelwastel015 (b-heeger_AT_t-online.de)],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/fr4 fr4],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/Suelzle-frank Suelzle-frank]&lt;br /&gt;
&lt;br /&gt;
== Karte ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;googlemap version=&amp;quot;0.9&amp;quot; lat=&amp;quot;53.354135&amp;quot; lon=&amp;quot;10.634766&amp;quot; type=&amp;quot;map&amp;quot; zoom=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
6#B2758BC5&lt;br /&gt;
49.77812, 9.983752&lt;br /&gt;
52.23558, 8.169402, Kiste Merkur&lt;br /&gt;
&amp;lt;/googlemap&amp;gt;&lt;br /&gt;
== Fotos, Berichte, Links, ... zur Wanderkiste ==&lt;br /&gt;
&lt;br /&gt;
=== Kiste Merkur ===&lt;br /&gt;
&lt;br /&gt;
Wer diese Kiste haben möchte sollte sich bewusst sein, dass diese&lt;br /&gt;
sehr schwer ist (10-15 KG) !&lt;br /&gt;
&lt;br /&gt;
12.12.2008 - Ist fertig gepackt und wird am 13.12 an Dr. Robotnik&lt;br /&gt;
gesandt. Er wird sie mit einer seiner Kisten durchmischen,&lt;br /&gt;
um einen besseren Mix zu erhalten.&lt;br /&gt;
&lt;br /&gt;
13.12.2008 - Kiste wurde versandt, Trackingnummer wurde dem Empfänger mitgeteilt.&lt;br /&gt;
&lt;br /&gt;
20.12.2008 - Kiste endlich in Gerbrunn angekommen. Ich hab schon einige feine Sachen gefunden mit denen ich was anfangen kann. Werde berichten. dr-robotnik&lt;br /&gt;
&lt;br /&gt;
21.12.2008 - Ich habe jetzt einige Sachen herausgenommen und andere dafür hineingetan. Hier eine Übersicht:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Herausgenommen habe ich&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Bild:vorher.jpg|thumb|180px|right|Was dr-robotnik aus Kiste Merkur entnommen hat]]&lt;br /&gt;
&lt;br /&gt;
- ein altes EGA Display (vermutlich aus einer Kasse ?)&lt;br /&gt;
&lt;br /&gt;
- einen kleinen Ringkerntrafo 2x12V (darüber freue ich mich am meißten,&lt;br /&gt;
werde daraus ein kleines Doppelnetzteil bauen freu)&lt;br /&gt;
&lt;br /&gt;
- eine Biegehilfe für axial bedrahtete Bauteile&lt;br /&gt;
&lt;br /&gt;
- einen kleinen Alu-Kühlkörper (wird auch fürs Netzteil verwendet)&lt;br /&gt;
&lt;br /&gt;
- zwei ältere ISA Grafikkarten (daraus will ich den DAC rausholen, wird&lt;br /&gt;
verwendet für einen einfachen Testbildgenerator, an dem ich zur Zeit&lt;br /&gt;
bastle)&lt;br /&gt;
&lt;br /&gt;
- eine kleine Prototypen-Platine mit MAX232 Beschaltung (einfach toll!)&lt;br /&gt;
&lt;br /&gt;
- einen alten Gameboy (mal sehen, was daraus wird, vieleicht ein kleiner&lt;br /&gt;
Logic Analyzer ?)&lt;br /&gt;
&lt;br /&gt;
- Einen BlueTooth Adapter für Drucker mit Centronics-Schnittstelle&lt;br /&gt;
(Hoffentlich funktioniert er, mein neues Notebook hat keine parallele&lt;br /&gt;
Schnittstelle mehr, so kann ich wieder meinen LaserJet in Betrieb&lt;br /&gt;
nehmen)&lt;br /&gt;
&lt;br /&gt;
- Einige LSTTL Bausteine die ich gut gebrauchen kann&lt;br /&gt;
&lt;br /&gt;
- 10 Stk. kleine Taster mit Kappen&lt;br /&gt;
&lt;br /&gt;
- Einige Transistoren, ältere Typen&lt;br /&gt;
&lt;br /&gt;
- 5 Stk. Zenerdioden&lt;br /&gt;
&lt;br /&gt;
- 2 5Watt Widerstände&lt;br /&gt;
&lt;br /&gt;
- Einige Kondensatoren&lt;br /&gt;
&lt;br /&gt;
- Außerdem habe ich ein großes Stück Steckschaum gegen mehrere kleine&lt;br /&gt;
getauscht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hineingelegt habe ich&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:nachher.jpg|thumb|180px|right|Was dr-robotnik in Kiste Merkur hineingelegt hat]]&lt;br /&gt;
&lt;br /&gt;
- 2 Große Platinen aus einer Industriesteuerung (definitiv defekt, aber&lt;br /&gt;
mit vielen netten Bauteilen zum ausschlachten u.A. viele solid state&lt;br /&gt;
relais)&lt;br /&gt;
&lt;br /&gt;
- 2 große Lüfter aus einem Beamer&lt;br /&gt;
&lt;br /&gt;
- Eine schöne unbenutzte SMD-Prototypenplatine mit Lötstopplack&lt;br /&gt;
&lt;br /&gt;
- Ein TFT-Display aus einem Notebook&lt;br /&gt;
&lt;br /&gt;
- Ein kleiner Alu-Kühlkörper&lt;br /&gt;
&lt;br /&gt;
- Ein Antrieb aus einem Flachbettscanner mit Schrittmotor&lt;br /&gt;
&lt;br /&gt;
- Einige verschiedene Schrittmotoren&lt;br /&gt;
&lt;br /&gt;
- Noch ein kleiner Lüfter&lt;br /&gt;
&lt;br /&gt;
- Mehrere Si-Dioden und jede Menge 9,1V Zener&lt;br /&gt;
&lt;br /&gt;
- Einige verschiedene Transistoren&lt;br /&gt;
&lt;br /&gt;
- Eine kleine zweistellige Siebensegmentanzeige, rot&lt;br /&gt;
&lt;br /&gt;
- Drei Hub- äh.. Zugmagneten (wie heißen die Dinger richtig?)&lt;br /&gt;
&lt;br /&gt;
- Zwei 16Bit ADCs von Burr Brown und ein Sample/Hold-Baustein von&lt;br /&gt;
ANALOGIC&lt;br /&gt;
&lt;br /&gt;
- Ein kleines Gehäuse mit eingefräster Durchführung für Flachbandkabel&lt;br /&gt;
(vieleicht brauchbar für einen kleinen PC-Logic Analyzer?)&lt;br /&gt;
&lt;br /&gt;
- Einige Abblock-Kerkos&lt;br /&gt;
&lt;br /&gt;
- Eine Drehpotentiometer-Skala zum aufkleben auf die Frontplatte&lt;br /&gt;
&lt;br /&gt;
- Einige Steckverbinder und BNC-Buchsen&lt;br /&gt;
&lt;br /&gt;
- Eine Hand voll verschiedene Quarze&lt;br /&gt;
&lt;br /&gt;
- Zwei Hartmetallbohrer (ich glaube 0,3mm hab aber nicht nachgemessen)&lt;br /&gt;
&lt;br /&gt;
- und ein Modellbau-Tipps Buch von Proxxon&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
22.12.2008 Die Kiste geht weiter an Tim Hotfilter (Hotty) nach Bissendorf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ist am 24.12 Bei mir (Tim Hotfilter) angekommen!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sachen die ich aus der Kiste nahm: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- ICs, Transistoren, Widerstände und Kondensatoren&lt;br /&gt;
&lt;br /&gt;
- 3 LCDs&lt;br /&gt;
&lt;br /&gt;
- Schrittmotoren&lt;br /&gt;
&lt;br /&gt;
- SMD Adapterplatienen&lt;br /&gt;
&lt;br /&gt;
- vieles Mehr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sachen die ich in die Kiste tat:&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
- Etliche Platienen (6 Eurokarten aus einen Ansagegerät, LED-Matrix aus einem Bus, Steuerung aus einem Bus (viele Taster mit beleuchtung + LCD) etc...)&lt;br /&gt;
&lt;br /&gt;
- 1 LCD (2x24 sehr große Zeichen 9mm)&lt;br /&gt;
&lt;br /&gt;
- 1 SLM1608 LED-Matrix Modul (RG 16x16)&lt;br /&gt;
&lt;br /&gt;
- Kondensatoren und Kühlkörper&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Venus1a.jpg|thumb|180px|right|Wanderkiste Venus (CD-Spindel zum &lt;br /&gt;
Grössenvergleich)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
29.12.08 Weiter geschickt an Sascha Berkenkamp (Delmenhorst)&lt;br /&gt;
&lt;br /&gt;
=== Kiste Venus ===&lt;br /&gt;
&lt;br /&gt;
Wer diese Kiste haben möchte sollte sich bewusst sein, dass diese&lt;br /&gt;
sehr schwer ist (&lt;br /&gt;
&#039;&#039;&#039;derzeit über 20 KG&#039;&#039;&#039; ) !&lt;br /&gt;
&lt;br /&gt;
12.12.2008 - Ist fertig gepackt, und wird am 13.12. an Stefan versandt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Venus1b.jpg|thumb|180px|right|Wanderkiste Venus offen]]&lt;br /&gt;
13.12.2008 - Kiste wurde versandt, Trackingnummer wurde dem Empfänger mitgeteilt.&lt;br /&gt;
&lt;br /&gt;
15 kg Kiste angekommen. [[Benutzer:Stefan|Stefan]] 18:17, 17. Dez. 2008 (CET). Die Kiste wiegt jetzt 16.5 kg und ist seit heute auf dem Weg zu bastelator (Dirk). [[Benutzer:Stefan|Stefan]] 14:44, 20. Dez. 2008 (CET). Infos zum &lt;br /&gt;
[http://www.mikrocontroller.net/topic/118816#1106912 DIGISOUND F/SK 44GB] in der Kiste.&lt;br /&gt;
&lt;br /&gt;
16,5kg-Kiste ist angekommen [[Benutzer:Bastelator|Bastelator]]. Auf den ersten Blick gigantisch! Weitere Neuigkeiten folgen, wenn die komplette Sichtung erfolgt ist. 21:12, 23. Dez. 2008 (CET)&lt;br /&gt;
&lt;br /&gt;
05.01.2009, 10:16:51 - Die Kiste ist bei mir ([http://www.mikrocontroller.net/user/show/Benedikt Benedikt]) angekommen. Ich hoffe nur ich bekomme alle meine Sachen in die Kiste rein, die ist ja schon randvoll.&lt;br /&gt;
[[Bild:Venus4.jpg|thumb|180px|right|Foto der Wanderkiste Venus wie sie [http://www.mikrocontroller.net/user/show/Benedikt Benedikt] verlassen hat]]&lt;br /&gt;
Die Kiste geht diese Woche noch zu nitram. Momentanes Gewicht: etwa 19kg.&lt;br /&gt;
&lt;br /&gt;
10.01.2009 Die Kiste ist bei mir (nitram) angekommen!!! :-)&lt;br /&gt;
Allerdings liege ich derzeit mit einer Grippe im Bett...&lt;br /&gt;
Sobald es mir besser geht, geht die Kiste wieder auf Reise...&lt;br /&gt;
&lt;br /&gt;
16.01.2009 Die Kiste ist ist neu gepackt (mehr geht jetzt nicht mehr rein) und geht auf Reise zum &amp;quot;derelektroniker&amp;quot;&lt;br /&gt;
&lt;br /&gt;
19.01.2009 Kiste ist bei mit (derelektroniker) angekommen und wird nun an Robin Tönniges (rotoe) verschickt. Aktuell hat sie ein Gewicht von etwas über 20 Kilo.&lt;br /&gt;
&lt;br /&gt;
26.01.2009 Ich (rotoe) habe die Kiste Venus jetzt gezweiteilt weil es einfach zu voll wurde. Ich taufe die neue Kiste Pluto und werde jetzt beide Kisten weiterschicken. Habe schon zwei Leute angeschrieben. Wenn sie die Kisten haben möchten werde ich das hier schreiben.&lt;br /&gt;
&lt;br /&gt;
30.01.2009 Kiste ist nach Ema Tronik (roquema) unterwegs. Als ENtschädigung fürs lange Warten ist die Kiste jetzt um ein STK500 erweitert worden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Venus5.jpg|thumb|180px|right|Foto der Wanderkiste Venus wie sie [http://www.mikrocontroller.net/user/show/derelektroniker derelektroniker] verlassen hat]]&lt;br /&gt;
&lt;br /&gt;
=== Kiste Erde ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:kisteErde.jpg|thumb|180px|right|Wanderkiste Erde, wie sie dr-robotnik verlassen hat]]&lt;br /&gt;
&lt;br /&gt;
Die Kiste Erde wurde von Dr. Robotnik eingerichtet und befüllt. Sie ist auf dem Weg zu User [http://www.mikrocontroller.net/user/show/toybaer toybaer].&lt;br /&gt;
&lt;br /&gt;
- die Kiste kam am 13.12. in Hameln an.&lt;br /&gt;
&lt;br /&gt;
- mit Urlaubsbeginn konnte endlich Plünderung und Auffüllen erfolgen, die Erde macht sich zwichen den Tagen auf den Weg nach Esslingen (juliano)&lt;br /&gt;
&lt;br /&gt;
- Angekommen (kurz vor Silvester 08/09)&lt;br /&gt;
&lt;br /&gt;
- am 13.01.09 in Wetter (Ruhr) angekommen&lt;br /&gt;
&lt;br /&gt;
=== Kiste Mars ===&lt;br /&gt;
&lt;br /&gt;
Wird nächste Woche von Dr. Robotnik gepackt und ist demnächst unterwegs zu User [http://www.mikrocontroller.net/user/show/esko Esko]&lt;br /&gt;
&lt;br /&gt;
=== Kiste NINA ===&lt;br /&gt;
&lt;br /&gt;
Die Wanderkiste &#039;&#039;&#039;Codename NINA&#039;&#039;&#039; Ist ursprünglich gedacht für User aus dem Roboternetz. Sie wird von [http://www.mikrocontroller.net/user/show/theborg0815 theborg0815] betreut. Die Webseite zum Eintragen als Empfänger und zur Dokumentation befindet sich auf http://www.grautier.com/wiki/doku.php?id=wanderkiste. Dort gibt es auch das 1. Foto des Inhalts einer solchen Kiste!&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.evilmadscientist.com/article.php/junkbox Evil Mad Scientist Laboratories]&lt;br /&gt;
* [http://www.avrprojekte.de/index.php?site=wanderkiste Wanderkistenseite von Hotty] &lt;br /&gt;
* &#039;&#039;&#039;[[Wanderkiste.at]]&#039;&#039;&#039; ist die entsprechende Seite für die &#039;&#039;&#039;Wanderkiste in Österreich&#039;&#039;&#039;.&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Spezial:Suche?ns2=1&amp;amp;search=&amp;amp;searchx=Suche Suche im Wiki nach Benutzer]&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte]]&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Wanderkiste&amp;diff=33995</id>
		<title>Wanderkiste</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Wanderkiste&amp;diff=33995"/>
		<updated>2009-01-27T16:34:21Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Kiste Venus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Worum geht es? ==&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;Große Wanderkiste elektronischer Bauteile&#039;&#039;&#039; erklärt Andreas Jakob in [http://www.mikrocontroller.net/topic/118816#1070509] so:&lt;br /&gt;
&lt;br /&gt;
Hallo Leute,&lt;br /&gt;
&lt;br /&gt;
durch diesen Beitrag :&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/topic/118752#1070168|Beitrag &amp;quot;Bauteile zu verschenken&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
bin ich auf die Idee gekommen, auch in Deutschland so ein Wanderkistenprojekt zu starten.&lt;br /&gt;
&lt;br /&gt;
http://hackaday.com/2008/06/27/the-great-internet-migratory-box-of-electronics-junk/&lt;br /&gt;
&lt;br /&gt;
Das Konzept :&lt;br /&gt;
&lt;br /&gt;
Jeder kann sich in einer Liste eintragen, und erhält dann irgendwann die &#039;&#039;&#039;Wanderkiste&#039;&#039;&#039; vom aktuellen Besitzer zugesandt. Du nimmst dir aus der Kiste raus, was du möchtest, und legst im Gegenzug einige Dinge hinein, die du nicht mehr benötigst, die aber für andere nützlich sein könnten. Dann suchst du dir aus der aktuellen Liste jemand aus, und sendest die Kiste weiter an ihn.&lt;br /&gt;
&lt;br /&gt;
So bekommt man für das Porto für ein Paket (z.B. bei Hermes 5.90€ für bis zu 25 KG) ein Überraschungspaket, und wird seine nicht mehr benötigten Bauteile, Platinen, Motoren, Lautsprecher, Geräte, Ausschlachtplatinen etc. etc. wirklich sinnvoll los. &lt;br /&gt;
&lt;br /&gt;
Im Paket gibt es ein Büchlein, das seinen Lebensweg dokumentiert. Jeder macht ein Foto, wie er die Kiste erhalten hat, und schreibt einen Eintrag in ein Weblog, wann er Sie an wen weitergeschickt hat.&lt;br /&gt;
&lt;br /&gt;
== Die RuleZ ==&lt;br /&gt;
&lt;br /&gt;
Sind im Konzept ganz gut erklärt. Wenn es Ergänzungen gibt, kommen die hierhin. &lt;br /&gt;
&lt;br /&gt;
Auf den Punkt gebracht :&lt;br /&gt;
&lt;br /&gt;
Für alles was ich mir aus der Kiste rausnehme, lege ich etwas &lt;br /&gt;
gleichwertig nützliches wieder hinein.&lt;br /&gt;
+&lt;br /&gt;
&lt;br /&gt;
Die aktuelle Entwicklung und Gedanken zur Wanderkiste kann man im Forum  [http://www.mikrocontroller.net/topic/118816] verfolgen und aktiv diskutieren. &lt;br /&gt;
&lt;br /&gt;
Knackig kurze Vorschläge, Anmerkungen usw. zu den RuleZ können auch auf [[Diskussion:Wanderkiste]] gemacht werden.&lt;br /&gt;
&lt;br /&gt;
== Ich will mitmachen! ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ich finde die Idee klasse und hoffentlich trägt mich einer in die Empfängerliste ein. Meine Kontaktdaten sind:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Username oder Email (ggf. Link zu eigenen Elektronikprojekten)&#039;&#039;&#039;&lt;br /&gt;
* hier Anhängen...&lt;br /&gt;
* Username:&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/agentbsik Agentbsik],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/cowz cowz], [http://www.mikrocontroller.net/user/show/djacme djacme], [http://www.mikrocontroller.net/user/show/stefan stefan], [http://www.mikrocontroller.net/user/show/biertrinker biertrinker], [http://www.mikrocontroller.net/user/show/theborg0815 Theborg0815]([http://www.grautier.com/ Grautier]), [http://www.mikrocontroller.net/user/show/Hotty Hotty] &lt;br /&gt;
([http://www.avrprojekte.de/ Hottys Projekte]),&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/nitram nitram],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/bastelator bastelator] ([http://www.bastelator.de/ Bastelators Basteleien]),&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/dr-robotnik dr-robotnik],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/rotoe rotoe],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/roquema roquema]&lt;br /&gt;
([http://www.ematronik.de.vu/ Ematronik]),&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/matthias00 matthias00],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/Lafkaschar Lafkaschar],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/Easter Easter],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/toybaer toybaer],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/toybaer Esko],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/maesto Maesto],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/andrer AndreR],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/Cyno Cyno],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/Warteschleife Warteschleife],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/fabs fabs],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/derelektroniker derelektroniker],[http://www.mikrocontroller.net/user/show/Pyro-Mike Pyro-Mike],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/juliano julian],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/Benedikt Benedikt],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/johanness johanness],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/netdieter netdieter],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/form form],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/crazor crazor],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/iller iller],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/tien Tien],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/hansilein hansilein], &lt;br /&gt;
[http://www.mikrocontroller.net/user/show/bastelwastel015 bastelwastel015 (b-heeger_AT_t-online.de)],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/fr4 fr4],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/Suelzle-frank Suelzle-frank]&lt;br /&gt;
&lt;br /&gt;
== Karte ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;googlemap version=&amp;quot;0.9&amp;quot; lat=&amp;quot;53.354135&amp;quot; lon=&amp;quot;10.634766&amp;quot; type=&amp;quot;map&amp;quot; zoom=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
6#B2758BC5&lt;br /&gt;
49.77812, 9.983752&lt;br /&gt;
52.23558, 8.169402, Kiste Merkur&lt;br /&gt;
&amp;lt;/googlemap&amp;gt;&lt;br /&gt;
== Fotos, Berichte, Links, ... zur Wanderkiste ==&lt;br /&gt;
&lt;br /&gt;
=== Kiste Merkur ===&lt;br /&gt;
&lt;br /&gt;
Wer diese Kiste haben möchte sollte sich bewusst sein, dass diese&lt;br /&gt;
sehr schwer ist (10-15 KG) !&lt;br /&gt;
&lt;br /&gt;
12.12.2008 - Ist fertig gepackt und wird am 13.12 an Dr. Robotnik&lt;br /&gt;
gesandt. Er wird sie mit einer seiner Kisten durchmischen,&lt;br /&gt;
um einen besseren Mix zu erhalten.&lt;br /&gt;
&lt;br /&gt;
13.12.2008 - Kiste wurde versandt, Trackingnummer wurde dem Empfänger mitgeteilt.&lt;br /&gt;
&lt;br /&gt;
20.12.2008 - Kiste endlich in Gerbrunn angekommen. Ich hab schon einige feine Sachen gefunden mit denen ich was anfangen kann. Werde berichten. dr-robotnik&lt;br /&gt;
&lt;br /&gt;
21.12.2008 - Ich habe jetzt einige Sachen herausgenommen und andere dafür hineingetan. Hier eine Übersicht:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Herausgenommen habe ich&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Bild:vorher.jpg|thumb|180px|right|Was dr-robotnik aus Kiste Merkur entnommen hat]]&lt;br /&gt;
&lt;br /&gt;
- ein altes EGA Display (vermutlich aus einer Kasse ?)&lt;br /&gt;
&lt;br /&gt;
- einen kleinen Ringkerntrafo 2x12V (darüber freue ich mich am meißten,&lt;br /&gt;
werde daraus ein kleines Doppelnetzteil bauen freu)&lt;br /&gt;
&lt;br /&gt;
- eine Biegehilfe für axial bedrahtete Bauteile&lt;br /&gt;
&lt;br /&gt;
- einen kleinen Alu-Kühlkörper (wird auch fürs Netzteil verwendet)&lt;br /&gt;
&lt;br /&gt;
- zwei ältere ISA Grafikkarten (daraus will ich den DAC rausholen, wird&lt;br /&gt;
verwendet für einen einfachen Testbildgenerator, an dem ich zur Zeit&lt;br /&gt;
bastle)&lt;br /&gt;
&lt;br /&gt;
- eine kleine Prototypen-Platine mit MAX232 Beschaltung (einfach toll!)&lt;br /&gt;
&lt;br /&gt;
- einen alten Gameboy (mal sehen, was daraus wird, vieleicht ein kleiner&lt;br /&gt;
Logic Analyzer ?)&lt;br /&gt;
&lt;br /&gt;
- Einen BlueTooth Adapter für Drucker mit Centronics-Schnittstelle&lt;br /&gt;
(Hoffentlich funktioniert er, mein neues Notebook hat keine parallele&lt;br /&gt;
Schnittstelle mehr, so kann ich wieder meinen LaserJet in Betrieb&lt;br /&gt;
nehmen)&lt;br /&gt;
&lt;br /&gt;
- Einige LSTTL Bausteine die ich gut gebrauchen kann&lt;br /&gt;
&lt;br /&gt;
- 10 Stk. kleine Taster mit Kappen&lt;br /&gt;
&lt;br /&gt;
- Einige Transistoren, ältere Typen&lt;br /&gt;
&lt;br /&gt;
- 5 Stk. Zenerdioden&lt;br /&gt;
&lt;br /&gt;
- 2 5Watt Widerstände&lt;br /&gt;
&lt;br /&gt;
- Einige Kondensatoren&lt;br /&gt;
&lt;br /&gt;
- Außerdem habe ich ein großes Stück Steckschaum gegen mehrere kleine&lt;br /&gt;
getauscht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hineingelegt habe ich&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:nachher.jpg|thumb|180px|right|Was dr-robotnik in Kiste Merkur hineingelegt hat]]&lt;br /&gt;
&lt;br /&gt;
- 2 Große Platinen aus einer Industriesteuerung (definitiv defekt, aber&lt;br /&gt;
mit vielen netten Bauteilen zum ausschlachten u.A. viele solid state&lt;br /&gt;
relais)&lt;br /&gt;
&lt;br /&gt;
- 2 große Lüfter aus einem Beamer&lt;br /&gt;
&lt;br /&gt;
- Eine schöne unbenutzte SMD-Prototypenplatine mit Lötstopplack&lt;br /&gt;
&lt;br /&gt;
- Ein TFT-Display aus einem Notebook&lt;br /&gt;
&lt;br /&gt;
- Ein kleiner Alu-Kühlkörper&lt;br /&gt;
&lt;br /&gt;
- Ein Antrieb aus einem Flachbettscanner mit Schrittmotor&lt;br /&gt;
&lt;br /&gt;
- Einige verschiedene Schrittmotoren&lt;br /&gt;
&lt;br /&gt;
- Noch ein kleiner Lüfter&lt;br /&gt;
&lt;br /&gt;
- Mehrere Si-Dioden und jede Menge 9,1V Zener&lt;br /&gt;
&lt;br /&gt;
- Einige verschiedene Transistoren&lt;br /&gt;
&lt;br /&gt;
- Eine kleine zweistellige Siebensegmentanzeige, rot&lt;br /&gt;
&lt;br /&gt;
- Drei Hub- äh.. Zugmagneten (wie heißen die Dinger richtig?)&lt;br /&gt;
&lt;br /&gt;
- Zwei 16Bit ADCs von Burr Brown und ein Sample/Hold-Baustein von&lt;br /&gt;
ANALOGIC&lt;br /&gt;
&lt;br /&gt;
- Ein kleines Gehäuse mit eingefräster Durchführung für Flachbandkabel&lt;br /&gt;
(vieleicht brauchbar für einen kleinen PC-Logic Analyzer?)&lt;br /&gt;
&lt;br /&gt;
- Einige Abblock-Kerkos&lt;br /&gt;
&lt;br /&gt;
- Eine Drehpotentiometer-Skala zum aufkleben auf die Frontplatte&lt;br /&gt;
&lt;br /&gt;
- Einige Steckverbinder und BNC-Buchsen&lt;br /&gt;
&lt;br /&gt;
- Eine Hand voll verschiedene Quarze&lt;br /&gt;
&lt;br /&gt;
- Zwei Hartmetallbohrer (ich glaube 0,3mm hab aber nicht nachgemessen)&lt;br /&gt;
&lt;br /&gt;
- und ein Modellbau-Tipps Buch von Proxxon&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
22.12.2008 Die Kiste geht weiter an Tim Hotfilter (Hotty) nach Bissendorf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ist am 24.12 Bei mir (Tim Hotfilter) angekommen!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sachen die ich aus der Kiste nahm: &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- ICs, Transistoren, Widerstände und Kondensatoren&lt;br /&gt;
&lt;br /&gt;
- 3 LCDs&lt;br /&gt;
&lt;br /&gt;
- Schrittmotoren&lt;br /&gt;
&lt;br /&gt;
- SMD Adapterplatienen&lt;br /&gt;
&lt;br /&gt;
- vieles Mehr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sachen die ich in die Kiste tat:&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
- Etliche Platienen (6 Eurokarten aus einen Ansagegerät, LED-Matrix aus einem Bus, Steuerung aus einem Bus (viele Taster mit beleuchtung + LCD) etc...)&lt;br /&gt;
&lt;br /&gt;
- 1 LCD (2x24 sehr große Zeichen 9mm)&lt;br /&gt;
&lt;br /&gt;
- 1 SLM1608 LED-Matrix Modul (RG 16x16)&lt;br /&gt;
&lt;br /&gt;
- Kondensatoren und Kühlkörper&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:Venus1a.jpg|thumb|180px|right|Wanderkiste Venus (CD-Spindel zum &lt;br /&gt;
Grössenvergleich)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
29.12.08 Weiter geschickt an Sascha Berkenkamp (Delmenhorst)&lt;br /&gt;
&lt;br /&gt;
=== Kiste Venus ===&lt;br /&gt;
&lt;br /&gt;
Wer diese Kiste haben möchte sollte sich bewusst sein, dass diese&lt;br /&gt;
sehr schwer ist (&lt;br /&gt;
&#039;&#039;&#039;derzeit über 20 KG&#039;&#039;&#039; ) !&lt;br /&gt;
&lt;br /&gt;
12.12.2008 - Ist fertig gepackt, und wird am 13.12. an Stefan versandt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Venus1b.jpg|thumb|180px|right|Wanderkiste Venus offen]]&lt;br /&gt;
13.12.2008 - Kiste wurde versandt, Trackingnummer wurde dem Empfänger mitgeteilt.&lt;br /&gt;
&lt;br /&gt;
15 kg Kiste angekommen. [[Benutzer:Stefan|Stefan]] 18:17, 17. Dez. 2008 (CET). Die Kiste wiegt jetzt 16.5 kg und ist seit heute auf dem Weg zu bastelator (Dirk). [[Benutzer:Stefan|Stefan]] 14:44, 20. Dez. 2008 (CET). Infos zum &lt;br /&gt;
[http://www.mikrocontroller.net/topic/118816#1106912 DIGISOUND F/SK 44GB] in der Kiste.&lt;br /&gt;
&lt;br /&gt;
16,5kg-Kiste ist angekommen [[Benutzer:Bastelator|Bastelator]]. Auf den ersten Blick gigantisch! Weitere Neuigkeiten folgen, wenn die komplette Sichtung erfolgt ist. 21:12, 23. Dez. 2008 (CET)&lt;br /&gt;
&lt;br /&gt;
05.01.2009, 10:16:51 - Die Kiste ist bei mir ([http://www.mikrocontroller.net/user/show/Benedikt Benedikt]) angekommen. Ich hoffe nur ich bekomme alle meine Sachen in die Kiste rein, die ist ja schon randvoll.&lt;br /&gt;
[[Bild:Venus4.jpg|thumb|180px|right|Foto der Wanderkiste Venus wie sie [http://www.mikrocontroller.net/user/show/Benedikt Benedikt] verlassen hat]]&lt;br /&gt;
Die Kiste geht diese Woche noch zu nitram. Momentanes Gewicht: etwa 19kg.&lt;br /&gt;
&lt;br /&gt;
10.01.2009 Die Kiste ist bei mir (nitram) angekommen!!! :-)&lt;br /&gt;
Allerdings liege ich derzeit mit einer Grippe im Bett...&lt;br /&gt;
Sobald es mir besser geht, geht die Kiste wieder auf Reise...&lt;br /&gt;
&lt;br /&gt;
16.01.2009 Die Kiste ist ist neu gepackt (mehr geht jetzt nicht mehr rein) und geht auf Reise zum &amp;quot;derelektroniker&amp;quot;&lt;br /&gt;
&lt;br /&gt;
19.01.2009 Kiste ist bei mit (derelektroniker) angekommen und wird nun an Robin Tönniges (rotoe) verschickt. Aktuell hat sie ein Gewicht von etwas über 20 Kilo.&lt;br /&gt;
&lt;br /&gt;
26.01.2009 Ich (rotoe) habe die Kiste Venus jetzt gezweiteilt weil es einfach zu voll wurde. Ich taufe die neue Kiste Pluto und werde jetzt beide Kisten weiterschicken. Habe schon zwei Leute angeschrieben. Wenn sie die Kisten haben möchten werde ich das hier schreiben.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Venus5.jpg|thumb|180px|right|Foto der Wanderkiste Venus wie sie [http://www.mikrocontroller.net/user/show/derelektroniker derelektroniker] verlassen hat]]&lt;br /&gt;
&lt;br /&gt;
=== Kiste Erde ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:kisteErde.jpg|thumb|180px|right|Wanderkiste Erde, wie sie dr-robotnik verlassen hat]]&lt;br /&gt;
&lt;br /&gt;
Die Kiste Erde wurde von Dr. Robotnik eingerichtet und befüllt. Sie ist auf dem Weg zu User [http://www.mikrocontroller.net/user/show/toybaer toybaer].&lt;br /&gt;
&lt;br /&gt;
- die Kiste kam am 13.12. in Hameln an.&lt;br /&gt;
&lt;br /&gt;
- mit Urlaubsbeginn konnte endlich Plünderung und Auffüllen erfolgen, die Erde macht sich zwichen den Tagen auf den Weg nach Esslingen (juliano)&lt;br /&gt;
&lt;br /&gt;
- Angekommen (kurz vor Silvester 08/09)&lt;br /&gt;
&lt;br /&gt;
- am 13.01.09 in Wetter (Ruhr) angekommen&lt;br /&gt;
&lt;br /&gt;
=== Kiste Mars ===&lt;br /&gt;
&lt;br /&gt;
Wird nächste Woche von Dr. Robotnik gepackt und ist demnächst unterwegs zu User [http://www.mikrocontroller.net/user/show/esko Esko]&lt;br /&gt;
&lt;br /&gt;
=== Kiste NINA ===&lt;br /&gt;
&lt;br /&gt;
Die Wanderkiste &#039;&#039;&#039;Codename NINA&#039;&#039;&#039; Ist ursprünglich gedacht für User aus dem Roboternetz. Sie wird von [http://www.mikrocontroller.net/user/show/theborg0815 theborg0815] betreut. Die Webseite zum Eintragen als Empfänger und zur Dokumentation befindet sich auf http://www.grautier.com/wiki/doku.php?id=wanderkiste. Dort gibt es auch das 1. Foto des Inhalts einer solchen Kiste!&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.evilmadscientist.com/article.php/junkbox Evil Mad Scientist Laboratories]&lt;br /&gt;
* [http://www.avrprojekte.de/index.php?site=wanderkiste Wanderkistenseite von Hotty] &lt;br /&gt;
* &#039;&#039;&#039;[[Wanderkiste.at]]&#039;&#039;&#039; ist die entsprechende Seite für die &#039;&#039;&#039;Wanderkiste in Österreich&#039;&#039;&#039;.&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Spezial:Suche?ns2=1&amp;amp;search=&amp;amp;searchx=Suche Suche im Wiki nach Benutzer]&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte]]&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Wanderkiste&amp;diff=32984</id>
		<title>Wanderkiste</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Wanderkiste&amp;diff=32984"/>
		<updated>2008-12-07T10:47:54Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Ich will mitmachen! */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Worum geht es? ==&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;Große Wanderkiste elektronischer Bauteile&#039;&#039;&#039; erklärt Andreas Jakob in [http://www.mikrocontroller.net/topic/118816#1070509] so:&lt;br /&gt;
&lt;br /&gt;
Hallo Leute,&lt;br /&gt;
&lt;br /&gt;
durch diesen Beitrag :&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/topic/118752#1070168|Beitrag &amp;quot;Bauteile zu verschenken&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
bin ich auf die Idee gekommen, auch in Deutschland so ein Wanderkistenprojekt zu starten.&lt;br /&gt;
&lt;br /&gt;
http://hackaday.com/2008/06/27/the-great-internet-migratory-box-of-electronics-junk/&lt;br /&gt;
&lt;br /&gt;
Das Konzept :&lt;br /&gt;
&lt;br /&gt;
Jeder kann sich in einer Liste eintragen, und erhält dann irgendwann die &#039;&#039;&#039;Wanderkiste&#039;&#039;&#039; vom aktuellen Besitzer zugesandt. Du nimmst dir aus der Kiste raus, was du möchtest, und legst im Gegenzug einige Dinge hinein, die du nicht mehr benötigst, die aber für andere nützlich sein könnten. Dann suchst du dir aus der aktuellen Liste jemand aus, und sendest die Kiste weiter an ihn.&lt;br /&gt;
&lt;br /&gt;
So bekommt man für das Porto für ein Paket (z.B. bei Hermes 5.90€ für bis zu 25 KG) ein Überraschungspaket, und wird seine nicht mehr benötigten Bauteile, Platinen, Motoren, Lautsprecher, Geräte, Ausschlachtplatinen etc. etc. wirklich sinnvoll los. &lt;br /&gt;
&lt;br /&gt;
Im Paket gibt es ein Büchlein, das seinen Lebensweg dokumentiert. Jeder macht ein Foto, wie er die Kiste erhalten hat, und schreibt einen Eintrag in ein Weblog, wann er Sie an wen weitergeschickt hat.&lt;br /&gt;
&lt;br /&gt;
== Die RuleZ ==&lt;br /&gt;
&lt;br /&gt;
Sind im Konzept ganz gut erklärt. Wenn es Ergänzungen gibt, kommen die hierhin. Die aktuelle Entwicklung und Gedanken zur Wanderkiste kann man auf [http://www.mikrocontroller.net/topic/118816#1070509] verfolgen und aktiv mitdiskutieren.&lt;br /&gt;
&lt;br /&gt;
== Ich will mitmachen! ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ich finde die Idee klasse und hoffentlich trägt mich einer in die Empfängerliste ein. Meine Kontaktdaten sind:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Username oder Email - Datum - ggf. Link zu eigenen Elektronikprojekten&#039;&#039;&#039;&lt;br /&gt;
* hier Anhängen...&lt;br /&gt;
* Username:&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/cowz cowz], [http://www.mikrocontroller.net/user/show/djacme djacme], [http://www.mikrocontroller.net/user/show/stefan stefan], [http://www.mikrocontroller.net/user/show/biertrinker biertrinker], [http://www.mikrocontroller.net/user/show/theborg0815 Theborg0815], [http://www.mikrocontroller.net/user/show/Hotty Hotty] &lt;br /&gt;
([http://www.avrprojekte.de/ Hottys Projekte]),&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/nitram nitram],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/bastelator bastelator] ([http://www.bastelator.de/ Bastelators Basteleien]),&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/dr-robotnik dr-robotnik],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/rotoe rotoe],&lt;br /&gt;
&lt;br /&gt;
== Fotos, Berichte, Links, ... zur Wanderkiste ==&lt;br /&gt;
&lt;br /&gt;
=== Kiste 1 ===&lt;br /&gt;
&lt;br /&gt;
...to be continued&lt;br /&gt;
&lt;br /&gt;
=== Kiste 2 ===&lt;br /&gt;
&lt;br /&gt;
...to be continued&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Wanderkiste&amp;diff=32983</id>
		<title>Wanderkiste</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Wanderkiste&amp;diff=32983"/>
		<updated>2008-12-07T10:47:37Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Ich will mitmachen! */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Worum geht es? ==&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;Große Wanderkiste elektronischer Bauteile&#039;&#039;&#039; erklärt Andreas Jakob in [http://www.mikrocontroller.net/topic/118816#1070509] so:&lt;br /&gt;
&lt;br /&gt;
Hallo Leute,&lt;br /&gt;
&lt;br /&gt;
durch diesen Beitrag :&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/topic/118752#1070168|Beitrag &amp;quot;Bauteile zu verschenken&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
bin ich auf die Idee gekommen, auch in Deutschland so ein Wanderkistenprojekt zu starten.&lt;br /&gt;
&lt;br /&gt;
http://hackaday.com/2008/06/27/the-great-internet-migratory-box-of-electronics-junk/&lt;br /&gt;
&lt;br /&gt;
Das Konzept :&lt;br /&gt;
&lt;br /&gt;
Jeder kann sich in einer Liste eintragen, und erhält dann irgendwann die &#039;&#039;&#039;Wanderkiste&#039;&#039;&#039; vom aktuellen Besitzer zugesandt. Du nimmst dir aus der Kiste raus, was du möchtest, und legst im Gegenzug einige Dinge hinein, die du nicht mehr benötigst, die aber für andere nützlich sein könnten. Dann suchst du dir aus der aktuellen Liste jemand aus, und sendest die Kiste weiter an ihn.&lt;br /&gt;
&lt;br /&gt;
So bekommt man für das Porto für ein Paket (z.B. bei Hermes 5.90€ für bis zu 25 KG) ein Überraschungspaket, und wird seine nicht mehr benötigten Bauteile, Platinen, Motoren, Lautsprecher, Geräte, Ausschlachtplatinen etc. etc. wirklich sinnvoll los. &lt;br /&gt;
&lt;br /&gt;
Im Paket gibt es ein Büchlein, das seinen Lebensweg dokumentiert. Jeder macht ein Foto, wie er die Kiste erhalten hat, und schreibt einen Eintrag in ein Weblog, wann er Sie an wen weitergeschickt hat.&lt;br /&gt;
&lt;br /&gt;
== Die RuleZ ==&lt;br /&gt;
&lt;br /&gt;
Sind im Konzept ganz gut erklärt. Wenn es Ergänzungen gibt, kommen die hierhin. Die aktuelle Entwicklung und Gedanken zur Wanderkiste kann man auf [http://www.mikrocontroller.net/topic/118816#1070509] verfolgen und aktiv mitdiskutieren.&lt;br /&gt;
&lt;br /&gt;
== Ich will mitmachen! ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ich finde die Idee klasse und hoffentlich trägt mich einer in die Empfängerliste ein. Meine Kontaktdaten sind:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Username oder Email - Datum - ggf. Link zu eigenen Elektronikprojekten&#039;&#039;&#039;&lt;br /&gt;
* hier Anhängen...&lt;br /&gt;
* Username:&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/cowz cowz], [http://www.mikrocontroller.net/user/show/djacme djacme], [http://www.mikrocontroller.net/user/show/stefan stefan], [http://www.mikrocontroller.net/user/show/biertrinker biertrinker], [http://www.mikrocontroller.net/user/show/theborg0815 Theborg0815], [http://www.mikrocontroller.net/user/show/Hotty Hotty] &lt;br /&gt;
([http://www.avrprojekte.de/ Hottys Projekte]),&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/nitram nitram],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/bastelator bastelator] ([http://www.bastelator.de/ Bastelators Basteleien]),&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/dr-robotnik dr-robotnik],&lt;br /&gt;
[http://www.mikrocontroller.net/user/show/rotoe],&lt;br /&gt;
&lt;br /&gt;
== Fotos, Berichte, Links, ... zur Wanderkiste ==&lt;br /&gt;
&lt;br /&gt;
=== Kiste 1 ===&lt;br /&gt;
&lt;br /&gt;
...to be continued&lt;br /&gt;
&lt;br /&gt;
=== Kiste 2 ===&lt;br /&gt;
&lt;br /&gt;
...to be continued&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Timer&amp;diff=32286</id>
		<title>AVR-Tutorial: Timer</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Timer&amp;diff=32286"/>
		<updated>2008-10-31T08:39:35Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Wie schnell schaltet denn jetzt der Port? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Timer sind eines der Hauptarbeitspferde in unserem Mikrocontroller. Mit ihrer Hilfe ist es möglich, in regelmäßigen Zeitabständen Aktionen zu veranlassen. Aber Timer können noch mehr!&lt;br /&gt;
* Timer können mit einem externen Pin hochgezählt werden&lt;br /&gt;
* Es gibt Möglichkeiten, bei bestimmten Zählerständen einen Interrupt auslösen zu lassen&lt;br /&gt;
* Timer können aber auch völlig selbstständig Signale an einem Ausgabepin erzeugen&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Aber der Reihe nach.&lt;br /&gt;
&lt;br /&gt;
==Was ist ein Timer?==&lt;br /&gt;
&lt;br /&gt;
Ein Timer ist im Grunde nichts anderes als ein bestimmtes Register im Mikrocontroller, das hardwaregesteuert fortlaufend um 1 erhöht (oder erniedrigt) wird (statt &amp;lt;i&amp;gt;um 1 erhöhen&amp;lt;/i&amp;gt; sagt man auch &#039;&#039;&#039;inkrementieren&#039;&#039;&#039;, und das Gegenstück, &#039;&#039;&#039;dekrementieren&#039;&#039;&#039;, bedeutet &amp;lt;i&amp;gt;um 1 erniedrigen&amp;lt;/i&amp;gt;). Anstatt also Befehle im Programm vorzusehen, die regelmäßig ausgeführt werden und ein Register inkrementieren, erledigt dies der Mikrocontroller ganz von alleine. Dazu ist es möglich, den Timer mit dem Systemtakt zu verbinden und so die Genauigkeit des Quarzes auszunutzen, um ein Register regelmässig und vor allen Dingen unabhängig vom restlichen Programmfluss (!) hochzählen zu lassen.&lt;br /&gt;
&lt;br /&gt;
Davon alleine hätte man aber noch keinen großen Gewinn. Nützlich wird das Ganze erst dann, wenn man bei bestimmten Zählerständen eine Aktion ausführen lassen kann. Einer der &#039;bestimmten Zählerstände&#039; ist zum Beispiel der &#039;&#039;&#039;Overflow&#039;&#039;&#039;. Das Zählregister eines Timers kann natürlich nicht beliebig lange inkrementiert werden – z. B. ist der höchste Zählerstand, den ein 8-Bit-Timer erreichen kann, 2&amp;lt;sup&amp;gt;8&amp;lt;/sup&amp;gt; – 1 = 255. Beim nächsten Inkrementierschritt tritt ein Überlauf (engl. Overflow) auf, der den Timerstand wieder zu 0 werden lässt. Und hier liegt der springende Punkt. Wir können uns nämlich an diesen Overflow &amp;quot;anhängen&amp;quot; und den Controller so konfigurieren, dass beim Auftreten des Timer-Overflows ein Interrupt ausgelöst wird.&lt;br /&gt;
&lt;br /&gt;
==Der Vorteiler (Prescaler)==&lt;br /&gt;
&lt;br /&gt;
Wenn also der Quarzoszillator mit 4 MHz schwingt, dann würde auch der Timer 4 Millionen mal in der Sekunde erhöht werden. Da der Timer jedes Mal von 0 bis 255 zählt, bevor ein Overflow auftritt, heist das auch, dass in einer Sekunde 4000000 / 256 = 15625 Overflows vorkommen. Ganz schön schnell! Nur: Oft ist das nicht sinnvoll. Um diese Raten zu verzögern, gibt es den Vorteiler, oder auf Englisch, Prescaler. Er kann auf die Werte 1, 8, 64, 256 oder 1024 eingestellt werden. Seine Aufgabe ist es, den Systemtakt um den angegebenen Faktor zu teilen. Steht der Vorteiler also auf 1024, so wird nur bei jedem 1024-ten Impuls vom Systemtakt das Timerregister um 1 erhöht. Entsprechend weniger häufig kommen dann natürlich die Overflows. Der Systemtakt sei wieder 4000000. Dann wird der Timer in 1 Sekunde 4000000 / 1024 = 3906.25 mal erhöht. Da der Timer wieder jedesmal bis 255 zählen muss bis ein Overflow auftritt, bedeutet dies, dass in 1 Sekunde 3906.25 / 256 = 15.25 Overflows auftreten.&lt;br /&gt;
&lt;br /&gt;
Systemtakt: 4Mhz&lt;br /&gt;
&lt;br /&gt;
  Vorteiler    Overflows/Sekunde      Zeit zwischen&lt;br /&gt;
                                      2 Overflows [s]&lt;br /&gt;
&lt;br /&gt;
      1            15625                0.000064&lt;br /&gt;
      8             1953.125            0.000512&lt;br /&gt;
     64              244.1406           0.004096&lt;br /&gt;
    256               61.0351           0.016384&lt;br /&gt;
   1024               15.2587           0.065536&lt;br /&gt;
&lt;br /&gt;
==Erste Tests==&lt;br /&gt;
&lt;br /&gt;
Ein Programm, das einen Timer Overflow in Aktion zeigt, könnte z.B. so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
.def temp = r16&lt;br /&gt;
.def leds = r17&lt;br /&gt;
&lt;br /&gt;
.org 0x0000&lt;br /&gt;
        rjmp    main                  ; Reset Handler&lt;br /&gt;
.org OVF0addr&lt;br /&gt;
        rjmp    timer0_overflow       ; Timer Overflow Handler&lt;br /&gt;
&lt;br /&gt;
main:&lt;br /&gt;
        ldi     temp, LOW(RAMEND)     ; Stackpointer initialisieren&lt;br /&gt;
        out     SPL, temp&lt;br /&gt;
        ldi     temp, HIGH(RAMEND)&lt;br /&gt;
        out     SPH, temp&lt;br /&gt;
	&lt;br /&gt;
        ldi     temp, 0xFF            ; Port B auf Ausgang&lt;br /&gt;
        out     DDRB, temp&lt;br /&gt;
&lt;br /&gt;
        ldi     leds, 0xFF&lt;br /&gt;
&lt;br /&gt;
        ldi     temp, 0b00000001      ; CS00 setzen: Teiler 1&lt;br /&gt;
        out     TCCR0, temp&lt;br /&gt;
&lt;br /&gt;
        ldi     temp, 0b00000001      ; TOIE0: Interrupt bei Timer Overflow&lt;br /&gt;
        out     TIMSK, temp&lt;br /&gt;
&lt;br /&gt;
        sei&lt;br /&gt;
&lt;br /&gt;
loop:   rjmp    loop&lt;br /&gt;
&lt;br /&gt;
timer0_overflow:                      ; Timer 0 Overflow Handler&lt;br /&gt;
        out     PORTB, leds&lt;br /&gt;
        com     leds&lt;br /&gt;
        reti&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Programm beginnt mit der [[AVR-Tutorial:_Interrupts|Interrupt-Vektoren-Tabelle]]. Dort ist an der Adresse &amp;lt;i&amp;gt;OVF0Addr&amp;lt;/i&amp;gt; ein Sprung zur Marke &amp;lt;i&amp;gt;timer0_overflow&amp;lt;/i&amp;gt; eingetragen. Wenn also ein Overflow Interrupt vom Timer 0 auftritt, so wird dieser Interrupt durch den &#039;&#039;&#039;rjmp&#039;&#039;&#039; weitergeleitet an die Stelle &amp;lt;i&amp;gt;timer0_overflow&amp;lt;/i&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Das Hauptprogramm beginnt ganz normal mit der Belegung des Stackpointers. Danach wird der Port B auf Ausgang geschaltet, wir wollen hier wieder die LED anschliessen.&lt;br /&gt;
&lt;br /&gt;
Durch Beschreiben von TCCR0 mit dem Bitmuster 0b00000001 wird der Vorteiler auf 1 gesetzt. Für die ersten Versuche empfiehlt es sich, das Programm mit dem AVR-Studio zunächst zu simulieren. Würden wir einen größeren Vorteiler benutzen, so müsste man ziemlich oft mittels F11 einen simulierten Schritt ausführen, um eine Änderung im Timerregister zu erreichen.&lt;br /&gt;
&lt;br /&gt;
Die nächsten Anweisungen setzen im TIMSK Register das TOIE0 Bit. Sinn der Sache ist es, dem Timer zu erlauben, bei Erreichen eines Overflow einen Interrupt auszulösen.&lt;br /&gt;
&lt;br /&gt;
Zum Schluss noch die Interrupts generell mittels &#039;&#039;&#039;sei&#039;&#039;&#039; freigeben. Dieser Schritt ist obligatorisch. Im Mikrocontroller können viele Quellen einen Interrupt auslösen. Daraus folgt: Für jede mögliche Quelle muss festgelegt werden, ob sie einen Interrupt erzeugen darf oder nicht. Die Oberhoheit hat aber das globale Interrupt Flag. Mit ihm können alle Interrupts, egal von welcher Quelle sie kommen, unterdrückt werden.&lt;br /&gt;
&lt;br /&gt;
Damit ist die Initialisierung beendet und das Hauptprogramm kann sich schlafen legen. Die &#039;&#039;&#039;loop: rjmp loop&#039;&#039;&#039; Schleife macht genau dieses.&lt;br /&gt;
&lt;br /&gt;
Tritt nun ein Overflow am Timer auf, so wird über den Umweg über die Interrupt Vektor Tabelle der Programmteil &amp;lt;i&amp;gt;timer0_overflow&amp;lt;/i&amp;gt; angesprungen. Dieser gibt einfach nur den Inhalt des Registers leds am Port B aus. Danach wird das leds Register mit einer &#039;&#039;&#039;com&#039;&#039;&#039; Operation negiert, so dass aus allen 0 Bits eine 1 wird und umgekehrt. Die Overflow Behandlung ist damit beendet und mittels &#039;&#039;&#039;reti&#039;&#039;&#039; wird der Interrupt Handler wieder verlassen.&lt;br /&gt;
&lt;br /&gt;
==Simulation im AVR-Studio==&lt;br /&gt;
&lt;br /&gt;
Es lohnt sich, den ganzen Vorgang im AVR-Studio simulieren zu lassen. Dazu am besten in der linken I/O View Ansicht die Einträge für PORTB und TIMER_COUNTER_0 öffnen. Wird mittels F11 durch das Programm gegangen, so sieht man, dass ab dem Moment, ab dem der Vorteiler auf 1 gesetzt wird, der Timer 0 im TCNT0 Register zu zählen anfängt. Mit jedem Druck auf F11 erhöht sich der Zählerstand. Irgendwann ist dann die Endlosschleife loop erreicht. Drücken Sie weiterhin F11 und beobachten sie, wie TCNT0 immer höher zählt, bis der Overflow erreicht wird. In dem Moment, in dem der Overflow erreicht wird, wird der Interrupt ausgelöst. Mit dem nächsten F11 landen sie in der Interrupt Vektor Tabelle und von dort geht es weiter zu timer_0_overflow. Weitere Tastendrücke von F11 erledigen dann die Ausgabe auf den Port B, das Invertieren des Registers r17 und der Interrupt ist damit behandelt. Nach dem &#039;&#039;&#039;reti&#039;&#039;&#039; macht der Microcontroller genau an der Stelle weiter, an der er vom Interrupt unterbrochen wurde. Und der Timer 0 hat in der Zwischenzeit weitergezählt! Nach exakt weiteren 256 Schritten, vom Auftreten des ersten Overflows an gerechnet, wird der nächste Overflow ausgelöst.&lt;br /&gt;
&lt;br /&gt;
==Wie schnell schaltet denn jetzt der Port?==&lt;br /&gt;
&lt;br /&gt;
Eine berechtigte Frage. Dazu müssen wir etwas rechnen. Keine Angst, es ist nicht schwer, und wer das Prinzip bisher verstanden hat, der sollte keine Schwierigkeiten haben, die Berechnung nachzuvollziehen.&lt;br /&gt;
&lt;br /&gt;
Der Quarzoszillator schwingt mit 4 MHz. Das heißt, in 1 Sekunde werden 4000000 Taktzyklen generiert. Durch die Wahl des Vorteilers von 1 bedeutet das auch, dass der Timer 4000000 mal in der Sekunde erhöht wird. Von einem Overflow zum nächsten muss der Timer 256 Zählvorgänge ausführen. Also werden in 1 Sekunde 4000000 / 256 = 15625 Overflows generiert. Bei jedem Overflow schalten wir die LEDs jeweils in den anderen Zustand. D.h die LEDs blinken mit einer Frequenz von 7812.5 Hz. Das ist zuviel als dass wir es noch sehen könnten.&lt;br /&gt;
&lt;br /&gt;
Was können wir also tun, um diese Blinkfrequenz zu verringern? Im Moment ist unsere einzige Einflussgröße der Vorteiler. Wie sieht die Rechnung aus, wenn wir einen Vorteiler von 1024 wählen?&lt;br /&gt;
&lt;br /&gt;
Wiederrum: Der Systemtakt sei 4 Mhz. Durch den Vorteiler von 1024 werden daraus 4000000 / 1024 = 3906.25 Pulse pro Sekunde für den Timer. Der zählt wiederum 256 Zustände von einem Overflow zum nächsten. 3906.25 / 256 = 15.2587. Und wiederum: Im Overflow werden die LEDs ja abwechselnd ein und ausgeschaltet, also dividieren wir noch durch 2: 15.2587 / 2 = 7.629. Also knapp 7 Hz. Diese Frequenz müsste man schon mit freiem Auge sehen. Die LEDs werden ziemlich schnell vor sich hin blinken.&lt;br /&gt;
&lt;br /&gt;
Reicht diese Verzögerung noch immer nicht, dann haben wir 2 Möglichkeiten:&lt;br /&gt;
* Entweder wir benutzen einen anderen Timer. Timer 1 beispielsweise ist ein 16 Bit Timer. Der Timer zählt also nicht bis 255 sondern bis 65535. Bei entsprechender Umarbeitung des Programms und einem Vorteiler von 1024 bedeutet das, dass die LEDs einen Ein/Aus Zyklus in 33 Sekunden absolvieren.&lt;br /&gt;
* Oder wir schalten die LEDs nicht bei jedem Timer Overflow um. Man könnte zum Beispiel in einem Register bis 7 zählen und nur dann, wenn dieses Register 7 erreicht hat, wird&lt;br /&gt;
** das Register wieder auf 0 gesetzt und&lt;br /&gt;
** die LEDs umgeschaltet.&lt;br /&gt;
&lt;br /&gt;
==Timer 0==&lt;br /&gt;
&lt;br /&gt;
Timer 0 ist ein 8 Bit Timer.&lt;br /&gt;
&lt;br /&gt;
* Overflow Interrupt&lt;br /&gt;
&lt;br /&gt;
===TCCR0===&lt;br /&gt;
  +------+------+------+------+------+------+------+------+&lt;br /&gt;
  |      |      |      |      |      | CS02 | CS01 | CS00 |&lt;br /&gt;
  +------+------+------+------+------+------+------+------+&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;i&amp;gt;CS02 - CS00   Clock Select&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th align=&amp;quot;left&amp;quot;&amp;gt;CS02&amp;lt;/th&amp;gt;&amp;lt;th align=&amp;quot;left&amp;quot;&amp;gt;CS01&amp;lt;/th&amp;gt;&amp;lt;th align=&amp;quot;left&amp;quot;&amp;gt;CS00&amp;lt;/th&amp;gt;&amp;lt;th align=&amp;quot;left&amp;quot;&amp;gt;Bedeutung&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;keine (Der Timer ist angehalten)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Vorteiler:    1&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Vorteiler:    8&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Vorteiler:   64&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Vorteiler:  256&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Vorteiler: 1024&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Externer Takt vom Pin T0, fallende Flanke&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Externer Takt vom Pin T0, steigende Flanke&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TIMSK===&lt;br /&gt;
  +------+------+------+------+------+------+------+------+&lt;br /&gt;
  |      |      |      |      |      |      |      | TOIE0|&lt;br /&gt;
  +------+------+------+------+------+------+------+------+&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;i&amp;gt;TOIE0         Timer 0 Overflow Interrupt Enable&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    Ist dieses Bit gesetzt, so wird beim Auftreten eines&lt;br /&gt;
    Overflows am Timer ein Interrupt ausgelöst.&lt;br /&gt;
&lt;br /&gt;
Anstatt der Schreibweise&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
        ldi     temp, 0b00000001      ; TOIE0: Interrupt bei Timer Overflow&lt;br /&gt;
        out     TIMSK, temp&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
ist es besser, die Schreibweise&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
        ldi     temp, 1 &amp;lt;&amp;lt; TOIE0&lt;br /&gt;
        out     TIMSK, temp&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
zu wählen, da hier unmittelbar aus dem Ladekommando hervorgeht, welche Bedeutung das gesetzte Bit hat. Die vorher inkludierte m8def.inc definiert dazu alles Notwendige.&lt;br /&gt;
&lt;br /&gt;
==Timer 1==&lt;br /&gt;
&lt;br /&gt;
Timer 1 ist ein 16 Bit Timer&lt;br /&gt;
&lt;br /&gt;
* Overflow Interrupt&lt;br /&gt;
* Clear Timer on Compare Match&lt;br /&gt;
* Input Capture&lt;br /&gt;
* 2 Compare Einheiten&lt;br /&gt;
* div. PWM Modi&lt;br /&gt;
&lt;br /&gt;
===TCCR1B===&lt;br /&gt;
  +------+------+------+------+------+------+------+------+&lt;br /&gt;
  | ICNC1| ICES1|      | WGM13| WGM12| CS12 | CS11 | CS10 |&lt;br /&gt;
  +------+------+------+------+------+------+------+------+&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;i&amp;gt;CS12 - CS10   Clock Select&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;CS12&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;CS11&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;CS10&amp;lt;/th&amp;gt;&amp;lt;th align=&amp;quot;left&amp;quot;&amp;gt;Bedeutung&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;keine (Der Timer ist angehalten)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Vorteiler:    1&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Vorteiler:    8&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Vorteiler:   64&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Vorteiler:  256&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Vorteiler: 1024&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Externer Takt vom Pin T1, fallende Flanke&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Externer Takt vom Pin T1, steigende Flanke&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;i&amp;gt;ICES1   Input Capture Edge Select&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;i&amp;gt;ICNC1   Input Capture Noise Canceler&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TCCR1A===&lt;br /&gt;
  +------+------+------+------+------+------+------+------+&lt;br /&gt;
  |COM1A1|COM1A0|COM1B1|COM1B0|FOC1A |FOC1B |WGM11 |WGM10 |&lt;br /&gt;
  +------+------+------+------+------+------+------+------+&lt;br /&gt;
&lt;br /&gt;
===OCR1A===&lt;br /&gt;
  +------+------+------+------+------+------+------+------+&lt;br /&gt;
  |      |      |      |      |      |      |      |      |&lt;br /&gt;
  +------+------+------+------+------+------+------+------+&lt;br /&gt;
&lt;br /&gt;
  +------+------+------+------+------+------+------+------+&lt;br /&gt;
  |      |      |      |      |      |      |      |      |&lt;br /&gt;
  +------+------+------+------+------+------+------+------+&lt;br /&gt;
&lt;br /&gt;
===OCR1B===&lt;br /&gt;
  +------+------+------+------+------+------+------+------+&lt;br /&gt;
  |      |      |      |      |      |      |      |      |&lt;br /&gt;
  +------+------+------+------+------+------+------+------+&lt;br /&gt;
&lt;br /&gt;
  +------+------+------+------+------+------+------+------+&lt;br /&gt;
  |      |      |      |      |      |      |      |      |&lt;br /&gt;
  +------+------+------+------+------+------+------+------+&lt;br /&gt;
&lt;br /&gt;
===ICR1===&lt;br /&gt;
  +------+------+------+------+------+------+------+------+&lt;br /&gt;
  |      |      |      |      |      |      |      |      |&lt;br /&gt;
  +------+------+------+------+------+------+------+------+&lt;br /&gt;
&lt;br /&gt;
  +------+------+------+------+------+------+------+------+&lt;br /&gt;
  |      |      |      |      |      |      |      |      |&lt;br /&gt;
  +------+------+------+------+------+------+------+------+&lt;br /&gt;
&lt;br /&gt;
===TIMSK===&lt;br /&gt;
  +------+------+------+------+------+------+------+------+&lt;br /&gt;
  |      |      |TICIE1|OCIE1A|OCIE1B| TOIE1|      |      |&lt;br /&gt;
  +------+------+------+------+------+------+------+------+&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;i&amp;gt;TICIE1    Timer 1 Input Capture Interrupt Enable&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;i&amp;gt;OCIE1A    Timer 1 Output Compare A Match Interrupt Enable&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;i&amp;gt;OCIE1B    Timer 1 Output Compare B Match Interrupt Enable&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;i&amp;gt;TOIE1     Timer 1 Overflow Interrupt Enable&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Timer 2==&lt;br /&gt;
Timer 2 ist ein 8 Bit Timer.&lt;br /&gt;
&lt;br /&gt;
* Overflow Interrupt&lt;br /&gt;
* Compare Match Interrupt&lt;br /&gt;
* Clear Timer on Compare Match&lt;br /&gt;
* Phasen korrekte PWM&lt;br /&gt;
&lt;br /&gt;
===TCCR2===&lt;br /&gt;
  +------+------+------+------+------+------+------+------+&lt;br /&gt;
  | FOC2 | WGM20| COM21| COM20| WGM21| CS22 | CS21 | CS20 |&lt;br /&gt;
  +------+------+------+------+------+------+------+------+&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;i&amp;gt;CS22 - CS20   Clock Select&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;CS22&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;CS21&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;CS20&amp;lt;/th&amp;gt;&amp;lt;th align=&amp;quot;left&amp;quot;&amp;gt;Bedeutung&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;keine (Der Timer ist angehalten)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Vorteiler:    1&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Vorteiler:    8&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Vorteiler:   32&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Vorteiler:   64&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Vorteiler:  128&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Vorteiler:  256&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Vorteiler: 1024&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===OCR2===&lt;br /&gt;
  +------+------+------+------+------+------+------+------+&lt;br /&gt;
  |      |      |      |      |      |      |      |      |&lt;br /&gt;
  +------+------+------+------+------+------+------+------+&lt;br /&gt;
&lt;br /&gt;
===TIMSK===&lt;br /&gt;
  +------+------+------+------+------+------+------+------+&lt;br /&gt;
  | OCIE2| TOIE2|      |      |      |      |      |      |&lt;br /&gt;
  +------+------+------+------+------+------+------+------+&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;i&amp;gt;OCIE2   Timer 2 Output Compare Interrupt Enable&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;i&amp;gt;TOIE2   Timer 2 Overflow Interrupt Enable&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Was geht noch mit einem Timer?==&lt;br /&gt;
&lt;br /&gt;
Timer sind sehr universelle Microcontroller Bestandteile. Für weitergehende Studien ist es daher unerlässlich, das entsprechende Datenblatt des Microcontrollers zu studieren. Oft ist es z.B. möglich, dass der Timer bei erreichen von bestimmten Zählerständen einen Ausgabepin von sich aus ein-/aus-/umschaltet. Er erledigt dann das, was wir oben noch mit einem Interrupt gemacht haben, eigenständig komplett in Hardware. Bei einigen Timern ist es möglich, damit eine [[PWM]] (Pulsweiten-Modulation) aufzubauen.&lt;br /&gt;
&lt;br /&gt;
Ein paar der Timermodule lassen sich auch als Counter verwenden. Damit kann man z.B. die Anzahl externer Ereignisse wie Schaltvorgänge eines Inkrementalgebers bestimmen.&lt;br /&gt;
&lt;br /&gt;
Andere bieten die Möglichkeit, über einen externen Uhrenquarz getaktet zu werden (Anwendung z.B. eine &amp;quot;Echtzeituhr&amp;quot; oder als &amp;quot;Weckfunktion&amp;quot; aus einem&lt;br /&gt;
Standby/Powerdownmodus).&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* Timer/Counter und PWM beim ATMega16 Mikrocontroller: http://www.uni-koblenz.de/~physik/informatik/MCU/Timer.pdf &lt;br /&gt;
&lt;br /&gt;
{{Navigation_zurückhochvor|&lt;br /&gt;
zurücktext=Speicher|&lt;br /&gt;
zurücklink=AVR-Tutorial: Speicher|&lt;br /&gt;
hochtext=Inhaltsverzeichnis|&lt;br /&gt;
hochlink=AVR-Tutorial|&lt;br /&gt;
vortext=Uhr|&lt;br /&gt;
vorlink=AVR-Tutorial: Uhr}}&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]][[Category:AVR-Tutorial]]&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Temperatursensor&amp;diff=32193</id>
		<title>Temperatursensor</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Temperatursensor&amp;diff=32193"/>
		<updated>2008-10-26T20:48:15Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* LM75 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Will man mit einem [[Mikrocontroller]] Temperaturen messen, dann braucht man&lt;br /&gt;
* einen [[Sensor]], der die Temperatur z.B. in eine Spannung oder einen Strom umwandelt&lt;br /&gt;
* einen [[ADC | AD-Wandler]], der das Signal digitalisiert. Der kann auf dem Sensor oder dem Mikrocontroller integriert sein.&lt;br /&gt;
&lt;br /&gt;
Temperatursensoren gibt es nun in allen möglichen Varianten. Vom temperaturabhängigen [[Widerstand]] bis zum fertig abgeglichenen All-in-one-Bauteil mit digitalem Ausgang. Wie bei allen Sensoren sollte man auch hier genau hinschauen und [[Auflösung und Genauigkeit]] unterscheiden.&lt;br /&gt;
&lt;br /&gt;
== Analoge Temperatursensoren ==&lt;br /&gt;
&lt;br /&gt;
=== PT100 ===&lt;br /&gt;
&lt;br /&gt;
Unter einem PT100 versteht man einen Platinwiderstand, der bei 0°C einen Widerstand von 100 Ohm hat.&lt;br /&gt;
Platinwiderstände sind temperaturabhängige Widerstände mit hoher Wiederholgenauigkeit und Konstanz.  Wegen der relativ geringen Widerstandsänderung von nur ca. 0,4 Ohm pro Grad ist etwas mehr Schaltungsaufwand erforderlich als bei anderen Sensoren. Genauere Formeln zur Temperaturbestimmung gibt es u.a. bei der [http://de.wikipedia.org/wiki/Pt100 Wikipedia]. Einen Schaltplan findet sich bei der [http://www.heise.de/ct/04/22/236/ c&#039;t].&lt;br /&gt;
&lt;br /&gt;
Die Sensoren gibt es auch mit anderen Widerstandswerten, z.B. mit 1000&amp;amp;Omega; und heißen dann entsprechend PT1000.&lt;br /&gt;
&lt;br /&gt;
Vorteil:&lt;br /&gt;
* genormt&lt;br /&gt;
* hohe Linearität&lt;br /&gt;
* hohe Wiederholgenauigkeit&lt;br /&gt;
* einfach austauschbar&lt;br /&gt;
&lt;br /&gt;
Nachteil:&lt;br /&gt;
* relativ teuer (bei segor.de ab 3,80&amp;amp;euro;)&lt;br /&gt;
* brauchen aufwendigere Auswerteschaltung&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* [http://www.heise.de/ct/04/22/236/ c&#039;t-Artikel: Mikrocontroller-Programmierung: Timer, Sensoren und Drehgeber (mit PT100 Schaltung)]&lt;br /&gt;
&lt;br /&gt;
=== NTC/PTC ===&lt;br /&gt;
&lt;br /&gt;
NTC und PTC sind temperaturabhängige Widerstände.&lt;br /&gt;
&lt;br /&gt;
* NTC (engl. &#039;&#039;&#039;N&#039;&#039;&#039;egative &#039;&#039;&#039;T&#039;&#039;&#039;emperature &#039;&#039;&#039;C&#039;&#039;&#039;oefficient, Heißleiter), hat bei hohen Temperaturen seinen niedrigsten Widerstand, z.B. Silizium&lt;br /&gt;
* PTC (engl. &#039;&#039;&#039;P&#039;&#039;&#039;ositive &#039;&#039;&#039;T&#039;&#039;&#039;emperature &#039;&#039;&#039;C&#039;&#039;&#039;oefficient, Kaltleiter), hat bei niedrigen Temperaturen seinen geringsten Widerstand, z.B. Glühlampe&lt;br /&gt;
&lt;br /&gt;
Um den Widerstandswert zu messen schaltet man sie mit einem normalen Widerstand oder einer [[Konstantstromquelle]] in Reihe zu einem [[Spannungsteiler]] und misst den Spannungsabfall. Eine Beispielschaltung findet sich [http://www.mathar.com/msp_thermo1.html hier].&lt;br /&gt;
&lt;br /&gt;
Vorteil:&lt;br /&gt;
* billig (Reichelt 0,29 &amp;amp;euro;)&lt;br /&gt;
&lt;br /&gt;
Nachteil:&lt;br /&gt;
* müssen abgeglichen werden&lt;br /&gt;
* brauchen A/D-Wandler&lt;br /&gt;
* sind nichtlinear&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* [http://www.sprut.de/electronic/temeratur/temp.htm Temperaturabhängige Stromquelle und NTC/PTC inclusive Linearisierung]&lt;br /&gt;
&lt;br /&gt;
=== LMx35 ===&lt;br /&gt;
&lt;br /&gt;
Eine IC-Familie, die pro Kelvin Temperaturänderung ihre Ausgangsspannung um 10&amp;amp;nbsp;mV ändert. Die ICs gibt es in verschiedenen Genauigkeiten und Temperaturbereichen mit den Bezeichnungen LM135(A), LM235(A) und LM335(A). Der günstigste ist der LM335 mit einem Temperaturbereich von −40 … +100°C.&lt;br /&gt;
In verschiedenen Bauformen erhältlich. Beispielschaltungen finden sich im [http://www.national.com/ds.cgi/LM/LM135.pdf Datenblatt] und [http://www.suessbrich.info/elek/elektherm1.html hier]&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* hat auch ohne Kalibrierung eine Genauigkeit von einem Grad (bei 25°C)&lt;br /&gt;
* relativ billig (LM335 bei Reichelt ab 0,50&amp;amp;nbsp;€)&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* benötigt A/D-Wandler&lt;br /&gt;
* bei längerer Anschlussleitung störanfällig&lt;br /&gt;
&lt;br /&gt;
=== LM334 ===&lt;br /&gt;
&lt;br /&gt;
Ein IC ähnlich dem LM335 mit dem Unterschied, dass der durch das IC fließende Strom proportional von der Temperatur abhängt. Mit einer einfachen Schaltung aus nur zwei Widerständen kann man dann den Strom in einer Weise wandeln, dass pro Kelvin eine Spannungsänderung von 10mV ausgegeben wird. Da die Strom-Spannungswandlung auf der Platine (und damit nahe am AD-Wandler) stattfindet und die Übertragung des Messwerts durch einen Strom stattfindet, sind Störungen durch Netzbrumm etc. viel geringer als beim LM335&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* hat auch ohne Kalibrierung eine Genauigkeit von einem Grad (bei 25°C)&lt;br /&gt;
* relativ billig ([http://www.reichelt.de/?ARTICLE=10468 Reichelt 0,54 &amp;amp;euro;])&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* benötigt A/D-Wandler&lt;br /&gt;
* Bereich 0°C-70°C&lt;br /&gt;
&lt;br /&gt;
Ähnliche ICs:&lt;br /&gt;
* AD592 (Ausgangsstrom 1µA pro Kelvin, absolute Temperatur) [http://www.reichelt.de/?ARTICLE=3825 Reichelt: 3,75 €], Conrad 174912 8,50 &amp;amp;euro;&lt;br /&gt;
&lt;br /&gt;
=== SMT160-30 ===&lt;br /&gt;
&lt;br /&gt;
Ist ein Zwischending zwischen Digital und Analog. Sein Ausgangssignal ist ein digitales PWM-Signal, zu dessen Messung man am besten den Input-Capture-Eingang eines Mikrocontrollers verwendet. Man kann ihn also wie einen analogen Sensor nur indirekt auslesen, anstatt über einen AD-Wandler hier über einen Timer.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* Digitales PWM-Signal ist unempfindlich gegen Störeinflüsse&lt;br /&gt;
* gibt es in SO8, TO18, TO92 und &amp;lt;b&amp;gt;TO220&amp;lt;/b&amp;gt;, gut befestigbar, z.B am Kühlkörper&lt;br /&gt;
* linear&lt;br /&gt;
* kein Abgleich nötig&lt;br /&gt;
&lt;br /&gt;
Nachteile (viele):&lt;br /&gt;
* benötigt Timer&lt;br /&gt;
* jittert extrem, genaue Messungen nur über Mittelung / Filterung möglich&lt;br /&gt;
* nicht nur das PWM-Verhältnis, sondern auf die Frequenz ist temp-abhängig (1-4kHz)&lt;br /&gt;
* teuer (Farnell 10,90&amp;amp;euro; +16%, Conrad 9,xx&amp;amp;euro; , www.hy-line.de ??).&lt;br /&gt;
* TO92 Gehäuse ist günstiger, dafür weniger genau&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* http://www.hy-line.de/co/sensor-tec/hersteller/smartec/smt-160-30/index.html&lt;br /&gt;
&lt;br /&gt;
=== Thermoelement ===&lt;br /&gt;
&lt;br /&gt;
Ein Thermoelement besteht im einfachsten Fall aus zwei ungleichen Metallendrähten, die an einem Punkt miteinander verbunden sind und bei dem die Verbindungsstelle einer anderen Temperatur ausgesetzt ist als die offenen Enden der Drähte. An den offenen Enden der Drähten entsteht eine Spannung (Thermospannung). Dieser Effekt wurde 1821 von Thomas Seebeck entdeckt ([http://de.wikipedia.org/wiki/Seebeck-Effekt Seebeck-Effekt] bei Wikipedia). Eine weitere Anwendung ist der thermoelektrische Generator (&amp;quot;Thermogenerator&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Vorteil:&lt;br /&gt;
* über einen sehr weiten Temperaturbereich einsetzbar&lt;br /&gt;
&lt;br /&gt;
Nachteil:&lt;br /&gt;
* die sehr geringen Temperaturspannungen im Mikrovoltbereich benötigen eine sehr gute Auswertelektronik (guter Analogteil + AD-Wandler).&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* [http://digital.ni.com/worldwide/germany.nsf/web/all/7A4F02BAEFEC22AC802567F6003E0D6E  Temperaturmessung mit Thermoelementen] - Eine Einführung von David Potter (deutsche Überarbeitung: G.Sinkovic) (inkl. Erläuterung der Kaltstellenkompensation)&lt;br /&gt;
* [http://www.ipetronik.com/pdf/Newsletter/Ipetronik_NL2_2004_d.pdf Warum Thermoelemente Relativtemperaturen messen! oder Was ist eine Kaltstelle?] - Technische Information von www.ipetronik.com (PDF, 272 KB)&lt;br /&gt;
&lt;br /&gt;
== Digitale Temperatursensoren ==&lt;br /&gt;
&lt;br /&gt;
=== DS1621 ===&lt;br /&gt;
&lt;br /&gt;
Der DS1621 ist Temperatursensor und A/D-Wandler in einem. Er gibt seine Daten per [[I²C]]-[[Bus]] aus. Ein Schaltplan für einen elektronischen Thermometer mit diesem IC findet sich [http://www.myplace.nu/avr/thermo/ hier].&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* bereits kalibriert&lt;br /&gt;
* kein A/D-Wandler nötig&lt;br /&gt;
* da I²C ein Bus ist, kann man mehrere DS1621 und andere I²C-Bausteine zusammen anschließen und braucht dafür trotzdem nur zwei I/O-Ports.&lt;br /&gt;
* Messbereich -55°C to +125°C &lt;br /&gt;
* Genauigkeit +-0,5°&lt;br /&gt;
* Auflösung besser 0,01°, wenn man die beiden Zählerregister (Count-Remain und Count-per-C) auswertet&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* teuer (Segor 5,80&amp;amp;euro;; RS 3,95&amp;amp;euro;; Conrad 4,99&amp;amp;euro;)&lt;br /&gt;
* trotzdem die meisten Register [[Speicher#NVRAM | nichtflüchtig]] sind, kann man ihn nicht als Stand-Alone-Thermostat einsetzen, da er erst nach einem Start-Conversion-Befehl zu messen beginnt.&lt;br /&gt;
&lt;br /&gt;
Nachfolger:&lt;br /&gt;
* DS1631, DS1631A (Auto-Start-&amp;gt; Stand-Alone-Thermostat), DS1731&lt;br /&gt;
* weitere Stand-Alone-Thermostaten: DS1821, DS1629&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LM75 ===&lt;br /&gt;
&lt;br /&gt;
Der LM75 ist so ähnlich wie der DS1621, allerdings nur in SMD erhältlich und nicht so genau. Er ist aber öfters mal auf PC-Mainboards zu finden, so dass man beim Schlachten eines solchen günstig an einen Temperatursensor kommen kann. Einen Schaltplan findet man [http://www.mcselec.com/index.php?option=com_docman&amp;amp;task=cat_view&amp;amp;gid=83&amp;amp;limit=1&amp;amp;limitstart=35 hier].&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* bereits kalibriert&lt;br /&gt;
* kein A/D-Wandler nötig&lt;br /&gt;
* I²C-Bus Ausgang&lt;br /&gt;
* billiger als DS1621 (Reichelt 1,35 &amp;amp;euro;; RS 3V: 3,75&amp;amp;euro;; 5V: 2,72&amp;amp;euro;)&lt;br /&gt;
* Auflösung 0,5°&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* nur im SMD-Gehäuse erhältlich&lt;br /&gt;
* relativ ungenau (+-2°), kann man jedoch kalibrieren / kompensieren&lt;br /&gt;
&lt;br /&gt;
Kompatible Typen:&lt;br /&gt;
* AD7415ART&lt;br /&gt;
&lt;br /&gt;
=== DS18S20 / DS18B20 ===&lt;br /&gt;
&lt;br /&gt;
Der DS18S20 (Nachfolger des DS1820) und DS18B20 sind scheinbar Temperatursensoren und A/D-Wandler in einem. Wenn man genauer hinschaut, stellt man fest, dass es sich um direktwandelnde Sensoren handelt. Die Temperatur wird ohne Umweg über eine analoge Zwischengröße (Spannung oder Strom) in ein digitales Signal überführt. Die Datenkommunikation erfolgt über ein 1-Wire-Interface, wodurch man am [[Mikrocontroller]] mit nur einen einzigen I/O-Pin auskommen kann. Außerdem beherrschen sie die parasitäre Stromversorgung, d.h. man braucht für Daten und Stromversorgung zusammen nur zwei Leitungen.  Der DS18B20 hat 12 Bit Auflösung gegenüber 9 Bit Auflösung beim DS18S20.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* bereits kalibriert&lt;br /&gt;
* Genauigkeit +-0,5°&lt;br /&gt;
* 1-Wire-Ausgang&lt;br /&gt;
&lt;br /&gt;
Nachteil:&lt;br /&gt;
* ziemlich teuer (Reichelt 3,10&amp;amp;euro;)&lt;br /&gt;
* bei http://shop.medhost.at/ für 3,24&amp;amp;euro; (2,70&amp;amp;euro;+20%UST) + Versand EU 6&amp;amp;euro;&lt;br /&gt;
&lt;br /&gt;
Vereinzelte Preise&lt;br /&gt;
* DS 1822       ---&amp;gt; 3,50              bei Reichelt&lt;br /&gt;
*               ---&amp;gt; 5,08              bei Conrad&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* [http://chaokhun.kmitl.ac.th/~kswichit/avrthermo/avrthermo.html Ein Schaltplan]&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/read-4-27035.html Code zur Ansteuerung]&lt;br /&gt;
* [http://pdfserv.maxim-ic.com/en/ds/DS18S20.pdf Datenblatt DS18S20] &lt;br /&gt;
* [http://pdfserv.maxim-ic.com/en/ds/DS18B20.pdf Datenblatt DS18B20]&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/read-4-248219.html Webserver zur Ansteuerung von bis zu 63 Bausteinen]&lt;br /&gt;
&lt;br /&gt;
=== DS1921 / DS1922 ===&lt;br /&gt;
&lt;br /&gt;
Sind wie die DS1821 1-wire-Sensoren mit zusätzlicher Logging-Funktion.&lt;br /&gt;
Im iButton-Gehäuse befindet sich eine Lithium-Zelle, eine RTC, CMOS-RAM und der Temp-Sensor. Nach umfangreicher Progammierung startet der Button seine Mission (Aufzeichnung des Temperaturverlaufs).&lt;br /&gt;
Gibt es auch mit zusätzlicher Feuchtemessung (DS1923).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TSic ===&lt;br /&gt;
&lt;br /&gt;
Die TSic Sensoren werden gleich von 3 Herstellern angeboten (Die Sensoren sind aber alle baugleich):&lt;br /&gt;
* ZMD&lt;br /&gt;
* IST AG&lt;br /&gt;
* Hygrosens&lt;br /&gt;
&lt;br /&gt;
Die TSic Sensoren geben ihre Temperaturmessdaten automatisch in einem festen Intervall aus. Daher muss der Host nur warten bis die nächsten Messdaten rausgeschickt werden. Die TSic Sensoren die es im freien Handel gibt, geben ihre Messdaten alle 100ms (10Hz) aus. &lt;br /&gt;
Zur Übertragung wird das ZACwire Protokoll benutzt. Es handelt sich um eine einfach zwei Byte Übertragung per Manchester-Code. Diese zwei Byte repräsentieren den digital gewandelten Temperaturwert. Im Gegensatz zu Sensoren wie den DS18xxx von Dallas muss dieser Wert aber erst auf einen dezimalen Wert umgerechnet werden. &lt;br /&gt;
Die Sensoren kommen mit 3 Pins aus (VCC, GND, Dout).&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* Bereits kalibriert&lt;br /&gt;
* Verschiedene Genauigkeiten lieferbar&lt;br /&gt;
* Sehr einfaches Kommunikationsprotokoll&lt;br /&gt;
* Geringer Stromverbrauch&lt;br /&gt;
* Hochgenau: bis zu +/- 0.1°C&lt;br /&gt;
&lt;br /&gt;
Nachteil:&lt;br /&gt;
* Recht teuer (Conrad: 5,08&amp;amp;euro; für den TSic206)&lt;br /&gt;
* Nur ein Sensor an einem I/O nutzbar (Kein Bussystem)&lt;br /&gt;
&lt;br /&gt;
Achtung! &lt;br /&gt;
Die TSic Sensoren gibt es auch als Version mit analog Ausgang. Bei der Typenbezeichnung gibt die 3. Stelle an ob es sich um die analog- oder Digitalversion handelt (1 = analog, 6 = digital). &lt;br /&gt;
Der TSic201 ist also analog, wärend der TSic206 ein digitaler ist.&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/82087 Diskussion mit Beispielcode]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SHT1x/SHT7x ===&lt;br /&gt;
&lt;br /&gt;
Der SHT1x/SHT7x (SHT10, SHT11, SHT15, STH71, SHT75) sind kombinierte Temperatur- und Feuchtesensoren von [http://www.sensirion.com Sensirion]. Sie unterscheiden sich in Bauform und Genauigkeit.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* digitale Schnittstelle mit einfacher [[I²C]]-&#039;&#039;ähnlicher&#039;&#039; Ansteuerung&lt;br /&gt;
* keine Kalibrierung notwendig&lt;br /&gt;
* Beispielcode (C, MC51) auf der Sensirion-Seite verfügbar (relativ leicht portierbar)&lt;br /&gt;
* interne Heizelemente (Funktionsprüfung, &amp;quot;rauhe&amp;quot; Umgebung)&lt;br /&gt;
* Spannungsmonitor (&amp;quot;Battery fail&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* kann nicht am [[I²C]] Bus betrieben werden, theoretisch gleiche Clockleitung möglich, fixe Adresse&lt;br /&gt;
* relativ teuer (Farnell 18,60&amp;amp;euro;)&lt;br /&gt;
&lt;br /&gt;
[[Category:Bauteile]]&lt;br /&gt;
[[Category:Sensorik]]&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=31774</id>
		<title>Benutzer:Rotoe</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=31774"/>
		<updated>2008-10-10T17:44:40Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Persönliche Daten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Robin Tönniges - ICQ: 216193451=&lt;br /&gt;
&lt;br /&gt;
== Persönliche Daten ==&lt;br /&gt;
Name: Robin Tönniges&amp;lt;br/&amp;gt;&lt;br /&gt;
Alter: 17&amp;lt;br/&amp;gt;&lt;br /&gt;
Geburtsdatum: 07.07.1991&amp;lt;br/&amp;gt;&lt;br /&gt;
Ausbildung seit 01.09.08 als EAT bei K+S&amp;lt;br/&amp;gt;&lt;br /&gt;
Montl. Einkommen: 478,64 Euro&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hobby-Werdegang ==&lt;br /&gt;
Ich bin seit 2002 begeisterter Hobbyelektroniker und habe mich sei dem&lt;br /&gt;
durch das Internet und ein paar gute Bekannte fortgebildet. Unterwegs bin ich auch auf den Modellflug gestoßen was mt meinen Hobby natürlich perfekt harmoniert.&lt;br /&gt;
Seit dem habe ich gelernt AVR&#039;s in C zu programmieren kenne die wichtigesten Grundlagen, Formeln und el. Bauteile.&lt;br /&gt;
&lt;br /&gt;
== Vorhaben ==&lt;br /&gt;
Ich möchte FPGA&#039;s programmieren lernen. Weiß nicht warum. Auf jedefall ist es irgendwie reizvoll. Aber erstmal muss ich AVR-C richtig beherrschen bevor ich was Neues anfange.&lt;br /&gt;
&lt;br /&gt;
== Letze Errungenschaften ==&lt;br /&gt;
* STK600 (10.10.08)&lt;br /&gt;
* Parkzone T-28 Trojan (06.06.08)&lt;br /&gt;
* Digitalkamera Casio EX-Z12 (06.05.2008)&lt;br /&gt;
* STK500 (04.04.2008)&lt;br /&gt;
* HAMEG HM-605 (2002)&lt;br /&gt;
&lt;br /&gt;
== Wunschliste ==&lt;br /&gt;
* Tablet PC&lt;br /&gt;
* Digitales Speicher Oszilloskop&lt;br /&gt;
&lt;br /&gt;
== Bisher gebaute Sachen ==&lt;br /&gt;
* NiCd/NiMh Ladegerät&lt;br /&gt;
* RC-Multitester&lt;br /&gt;
* Akkutester mit einstellbarer Zellenzahl und Grafikdisplay&lt;br /&gt;
* LC-Meter&lt;br /&gt;
* 1-30V 0-3A Netzteil&lt;br /&gt;
* 5W Röhrenoszillator&lt;br /&gt;
* ATmega8 Experimentierplatine&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Atmega32_Experimentierplatine ATmega32 Experimentierplatine]&lt;br /&gt;
* Mini-Multimeter&lt;br /&gt;
* PC-Akkutester&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=31773</id>
		<title>Benutzer:Rotoe</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=31773"/>
		<updated>2008-10-10T17:44:25Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Persönliche Daten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Robin Tönniges - ICQ: 216193451=&lt;br /&gt;
&lt;br /&gt;
== Persönliche Daten ==&lt;br /&gt;
Name: Robin Tönniges&amp;lt;br/&amp;gt;&lt;br /&gt;
Alter: 17&amp;lt;br/&amp;gt;&lt;br /&gt;
Geburtsdatum: 07.07.1991&amp;lt;br/&amp;gt;&lt;br /&gt;
Ausbildung seit 01.09.08 als EAT&amp;lt;br/&amp;gt;&lt;br /&gt;
Montl. Einkommen: 478,64 Euro&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hobby-Werdegang ==&lt;br /&gt;
Ich bin seit 2002 begeisterter Hobbyelektroniker und habe mich sei dem&lt;br /&gt;
durch das Internet und ein paar gute Bekannte fortgebildet. Unterwegs bin ich auch auf den Modellflug gestoßen was mt meinen Hobby natürlich perfekt harmoniert.&lt;br /&gt;
Seit dem habe ich gelernt AVR&#039;s in C zu programmieren kenne die wichtigesten Grundlagen, Formeln und el. Bauteile.&lt;br /&gt;
&lt;br /&gt;
== Vorhaben ==&lt;br /&gt;
Ich möchte FPGA&#039;s programmieren lernen. Weiß nicht warum. Auf jedefall ist es irgendwie reizvoll. Aber erstmal muss ich AVR-C richtig beherrschen bevor ich was Neues anfange.&lt;br /&gt;
&lt;br /&gt;
== Letze Errungenschaften ==&lt;br /&gt;
* STK600 (10.10.08)&lt;br /&gt;
* Parkzone T-28 Trojan (06.06.08)&lt;br /&gt;
* Digitalkamera Casio EX-Z12 (06.05.2008)&lt;br /&gt;
* STK500 (04.04.2008)&lt;br /&gt;
* HAMEG HM-605 (2002)&lt;br /&gt;
&lt;br /&gt;
== Wunschliste ==&lt;br /&gt;
* Tablet PC&lt;br /&gt;
* Digitales Speicher Oszilloskop&lt;br /&gt;
&lt;br /&gt;
== Bisher gebaute Sachen ==&lt;br /&gt;
* NiCd/NiMh Ladegerät&lt;br /&gt;
* RC-Multitester&lt;br /&gt;
* Akkutester mit einstellbarer Zellenzahl und Grafikdisplay&lt;br /&gt;
* LC-Meter&lt;br /&gt;
* 1-30V 0-3A Netzteil&lt;br /&gt;
* 5W Röhrenoszillator&lt;br /&gt;
* ATmega8 Experimentierplatine&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Atmega32_Experimentierplatine ATmega32 Experimentierplatine]&lt;br /&gt;
* Mini-Multimeter&lt;br /&gt;
* PC-Akkutester&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=31772</id>
		<title>Benutzer:Rotoe</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=31772"/>
		<updated>2008-10-10T17:43:23Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Wunschliste */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Robin Tönniges - ICQ: 216193451=&lt;br /&gt;
&lt;br /&gt;
== Persönliche Daten ==&lt;br /&gt;
Name: Robin Tönniges&amp;lt;br/&amp;gt;&lt;br /&gt;
Alter: 17&amp;lt;br/&amp;gt;&lt;br /&gt;
Geburtsdatum: 07.07.1991&amp;lt;br/&amp;gt;&lt;br /&gt;
Ausbildung ab 1.09 als EAT&amp;lt;br/&amp;gt;&lt;br /&gt;
Montl. Einkommen: 478,64 Euro&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hobby-Werdegang ==&lt;br /&gt;
Ich bin seit 2002 begeisterter Hobbyelektroniker und habe mich sei dem&lt;br /&gt;
durch das Internet und ein paar gute Bekannte fortgebildet. Unterwegs bin ich auch auf den Modellflug gestoßen was mt meinen Hobby natürlich perfekt harmoniert.&lt;br /&gt;
Seit dem habe ich gelernt AVR&#039;s in C zu programmieren kenne die wichtigesten Grundlagen, Formeln und el. Bauteile.&lt;br /&gt;
&lt;br /&gt;
== Vorhaben ==&lt;br /&gt;
Ich möchte FPGA&#039;s programmieren lernen. Weiß nicht warum. Auf jedefall ist es irgendwie reizvoll. Aber erstmal muss ich AVR-C richtig beherrschen bevor ich was Neues anfange.&lt;br /&gt;
&lt;br /&gt;
== Letze Errungenschaften ==&lt;br /&gt;
* STK600 (10.10.08)&lt;br /&gt;
* Parkzone T-28 Trojan (06.06.08)&lt;br /&gt;
* Digitalkamera Casio EX-Z12 (06.05.2008)&lt;br /&gt;
* STK500 (04.04.2008)&lt;br /&gt;
* HAMEG HM-605 (2002)&lt;br /&gt;
&lt;br /&gt;
== Wunschliste ==&lt;br /&gt;
* Tablet PC&lt;br /&gt;
* Digitales Speicher Oszilloskop&lt;br /&gt;
&lt;br /&gt;
== Bisher gebaute Sachen ==&lt;br /&gt;
* NiCd/NiMh Ladegerät&lt;br /&gt;
* RC-Multitester&lt;br /&gt;
* Akkutester mit einstellbarer Zellenzahl und Grafikdisplay&lt;br /&gt;
* LC-Meter&lt;br /&gt;
* 1-30V 0-3A Netzteil&lt;br /&gt;
* 5W Röhrenoszillator&lt;br /&gt;
* ATmega8 Experimentierplatine&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Atmega32_Experimentierplatine ATmega32 Experimentierplatine]&lt;br /&gt;
* Mini-Multimeter&lt;br /&gt;
* PC-Akkutester&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=31771</id>
		<title>Benutzer:Rotoe</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=31771"/>
		<updated>2008-10-10T17:42:50Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Robin Tönniges - ICQ: 216193451=&lt;br /&gt;
&lt;br /&gt;
== Persönliche Daten ==&lt;br /&gt;
Name: Robin Tönniges&amp;lt;br/&amp;gt;&lt;br /&gt;
Alter: 17&amp;lt;br/&amp;gt;&lt;br /&gt;
Geburtsdatum: 07.07.1991&amp;lt;br/&amp;gt;&lt;br /&gt;
Ausbildung ab 1.09 als EAT&amp;lt;br/&amp;gt;&lt;br /&gt;
Montl. Einkommen: 478,64 Euro&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hobby-Werdegang ==&lt;br /&gt;
Ich bin seit 2002 begeisterter Hobbyelektroniker und habe mich sei dem&lt;br /&gt;
durch das Internet und ein paar gute Bekannte fortgebildet. Unterwegs bin ich auch auf den Modellflug gestoßen was mt meinen Hobby natürlich perfekt harmoniert.&lt;br /&gt;
Seit dem habe ich gelernt AVR&#039;s in C zu programmieren kenne die wichtigesten Grundlagen, Formeln und el. Bauteile.&lt;br /&gt;
&lt;br /&gt;
== Vorhaben ==&lt;br /&gt;
Ich möchte FPGA&#039;s programmieren lernen. Weiß nicht warum. Auf jedefall ist es irgendwie reizvoll. Aber erstmal muss ich AVR-C richtig beherrschen bevor ich was Neues anfange.&lt;br /&gt;
&lt;br /&gt;
== Letze Errungenschaften ==&lt;br /&gt;
* STK600 (10.10.08)&lt;br /&gt;
* Parkzone T-28 Trojan (06.06.08)&lt;br /&gt;
* Digitalkamera Casio EX-Z12 (06.05.2008)&lt;br /&gt;
* STK500 (04.04.2008)&lt;br /&gt;
* HAMEG HM-605 (2002)&lt;br /&gt;
&lt;br /&gt;
== Wunschliste ==&lt;br /&gt;
* Tablet PC&lt;br /&gt;
&lt;br /&gt;
== Bisher gebaute Sachen ==&lt;br /&gt;
* NiCd/NiMh Ladegerät&lt;br /&gt;
* RC-Multitester&lt;br /&gt;
* Akkutester mit einstellbarer Zellenzahl und Grafikdisplay&lt;br /&gt;
* LC-Meter&lt;br /&gt;
* 1-30V 0-3A Netzteil&lt;br /&gt;
* 5W Röhrenoszillator&lt;br /&gt;
* ATmega8 Experimentierplatine&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Atmega32_Experimentierplatine ATmega32 Experimentierplatine]&lt;br /&gt;
* Mini-Multimeter&lt;br /&gt;
* PC-Akkutester&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=30873</id>
		<title>Benutzer:Rotoe</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=30873"/>
		<updated>2008-09-05T19:59:10Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Bisher gebaute Sachen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Robin Tönniges - ICQ: 216193451=&lt;br /&gt;
&lt;br /&gt;
== Persönliche Daten ==&lt;br /&gt;
Name: Robin Tönniges&amp;lt;br/&amp;gt;&lt;br /&gt;
Alter: 17&amp;lt;br/&amp;gt;&lt;br /&gt;
Geburtsdatum: 07.07.1991&amp;lt;br/&amp;gt;&lt;br /&gt;
Ausbildung ab 1.09 als EAT&amp;lt;br/&amp;gt;&lt;br /&gt;
Montl. Einkommen: 478,64 Euro&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hobby-Werdegang ==&lt;br /&gt;
Ich bin seit 2002 begeisterter Hobbyelektroniker und habe mich sei dem&lt;br /&gt;
durch das Internet und ein paar gute Bekannte fortgebildet. Unterwegs bin ich auch auf den Modellflug gestoßen was mt meinen Hobby natürlich perfekt harmoniert.&lt;br /&gt;
Seit dem habe ich gelernt AVR&#039;s in C zu programmieren kenne die wichtigesten Grundlagen, Formeln und el. Bauteile.&lt;br /&gt;
&lt;br /&gt;
== Vorhaben ==&lt;br /&gt;
Ich möchte FPGA&#039;s programmieren lernen. Weiß nicht warum. Auf jedefall ist es irgendwie reizvoll. Aber erstmal muss ich AVR-C richtig beherrschen bevor ich was Neues anfange.&lt;br /&gt;
&lt;br /&gt;
== Letze Errungenschaften ==&lt;br /&gt;
* Parkzone T-28 Trojan (06.06.08)&lt;br /&gt;
* Digitalkamera Casio EX-Z12 (06.05.2008)&lt;br /&gt;
* STK500 (04.04.2008)&lt;br /&gt;
* HAMEG HM-605 (2002)&lt;br /&gt;
&lt;br /&gt;
== Wunschliste ==&lt;br /&gt;
* STK600&lt;br /&gt;
* Tablet PC&lt;br /&gt;
&lt;br /&gt;
== Bisher gebaute Sachen ==&lt;br /&gt;
* NiCd/NiMh Ladegerät&lt;br /&gt;
* RC-Multitester&lt;br /&gt;
* Akkutester mit einstellbarer Zellenzahl und Grafikdisplay&lt;br /&gt;
* LC-Meter&lt;br /&gt;
* 1-30V 0-3A Netzteil&lt;br /&gt;
* 5W Röhrenoszillator&lt;br /&gt;
* ATmega8 Experimentierplatine&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Atmega32_Experimentierplatine ATmega32 Experimentierplatine]&lt;br /&gt;
* Mini-Multimeter&lt;br /&gt;
* PC-Akkutester&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=30872</id>
		<title>Benutzer:Rotoe</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=30872"/>
		<updated>2008-09-05T19:58:23Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Wunschliste */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Robin Tönniges - ICQ: 216193451=&lt;br /&gt;
&lt;br /&gt;
== Persönliche Daten ==&lt;br /&gt;
Name: Robin Tönniges&amp;lt;br/&amp;gt;&lt;br /&gt;
Alter: 17&amp;lt;br/&amp;gt;&lt;br /&gt;
Geburtsdatum: 07.07.1991&amp;lt;br/&amp;gt;&lt;br /&gt;
Ausbildung ab 1.09 als EAT&amp;lt;br/&amp;gt;&lt;br /&gt;
Montl. Einkommen: 478,64 Euro&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hobby-Werdegang ==&lt;br /&gt;
Ich bin seit 2002 begeisterter Hobbyelektroniker und habe mich sei dem&lt;br /&gt;
durch das Internet und ein paar gute Bekannte fortgebildet. Unterwegs bin ich auch auf den Modellflug gestoßen was mt meinen Hobby natürlich perfekt harmoniert.&lt;br /&gt;
Seit dem habe ich gelernt AVR&#039;s in C zu programmieren kenne die wichtigesten Grundlagen, Formeln und el. Bauteile.&lt;br /&gt;
&lt;br /&gt;
== Vorhaben ==&lt;br /&gt;
Ich möchte FPGA&#039;s programmieren lernen. Weiß nicht warum. Auf jedefall ist es irgendwie reizvoll. Aber erstmal muss ich AVR-C richtig beherrschen bevor ich was Neues anfange.&lt;br /&gt;
&lt;br /&gt;
== Letze Errungenschaften ==&lt;br /&gt;
* Parkzone T-28 Trojan (06.06.08)&lt;br /&gt;
* Digitalkamera Casio EX-Z12 (06.05.2008)&lt;br /&gt;
* STK500 (04.04.2008)&lt;br /&gt;
* HAMEG HM-605 (2002)&lt;br /&gt;
&lt;br /&gt;
== Wunschliste ==&lt;br /&gt;
* STK600&lt;br /&gt;
* Tablet PC&lt;br /&gt;
&lt;br /&gt;
== Bisher gebaute Sachen ==&lt;br /&gt;
* Akkutester mit einstellbarer Zellenzahl und Grafikdisplay&lt;br /&gt;
* LC-Meter&lt;br /&gt;
* 1-30V 0-3A Netzteil&lt;br /&gt;
* 5W Röhrenoszillator&lt;br /&gt;
* ATmega8 Experimentierplatine&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Atmega32_Experimentierplatine ATmega32 Experimentierplatine]&lt;br /&gt;
* Mini-Multimeter&lt;br /&gt;
* PC-Akkutester&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=GPS-Maus_Falcom_Navi-S-1&amp;diff=30057</id>
		<title>GPS-Maus Falcom Navi-S-1</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=GPS-Maus_Falcom_Navi-S-1&amp;diff=30057"/>
		<updated>2008-08-13T14:39:35Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Firmwarewiederherstellung nach fehlgeschlagenem Update */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieser Artikel wird noch ergänzt.&lt;br /&gt;
&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
{| border=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Chipsatz:&lt;br /&gt;
|SiRF2&lt;br /&gt;
|-&lt;br /&gt;
|Versorgungsspannung:&lt;br /&gt;
|5V (3,5 bis 7V)&lt;br /&gt;
|-&lt;br /&gt;
|Schnittstelle:&lt;br /&gt;
|Seriell, 3,3 Volt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Anschlussbelegung ====&lt;br /&gt;
Wenn man das angebrachte Kabel abmantelt, findet man vier Adern vor. Die Belegung ist wie folgt:&lt;br /&gt;
{| border=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Gelb:&lt;br /&gt;
|V&amp;lt;sub&amp;gt;cc&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Grün:&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|Rot:&lt;br /&gt;
|TX&lt;br /&gt;
|-&lt;br /&gt;
|Weiß:&lt;br /&gt;
|RX&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Um die Funktion und den Empfang der Module zu testen, ist das Programm SiRFDemo nützlich. Weiterhin kann man mit diesem Programm die Module konfigurieren.&amp;lt;br /&amp;gt; Firmwareupdates können mit dem Programm SiRFflash durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
== Standardeinstellungen ==&lt;br /&gt;
Nach dem Einschalten werden folgende NMEA-Daten mit 38400 Baud ausgegeben: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$PSRFTXT,Version: 2.4.13.00-XTrac2.0.1-C3PROD1.0 0000003721 *17&lt;br /&gt;
$PSRFTXT,TOW:  0*25&lt;br /&gt;
$PSRFTXT,WK:   1255*66&lt;br /&gt;
$PSRFTXT,POS:  6378137 0 0*2A&lt;br /&gt;
$PSRFTXT,CLK:  96250*25&lt;br /&gt;
$PSRFTXT,CHNL: 12*73&lt;br /&gt;
$PSRFTXT,Baud rate: 38400  System clock: 24.553MHz*45&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Danach folgen nur noch RMC-Nachrichten.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
=== Schnittstelle ===&lt;br /&gt;
Die GPS-Mäuse senden in der Ausgangskonfiguration Daten im SiRF-Binary Protokoll. Man kann die Module aber auch auf NMEA mit beliebigen Baudraten umstellen. Einstellbare Datensätze sind GPRMC, GPGGA, GPGSA, GPGSV, GPGLL, GPVTG und GPMSS. Die Umstellung kann über das Programm SiRFDemo erfolgen. Unter den Einstellungen sind auch die Datensätze User8, User9 und User10 aufgeführt. Beim JP7T versteckt sich hinter User9 der GPZDA-Datensatz.&lt;br /&gt;
&lt;br /&gt;
=== Power-Management ===&lt;br /&gt;
Im Auslieferungszustand, also mit XTrac-Firmware, wird das Advanced Power Management von SiRF unterstützt. Damit sind Positionsraten von 10 bis 180 Sekunden möglich. Weiterhin kann man dem Modul vorgeben, wie viel % der Zeit es eingeschaltet sein soll, und ob die Positionsrate oder der Stromverbrauch Priorität besitzt.&lt;br /&gt;
&lt;br /&gt;
Die JP7T-Firmware dagegen bietet die Modi Trickle-Power und Push-to-Fix an. In Trickle-Power sind Positionsraten zwischen 1 und 10 Sekunden möglich. Im Modus Push-to-Fix schaltet das Modul sich in einen Energiespar-Modus, Positionsupdates können über den Pin &amp;quot;RESET_N&amp;quot; angefordert werden. Die GPS-Maus muss dazu natürlich aufgebrochen werden, um an das Modul dranzukommen... Laut Datenblatt lohnt sich Push-to-Fix erst ab einer Positionsraten von etwa 600 Sekunden.&lt;br /&gt;
&lt;br /&gt;
Die Befehle zum Einschalten der Energiespar-Modi sind im Datenblatt beschrieben. SiRFDemo ist dazu ebenfalls in der Lage.&lt;br /&gt;
=== PPS-Timing ===&lt;br /&gt;
Die XTrac-Firmware unterstützt offenbar keinerlei Timing-Funktionen. Um diese nutzen zu können, muss die JP7T- oder JP7TH-Firmware aufgespielt werden.&lt;br /&gt;
==== SiRF Timing Message ====&lt;br /&gt;
Kann in SiRFDemo über Action / Set Message Rate eingeschaltet werden. Dort 0x34 PPS Timing auswählen und die Update-Rate auf 1 Sekunde einstellen.&lt;br /&gt;
==== GPZDA-Datensatz ====&lt;br /&gt;
Kann ausgewählt werden, wenn man das Modul in den NMEA-Modus umschaltet. Verbirgt sich hinter &amp;quot;User9&amp;quot;, nachdem man die JP7-T Firmware aufgespielt hat.&lt;br /&gt;
&lt;br /&gt;
==== 1-PPS-Puls ====&lt;br /&gt;
Weiterhin ist beim JP7T der 1-PPS-Puls  (1 PulsePerSecond) am GPS-Modul an Pin 29 abgreifbar. Laut Datenblatt hat der 1-PPS-Puls CMOS-Pegel und eine Länge von 100ms. Zeitreferenz ist die positive Flanke. Die Genauigkeit liegt unter 1µs im Vergleich zu einem Referenz PPS Puls.&lt;br /&gt;
&lt;br /&gt;
[[Bild:1PPSPulse.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
Die Firmware wird mit dem Programm SiRFflash (Download siehe Weblinks) auf das Modul aufgespielt. Einstellungen: &amp;quot;Baud rate&amp;quot; auf 38400 Baud verringern, &amp;quot;Target boot mode state setting&amp;quot; auf &amp;quot;External&amp;quot;, &amp;quot;Programming options&amp;quot; auf &amp;quot;Erase whole chip&amp;quot;. Dann per &amp;quot;Browse&amp;quot; die neue Firmware auswählen und mit &amp;quot;Execute&amp;quot; den Update-Prozess starten. Das Flashen funktioniert recht zuverlässig.&lt;br /&gt;
=== JP7TX (XTrac) ===&lt;br /&gt;
Im Auslieferungszustand befindet sich eine SiRF XTrac-Firmware auf dem Modul. Die Module mit dieser Firmware nennen sich JP7TX, einen Hardware-Unterschied zu JP7T-Modulen gibt es laut Falcom nicht.&lt;br /&gt;
==== Erklärung XTrac ====&lt;br /&gt;
[http://www.pocketgpsworld.com/xtracornoxtrac.php Hier] findet sich eine gute Erklärung der Unterschiede zwischen XTrac und normaler Firmware.&lt;br /&gt;
&lt;br /&gt;
Die wichtigsten sind:&lt;br /&gt;
* XTrac ist viel empfindlicher&lt;br /&gt;
* XTrac ist u.U. etwas langsamer&lt;br /&gt;
* XTrac kennt keinen TricklePower-Modus&lt;br /&gt;
=== JP7T ===&lt;br /&gt;
Weiterhin ist eine Firmware für das JP7T vorhanden. Wenn man die Firmware aufspielt, werden beim ersten Start einige Debug-Meldungen ausgegeben. Teilweise verschwinden die von selbst, man kann sie aber auch über SiRFDemo abschalten. (Action / Set Message Rate, dort 0xFF auswählen, Rate auf 0s stehen lassen und &amp;quot;Send&amp;quot; klicken.) Die TTFF ist beim Cold Start etwas länger. Vereinzelt soll der Empfang damit besser als vorher sein.&lt;br /&gt;
=== JP7TH ===&lt;br /&gt;
Zusätzlich ist noch eine Firmware für Datenlogger vorhanden, genannt JP7TH. Die Firmware baut auf der des JP7T auf. Ein Handbuch dazu ist unter den Weblinks aufgeführt.&lt;br /&gt;
&lt;br /&gt;
Ein kleines Tool für die Filtereinstellungen und das Auslesen der gespeicherten GPS Punkte ist hier zu finden (.NET 2.0 ist Vorraussetzung, Programm noch im Alpha Stadium, voll funktionsfähig, aber nicht DAU sicher)&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/attachment/38432/Falcom_GPS_Logger_Settings.exe Nur das Programm]&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/attachment/38433/Falcom_GPS_Logger_Settings.zip komplett mit Sourcecode]&lt;br /&gt;
&lt;br /&gt;
=== Firmwarewiederherstellung nach fehlgeschlagenem Update ===&lt;br /&gt;
Sollte nach einem Firmwareupdate das Modul nicht mehr reagieren (das Modul gibt weder Daten aus, noch ist es über SiRFFlash ansprechbar), kann man versuchen die Software mittels internen Bootloader des Moduls zu übertragen. Hierzu muss Pin 3 des Moduls (BOOT_SELECT)über einen Pull-Up-Widerstand (z.B. 1k) auf Vcc gezogen werden. Danach kann man mit SiRFFlash und der Einstellung &#039;&#039;Target boot mode state setting&#039;&#039; auf &#039;&#039;Internal&#039;&#039; die neue Firmware an das Modul übertragen (die restlichen Einstellungen sollten wie zuvor beschrieben gesetzt sein).&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
Im Modul befindet sich eine Patchantenne, darunter eine weitere Platine mit dem GPS-Modul Falcom JP7TX. &lt;br /&gt;
&lt;br /&gt;
=== Spannungsregler ===&lt;br /&gt;
Das Modul wird über einen Linearregler [http://www.datasheetcatalog.org/datasheets/105/187365_DS.pdf MIC5205-3.3BM5] mit 3,3 Volt versorgt. Außerdem befindet sich noch ein kleiner Akku auf der Platine, der als Backup-Versorgung für das SRAM dient. &lt;br /&gt;
Der Spannungsregler kann 150mA liefern, das GPS-Modul zieht ca. 60mA. Wenn man also ein Kabel an der 3.3V-Leitung anlötet kann man auch noch die eigene Schaltung damit versorgen. Aufpassen muss man lediglich mit der zulässigen Verlustleistung.&lt;br /&gt;
&lt;br /&gt;
Laut Datenblatt:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\theta_{JA} = 220 K/W&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
mit &amp;lt;math&amp;gt;P = (U_{in}-U_{out}) * I&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
und einer maximalen Chiptemperatur von 125°C und einer angenommen Umgebungstemperatur von 60°C (Sommer + Eigenerwärumg nach längerem Betrieb)&amp;lt;br&amp;gt;&lt;br /&gt;
ergibt sich somit folgender Maximalstrom in Abhängigkeit von der Eingangsspannung:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;I_{max} =\frac{65 K}{220 K/W * (U_{in} - 3.3V)} = 0.3W / (U_{in} - 3.3V)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wertebeispiele:&lt;br /&gt;
* 5V (USB): 174mA begrenzt durch die maximal erlaubten 150mA&lt;br /&gt;
* 7V (Mitgelieferter Zigarettenanzünderstecker): 81mA&lt;br /&gt;
* 12V: 30mA (zuwenig zum Betrieb des Moduls)&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man wenn ohnehin 3.3V in der Schaltung zur Verfügung stehen auch einfach den Spannungsregler ausbauen und das Modul direkt mit 3.3V speisen.&lt;br /&gt;
&lt;br /&gt;
=== Pegelwandler ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf der Platine ist noch Platz für einen Pegelwandler; Ob ein Umbau auf RS232 damit funktioniert wurde bisher noch nicht getestet. Vorgesehen ist dafür ein ICL3221. Zum Umbau müssen vermutlich die beiden 0-Ohm-Widerstände entfernt werden, anschließend müssen dann zusätzlich zum IC noch an 5 Stellen 100nF-Kondensatoren eingelötet werden.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/104240 ursprünglicher µC.net Thread &amp;gt;GPS - Empfänger günstig bei Ebay&amp;lt;]&lt;br /&gt;
*[http://www.falcom.de/support/software-tools/sirf/ falcom.de Downloadbereich, SiRFDemo, SiRFflash]&lt;br /&gt;
*[http://www.mikrocontroller.net/attachment/37464/komplett_-_aktuell_-_JP7.zip Zip-Archiv mit allen aktuellen Firmwares]&lt;br /&gt;
*[http://www.falcom.de/uploads/media/JP7_T_Family_1.04.pdf Datenblatt des verwendeten GPS-Moduls]&lt;br /&gt;
*[http://www.falcom.de/uploads/media/JP7-T_family_datalogger_functionality_v1.01.pdf Handbuch zur Datenlogger-Funktionalität]&lt;br /&gt;
*[http://www.gpsinformation.org/dale/nmea.htm Verständliche Beschreibung des NMEA-Protokolls]&lt;br /&gt;
*[http://gpsd.berlios.de/references.html Links zu jeder Menge nützlicher Dokumente, insbesondere der Protokollbeschreibung von SIRF]&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_LCD&amp;diff=29879</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=29879"/>
		<updated>2008-08-09T17:26:37Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Anschluss an den Controller */&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.B. KS0070) und haben 14 oder 16 Pins. Die Pinbelegung ist praktisch immer gleich: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;table width=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th width=&amp;quot;50&amp;quot; align=&amp;quot;left&amp;quot;&amp;gt;Pin #&amp;lt;/th&amp;gt;&amp;lt;th  width=&amp;quot;70&amp;quot; align=&amp;quot;left&amp;quot;&amp;gt;Bezeichnung&amp;lt;/th&amp;gt;&amp;lt;th align=&amp;quot;left&amp;quot;&amp;gt;Funktion&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&#039;&#039;&#039;1&#039;&#039;&#039;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Vss&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;GND&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&#039;&#039;&#039;2&#039;&#039;&#039;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Vcc&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5V&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&#039;&#039;&#039;3&#039;&#039;&#039;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Vee&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Kontrastspannung (0V bis 5V)&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&#039;&#039;&#039;4&#039;&#039;&#039;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Register Select (Befehle/Daten)&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&#039;&#039;&#039;5&#039;&#039;&#039;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Read/Write&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&#039;&#039;&#039;6&#039;&#039;&#039;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;E&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Enable&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&#039;&#039;&#039;7&#039;&#039;&#039;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;DB0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Datenbit 0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&#039;&#039;&#039;8&#039;&#039;&#039;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;DB1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Datenbit 1&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&#039;&#039;&#039;9&#039;&#039;&#039;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;DB2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Datenbit 2&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&#039;&#039;&#039;10&#039;&#039;&#039;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;DB3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Datenbit 3&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&#039;&#039;&#039;11&#039;&#039;&#039;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;DB4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Datenbit 4&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&#039;&#039;&#039;12&#039;&#039;&#039;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;DB5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Datenbit 5&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&#039;&#039;&#039;13&#039;&#039;&#039;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;DB6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Datenbit 6&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&#039;&#039;&#039;14&#039;&#039;&#039;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;DB7&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Datenbit 7&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&#039;&#039;&#039;15&#039;&#039;&#039;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;LED-Beleuchtung, Anode&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&#039;&#039;&#039;16&#039;&#039;&#039;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;K&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;LED-Beleuchtung, Kathode&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&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. &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;
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.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 4 Bit 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; 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 verarbeitet hat. Ist RS auf Daten eingestellt, dann kann man z.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 LCD benötigt, können wir das LCD mit dem Mikrocontroller verbinden: &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&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 || Vss || GND&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |2 || Vcc || 5V&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |3 || Vee || GND oder [[Potentiometer | Poti]] &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 +5V anschließbar,&amp;lt;BR&amp;gt;nur über einen Vorwiderstand (z.B. 330&amp;amp;Omega;)!&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |16 || K || GND&lt;br /&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. Doch wie bekommt man jetzt die Befehle und Daten in das Display?&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;avrasm&amp;gt;&lt;br /&gt;
           swap r16               ; vertauscht die beiden Nibbles von r16&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aus 0b00100101 wird so z.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 PORTB, 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;avrasm&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;/avrasm&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 Bit 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;avrasm&amp;gt;&lt;br /&gt;
           sbr r16, 0b00010000     ; Bit 4 setzen, alle anderen Bits bleiben gleich&lt;br /&gt;
&amp;lt;/avrasm&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;avrasm&amp;gt;&lt;br /&gt;
           out PORTD, r16&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Natürlich muss vorher der Port D auf Ausgang geschalten 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: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&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;/avrasm&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.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 im 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 umstellt&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;
=== Initialisierung im 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.&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 ==&lt;br /&gt;
&lt;br /&gt;
Die Routinen zur Kommunikation mit dem LCD sehen also so aus: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&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;
 &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                          ; 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:                              ; 50us 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  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;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anm.1: Siehe [[Bitmanipulation]]&lt;br /&gt;
&lt;br /&gt;
Weitere Funktionen (wie z.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. &lt;br /&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.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. &lt;br /&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.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;avrasm&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;
           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;/avrasm&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;avrasm&amp;gt;&lt;br /&gt;
           ldi temp1, &#039;T&#039;&lt;br /&gt;
&amp;lt;/avrasm&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;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;.0&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;x1&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;x2&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;x3&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;x4&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;x5&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;x6&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;x7&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;x8&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;x9&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;xA&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;xB&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;xC&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;xD&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;xE&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;xF&amp;lt;/th&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&#039;&#039;&#039;0x&#039;&#039;&#039;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NUL&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SOH&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;STX&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ETX&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;EOT&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ENQ&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ACK&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;BEL&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;BS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;HT&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;LF&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;VT&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FF&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;CR&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SO&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SI&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&#039;&#039;&#039;1x&#039;&#039;&#039;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;DLE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;DC1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;DC2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;DC3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;DC4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NAK&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SYN&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ETB&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;CAN&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;EM&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SUB&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ESC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;GS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;US&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&#039;&#039;&#039;2x&#039;&#039;&#039;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SP&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;!&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;#&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;$&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;%&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;amp;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&#039;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;)&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;*&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;+&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;,&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;.&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;/&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&#039;&#039;&#039;3x&#039;&#039;&#039;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;7&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;:&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;=&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;?&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&#039;&#039;&#039;4x&#039;&#039;&#039;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;@&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;B&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;C&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;D&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;E&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;F&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;G&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;H&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;I&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;J&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;K&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;L&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;M&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;O&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&#039;&#039;&#039;5x&#039;&#039;&#039;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;P&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Q&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;R&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;S&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;T&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;U&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;V&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;W&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;X&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Y&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Z&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;[&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;\&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;]&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;^&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;_&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&#039;&#039;&#039;6x&#039;&#039;&#039;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;`&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;a&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;b&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;c&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;d&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;e&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;f&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;g&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;h&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;i&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;j&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;k&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;l&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;m&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;n&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;o&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&#039;&#039;&#039;7x&#039;&#039;&#039;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;p&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;q&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;r&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;s&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;t&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;u&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;v&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;w&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;x&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;y&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;z&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;|&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;~&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;DEL&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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;avrasm&amp;gt;&lt;br /&gt;
           ldi temp1, &#039;T&#039;&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
durch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
           ldi temp1, $54&lt;br /&gt;
&amp;lt;/avrasm&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 Kontroller 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;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;dieses Bit muss 0 sein&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;dieses Bit muss 1 sein&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;x&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;der Zustand dieses Bits ist egal&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;sonstige Buchstaben&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;das Bit muss je nach gewünschter Funktionalität gesetzt werden. Die mögliche Funktionalität des jeweiligen Bits geht aus der Befehlsbeschreibung hervor&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&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 Pixelzeile (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 32 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;
&lt;br /&gt;
RS  R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0&lt;br /&gt;
--- --- --- --- --- --- --- --- --- ---&lt;br /&gt;
 0   0   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;
===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:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&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;
 &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:                              ; 50us 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 Bot, 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;/avrasm&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.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.B. &#039;&#039;&#039;PORTB&#039;&#039;&#039; gelegt, dann genügt es, die Zeilen&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
.equ LCD_PORT = PORTD&lt;br /&gt;
.equ LCD_DDR  = DDRD&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
durch&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
.equ LCD_PORT = PORTB&lt;br /&gt;
.equ LCD_DDR  = DDRB&lt;br /&gt;
&amp;lt;/avrasm&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;avrasm&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;/avrasm&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;avrasm&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;/avrasm&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;avrasm&amp;gt;&lt;br /&gt;
delay50us:                              ; 50us 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;/avrasm&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;avrasm&amp;gt;&lt;br /&gt;
.equ XTAL  = 4000000&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
delay50us:                              ; 50us 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;/avrasm&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;avrasm&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;/avrasm&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 alo 1 + 603 + 1 + 2 = 607 Takte verbraucht. Da die äußere Schleife $21 = 33 mal wiederholt wird, werden 20031 Takte verbraucht. Bei 4Mhz benötigt der Prozessor 20031 / 4000000 = 0.005007 Sekunden, also 5 ms.&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. Auch diese Berechnung kann wieder der Assembler übernehmen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&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;/avrasm&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 holt und ausgibt. Dabei erhebt sich aber eine Fragestellung: Woher weiß die Funktion eigentlich, wie lange 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, 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;avrasm&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;
&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   temp1&lt;br /&gt;
           ret&lt;br /&gt;
&amp;lt;/avrasm&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;avrasm&amp;gt;&lt;br /&gt;
           lpm   temp1, Z+&lt;br /&gt;
&amp;lt;/avrasm&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;avrasm&amp;gt;&lt;br /&gt;
           cpi   temp1, 0&lt;br /&gt;
           breq  lcd_flash_string_2&lt;br /&gt;
&amp;lt;/avrasm&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;avrasm&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;/avrasm&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 weiterbehandelt, indem festgestellt wird wieviele Zehner darin enthalten sind. Auch hier wiederrum: In einer Schleife solange 10 abziehen, bis das Ergebnis nagativ 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;avrasm&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  temp2            ; die Funktion verändert temp2, also sichern&lt;br /&gt;
                                  ; wir den Inhalt, um ihn am Ende wieder&lt;br /&gt;
                                  ; 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;
           ldi   temp1, &#039;0&#039;&lt;br /&gt;
lcd_number_1:&lt;br /&gt;
           subi  temp2, 100       ; 100 abziehen&lt;br /&gt;
           brcs  lcd_number_2     ; ist dadurch ein Unterlauf entstanden?&lt;br /&gt;
           inc   temp1            ; Nein: 1 Hunderter mehr ...&lt;br /&gt;
           rjmp  lcd_number_1     ; ... und ab zur nächsten Runde&lt;br /&gt;
;&lt;br /&gt;
                                  ; die Hunderterstelle ausgeben&lt;br /&gt;
lcd_number_2:&lt;br /&gt;
           rcall lcd_data&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;
&lt;br /&gt;
                                  ; abzählen wieviele Zehner in&lt;br /&gt;
                  ; der Zahl enthalten sind&lt;br /&gt;
           ldi   temp1, &#039;0&#039;&lt;br /&gt;
lcd_number_3:&lt;br /&gt;
           subi  temp2, 10        ; 10 abziehen&lt;br /&gt;
           brcs  lcd_number_4     ; ist dadurch ein Unterlauf enstanden?&lt;br /&gt;
           inc   temp1            ; Nein: 1 Zehner mehr ...&lt;br /&gt;
           rjmp  lcd_number_3     ; ... und ab zur nächsten Runde&lt;br /&gt;
&lt;br /&gt;
                              ; die Zehnerstelle ausgeben&lt;br /&gt;
lcd_number_4:&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
           subi  temp2, -10       ; 10 wieder dazuzählen, da die&lt;br /&gt;
                              ; vorhergehende Schleife 10 zuviel&lt;br /&gt;
                  ; abgezogen hat&lt;br /&gt;
&lt;br /&gt;
                                  ; die übrig gebliebenen Einer&lt;br /&gt;
                  ; noch ausgeben&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;
           pop   temp2            ; den gesicherten Inhalt von temp2 wieder herstellen&lt;br /&gt;
           ret                    ; und zurück&lt;br /&gt;
&amp;lt;/avrasm&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;avrasm&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;/avrasm&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;
&#039;&#039;&#039;Achtung: Diese Routine ist fehlerhaft&#039;&#039;&#039;&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 bzw. Zehnerstelle muss lediglich überprüft werden, ob die Entsprechende Ausgabe eine &#039;0&#039; wäre. Ist sie das, so wird die Ausgabe übersprungen. Lediglich in der Einerstelle wird jede Ziffer wie errechnet ausgegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
           ...&lt;br /&gt;
                                  ; die Hunderterstelle ausgeben, wenn&lt;br /&gt;
                                  ; sie nicht &#039;0&#039; ist&lt;br /&gt;
lcd_number_2:&lt;br /&gt;
           cpi   temp1, &#039;0&#039;&lt;br /&gt;
           breq  lcd_number_2a&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
lcd_number_2a:&lt;br /&gt;
           subi  temp2, -100      ; 100 wieder dazuzählen, da die&lt;br /&gt;
           ...&lt;br /&gt;
&lt;br /&gt;
           ...&lt;br /&gt;
                              ; die Zehnerstelle ausgeben, wenn&lt;br /&gt;
                  ; sie nicht &#039;0&#039; ist&lt;br /&gt;
lcd_number_4:&lt;br /&gt;
           cpi   temp1, &#039;0&#039;&lt;br /&gt;
           breq  lcd_number_4a&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
lcd_number_4a:&lt;br /&gt;
           subi  temp2, -10       ; 10 wieder dazuzählen, da die&lt;br /&gt;
           ...&lt;br /&gt;
&amp;lt;/avrasm&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;avrasm&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 Konstante verwendet, 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;/avrasm&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;avrasm&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;
	   in temp1, SREG;    &lt;br /&gt;
	   push temp1		  ; SREG gesichert&lt;br /&gt;
	   push temp2&lt;br /&gt;
	   push temp3&lt;br /&gt;
&lt;br /&gt;
	   mov temp2, temp1;  &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;
           out SREG, temp1;&lt;br /&gt;
	   pop temp1&lt;br /&gt;
	   ret&lt;br /&gt;
&amp;lt;/avrasm&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;avrasm&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;
; die Zehntausenderstellen abzählen ...&lt;br /&gt;
           ldi   temp1, &#039;0&#039;&lt;br /&gt;
lcd_number0:&lt;br /&gt;
           subi  temp2, low(10000)&lt;br /&gt;
           sbci  temp3, high(10000)&lt;br /&gt;
           brcs  lcd_number1&lt;br /&gt;
           inc   temp1&lt;br /&gt;
           rjmp  lcd_number0&lt;br /&gt;
&lt;br /&gt;
; .. und ausgeben&lt;br /&gt;
lcd_number1:&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
           subi  temp2, low(-10000)&lt;br /&gt;
           sbci  temp3, high(-10000)&lt;br /&gt;
&lt;br /&gt;
; die Tausenderstellen abzählen ...&lt;br /&gt;
           ldi   temp1, &#039;0&#039;&lt;br /&gt;
lcd_number2:&lt;br /&gt;
           subi  temp2, low(1000)&lt;br /&gt;
           sbci  temp3, high(1000)&lt;br /&gt;
           brcs  lcd_number3&lt;br /&gt;
           inc   temp1&lt;br /&gt;
           rjmp  lcd_number2&lt;br /&gt;
&lt;br /&gt;
; ... und ausgeben&lt;br /&gt;
lcd_number3:&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
           subi  temp2, low(-1000)&lt;br /&gt;
           sbci  temp3, high(-1000)&lt;br /&gt;
&lt;br /&gt;
; Als nächtes kommt die Hunderterstelle drann&lt;br /&gt;
           ldi   temp1, &#039;0&#039;&lt;br /&gt;
lcd_number4:&lt;br /&gt;
           subi  temp2, low(100)&lt;br /&gt;
           sbci  temp3, high(100)&lt;br /&gt;
           brcs  lcd_number5&lt;br /&gt;
           inc   temp1&lt;br /&gt;
           rjmp  lcd_number4&lt;br /&gt;
&lt;br /&gt;
; und ausgeben&lt;br /&gt;
lcd_number5:&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
           subi  temp2, -100&lt;br /&gt;
&lt;br /&gt;
; bleiben noch die Zehner&lt;br /&gt;
           ldi   temp1, &#039;0&#039;&lt;br /&gt;
lcd_number6:&lt;br /&gt;
           subi  temp2, 10&lt;br /&gt;
           brcs  lcd_number7&lt;br /&gt;
           inc   temp1&lt;br /&gt;
           rjmp  lcd_number6&lt;br /&gt;
&lt;br /&gt;
; ausgeben ...&lt;br /&gt;
lcd_number7:&lt;br /&gt;
           rcall lcd_data&lt;br /&gt;
           subi  temp2, -10&lt;br /&gt;
&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;
; fertig. Stack wieder aufräumen&lt;br /&gt;
           pop   temp1&lt;br /&gt;
           pop   temp2&lt;br /&gt;
           pop   temp3&lt;br /&gt;
&lt;br /&gt;
           ret&lt;br /&gt;
&amp;lt;/avrasm&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]][[Category:AVR-Tutorial]]&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_IO-Grundlagen&amp;diff=29864</id>
		<title>AVR-Tutorial: IO-Grundlagen</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_IO-Grundlagen&amp;diff=29864"/>
		<updated>2008-08-09T12:28:17Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Programmerklärung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hardware ==&lt;br /&gt;
Für die ersten Versuche braucht man nur ein paar Taster und [[LED]]s an die IO-Ports des AVRs anzuschließen. An &#039;&#039;&#039;PB0-PB5&#039;&#039;&#039; schließt man 6 LEDs über einen Vorwiderstand von je 1 kΩ gegen Vcc (5V) an. In der Praxis ist es unerheblich, ob der Widerstand vor oder nach der Diode liegt, wichtig ist nur, dass er da ist. Weitere Details zu LEDs und entsprechenden Vorwiderständen findet ihr im Artikel über [[LED]]s und in diesem [http://www.mikrocontroller.net/topic/66109 Thread im Forum].&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/images/led.gif&lt;br /&gt;
&lt;br /&gt;
Dass die LEDs an den gleichen Pins wie der ISP-Programmer angeschlossen sind, stört übrigens normalerweise nicht. Falls wider Erwarten deshalb Probleme auftreten sollten, kann man versuchen, den Vorwiderstand der LEDs zu vergrößern.&lt;br /&gt;
&lt;br /&gt;
An &#039;&#039;&#039;PD0-PD3&#039;&#039;&#039; kommen 4 Taster mit je einem 10 kΩ Pullup-Widerstand:&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/images/taster.gif&lt;br /&gt;
&lt;br /&gt;
Sven Holthaus&lt;br /&gt;
&lt;br /&gt;
==Zahlensysteme==&lt;br /&gt;
Bevor es losgeht, hier noch ein paar Worte zu den verschiedenen Zahlensystemen.&lt;br /&gt;
&lt;br /&gt;
Binärzahlen werden für den Assembler im Format &#039;&#039;&#039;0b00111010&#039;&#039;&#039; geschrieben, Hexadezimalzahlen als &#039;&#039;&#039;0x7F&#039;&#039;&#039;. Umrechnen kann man die Zahlen z.B. mit dem Windows-Rechner. Hier ein paar Beispiele:&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr align=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;th&amp;gt;Dezimal&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Hexadezimal&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Binär&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0x00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0b00000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0x01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0b00000001&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0x02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0b00000010&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0x03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0b00000011&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0x04&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0b00000100&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0x05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0b00000101&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;td&amp;gt;6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0x06&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0b00000110&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;td&amp;gt;7&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0x07&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0b00000111&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;td&amp;gt;8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0x08&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0b00001000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;td&amp;gt;9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0x09&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0b00001001&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;td&amp;gt;10&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0x0A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0b00001010&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;td&amp;gt;11&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0x0B&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0b00001011&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;td&amp;gt;12&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0x0C&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0b00001100&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;td&amp;gt;13&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0x0D&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0b00001101&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;td&amp;gt;14&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0x0E&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0b00001110&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;td&amp;gt;15&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0x0F&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0b00001111&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;td&amp;gt;100&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0x64&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0b01100100&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;td&amp;gt;255&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0xFF&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0b11111111&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;0b&amp;quot; und &amp;quot;0x&amp;quot; haben für die Berechnung keine Bedeutung, sie zeigen nur an, dass es sich bei dieser Zahl um eine Binär- bzw. Hexadezimalzahl handelt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=FF0000&amp;gt;Wichtig dabei ist es, dass Hexadezimal- bzw. Binärzahlen bzw. Dezimalzahlen nur unterschiedliche Schreibweisen für immer das Gleiche sind: Eine Zahl. Welche Schreibweise bevorzugt wird, hängt auch vom Verwendungszweck ab. Je nachdem kann die eine oder die andere Schreibweise klarer sein.&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=FF0000&amp;gt;Auch noch sehr wichtig: Computer und µCs beginnen immer bei 0 zu zählen, d.h. wenn es 8 Dinge (Bits etc.) gibt hat das erste die Nummer 0, das zweite die Nummer 1, ..., und das letzte (das 8.) die Nummer 7 (!).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ausgabe ==&lt;br /&gt;
=== Assembler-Sourcecode ===&lt;br /&gt;
&lt;br /&gt;
Unser erstes Assemblerprogramm, das wir auf dem Controller laufen lassen möchten, sieht so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;         ; Definitionsdatei für den Prozessortyp einbinden&lt;br /&gt;
&lt;br /&gt;
         ldi r16, 0xFF       ; lade Arbeitsregister r16 mit der Konstanten 0xFF&lt;br /&gt;
         out DDRB, r16       ; Inhalt von r16 ins IO-Register DDRB ausgeben&lt;br /&gt;
&lt;br /&gt;
         ldi r16, 0b11111100 ; 0b11111100 in r16 laden&lt;br /&gt;
         out PORTB, r16      ; r16 ins IO-Register PORTB ausgeben&lt;br /&gt;
&lt;br /&gt;
ende:    rjmp ende           ; Sprung zur Marke &amp;quot;ende&amp;quot; -&amp;gt; Endlosschleife&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Assemblieren ===&lt;br /&gt;
Das Programm muss mit der Endung &amp;quot;.asm&amp;quot; abgespeichert werden, z.B. als &amp;quot;leds.asm&amp;quot;. Diese Datei können wir aber noch nicht direkt auf den Controller programmieren. Zuerst müssen wir sie dem Assembler füttern. Bei wavrasm funktioniert das z.B., indem wir ein neues Fenster öffnen, den Programmtext hineinkopieren, speichern und auf &amp;quot;assemble&amp;quot; klicken. Wichtig ist, dass sich die Datei &amp;quot;m8def.inc&amp;quot; (wird beim Atmel-Assembler mitgeliefert) im gleichen Verzeichnis wie die Assembler-Datei befindet. Der Assembler übersetzt die Klartext-Befehle des Assemblercodes in für den Mikrocontroller verständlichen Binärcode und gibt ihn in Form einer sogenannten &amp;quot;Hex-Datei&amp;quot; aus. Diese Datei kann man dann mit der entsprechenden Software direkt in den Controller programmieren. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 1px solid grey; padding: 1ex;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hinweis: Konfigurieren der Taktversorgung des ATmega8 ===&lt;br /&gt;
&lt;br /&gt;
Beim &#039;&#039;&#039;ATmega8&#039;&#039;&#039; ist standardmäßig der interne 1 MHz-Oszillator aktiviert; weil dieser für viele Anwendungen (z.B. das UART, siehe späteres Kapitel) aber nicht genau genug ist, soll der Mikrocontroller seinen Takt aus dem angeschlossenen 4 MHz-Quarzoszillator beziehen. Dazu müssen ein paar Einstellungen an den &#039;&#039;&#039;Fusebits&#039;&#039;&#039; des Controllers vorgenommen werden. Am besten und sichersten geht das mit dem Programm [http://www.myplace.nu/avr/yaap/ yaap]. Wenn man das Programm gestartet hat und der ATmega8 richtig erkannt wurde, wählt man aus den Menüs den Punkt &amp;quot;Lock Bits &amp;amp; Fuses&amp;quot; und klickt zunächst auf &amp;quot;Read Fuses&amp;quot;. Das Ergebnis sollte so aussehen: [http://www.mikrocontroller.net/images/atmega8-vorher.png Screenshot]. Nun ändert man die Kreuze so, dass das folgende Bild entsteht: [http://www.mikrocontroller.net/images/atmega8-nachher.png Screenshot] und klickt auf &amp;quot;Write Fuses&amp;quot;. Vorsicht, wenn die Einstellungen nicht stimmen, kann es sein, dass die ISP-Programmierung deaktiviert wird und man den AVR somit nicht mehr programmieren kann! Die FuseBits bleiben übrigens nach dem Löschen des Controllers aktiv, müssen also nur ein einziges Mal eingestellt werden. Mehr über die Fuse-Bits findet sich im Artikel [[AVR Fuses]].&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach dem Assemblieren sollte eine neue Datei mit dem Namen &amp;quot;leds.hex&amp;quot; oder &amp;quot;leds.rom&amp;quot; vorhanden sein, die man mit yaap, PonyProg oder AVRISP in den Flash-Speicher des Mikrocontrollers laden kann. Wenn alles geklappt hat, leuchten jetzt die ersten beiden angeschlossenen LEDs.&lt;br /&gt;
&lt;br /&gt;
=== Programmerklärung ===&lt;br /&gt;
In der ersten Zeile wird die Datei m8def.inc eingebunden, welche die prozessortypischen Bezeichnungen für die verschiedenen Register definiert. Wenn diese Datei fehlen würde, wüsste der Assembler nicht, was mit &amp;quot;PORTB&amp;quot;, &amp;quot;DDRD&amp;quot; usw. gemeint ist. Für jeden AVR-Mikrocontroller gibt es eine eigene derartige Include-Datei, da zwar die Registerbezeichnungen bei allen Controllern mehr oder weniger gleich sind, die Register aber auf unterschiedlichen Controllern unterschiedlich am Chip angeordnet sind und nicht alle Funktionsregister auf allen Prozessoren existieren. Für einen ATmega8 beispielsweise würde die einzubindende Datei m8def.inc heißen. Normalerweise ist also im Namen der Datei der Name des Chips in irgendeiner Form, auch abgekürzt, enthalten. Kennt man den korrekten Namen einmal nicht, so sieht man ganz einfach nach. Alle Include-Dateien wurden von Atmel in einem gemeinsamen Verzeichnis gespeichert. Das Verzeichnis ist bei einer Standardinstallation am PC auf C:\Programme\Atmel\AVR Tools\AvrAssembler\Appnotes\. Einige Include-Dateien heißen&lt;br /&gt;
&lt;br /&gt;
  AT90s2313:  2313def.inc&lt;br /&gt;
  ATmega8:    m8def.inc&lt;br /&gt;
  ATmega16:   m16def.inc&lt;br /&gt;
  ATmega32:   m32def.inc&lt;br /&gt;
  ATTiny12:   tn12def.inc&lt;br /&gt;
  ATTiny2313: tn2313def.inc&lt;br /&gt;
&lt;br /&gt;
Um sicher zu gehen, dass man die richtige Include-Datei hat, kann man diese mit einem Texteditor (AVR-Studio oder Notepad) öffnen. Der Name des Prozessors wurde von Atmel immer an den Anfang der Datei geschrieben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
;***************************************************************************&lt;br /&gt;
;* A P P L I C A T I O N   N O T E   F O R   T H E   A V R   F A M I L Y&lt;br /&gt;
;* &lt;br /&gt;
;* Number               :AVR000&lt;br /&gt;
;* File Name            :&amp;quot;2313def.inc&amp;quot;&lt;br /&gt;
;* Title                :Register/Bit Definitions for the AT90S2313&lt;br /&gt;
;* Date                 :99.01.28&lt;br /&gt;
;* Version              :1.30&lt;br /&gt;
;* Support E-Mail       :avr@atmel.com&lt;br /&gt;
;* Target MCU           :AT90S2313&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aber jetzt weiter mit dem selbstgeschriebenen Programm.&lt;br /&gt;
&lt;br /&gt;
In der 2. Zeile wird mit dem Befehl &#039;&#039;&#039;ldi r16, 0xFF&#039;&#039;&#039; der Wert 0xFF (entspricht 0b11111111) in das Register r16 geladen (mehr Infos unter [[Adressierung]]). Die AVRs besitzen 32 Arbeitsregister, r0-r31, die als Zwischenspeicher zwischen den I/O-Registern (z.B. DDRB, PORTB, UDR...) und dem RAM genutzt werden. Zu beachten ist außerdem, dass die ersten 16 Register (r0-r15) nicht von jedem Assemblerbefehl genutzt werden können. Ein Register kann man sich als eine Speicherzelle direkt im Mikrocontroller vorstellen. Natürlich besitzt der Controller noch viel mehr Speicherzellen, die werden aber ausschliesslich zum Abspeichern von Daten verwendet. Um diese Daten zu manipulieren, müssen sie zuerst in eines der Register geladen werden. Nur dort ist es möglich, die Daten zu manipulieren und zu verändern. Ein Register ist also vergleichbar mit einer Arbeitsfläche, während der restliche Speicher eher einem Stauraum entspricht. Will man arbeiten, so muss das Werkstück (= die Daten) aus dem Stauraum auf die Arbeitsfläche geholt werden und kann dann dort bearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
Die Erklärungen nach dem Semicolon sind Kommentare und werden vom Assembler nicht beachtet.&lt;br /&gt;
&lt;br /&gt;
Der 3. Befehl gibt den Inhalt von r16 (=0xFF) in das Datenrichtungsregister für Port B aus. Das Datenrichtungsregister legt fest, welche Portpins als Ausgang und welche als Eingang genutzt werden. Steht in diesem Register ein Bit auf 0, wird der entsprechende Pin als Eingang konfiguriert, steht es auf 1, ist der Pin ein Ausgang. In diesem Fall sind also alle 6 Pins von Port B Ausgänge. Datenrichtungsregister können ebenfalls nicht direkt beschrieben werden, daher muss man den Umweg über eines der normalen Register r16 - r31 gehen.&lt;br /&gt;
&lt;br /&gt;
Der nächste Befehl, &#039;&#039;&#039;ldi r16, 0b11111100&#039;&#039;&#039; lädt den Wert 0b11111100 in das Arbeitsregister r16, der durch den darauffolgenden Befehl &#039;&#039;&#039;out PORTB, r16&#039;&#039;&#039; in das I/O-Register PORTB (und damit an den Port, an dem die LEDs angeschlossen sind) ausgegeben wird. Eine 1 im PORTB-Register bedeutet, dass an dem entsprechenden Anschluss des Controllers die Spannung 5V anliegt, bei einer 0 sind es 0V (Masse). &lt;br /&gt;
&lt;br /&gt;
Schließlich wird mit &#039;&#039;&#039;rjmp ende&#039;&#039;&#039; ein Sprung zur Marke &#039;&#039;&#039;ende:&#039;&#039;&#039; ausgelöst, also an die gleiche Stelle, wodurch eine Endlosschleife entsteht. Sprungmarken schreibt man gewöhnlich an den Anfang der Zeile, Befehle in die 2. und Kommentare in die 3. Spalte. &lt;br /&gt;
&lt;br /&gt;
Bei Kopier- und Ladebefehlen (ldi, in, out...) wird immer der 2. Operand in den ersten kopiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
         ldi r17, 15     ; das Register r17 wird mit der Konstanten 15 geladen&lt;br /&gt;
         mov r16, r17    ; das Register r16 wird mit dem Inhalt des Registers r17 geladen&lt;br /&gt;
         out PORTB, r16  ; das IO-Register &amp;quot;PORTB&amp;quot; wird mit dem Inhalt des Registers r16 geladen&lt;br /&gt;
         in r16, PIND    ; das Register 16 wird mit dem Inhalt des IO-Registers &amp;quot;PIND&amp;quot; geladen&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wer mehr über die Befehle wissen möchte, sollte sich die PDF-Datei [http://www.atmel.com/dyn/resources/prod_documents/doc0856.pdf Instruction Set (1,27 MB)] runterladen (benötigt [http://www.acrobat.com/ Acrobat Reader] oder in der Hilfe von Assembler oder AVR-Studio nachschauen. Achtung: nicht alle Befehle sind auf jedem Controller der AVR-Serie verwendbar! &lt;br /&gt;
&lt;br /&gt;
Nun sollten die beiden ersten LEDs leuchten, weil die Portpins PB0 und PB1 durch die Ausgabe von 0 (low) auf Masse (0V) gelegt werden und somit ein Strom durch die gegen Vcc (5V) geschalteten LEDs fließen kann. Die 4 anderen LEDs sind aus, da die entsprechenden Pins durch die Ausgabe von 1 (high) auf 5V liegen. &lt;br /&gt;
&lt;br /&gt;
Warum leuchten die beiden ersten LEDs, wo doch die beiden letzen Bits auf 0 gesetzt sind? Das liegt daran, dass man die Bitzahlen von rechts nach links schreibt. Ganz rechts steht das niedrigstwertige Bit (&amp;quot;LSB&amp;quot;, Least Significant Bit), das man als Bit 0 bezeichnet, und ganz links das höchstwertige Bit (&amp;quot;MSB&amp;quot;, Most Significant Bit), bzw. Bit 7. Das Prefix &amp;quot;0b&amp;quot; gehört nicht zur Zahl, sondern sagt dem Assembler, dass die nachfolgende Zahl in binärer Form interpretiert werden soll.&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/images/bits.gif&lt;br /&gt;
&lt;br /&gt;
Das LSB steht für PB0, und das MSB für PB7... aber PB7 gibt es doch z.B. beim AT90S4433 gar nicht, es geht doch nur bis PB5? Der Grund ist einfach: Am Gehäuse des AT90S4433 gibt es nicht genug Pins für den kompletten Port B, deshalb existieren die beiden obersten Bits nur intern.&lt;br /&gt;
&lt;br /&gt;
== Eingabe ==&lt;br /&gt;
Im folgenden Programm wird Port B als Ausgang und Port D als Eingang verwendet: &lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/sourcecode/tutorial/leds+buttons.asm Download leds+buttons.asm]&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         ldi r16, 0xFF&lt;br /&gt;
         out DDRB, r16     ; Alle Pins am Port B durch Ausgabe von 0xFF ins&lt;br /&gt;
                           ; Richtungsregister DDRB als Ausgang konfigurieren&lt;br /&gt;
         ldi r16, 0x00&lt;br /&gt;
         out DDRD, r16     ; Alle Pins am Port D durch Ausgabe von 0x00 ins&lt;br /&gt;
                           ; Richtungsregister DDRD als Eingang konfigurieren&lt;br /&gt;
loop:&lt;br /&gt;
         in r16, PIND      ; an Port D anliegende Werte (Taster) nach r16 einlesen&lt;br /&gt;
         out PORTB, r16    ; Inhalt von r16 an Port B ausgeben&lt;br /&gt;
         rjmp loop         ; Sprung zu &amp;quot;loop:&amp;quot; -&amp;gt; Endlosschleife&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn der Port D als Eingang geschaltet ist, können die anliegenden Daten über das IO-Register &#039;&#039;&#039;PIND&#039;&#039;&#039; eingelesen werden. Dazu wird der Befehl &#039;&#039;&#039;in&#039;&#039;&#039; verwendet, der ein IO-Register (in diesem Fall PIND) in ein Arbeitsregister (z.B. r16) kopiert. Danach wird der Inhalt von r16 mit dem Befehl &#039;&#039;&#039;out&#039;&#039;&#039; an Port B ausgegeben. Dieser Umweg ist notwendig, da man nicht direkt von einem IO-Register in ein anderes kopieren kann. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;rjmp loop&#039;&#039;&#039; sorgt dafür, dass die Befehle &#039;&#039;&#039;in r16, PIND&#039;&#039;&#039; und &#039;&#039;&#039;out PORTB, r16&#039;&#039;&#039; andauernd wiederholt werden, so dass immer die zu den gedrückten Tasten passenden LEDs leuchten.&lt;br /&gt;
&lt;br /&gt;
=== Stolperfalle bei Matrixtastaturen etc. ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorsicht!&#039;&#039;&#039; In bestimmten Situationen kann es passieren, dass scheinbar Pins nicht richtig gelesen werden. &lt;br /&gt;
&lt;br /&gt;
Speziell bei der Abfrage von Matrixtastaturen kann der Effekt auftreten, dass Tasten scheinbar nicht reagieren. Typische Sequenzen sehen dann so aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
        ldi r16,0x0F      &lt;br /&gt;
        out DDRD,r16    ; oberes Nibble Eingang, unteres Ausgang&lt;br /&gt;
        ldi r16,0xFE     &lt;br /&gt;
        out PORTD,r16   ; PD0 auf 0 ziehem, PD4..7 Pull ups aktiv&lt;br /&gt;
        in  r17,PIND    ; Pins lesen schlägt hier fehl!&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Warum ist das problematisch? Nun, der AVR ist ein RISC Mikrocontroller, welcher die meisten Befehle in einem Takt ausführt. Gleichzeitig werden aber alle Eingangssignale über FlipFlops abgetastet (synchronisiert), damit sie sauber im AVR zur Verfügung stehen. Dadurch ergibt sich eine Verzögerung (Latenz) von bis zu 1,5 Takten, mit der auf externe Signale reagiert werden kann. Die Erklärung dazu findet man im Datenblatt unter der Überschrift &amp;quot;I/O Ports - Reading the Pin Value&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Was tun? Wenn der Wert einer Port-Eingabe von einer unmittelbar vorangehenden Port-Ausgabe abhängt, muss man wenigstens einen weiteren Befehl zwischen beiden einfügen, im einfachsten Fall ein NOP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
        ldi r16,0x0F&lt;br /&gt;
        out DDRD,r16    ; oberes Nibble Eingang, unteres Ausgang&lt;br /&gt;
        ldi r16,0xFE&lt;br /&gt;
        out PORTD,r16   ; PD0 auf 0 ziehem, PD4..7 Pull ups aktiv&lt;br /&gt;
        NOP             ; Delay der Synchronisatzions-FlipFlops ausgleichen&lt;br /&gt;
        in  r17,PIND    ; Pins lesen ist hier OK.&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel für dieses Verhalten bei rasch aufeinanderfolgenden &#039;&#039;&#039;OUT&#039;&#039;&#039; und &#039;&#039;&#039;IN&#039;&#039;&#039; Anweisungen ist in einem Forenbeitrag zur [http://www.mikrocontroller.net/topic/88680#753847 Abfrage des Busyflag bei einem LCD] angegeben. Dort spielen allerdings weitere, vom [[LCD]] Controller abhängige Timings eine wesentliche Rolle für den korrekten Programmablauf.&lt;br /&gt;
&lt;br /&gt;
==Pullup-Widerstand==&lt;br /&gt;
Bei der Besprechung der notwendigen Beschaltung der Ports wurde an einen Eingangspin jeweils ein Taster mit einem Widerstand nach Vcc vorgeschlagen. Diesen Widerstand nennt man einen &#039;&#039;&#039;Pullup&#039;&#039;&#039;-Widerstand. Wenn der Taster geöffnet ist, so ist es seine Aufgabe, den Eingangspegel am Pin auf Vcc zu ziehen. Daher auch der Name: &#039;pull up&#039; (engl. für hochziehen). Ohne diesen Pullup-Widerstand würde ansonsten der Pin bei geöffnetem Taster in der Luft hängen, also weder mit Vcc noch mit GND verbunden sein. Dieser Zustand ist aber unbedingt zu vermeiden, da bereits elektromagnetische Einstreuungen auf Zuleitungen ausreichen, dem Pin einen Zustand vorzugaukeln, der in Wirklichkeit nicht existiert. Der Pullup-Widerstand sorgt also für einen definierten 1-Pegel bei geöffnetem Taster. Wird der Taster geschlossen, so stellt dieser eine direkte Verbindung zu GND her und der Pegel am Pin fällt auf GND. Durch den Pullup-Widerstand rinnt dann ein kleiner Strom von Vcc nach GND. Da Pullup-Widerstände in der Regel aber relativ hochohmig sind, stört dieser kleine Strom meistens nicht weiter.&lt;br /&gt;
&lt;br /&gt;
Anstelle eines externen Widerstandes wäre es auch möglich, den Widerstand wegzulassen und stattdessen den in den AVR eingebauten Pullup-Widerstand zu aktivieren. Die Beschaltung eines Tasters vereinfacht sich dann zum einfachst möglichen Fall: Der Taster wird direkt an den Eingangspin des µC angeschlossen und schaltet nach Masse durch:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Taster2.gif]]&lt;br /&gt;
&lt;br /&gt;
Das geht allerdings nur dann, wenn der entsprechende Mikroprozessor-Pin auf Eingang geschaltet wurde. Ein Pullup-Widerstand hat nun mal nur bei einem Eingangspin einen Sinn. Bei einem auf Ausgang geschalteten Pin sorgt der Mikroprozessor dafür, dass ein dem Port-Wert entsprechender Spannungspegel ausgegeben wird. Ein Pullup-Widerstand wäre in so einem Fall kontraproduktiv, da der Widerstand versucht, den Pegel am Pin auf Vcc zu ziehen, während eine 0 im Port-Register dafür sorgt, dass der Mikroprozessor versuchen würde, den Pin auf GND zu ziehen.&lt;br /&gt;
&lt;br /&gt;
Ein Pullup-Widerstand an einem Eingangspin wird durch das &#039;&#039;&#039;PORT&#039;&#039;&#039;-Register gesteuert. Das &#039;&#039;&#039;PORT&#039;&#039;&#039;-Register erfüllt also 2 Aufgaben. Bei einem auf Ausgang geschalteten Port steuert es den Pegel an den Ausgangspins. Bei einem auf Eingang geschalteten Port steuert es, ob die internen Pullup-Widerstände aktiviert werden oder nicht. Ein 1-Bit aktiviert den entsprechenden Pullup-Widerstand.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! DDRx   || PORTx  ||  IO-Pin-Zustand&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|| Eingang ohne Pull-Up (Resetzustand)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|| Eingang mit Pull-Up&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  0&lt;br /&gt;
|| [[Ausgangsstufen_Logik-ICs#Push-Pull | Push-Pull]]-Ausgang auf LOW&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|align=&amp;quot;center&amp;quot; |  1&lt;br /&gt;
|| [[Ausgangsstufen_Logik-ICs#Push-Pull | Push-Pull]]-Ausgang auf HIGH&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         ldi r16, 0xFF&lt;br /&gt;
         out DDRB, r16     ; Alle Pins am Port B durch Ausgabe von 0xFF ins&lt;br /&gt;
                           ; Richtungsregister DDRB als Ausgang konfigurieren&lt;br /&gt;
         ldi r16, 0x00&lt;br /&gt;
         out DDRD, r16     ; Alle Pins am Port D durch Ausgabe von 0x00 ins&lt;br /&gt;
                           ; Richtungsregister DDRD als Eingang konfigurieren&lt;br /&gt;
&lt;br /&gt;
         ldi r16, 0xFF     ; An allen Pins vom Port D die Pullup-Widerstände&lt;br /&gt;
         out PORTD, r16    ; aktivieren. Dies geht deshalb durch eine Ausgabe&lt;br /&gt;
                           ; nach PORTD, da ja der Port auf Eingang gestellt ist.&lt;br /&gt;
loop:&lt;br /&gt;
         in r16, PIND      ; an Port D anliegende Werte (Taster) nach r16 einlesen&lt;br /&gt;
         out PORTB, r16    ; Inhalt von r16 an Port B ausgeben&lt;br /&gt;
         rjmp loop         ; Sprung zu &amp;quot;loop:&amp;quot; -&amp;gt; Endlosschleife&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Werden auf diese Art und Weise die AVR-internen Pullup-Widerstände aktiviert, so sind keine externen Widerstände mehr notwendig und die Beschaltung vereinfacht sich zu einem Taster, der einfach nur den µC-Pin mit GND verbindet.&lt;br /&gt;
&lt;br /&gt;
==Zugriff auf einzelne Bits==&lt;br /&gt;
Man muss nicht immer ein ganzes Register auf einmal einlesen oder mit einem neuen Wert laden. Es gibt auch Befehle, mit denen man einzelne Bits abfragen und ändern kann: &lt;br /&gt;
&lt;br /&gt;
* Der Befehl &#039;&#039;&#039;sbic&#039;&#039;&#039; (&amp;quot;skip if bit cleared&amp;quot;) überspringt den darauffolgenden Befehl, wenn das angegebene Bit 0 (low) ist.&lt;br /&gt;
* &#039;&#039;&#039;sbis&#039;&#039;&#039; (&amp;quot;skip if bit set&amp;quot;) bewirkt das Gleiche, wenn das Bit 1 (high) ist.&lt;br /&gt;
* Mit &#039;&#039;&#039;cbi&#039;&#039;&#039; (&amp;quot;clear bit&amp;quot;) wird das angegebene Bit auf 0 gesetzt.&lt;br /&gt;
* &#039;&#039;&#039;sbi&#039;&#039;&#039; (&amp;quot;set bit&amp;quot;) bewirkt das Gegenteil.&lt;br /&gt;
Achtung: Diese Befehle können nur auf die IO-Register angewandt werden! &lt;br /&gt;
&lt;br /&gt;
Am besten verstehen kann man das natürlich an einem Beispiel: &lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/sourcecode/tutorial/bitaccess.asm Download bitaccess.asm]&lt;br /&gt;
&amp;lt;avrasm&amp;gt; &lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
         ldi r16, 0xFF&lt;br /&gt;
         out DDRB, r16       ; Port B ist Ausgang&lt;br /&gt;
                             &lt;br /&gt;
         ldi r16, 0x00&lt;br /&gt;
         out DDRD, r16       ; Port D ist Eingang&lt;br /&gt;
                             &lt;br /&gt;
&lt;br /&gt;
         ldi r16, 0xFF&lt;br /&gt;
         out PORTB, r16      ; PORTB auf 0xFF setzen -&amp;gt; alle LEDs aus&lt;br /&gt;
&lt;br /&gt;
loop:    sbic PIND, 0        ; &amp;quot;skip if bit cleared&amp;quot;, nächsten Befehl überspringen,&lt;br /&gt;
                             ; wenn Bit 0 im IO-Register PIND =0 (Taste 0 gedrückt)&lt;br /&gt;
         rjmp loop           ; Sprung zu &amp;quot;loop:&amp;quot; -&amp;gt; Endlosschleife&lt;br /&gt;
&lt;br /&gt;
         cbi PORTB, 3        ; Bit 3 im IO-Register PORTB auf 0 setzen -&amp;gt; 4. LED an&lt;br /&gt;
&lt;br /&gt;
ende:    rjmp ende           ; Endlosschleife&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieses Programm wartet so lange in einer Schleife (&amp;quot;loop:&amp;quot;...&amp;quot;rjmp loop&amp;quot;), bis Bit 0 im Register PIND 0 wird, also die erste Taste gedrückt ist. Durch &amp;quot;sbic&amp;quot; wird dann der Sprungbefehl zu &amp;quot;loop:&amp;quot; übersprungen, die Schleife wird also verlassen und das Programm danach fortgesetzt. Ganz am Ende schließlich wird das Programm durch eine leere Endlosschleife praktisch &amp;quot;angehalten&amp;quot;, da es ansonsten wieder von vorne beginnen würde.&lt;br /&gt;
&lt;br /&gt;
==Zusammenfassung der Portregister==&lt;br /&gt;
Für jeden Hardwareport gibt es im Mikroprozessor insgesamt 3 Register:&lt;br /&gt;
* Das Datenrichtungsregister &#039;&#039;&#039;DDRx&#039;&#039;&#039;. Es wird verwendet um die Richtung jedes einzelnen Mikroprozessor-Pins festzulegen. Eine 1 an der entsprechenden Bit Position steht für Ausgang, eine 0 steht für Eingang.&lt;br /&gt;
* Das Einleseregister &#039;&#039;&#039;PINx&#039;&#039;&#039;. Es wird verwendet um von einem Mikroprozessor-Pin den aktuellen Zustand einzulesen. Dazu muss das entsprechende Datenrichtungsbit auf Eingang geschaltet sein.&lt;br /&gt;
* Das Ausgangsregister &#039;&#039;&#039;PORTx&#039;&#039;&#039;. Es erfüllt 2 Funktionen, je nachdem wie das zugehörige Datenrichtungsbit geschaltet ist.&lt;br /&gt;
** Steht es auf Ausgang, so wird bei einer entsprechenden Zuweisung an das &#039;&#039;&#039;PORTx&#039;&#039;&#039; Register der entsprechende Mikroprozessor-Pin auf den angegebenen Wert gesetzt.&lt;br /&gt;
** Steht es auf Eingang, so beeinflusst das &#039;&#039;&#039;PORTx&#039;&#039;&#039;-Bit den internen Pullup-Widerstand an diesem Mikroprozessor-Pin. Bei einer 0 wird der Widerstand abgeschaltet, bei einer 1 wird der Widerstand an den Eingangs-Pin zugeschaltet.&lt;br /&gt;
* Bei den neueren AVR (wie z.B. &#039;&#039;ATtiny13&#039;&#039;, &#039;&#039;ATtiny2313&#039;&#039;, &#039;&#039;ATtiny24/44/84&#039;&#039;, &#039;&#039;ATtiny25/45/85&#039;&#039;, &#039;&#039;ATmega48/88/168&#039;&#039;, usw.) kann man als Ausgang konfigurierte Pins toggeln (&#039;&#039;&#039;PORTx&#039;&#039;&#039; zwischen 0 und 1 „umschalten“), indem man eine 1 an die entsprechende Bit Position des &#039;&#039;&#039;PINx&#039;&#039;&#039; Register schreibt.&lt;br /&gt;
&lt;br /&gt;
==Ausgänge benutzen, wenn mehr Strom benötigt wird==&lt;br /&gt;
Man kann nicht jeden beliebigen Verbraucher nach dem LED-Vorbild von oben an einen µC anschließen. Die Ausgänge des ATMega8 können nur eine begrenzte Menge Strom liefern, so dass der Chip schnell überfordert ist, wenn eine nachgeschaltete Schaltung mehr Strom benötigt. Die Ausgangstreiber des µC würden in solchen Fällen den Dienst quittieren und durchbrennen.&lt;br /&gt;
&lt;br /&gt;
Abhilfe schafft in solchen Fällen eine zusätzliche Treiberstufe, die im einfachsten Fall mit einem [[Transistor|Transistor]] als Schalter aufgebaut wird.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Transi2.gif]]&lt;br /&gt;
&lt;br /&gt;
Die LED samt zugehörigen Widerständen dienen hier lediglich als Sinnbild für den Verbraucher, der vom µC ein und ausgeschaltet werden soll. Welcher Transistor als Schalter benutzt werden kann, hängt vom Stromverbrauch des Verbrauchers ab. Die Widerstände &#039;&#039;&#039;R1&#039;&#039;&#039; und &#039;&#039;&#039;R2&#039;&#039;&#039; werden als &#039;&#039;&#039;Basiswiderstände&#039;&#039;&#039; der Transistoren bezeichnet. Für ihre Berechnung siehe z.B. [[Basiswiderstand|hier]]. Um eine sichere Störfestigkeit im Resetfall des Mikrocontrollers zu gewähren, sollte man noch einen Pulldown Widerstand zwischen Basis und Emitter schalten oder einen digitalen Transistor (z.B. BCR135) mit integriertem Basis- und Basisemitterwiderstand benutzen.&lt;br /&gt;
&lt;br /&gt;
Um ein Relais an einen µC Ausgang anzuschließen, siehe [[Relais_mit_Logik_ansteuern|hier]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Navigation_zurückhochvor|&lt;br /&gt;
zurücktext=Benötigte Ausrüstung|&lt;br /&gt;
zurücklink=AVR-Tutorial: Equipment|&lt;br /&gt;
hochtext=Inhaltsverzeichnis|&lt;br /&gt;
hochlink=AVR-Tutorial|&lt;br /&gt;
vortext=logische Operationen|&lt;br /&gt;
vorlink=AVR-Tutorial: Logik}}&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]][[Category:AVR-Tutorial]]&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=29472</id>
		<title>Benutzer:Rotoe</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=29472"/>
		<updated>2008-07-29T18:55:05Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Wunschliste */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Robin Tönniges - ICQ: 216193451=&lt;br /&gt;
&lt;br /&gt;
== Persönliche Daten ==&lt;br /&gt;
Name: Robin Tönniges&amp;lt;br/&amp;gt;&lt;br /&gt;
Alter: 17&amp;lt;br/&amp;gt;&lt;br /&gt;
Geburtsdatum: 07.07.1991&amp;lt;br/&amp;gt;&lt;br /&gt;
Ausbildung ab 1.09 als EAT&amp;lt;br/&amp;gt;&lt;br /&gt;
Montl. Einkommen: 478,64 Euro&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hobby-Werdegang ==&lt;br /&gt;
Ich bin seit 2002 begeisterter Hobbyelektroniker und habe mich sei dem&lt;br /&gt;
durch das Internet und ein paar gute Bekannte fortgebildet. Unterwegs bin ich auch auf den Modellflug gestoßen was mt meinen Hobby natürlich perfekt harmoniert.&lt;br /&gt;
Seit dem habe ich gelernt AVR&#039;s in C zu programmieren kenne die wichtigesten Grundlagen, Formeln und el. Bauteile.&lt;br /&gt;
&lt;br /&gt;
== Vorhaben ==&lt;br /&gt;
Ich möchte FPGA&#039;s programmieren lernen. Weiß nicht warum. Auf jedefall ist es irgendwie reizvoll. Aber erstmal muss ich AVR-C richtig beherrschen bevor ich was Neues anfange.&lt;br /&gt;
&lt;br /&gt;
== Letze Errungenschaften ==&lt;br /&gt;
* Parkzone T-28 Trojan (06.06.08)&lt;br /&gt;
* Digitalkamera Casio EX-Z12 (06.05.2008)&lt;br /&gt;
* STK500 (04.04.2008)&lt;br /&gt;
* HAMEG HM-605 (2002)&lt;br /&gt;
&lt;br /&gt;
== Wunschliste ==&lt;br /&gt;
* STK600&lt;br /&gt;
* Tablet PC&lt;br /&gt;
* Fluke 123&lt;br /&gt;
&lt;br /&gt;
== Bisher gebaute Sachen ==&lt;br /&gt;
* Akkutester mit einstellbarer Zellenzahl und Grafikdisplay&lt;br /&gt;
* LC-Meter&lt;br /&gt;
* 1-30V 0-3A Netzteil&lt;br /&gt;
* 5W Röhrenoszillator&lt;br /&gt;
* ATmega8 Experimentierplatine&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Atmega32_Experimentierplatine ATmega32 Experimentierplatine]&lt;br /&gt;
* Mini-Multimeter&lt;br /&gt;
* PC-Akkutester&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Atmega32_Experimentierplatine&amp;diff=29414</id>
		<title>Atmega32 Experimentierplatine</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Atmega32_Experimentierplatine&amp;diff=29414"/>
		<updated>2008-07-27T23:42:29Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Features */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:rotoe|Robin Tönniges]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hier stelle ich meine selbstentwickelte ATmega32-Experimentierplatine vor. Was gleich erwähnt werden sollte ist dass diese Platine auch mit allen anderen Pinkompatiblen Typen funktioniert (warum auch nicht).&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
* Eingangsspannung von 7-20V DC&lt;br /&gt;
* 2x16 Zeichen Display an PORTA&lt;br /&gt;
* Display kann per N-FET an- und ausgeschaltet werden (kann überbrückt werden)&lt;br /&gt;
* JTAG Anschluss&lt;br /&gt;
* ISP Anschluss&lt;br /&gt;
* I2C Anschluss&lt;br /&gt;
* 8x LED&#039;s an PORTB (abschalt- und umsteckbar mit Klingeldraht)&lt;br /&gt;
* 8x Taster an PORTB&lt;br /&gt;
* Jeder Pin des µC&#039;s ist über eine Buchsenleiste erreichbar&lt;br /&gt;
* 2x N-Fets an den PWM Kanälen zum Steuern von Lasten&lt;br /&gt;
* Quarz und Lastkapazitäten sind austauschbar&lt;br /&gt;
* PC Anschluss über MAX232 und Hardware UART möglich&lt;br /&gt;
&lt;br /&gt;
== Schaltplan ==&lt;br /&gt;
[[Bild:Pic3.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan als PDF&lt;br /&gt;
[[Media:Atm32_ep.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
== Platinenlayout ==&lt;br /&gt;
[[Bild:Pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
Das Layout als PDF &lt;br /&gt;
[[Media:Layout.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
Der Bestückungsplan als PDF &lt;br /&gt;
[[Media:Bestck.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
== Bilder der fertig bestückten Platine==&lt;br /&gt;
=== Die Platine von Vorne ===&lt;br /&gt;
[[Bild:Pic1.jpg]]&lt;br /&gt;
=== Die Platine von Hinten ===&lt;br /&gt;
[[Bild:Pic2.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen ==&lt;br /&gt;
*2x16 Zeichen Display ([http://www.pollin.de/shop/shop.php?cf=detail.php&amp;amp;pg=OA==&amp;amp;a=MzI1OTc4OTk=&amp;amp;w=OTg4OTk4&amp;amp;ts=20 Pollin])&lt;br /&gt;
*Die restlichen Teile ([http://www.reichelt.de Reichelt]) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;br /&gt;
[[Kategorie:Projekte]]&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=29271</id>
		<title>Benutzer:Rotoe</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=29271"/>
		<updated>2008-07-24T12:50:15Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Bisher gebaute Sachen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Robin Tönniges - ICQ: 216193451=&lt;br /&gt;
&lt;br /&gt;
== Persönliche Daten ==&lt;br /&gt;
Name: Robin Tönniges&amp;lt;br/&amp;gt;&lt;br /&gt;
Alter: 17&amp;lt;br/&amp;gt;&lt;br /&gt;
Geburtsdatum: 07.07.1991&amp;lt;br/&amp;gt;&lt;br /&gt;
Ausbildung ab 1.09 als EAT&amp;lt;br/&amp;gt;&lt;br /&gt;
Montl. Einkommen: 478,64 Euro&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hobby-Werdegang ==&lt;br /&gt;
Ich bin seit 2002 begeisterter Hobbyelektroniker und habe mich sei dem&lt;br /&gt;
durch das Internet und ein paar gute Bekannte fortgebildet. Unterwegs bin ich auch auf den Modellflug gestoßen was mt meinen Hobby natürlich perfekt harmoniert.&lt;br /&gt;
Seit dem habe ich gelernt AVR&#039;s in C zu programmieren kenne die wichtigesten Grundlagen, Formeln und el. Bauteile.&lt;br /&gt;
&lt;br /&gt;
== Vorhaben ==&lt;br /&gt;
Ich möchte FPGA&#039;s programmieren lernen. Weiß nicht warum. Auf jedefall ist es irgendwie reizvoll. Aber erstmal muss ich AVR-C richtig beherrschen bevor ich was Neues anfange.&lt;br /&gt;
&lt;br /&gt;
== Letze Errungenschaften ==&lt;br /&gt;
* Parkzone T-28 Trojan (06.06.08)&lt;br /&gt;
* Digitalkamera Casio EX-Z12 (06.05.2008)&lt;br /&gt;
* STK500 (04.04.2008)&lt;br /&gt;
* HAMEG HM-605 (2002)&lt;br /&gt;
&lt;br /&gt;
== Wunschliste ==&lt;br /&gt;
* STK600&lt;br /&gt;
* Tablet PC&lt;br /&gt;
* Digitales Speicheroszi&lt;br /&gt;
&lt;br /&gt;
== Bisher gebaute Sachen ==&lt;br /&gt;
* Akkutester mit einstellbarer Zellenzahl und Grafikdisplay&lt;br /&gt;
* LC-Meter&lt;br /&gt;
* 1-30V 0-3A Netzteil&lt;br /&gt;
* 5W Röhrenoszillator&lt;br /&gt;
* ATmega8 Experimentierplatine&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/Atmega32_Experimentierplatine ATmega32 Experimentierplatine]&lt;br /&gt;
* Mini-Multimeter&lt;br /&gt;
* PC-Akkutester&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=29270</id>
		<title>Benutzer:Rotoe</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=29270"/>
		<updated>2008-07-24T12:50:07Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Bisher gebaute Sachen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Robin Tönniges - ICQ: 216193451=&lt;br /&gt;
&lt;br /&gt;
== Persönliche Daten ==&lt;br /&gt;
Name: Robin Tönniges&amp;lt;br/&amp;gt;&lt;br /&gt;
Alter: 17&amp;lt;br/&amp;gt;&lt;br /&gt;
Geburtsdatum: 07.07.1991&amp;lt;br/&amp;gt;&lt;br /&gt;
Ausbildung ab 1.09 als EAT&amp;lt;br/&amp;gt;&lt;br /&gt;
Montl. Einkommen: 478,64 Euro&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hobby-Werdegang ==&lt;br /&gt;
Ich bin seit 2002 begeisterter Hobbyelektroniker und habe mich sei dem&lt;br /&gt;
durch das Internet und ein paar gute Bekannte fortgebildet. Unterwegs bin ich auch auf den Modellflug gestoßen was mt meinen Hobby natürlich perfekt harmoniert.&lt;br /&gt;
Seit dem habe ich gelernt AVR&#039;s in C zu programmieren kenne die wichtigesten Grundlagen, Formeln und el. Bauteile.&lt;br /&gt;
&lt;br /&gt;
== Vorhaben ==&lt;br /&gt;
Ich möchte FPGA&#039;s programmieren lernen. Weiß nicht warum. Auf jedefall ist es irgendwie reizvoll. Aber erstmal muss ich AVR-C richtig beherrschen bevor ich was Neues anfange.&lt;br /&gt;
&lt;br /&gt;
== Letze Errungenschaften ==&lt;br /&gt;
* Parkzone T-28 Trojan (06.06.08)&lt;br /&gt;
* Digitalkamera Casio EX-Z12 (06.05.2008)&lt;br /&gt;
* STK500 (04.04.2008)&lt;br /&gt;
* HAMEG HM-605 (2002)&lt;br /&gt;
&lt;br /&gt;
== Wunschliste ==&lt;br /&gt;
* STK600&lt;br /&gt;
* Tablet PC&lt;br /&gt;
* Digitales Speicheroszi&lt;br /&gt;
&lt;br /&gt;
== Bisher gebaute Sachen ==&lt;br /&gt;
* Akkutester mit einstellbarer Zellenzahl und Grafikdisplay&lt;br /&gt;
* LC-Meter&lt;br /&gt;
* 1-30V 0-3A Netzteil&lt;br /&gt;
* 5W Röhrenoszillator&lt;br /&gt;
* ATmega8 Experimentierplatine&lt;br /&gt;
* ([http://www.mikrocontroller.net/articles/Atmega32_Experimentierplatine ATmega32 Experimentierplatine]) &lt;br /&gt;
* Mini-Multimeter&lt;br /&gt;
* PC-Akkutester&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=29269</id>
		<title>Benutzer:Rotoe</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=29269"/>
		<updated>2008-07-24T12:48:28Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Bisher gebaute Sachen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Robin Tönniges - ICQ: 216193451=&lt;br /&gt;
&lt;br /&gt;
== Persönliche Daten ==&lt;br /&gt;
Name: Robin Tönniges&amp;lt;br/&amp;gt;&lt;br /&gt;
Alter: 17&amp;lt;br/&amp;gt;&lt;br /&gt;
Geburtsdatum: 07.07.1991&amp;lt;br/&amp;gt;&lt;br /&gt;
Ausbildung ab 1.09 als EAT&amp;lt;br/&amp;gt;&lt;br /&gt;
Montl. Einkommen: 478,64 Euro&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hobby-Werdegang ==&lt;br /&gt;
Ich bin seit 2002 begeisterter Hobbyelektroniker und habe mich sei dem&lt;br /&gt;
durch das Internet und ein paar gute Bekannte fortgebildet. Unterwegs bin ich auch auf den Modellflug gestoßen was mt meinen Hobby natürlich perfekt harmoniert.&lt;br /&gt;
Seit dem habe ich gelernt AVR&#039;s in C zu programmieren kenne die wichtigesten Grundlagen, Formeln und el. Bauteile.&lt;br /&gt;
&lt;br /&gt;
== Vorhaben ==&lt;br /&gt;
Ich möchte FPGA&#039;s programmieren lernen. Weiß nicht warum. Auf jedefall ist es irgendwie reizvoll. Aber erstmal muss ich AVR-C richtig beherrschen bevor ich was Neues anfange.&lt;br /&gt;
&lt;br /&gt;
== Letze Errungenschaften ==&lt;br /&gt;
* Parkzone T-28 Trojan (06.06.08)&lt;br /&gt;
* Digitalkamera Casio EX-Z12 (06.05.2008)&lt;br /&gt;
* STK500 (04.04.2008)&lt;br /&gt;
* HAMEG HM-605 (2002)&lt;br /&gt;
&lt;br /&gt;
== Wunschliste ==&lt;br /&gt;
* STK600&lt;br /&gt;
* Tablet PC&lt;br /&gt;
* Digitales Speicheroszi&lt;br /&gt;
&lt;br /&gt;
== Bisher gebaute Sachen ==&lt;br /&gt;
* Akkutester mit einstellbarer Zellenzahl und Grafikdisplay&lt;br /&gt;
* LC-Meter&lt;br /&gt;
* 1-30V 0-3A Netzteil&lt;br /&gt;
* 5W Röhrenoszillator&lt;br /&gt;
* ATmega8 Testplatine&lt;br /&gt;
* ATmega32-Experimentierplatine&lt;br /&gt;
* Mini-Multimeter&lt;br /&gt;
* PC-Akkutester&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=29217</id>
		<title>Benutzer:Rotoe</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=29217"/>
		<updated>2008-07-22T14:23:05Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Persönliche Daten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Robin Tönniges - ICQ: 216193451=&lt;br /&gt;
&lt;br /&gt;
== Persönliche Daten ==&lt;br /&gt;
Name: Robin Tönniges&amp;lt;br/&amp;gt;&lt;br /&gt;
Alter: 17&amp;lt;br/&amp;gt;&lt;br /&gt;
Geburtsdatum: 07.07.1991&amp;lt;br/&amp;gt;&lt;br /&gt;
Ausbildung ab 1.09 als EAT&amp;lt;br/&amp;gt;&lt;br /&gt;
Montl. Einkommen: 478,64 Euro&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hobby-Werdegang ==&lt;br /&gt;
Ich bin seit 2002 begeisterter Hobbyelektroniker und habe mich sei dem&lt;br /&gt;
durch das Internet und ein paar gute Bekannte fortgebildet. Unterwegs bin ich auch auf den Modellflug gestoßen was mt meinen Hobby natürlich perfekt harmoniert.&lt;br /&gt;
Seit dem habe ich gelernt AVR&#039;s in C zu programmieren kenne die wichtigesten Grundlagen, Formeln und el. Bauteile.&lt;br /&gt;
&lt;br /&gt;
== Vorhaben ==&lt;br /&gt;
Ich möchte FPGA&#039;s programmieren lernen. Weiß nicht warum. Auf jedefall ist es irgendwie reizvoll. Aber erstmal muss ich AVR-C richtig beherrschen bevor ich was Neues anfange.&lt;br /&gt;
&lt;br /&gt;
== Letze Errungenschaften ==&lt;br /&gt;
* Parkzone T-28 Trojan (06.06.08)&lt;br /&gt;
* Digitalkamera Casio EX-Z12 (06.05.2008)&lt;br /&gt;
* STK500 (04.04.2008)&lt;br /&gt;
* HAMEG HM-605 (2002)&lt;br /&gt;
&lt;br /&gt;
== Wunschliste ==&lt;br /&gt;
* STK600&lt;br /&gt;
* Tablet PC&lt;br /&gt;
* Digitales Speicheroszi&lt;br /&gt;
&lt;br /&gt;
== Bisher gebaute Sachen ==&lt;br /&gt;
* Akkutester mit einstellbarer Zellenzahl und Grafikdisplay&lt;br /&gt;
* LC-Meter&lt;br /&gt;
* 1-30V 0-3A Netzteil&lt;br /&gt;
* 5W Röhrenoszillator&lt;br /&gt;
* ATmega8 Testplatine&lt;br /&gt;
* ATmega32-128 Testplatine&lt;br /&gt;
* Mini-Multimeter&lt;br /&gt;
* PC-Akkutester&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=29216</id>
		<title>Benutzer:Rotoe</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=29216"/>
		<updated>2008-07-22T14:22:32Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Persönliche Daten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Robin Tönniges - ICQ: 216193451=&lt;br /&gt;
&lt;br /&gt;
== Persönliche Daten ==&lt;br /&gt;
Name: Robin Tönniges&amp;lt;br/&amp;gt;&lt;br /&gt;
Alter: 17&amp;lt;br/&amp;gt;&lt;br /&gt;
Geburtsdatum: 07.07.1991&amp;lt;br/&amp;gt;&lt;br /&gt;
Beruf: Ex-Schüler ;)&amp;lt;br/&amp;gt;&lt;br /&gt;
Ausbildung ab 1.09 als EAT&amp;lt;br/&amp;gt;&lt;br /&gt;
Montl. Einkommen: 478,64 Euro&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hobby-Werdegang ==&lt;br /&gt;
Ich bin seit 2002 begeisterter Hobbyelektroniker und habe mich sei dem&lt;br /&gt;
durch das Internet und ein paar gute Bekannte fortgebildet. Unterwegs bin ich auch auf den Modellflug gestoßen was mt meinen Hobby natürlich perfekt harmoniert.&lt;br /&gt;
Seit dem habe ich gelernt AVR&#039;s in C zu programmieren kenne die wichtigesten Grundlagen, Formeln und el. Bauteile.&lt;br /&gt;
&lt;br /&gt;
== Vorhaben ==&lt;br /&gt;
Ich möchte FPGA&#039;s programmieren lernen. Weiß nicht warum. Auf jedefall ist es irgendwie reizvoll. Aber erstmal muss ich AVR-C richtig beherrschen bevor ich was Neues anfange.&lt;br /&gt;
&lt;br /&gt;
== Letze Errungenschaften ==&lt;br /&gt;
* Parkzone T-28 Trojan (06.06.08)&lt;br /&gt;
* Digitalkamera Casio EX-Z12 (06.05.2008)&lt;br /&gt;
* STK500 (04.04.2008)&lt;br /&gt;
* HAMEG HM-605 (2002)&lt;br /&gt;
&lt;br /&gt;
== Wunschliste ==&lt;br /&gt;
* STK600&lt;br /&gt;
* Tablet PC&lt;br /&gt;
* Digitales Speicheroszi&lt;br /&gt;
&lt;br /&gt;
== Bisher gebaute Sachen ==&lt;br /&gt;
* Akkutester mit einstellbarer Zellenzahl und Grafikdisplay&lt;br /&gt;
* LC-Meter&lt;br /&gt;
* 1-30V 0-3A Netzteil&lt;br /&gt;
* 5W Röhrenoszillator&lt;br /&gt;
* ATmega8 Testplatine&lt;br /&gt;
* ATmega32-128 Testplatine&lt;br /&gt;
* Mini-Multimeter&lt;br /&gt;
* PC-Akkutester&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=29215</id>
		<title>Benutzer:Rotoe</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=29215"/>
		<updated>2008-07-22T14:21:45Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Persönliche Daten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Robin Tönniges - ICQ: 216193451=&lt;br /&gt;
&lt;br /&gt;
== Persönliche Daten ==&lt;br /&gt;
Name: Robin Tönniges&amp;lt;br/&amp;gt;&lt;br /&gt;
Alter: 17&amp;lt;br/&amp;gt;&lt;br /&gt;
Geburtsdatum: 07.07.1991&amp;lt;br/&amp;gt;&lt;br /&gt;
Beruf: Ex-Schüler ;)&amp;lt;br/&amp;gt;&lt;br /&gt;
Ausbildung ab 1.09 als EAT&amp;lt;br/&amp;gt;&lt;br /&gt;
Montl. Einkommen: 17,50 Euro&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hobby-Werdegang ==&lt;br /&gt;
Ich bin seit 2002 begeisterter Hobbyelektroniker und habe mich sei dem&lt;br /&gt;
durch das Internet und ein paar gute Bekannte fortgebildet. Unterwegs bin ich auch auf den Modellflug gestoßen was mt meinen Hobby natürlich perfekt harmoniert.&lt;br /&gt;
Seit dem habe ich gelernt AVR&#039;s in C zu programmieren kenne die wichtigesten Grundlagen, Formeln und el. Bauteile.&lt;br /&gt;
&lt;br /&gt;
== Vorhaben ==&lt;br /&gt;
Ich möchte FPGA&#039;s programmieren lernen. Weiß nicht warum. Auf jedefall ist es irgendwie reizvoll. Aber erstmal muss ich AVR-C richtig beherrschen bevor ich was Neues anfange.&lt;br /&gt;
&lt;br /&gt;
== Letze Errungenschaften ==&lt;br /&gt;
* Parkzone T-28 Trojan (06.06.08)&lt;br /&gt;
* Digitalkamera Casio EX-Z12 (06.05.2008)&lt;br /&gt;
* STK500 (04.04.2008)&lt;br /&gt;
* HAMEG HM-605 (2002)&lt;br /&gt;
&lt;br /&gt;
== Wunschliste ==&lt;br /&gt;
* STK600&lt;br /&gt;
* Tablet PC&lt;br /&gt;
* Digitales Speicheroszi&lt;br /&gt;
&lt;br /&gt;
== Bisher gebaute Sachen ==&lt;br /&gt;
* Akkutester mit einstellbarer Zellenzahl und Grafikdisplay&lt;br /&gt;
* LC-Meter&lt;br /&gt;
* 1-30V 0-3A Netzteil&lt;br /&gt;
* 5W Röhrenoszillator&lt;br /&gt;
* ATmega8 Testplatine&lt;br /&gt;
* ATmega32-128 Testplatine&lt;br /&gt;
* Mini-Multimeter&lt;br /&gt;
* PC-Akkutester&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=29214</id>
		<title>Benutzer:Rotoe</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Rotoe&amp;diff=29214"/>
		<updated>2008-07-22T14:21:03Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Persönliche Daten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Robin Tönniges - ICQ: 216193451=&lt;br /&gt;
&lt;br /&gt;
== Persönliche Daten ==&lt;br /&gt;
Name: Robin Tönniges&amp;lt;br/&amp;gt;&lt;br /&gt;
Alter: 17&amp;lt;br/&amp;gt;&lt;br /&gt;
Geburtsdatum: 07.07.1991&amp;lt;br/&amp;gt;&lt;br /&gt;
Beruf: Schüler&amp;lt;br/&amp;gt;&lt;br /&gt;
Montl. Einkommen: 17,50 Euro&amp;lt;br/&amp;gt;&lt;br /&gt;
Berufswunsch: Elektroniker für Automatisierungstechnik&lt;br /&gt;
&lt;br /&gt;
== Hobby-Werdegang ==&lt;br /&gt;
Ich bin seit 2002 begeisterter Hobbyelektroniker und habe mich sei dem&lt;br /&gt;
durch das Internet und ein paar gute Bekannte fortgebildet. Unterwegs bin ich auch auf den Modellflug gestoßen was mt meinen Hobby natürlich perfekt harmoniert.&lt;br /&gt;
Seit dem habe ich gelernt AVR&#039;s in C zu programmieren kenne die wichtigesten Grundlagen, Formeln und el. Bauteile.&lt;br /&gt;
&lt;br /&gt;
== Vorhaben ==&lt;br /&gt;
Ich möchte FPGA&#039;s programmieren lernen. Weiß nicht warum. Auf jedefall ist es irgendwie reizvoll. Aber erstmal muss ich AVR-C richtig beherrschen bevor ich was Neues anfange.&lt;br /&gt;
&lt;br /&gt;
== Letze Errungenschaften ==&lt;br /&gt;
* Parkzone T-28 Trojan (06.06.08)&lt;br /&gt;
* Digitalkamera Casio EX-Z12 (06.05.2008)&lt;br /&gt;
* STK500 (04.04.2008)&lt;br /&gt;
* HAMEG HM-605 (2002)&lt;br /&gt;
&lt;br /&gt;
== Wunschliste ==&lt;br /&gt;
* STK600&lt;br /&gt;
* Tablet PC&lt;br /&gt;
* Digitales Speicheroszi&lt;br /&gt;
&lt;br /&gt;
== Bisher gebaute Sachen ==&lt;br /&gt;
* Akkutester mit einstellbarer Zellenzahl und Grafikdisplay&lt;br /&gt;
* LC-Meter&lt;br /&gt;
* 1-30V 0-3A Netzteil&lt;br /&gt;
* 5W Röhrenoszillator&lt;br /&gt;
* ATmega8 Testplatine&lt;br /&gt;
* ATmega32-128 Testplatine&lt;br /&gt;
* Mini-Multimeter&lt;br /&gt;
* PC-Akkutester&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Layout.pdf&amp;diff=29046</id>
		<title>Datei:Layout.pdf</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Layout.pdf&amp;diff=29046"/>
		<updated>2008-07-16T12:13:33Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: hat eine neue Version von „Bild:Layout.pdf“ hochgeladen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Layout.pdf&amp;diff=29045</id>
		<title>Datei:Layout.pdf</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Layout.pdf&amp;diff=29045"/>
		<updated>2008-07-16T12:11:47Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: hat eine neue Version von „Bild:Layout.pdf“ hochgeladen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Atmega32_Experimentierplatine&amp;diff=28955</id>
		<title>Atmega32 Experimentierplatine</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Atmega32_Experimentierplatine&amp;diff=28955"/>
		<updated>2008-07-11T19:01:23Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Features */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:rotoe|Robin Tönniges]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hier stelle ich meine selbstentwickelte ATmega32-Experimentierplatine vor. Was gleich erwähnt werden sollte ist dass diese Platine auch mit allen anderen Pinkompatiblen Typen funktioniert (warum auch nicht).&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
* Eingangsspannung von 7-20V DC&lt;br /&gt;
* 2x16 Zeichen Display an PORTA&lt;br /&gt;
* Display kann per N-FET an- und ausgeschaltet werden (kann überbrückt werden)&lt;br /&gt;
* JTAG Anschluss&lt;br /&gt;
* ISP Anschluss&lt;br /&gt;
* I2C Anschluss&lt;br /&gt;
* 8x LED&#039;s an PORTB (abschalt- und umsteckbar mit Klingeldraht)&lt;br /&gt;
* 8x Taster an PORTB&lt;br /&gt;
* Jeder Pin es µC&#039;s ist über eine Buchsenleiste erreichbar&lt;br /&gt;
* 2x N-Fets an den PWM Kanälen zum Steuern von Lasten&lt;br /&gt;
* Quarz und Lastkapazitäten sind austauschbar&lt;br /&gt;
* PC Anschluss über MAX232 und Hardware UART möglich&lt;br /&gt;
&lt;br /&gt;
== Schaltplan ==&lt;br /&gt;
[[Bild:Pic3.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan als PDF&lt;br /&gt;
[[Media:Atm32_ep.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
== Platinenlayout ==&lt;br /&gt;
[[Bild:Pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
Das Layout als PDF &lt;br /&gt;
[[Media:Layout.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
Der Bestückungsplan als PDF &lt;br /&gt;
[[Media:Bestck.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
== Bilder der fertig bestückten Platine==&lt;br /&gt;
=== Die Platine von Vorne ===&lt;br /&gt;
[[Bild:Pic1.jpg]]&lt;br /&gt;
=== Die Platine von Hinten ===&lt;br /&gt;
[[Bild:Pic2.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen ==&lt;br /&gt;
*2x16 Zeichen Display ([http://www.pollin.de/shop/shop.php?cf=detail.php&amp;amp;pg=OA==&amp;amp;a=MzI1OTc4OTk=&amp;amp;w=OTg4OTk4&amp;amp;ts=20 Pollin])&lt;br /&gt;
*Die restlichen Teile ([http://www.reichelt.de Reichelt]) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;br /&gt;
[[Kategorie:Projekte]]&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Atmega32_Experimentierplatine&amp;diff=28752</id>
		<title>Atmega32 Experimentierplatine</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Atmega32_Experimentierplatine&amp;diff=28752"/>
		<updated>2008-06-27T16:11:15Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Bezugsquellen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:rotoe|Robin Tönniges]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hier stelle ich meine selbstentwickelte ATmega32-Experimentierplatine vor. Was gleich erwähnt werden sollte ist dass diese Platine auch mit allen anderen Pinkompatiblen Typen funktioniert (warum auch nicht).&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
* Eingangsspannung von 7-20V DC&lt;br /&gt;
* 2x16 Zeichen Display an PORTA&lt;br /&gt;
* Display kann per Fet an- und ausgeschaltet werden (kann überbrückt werden)&lt;br /&gt;
* JTAG Anschluss&lt;br /&gt;
* ISP Anschluss&lt;br /&gt;
* I2C Anschluss&lt;br /&gt;
* 8x LED&#039;s an PORTB (abschalt- und umsteckbar mit Klingeldraht)&lt;br /&gt;
* 8x Taster an PORTB&lt;br /&gt;
* Jeder Pin es µC&#039;s ist über eine Buchsenleiste erreichbar&lt;br /&gt;
* 2x N-Fets an den PWM Kanälen zum Steuern von Lasten&lt;br /&gt;
* Quarz und Lastkapazitäten sind austauschbar&lt;br /&gt;
* PC Anschluss über MAX232 und Hardware UART möglich&lt;br /&gt;
&lt;br /&gt;
== Schaltplan ==&lt;br /&gt;
[[Bild:Pic3.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan als PDF&lt;br /&gt;
[[Media:Atm32_ep.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
== Platinenlayout ==&lt;br /&gt;
[[Bild:Pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
Das Layout als PDF &lt;br /&gt;
[[Media:Layout.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
Der Bestückungsplan als PDF &lt;br /&gt;
[[Media:Bestck.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
== Bilder der fertig bestückten Platine==&lt;br /&gt;
=== Die Platine von Vorne ===&lt;br /&gt;
[[Bild:Pic1.jpg]]&lt;br /&gt;
=== Die Platine von Hinten ===&lt;br /&gt;
[[Bild:Pic2.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen ==&lt;br /&gt;
*2x16 Zeichen Display ([http://www.pollin.de/shop/shop.php?cf=detail.php&amp;amp;pg=OA==&amp;amp;a=MzI1OTc4OTk=&amp;amp;w=OTg4OTk4&amp;amp;ts=20 Pollin])&lt;br /&gt;
*Die restlichen Teile ([http://www.reichelt.de Reichelt]) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;br /&gt;
[[Kategorie:Projekte]]&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Atmega32_Experimentierplatine&amp;diff=28732</id>
		<title>Atmega32 Experimentierplatine</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Atmega32_Experimentierplatine&amp;diff=28732"/>
		<updated>2008-06-27T10:46:44Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:rotoe|Robin Tönniges]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hier stelle ich meine selbstentwickelte ATmega32-Experimentierplatine vor. Was gleich erwähnt werden sollte ist dass diese Platine auch mit allen anderen Pinkompatiblen Typen funktioniert (warum auch nicht).&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
* Eingangsspannung von 7-20V DC&lt;br /&gt;
* 2x16 Zeichen Display an PORTA&lt;br /&gt;
* Display kann per Fet an- und ausgeschaltet werden (kann überbrückt werden)&lt;br /&gt;
* JTAG Anschluss&lt;br /&gt;
* ISP Anschluss&lt;br /&gt;
* I2C Anschluss&lt;br /&gt;
* 8x LED&#039;s an PORTB (abschalt- und umsteckbar mit Klingeldraht)&lt;br /&gt;
* 8x Taster an PORTB&lt;br /&gt;
* Jeder Pin es µC&#039;s ist über eine Buchsenleiste erreichbar&lt;br /&gt;
* 2x N-Fets an den PWM Kanälen zum Steuern von Lasten&lt;br /&gt;
* Quarz und Lastkapazitäten sind austauschbar&lt;br /&gt;
* PC Anschluss über MAX232 und Hardware UART möglich&lt;br /&gt;
&lt;br /&gt;
== Schaltplan ==&lt;br /&gt;
[[Bild:Pic3.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan als PDF&lt;br /&gt;
[[Media:Atm32_ep.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
== Platinenlayout ==&lt;br /&gt;
[[Bild:Pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
Das Layout als PDF &lt;br /&gt;
[[Media:Layout.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
Der Bestückungsplan als PDF &lt;br /&gt;
[[Media:Bestck.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
== Bilder der fertig bestückten Platine==&lt;br /&gt;
=== Die Platine von Vorne ===&lt;br /&gt;
[[Bild:Pic1.jpg]]&lt;br /&gt;
=== Die Platine von Hinten ===&lt;br /&gt;
[[Bild:Pic2.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen ==&lt;br /&gt;
*2x16 Zeichen Display ([http://www.pollin.de/shop/shop.php?cf=detail.php&amp;amp;pg=OA==&amp;amp;a=MzI1OTc4OTk=&amp;amp;w=OTg4OTk4&amp;amp;ts=20 Pollin])&lt;br /&gt;
*Die Restlichen Teile ([http://www.reichelt.de Reichelt]) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;br /&gt;
[[Kategorie:Projekte]]&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Atmega32_Experimentierplatine&amp;diff=28709</id>
		<title>Atmega32 Experimentierplatine</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Atmega32_Experimentierplatine&amp;diff=28709"/>
		<updated>2008-06-26T21:38:30Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:rotoe|Robin Tönniges]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hier stelle ich meine selbstentwickelte ATmega32-Experimentierplatine vor. Was gleich erwähnt werden sollte ist dass diese Platine auch mit allen anderen Pinkompatiblen Typen funktioniert (warum auch nicht).&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
* Eingangsspannung von 7-20V DC&lt;br /&gt;
* 2x16 Zeichen Display an PORTA&lt;br /&gt;
* Display kann per Fet an- und ausgeschaltet werden (kann überbrückt werden)&lt;br /&gt;
* JTAG Anschluss&lt;br /&gt;
* ISP Anschluss&lt;br /&gt;
* I2C Anschluss&lt;br /&gt;
* 8x LED&#039;s an PORTB (abschalt- und umsteckbar mit Klingeldraht)&lt;br /&gt;
* 8x Taster an PORTB&lt;br /&gt;
* Jeder Pin es µC&#039;s ist über eine Buchsenleiste erreichbar&lt;br /&gt;
* 2x N-Fets an den PWM Kanälen zum Steuern von Lasten&lt;br /&gt;
* Quarz und Lastkapazitäten sind austauschbar&lt;br /&gt;
* PC Anschluss über MAX232 und Hardware UART möglich&lt;br /&gt;
&lt;br /&gt;
== Schaltplan ==&lt;br /&gt;
[[Bild:Pic3.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan als PDF&lt;br /&gt;
[[Media:Atm32_ep.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
== Platinenlayout ==&lt;br /&gt;
[[Bild:Pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
Das Layout als PDF &lt;br /&gt;
[[Media:Layout.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
Der Bestückungsplan als PDF &lt;br /&gt;
[[Media:Bestck.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
== Bilder der fertig bestückten Platine==&lt;br /&gt;
=== Die Platine von Vorne ===&lt;br /&gt;
[[Bild:Pic1.jpg]]&lt;br /&gt;
=== Die Platine von Hinten ===&lt;br /&gt;
[[Bild:Pic2.jpg]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;br /&gt;
[[Kategorie:Projekte]]&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Atmega32_Experimentierplatine&amp;diff=28708</id>
		<title>Atmega32 Experimentierplatine</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Atmega32_Experimentierplatine&amp;diff=28708"/>
		<updated>2008-06-26T21:38:13Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:RoToe|Robin Tönniges]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hier stelle ich meine selbstentwickelte ATmega32-Experimentierplatine vor. Was gleich erwähnt werden sollte ist dass diese Platine auch mit allen anderen Pinkompatiblen Typen funktioniert (warum auch nicht).&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
* Eingangsspannung von 7-20V DC&lt;br /&gt;
* 2x16 Zeichen Display an PORTA&lt;br /&gt;
* Display kann per Fet an- und ausgeschaltet werden (kann überbrückt werden)&lt;br /&gt;
* JTAG Anschluss&lt;br /&gt;
* ISP Anschluss&lt;br /&gt;
* I2C Anschluss&lt;br /&gt;
* 8x LED&#039;s an PORTB (abschalt- und umsteckbar mit Klingeldraht)&lt;br /&gt;
* 8x Taster an PORTB&lt;br /&gt;
* Jeder Pin es µC&#039;s ist über eine Buchsenleiste erreichbar&lt;br /&gt;
* 2x N-Fets an den PWM Kanälen zum Steuern von Lasten&lt;br /&gt;
* Quarz und Lastkapazitäten sind austauschbar&lt;br /&gt;
* PC Anschluss über MAX232 und Hardware UART möglich&lt;br /&gt;
&lt;br /&gt;
== Schaltplan ==&lt;br /&gt;
[[Bild:Pic3.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan als PDF&lt;br /&gt;
[[Media:Atm32_ep.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
== Platinenlayout ==&lt;br /&gt;
[[Bild:Pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
Das Layout als PDF &lt;br /&gt;
[[Media:Layout.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
Der Bestückungsplan als PDF &lt;br /&gt;
[[Media:Bestck.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
== Bilder der fertig bestückten Platine==&lt;br /&gt;
=== Die Platine von Vorne ===&lt;br /&gt;
[[Bild:Pic1.jpg]]&lt;br /&gt;
=== Die Platine von Hinten ===&lt;br /&gt;
[[Bild:Pic2.jpg]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;br /&gt;
[[Kategorie:Projekte]]&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Atmega32_Experimentierplatine&amp;diff=28707</id>
		<title>Atmega32 Experimentierplatine</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Atmega32_Experimentierplatine&amp;diff=28707"/>
		<updated>2008-06-26T21:36:48Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier stelle ich meine selbstentwickelte ATmega32-Experimentierplatine vor. Was gleich erwähnt werden sollte ist dass diese Platine auch mit allen anderen Pinkompatiblen Typen funktioniert (warum auch nicht).&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
* Eingangsspannung von 7-20V DC&lt;br /&gt;
* 2x16 Zeichen Display an PORTA&lt;br /&gt;
* Display kann per Fet an- und ausgeschaltet werden (kann überbrückt werden)&lt;br /&gt;
* JTAG Anschluss&lt;br /&gt;
* ISP Anschluss&lt;br /&gt;
* I2C Anschluss&lt;br /&gt;
* 8x LED&#039;s an PORTB (abschalt- und umsteckbar mit Klingeldraht)&lt;br /&gt;
* 8x Taster an PORTB&lt;br /&gt;
* Jeder Pin es µC&#039;s ist über eine Buchsenleiste erreichbar&lt;br /&gt;
* 2x N-Fets an den PWM Kanälen zum Steuern von Lasten&lt;br /&gt;
* Quarz und Lastkapazitäten sind austauschbar&lt;br /&gt;
* PC Anschluss über MAX232 und Hardware UART möglich&lt;br /&gt;
&lt;br /&gt;
== Schaltplan ==&lt;br /&gt;
[[Bild:Pic3.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan als PDF&lt;br /&gt;
[[Media:Atm32_ep.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
== Platinenlayout ==&lt;br /&gt;
[[Bild:Pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
Das Layout als PDF &lt;br /&gt;
[[Media:Layout.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
Der Bestückungsplan als PDF &lt;br /&gt;
[[Media:Bestck.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
== Bilder der fertig bestückten Platine==&lt;br /&gt;
=== Die Platine von Vorne ===&lt;br /&gt;
[[Bild:Pic1.jpg]]&lt;br /&gt;
=== Die Platine von Hinten ===&lt;br /&gt;
[[Bild:Pic2.jpg]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;br /&gt;
[[Kategorie:Projekte]]&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Atmega32_Experimentierplatine&amp;diff=28706</id>
		<title>Atmega32 Experimentierplatine</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Atmega32_Experimentierplatine&amp;diff=28706"/>
		<updated>2008-06-26T21:35:28Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Wettbewerb]]&lt;br /&gt;
[[Kategorie:Projekte]]&lt;br /&gt;
&lt;br /&gt;
Hier stelle ich meine selbstentwickelte ATmega32-Experimentierplatine vor. Was gleich erwähnt werden sollte ist dass diese Platine auch mit allen anderen Pinkompatiblen Typen funktioniert (warum auch nicht).&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
* Eingangsspannung von 7-20V DC&lt;br /&gt;
* 2x16 Zeichen Display an PORTA&lt;br /&gt;
* Display kann per Fet an- und ausgeschaltet werden (kann überbrückt werden)&lt;br /&gt;
* JTAG Anschluss&lt;br /&gt;
* ISP Anschluss&lt;br /&gt;
* I2C Anschluss&lt;br /&gt;
* 8x LED&#039;s an PORTB (abschalt- und umsteckbar mit Klingeldraht)&lt;br /&gt;
* 8x Taster an PORTB&lt;br /&gt;
* Jeder Pin es µC&#039;s ist über eine Buchsenleiste erreichbar&lt;br /&gt;
* 2x N-Fets an den PWM Kanälen zum Steuern von Lasten&lt;br /&gt;
* Quarz und Lastkapazitäten sind austauschbar&lt;br /&gt;
* PC Anschluss über MAX232 und Hardware UART möglich&lt;br /&gt;
&lt;br /&gt;
== Schaltplan ==&lt;br /&gt;
[[Bild:Pic3.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan als PDF&lt;br /&gt;
[[Media:Atm32_ep.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
== Platinenlayout ==&lt;br /&gt;
[[Bild:Pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
Das Layout als PDF &lt;br /&gt;
[[Media:Layout.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
Der Bestückungsplan als PDF &lt;br /&gt;
[[Media:Bestck.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
== Bilder der fertig bestückten Platine==&lt;br /&gt;
=== Die Platine von Vorne ===&lt;br /&gt;
[[Bild:Pic1.jpg]]&lt;br /&gt;
=== Die Platine von Hinten ===&lt;br /&gt;
[[Bild:Pic2.jpg]]&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Atmega32_Experimentierplatine&amp;diff=28704</id>
		<title>Atmega32 Experimentierplatine</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Atmega32_Experimentierplatine&amp;diff=28704"/>
		<updated>2008-06-26T21:27:30Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Wettbewerb]]&lt;br /&gt;
&lt;br /&gt;
Hier stelle ich meine selbstentwickelte ATmega32-Experimentierplatine vor. Was gleich erwähnt werden sollte ist dass diese Platine auch mit allen anderen Pinkompatiblen Typen funktioniert (warum auch nicht).&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
* Eingangsspannung von 7-20V DC&lt;br /&gt;
* 2x16 Zeichen Display an PORTA&lt;br /&gt;
* Display kann per Fet an- und ausgeschaltet werden (kann überbrückt werden)&lt;br /&gt;
* JTAG Anschluss&lt;br /&gt;
* ISP Anschluss&lt;br /&gt;
* I2C Anschluss&lt;br /&gt;
* 8x LED&#039;s an PORTB (abschalt- und umsteckbar mit Klingeldraht)&lt;br /&gt;
* 8x Taster an PORTB&lt;br /&gt;
* Jeder Pin es µC&#039;s ist über eine Buchsenleiste erreichbar&lt;br /&gt;
* 2x N-Fets an den PWM Kanälen zum Steuern von Lasten&lt;br /&gt;
* Quarz und Lastkapazitäten sind austauschbar&lt;br /&gt;
* PC Anschluss über MAX232 und Hardware UART möglich&lt;br /&gt;
&lt;br /&gt;
== Schaltplan ==&lt;br /&gt;
[[Bild:Pic3.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan als PDF&lt;br /&gt;
[[Media:Atm32_ep.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
== Platinenlayout ==&lt;br /&gt;
[[Bild:Pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
Das Layout als PDF &lt;br /&gt;
[[Media:Layout.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
Der Bestückungsplan als PDF &lt;br /&gt;
[[Media:Bestck.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
== Bilder der fertig bestückten Platine==&lt;br /&gt;
=== Die Platine von Vorne ===&lt;br /&gt;
[[Bild:Pic1.jpg]]&lt;br /&gt;
=== Die Platine von Hinten ===&lt;br /&gt;
[[Bild:Pic2.jpg]]&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Atmega32_Experimentierplatine&amp;diff=28703</id>
		<title>Atmega32 Experimentierplatine</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Atmega32_Experimentierplatine&amp;diff=28703"/>
		<updated>2008-06-26T21:27:08Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier stelle ich meine selbstentwickelte ATmega32-Experimentierplatine vor. Was gleich erwähnt werden sollte ist dass diese Platine auch mit allen anderen Pinkompatiblen Typen funktioniert (warum auch nicht).&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
* Eingangsspannung von 7-20V DC&lt;br /&gt;
* 2x16 Zeichen Display an PORTA&lt;br /&gt;
* Display kann per Fet an- und ausgeschaltet werden (kann überbrückt werden)&lt;br /&gt;
* JTAG Anschluss&lt;br /&gt;
* ISP Anschluss&lt;br /&gt;
* I2C Anschluss&lt;br /&gt;
* 8x LED&#039;s an PORTB (abschalt- und umsteckbar mit Klingeldraht)&lt;br /&gt;
* 8x Taster an PORTB&lt;br /&gt;
* Jeder Pin es µC&#039;s ist über eine Buchsenleiste erreichbar&lt;br /&gt;
* 2x N-Fets an den PWM Kanälen zum Steuern von Lasten&lt;br /&gt;
* Quarz und Lastkapazitäten sind austauschbar&lt;br /&gt;
* PC Anschluss über MAX232 und Hardware UART möglich&lt;br /&gt;
&lt;br /&gt;
== Schaltplan ==&lt;br /&gt;
[[Bild:Pic3.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan als PDF&lt;br /&gt;
[[Media:Atm32_ep.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
== Platinenlayout ==&lt;br /&gt;
[[Bild:Pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
Das Layout als PDF &lt;br /&gt;
[[Media:Layout.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
Der Bestückungsplan als PDF &lt;br /&gt;
[[Media:Bestck.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
== Bilder der fertig bestückten Platine==&lt;br /&gt;
=== Die Platine von Vorne ===&lt;br /&gt;
[[Bild:Pic1.jpg]]&lt;br /&gt;
=== Die Platine von Hinten ===&lt;br /&gt;
[[Bild:Pic2.jpg]]&lt;br /&gt;
&lt;br /&gt;
“[[Kategorie:Wettbewerb]]”&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Atmega32_Experimentierplatine&amp;diff=28702</id>
		<title>Atmega32 Experimentierplatine</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Atmega32_Experimentierplatine&amp;diff=28702"/>
		<updated>2008-06-26T21:26:49Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier stelle ich meine selbstentwickelte ATmega32-Experimentierplatine vor. Was gleich erwähnt werden sollte ist dass diese Platine auch mit allen anderen Pinkompatiblen Typen funktioniert (warum auch nicht).&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
* Eingangsspannung von 7-20V DC&lt;br /&gt;
* 2x16 Zeichen Display an PORTA&lt;br /&gt;
* Display kann per Fet an- und ausgeschaltet werden (kann überbrückt werden)&lt;br /&gt;
* JTAG Anschluss&lt;br /&gt;
* ISP Anschluss&lt;br /&gt;
* I2C Anschluss&lt;br /&gt;
* 8x LED&#039;s an PORTB (abschalt- und umsteckbar mit Klingeldraht)&lt;br /&gt;
* 8x Taster an PORTB&lt;br /&gt;
* Jeder Pin es µC&#039;s ist über eine Buchsenleiste erreichbar&lt;br /&gt;
* 2x N-Fets an den PWM Kanälen zum Steuern von Lasten&lt;br /&gt;
* Quarz und Lastkapazitäten sind austauschbar&lt;br /&gt;
* PC Anschluss über MAX232 und Hardware UART möglich&lt;br /&gt;
&lt;br /&gt;
== Schaltplan ==&lt;br /&gt;
[[Bild:Pic3.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan als PDF&lt;br /&gt;
[[Media:Atm32_ep.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
== Platinenlayout ==&lt;br /&gt;
[[Bild:Pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
Das Layout als PDF &lt;br /&gt;
[[Media:Layout.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
Der Bestückungsplan als PDF &lt;br /&gt;
[[Media:Bestck.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
== Bilder der fertig bestückten Platine==&lt;br /&gt;
=== Die Platine von Vorne ===&lt;br /&gt;
[[Bild:Pic1.jpg]]&lt;br /&gt;
=== Die Platine von Hinten ===&lt;br /&gt;
[[Bild:Pic2.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Atmega32_Experimentierplatine&amp;diff=28701</id>
		<title>Atmega32 Experimentierplatine</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Atmega32_Experimentierplatine&amp;diff=28701"/>
		<updated>2008-06-26T21:26:21Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Features */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier stelle ich meine selbstentwickelte ATmega32-Experimentierplatine vor. Was gleich erwähnt werden sollte ist dass diese Platine auch mit allen anderen Pinkompatiblen Typen funktioniert (warum auch nicht).&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
* Eingangsspannung von 7-20V DC&lt;br /&gt;
* 2x16 Zeichen Display an PORTA&lt;br /&gt;
* Display kann per Fet an- und ausgeschaltet werden (kann überbrückt werden)&lt;br /&gt;
* JTAG Anschluss&lt;br /&gt;
* ISP Anschluss&lt;br /&gt;
* I2C Anschluss&lt;br /&gt;
* 8x LED&#039;s an PORTB (abschalt- und umsteckbar mit Klingeldraht)&lt;br /&gt;
* 8x Taster an PORTB&lt;br /&gt;
* Jeder Pin es µC&#039;s ist über eine Buchsenleiste erreichbar&lt;br /&gt;
* 2x N-Fets an den PWM Kanälen zum Steuern von Lasten&lt;br /&gt;
* Quarz und Lastkapazitäten sind austauschbar&lt;br /&gt;
* PC Anschluss über MAX232 und Hardware UART möglich&lt;br /&gt;
&lt;br /&gt;
== Schaltplan ==&lt;br /&gt;
[[Bild:Pic3.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan als PDF&lt;br /&gt;
[[Media:Atm32_ep.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
== Platinenlayout ==&lt;br /&gt;
[[Bild:Pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
Das Layout als PDF &lt;br /&gt;
[[Media:Layout.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
Der Bestückungsplan als PDF &lt;br /&gt;
[[Media:Bestck.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
== Bilder der fertig bestückten Platine==&lt;br /&gt;
=== Die Platine von Vorne ===&lt;br /&gt;
[[Bild:Pic1.jpg]]&lt;br /&gt;
=== Die Platine von Hinten ===&lt;br /&gt;
[[Bild:Pic2.jpg]]&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Atmega32_Experimentierplatine&amp;diff=28700</id>
		<title>Atmega32 Experimentierplatine</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Atmega32_Experimentierplatine&amp;diff=28700"/>
		<updated>2008-06-26T21:25:54Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier stelle ich meine selbstentwickelte ATmega32-Experimentierplatine vor. Was gleich erwähnt werden sollte ist dass diese Platine auch mit allen anderen Pinkompatiblen Typen funktioniert (warum auch nicht).&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
* Eingangsspannung von 7-15V DC&lt;br /&gt;
* 2x16 Zeichen Display an PORTA&lt;br /&gt;
* Display kann per Fet an- und ausgeschaltet werden (kann überbrückt werden)&lt;br /&gt;
* JTAG Anschluss&lt;br /&gt;
* ISP Anschluss&lt;br /&gt;
* I2C Anschluss&lt;br /&gt;
* 8x LED&#039;s an PORTB (abschalt- und umsteckbar mit Klingeldraht)&lt;br /&gt;
* 8x Taster an PORTB&lt;br /&gt;
* Jeder Pin es µC&#039;s ist über eine Buchsenleiste erreichbar&lt;br /&gt;
* 2x N-Fets an den PWM Kanälen zum Steuern von Lasten&lt;br /&gt;
* Quarz und Lastkapazitäten sind austauschbar&lt;br /&gt;
* PC Anschluss über MAX232 und Hardware UART möglich&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Schaltplan ==&lt;br /&gt;
[[Bild:Pic3.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan als PDF&lt;br /&gt;
[[Media:Atm32_ep.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
== Platinenlayout ==&lt;br /&gt;
[[Bild:Pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
Das Layout als PDF &lt;br /&gt;
[[Media:Layout.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
Der Bestückungsplan als PDF &lt;br /&gt;
[[Media:Bestck.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
== Bilder der fertig bestückten Platine==&lt;br /&gt;
=== Die Platine von Vorne ===&lt;br /&gt;
[[Bild:Pic1.jpg]]&lt;br /&gt;
=== Die Platine von Hinten ===&lt;br /&gt;
[[Bild:Pic2.jpg]]&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Atmega32_Experimentierplatine&amp;diff=28699</id>
		<title>Atmega32 Experimentierplatine</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Atmega32_Experimentierplatine&amp;diff=28699"/>
		<updated>2008-06-26T21:18:50Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Platinenlayout */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier stelle ich meine selbstentwickelte ATmega32-Experimentierplatine vor. Was gleich erwähnt werden sollte ist dass diese Platine auch mit allen anderen Pinkompatiblen Typen funktioniert (warum auch nicht).&lt;br /&gt;
&lt;br /&gt;
== Schaltplan ==&lt;br /&gt;
[[Bild:Pic3.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan als PDF&lt;br /&gt;
[[Media:Atm32_ep.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
== Platinenlayout ==&lt;br /&gt;
[[Bild:Pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
Das Layout als PDF &lt;br /&gt;
[[Media:Layout.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
Der Bestückungsplan als PDF &lt;br /&gt;
[[Media:Bestck.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
== Bilder der fertig bestückten Platine==&lt;br /&gt;
=== Die Platine von Vorne ===&lt;br /&gt;
[[Bild:Pic1.jpg]]&lt;br /&gt;
=== Die Platine von Hinten ===&lt;br /&gt;
[[Bild:Pic2.jpg]]&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Atmega32_Experimentierplatine&amp;diff=28698</id>
		<title>Atmega32 Experimentierplatine</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Atmega32_Experimentierplatine&amp;diff=28698"/>
		<updated>2008-06-26T21:18:40Z</updated>

		<summary type="html">&lt;p&gt;Rotoe: /* Platinenlayout */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier stelle ich meine selbstentwickelte ATmega32-Experimentierplatine vor. Was gleich erwähnt werden sollte ist dass diese Platine auch mit allen anderen Pinkompatiblen Typen funktioniert (warum auch nicht).&lt;br /&gt;
&lt;br /&gt;
== Schaltplan ==&lt;br /&gt;
[[Bild:Pic3.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan als PDF&lt;br /&gt;
[[Media:Atm32_ep.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
== Platinenlayout ==&lt;br /&gt;
[[Bild:Pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
Das Layout als PDF &lt;br /&gt;
[[Media:Layout.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
Der Bestpckungsplan als PDF &lt;br /&gt;
[[Media:Bestck.pdf|Download]]&lt;br /&gt;
&lt;br /&gt;
== Bilder der fertig bestückten Platine==&lt;br /&gt;
=== Die Platine von Vorne ===&lt;br /&gt;
[[Bild:Pic1.jpg]]&lt;br /&gt;
=== Die Platine von Hinten ===&lt;br /&gt;
[[Bild:Pic2.jpg]]&lt;/div&gt;</summary>
		<author><name>Rotoe</name></author>
	</entry>
</feed>