<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
		<id>https://rn-wissen.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Luma</id>
		<title>RN-Wissen.de - Benutzerbeiträge [de]</title>
		<link rel="self" type="application/atom+xml" href="https://rn-wissen.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Luma"/>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Spezial:Beitr%C3%A4ge/Luma"/>
		<updated>2026-04-11T23:37:29Z</updated>
		<subtitle>Benutzerbeiträge</subtitle>
		<generator>MediaWiki 1.25.1</generator>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Dev-cpp&amp;diff=8266</id>
		<title>Dev-cpp</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Dev-cpp&amp;diff=8266"/>
				<updated>2006-07-10T17:51:36Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#redirect [[Dev-Cpp IDE]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Diskussion:LCD&amp;diff=7897</id>
		<title>Diskussion:LCD</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Diskussion:LCD&amp;diff=7897"/>
				<updated>2006-06-18T00:43:50Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Vorlage {{Begriffsklärung}} wie sie unter www.wikipedia.org verwendet wird, tut im RN-Wiki nicht. Vielleicht können ja erfahrene Wikipedianer da nachbessern. Danke.&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=LCD&amp;diff=7896</id>
		<title>LCD</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=LCD&amp;diff=7896"/>
				<updated>2006-06-18T00:42:40Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Diese Seite ist eine Begriffserklärung''&lt;br /&gt;
&lt;br /&gt;
* [[LCD-Modul am AVR]]&lt;br /&gt;
* [[Bascom und LCD's]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Sensor&amp;diff=7638</id>
		<title>Sensor</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Sensor&amp;diff=7638"/>
				<updated>2006-05-31T13:33:15Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Sensoren]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Sensor&amp;diff=7637</id>
		<title>Sensor</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Sensor&amp;diff=7637"/>
				<updated>2006-05-31T13:32:21Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Sensorarten]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Solarzelle&amp;diff=7636</id>
		<title>Solarzelle</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Solarzelle&amp;diff=7636"/>
				<updated>2006-05-31T13:31:24Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Solarzellen]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Solarzelle&amp;diff=7635</id>
		<title>Solarzelle</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Solarzelle&amp;diff=7635"/>
				<updated>2006-05-31T13:31:21Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Solarzelle]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Spinnenbein&amp;diff=7634</id>
		<title>Spinnenbein</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Spinnenbein&amp;diff=7634"/>
				<updated>2006-05-31T13:30:49Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Spinnenbeine]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Schrittmotor&amp;diff=7633</id>
		<title>Schrittmotor</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Schrittmotor&amp;diff=7633"/>
				<updated>2006-05-31T13:30:10Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Schrittmotoren]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=I%C2%B2C&amp;diff=7632</id>
		<title>I²C</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=I%C2%B2C&amp;diff=7632"/>
				<updated>2006-05-31T13:29:16Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[I2C]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=IIC&amp;diff=7631</id>
		<title>IIC</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=IIC&amp;diff=7631"/>
				<updated>2006-05-31T13:28:42Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[I2C]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Funkmodul&amp;diff=7630</id>
		<title>Funkmodul</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Funkmodul&amp;diff=7630"/>
				<updated>2006-05-31T13:27:50Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Funkmodule]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Dioden&amp;diff=7629</id>
		<title>Dioden</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Dioden&amp;diff=7629"/>
				<updated>2006-05-31T13:27:27Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Diode]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Leds&amp;diff=7628</id>
		<title>Leds</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Leds&amp;diff=7628"/>
				<updated>2006-05-31T13:26:44Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Leuchtdioden]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=LEDs&amp;diff=7627</id>
		<title>LEDs</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=LEDs&amp;diff=7627"/>
				<updated>2006-05-31T13:26:00Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Leuchtdioden]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=LED&amp;diff=7626</id>
		<title>LED</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=LED&amp;diff=7626"/>
				<updated>2006-05-31T13:25:42Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Leuchtdioden]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Transistoren&amp;diff=7625</id>
		<title>Transistoren</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Transistoren&amp;diff=7625"/>
				<updated>2006-05-31T13:22:51Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Transistor]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Servo&amp;diff=7624</id>
		<title>Servo</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Servo&amp;diff=7624"/>
				<updated>2006-05-31T13:21:51Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Servos]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Dev-Cpp_IDE&amp;diff=7623</id>
		<title>Dev-Cpp IDE</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Dev-Cpp_IDE&amp;diff=7623"/>
				<updated>2006-05-31T01:06:53Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: Kategorien hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Irgendwann beginnt jeder der Mikrocontroller wie die AVRs in C/C++ programmiert sich Gedanken zu machen, ob es nicht eine komfortable IDE gibt, die das Programmers Notepad  von [[WinAVR]] ersetzt. Es gibt eine entsprechende IDE die unter der GPL steht und damit kostenlos ist: Dev-Cpp.&amp;lt;br&amp;gt;&lt;br /&gt;
Dieser kleine Artikel soll in kurzen Sätzen erläutern, wie man sich die IDE  so einrichtet, dass man wie gewohnt nur mit mehr Komfort arbeiten kann. Außerdem soll er auch eine kleine Einführung in Dev-Cpp sein.&lt;br /&gt;
&lt;br /&gt;
== Was ist eine IDE? ==&lt;br /&gt;
IDE steht für integrierte Entwicklungsumgebung. Sie fassen viele Programmierwerkzeuge zusammen (wie z.B. einen Compiler, einen komfortablen Texteditor, Versionsverwaltung, et cetera). Dadurch entfallen viele lästige Aufgaben, weil diese die IDE übernimmt.&lt;br /&gt;
&lt;br /&gt;
== Dev-Cpp ==&lt;br /&gt;
Dev-Cpp ist eine C/C++ Entwicklungsumgebung die unter der GPL steht und damit kostenlos im Web zu haben ist (siehe Weblinks).&lt;br /&gt;
&lt;br /&gt;
=== Einrichten ===&lt;br /&gt;
Nach erfolgreicher Installation sollte die IDE ohne Probleme starten. Neben der IDE muss auch noch [[WinAVR]] installiert sein.&amp;lt;br&amp;gt;&lt;br /&gt;
Um nun Dev-Cpp einzurichten geht man so vor.&amp;lt;br&amp;gt;&lt;br /&gt;
* Klicke auf ''Werkzeuge » Compiler Optionen''.&lt;br /&gt;
[[Bild:DevCpp_Werkzeuge.png|Dev-Cpp]]&lt;br /&gt;
&lt;br /&gt;
* Als nächstes ein neues Compiler Set anlegen. Gebt ihm einen beliebigen Namen wie z.B. avr-gcc. Ihr könnt ihn später auch noch umbenennen. Wenn man weitere Projekte anlegt, kann man dann einfach dieses Set auswählen.&lt;br /&gt;
[[Bild:DevCpp_Compiler_neu.png|Dev-Cpp]]&lt;br /&gt;
&lt;br /&gt;
* Dann im gleichen Fenster auf den Reiter ''Programme'' klicken und dort alles entsprechend dem Bild unten ändern (die Zeilen die geändert werden müssen sind blau hinterlegt). Dann den Dialog über ''OK'' schließen.&lt;br /&gt;
[[Bild:DevCpp_Compiler_avrgcc.png|Dev-Cpp]]&lt;br /&gt;
&lt;br /&gt;
* Zum Schluss musst Dev-Cpp noch so eingestellt werden, dass es euer Makefile (am besten mit MFile erzeugen) verwendet. Erstellt dazu erst ein neues Projekt über ''Datei » Neu » Projekt...''.&lt;br /&gt;
[[Bild:DevCpp_NeuesProjekt.png|Dev-Cpp]]&lt;br /&gt;
&lt;br /&gt;
* Klickt nun auf ''Projekt » Projekt Optionen'' und im Fenster dann auf den Reiter Make. Dort setzt ihr den Haken vor ''Nutze eigenes Makefile (kein Makefile generieren)'' und wählt dann euer Makefile aus indem ihr auf den Button rechts klickt. Hier ist eine kleine Tücke zu beachten. Damit Dev-Cpp das Makefile verwendet, muss dieses in dem gleichen Verzeichnis wie die Projektdatei liegen, sonst nimmt Dev-Cpp das Makefile nicht an!&lt;br /&gt;
[[Bild:DevCpp_Make.png|Dev-Cpp]]&lt;br /&gt;
&lt;br /&gt;
Das war es dann auch schon.&amp;lt;br&amp;gt;&lt;br /&gt;
Nun eine kleine Einführung in Dev-Cpp.&lt;br /&gt;
&lt;br /&gt;
=== Eine kleine Einführung ===&lt;br /&gt;
Möchte man mit Dev-Cpp arbeiten, so muss am zuerst einmal ein neues Projekt erstellen, indem man auf ''Datei » Neu » Projekt...'' klickt. Dort wählt man Projekttyp Console Application, wählt unten rechts die entsprechende Programmiersprache aus und gibt einen Projektnamen ein.&amp;lt;br&amp;gt;&lt;br /&gt;
Nun speichert man das Projekt und dann kann es auch schon fast losgehen. Als letzes muss das Projekt (wie oben beschrieben) noch kurz auf den avr-gcc und eigenes Makfile eingestellt werden. Siehe dazu die Beschreibung oben.&amp;lt;br&amp;gt;&lt;br /&gt;
Neue Dateien kann man dem Projekt über ''Projekt » Zum Projekt hinzufügen'' hinzufügen, oder über ''Projekt » Neue Datei'' überhaupt eine neue Datei erstellen.&amp;lt;br&amp;gt;&lt;br /&gt;
Links oben unter dem Reiter '''Projekt''' findet man alle Projekte. Unter dem Reiter '''Klassen''' findet man zum jeweiligen Projekt die Klassen und deren Methoden oder nur C-Funktionen.&amp;lt;br&amp;gt;&lt;br /&gt;
Außerdem findet man unter den Reitern am unteren Bildschirmrand wichtige Ausgaben.&lt;br /&gt;
&lt;br /&gt;
==== Codevervollständigung ====&lt;br /&gt;
Dev-Cpp bietet eine Codevervollständigung an. Wenn man immer die gleichen langen Funktionsnamen eingeben muss, ist diese ein großer Vorteil. Man gibt einfach ein paar Anfangsbuchstaben des Funktionsname ein und drückt dann Strg + Enter und schon popt ein Popup auf, in dem man zwischen den möglichen Funktionen wählen kann.&lt;br /&gt;
&lt;br /&gt;
==== Werzeuge ====&lt;br /&gt;
Unter Dev-Cpp ist es möglich ähnlich dem ProgrammersNotepad von [[WinAVR]] eigene Werkzeuge einzubinden (also z.B. Programme, die mit speziellen Parametern aufgerufen werden sollen).&amp;lt;br&amp;gt;&lt;br /&gt;
Unter ''Werkzeuge » Konfiguriere Werkzeuge'' kann man sich seine eigenen Werkzeuge kreieren und diese ändern. Diese kann man dann im Menü ''Werkzeuge'' aufrufen.&lt;br /&gt;
[[Bild:DevCpp_Eigene_Werkzeuge.png|Dev-Cpp]]&lt;br /&gt;
&lt;br /&gt;
==== Konfiguration ====&lt;br /&gt;
Dev-Cpp lässt sich in vielen Bereichen weit konfigurieren.&amp;lt;br&amp;gt;&lt;br /&gt;
Den '''Editor''' konfiguriert man unter ''Werkzeuge » Editor Optionen''. Dort kann man z.B. einstellen, dass Zeilennummern angezeigt werden werden und man kann das Tabverhalten bestimmen (beides auf jeden Fall zu empfehlen).&amp;lt;br&amp;gt;&lt;br /&gt;
Die '''IDE''' an sich konfiguriert man unter ''Werkzeuge » Umgebungs Optionen''. Dort kann man z.B. die Sprache oder das Aussehen der IDE bestimmen.&amp;lt;br&amp;gt;&lt;br /&gt;
Der '''Compiler''' wird unter ''Werkzeuge » Compiler Optionen'' konfiguriert.&lt;br /&gt;
&lt;br /&gt;
==== Wichtige Tastenkürzel ====&lt;br /&gt;
Die wichtigsten Tastenkürzel auf einen Blick. Man kann die Tastenkürzel (auch Shortcuts genannt) unter ''Werzeuge » Konfiguriere Shortcuts'' ändern. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Ausführen&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Datei&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Suchen/Ersetzen&lt;br /&gt;
|-&lt;br /&gt;
 |Kompilieren&lt;br /&gt;
 |Strg + F9&lt;br /&gt;
 |Neu&lt;br /&gt;
 |Strg + N&lt;br /&gt;
 |Suchen&lt;br /&gt;
 |Strg + F&lt;br /&gt;
 |-&lt;br /&gt;
 |Ausführen&lt;br /&gt;
 |Strg + F10&lt;br /&gt;
 |Speichern&lt;br /&gt;
 |Strg + S&lt;br /&gt;
 |Ersetzen&lt;br /&gt;
 |Strg + R&lt;br /&gt;
 |-&lt;br /&gt;
 |Alles erneuern&lt;br /&gt;
 |Strg + F11&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |Gehe zu Zeile&lt;br /&gt;
 |Strg + G&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |Gehe zu Funktion&lt;br /&gt;
 |Strg + Shift + G&lt;br /&gt;
 |}&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere wichtige Tastenkürzel sind:&amp;lt;br&amp;gt;&lt;br /&gt;
* '''Strg + Pos1'''/'''Strg + Ende''': An den Anfang bzw. das Ende der Datei springen.&lt;br /&gt;
* '''Strg + Pfeiltasten oben/unten''': Scrollen, Cursur bleibt in Zeile stehen.&lt;br /&gt;
* '''Shift + Pfeiltasten links/rechts''': Einzelne Zeichen selektieren.&lt;br /&gt;
* '''Shift + Pos1'''/'''Shift + Ende''': Ganze Zeile selektieren.&lt;br /&gt;
&lt;br /&gt;
== Bemerkung ==&lt;br /&gt;
Es soll hier auch Rande erwähnt sein, dass es auch andere C/C++ IDEs gibt – u.a. CDT in Verbindung mit Eclipse. Allerdings ist die Konfiguration dieser IDE viel aufwändiger und ich habe es noch nicht geschafft sie zum laufen zu bringen. Wer Lust hat und weiß wie man CDT richtig einrichtet, kann ja hier einen Artikel verfassen. Außerdem habe ich auch von CodeBlocks gehört. Man sieht es gibt IDEs wie Sand am Meer.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* http://www.bloodshed.net/&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[WinAVR]]&lt;br /&gt;
* [[avr-gcc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
--[[Benutzer:Luma|Luma]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Software]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Dev-Cpp_IDE&amp;diff=7622</id>
		<title>Dev-Cpp IDE</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Dev-Cpp_IDE&amp;diff=7622"/>
				<updated>2006-05-31T01:03:29Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: /* Siehe auch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Irgendwann beginnt jeder der Mikrocontroller wie die AVRs in C/C++ programmiert sich Gedanken zu machen, ob es nicht eine komfortable IDE gibt, die das Programmers Notepad  von [[WinAVR]] ersetzt. Es gibt eine entsprechende IDE die unter der GPL steht und damit kostenlos ist: Dev-Cpp.&amp;lt;br&amp;gt;&lt;br /&gt;
Dieser kleine Artikel soll in kurzen Sätzen erläutern, wie man sich die IDE  so einrichtet, dass man wie gewohnt nur mit mehr Komfort arbeiten kann. Außerdem soll er auch eine kleine Einführung in Dev-Cpp sein.&lt;br /&gt;
&lt;br /&gt;
== Was ist eine IDE? ==&lt;br /&gt;
IDE steht für integrierte Entwicklungsumgebung. Sie fassen viele Programmierwerkzeuge zusammen (wie z.B. einen Compiler, einen komfortablen Texteditor, Versionsverwaltung, et cetera). Dadurch entfallen viele lästige Aufgaben, weil diese die IDE übernimmt.&lt;br /&gt;
&lt;br /&gt;
== Dev-Cpp ==&lt;br /&gt;
Dev-Cpp ist eine C/C++ Entwicklungsumgebung die unter der GPL steht und damit kostenlos im Web zu haben ist (siehe Weblinks).&lt;br /&gt;
&lt;br /&gt;
=== Einrichten ===&lt;br /&gt;
Nach erfolgreicher Installation sollte die IDE ohne Probleme starten. Neben der IDE muss auch noch [[WinAVR]] installiert sein.&amp;lt;br&amp;gt;&lt;br /&gt;
Um nun Dev-Cpp einzurichten geht man so vor.&amp;lt;br&amp;gt;&lt;br /&gt;
* Klicke auf ''Werkzeuge » Compiler Optionen''.&lt;br /&gt;
[[Bild:DevCpp_Werkzeuge.png|Dev-Cpp]]&lt;br /&gt;
&lt;br /&gt;
* Als nächstes ein neues Compiler Set anlegen. Gebt ihm einen beliebigen Namen wie z.B. avr-gcc. Ihr könnt ihn später auch noch umbenennen. Wenn man weitere Projekte anlegt, kann man dann einfach dieses Set auswählen.&lt;br /&gt;
[[Bild:DevCpp_Compiler_neu.png|Dev-Cpp]]&lt;br /&gt;
&lt;br /&gt;
* Dann im gleichen Fenster auf den Reiter ''Programme'' klicken und dort alles entsprechend dem Bild unten ändern (die Zeilen die geändert werden müssen sind blau hinterlegt). Dann den Dialog über ''OK'' schließen.&lt;br /&gt;
[[Bild:DevCpp_Compiler_avrgcc.png|Dev-Cpp]]&lt;br /&gt;
&lt;br /&gt;
* Zum Schluss musst Dev-Cpp noch so eingestellt werden, dass es euer Makefile (am besten mit MFile erzeugen) verwendet. Erstellt dazu erst ein neues Projekt über ''Datei » Neu » Projekt...''.&lt;br /&gt;
[[Bild:DevCpp_NeuesProjekt.png|Dev-Cpp]]&lt;br /&gt;
&lt;br /&gt;
* Klickt nun auf ''Projekt » Projekt Optionen'' und im Fenster dann auf den Reiter Make. Dort setzt ihr den Haken vor ''Nutze eigenes Makefile (kein Makefile generieren)'' und wählt dann euer Makefile aus indem ihr auf den Button rechts klickt. Hier ist eine kleine Tücke zu beachten. Damit Dev-Cpp das Makefile verwendet, muss dieses in dem gleichen Verzeichnis wie die Projektdatei liegen, sonst nimmt Dev-Cpp das Makefile nicht an!&lt;br /&gt;
[[Bild:DevCpp_Make.png|Dev-Cpp]]&lt;br /&gt;
&lt;br /&gt;
Das war es dann auch schon.&amp;lt;br&amp;gt;&lt;br /&gt;
Nun eine kleine Einführung in Dev-Cpp.&lt;br /&gt;
&lt;br /&gt;
=== Eine kleine Einführung ===&lt;br /&gt;
Möchte man mit Dev-Cpp arbeiten, so muss am zuerst einmal ein neues Projekt erstellen, indem man auf ''Datei » Neu » Projekt...'' klickt. Dort wählt man Projekttyp Console Application, wählt unten rechts die entsprechende Programmiersprache aus und gibt einen Projektnamen ein.&amp;lt;br&amp;gt;&lt;br /&gt;
Nun speichert man das Projekt und dann kann es auch schon fast losgehen. Als letzes muss das Projekt (wie oben beschrieben) noch kurz auf den avr-gcc und eigenes Makfile eingestellt werden. Siehe dazu die Beschreibung oben.&amp;lt;br&amp;gt;&lt;br /&gt;
Neue Dateien kann man dem Projekt über ''Projekt » Zum Projekt hinzufügen'' hinzufügen, oder über ''Projekt » Neue Datei'' überhaupt eine neue Datei erstellen.&amp;lt;br&amp;gt;&lt;br /&gt;
Links oben unter dem Reiter '''Projekt''' findet man alle Projekte. Unter dem Reiter '''Klassen''' findet man zum jeweiligen Projekt die Klassen und deren Methoden oder nur C-Funktionen.&amp;lt;br&amp;gt;&lt;br /&gt;
Außerdem findet man unter den Reitern am unteren Bildschirmrand wichtige Ausgaben.&lt;br /&gt;
&lt;br /&gt;
==== Codevervollständigung ====&lt;br /&gt;
Dev-Cpp bietet eine Codevervollständigung an. Wenn man immer die gleichen langen Funktionsnamen eingeben muss, ist diese ein großer Vorteil. Man gibt einfach ein paar Anfangsbuchstaben des Funktionsname ein und drückt dann Strg + Enter und schon popt ein Popup auf, in dem man zwischen den möglichen Funktionen wählen kann.&lt;br /&gt;
&lt;br /&gt;
==== Werzeuge ====&lt;br /&gt;
Unter Dev-Cpp ist es möglich ähnlich dem ProgrammersNotepad von [[WinAVR]] eigene Werkzeuge einzubinden (also z.B. Programme, die mit speziellen Parametern aufgerufen werden sollen).&amp;lt;br&amp;gt;&lt;br /&gt;
Unter ''Werkzeuge » Konfiguriere Werkzeuge'' kann man sich seine eigenen Werkzeuge kreieren und diese ändern. Diese kann man dann im Menü ''Werkzeuge'' aufrufen.&lt;br /&gt;
[[Bild:DevCpp_Eigene_Werkzeuge.png|Dev-Cpp]]&lt;br /&gt;
&lt;br /&gt;
==== Konfiguration ====&lt;br /&gt;
Dev-Cpp lässt sich in vielen Bereichen weit konfigurieren.&amp;lt;br&amp;gt;&lt;br /&gt;
Den '''Editor''' konfiguriert man unter ''Werkzeuge » Editor Optionen''. Dort kann man z.B. einstellen, dass Zeilennummern angezeigt werden werden und man kann das Tabverhalten bestimmen (beides auf jeden Fall zu empfehlen).&amp;lt;br&amp;gt;&lt;br /&gt;
Die '''IDE''' an sich konfiguriert man unter ''Werkzeuge » Umgebungs Optionen''. Dort kann man z.B. die Sprache oder das Aussehen der IDE bestimmen.&amp;lt;br&amp;gt;&lt;br /&gt;
Der '''Compiler''' wird unter ''Werkzeuge » Compiler Optionen'' konfiguriert.&lt;br /&gt;
&lt;br /&gt;
==== Wichtige Tastenkürzel ====&lt;br /&gt;
Die wichtigsten Tastenkürzel auf einen Blick. Man kann die Tastenkürzel (auch Shortcuts genannt) unter ''Werzeuge » Konfiguriere Shortcuts'' ändern. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Ausführen&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Datei&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Suchen/Ersetzen&lt;br /&gt;
|-&lt;br /&gt;
 |Kompilieren&lt;br /&gt;
 |Strg + F9&lt;br /&gt;
 |Neu&lt;br /&gt;
 |Strg + N&lt;br /&gt;
 |Suchen&lt;br /&gt;
 |Strg + F&lt;br /&gt;
 |-&lt;br /&gt;
 |Ausführen&lt;br /&gt;
 |Strg + F10&lt;br /&gt;
 |Speichern&lt;br /&gt;
 |Strg + S&lt;br /&gt;
 |Ersetzen&lt;br /&gt;
 |Strg + R&lt;br /&gt;
 |-&lt;br /&gt;
 |Alles erneuern&lt;br /&gt;
 |Strg + F11&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |Gehe zu Zeile&lt;br /&gt;
 |Strg + G&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |Gehe zu Funktion&lt;br /&gt;
 |Strg + Shift + G&lt;br /&gt;
 |}&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere wichtige Tastenkürzel sind:&amp;lt;br&amp;gt;&lt;br /&gt;
* '''Strg + Pos1'''/'''Strg + Ende''': An den Anfang bzw. das Ende der Datei springen.&lt;br /&gt;
* '''Strg + Pfeiltasten oben/unten''': Scrollen, Cursur bleibt in Zeile stehen.&lt;br /&gt;
* '''Shift + Pfeiltasten links/rechts''': Einzelne Zeichen selektieren.&lt;br /&gt;
* '''Shift + Pos1'''/'''Shift + Ende''': Ganze Zeile selektieren.&lt;br /&gt;
&lt;br /&gt;
== Bemerkung ==&lt;br /&gt;
Es soll hier auch Rande erwähnt sein, dass es auch andere C/C++ IDEs gibt – u.a. CDT in Verbindung mit Eclipse. Allerdings ist die Konfiguration dieser IDE viel aufwändiger und ich habe es noch nicht geschafft sie zum laufen zu bringen. Wer Lust hat und weiß wie man CDT richtig einrichtet, kann ja hier einen Artikel verfassen. Außerdem habe ich auch von CodeBlocks gehört. Man sieht es gibt IDEs wie Sand am Meer.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* http://www.bloodshed.net/&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[WinAVR]]&lt;br /&gt;
* [[avr-gcc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
--[[Benutzer:Luma|Luma]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Dev-Cpp_IDE&amp;diff=7621</id>
		<title>Dev-Cpp IDE</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Dev-Cpp_IDE&amp;diff=7621"/>
				<updated>2006-05-31T01:02:39Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: /* Weblinks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Irgendwann beginnt jeder der Mikrocontroller wie die AVRs in C/C++ programmiert sich Gedanken zu machen, ob es nicht eine komfortable IDE gibt, die das Programmers Notepad  von [[WinAVR]] ersetzt. Es gibt eine entsprechende IDE die unter der GPL steht und damit kostenlos ist: Dev-Cpp.&amp;lt;br&amp;gt;&lt;br /&gt;
Dieser kleine Artikel soll in kurzen Sätzen erläutern, wie man sich die IDE  so einrichtet, dass man wie gewohnt nur mit mehr Komfort arbeiten kann. Außerdem soll er auch eine kleine Einführung in Dev-Cpp sein.&lt;br /&gt;
&lt;br /&gt;
== Was ist eine IDE? ==&lt;br /&gt;
IDE steht für integrierte Entwicklungsumgebung. Sie fassen viele Programmierwerkzeuge zusammen (wie z.B. einen Compiler, einen komfortablen Texteditor, Versionsverwaltung, et cetera). Dadurch entfallen viele lästige Aufgaben, weil diese die IDE übernimmt.&lt;br /&gt;
&lt;br /&gt;
== Dev-Cpp ==&lt;br /&gt;
Dev-Cpp ist eine C/C++ Entwicklungsumgebung die unter der GPL steht und damit kostenlos im Web zu haben ist (siehe Weblinks).&lt;br /&gt;
&lt;br /&gt;
=== Einrichten ===&lt;br /&gt;
Nach erfolgreicher Installation sollte die IDE ohne Probleme starten. Neben der IDE muss auch noch [[WinAVR]] installiert sein.&amp;lt;br&amp;gt;&lt;br /&gt;
Um nun Dev-Cpp einzurichten geht man so vor.&amp;lt;br&amp;gt;&lt;br /&gt;
* Klicke auf ''Werkzeuge » Compiler Optionen''.&lt;br /&gt;
[[Bild:DevCpp_Werkzeuge.png|Dev-Cpp]]&lt;br /&gt;
&lt;br /&gt;
* Als nächstes ein neues Compiler Set anlegen. Gebt ihm einen beliebigen Namen wie z.B. avr-gcc. Ihr könnt ihn später auch noch umbenennen. Wenn man weitere Projekte anlegt, kann man dann einfach dieses Set auswählen.&lt;br /&gt;
[[Bild:DevCpp_Compiler_neu.png|Dev-Cpp]]&lt;br /&gt;
&lt;br /&gt;
* Dann im gleichen Fenster auf den Reiter ''Programme'' klicken und dort alles entsprechend dem Bild unten ändern (die Zeilen die geändert werden müssen sind blau hinterlegt). Dann den Dialog über ''OK'' schließen.&lt;br /&gt;
[[Bild:DevCpp_Compiler_avrgcc.png|Dev-Cpp]]&lt;br /&gt;
&lt;br /&gt;
* Zum Schluss musst Dev-Cpp noch so eingestellt werden, dass es euer Makefile (am besten mit MFile erzeugen) verwendet. Erstellt dazu erst ein neues Projekt über ''Datei » Neu » Projekt...''.&lt;br /&gt;
[[Bild:DevCpp_NeuesProjekt.png|Dev-Cpp]]&lt;br /&gt;
&lt;br /&gt;
* Klickt nun auf ''Projekt » Projekt Optionen'' und im Fenster dann auf den Reiter Make. Dort setzt ihr den Haken vor ''Nutze eigenes Makefile (kein Makefile generieren)'' und wählt dann euer Makefile aus indem ihr auf den Button rechts klickt. Hier ist eine kleine Tücke zu beachten. Damit Dev-Cpp das Makefile verwendet, muss dieses in dem gleichen Verzeichnis wie die Projektdatei liegen, sonst nimmt Dev-Cpp das Makefile nicht an!&lt;br /&gt;
[[Bild:DevCpp_Make.png|Dev-Cpp]]&lt;br /&gt;
&lt;br /&gt;
Das war es dann auch schon.&amp;lt;br&amp;gt;&lt;br /&gt;
Nun eine kleine Einführung in Dev-Cpp.&lt;br /&gt;
&lt;br /&gt;
=== Eine kleine Einführung ===&lt;br /&gt;
Möchte man mit Dev-Cpp arbeiten, so muss am zuerst einmal ein neues Projekt erstellen, indem man auf ''Datei » Neu » Projekt...'' klickt. Dort wählt man Projekttyp Console Application, wählt unten rechts die entsprechende Programmiersprache aus und gibt einen Projektnamen ein.&amp;lt;br&amp;gt;&lt;br /&gt;
Nun speichert man das Projekt und dann kann es auch schon fast losgehen. Als letzes muss das Projekt (wie oben beschrieben) noch kurz auf den avr-gcc und eigenes Makfile eingestellt werden. Siehe dazu die Beschreibung oben.&amp;lt;br&amp;gt;&lt;br /&gt;
Neue Dateien kann man dem Projekt über ''Projekt » Zum Projekt hinzufügen'' hinzufügen, oder über ''Projekt » Neue Datei'' überhaupt eine neue Datei erstellen.&amp;lt;br&amp;gt;&lt;br /&gt;
Links oben unter dem Reiter '''Projekt''' findet man alle Projekte. Unter dem Reiter '''Klassen''' findet man zum jeweiligen Projekt die Klassen und deren Methoden oder nur C-Funktionen.&amp;lt;br&amp;gt;&lt;br /&gt;
Außerdem findet man unter den Reitern am unteren Bildschirmrand wichtige Ausgaben.&lt;br /&gt;
&lt;br /&gt;
==== Codevervollständigung ====&lt;br /&gt;
Dev-Cpp bietet eine Codevervollständigung an. Wenn man immer die gleichen langen Funktionsnamen eingeben muss, ist diese ein großer Vorteil. Man gibt einfach ein paar Anfangsbuchstaben des Funktionsname ein und drückt dann Strg + Enter und schon popt ein Popup auf, in dem man zwischen den möglichen Funktionen wählen kann.&lt;br /&gt;
&lt;br /&gt;
==== Werzeuge ====&lt;br /&gt;
Unter Dev-Cpp ist es möglich ähnlich dem ProgrammersNotepad von [[WinAVR]] eigene Werkzeuge einzubinden (also z.B. Programme, die mit speziellen Parametern aufgerufen werden sollen).&amp;lt;br&amp;gt;&lt;br /&gt;
Unter ''Werkzeuge » Konfiguriere Werkzeuge'' kann man sich seine eigenen Werkzeuge kreieren und diese ändern. Diese kann man dann im Menü ''Werkzeuge'' aufrufen.&lt;br /&gt;
[[Bild:DevCpp_Eigene_Werkzeuge.png|Dev-Cpp]]&lt;br /&gt;
&lt;br /&gt;
==== Konfiguration ====&lt;br /&gt;
Dev-Cpp lässt sich in vielen Bereichen weit konfigurieren.&amp;lt;br&amp;gt;&lt;br /&gt;
Den '''Editor''' konfiguriert man unter ''Werkzeuge » Editor Optionen''. Dort kann man z.B. einstellen, dass Zeilennummern angezeigt werden werden und man kann das Tabverhalten bestimmen (beides auf jeden Fall zu empfehlen).&amp;lt;br&amp;gt;&lt;br /&gt;
Die '''IDE''' an sich konfiguriert man unter ''Werkzeuge » Umgebungs Optionen''. Dort kann man z.B. die Sprache oder das Aussehen der IDE bestimmen.&amp;lt;br&amp;gt;&lt;br /&gt;
Der '''Compiler''' wird unter ''Werkzeuge » Compiler Optionen'' konfiguriert.&lt;br /&gt;
&lt;br /&gt;
==== Wichtige Tastenkürzel ====&lt;br /&gt;
Die wichtigsten Tastenkürzel auf einen Blick. Man kann die Tastenkürzel (auch Shortcuts genannt) unter ''Werzeuge » Konfiguriere Shortcuts'' ändern. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Ausführen&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Datei&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Suchen/Ersetzen&lt;br /&gt;
|-&lt;br /&gt;
 |Kompilieren&lt;br /&gt;
 |Strg + F9&lt;br /&gt;
 |Neu&lt;br /&gt;
 |Strg + N&lt;br /&gt;
 |Suchen&lt;br /&gt;
 |Strg + F&lt;br /&gt;
 |-&lt;br /&gt;
 |Ausführen&lt;br /&gt;
 |Strg + F10&lt;br /&gt;
 |Speichern&lt;br /&gt;
 |Strg + S&lt;br /&gt;
 |Ersetzen&lt;br /&gt;
 |Strg + R&lt;br /&gt;
 |-&lt;br /&gt;
 |Alles erneuern&lt;br /&gt;
 |Strg + F11&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |Gehe zu Zeile&lt;br /&gt;
 |Strg + G&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |Gehe zu Funktion&lt;br /&gt;
 |Strg + Shift + G&lt;br /&gt;
 |}&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere wichtige Tastenkürzel sind:&amp;lt;br&amp;gt;&lt;br /&gt;
* '''Strg + Pos1'''/'''Strg + Ende''': An den Anfang bzw. das Ende der Datei springen.&lt;br /&gt;
* '''Strg + Pfeiltasten oben/unten''': Scrollen, Cursur bleibt in Zeile stehen.&lt;br /&gt;
* '''Shift + Pfeiltasten links/rechts''': Einzelne Zeichen selektieren.&lt;br /&gt;
* '''Shift + Pos1'''/'''Shift + Ende''': Ganze Zeile selektieren.&lt;br /&gt;
&lt;br /&gt;
== Bemerkung ==&lt;br /&gt;
Es soll hier auch Rande erwähnt sein, dass es auch andere C/C++ IDEs gibt – u.a. CDT in Verbindung mit Eclipse. Allerdings ist die Konfiguration dieser IDE viel aufwändiger und ich habe es noch nicht geschafft sie zum laufen zu bringen. Wer Lust hat und weiß wie man CDT richtig einrichtet, kann ja hier einen Artikel verfassen. Außerdem habe ich auch von CodeBlocks gehört. Man sieht es gibt IDEs wie Sand am Meer.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* http://www.bloodshed.net/&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[WinAVR]]&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Luma|Luma]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Dev-Cpp_IDE&amp;diff=7620</id>
		<title>Dev-Cpp IDE</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Dev-Cpp_IDE&amp;diff=7620"/>
				<updated>2006-05-31T01:01:43Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Irgendwann beginnt jeder der Mikrocontroller wie die AVRs in C/C++ programmiert sich Gedanken zu machen, ob es nicht eine komfortable IDE gibt, die das Programmers Notepad  von [[WinAVR]] ersetzt. Es gibt eine entsprechende IDE die unter der GPL steht und damit kostenlos ist: Dev-Cpp.&amp;lt;br&amp;gt;&lt;br /&gt;
Dieser kleine Artikel soll in kurzen Sätzen erläutern, wie man sich die IDE  so einrichtet, dass man wie gewohnt nur mit mehr Komfort arbeiten kann. Außerdem soll er auch eine kleine Einführung in Dev-Cpp sein.&lt;br /&gt;
&lt;br /&gt;
== Was ist eine IDE? ==&lt;br /&gt;
IDE steht für integrierte Entwicklungsumgebung. Sie fassen viele Programmierwerkzeuge zusammen (wie z.B. einen Compiler, einen komfortablen Texteditor, Versionsverwaltung, et cetera). Dadurch entfallen viele lästige Aufgaben, weil diese die IDE übernimmt.&lt;br /&gt;
&lt;br /&gt;
== Dev-Cpp ==&lt;br /&gt;
Dev-Cpp ist eine C/C++ Entwicklungsumgebung die unter der GPL steht und damit kostenlos im Web zu haben ist (siehe Weblinks).&lt;br /&gt;
&lt;br /&gt;
=== Einrichten ===&lt;br /&gt;
Nach erfolgreicher Installation sollte die IDE ohne Probleme starten. Neben der IDE muss auch noch [[WinAVR]] installiert sein.&amp;lt;br&amp;gt;&lt;br /&gt;
Um nun Dev-Cpp einzurichten geht man so vor.&amp;lt;br&amp;gt;&lt;br /&gt;
* Klicke auf ''Werkzeuge » Compiler Optionen''.&lt;br /&gt;
[[Bild:DevCpp_Werkzeuge.png|Dev-Cpp]]&lt;br /&gt;
&lt;br /&gt;
* Als nächstes ein neues Compiler Set anlegen. Gebt ihm einen beliebigen Namen wie z.B. avr-gcc. Ihr könnt ihn später auch noch umbenennen. Wenn man weitere Projekte anlegt, kann man dann einfach dieses Set auswählen.&lt;br /&gt;
[[Bild:DevCpp_Compiler_neu.png|Dev-Cpp]]&lt;br /&gt;
&lt;br /&gt;
* Dann im gleichen Fenster auf den Reiter ''Programme'' klicken und dort alles entsprechend dem Bild unten ändern (die Zeilen die geändert werden müssen sind blau hinterlegt). Dann den Dialog über ''OK'' schließen.&lt;br /&gt;
[[Bild:DevCpp_Compiler_avrgcc.png|Dev-Cpp]]&lt;br /&gt;
&lt;br /&gt;
* Zum Schluss musst Dev-Cpp noch so eingestellt werden, dass es euer Makefile (am besten mit MFile erzeugen) verwendet. Erstellt dazu erst ein neues Projekt über ''Datei » Neu » Projekt...''.&lt;br /&gt;
[[Bild:DevCpp_NeuesProjekt.png|Dev-Cpp]]&lt;br /&gt;
&lt;br /&gt;
* Klickt nun auf ''Projekt » Projekt Optionen'' und im Fenster dann auf den Reiter Make. Dort setzt ihr den Haken vor ''Nutze eigenes Makefile (kein Makefile generieren)'' und wählt dann euer Makefile aus indem ihr auf den Button rechts klickt. Hier ist eine kleine Tücke zu beachten. Damit Dev-Cpp das Makefile verwendet, muss dieses in dem gleichen Verzeichnis wie die Projektdatei liegen, sonst nimmt Dev-Cpp das Makefile nicht an!&lt;br /&gt;
[[Bild:DevCpp_Make.png|Dev-Cpp]]&lt;br /&gt;
&lt;br /&gt;
Das war es dann auch schon.&amp;lt;br&amp;gt;&lt;br /&gt;
Nun eine kleine Einführung in Dev-Cpp.&lt;br /&gt;
&lt;br /&gt;
=== Eine kleine Einführung ===&lt;br /&gt;
Möchte man mit Dev-Cpp arbeiten, so muss am zuerst einmal ein neues Projekt erstellen, indem man auf ''Datei » Neu » Projekt...'' klickt. Dort wählt man Projekttyp Console Application, wählt unten rechts die entsprechende Programmiersprache aus und gibt einen Projektnamen ein.&amp;lt;br&amp;gt;&lt;br /&gt;
Nun speichert man das Projekt und dann kann es auch schon fast losgehen. Als letzes muss das Projekt (wie oben beschrieben) noch kurz auf den avr-gcc und eigenes Makfile eingestellt werden. Siehe dazu die Beschreibung oben.&amp;lt;br&amp;gt;&lt;br /&gt;
Neue Dateien kann man dem Projekt über ''Projekt » Zum Projekt hinzufügen'' hinzufügen, oder über ''Projekt » Neue Datei'' überhaupt eine neue Datei erstellen.&amp;lt;br&amp;gt;&lt;br /&gt;
Links oben unter dem Reiter '''Projekt''' findet man alle Projekte. Unter dem Reiter '''Klassen''' findet man zum jeweiligen Projekt die Klassen und deren Methoden oder nur C-Funktionen.&amp;lt;br&amp;gt;&lt;br /&gt;
Außerdem findet man unter den Reitern am unteren Bildschirmrand wichtige Ausgaben.&lt;br /&gt;
&lt;br /&gt;
==== Codevervollständigung ====&lt;br /&gt;
Dev-Cpp bietet eine Codevervollständigung an. Wenn man immer die gleichen langen Funktionsnamen eingeben muss, ist diese ein großer Vorteil. Man gibt einfach ein paar Anfangsbuchstaben des Funktionsname ein und drückt dann Strg + Enter und schon popt ein Popup auf, in dem man zwischen den möglichen Funktionen wählen kann.&lt;br /&gt;
&lt;br /&gt;
==== Werzeuge ====&lt;br /&gt;
Unter Dev-Cpp ist es möglich ähnlich dem ProgrammersNotepad von [[WinAVR]] eigene Werkzeuge einzubinden (also z.B. Programme, die mit speziellen Parametern aufgerufen werden sollen).&amp;lt;br&amp;gt;&lt;br /&gt;
Unter ''Werkzeuge » Konfiguriere Werkzeuge'' kann man sich seine eigenen Werkzeuge kreieren und diese ändern. Diese kann man dann im Menü ''Werkzeuge'' aufrufen.&lt;br /&gt;
[[Bild:DevCpp_Eigene_Werkzeuge.png|Dev-Cpp]]&lt;br /&gt;
&lt;br /&gt;
==== Konfiguration ====&lt;br /&gt;
Dev-Cpp lässt sich in vielen Bereichen weit konfigurieren.&amp;lt;br&amp;gt;&lt;br /&gt;
Den '''Editor''' konfiguriert man unter ''Werkzeuge » Editor Optionen''. Dort kann man z.B. einstellen, dass Zeilennummern angezeigt werden werden und man kann das Tabverhalten bestimmen (beides auf jeden Fall zu empfehlen).&amp;lt;br&amp;gt;&lt;br /&gt;
Die '''IDE''' an sich konfiguriert man unter ''Werkzeuge » Umgebungs Optionen''. Dort kann man z.B. die Sprache oder das Aussehen der IDE bestimmen.&amp;lt;br&amp;gt;&lt;br /&gt;
Der '''Compiler''' wird unter ''Werkzeuge » Compiler Optionen'' konfiguriert.&lt;br /&gt;
&lt;br /&gt;
==== Wichtige Tastenkürzel ====&lt;br /&gt;
Die wichtigsten Tastenkürzel auf einen Blick. Man kann die Tastenkürzel (auch Shortcuts genannt) unter ''Werzeuge » Konfiguriere Shortcuts'' ändern. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Ausführen&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Datei&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Suchen/Ersetzen&lt;br /&gt;
|-&lt;br /&gt;
 |Kompilieren&lt;br /&gt;
 |Strg + F9&lt;br /&gt;
 |Neu&lt;br /&gt;
 |Strg + N&lt;br /&gt;
 |Suchen&lt;br /&gt;
 |Strg + F&lt;br /&gt;
 |-&lt;br /&gt;
 |Ausführen&lt;br /&gt;
 |Strg + F10&lt;br /&gt;
 |Speichern&lt;br /&gt;
 |Strg + S&lt;br /&gt;
 |Ersetzen&lt;br /&gt;
 |Strg + R&lt;br /&gt;
 |-&lt;br /&gt;
 |Alles erneuern&lt;br /&gt;
 |Strg + F11&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |Gehe zu Zeile&lt;br /&gt;
 |Strg + G&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |Gehe zu Funktion&lt;br /&gt;
 |Strg + Shift + G&lt;br /&gt;
 |}&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere wichtige Tastenkürzel sind:&amp;lt;br&amp;gt;&lt;br /&gt;
* '''Strg + Pos1'''/'''Strg + Ende''': An den Anfang bzw. das Ende der Datei springen.&lt;br /&gt;
* '''Strg + Pfeiltasten oben/unten''': Scrollen, Cursur bleibt in Zeile stehen.&lt;br /&gt;
* '''Shift + Pfeiltasten links/rechts''': Einzelne Zeichen selektieren.&lt;br /&gt;
* '''Shift + Pos1'''/'''Shift + Ende''': Ganze Zeile selektieren.&lt;br /&gt;
&lt;br /&gt;
== Bemerkung ==&lt;br /&gt;
Es soll hier auch Rande erwähnt sein, dass es auch andere C/C++ IDEs gibt – u.a. CDT in Verbindung mit Eclipse. Allerdings ist die Konfiguration dieser IDE viel aufwändiger und ich habe es noch nicht geschafft sie zum laufen zu bringen. Wer Lust hat und weiß wie man CDT richtig einrichtet, kann ja hier einen Artikel verfassen. Außerdem habe ich auch von CodeBlocks gehört. Man sieht es gibt IDEs wie Sand am Meer.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [[http://www.bloodshed.net/]]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[WinAVR]]&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Luma|Luma]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:DevCpp_Werkzeuge.png&amp;diff=7619</id>
		<title>Datei:DevCpp Werkzeuge.png</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:DevCpp_Werkzeuge.png&amp;diff=7619"/>
				<updated>2006-05-31T00:59:33Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:DevCpp_NeuesProjekt.png&amp;diff=7618</id>
		<title>Datei:DevCpp NeuesProjekt.png</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:DevCpp_NeuesProjekt.png&amp;diff=7618"/>
				<updated>2006-05-31T00:59:25Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:DevCpp_Make.png&amp;diff=7617</id>
		<title>Datei:DevCpp Make.png</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:DevCpp_Make.png&amp;diff=7617"/>
				<updated>2006-05-31T00:59:17Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:DevCpp_Eigene_Werkzeuge.png&amp;diff=7616</id>
		<title>Datei:DevCpp Eigene Werkzeuge.png</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:DevCpp_Eigene_Werkzeuge.png&amp;diff=7616"/>
				<updated>2006-05-31T00:59:08Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:DevCpp_Compiler_neu.png&amp;diff=7615</id>
		<title>Datei:DevCpp Compiler neu.png</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:DevCpp_Compiler_neu.png&amp;diff=7615"/>
				<updated>2006-05-31T00:59:00Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:DevCpp_Compiler_avrgcc.png&amp;diff=7614</id>
		<title>Datei:DevCpp Compiler avrgcc.png</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:DevCpp_Compiler_avrgcc.png&amp;diff=7614"/>
				<updated>2006-05-31T00:58:47Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Asuro&amp;diff=7457</id>
		<title>Asuro</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Asuro&amp;diff=7457"/>
				<updated>2006-05-24T12:24:42Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: Weblinks erweitert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:asuro.jpeg|thumb|Der Bausatz]]ASURO ist ein am Deutschen Zentrum für Luft- und Raumfahrt entwickelter Bausatz (Löten erforderlich) für einen autonomen, multisensoriellen Roboter. Der Roboter eignet sich insbesondere für den Einstieg in die Materie der Robotik. &lt;br /&gt;
Neben sechs Kollisionstastern und einer optischen Einheit zur Verfolgung einer Linie verfügt ASURO über zwei Odometer und einige Anzeigeelemente. Die mitgelieferte Duplex-Infrarotschnittstelle erlaubt die drahtlose Programmierung wie auch eine Fernsteuerung mit dem PC. Das &amp;quot;Gehirn&amp;quot; des Roboters ist ein RISC-Prozessor, der auch das Abarbeiten komplexer Programme ermöglicht. Die Programmierung erfolgt laut Doku nur in C, wobei auf vordefinierte Funktionen zur Ansteuerung der beiden Motoren, der Sensoren und Anzeigen zurückgegriffen werden kann. Etwas erfahrenere Mikrocontroller Kenner können den Roboter natürlich auch mit Sprachen wie [[Bascom]] Basic oder Assembler programmieren.&lt;br /&gt;
&lt;br /&gt;
Eine ausführliche Anleitung erklärt neben dem Zusammenbau und der Installation der Software auch schrittweise ASUROs Programmierung anhand zahlreicher Beispiele. ASURO eignet sich für Hobbybastler, Schüler- und Studentenprojekte, Lehrwerkstätten, Fortbildungen im Bereich Elektrotechnik und Mechatronik, sowie Volkshochschulkurs. &lt;br /&gt;
&lt;br /&gt;
==Technische Daten==&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|Microcontroller:&lt;br /&gt;
|AVR [[ATMega8]]&lt;br /&gt;
|-&lt;br /&gt;
|Speicher:&lt;br /&gt;
|8 kB Flash-Speicher, davon 1 kB bereits vom Bootloader belegt &lt;br /&gt;
|-&lt;br /&gt;
|Programmierung:&lt;br /&gt;
|Über AVR Bootloader, belegt ca. 1K Speicher&lt;br /&gt;
|-&lt;br /&gt;
|Vorhandene Sensoren:&lt;br /&gt;
|2 Lichtsensoren zur Linienverfolgung &lt;br /&gt;
&lt;br /&gt;
6 Tastsensoren (einfache Microtaster)&lt;br /&gt;
&lt;br /&gt;
2 Lichtschranken für die Odometrie &lt;br /&gt;
|-&lt;br /&gt;
|Abessungen:&lt;br /&gt;
|(L x B x H) 117 x 122 x 45 mm&lt;br /&gt;
|-&lt;br /&gt;
|Ausführung:&lt;br /&gt;
|Bausatz&lt;br /&gt;
|-&lt;br /&gt;
|Stromversorgung:&lt;br /&gt;
|4 AAA Micro-Batterien oder Akkus&lt;br /&gt;
|-&lt;br /&gt;
|Gewicht:&lt;br /&gt;
|ca. 165 g (inkl. Akkus oder Batterien)&lt;br /&gt;
|-&lt;br /&gt;
|Hersteller:&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Einzelteile des Bausatzes==&lt;br /&gt;
&lt;br /&gt;
[[Bild:asuro1.jpeg||center|framed|Der Bausatz]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Mögliche Aufgaben für Asuro==&lt;br /&gt;
* Einer Linie folgen, siehe [[Roboterwettbewerbe]]&lt;br /&gt;
* Hindernissen ausweichen &lt;br /&gt;
* Figuren fahren und auch mit Stift zeichen&lt;br /&gt;
* Balancieren&lt;br /&gt;
* Geschwindigkeitsregelungen, siehe [[Regelungstechnik]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Avr]]&lt;br /&gt;
* [[ATMega8]]&lt;br /&gt;
* [[Bascom]]&lt;br /&gt;
* [[GCC]]&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
* [http://www.arexx.com/ AREXX Homepage mit Programmen und Bauanleitung zum Ultraschallbausatz]&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/viewforum.php?f=44 Roboternetz ASURO Forum mit vielen Beispielprogrammen]&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/viewtopic.php?t=15307 Asuro lernt balancieren]&lt;br /&gt;
* [http://sourceforge.net/project/showfiles.php?group_id=155217 ASURO Libraries und Demoprogramme]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Buchvorstellungen&amp;diff=7240</id>
		<title>Buchvorstellungen</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Buchvorstellungen&amp;diff=7240"/>
				<updated>2006-05-06T16:29:08Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: Überschrift Elektronikbücher hinzugefügt, Buchbeschreibung über &amp;quot;Elektronik-Fibel&amp;quot; hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;http://www.roboternetz.de/wiki/uploads/Main/buchvorstellungen.jpg&lt;br /&gt;
&lt;br /&gt;
==Robotik-Bücher==&lt;br /&gt;
===Grundlagen der Robotertechnik, Autor Heinz W. Katzenmeier===&lt;br /&gt;
&lt;br /&gt;
Ein wirklich gutes Buch für echte Bastler. Am meisten werden sicherlich Roboter-Einsteiger von dem Buch profitieren, zumal auch Grundlagen wie Materialkunde, Bauformen, Einheiten-Tabellen und ein wenig Elektronik-Grundlagen angesprochen werden. Aber auch erfahrene Bastler werden eine ganze Menge Anregungen und Tipps in dem Buch finden. &lt;br /&gt;
&lt;br /&gt;
Der Themenschwerpunkt des Buches liegt eindeutig im Bereich Mechanik und Konstruktion. Hier findet man praktische Tips, z.B. wie man aus Silikonkitt Silikonringe für den Antrieb bastelt. Wer kommt schon auf die Idee, Silikon auf einer Wasseroberfläche aufzutragen, um Silikonringe herzustellen? &lt;br /&gt;
&lt;br /&gt;
Auch seltsame Roboter-Konstrukte, in Ball- oder Walzenform, werden beschrieben. Natürlich fehlen auch nicht die Krappelkonstrukte mit mehreren Beinen und die herkömmlichen 3 Rad-Roboter. &lt;br /&gt;
Viele Roboterkonstruktionen kommen ganz ohne Elektronik aus, können jedoch trotzdem Hindernissen ausweichen. Dazu hat der Autor die seltsamsten Konstrukte und Mechaniken entworfen. Die Fotos sind leider alle in Schwarz/Weiss, ein bisschen mehr Farbe wäre wünschenswert. Aber die große Anzahl an verständlichen Zeichnungen machen während des Lesens die fehlenden Farb-Fotos wieder Wett.&lt;br /&gt;
&lt;br /&gt;
Der Autor geht bei seinen Konstruktionen recht einfache und leicht nachzubauende Wege, was insbesondere Mechanik-Neulinge erfreuen dürfte. So wird z.B. bei einem Getriebe der Motor einfach mit Heißkleber an einer Achse befestigt. Oder ein bisschen Papier zwischen den Zahnrädern sorgt dafür, dass diese nicht zu straff ineinander greifen. ''Also jede Menge praktischer Tips.'' &lt;br /&gt;
&lt;br /&gt;
Einziger Mangel ist das Thema Elektronik. Außer einer Transistor-, Relais- oder Spannungsregler-Schaltung findet man kaum was in dem Buch. Ganz zu schweigen von Microcontrollern, diese wurde im Buch ganz ausgeklammert. &lt;br /&gt;
&lt;br /&gt;
Dennoch finde ich das Buch sehr lesenswert. Denn gerade Elektronik versierten Bastlern fehlen manchmal ein wenig Kenntnisse und Ideen zur Mechanik. Das Buch fördert einfach das Verständnis für die mechanischen Grundlagen. Es stellt einfache und funktionierende Systeme vor, welche die eigene Fantasie anregen und durch ein schnell eintretendes Erfolgserlebnis zu weiteren kreativen Versuchen inspirieren. Insbesondere in Verbindung mit einem Mikrocontroller können daraus interessante Sachen entstehen. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
http://images-eu.amazon.com/images/P/3895761478.03.MZZZZZZZ.jpg&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Autor: Heinz W. Katzenmeier &lt;br /&gt;
 231 Seiten &lt;br /&gt;
 Format 17 x 23,5 cm (kartoniert) &lt;br /&gt;
 € 34,80 (D) / € 35,80 (A) / sFr 59,90 &lt;br /&gt;
 ISBN 3-89576-147-8 &lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Frank|Frank]] 18:04, 16. Nov 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===Robotergreifer, Autoren S. Hesse, G.J. Monkman, R. Steinmann, H. Schunk===&lt;br /&gt;
&lt;br /&gt;
Mit dem Greifer wird die Verbindung zwischen einem Objekt und der Maschine hergestellt. Greifertechnik gehört daher zum Kernwissen in der Handhabungs- und Robotertechnik. Dieses Buch macht den Leser mit den Grundlagen dieser Technik vertraut.Da viele Bücher zur Robotertechnik nur sehr begrenzte Aussagen zum Greifer machen, wird in diesem Werk erstmals eine umfassende Darstellung mit dem Charakter eines Nachschlagewerkes geboten. Das Buch enthält etwa 500 Strichzeichnungen zur Greifertechnik und -anwendung. Dabei legen die Autoren Wert auf eine möglichst vollständige Abhandlung aller wichtigen Aspekte: Prinzipien, Bauformen, Kinematik, Steuerung, Sensorik, Wechselvorrichtungen, Sicherheit und Anwendungen. &lt;br /&gt;
&lt;br /&gt;
Dieses Buch richtet sich nicht unbedingt an den Modellbauer oder Bastler erster kleiner autonomer Roboter, das merkt man schon ein wenig am Verkaufspreis. Wer sich aber eingehender auch mit Industrierobotern oder den mechanischen Grundkonzepten einer &amp;quot;Roboterhand&amp;quot; auseinander setzen will oder muss, der findet in diesem Buch wirklich reichlich an Informationen. Vorbildlich ist wirklich die didaktische Aufbereitung des Werkes. Leicht verständliche Skizzen und Diagramme, fast auf jeder Seite, erleichtern einen den tiefen Einblick in diese doch ungeahnt vielseitige Matererie.&lt;br /&gt;
&lt;br /&gt;
Beschrieben werden unter anderem die verschiedenen Greiferklassen, Bauformen, ein geschichtlicher Rückblick in Sachen Greifer, Greifersenorik, Handachsen und Kinematik und praktisch angewahnte Greiferanwendungen.&lt;br /&gt;
&lt;br /&gt;
Über den Autor&lt;br /&gt;
Dr.-Ing. habil. Stefan Hesse ist Konstrukteur, hält Vorlesungen am FH Technikum Wien und ist seit vielen Jahren als Herausgeber, Autor bzw. Coautor selbstständig tätig.Prof. Gareth Monkman ist als Hochschullehrer an der FH Regensburg im Studiengang Elektrotechnik/ Mechatronik tätig und durch viele Fachaufsätze und Vorträge international bekannt.Ralf Steinmann ist Leiter Vertrieb und Marketing Automation bei der SCHUNK GmbH &amp;amp; Co. KG, Obersulm.Dipl.-Wirtsch.-Ing. Henrik Schunk ist Geschäftsführer der SCHUNK Intec Inc., Raleigh-Morrisville (USA). &lt;br /&gt;
&lt;br /&gt;
 Erschienen im Hanser Verlag Januar 2005&lt;br /&gt;
 ISBN 3-446-22920-5&lt;br /&gt;
 Bezug. z.B. Amazon&lt;br /&gt;
 79 Euro&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
http://images-eu.amazon.com/images/P/3446229205.03._BO01,224,223,220_PIsitb-dp-arrow,TopRight,22,-21_SH30_SCMZZZZZZZ_.jpg&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
===Embedded Robotics von Tilo Gockel, Rüdiger Dillmann===&lt;br /&gt;
&lt;br /&gt;
'''Klappentext (Buchrückseite)'''&lt;br /&gt;
Das Thema Robotik ist so aktuell wie niemals zuvor, das zeigen nicht nur modernste Industrieanwendungen, das zeigt auch die zunehmende Anzahl von Lehrveranstaltungen an Schulen und Hochschulen, von Forschungsprogrammen und Interessengemeinschaften. &lt;br /&gt;
&lt;br /&gt;
Leider wird der Zugang zu diesem Forschungsbereich nicht immer leicht gemacht. Wie kann man auch einfach und einprägsam solch komplexe Inhalte wie Drehzahlregelung, Lageregelung, Bahnplanung, Aktuatorik und Sensorik, Kognition im Allgemeinen und Bildverarbeitung im Besonderen vermitteln? Zusammen mit den Grundlagen zur zugehörigen Hardware und Programmierung? Und dies noch auf einem bezahlbaren und reproduzierbaren, transparenten Basissystem? Mit kostenfrei zugänglichen Software-Entwicklungswerkzeugen? &lt;br /&gt;
&lt;br /&gt;
Dass es möglich ist, zeigt vorliegendes Buch. &lt;br /&gt;
&lt;br /&gt;
Die Autorenschaft setzt sich zusammen aus Mitarbeitern des Institutes für Technische Informatik von Herrn Prof. Dr.-Ing. Rüdiger Dillmann (ITEC, Universität Karlsruhe (TH)), die in zahlreichen Forschungs- und Industrieprojekten umfangreiche Erfahrungen im Bereich Robotik sammeln konnten und auch in der Lehre über die Jahre hinweg gelernt haben, dieses Wissen weiterzugeben. &lt;br /&gt;
&lt;br /&gt;
Entstanden ist ein Buch, welches sowohl den interessierten Laien als auch den Fachmann anspricht. Die verwendete Mikrocontroller- und Mechanikplattform ermöglicht einen schnellen, robusten und kostengünstigen Aufbau der Experimente. Die zu Grunde liegende Methodik wird auf eine Art und Weise vermittelt, die eine Portierung auf komplexere Systeme einfach macht. &lt;br /&gt;
&lt;br /&gt;
Aus dem Inhalt: Im vorliegenden Buch behandelt werden u.a. Grundlagen zu Mikrocontrollern (Entwicklungs-Toolchain, serielle Kommunikation usw.), Aktuatoren, Sensoren (LDRs, PSDs, optische Maus, Digitalkamera ...), Drehzahl- und Lageregelung, Bahnplanung, reflexbasiertes Verhalten, Subsumptionsnetzwerke, Bildverarbeitung und Realtime-Multitasking. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
'''Persönliche Meinung nach dem Lesen:''' &lt;br /&gt;
Nach Lesen des Klappentextes hatte ich den Eindruck ein ideales Buch auch  für Robotik-Bastler zu bekommen. Leider wird das Buch für diesen Bereich nur  zum Teil gerecht. Sehr gut gelungen sind die komplexeren Aufgabenstellungen, hier  zeigt sich das fundiertes Wissen der Autoren (Gockel/Dillmann). &lt;br /&gt;
Besonders gefallen haben mir die Bereiche wie Regelungstechnik,  Drehzahlregelung,  Servo-Ansteuerung,  Bildverarbeitung,  Schnittstellenbeschreibung und einige mehr. Jedoch den Untertitel Praxisbuch wird es nur gerecht, wenn man ein spezielles Board von  Elektor mit einem 8051 Controller nutzt. Alle Beispiele beziehen sich auf  dieses Board bzw. Controller. Leider wird dieser Controllertyp im Hobbybereich  nicht  mehr so häufig verwendet, wodurch viele Informationen im Buches, wie  Controllerbeschreibung,  Compilerbeschreibung, Beispiele, Libarys etc. nur für Besitzer dieses Controllertyps von Intresse sein dürften. Auch der Bereich  Mechanik wird praktisch kaum in dem Buch angesprochen. Sehr hilfreich  sind zum Teil die Links die in einzelnen Kapiteln zu finden sind, allerdings  hat man hier den Eindruck das das Linkarchiv zum Teil etwas älter ist.&lt;br /&gt;
'''Fazit:''' Ein ideales Buch für Besitzer eines 8051 Controllers und ein hilfreiches  Buch für fortgeschrittenere Bastler die sich intensiverer mit einzelnen  Thematiken wie Drehzahlregelung, Bildverarbeitung und anderen Schwerpunkten  beschäftigen. Weniger hilfreich ist es für Einsteiger die mit anderem Controller  arbeiten erste Experimente machen oder in Basic programmieren wollen.&lt;br /&gt;
--[[Benutzer:Frank|Frank]] 18:07, 16. Nov 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Erschienen Elektor-Verlag &lt;br /&gt;
 Erscheinungsdatum: 2005&lt;br /&gt;
 ISBN 3895761559&lt;br /&gt;
 Bezug. z.B. Amazon&lt;br /&gt;
 39,80 Euro&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
http://images-eu.amazon.com/images/P/3895761559.01.MZZZZZZZ.jpg&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===Roboter Geschichte-Technik-Entwicklung, von Daniel Ichbiah===&lt;br /&gt;
'''Klappentext:''' Diener der Menschen&lt;br /&gt;
&lt;br /&gt;
Die 1980er waren das Jahrzehnt des Computers, die 1990er das des Internets, die erste Dekade des 21. Jahrhunderts wird die der Roboter sein. In den USA, Japan und Europa kommt die Entwicklung von Robotern für alle Lebensbereiche immer mehr in Schwung. Den Weg dazu bahnten Science-Fiction-Schriftsteller, Filmemacher und Erfinder von Video-Spielen. Innerhalb der privaten Haushalte - angefangen von Kinderspielzeugen bis hin zu Staubsaugern, die selbständig ihre Arbeit verrichten - haben sich Roboter sanft, aber nachhaltig durchgesetzt. In der Medizintechnik sind sie nicht mehr wegzudenken, wenn es darum geht, Mikro-Operationen durchzuführen. Und auf dem Mars sind es selbstverständlich Roboter, die Missionen ausführen, die für ihre menschlichen Erfinder unmöglich wären.&lt;br /&gt;
 &lt;br /&gt;
Dieses reich illustrierte Buch spannt den Bogen von der verborgenen Mechanik in altägyptischen Götterstatuen über die Automaten und Androiden in Literatur und Film bis hin zu den Robotern in Industrie und Forschung. Der Fachjournalist und Roboterexperte Daniel Ichbiah erzählt in vielen Beispielen von Geschichte, Technik und Einsatz dieser faszinierenden Kreationen, die vom uralten Wunsch des Menschen zeugen, sich das Leben zu erleichtern.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 Erschienen Knesebeck Verlag&lt;br /&gt;
 Flexicover, 19 x 23 cm, 544 Seiten&lt;br /&gt;
 Mit über 1.400 farbigen Abbildungen&lt;br /&gt;
 Preis 35,00 € &lt;br /&gt;
 ISBN 3896602764&lt;br /&gt;
 Erscheinungstermin April 2005&lt;br /&gt;
 Bezug u.a. Amazon &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
http://images-eu.amazon.com/images/P/3896602764.03.MZZZZZZZ.jpg&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:rnbuchvorstellungroboter.jpeg|thumb|600px|center|Einige EInblicke in das Buch]]&lt;br /&gt;
&lt;br /&gt;
'''Persönliche Meinung zum Buch:''' Kein Buch das Robotikbastlern Fachwissen vermittelt, sondern vielmehr ein Buch das sich einfach an interessierte Leser (auch Techniklaien) wendet. Eigentlich eine Art illustriertes Bilderbuch zum Thema Entwicklungen der Robotik. Beim ersten Blick erinnert das dreispaltige Layout mit den vielen Bildern ein wenig an ein gutes Lexikon. Zwar ist es kein Nachschlagewerk, aber auch nicht gerade ein Buch das man von vorne bis hinten Seite für Seite durchliest, dafür sind die Themenbereiche dann doch zu unterschiedlich. Es werden Entwicklungen bei den Spiel-, Staubsauger-, Haushalts-, Medizin-, Raumfahrt-,  Meeresrobotern usw.  aufgezeigt. Es wird über Roboter in Literatur-, Film- und Spielen berichtet, halt über alles was man mit dem Begriff Roboter verbinden kann oder über was schon mal in den Medien berichtet wurde.  Dabei beeindrucken vorwiegend die großen seitenfüllenden Bilder die in bester Qualität abgedruckt wurden. Wer den Bereich der Robotik schon ein wenig verfolgt hat, wird leider sehr viele Bilder und Themenbereiche schon von zahlreichen Presseveröffentlichungen kennen. Kurze Texte und Interviews zwischen den Bildern vermitteln den derzeitigen Stand und die Zukunftsperspektiven des jeweiligen Bereiches aus Sicht von Wissenschaftlern oder Unternehmen. &lt;br /&gt;
Alles in allem ein Buch das technisch begeisterte Leser gedacht ist, die einfach einen Rundumblick für den Bereich ROBOTIK in einem Buch gebündelt im Regal stehen haben wollen. Bastler und Modellbauer die vielleicht tiefergehende Tips, Technikgrundlagen und anwendbares Wissen für ihr Hobby erwarten werden hier sicher nicht fündig. Bestenfalls kann das ein oder andere Bild Anregungen liefern mit welchen Themen man sich etwas mehr beschäftigen könnte. Aber das war ja auch nicht das Ziel des Buches.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Frank|Frank]] 23:35, 30. Nov 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==Mikrocontroller-Bücher==&lt;br /&gt;
===Programmieren der AVR RISC Mikrocontroller mit BASCOM-AVR, Autor Claus Kühnel===&lt;br /&gt;
Das beliebte AVR Bascom-Buch von Claus Kühnel ist nun in einer völlig überarbeiteten und erweiterten Auflage erschienen. Ganze 376 Seiten umfasst dieses wirklich umfangreiche Werk. &lt;br /&gt;
Das Buch wurde nun auch um die neueren AVR –Typen AVR-Tiny und AVR-Mega erweitert. Also es wird nicht nur die Entwicklungsumgebung des Bascom Basic Compilers erläutert, sondern auch die Möglichkeiten der einzelen AVR-Controller. Dazu findet man zahlreiche Beispiele und ganz Applikationen im Buch. Angesprochen werden die Installation der IDE, der eingebauten Simulator, eingebaute Entwicklungstools wie LCD-Designer, Terminal-Emulator, Libary Manager als auch einige AVR-Starterkits. Bei den Starterkits ist das noch recht neue rn-Control leider noch nicht dabei, dennoch lassen sich die meisten Dinge auch auf rn-control übertragen und dort nachvollziehen.&lt;br /&gt;
 &lt;br /&gt;
Im Buch werden auch wichtige Schnittstellen wie SPI, USART, SPI (Hard- und Software), I2C-Bus (Hard- und Software), 1-Wire-Bus uvm. Erläutert. Auch dazu findet man Programme die einem beim Umsetzen in die Praxis helfen. Aber auch der Anschluss und die Programmierung externer Hardware Motoren, DOT-Matrix Anzeigen, LED´s, Matrix-Tastaturen , PC-AT-Tastaturen werden erläutert. &lt;br /&gt;
&lt;br /&gt;
Ein wirklich sehr gelungenes Buch! &lt;br /&gt;
&lt;br /&gt;
[[Bild:Buch_kuehnelbascom.png|center]]&lt;br /&gt;
&lt;br /&gt;
Auch wenn einige Kapitel des Buches nicht unbedingt für Anfänger geeignet sind, so bleiben wegen des Umfangs immer noch genügend interessante Seite übrig. Mein bisheriges Lieblingsbuch!&lt;br /&gt;
--[[Benutzer:Frank|Frank]] 18:18, 16. Nov 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
 Autor: Claus Kühnel &lt;br /&gt;
 376 Seiten &lt;br /&gt;
 ISBN 3-907857-04-68 &lt;br /&gt;
 Preis EUR 34,95 &lt;br /&gt;
 Bezugsquelle. u.A. Amazon,robotikhardware.de&lt;br /&gt;
&lt;br /&gt;
===AVR-Mikrocontroller Lehrbuch, Autor Roland Walter===&lt;br /&gt;
&lt;br /&gt;
Warum schwer, wenn es auch einfach geht? - Das Buch führt leicht verständlich in die Welt der AVR-Mikrocontroller ein. Systematisch, Schritt für Schritt, mit der Hochsprache Basic und vielen gut kommentierten Beispiel-Listings. Was auch erwähnt werden muß: Der Stoff ist dicht und das Buch verzichtet auf &amp;quot;Seitenschinderei&amp;quot;. &lt;br /&gt;
Als Programmiersprache wird der sehr effiziente Bascom-AVR-Basic-Compiler verwendet, der auch in einer kostenlosen Version erhältlich ist. Es wurde darauf geachtet, daß die Beispiel-Listings auch für C-Programmierer leicht verständlich sind. Darüber hinaus ist im Buch eine kurze Einführung zu C (AVR-GCC) von Wolfgang Neudert enthalten. &lt;br /&gt;
Als Grundlage dient der AVR-Typ ATmega8. Dieser preiswerte AVR ist durch seine umfangreiche Ausstattung gut geeignet, um als Beispiel für die gesamte AVR-Serie dienen zu können. Am Ende soll der Leser in der Lage sein, sich andere AVR-Typen selbst erschließen zu können. &lt;br /&gt;
Für die AVR-Experimente wurde ein einfaches und übersichtliches Experimentierboard entworfen und es werden verschiedene Fertig- und Selbstbau-Programmieradapter vorgestellt. Das Experimentierboard kann als Bauteilesatz mit Platine fertig gekauft oder selbst aufgebaut werden. &lt;br /&gt;
Das Buch hat 224 Seiten, drurchgängig Farbdruck. Zum Buch gehört eine CD-ROM mit der nötigen Software, den Beispielprogrammen und den Datenblättern. &lt;br /&gt;
&lt;br /&gt;
Bestellung: Das Buch kann über die Webseite www.rowalt.de oder www.robotikhardware.de bestellt werden sowie über ausgewählte Elektronik-Händler. Bestellungen über den normalen Buchhandel sind bislang nicht möglich sein. &lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Frank|Frank]] 18:20, 16. Nov 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
http://www.rowalt.de/mc/avr/avrbuch/coverb.png&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===AVR-RISC Mikrocontroller, Autor Wolfgang Trampert===&lt;br /&gt;
&lt;br /&gt;
Der Leser soll durch dieses Buch in die Lage versetzt werden eigene Schaltungen mit diesen in fortschrittlicher RISC-Architektur entwickelten AVR-Controllern zu entwerfen, aufzubauen und zu testen.&lt;br /&gt;
Ein Programmiergerät für den Download selbst erstellter Programme in das Flash-EPROM des Controllers wird ebenso vorgestellt wie eine Vielzahl von Anwendungsbeispielen für diese AVR Controllergeneration. Auf der dem Buch beiliegenden CD-ROM werden neben einem voll funktionsfähigen Assembler und einem Simulator für den Test eigener Programme alle Quell-Codes der vorgestellten Anwendungsbeispiele mitgeliefert und können vom Leser unmittelbar in eigene Projekte übernommen werden. Das Buch wendet sich an Entwickler, Ingenieure, Auszubildende, Studenten und Dozenten sowie an engagierte Hobbyelektroniker kurz gesagt an alle, die diese neue Generation von Single-Chip-Controllern kennen und verstehen lernen wollen&lt;br /&gt;
&lt;br /&gt;
Aus dem Inhalt: CPU; Zeitgeber, Zähler; Watchdog Timer; Asynchrone Datenübertragung über die Ein-/Ausgabe-Ports; Befehlsvorrat; Das AVR-Studio; AVR-Controller; AVR-Applikation; C-Datenblätter Angaben zum CD-Inhalt: Vollversion des AVR-Assemblers, Vollversion des AVR- Studios, Der Sourcecode aller Programme, Datenblätter aller AVR-Controller, AVR- Applikationen, C-Datenblätter &lt;br /&gt;
&lt;br /&gt;
Das Buch eignet sich sehr gut auch als Nachschlagewerk und zur Vertiefung  bestimmter Techniken. So wird beispielsweise der I2C-Bus in kaum einem anderen Buch so ausführlich, genau und verständlich erläutert wie in diesem Buch.  Da sich ein Großteil der Seiten sehr ausfühlich das  AVR Assembler Entwicklungssystem sowie die einzelnen Assemblerbefehlen befasst, dürfte das Buch für für Assembler-Einsteiger von besonderem Nutzen sein.&lt;br /&gt;
&lt;br /&gt;
Ein Manko des Buches ist, das die neue AVR MEGA-Controllerserie (z.B auch der Mega32 von rn-control) noch nicht konkret im Buch angesprochen wird. Konkret werden vorwiegend kleinere AVR Controller behandelt, welche heute eigentlich nur noch in geringer Zahl zum Einsatz kommen dürften, zumindest bei Hobby-Bastlern. Auch die oft eingesetzten Entwicklungssysteme GCC C-Compiler und Bascom-Basic werden leider noch nicht in dem Buch angesprochen. Dennoch ist das Buch wegen verschiedener Hardware-Grundlagen als Nachschlagewerk unbedingt empfehlenswert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
http://images-eu.amazon.com/images/P/3772354769.03.MZZZZZZZ.jpg&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Gebundene Ausgabe 462 Seiten&lt;br /&gt;
 Franzis Verlag&lt;br /&gt;
 ISBN 3772354769&lt;br /&gt;
 Bezug: Buchhandel / Amazon.de&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===BASCOM-AVR – Sprachbefehle, Autor Mario Meissner===&lt;br /&gt;
Dieses Buch stammt vom Autor Mario Meissner welcher bereits ein anderes Bascom-Buch geschrieben hat. In diesem Werk beschäftigt er sich ausschließlich mit der Beschreibung aller Bascom Basic Befehle. Damit ergänzt das Buch hervorragend alle bisher erschienen Bascom-Bücher, welche vorwiegend ausgewählte Möglichkeiten der Controller und bestimmte Aspekte der Programmiersprache behandelten. &lt;br /&gt;
Das auch eine umfassende Befehlsbeschreibung noch notwendig war, zeigt schon der enorme Umfang des Buches. Es ist ein Wälzer von über 530 Seiten entstanden!!! Allein das zeigt welche Möglichkeiten in dieser zum Teil noch unterschätzen Programmiersprache stecken. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
http://www.shop.robotikhardware.de/shop/catalog/images/imagecache/meisbuch3.jpeg&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das neue Buch umfasst im wesentlich den kompletten Inhalt der hervorragenden englischsprachigen Dokumentation, welche sonst nur als Help-File mitgeliefert wird. Das ganze ist auch ähnlich übersichtlich gegliedert: &lt;br /&gt;
&lt;br /&gt;
* Befehl&lt;br /&gt;
* Parameter&lt;br /&gt;
* Erläuterung&lt;br /&gt;
* Verzweigungen zu ähnlichen Befehlen&lt;br /&gt;
* Democode&lt;br /&gt;
&lt;br /&gt;
Auch wenn große Teile des Buches sehr ähnlich dem englischen Help-File sind, so bietet das Buch selbst für Leser mit guten englisch Kenntnissen eine echte Hilfe. Denn wer liest schon eine Help-Datei so gigantischen Ausmaßes wirklich seitenweise durch?  Dies führt dazu das man über die Existenz vieler Befehle einfach gar nicht informiert ist.&lt;br /&gt;
Ein gedrucktes Buch dagegen ermuntert doch immer ein wenig zum blättern. Ich bin sicher das der Leser noch zahlreiche Befehle findet die er schon längst hätte brauchen können, aber von deren Existenz er einfach nichts wusste. Auch mir ist es so gegangen, obwohl ich schon einige Bücher zu Bascom gelesen habe und auch recht oft die Help-Datei zu rate ziehe.&lt;br /&gt;
Besonders angenehm ist, das auch die Kommentarzeilen innerhalb der zahlreichen Beispiele nicht in englisch sondern in deutsch gehalten sind. Zudem sind auch neuste Bascom Zusatz-Libarys bereits in dem Buch aufgeführt.&lt;br /&gt;
&lt;br /&gt;
Alles in allem ist ein wirklich gutes Referenzwerk zum Nachschlagen entstanden. Es eignet sich keinesfalls nur für Einsteiger sondern ohne Zweifel auch für erfahrene Programmierer. Ideal also auch für Roboter-Bastler die sich für AVR-Boards wie zum Beispiel Eigenentwicklungen, [[RN-Control]], RNBFRA-Board und andere entschieden haben. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Autor: Marius Meissner &lt;br /&gt;
 Auflage , 8/2004 &lt;br /&gt;
 Deutsch , ca. 538 Seiten &lt;br /&gt;
 broschiert , inkl. 1 CD &lt;br /&gt;
 ISBN: nicht vorhanden &lt;br /&gt;
 Preis: 41,73 Euro inkl. Mwst.&lt;br /&gt;
 Bestellung nur über: &lt;br /&gt;
 Autor Mario Meissner http://bascom-avr.de/Buch.aspx?ID=2&lt;br /&gt;
 oder http://robotikhardware.de&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===Softwareentwicklung in C für Mikroprozessoren und Mikrocontroller, Autor Jörg Wiegelmann===&lt;br /&gt;
&lt;br /&gt;
Dieses Buch bietet eine allgemeine, praxisorientierte Einführung sowie einen Praxisteil. Der allgemeine Teil ist möglichst werkzeug- und prozessorunabhängig aufgebaut. Er enthält und beschreibt mit zahlreichen praxisbezogenen Tipps alle notwendigen Grundlagen, Werkzeuge und Informationen wie Einführung in C, Compiler, Linker, Library, Make, C-Programmierung für Embedded-Systeme, Quellcode, Tools und Entwicklungsumgebung, Systemdesign und objektorientierte Programmierung. Neben neuen Abschnitten zu Softwarekomplexität und Dokumentation sind zahlreiche Detailverbesserungen und Erweiterungen eingeflossen.&lt;br /&gt;
&lt;br /&gt;
Im Praxisteil wird das theoretisch dargestellte Wissen in einer kompletten, aktualisierten Fallstudie veranschaulicht und vertieft. Die Werkzeuge und der Prozessor der Fallstudie sind so ausgewählt, dass eine Umsetzung mit möglichst geringem Aufwand erfolgen kann.&lt;br /&gt;
&lt;br /&gt;
Wer eigene Projekte in C für Embedded-Systeme entwickeln möchte, findet somit in diesem Buch alles Notwendige.&lt;br /&gt;
&lt;br /&gt;
Die beiliegende CD-ROM enthält eine Vielzahl von aktuellen, nützlichen Programmen für die Praxis in der Softwareentwicklung wie Gnu-C-Compiler, Software und Beschreibung zum Selbstbau eines Low-Cost-Programmiergerätes, Software zur Verwaltung, Komplexitätsanalyse und Dokumentation von Quellcode, eine Softwareentwicklungsumgebung und die im Buch behandelte Fallstudie als kompletten Quellcode. Alle beigefügten Programme sind Vollversionen und in ihrem Einsatz nicht beschränkt. &lt;br /&gt;
&lt;br /&gt;
 Broschiert - 309 Seiten - Hüthig &lt;br /&gt;
 Erscheinungsdatum: September 2004&lt;br /&gt;
 ISBN: 3778529439&lt;br /&gt;
 39,80 Euro&lt;br /&gt;
 Bezug: z.B. Amazon.de&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
http://images-eu.amazon.com/images/P/3778529439.03.MZZZZZZZ.jpg&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===Messen,Steuern und Regeln mit ARM-Microcontrollern, Autor Klaus-Dieter Walter===&lt;br /&gt;
'''Klappentext:''' Messen, Steuern und Regeln mit ARM-Mikrocontrollern Mikrocontroller sind in der Elektronik heute allgegenwärtig. Meist unbemerkt versehen diese programmierbaren, integrierten Bausteine ihren Dienst. Ob in einer Waschmaschine, einem Handy oder in der ABS-Bremsanlage eines Autos -immer sind Mikrocontroller am Werk. ARM ist die Bezeichnung für eine 32-bit-Mikrocontroller-Architektur. Namensgebend ist die englische Firma ARM Limited. Diese Firma produziert selbst keine Mikrocontroller, vertreibt aber Lizenzen an Lizenznehmer, die ARM-basierte Mikrocontroller entwickeln, fertigen und vermarkten. ARM Mikrocontroller bieten beachtliche Leistungsmerkmale zu einen günstigen Preis, weshalb sich diese Leistungsklasse sehr rasant verbreitet hat. ARM-Mikrocontroller bilden das Herz vieler eingebetteter Systeme (Embedded Systems). Dieses Buch bietet eine Einführung in die wichtigsten Merkmale und Besonderheiten der ARM-Architektur. Anhand verschiedener ARM Mikrocontroller- und ARM-Modul-Beispiele werden die umfangreichen Peripheriefunktionen und deren Einsatz für MSR-Aufgabenstellungen erläutert. Im Zusammenhang mit dezentralen MSR-Anwendungen sind ARM Mikrocontroller besonders für Vernetzungsaufgaben geeignet. Aus diesem Grund bietet das Buch eine Einführung in Ethernet-basierte TCP/IP-Netzwerke und die ARM-Integration in solche Netze. Dabei kommen auch Embedded-Betriebssysteme wie z. B. Linux zur Sprache&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
http://images-eu.amazon.com/images/P/3772340172.03.MZZZZZZZ.jpg&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Persönliche Lesermeinung:''' Ein sehr hilfreiches und gelungenes Buch wenn schon etwas Microcontroller-Erfahrung besitzt und zum Beispiel von reinen Risc- Microcontrollern auf einen [[Microcontroller]] der ARM-Architektur umsteigt. Schon nach dem Anlesen merkt man das der Autor wirklich was von der Materie versteht und sich dort richtig Zuhause fühlt. Perfekt wird unter anderem der Unterschied und der Zusammenhang der Architekturen und Microcontollerarten ([[Arm|ARM]], RISC, CISC, MSR) erläutert. Übersichtliche und endlich mal verständliche Diagramme helfen hier sehr. Natürlich wird auch Erläutert welche Entwicklungssystem, Betriebssysteme (z.B. wird auf Linux eingegangen) der ARM Baureihe verwendet werden können. Ein weiterer Schwerpunkt sind die verschiedenen MSR Schnittstellen wie [[UART]], SPI, [[I2C]], CAN, USB Ethernet und weitere. &lt;br /&gt;
Fazit: Obwohl das Buch nicht ganz neu ist, scheint es mir eine gutes Einführungswerk für diese doch recht schwere Materie zu sein, insbesondere wenn man auch schon mit kleineren 8 Bit Microcontrollern ([[Avr]]/Pic) gearbeitet hat.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Frank|Frank]] 21:02, 7. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
 Gebundene Ausgabe mit 379 Seiten&lt;br /&gt;
 Erschienen im Franzis -Verlag September 2004&lt;br /&gt;
 ISBN: 3772340172&lt;br /&gt;
 Preis 39,95 Euro&lt;br /&gt;
 Bezug: Buchhandel, Amazon etc.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Das große PIC-Mikro Handbuch, Autor Anne und Manfred König===&lt;br /&gt;
'''Klappentext:'''Die Autoren haben viele Jahre Erfahrung mit industriellen PIC-Mikro-Projekten. Sie behandeln das Thema aus der Sicht ihres Entwickler-Alltags. Dazu gehört auch die ganze Peripherie, also alles was um die PIC-Mikrocontroller herum von Bedeutung ist. Dazu zählen z.B. analoge Peripheriebausteine und die Entwicklungsumgebung, bestehend aus MPLAB inklusiv der Debugger und den Demoboards. &lt;br /&gt;
Dieses Buch richtet sich an Interessenten, die bereits erste Erfahrungen mit PIC-Mikrocontrollern gesammelt haben. Der Schwerpunkt liegt auf den neuen Entwicklungen der letzten Jahre. Dazu gehört natürlich in erster Linie die PIC18 Generation, die mit dem 16 Bit-Kern nicht nur höheren Programmierkomfort beinhaltet, sondern vor allem eine Fülle neuer technischer Möglichkeiten &lt;br /&gt;
bietet. Aber auch von den PICs mit 14 bzw. 12 Bit-Kern gibt es viel Neues zu berichten. &lt;br /&gt;
&lt;br /&gt;
Aus dem Inhalt:&lt;br /&gt;
*Serielle Kommunikation&lt;br /&gt;
*PIC18&lt;br /&gt;
*Powermanagment&lt;br /&gt;
*Die neuen PIC10F und rfPIC&lt;br /&gt;
*PIC in Assembler programmieren&lt;br /&gt;
*Entwicklungssystem MPLAB 6.XX&lt;br /&gt;
*Der In-circuit-Debugger und Programmer ICD2 &lt;br /&gt;
*Demoboards und Peripheriebausteine&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
http://images-eu.amazon.com/images/P/3772359957.03.MZZZZZZZ.jpg&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Persönliche Lesermeinung:'''Ich habe mir das Buch besorgt um auch mal einen Einblick in die PIC-Welt zu bekommen. Beurteilen kann ich das Buch nur als PIC-Einsteiger, da ich eigentlich vorwiegend mit [[AVR]]-Controllern arbeite. Das Buch ist gut strukturiert und geht sehr gut auf die einzelnen Features, Eigenschaften und Architekturen der PIC-Controller ein. Dabei wird auch schon die derzeit neue PIC18 Serie berücksichtigt. Register werden oft in Verbindung mit kleinen Assembler-Beispielen und anschaulichen Tabellen erläutert. Schade ist nur, das wohl keine Basic Entwicklungsumgebung auf der CD vorhanden ist. Dem Assemblerfreund dürfte jedoch das enthaltene MLAB Entwicklungssystem alles notwendige mitbringen.  Etwas schade ist, das auf die Pic-Typen mit USB Schnittstelle nur relativ kurz eingegangen wird.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Frank|Frank]] 16:05, 9. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
 Gebundene Ausgabe mit 312 Seiten&lt;br /&gt;
 Erschienen im Franzis-Verlag Februar 2005&lt;br /&gt;
 Auflage: 1&lt;br /&gt;
 ISBN: 3772359957&lt;br /&gt;
 Preis: 39,95 Euro&lt;br /&gt;
 Bezug: Buchhandel, Amazon etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Elektronikbücher ==&lt;br /&gt;
=== Elektronik-Fibel, Patrik Schnabel ===&lt;br /&gt;
'''Lesermeinung:''' Das Buch gibt einen Überblick über elektronische Grundlagen, Bauteile, Schaltungstechnik, Messtechnik und Digitaltechnik. Der Leser meint also, ein kompaktes Buch über Elektronik und alles was dazugehört in der Hand zu halten. Leider sind viele Kapitel viel zu oberflächlich und das Layout wurde wohl mit dem miserablen Programm, dem Layout leider fremd ist, einer bekannten Softwareschmiede geschaffen. Anders kann man sich das, an vielen Stellen, katastrophale Layout nicht erklären. Ein weiterer Kritikpunkt sind die miserablen Grafiken. Ansonsten ist das Buch ganz gut geeignet zum Nachschlagen geeignet. Ich empfehle das Buch allen, die sich in Elektronik noch nicht so gut auskennen und ein kompaktes Buch zum Nachschlagen suchen (also nicht nur Elektronikbastlern sondern auch Schülern). Als Alternative bietet sich die Website des Autors (http://www.elektronik-fibel.de) an. Dort gibt es das ELKO in dem man sehr viele Informationen zum Thema finden kann.&lt;br /&gt;
&lt;br /&gt;
 Autor: Patrick Schnabel&lt;br /&gt;
 245 Seiten, broschiert&lt;br /&gt;
 ISBN 3-83114-59-03&lt;br /&gt;
 Preis EUR 15,50&lt;br /&gt;
 Bezugsquellen: Amazon, ...&lt;br /&gt;
&lt;br /&gt;
==Programmiersprachen==&lt;br /&gt;
&lt;br /&gt;
===C Programmieren von Anfang an, Autor Helmut Erlenkötter===&lt;br /&gt;
Dieses Buch von Helmut Erlenkötter finde ich, ist sehr zu empfehlen.&lt;br /&gt;
Es bietet einen guten Einstieg in die Programmierung mit C für Ein- und Umsteiger.&lt;br /&gt;
Es ist meiner Meinung nach gut für 'blutige' Anfänger geeignet, denn es erklärt sehr genau, was passiert, und wo man aufpassen muss.&lt;br /&gt;
&lt;br /&gt;
Nach jedem Kapitel werden Aufgaben gestellt, um das erworbene Wissen zu testen.&lt;br /&gt;
&lt;br /&gt;
Es gibt viele Codebeispiele, bzw. die ganze Programmierung wird anhand von Codebeispielen erklärt.&lt;br /&gt;
Jeder Schritt in einem Listing wird gesondert erklärt, was die übersicht des Buches und der Listings enorm erhöht.&lt;br /&gt;
&lt;br /&gt;
'''Die Kapitel:'''&lt;br /&gt;
&lt;br /&gt;
# Prolog&lt;br /&gt;
# Erste Schritte&lt;br /&gt;
# Mit Zahlen arbeiten&lt;br /&gt;
# Entscheidungen treffen&lt;br /&gt;
# Wiederhohlen von Programmteilen&lt;br /&gt;
# Funktionen definieren&lt;br /&gt;
# Felder und Zeichenketten&lt;br /&gt;
# Variablen und Konstanten&lt;br /&gt;
# Der Präprozessor&lt;br /&gt;
# Pointer&lt;br /&gt;
# Kommandozeilenparameter&lt;br /&gt;
# Dateien benutzen&lt;br /&gt;
# Fehler kontrollieren&lt;br /&gt;
# Komplexe Dateitypen&lt;br /&gt;
# Programmiertechniken&lt;br /&gt;
# C und Objekte&lt;br /&gt;
# Anhang&lt;br /&gt;
&lt;br /&gt;
Eine komplette ASCII-Tabelle befindet sich im Anhang.&lt;br /&gt;
&lt;br /&gt;
Das Buch verfügt über einen großen und ausführlichen Glossar.&lt;br /&gt;
&lt;br /&gt;
Sterne: * * * * *&lt;br /&gt;
&lt;br /&gt;
'-by tobimc-'&lt;br /&gt;
&lt;br /&gt;
 by Helmut Erlenkötter&lt;br /&gt;
 RORORO, ISBN 3-499-60074-9&lt;br /&gt;
 Broschiert, 9,90€ (D)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Bild:Buch-C.jpg]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===C++, Objektorientiertes Programmieren von Anfang an, Autor Helmut Erlenkötter===&lt;br /&gt;
&lt;br /&gt;
Auch dieses Buch bietet sich für Ein- und Umsteiger an, da auch hier wieder von Anfang an auf die Eigenarten dieser Programmiersprache eingegangen wird. Zu Beginn werden die Unterschiede zwischen C und C++ aufgeführt und dann geht es auch schon sofort los. Wie in all seinen Büchern, geht der Autor sehr schön systematisch vor. Es werden immer wieder Beispiele genannt, die den behandelten Stoff aufnehmen. Er weist auf eventuelle Fehler hin, die gemacht werden können und spricht jede Änderung oder Neuerung sofort durch. Am Ende eines jeden Kapitels gibt es Aufgaben zu lösen. Alle Lösungen für diese Aufgaben finden sich am Ende des Buches. Und auch hier hat der Autor wieder eine Menge an zusätzlichen Daten in das Glossar gepackt und eine ASCII-Tabelle fehlt auch hier nicht.&lt;br /&gt;
&lt;br /&gt;
Als weiterführendes Buch, nach &amp;quot;C programmieren von Anfang an&amp;quot; auf jedenfall zu empfehlen.&lt;br /&gt;
&lt;br /&gt;
 von Helmut Erlenkötter&lt;br /&gt;
 ISBN 3-499-60077-3&lt;br /&gt;
 Broschiert, 10,50 € (D)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Bild:Buch-c--.jpg]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [[Kategorie:Microcontroller]]&lt;br /&gt;
 [[Kategorie:Software]]&lt;br /&gt;
 [[Kategorie:Grundlagen]]&lt;br /&gt;
 [[Kategorie:Robotikeinstieg]]&lt;br /&gt;
 [[Kategorie:Elektronik]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Analog-Digital-Wandler&amp;diff=7239</id>
		<title>Analog-Digital-Wandler</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Analog-Digital-Wandler&amp;diff=7239"/>
				<updated>2006-05-06T15:47:55Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[ADC]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Avr&amp;diff=7238</id>
		<title>Avr</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Avr&amp;diff=7238"/>
				<updated>2006-05-06T15:47:07Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: Überschrift Analog-Wandler hinzugefügt, viele kleinere Detailänderungen gemacht, Korrekturen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:AtmelController.jpg|thumb|Beispiel eines AVR Controllers]]&lt;br /&gt;
'''AVR''' ist eine 8-Bit [[Microcontroller]]-Familie mit RISC-Architektur.&lt;br /&gt;
Im Gegensatz zu vielen anderen Microcontroller-Architekturen hat die AVR-Architektur keine Vorgänger. Sie ist ein komplettes Neudesign, das Anfang der 90-Jahre an der Universität von Trondheim/Norwegen entwickelt und vom (bis heute einzigen) Hersteller [[Atmel]] aufgekauft wurde. Es gibt eine ganze Serie von AVR-Controllern. Sie alle werden ähnlich programmiert, haben vergleichbaren Befehlssatz und physikalische Eigenschaften, bieten jedoch unterschiedliche Features und Peripherie. &lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche und kostenlose Entwicklungssysteme in den Sprachen Basic, C/C++, Pascal und Assembler für diese Controller-Familie. &lt;br /&gt;
&lt;br /&gt;
== Wofür steht AVR? ==&lt;br /&gt;
&amp;quot;AVR&amp;quot; steht angeblich für ''Advanced Virtual RISC'' (in einem Paper der Entwickler des AVR-Kerns Alf Egin Bogen und Vegard Wollan). Laut [[Atmel]] bedeutet es nichts.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
AVR-Controller besitzen eine zweistufige Pipeline (fetch and execute), die es ermöglicht, die meisten Befehle innerhalb eines einzigen Prozessortaktes auszuführen. Dadurch ist ein AVR wesentlich schneller als etwa 8051-Controller, bei denen der Prozessortakt intern noch durch 12 geteilt wird.&lt;br /&gt;
&lt;br /&gt;
*AVR-Kern&lt;br /&gt;
** Harvard-Architektur (getrennter Befehls- und Datenspeicher) &lt;br /&gt;
** 32 Register, kein Akkumulator, 3 Pointerregister &lt;br /&gt;
** EEPROM-Datenspeicher&lt;br /&gt;
** [[Watchdog]], [[Bootloader]]-Support, verschiedene Stromspar-Modi, Brownout-Erkennung, Interner Oszillator&lt;br /&gt;
** Lineares Speichermodell (keine Segmentierung)&lt;br /&gt;
** 8-Bit Architektur ist für Hochsprachen (C) optimiert &lt;br /&gt;
* In-System programmierbar: die Controller können sehr einfach über ein  Programmierkabel (oft ISP-Kabel genannt), das mit dem PC verbunden wird, programmiert werden &amp;amp;ndash; auch dann, wenn sie sich nicht in einer Schaltung befindet.&lt;br /&gt;
* umfangreiche Peripherie&lt;br /&gt;
** 8- und 16-Bit-Timer/Counter mit [[PWM]], Capture/Compare, externe Betaktung, asynchrone Operation&lt;br /&gt;
** Kommunikation: [[UART|USART]], [[SPI]], [[I2C]] ([[TWI]])&lt;br /&gt;
** Analog-Comparator, Analog-Digital-Wandler &lt;br /&gt;
** unterschiedlichste externe und interne Interrupt-Quellen (UART, SPI, Timer, A/D-Wandler, Analog-Comparator, ...)&lt;br /&gt;
** JTAG (Debugerinterface)&lt;br /&gt;
* AVR Typen (AT90 &amp;quot;Classic AVR&amp;quot;, ATtiny, ATmega) &lt;br /&gt;
* erhältlich in unterschiedlichen Gehäusen, idR Durchsteck und als [[SMD]]&lt;br /&gt;
* Viele Entwicklungsboards erhältlich, z.B. das Roboternetzboard [[RN-Control]]&lt;br /&gt;
&lt;br /&gt;
==Einige Pinbelegungen der populärsten AVR-Controller==&lt;br /&gt;
(in etwa nach Leistungsfähigkeit sortiert)&lt;br /&gt;
&lt;br /&gt;
* [[AT90S2313]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:at90s2313tiny.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Atmel Controller Mega8]]&lt;br /&gt;
* [[Atmel Controller Mega48 Mega88 Mega168]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:mega8kompatibel.png|center]]&lt;br /&gt;
&lt;br /&gt;
* [[Atmel Controller Mega16 und Mega32]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mega1632.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Atmel Controller Mega128]] ([[SMD]]-Chip)&lt;br /&gt;
&lt;br /&gt;
[[Bild:mega128pin.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Die AVR-Pin-Bezeichnungen und deren Funktion ===&lt;br /&gt;
Die meisten Ports sind doppelt belegt und besitzen neben der normalen Port-Funktion noch eine Sonderfunktion. Die verschiedenen Pinbezeichnungen und Sonderfunktionen werden hier beschrieben:&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|+ '''Tabelle: Die AVR-Pin-Bezeichnungen und deren Funktion'''&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Versorgungs- und Referenzpins, Reset&lt;br /&gt;
|-&lt;br /&gt;
 |'''VCC''' &lt;br /&gt;
 | Versorgungsspannung von 2,7 Volt bis 6 V bei den L-Varianten (low power), ansonsten 4,5V bis 6V. Die nächste AVR-Generation soll ab 1,8 Volt funktionieren.&lt;br /&gt;
|-&lt;br /&gt;
 |'''GND''' &lt;br /&gt;
 |Masse &lt;br /&gt;
|-&lt;br /&gt;
 |'''AREF''' &lt;br /&gt;
 |Referenzspannung für den Analog-Digital-Wandler (kann auf 5V gesetzt werden). Auch die interne Bandgap-Referenzspannung kann über diesen Pin entstört werden (dann KEINE externe Spannung an diesen Pin geben (Kurzschluss)!). &lt;br /&gt;
|-&lt;br /&gt;
 |'''AGND''' &lt;br /&gt;
 |Alternative Masse, etwa um ein Verbindungspunkt mit GND zu haben und bei empfindlichen Messungen  Masseschleifen zu vermeiden.&lt;br /&gt;
|-&lt;br /&gt;
 |'''AVCC''' &lt;br /&gt;
 | &lt;br /&gt;
Die Betriebsspannung für den Analog-Digital-Wandler (siehe Beschaltungsskizze). Die Pins AVCC, AGND und AREF sollten immer beschaltet werden, da es sonst passieren kann, dass Port A nicht richtig funktioniert, selbst wenn man den AD-Wandler nicht benutzt. &lt;br /&gt;
|-&lt;br /&gt;
 |'''RESET''' &lt;br /&gt;
 |Rücksetz-Eingang, intern über einen [[Pullup]] mit VCC verbunden. Ein LOW–Pegel an diesem Pin für die Dauer von mindestens zwei Zyklen des Systemtaktes bei aktivem Oszillator setzt den Controller zurück. Rücksetzen der Ports erfolgt unabhängig von einem evtl. anliegenden Systemtakt.&lt;br /&gt;
|-&lt;br /&gt;
|'''PEN'''&lt;br /&gt;
|Programming Enable - Diesen Pin gibt es nur beim Mega128/64 u.ä. Wird dieser Pin beim Power-On Reset nach Masse gezogen, geht der Controller in den [[ISP]] Programmiermodus. Man kann ihn also alternativ zu Reset verwenden. In der Regel verwendet man aber die Reset-Leitung und PEN sollte man direkt mit VCC verbinden.&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| System-Takt&lt;br /&gt;
|-&lt;br /&gt;
 |'''XTAL1''' &lt;br /&gt;
 |Eingang des internen Oszillators zur Erzeugung des Systemtaktes bzw. Eingang für ein externes Taktsignal, wenn der interne Oszillator nicht verwendet werden soll bzw. Anschluss von Quarz/Keramik-Resonator/RC-Glied.&lt;br /&gt;
|-&lt;br /&gt;
 |'''XTAL2''' &lt;br /&gt;
 |Anschluss von Quarz oder Keramik-Resonator oder Ausgang des integrierten Oszillators zur Nutzung als Systemtakt (Je nach Fuse-Einstellungen). &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Digitale bidirektionale  I/O-Ports&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;| Jeder Pin der Ports kann individuell als Eingang oder Ausgang konfiguriert werden. Die I/O-Ports sind maximal 8 Bit breit und verfügen ja nach AVR-Typ über eine unterschiedliche Anzahl von Pins. An jedem als Eingang (Input) geschalteten Pin gibt es zuschaltbare [[Pullup]]-Widerstände, die teilweise auch bei aktivierter Sonderfunkton verfügbar sind.&lt;br /&gt;
&lt;br /&gt;
Bei eingeschalteten Sonderfunktionen wie UART, SPI, ADC, etc. sind die entsprechenden Pins nicht als &amp;quot;normale&amp;quot; digitale I/O verwendbar, sondern dienen der Sonderfunktion. Die Anzahl der als I/O verwendbaren Pins ist auch abhängig von den Fuse-Einstellungen (Vorsicht beim Umstellen, Handbuch GENAU lesen!).&lt;br /&gt;
|-&lt;br /&gt;
|'''PA 0 – 7''' || Port A &lt;br /&gt;
|-&lt;br /&gt;
|'''PB 0 – 7''' || Port B &lt;br /&gt;
|-&lt;br /&gt;
|'''PC 0 – 7''' || Port C &lt;br /&gt;
|-&lt;br /&gt;
|'''PD 0 – 7''' || Port D &lt;br /&gt;
|-&lt;br /&gt;
|'''PE 0 – 7''' || Port E &lt;br /&gt;
|-&lt;br /&gt;
|'''PF 0 – 7''' || Port F &lt;br /&gt;
|-&lt;br /&gt;
|'''PG 0 – 7''' || Port G &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Externe Interrupts&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;| Die PCINT-Interrupts gibt es nur für neuere AVRs wie den [[ATmega88]]. Falls die Anzahl an externen Interrupts nicht ausreicht, kann evtl. auch andere Hardware dafür eingesetzt werden, etwa der Analog-Comparator mit interner Bandgap-Referenz, falls er anderwärtig nicht gebraucht wird.&lt;br /&gt;
|-&lt;br /&gt;
 |'''INT0''' ||Externer Interrupt 0&lt;br /&gt;
|-&lt;br /&gt;
 |'''INT1''' ||Externer Interrupt 1&lt;br /&gt;
|-&lt;br /&gt;
 |'''INT2''' ||Externer Interrupt 2 &lt;br /&gt;
|-&lt;br /&gt;
 |'''PCINTx''' ||Pin-Change Interrupt&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| [[Timer]] und [[PWM]]&lt;br /&gt;
|-&lt;br /&gt;
 |'''T0''' &lt;br /&gt;
 |Timer-Eingang. Timer kann gestartet, gestoppt oder getaktet werden &lt;br /&gt;
|-&lt;br /&gt;
 |'''T1''' &lt;br /&gt;
 |Timer-Eingang. Timer kann gestartet, gestoppt oder getaktet werden &lt;br /&gt;
|-&lt;br /&gt;
 |'''OC0''' &lt;br /&gt;
 |PWM bzw. Output Compare Ausgang des Timers 0 &lt;br /&gt;
|-&lt;br /&gt;
 |'''OC1A''' &lt;br /&gt;
 |Ausgang für die Compare-Funktion des integrierten Zeitgeber- / Zählerbausteines &lt;br /&gt;
Der erste PWM-Ausgang des Timers1. Er kann zum Regeln der Bot-Motogeschwindigkeit benutzt werden. &lt;br /&gt;
|-&lt;br /&gt;
 |'''OC1B''' &lt;br /&gt;
 |Ausgang für die Compare-Funktion des integrierten Zeitgeber- / Zählerbausteines &lt;br /&gt;
Der zweite PWM-Ausgang des Timers1. Er kann zum Regeln der Bot-Motogeschwindigkeit benutzt werden. &lt;br /&gt;
|-&lt;br /&gt;
 |'''ICP1''' &lt;br /&gt;
 |Eingang für die Capture-Funktion des integrierten Zeitgebers / Zählerbausteines &lt;br /&gt;
|-&lt;br /&gt;
 |'''OC2''' &lt;br /&gt;
 |[[Pwm]] bzw. Output Compare Ausgang des Timers2. Er kann zum Regeln der Bot-Motogeschwindigkeit benutzt werden. &lt;br /&gt;
|-&lt;br /&gt;
 |'''TOSC1, TOSC2''' &lt;br /&gt;
 |TOSC1 und TOSC2 sind Eingänge für den asynchronen Modus von Timer2. Sie sind vorgesehen für den Anschluss eines externen Uhrenquarzes ( 32.768 kHz ). Damit lassen sich zum Beispiel sehr genaue Ein-Sekunden-Impulse für eine Uhr generien. &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Analog-Digital-Wandler&lt;br /&gt;
|-&lt;br /&gt;
 |'''ADC0''' bis '''ADC7''' &lt;br /&gt;
 |Eingänge des AD-Wandlers. Spannungen können hier gemessen werden oder an den Analog-Komparator weiter geleitet werden. &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Analog-Komparator&lt;br /&gt;
|-&lt;br /&gt;
 |'''AIN0, AIN1''' &lt;br /&gt;
 |Die beiden externen Eingänge des Analog-Komparators. &lt;br /&gt;
Mit AIN0(+) und AIN1(-) kann man zwei Spannungen miteinander vergleichen. Wenn die Spannung an AIN0 höher als bei AIN1 ist, liefert der Komparator &amp;quot;High&amp;quot;, ansonsten ein &amp;quot;Low&amp;quot;. Als interne Eingänge des Komparators können die Interne Bandgap-Referenzspannung oder Ausgänge des ADC-Multiplexers dienen.&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Serielle Schnittstelle ([[UART|USART]])&lt;br /&gt;
|-&lt;br /&gt;
 |'''RXD''' &lt;br /&gt;
 |Eingang der Seriellen Schnittstelle (Receive Data), TTL-Pegel &lt;br /&gt;
|-&lt;br /&gt;
 |'''TXD''' &lt;br /&gt;
 |Ausgang Serielle Schnittstelle (Transmit Data), TTL-Pegel &lt;br /&gt;
|-&lt;br /&gt;
 |'''XCK''' &lt;br /&gt;
 |Externe Takt für den USART. Wird nur in Sonderfällen für den Takt benötigt. &lt;br /&gt;
USART (&amp;quot;Universal Synchronous/Asynchronous Receiver and Transmitter&amp;quot;). Das ist die serielle Schnittstelle, die zur Datenübertragung zwischen Mikrocontroller und PC genutzt wird. Zur bidirektionalen Übertragung werden zwei Pins am Controller benötigt: TXD und RXD. Über TXD (&amp;quot;Transmit Data&amp;quot;) werden Daten gesendet, RXD (&amp;quot;Receive Data&amp;quot;) dient zum Empfang. &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| [[SPI]]-Schnittstelle&lt;br /&gt;
|-&lt;br /&gt;
 |'''SS''' &lt;br /&gt;
 |SPI-Interface – wird beneötigt um den richtigen Slave am Bus zu wählen &lt;br /&gt;
|-&lt;br /&gt;
 |'''MOSI''' &lt;br /&gt;
 |SPI-Interface – Datenausgang (als Master) oder Dateneingang (als Slave), verwendet bei ISP (In-System-Programmierung)&lt;br /&gt;
|-&lt;br /&gt;
 |'''MISO''' &lt;br /&gt;
 |SPI-Interface – Dateneingang (als Master) oder Datenausgang (als Slave), verwendet bei ISP (In-System-Programmierung)&lt;br /&gt;
|-&lt;br /&gt;
 |'''SCK''' &lt;br /&gt;
 |SPI-Interface – Bustakt vom Master, verwendet bei ISP (In-System-Programmierung)&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| [[I2C|I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C]]-Schnittstelle ([[TWI]])&lt;br /&gt;
|-&lt;br /&gt;
 |'''SDA''' &lt;br /&gt;
 |I2C-Schnittstelle (Bus aus 2 Leitungen) Datenleitung &lt;br /&gt;
|-&lt;br /&gt;
 |'''SCL''' &lt;br /&gt;
 |I2C-Schnittstelle (Bus aus 2 Leitungen) Clockleitung &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| [[JTAG]]-Interface&lt;br /&gt;
|-&lt;br /&gt;
 |'''TDI''' &lt;br /&gt;
 |JTAG-Debug Interface - Über dieses Interface kann man den AVR programmieren und debuggen. Die Schnittstelle ist ähnlich wie die SPI Schnittstelle und hat getrennte Dateneingangs- und Datenausgangsleitungen sowie eine Taktleitung. TDI ist die Dateneingangsleitung&lt;br /&gt;
|-&lt;br /&gt;
 |'''TDO''' &lt;br /&gt;
 |JTAG-Debug Interface - TDO ist die Datenausgangsleitung des JTAG Interface&lt;br /&gt;
|-&lt;br /&gt;
 |'''TMS''' &lt;br /&gt;
 |JTAG-Debug Interface&lt;br /&gt;
|-&lt;br /&gt;
 |'''TCK''' &lt;br /&gt;
 |JTAG-Debug Interface &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Timer/Counter ==&lt;br /&gt;
&lt;br /&gt;
Die Mikrocontroller der AVR-Familie besitzen je nach Typ eine unterschiedliche Anzahl an programmierbaren [[Timer|Timern]]. Bei den aktuellen ATmegas sind das mindestens ein 8-Bit Timer und bei größeren Ausführungen der Serie auch 16-Bit Timer. Die Timer werden immer Timerx benannt, wobei x für die Timernummer steht (also 0, 1, 2, usw.). &lt;br /&gt;
Die Konfigurationsmöglichkeiten sind von Timer zu Timer unterschiedlich.&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' Die folgenden Code-Beispiele sind in C programmiert und wurden für einen [[ATMega32|ATmega32]] entwickelt. Sie lassen sich also ohne große Änderungen auch auf anderen Mikrocontrollern der AVR-Familie einsetzen.&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine Funktionsweise ===&lt;br /&gt;
Timer funktionieren nach dem allgemeinen Prinzip, dass sie eine Ganzzahl (im weiteren als Zähler bezeichnet) je nach Betriebsmodus auf- oder abwärtszählen, d.h. inkrementieren bzw. dekrementieren.&lt;br /&gt;
&lt;br /&gt;
Angenommen, der Timer arbeitet im einfachsten Betriebsmodus, dem normalen Modus (siehe [[Avr#Normaler Modus (Normal Mode)|Normaler Modus (Normal Mode)]]). Die Zählrichtung des Timers ist aufsteigend gerichtet. Je nach Auflösung, also 8-Bit oder 16-Bit, erreicht der Zähler irgendwann einen bestimmten Zustand. Möglich wäre, dass er überläuft, wenn z.B. bei einem 8-Bit Timer der Wert 255 inkrementiert wird (siehe Grafik).&lt;br /&gt;
&lt;br /&gt;
[[Bild:AbstrakterZaehlvorgang.png]]&lt;br /&gt;
&lt;br /&gt;
=== Der Prescaler ===&lt;br /&gt;
Der Prescaler (eng. = Vorteiler) kann dazu genutzt werden, den Takt, der den Timern zugeführt wird, zu verkleinern. U.a. kann man damit die Timer so konfigurieren, damit diese in den unterschiedlichsten Frequenzen takten. Hier eine Grafik die den Prescaler veranschaulicht:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Prescaler.png]]&lt;br /&gt;
&lt;br /&gt;
Das obere Diagramm zeigt den Betrieb ohne Prescaler, das untere mit Prescaler. Die gestrichelte Linie zeigt, wann ein Interrupt eintritt.&lt;br /&gt;
&lt;br /&gt;
Im Teil [[Avr#Die Betriebsmodi|Die Betriebsmodi]] wird weiter auf die praktische Verwendung des Prescalers eingegangen.&lt;br /&gt;
&lt;br /&gt;
=== Die Betriebsmodi ===&lt;br /&gt;
Die AVR-Timer können in unterschiedlichen Betriebsmodi betrieben werden. Diese sind:&lt;br /&gt;
* Normaler Modus&lt;br /&gt;
* CTC Modus&lt;br /&gt;
* PWM&lt;br /&gt;
&lt;br /&gt;
==== Normaler Modus (Normal Mode) ====&lt;br /&gt;
Der einfachste Betriebsmodus ist der normale Modus. Er funktioniert wie im Abschnitt  &amp;quot;[[Avr#Allgemeine Funktionsweise|Allgemeine Funktionsweise]]&amp;quot; beschrieben. Die Zählrichtung des Timers ist immer aufsteigend, und irgendwann kommt es zu dem Interrupt Timer-Overflow (welcher in einer passend ISR aufgefangen werden kann). Im einfachsten Fall kann man diesen Modus in folgendem Diagramm darstellen:&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_1.png]]&lt;br /&gt;
&lt;br /&gt;
Der Zähler des Timers (im Diagramm oben, die aufsteigende und dann wieder zurückgesetzte Linie) ist in dem Register TCNTx gespeichert, wobei x für eine Zahl steht. Soll z.B. auf den Timer0 (siehe Datenblatt des jeweiligen Controllers) des Controllers zugegriffen werden, so ist an TCNT eine 0 anzuhängen, also TCNT0.&lt;br /&gt;
Wie lange es braucht, bis der Zähler einen Overflow auslöst, ist von der Taktfrequenz des Controllers, dem eingestellten Prescaler-Wert und von der Timerauflösung abhängig. Nun wäre es ja sehr unpraktisch, wenn wir den Zähler nicht anpassen könnten. Denn sonst müssten wir unsere Software die den Timer benutzt evtl. anpassen und viel rechnen um z.B. für 1000 ms zu schlafen. Deswegen kann auf den Zähler zugreifen und ihn vorladen bevor dieser wieder vom eigentlichen Timer hochgezählt wird. Dies veranschaulicht folgendes Diagramm:&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_1_Vorladen.png]]&lt;br /&gt;
&lt;br /&gt;
Dadurch kann man den Timer beeinflussen, und beeinflussen wie lange es dauert, bis ein Overflow auftritt. Um zu berechnen, welchen Wert wir vorladen müssen, kann man auch ein Java-Applet nutzen, siehe unter [[Avr#Weblinks|Weblinks Java Applet]].&lt;br /&gt;
&lt;br /&gt;
Natürlich kann man das auch &amp;quot;von Hand&amp;quot; rechnen. Die Berechnung des Preloader- sowie Prescalerwerts bei Verwendung der Overflow-Interrupts, eines Prescalers von 64 (nicht alle Prescaler können verwendet werden) und eines Quarzes mit der Frequenz von 8 MHz sieht folgendermaßen aus (gesuchte Frequenz beträgt 1000 Hz unter der Verwendung des Timer0 eines ATmega32):&lt;br /&gt;
# &amp;lt;math&amp;gt;Prescale = Frequenz * 1000000 [Hz] = 8000000&amp;lt;/math&amp;gt;&lt;br /&gt;
# Wir definieren den maximalen Zählerwert. Dieser ist bei einem 8-Bit Timer 256, bei einem 16-Bit Timer 65536. In unserem Fall ist der maximale Zählerwert 256, weil Timer0 verwendet wird.&lt;br /&gt;
# Nun wird die Variable ''Prescale'' (s.o.) durch den verwendeten Prescaler (64) geteilt (&amp;lt;math&amp;gt;8000000 Hz / 64 = 125000&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Als nächstes wird der im dritten Punkt errechnete Wert durch die gesuchte Frequenz geteilt &amp;lt;math&amp;gt;=125000 / 1000Hz = 125&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Nun wird mathematisch überprüft, ob der errechnete Wert aus dem vierten Punkt kleiner als der maximale Zählerwert ist. Trifft dies zu, so subtrahiert man den errechneten Wert vom maximalen Zählerwert (&amp;lt;math&amp;gt;= 256 - 125 = 131&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Damit haben wir den Wert errechnet, der bei jedem Interrupt, den der Timer0 auslöst, in TCNTx (in diesem Fall TCNT0) nachgeladen werden muss, damit die Interrupts in dem gewünschten Zeitabstand von einer Millisekunde ausgelöst werden.&lt;br /&gt;
&lt;br /&gt;
Allerdings bleibt zu bemerken, dass bei der Verwendung einer &amp;quot;ungeraden&amp;quot; Quarzfrequenz (z.B. 7,3728 MHz) der Timer mit einer bestimmten Ungenauigkeit arbeitet. Würden wir z.B. den Quarz oben mit einem Quarz mit 7,3728 MHz austauschen, so wäre die Fehlerrate 0,17%. Diese Ungeauigkeit varriert von verwendetem Prescaler zu Prescaler. D.h. wenn wir einen Prescaler von 1024 (und einer Quarzfrequenz von 8 MHz) verwendet hätten, so hätten wir eine inakzeptable Ungeauigkeit von 11,61%. Deswegen sollte sie eines der genannten Programme unter [[Avr#Weblinks]] verwenden, denn diese zeigen nur die bestmögliche Konfiguration an.&lt;br /&gt;
&lt;br /&gt;
Die Fehlerrate kann natürlich auch ausgerechnet werden. Hier die Rechenschritte (sie sind erweiternd zu der oberen Berechnung):&lt;br /&gt;
# Als erstes wird mathematisch überprüft, ob der Preloaderwert (siehe fünften Schritt oben) größer als 1 ist.&lt;br /&gt;
# Trifft dies zu, so wird als nächstes die resultierende Frequenz errechnet. Die geschieht folgendermaßen: Der errechnete Preloaderwert aus der Rechnung oben wird vom maximalen Zählerwert subtrahiert, anschließend mit dem Prescaler multipliziert und dann das Ganze durch die Variable Prescale geteilt &lt;br /&gt;
&amp;lt;math&amp;gt;(256 - 131) \cdot 64 / 8\,000\,000 \mathrm{Hz} \cdot 1\,000\,000 = 1000&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Nun wird die gesuchte Frequenz vom errechneten Wert aus dem dritten Punkt subtrahiert und dann wiederum durch diese geteilt &amp;lt;math&amp;gt;(1000-1000) / 1000 = 0&amp;lt;/math&amp;gt;. Damit läuft dieser Timer genau mit einer Fehlerrate von 0 %.&lt;br /&gt;
&lt;br /&gt;
Betreibt man den Timer im Overflow-Modus, so muss man, wie bereits erwähnt, nach/bei jedem Overflow-Interrupt den Timer nachladen. Der Interrupt heißt in diesem Fall SIG_OVERFLOWx (x steht für die Nummer des Timers). Dieser muss in einer ISR abgefangen werden.&lt;br /&gt;
&lt;br /&gt;
Zusammenfassend ein Beispielprogramm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* Es wird der Timer2 (8-Bit) eines ATmega32 verwendet, der mit einem Quarz mit 7,3728 MHz&lt;br /&gt;
betrieben wird. Im Abstand von 0,001 ms erzeugt der Timer einen Interrupt, also eine&lt;br /&gt;
Frequenz von 1000000 Hz (oder 100 kHz). Der Timer wird auf einen Prescaler von 1 und&lt;br /&gt;
einem Preloader von  183 konfiguriert.*/&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t countTimer2;	// Speichert den aktuellen Zählerwert&lt;br /&gt;
&lt;br /&gt;
// ISR zum auffangen der Interrupts:&lt;br /&gt;
SIGNAL(SIG_SIG_OVERFLOW2)&lt;br /&gt;
{&lt;br /&gt;
	countTimer2++;&lt;br /&gt;
	TCNT2 = 183;		// Nachladen&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Initialisierung:&lt;br /&gt;
TCCR2 = (1&amp;lt;&amp;lt;CS22);		// Prescaler von 1&lt;br /&gt;
TCNT2  = 183;			// Vorladen&lt;br /&gt;
TIMSK |= (1&amp;lt;&amp;lt;TOIE2);		// Interrupts aktivieren und damit Timer starten&lt;br /&gt;
sei();&lt;br /&gt;
&lt;br /&gt;
// Funktionen zum benutzen der Timer:&lt;br /&gt;
/** Diese Funktion nicht aufrufen. Wird von sleep_millisec aufgerufen.&lt;br /&gt;
Bei t=100 schläft die Funktion 1 ms. */&lt;br /&gt;
inline void sleep (uint8_t t)&lt;br /&gt;
{&lt;br /&gt;
	// countTimer2 wird in der ISR oben inkrementiert&lt;br /&gt;
	countTimer2 = 0;&lt;br /&gt;
	while (countTimer2 &amp;lt; t);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** Schläft x-Millisekunden. */&lt;br /&gt;
inline void sleep_millisec(uint16_t msec)&lt;br /&gt;
{&lt;br /&gt;
	uint16_t i;&lt;br /&gt;
	for(i=0; i&amp;lt;msec; i++) {&lt;br /&gt;
		sleep(100);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Allerdings wird auf diese leicht veraltete Technik nun nicht weiter eingegangen. Der Artikel wendet sich nun dem neueren &amp;quot;Compare Output&amp;quot;-Betriebsmodus zu.&lt;br /&gt;
&lt;br /&gt;
Beim &amp;quot;Compare Output&amp;quot;-Betriebsmodus wird genauso ein Zähler hochgezählt. Allerdings wird der Zählerwert nach jeder Inkrementierung mit einem vom Benutzer festgelegten Wert verglichen. Entspricht der Zählerwert dem gespeicherten Wert, so kommt es zu einem Interrupt. Dieser Wert wird in das Register OCRx (x steht wieder für die Timernummer) gespeichert. Je nach Auflösung des Timers ist dieses Register 8-Bit oder 16-Bit breit. &lt;br /&gt;
&lt;br /&gt;
Hinweis: Siehe CTC Modus unten. Dieser wird benötigt um den Timer entsprechend im &amp;quot;Compare Output&amp;quot;-Betriebsmodus vernünftig zu betreiben.&lt;br /&gt;
&lt;br /&gt;
Hier ein typisches Diagramm dieses Betriebsmodus (Hinweis: Das Diagramm wurde unter Verwendung des CTC Modus erstellt. Für Begriffserklärung siehe CTC Modus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_CompareMatch.png]]&lt;br /&gt;
&lt;br /&gt;
Das Ausrechnen des Werts, der in OCRx geschrieben werden muss, damit Frequenz x entsteht, ist nicht sonderlich schwer. Man geht wie bei der Berechnung des Werts für den Overflow-Modus vor (s.o.) nur daß man das resultierende Ergebnis vom maximalen Zählerwert (bei 8-Bit Auflösung ist dieser 256, bei 16-Bit Auflösung 65536) subtrahiert. Das Ergebnis wird dann einmalig in das Register OCRx geschrieben. Mann muss also nicht wie beim Overflow-Modus den Timer nach jedem Interrupt nachladen. Der enstehende Interrupt heißt in diesem Fall SIG_OUTPUT_COMPAREx (x steht für die Nummer des Timers). Dieser muss in einer ISR abgefangen werden.&lt;br /&gt;
&lt;br /&gt;
Wiederum zusammenfassend ein Beispielprogramm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* Es wird der Timer2 (8-Bit) eines ATmega32 verwendet, der mit einem Quarz mit 7,3728 MHz&lt;br /&gt;
betrieben wird. Im Abstand von 0,001 ms erzeugt der Timer einen Interrupt, also eine Frequenz&lt;br /&gt;
von 1000000 Hz (oder 100 kHz). Der Timer wird auf einen Prescaler von 1 und einem OCR2-Wert&lt;br /&gt;
von 73 konfiguriert.*/&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t countTimer2;	// Speichert den aktuellen Zählerwert&lt;br /&gt;
&lt;br /&gt;
// ISR zum auffangen der Interrupts:&lt;br /&gt;
SIGNAL(SIG_OUTPUT_COMPARE2)&lt;br /&gt;
{&lt;br /&gt;
  countTimer2++;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Initialisierung:&lt;br /&gt;
TCCR2 = (1&amp;lt;&amp;lt;CS22) | (1&amp;lt;&amp;lt;WGM21);	// Prescaler von 1 | CTC-Modus (siehe unten für Beschreibung)&lt;br /&gt;
OCR2  = 73;			// Vergleichswert&lt;br /&gt;
TIMSK |= (1&amp;lt;&amp;lt;OCIE2);		// Interrupts aktivieren und damit Timer starten&lt;br /&gt;
sei();&lt;br /&gt;
&lt;br /&gt;
// Funktionen zum benutzen der Timer:&lt;br /&gt;
/** Diese Funktion nicht aufrufen. Wird von sleep_millisec aufgerufen.&lt;br /&gt;
Bei t=100 schläft die Funktion 1 ms. */&lt;br /&gt;
inline void sleep(uint8_t t)&lt;br /&gt;
{&lt;br /&gt;
	// countTimer2 wird in der ISR oben inkrementiert&lt;br /&gt;
	countTimer2 = 0;&lt;br /&gt;
	while (countTimer2 &amp;lt; t);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** Schläft x-Millisekunden. */&lt;br /&gt;
inline void sleep_millisec(uint16_t msec)&lt;br /&gt;
{&lt;br /&gt;
	uint16_t i;&lt;br /&gt;
	for(i=0; i&amp;lt;msec; i++) {&lt;br /&gt;
		sleep(100);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== CTC Modus (Clear Timer on Compare Match mode) ====&lt;br /&gt;
Der CTC Modus ist eine Erweiterung des &amp;quot;Compare Output&amp;quot;-Betriebsmodus. Der CTC Modus wird z.B. für das obere Beispielprogramm benötigt. Wird der Timer nämlich im normalen Betriebsmodus betrieben, so ist seine Zählergrenze je nach Auflösung 255 oder entsprechend für die 16-Bit Timer. Erst wenn diese Grenze erreicht wurde, wird der Timer zurückgesetzt (also auf 0). Durch den CTC Modus wird der Timer augenblicklich automatisch nachdem ein &amp;quot;Compare Output&amp;quot;-Interrupt auftrat zurückgesetzt. Man kann also die maximalen Zählergrenze selber definieren.&lt;br /&gt;
Dieses Diagramm veranschaulicht den CTC Modus. Nach dem Interrupt wird der Timer sofort wieder zurückgesetzt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_CompareMatch.png]]&lt;br /&gt;
&lt;br /&gt;
==== PWM ====&lt;br /&gt;
Für PWM siehe [[Pwm]].&lt;br /&gt;
&lt;br /&gt;
=== Registerübersicht ===&lt;br /&gt;
''Hinweis: Diese Registertabellen wurden für den aktuellen [[Atmel Controller Mega16 und Mega32]] erstellt. Wenn Sie ein anderes Modell verwenden kann es sein, dass ein oder mehrere Register nicht existieren, oder sie eine andere Bezeichnung haben.''&lt;br /&gt;
&lt;br /&gt;
{| {{Blaueschmaltabelle}} width=100%&lt;br /&gt;
 |'''TIMSK'''&lt;br /&gt;
 |-&lt;br /&gt;
 |Mit diesem Register, der von allen Timern verwendet wird, lässt sich die Interruptausführung und Art des jeweiligen Timers bestimmen.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Registertabelle8Bit|OCIE2|TOIE2|TICIE1|OCIE1A|OCIE1B|TOIE1|OCIE0|TOIE0}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
*'''OCIE2 (Timer/Counter2 Output Compare Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter2 Compare Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TOIE2 (Timer/Counter2 Overflow Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter2 Overflow Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TICIE1 (Timer/Counter1, Input Capture Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Input Capture Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''OCIE1A (Timer/Counter1 Output Compare A Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Output Compare A Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''OCIE1B (Timer/Counter1 Output Compare B Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Output Compare B Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TOIE1 (Timer/Counter1 Overflow Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Overflow Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''OCIE0 (Timer/Counter0 Output Compare Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, so wird der Timer/Counter0 Compare Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TOIE0 (Timer/Counter0 Overflow Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, so wird der Timer/Counter0 Overflow Interrupt aktiviert  (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Analog-Digital-Wandler ==&lt;br /&gt;
''Für allgemeine Informationen zu dem Analog-Digital-Wandler siehe Artikel [[ADC]].''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Mit einem Analog-Digital-Wandler ([[ADC]], für Analog Digital Converter) ist es mit den AVRs möglich, auf einfache Art und Weise analoge Größe in digitale Werte umzuwandeln. Dies bietet sich z.B. an, wenn man die Batteriespannung eines Roboters bestimmen möchte.&lt;br /&gt;
&lt;br /&gt;
=== Kanäle ===&lt;br /&gt;
Ein AVR hat normalerweise nur einen [[ADC]] integriert. Öfters muss man aber mehrere analoge Größen von verschiedenen Quellen wandeln, deswegen besitzen die AVRs Kanäle (ein ATmega32 z.B. besitzt acht Kanäle auf Port A). Diese Kanäle werden dann mithilfe eines Multiplexer auf den [[ADC]] geschalten werden, der dann die anliegenden analoge Spannung in einen digitalten Wert wandelt.&lt;br /&gt;
&lt;br /&gt;
=== Betriebsmodi ===&lt;br /&gt;
Der [[ADC]] bietet verschiedene Betriebsmodi. Diese wären:&lt;br /&gt;
* Single Conversation: Der [[ADC]] wandelt eine analoge Größe um und gibt diese zurück.&lt;br /&gt;
* Free Running: Der [[ADC]] wandelt wie in einer Endlosschleife ständig die anliegenden analogen Größen in digitale Werte um und gibt diese zurück.&lt;br /&gt;
&lt;br /&gt;
=== Teilungsfaktor ===&lt;br /&gt;
Zum Wandeln benötigt der [[ADC]] einen eigenen Takt, der auf der Taktfrequenz des Mikrocontrollers basiert. Allerdings ist die Taktfrequenz des Mikrocontrollers zu schnell und deswegen wird diese durch den Vorteiler verkleinert. Der resultierende Takt muss zwischen 50kHz und 200kHz liegen. Folgende Teilungsfaktoren sind verfügbar:&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''Teilungsfaktoren'''&lt;br /&gt;
 |2&lt;br /&gt;
 |4&lt;br /&gt;
 |8&lt;br /&gt;
 |16&lt;br /&gt;
 |32&lt;br /&gt;
 |64&lt;br /&gt;
 |128&lt;br /&gt;
 |}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Um zu bestimmen welcher Teilungsfaktor geeignet ist, kann man folgende Formel verwenden.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Tacktfrequenz = 8 MHz&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Teilungsfaktor_{min} = {Tacktfrequenz \over {200 kHz}} = {{8000000 Hz} \over {200000 Hz}} = 40&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Teilungsfaktor_{max} = {Tacktfrequenz \over {50 kHz}} = {{8000000 Hz} \over {50000 Hz}} = 160&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Deswegen kann man nun zwischen einem der folgenden Teilungsfaktor wählen: 64 und 128. Im Interesse der Geschwindigkeit sollte 64 gewählt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Siehe bitte die Registerübersicht weiter unten. Dort wird gezeigt, welches Register entsprechend eingestellt werden muss, damit man einen der oben aufgelisteten Teilungsfaktoren auswählen kann.&lt;br /&gt;
&lt;br /&gt;
=== Referenzspannung ===&lt;br /&gt;
Das Ergebnis der Wandlung des [[ADC]] bezieht sich auf eine bestimmt Referenzspannung. Diese Referenzspannung lässt sich bestimmen. Je nach gewählter Referenzspannung darf man nur eine zu messende Spannung an den Port anlegen, die nicht höher liegt als die Referenzspannung. Sonst würde dieser zerstört werden. Die Referenzspannung ist also gleich der maximal zu messenden Spannung. Um einzustellen welche Referenzspannung verwendet werden soll, gibt es den Register ADMUX. Folgende Quellen sind als Referenzspannung möglich:&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''Referenzspannungsquelle'''&lt;br /&gt;
 |AREF, internes Vref deaktiviert&lt;br /&gt;
 |AVCC mit externen Kondensator am AREF Pin&lt;br /&gt;
 |Keine Funktion, reserviert&lt;br /&gt;
 |Interne 2,56V Spannungsreferenz mit externen Kondensator am AREF Pin&lt;br /&gt;
 |}&lt;br /&gt;
Siehe bitte die Registerübersicht. Dort steht genauer wie man den Register einzustellen hat.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Man benötigt die Referenzspannung auch (oder besserer deren analoge Größe) um den Wert den der ADC zurückgibt in V umzurechnen. Um den zurückgegebenen Wert des ADC umzuwandel geht man so vor:&amp;lt;br&amp;gt;&lt;br /&gt;
# Bestimmen der Auflösung des ADC. Bei den ATMegas normalerweiße 10 Bit. 10 Bit entsprechen einer Stufung von 1024.&lt;br /&gt;
# Ermitteln des digitalen Werts der analogen Größe. In der Beispielrechnung verwende ich den Wert 592.&lt;br /&gt;
# Größe der Referenzspannung. In der Beispielrechnung wird 5V verwendet.&lt;br /&gt;
Mit diesen Werten kann folgende Berechnung ausführen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;V = 592 * 5V&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;V = 2960 / 2 ^{Bit} = 2960 / 2 ^{10} = \underline {\underline { 2{,}9V }}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Programmbeispiele ===&lt;br /&gt;
'''C/C++'''&amp;lt;br&amp;gt;&lt;br /&gt;
Dieses Beispiel ist für die [[Atmel Controller Mega16 und Mega32]] gedacht, die mit einer Taktfrequenz von 8 MHz laufen. Es ist unbedingt darauf zu achten nicht die Referenzspannung von 2,56V zu überschreiten! Sonst stirbt der Port. Je nach Einsatzart muss man das Beispielprogramm entsprechend abändern (also diese Zeile mit ADMUX |= (1&amp;lt;&amp;lt;REFS1) | (1&amp;lt;&amp;lt;REFS0);).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;inttypes.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
uint16_t readADC(uint8_t channel) {&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
	uint16_t result = 0;&lt;br /&gt;
	&lt;br /&gt;
	// Den ADC aktivieren und Teilungsfaktor auf 64 stellen&lt;br /&gt;
	ADCSRA = (1&amp;lt;&amp;lt;ADEN) | (1&amp;lt;&amp;lt;ADPS2) | (1&amp;lt;&amp;lt;ADPS1);&lt;br /&gt;
&lt;br /&gt;
	// Kanal des Multiplexers waehlen&lt;br /&gt;
	ADMUX = channel;&lt;br /&gt;
	// Interne Referenzspannung verwenden (also 2,56 V)&lt;br /&gt;
	ADMUX |= (1&amp;lt;&amp;lt;REFS1) | (1&amp;lt;&amp;lt;REFS0);&lt;br /&gt;
	&lt;br /&gt;
	// Den ADC initialisieren und einen sog. Dummyreadout machen&lt;br /&gt;
	ADCSRA |= (1&amp;lt;&amp;lt;ADSC);&lt;br /&gt;
	while(ADCSRA &amp;amp; (1&amp;lt;&amp;lt;ADSC));&lt;br /&gt;
	&lt;br /&gt;
	// Jetzt 3x die analoge Spannung and Kanal channel auslesen&lt;br /&gt;
	// und dann Durchschnittswert ausrechnen.&lt;br /&gt;
	for(i=0; i&amp;lt;3; i++) {&lt;br /&gt;
		// Eine Wandlung&lt;br /&gt;
		ADCSRA |= (1&amp;lt;&amp;lt;ADSC);&lt;br /&gt;
		// Auf Ergebnis warten...&lt;br /&gt;
		while(ADCSRA &amp;amp; (1&amp;lt;&amp;lt;ADSC));&lt;br /&gt;
		&lt;br /&gt;
		result += ADCW;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// ADC wieder deaktivieren&lt;br /&gt;
	ADCSRA &amp;amp;= ~(1&amp;lt;&amp;lt;ADEN);&lt;br /&gt;
	&lt;br /&gt;
	result /= 3;&lt;br /&gt;
	&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
	uint16_t result = readADC(0);	//Auslesen der analogen Spannungen an Pin 0,&lt;br /&gt;
					// also ADC0. In result steht das Ergebnis.&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bascom'''&amp;lt;br&amp;gt;&lt;br /&gt;
Dieses Programmbeispiel ist für den Atmel Controller Mega32 gedacht. Es gibt nacheinander die Spannungen der einzelnen Kanäle (ADC0..7) aus. Dazwischen macht es immer 800 ms pause.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
' Die gemessene Spannung wird in der Variablen W gespeichert.&lt;br /&gt;
' Channel ist der Pin, an dem die Spannung gemessen werden soll.&lt;br /&gt;
&lt;br /&gt;
$baud = 9600&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
$regfile &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
Config Adc = Single , Prescaler = Auto&lt;br /&gt;
Start Adc&lt;br /&gt;
Dim W As Word , Channel As Byte&lt;br /&gt;
Channel = 0&lt;br /&gt;
Do&lt;br /&gt;
  W = Getadc(channel)&lt;br /&gt;
  Print &amp;quot;ADC-Pin &amp;quot; ; Channel ; &amp;quot;: Wert &amp;quot; ; W&lt;br /&gt;
  Incr Channel&lt;br /&gt;
  If Channel &amp;gt; 7 Then Channel = 0&lt;br /&gt;
  Waitms 800&lt;br /&gt;
Loop&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Registerübersicht ===&lt;br /&gt;
''Hinweis: Diese Registertabellen wurden für den aktuellen [[Atmel Controller Mega16 und Mega32]] erstellt. Wenn Sie ein anderes Modell verwenden kann es sein, dass ein oder mehrere Register nicht existieren, oder sie eine andere Bezeichnung haben.''&lt;br /&gt;
&lt;br /&gt;
{| {{Blaueschmaltabelle}} width=100%&lt;br /&gt;
 |'''ADCSRA (ADC Control and Status Register A)'''&lt;br /&gt;
 |-&lt;br /&gt;
 |Dieser Register dient dazu den ADC zu kontrollieren.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Registertabelle8Bit|ADEN|ADSC|ADATE|ADIF|ADIE|ADPS2|ADPS1|ADPS0}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
*'''ADEN (ADC Enable)'''&amp;lt;br/&amp;gt;Wird dieses Bit gesetzt (also 1), dann wird der ADC aktiviert. Schreibt man eine 0 wird der ADC deaktiert. Wird der ADC während einer Wandlung deaktiviert, wird die Wandlung abgebrochen.&lt;br /&gt;
*'''ADSC (ADC Start Conversion)'''&amp;lt;br/&amp;gt;Dieses Bit startet den Messvorgang, je nachdem in welchem Betriebsmodi der ADC läuft. Wird dieses Bit nach der Aktivierung des ADC über '''ADEN''' zum ersten Mal gesetzt, wird der ADC erst eine Initialisierungswandlung durchführen und danach erst die eigentliche Wandlung. Das Schreiben einer 0 auf das Bit hat keinen Effekt.&lt;br /&gt;
*'''ADATE (ADC Auto Trigger Enable)'''&amp;lt;br/&amp;gt;Wird dieses Bit gesetzt, wird das Auto Triggering des ADC aktiviert.&lt;br /&gt;
*'''ADIF (ADC Interrupt Flag)'''&amp;lt;br/&amp;gt;Dieses Bit wird auf 1 gesetzt, wenn eine Wandlung erfolgte und das Ergebnis nun verfügbar ist. Der ADC Complete Interrupt wird ausgelöst, wenn das '''ADIE'''-Bit gesetzt ist und die Interrupts global aktiviert sind. Das Bit wird gelöscht, wenn die entsprechende [[ISR]] abgearbeitet wird. Alternativ kann man es löschen, indem man eine 1 auf das Bit schreibt.&lt;br /&gt;
*'''ADIE (ADC Interrupt Enable)'''&amp;lt;br/&amp;gt;Wird dieses Bit gesetzt und die globalen Interrupts sind aktiviert, wird der ADC Complete Interrupt aktiviert, auf den man dann in der entsprechenden [[ISR]] reagieren kann.&lt;br /&gt;
*'''ADPS2 (ADC Prescaler Select Bit 2)'''&amp;lt;br/&amp;gt;Diese Bits bestimmen den Teilungsfaktor zwischen der XTAL-Frequenz (also der Taktfrequenz) und dem Eingangstakt des [[ADC]]. Zum Wandeln benötigt der [[ADC]] einen eigenen Takt, der auf der Taktfrequenz des Mikrocontrollers basiert. Allerdings ist die Taktfrequenz zu schnell und deswegen wird diese durch den Vorteiler verkleinert. Der resultierende Takt muss zwischen 50kHz und 200kHz liegen. Siehe [[Avr#Teilungsfaktor]]. Folgende Teilungsfaktoren sind verfügbar:&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''ADPS2'''&lt;br /&gt;
 |'''ADPS1'''&lt;br /&gt;
 |'''ADPS0'''&lt;br /&gt;
 |'''Teilungsfaktor'''&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |2&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |2&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |4&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |8&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |16&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |32&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |64&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |128&lt;br /&gt;
 |}&lt;br /&gt;
*'''ADPS1 (ADC Prescaler Select Bit 1)'''&amp;lt;br/&amp;gt;Siehe '''ADPS2''' für eine Beschreibung.&lt;br /&gt;
*'''ADPS0 (ADC Prescaler Select Bit 0)'''&amp;lt;br/&amp;gt;Siehe '''ADPS2''' für eine Beschreibung.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| {{Blaueschmaltabelle}} width=100%&lt;br /&gt;
 |'''ADMUX (ADC Multiplexer Selection Register)'''&lt;br /&gt;
 |-&lt;br /&gt;
 |Mit diesem Register wird u.a. der Multiplexer gesteuert.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Registertabelle8Bit|REFS1|REFS0|ADLAR|MUX4|MUX3|MUX2|MUX1|MUX0}}&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
*'''REFS1 (Reference Selection Bit 1)'''&amp;lt;br/&amp;gt;Mit diesem Bit kann steuern, welche Referenzspannung der ADC verwenden soll. Die möglichen Quellen sind unten aufgelistet. Wird während einer Wandlung die Quelle für die Referenzspannung geändert, wird die aktuelle Wandlung mit der &amp;quot;alten&amp;quot; Quellen zuerste beendet, bevor die neue Einstellung übernommen wird.&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''REFS1'''&lt;br /&gt;
 |'''REFS0'''&lt;br /&gt;
 |'''Referenzspannungsquelle'''&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |AREF, internes Vref deaktiviert&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |AVCC mit externen Kondensator am AREF Pin&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |Keine Funktion, reserviert&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |Interne 2,56V Spannungsreferenz mit externen Kondensator am AREF Pin&lt;br /&gt;
 |}&lt;br /&gt;
*'''REFS0 (ADC Start Conversion)'''&amp;lt;br/&amp;gt;Siehe '''REFS1'''.&lt;br /&gt;
*'''ADLAR (ADC Left Adjust Result)'''&amp;lt;br/&amp;gt;Dieses Bit beeinflusst, wie der ermittelte Messwert im ADC Data Register abgelegt wird.&lt;br /&gt;
*'''MUX4 (Analog Channel and Gain Selection Bit 4)'''&amp;lt;br/&amp;gt;Dieses Bit wird auf 1 gesetzt, wenn eine Wandlung erfolgte und das Ergebnis nun verfügbar ist. Der ADC Complete Interrupt wird ausgelöst, wenn das '''ADIE'''-Bit gesetzt ist und die Interrupts global aktiviert sind. Das Bit wird gelöscht, wenn die entsprechende ISR abgearbeitet wird. Alternativ kann man es löschen, indem man eine 1 auf das Bit schreibt.&lt;br /&gt;
*'''MUX3 (Analog Channel and Gain Selection Bit 3)'''&amp;lt;br/&amp;gt;Mit diesen Bits ('''MUX3''' bis '''MUX0''') wird der Kanal des Multiplexers eingestellt, der mit dem ADC verbunden ist.&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''MUX4..0'''&lt;br /&gt;
 |'''Pin'''&lt;br /&gt;
|-&lt;br /&gt;
 |00000&lt;br /&gt;
 |ADC0&lt;br /&gt;
|-&lt;br /&gt;
 |00001&lt;br /&gt;
 |ADC1&lt;br /&gt;
|-&lt;br /&gt;
 |00010&lt;br /&gt;
 |ADC2&lt;br /&gt;
|-&lt;br /&gt;
 |00011&lt;br /&gt;
 |ADC3&lt;br /&gt;
|-&lt;br /&gt;
 |00100&lt;br /&gt;
 |ADC4&lt;br /&gt;
|-&lt;br /&gt;
 |00101&lt;br /&gt;
 |ADC5&lt;br /&gt;
|-&lt;br /&gt;
 |00110&lt;br /&gt;
 |ADC6&lt;br /&gt;
|-&lt;br /&gt;
 |00111&lt;br /&gt;
 |ADC7&lt;br /&gt;
 |}&lt;br /&gt;
Es reicht also einfach die Pinnummer in ADMUX zu schreiben.&lt;br /&gt;
*'''MUX2 (Analog Channel and Gain Selection Bit 2)'''&amp;lt;br/&amp;gt;Siehe '''MUX3''' für eine Beschreibung.&lt;br /&gt;
*'''MUX1 (Analog Channel and Gain Selection Bit 1)'''&amp;lt;br/&amp;gt;Siehe '''MUX3''' für eine Beschreibung.&lt;br /&gt;
*'''MUX0 (Analog Channel and Gain Selection Bit 0)'''&amp;lt;br/&amp;gt;Siehe '''MUX3''' für eine Beschreibung.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Des Weiteren gibt es noch den Register '''ADCL/ADCH''' in dem das Ergebnis einer Wandlung steht. Man liest den Wert folgendermaßen aus:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uint16_t x = ADCL;&lt;br /&gt;
x += (ADCH&amp;lt;&amp;lt;8);&lt;br /&gt;
// oder&lt;br /&gt;
x = ADCW;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Analog-Komparator ==&lt;br /&gt;
Für eine allgemeine Beschreibung des Komparators siehe Artikel [[Analog-Komparator]].&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die meisten AVRs haben einen Komparator integriert. Dieser Komparator besitzt zwei Eingänge – einen normalen und einen invertierten. Wie in [[Analog Komparator]] beschrieben vergleicht der Komparator zwei Spannungen und gibt dann aus welche größer ist. Der Komparator der AVRs lässt sich weiter konfigurieren, siehe dazu die Registerübersicht.&lt;br /&gt;
&lt;br /&gt;
=== Funktionsweise ===&lt;br /&gt;
Der Analoge-Komparator vergleicht die Eingangsspannungen der Pins AIN0 (+, Eingang für nicht invertierte Spannung) und AIN1 (-, Eingang für invertierte Spannung). Ist die Spannung an AIN0 höher ist als an AIN1 wird ACO gesetzt. Dieses Verhalten lässt sich natürlich verändern, so dass ACO z.B. auch gesetzt wird, wenn AIN1 höher als AIN0 ist. Siehe dazu die Registerübersicht&lt;br /&gt;
&lt;br /&gt;
=== Kanäle ===&lt;br /&gt;
Muss man mehrere Größen „gleichzeitig“ (ich schreibe das in Anführungszeichen, weil ein Controller Aufgaben nicht parallel verarbeiten kann wohl aber sehr schnell hintereinander) vergleichen, gibt es (wie beim [[Analog-Digital-Wandler]], kurz [[ADC]]) einen Multiplexer mit dessen Hilfe man die Kanäle des Multiplexers auf den Komparator schalten kann. Man kann (natürlich abhängig vom Modell, ich orientiere mich an einem ATmega32) die Pins ADC0..7 über dem Multiplexer mit dem Komparator verbinden und zwar mit dem invertierten Eingang des Komparators. Verwendet man den Multiplexer, muss der [[ADC]] allerdings deaktiviert sein.&lt;br /&gt;
Folgende Pins sind als Eingänge wählbar.&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''ACME'''&lt;br /&gt;
 |'''ADEN'''&lt;br /&gt;
 |'''MUX2..0'''&lt;br /&gt;
 |'''Pin des invertierten Eingangs'''&lt;br /&gt;
|-&lt;br /&gt;
 |0&lt;br /&gt;
 |x&lt;br /&gt;
 |xxx&lt;br /&gt;
 |AIN1&lt;br /&gt;
|-&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |xxx&lt;br /&gt;
 |AIN1&lt;br /&gt;
|-&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |000&lt;br /&gt;
 |ADC0&lt;br /&gt;
|-&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |001&lt;br /&gt;
 |ADC1&lt;br /&gt;
|-&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |010&lt;br /&gt;
 |ADC2&lt;br /&gt;
|-&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |011&lt;br /&gt;
 |ADC3&lt;br /&gt;
|-&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |100&lt;br /&gt;
 |ADC4&lt;br /&gt;
|-&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |101&lt;br /&gt;
 |ADC5&lt;br /&gt;
|-&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |110&lt;br /&gt;
 |ADC6&lt;br /&gt;
|-&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |111&lt;br /&gt;
 |ADC7&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Registerübersicht ===&lt;br /&gt;
''Hinweis: Diese Registertabellen wurden für den aktuellen [[Atmel Controller Mega16 und Mega32]] erstellt. Wenn Sie ein anderes Modell verwenden kann es sein, dass ein oder mehrere Register nicht existieren, oder sie eine andere Bezeichnung haben.''&lt;br /&gt;
&lt;br /&gt;
{| {{Blaueschmaltabelle}} width=100%&lt;br /&gt;
 |'''ACSR (Analog Comparator Control And Status Register)'''&lt;br /&gt;
 |-&lt;br /&gt;
 |Mit diesem Register wird der Komparator des AVR gesteuert.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Registertabelle8Bit|ACD|ACBG|ACO|ACI|ACIE|ACIC|ACIS1|ACIS0}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
*'''ACD (Analog Comparator Disable)'''&amp;lt;br/&amp;gt;Wird dieses Bit gesetzt, wird der Komparator deaktiviert um Strom zu sparen (der Komparator ist standardgemäß deaktiviert). Will man den Komparator mit '''ACD''' deaktivieren, muss man davor den '''ACIE''' (Analog Comparator Interrupt) deaktiveren.&lt;br /&gt;
*'''ACBG (Analog Comparator Bandgap Select)'''&amp;lt;br/&amp;gt;Wird dieses Bit gesetzt, erstetzt eine feste Bandlückenreferenzspannung den positiven Eingang zum Analog-Komparator. Wird dieses Bit auf 0 gesetzt, so wird der Pin AIN0 mit dem positiven Eingang des Komparators verbunden.&lt;br /&gt;
*'''ACO (Analog Comparator Output)'''&amp;lt;br/&amp;gt;Auf diesem Bit wird das Ergebnis des Komparators ausgegeben (mit einer leichten Verzögerung von eins bis zwei Taktzyklen).&lt;br /&gt;
*'''ACI (Analog Comparator Interrupt Flag)'''&amp;lt;br/&amp;gt;Dieses Bit wird automatisch gesetzt, wenn der Komparator einen Interrupt auslöst (definiert über die Bits '''ACIS1''' und '''ACIS0''') und die entsprechende [[ISR]] ausführt. Das Bit wird wieder gelöscht, wenn die entsprechende [[ISR]] abgearbeitet wurde. Alternativ kann man das Bit auch löschen, indem man eine 1 auf das Bit schreibt.&lt;br /&gt;
*'''ACIE (Analog Comparator Interrupt Enable)'''&amp;lt;br/&amp;gt;Wird dieses Bit gesetzt, wird der Analog-Komparator Interrupt aktiviert (vorausgesetzt die Interrupts sind global aktiviert). Wird das Bit gelöscht, werden die Interrupts deaktiviert.&lt;br /&gt;
*'''ACIC (Analog Comparator Input Capture Enable)'''&amp;lt;br/&amp;gt;Noch keine Beschreibung verfügbar. &amp;lt;!-- Vielleicht kann das ja jemand hier beschreiben. --&amp;gt;&lt;br /&gt;
*'''ACIS1 (Analog Comparator Interrupt Mode Select)'''&amp;lt;br/&amp;gt;Diese Bits bestimmen welches Ereignis den Analog-Komparator Interrupt aktiviert. Es sind folgenden Einstellungen vorhanden:&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''ACIS1'''&lt;br /&gt;
 |'''ACIS0'''&lt;br /&gt;
 |'''Interruptmodus'''&lt;br /&gt;
|-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |Interrupt bei Ausgangumschaltung. &amp;lt;!-- Vielleicht kann das ja jemand besser übersetzen... --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |Reserviert (keine Funktion).&lt;br /&gt;
|-&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |Interrupt bei fallender Flanke&lt;br /&gt;
|-&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |Interrupt bei ansteigender Flanke.&lt;br /&gt;
|}&lt;br /&gt;
*'''ACIS0 (Analog Comparator Interrupt Mode Select)'''&amp;lt;br/&amp;gt;Siehe ACIS1 für eine Beschreibung.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| {{Blaueschmaltabelle}} width=100%&lt;br /&gt;
 |'''SFIOR (Special Function IO Register)'''&lt;br /&gt;
 |-&lt;br /&gt;
 |Mit diesem Register lässt sich u.a. der Multiplexer des Komparators aktivieren bzw. deaktivieren.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Registertabelle8Bit|-|-|-|-|ACME|-|-|-}}&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
*'''ACME (Analog Comparator Multiplexer Enable)'''&amp;lt;br/&amp;gt;Wird dieses Bit gesetzt und der [[ADC]] ist deaktiviert (d.h. ADEN aus dem Register ADCSRA ist nicht gesetzt) wählt der Multiplexer den invertierten Eingang zum Analog-Komparator. Wird auf dieses Bit dagegen eine 0 geschrieben, so wird AIN1 mit dem invertierten Eingang des Komparators verbunden. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== TWI/I2C ==&lt;br /&gt;
Für Details über das Two-wire Serial Interface (kurz [[TWI]]) siehe Artikel [[TWI]].&lt;br /&gt;
&lt;br /&gt;
== UART/USART ==&lt;br /&gt;
Für Details über den UART/USART siehe Artikel [[UART]].&lt;br /&gt;
&lt;br /&gt;
== Die Fusebits ==&lt;br /&gt;
Fusebits nennt man bestimmte Bits zur Konfigurierung eines AVR-Controllers. Bei der Auslieferung neuer AVR Controller sind die Fusebits bereits vorkonfiguriert. In vielen Fällen kann man die Konfiguration unverändert belassen, je nach Controllertyp. Bei den Typen Mega xxx bestimmen einige Fusebits beispielsweise, dass der interne Taktgeber aktiviert ist. Möchte man dagegen einen externen Quarz anschließen oder die Taktfrequenz ändern, so müssen auch die Fusebits geändert werden. Auch das Deaktivieren des &amp;quot;[[On Chip Debugging]]&amp;quot; Modus ist oft notwendig, wenn man alle Ports ausnutzen möchte. &lt;br /&gt;
&lt;br /&gt;
Die Fusebits werden in der Regel über die Software eingestellt, welche auch für das Übertragen des Programmcodes zuständig ist. Besonders einfach geht dies beispielsweise mit der Entwicklungsumgebung [[Bascom]]. Aber auch andere Programme wie [[PonyProg]] können für die Umstellung der Fusebits genutzt werden. Einmal eingestellte Fusebits bleiben bis zur erneuten Fusebit-Änderung erhalten. Der normale Programmiermodus verändert die Fusebits nicht. &lt;br /&gt;
&lt;br /&gt;
Je nach AVR Controllertyp sind unterschiedliche Fusebits (Einstellungen) vorhanden. Die genaue Beschreibung findet man im jeweiligen Datenblatt. Da aber falsch gesetzte Fusebit-Einstellungen zu den häufigsten Problemen gehören, liste ich hier die Funktion der üblichen Fusebits nochmals genauer auf:&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''CKSEL0, CKSEL1, CKSEL2, CKSEL3'''&lt;br /&gt;
 |Die Kombination dieser 4 Fusebits bestimmt die Taktquelle des Controllers. Das kann eine interner Taktgenerator, ein Quarz, Quarzoszillator, RC-Glied und ähnliches sein.&lt;br /&gt;
|-&lt;br /&gt;
 |'''JTAGEN'''&lt;br /&gt;
 |Hiermit wird die &amp;quot;[[On Chip Debugging]]&amp;quot; Schnittstelle aktiviert bzw. deaktiviert. Das sind die Bits mit den Bezeichnungen TDI, TDO, TMS und TCK. Möchte man diese Pins als normalen Port nutzen, so muss diese Schnittstelle immer deaktiviert werden. &lt;br /&gt;
|-&lt;br /&gt;
 |'''SUT0, SUT1'''&lt;br /&gt;
 |Die sogenannte StartUp-Zeit (PowerOn delay). Diese Einstellung muss abhängig von der Art des Taktgenerators eingestellt werden, genaueres im jeweiligen Datenblatt. &lt;br /&gt;
|-&lt;br /&gt;
 |'''SPIEN'''&lt;br /&gt;
 |Hiermit kann die serielle [[AVR-ISP Programmierkabel|ISP-Programmierung]], welche die meisten Programmierkabel nutzen, deaktiviert werden. Dies sollte man lieber vermeiden, denn wenn dieser Programmiermodus deaktiviert wurde, kann nur noch der Parallel-Programmiermodus genutzt werden. Der Parallel-Programmiermodus benötigt jedoch ein spezielles Programmiergerät, das die wenigsten Bastler besitzen. ''Also Vorsicht!''&lt;br /&gt;
|-&lt;br /&gt;
 |'''BODEN'''&lt;br /&gt;
 |Über dieses Bit wird der '''Brown-out Detector''' aktiviert bzw. deaktiviert. Dies ist eine Überwachung der Betriebsspannung. Diese Überwachung soll dafür sorgen, dass bei Spannungseinbrüchen ein ordentlicher RESET durchgeführt wird. Dadurch wird verhindert, dass ein Controller in einen undefinierten Zustand gerät (hängen bleibt).&lt;br /&gt;
|-&lt;br /&gt;
 |'''BOOTLEVEL'''&lt;br /&gt;
 |Über dieses  Bit kann die Spannung festgelegt werden, ab welcher der '''Brown-out Detector''' den Controller neu startet (also RESET ausführt). &lt;br /&gt;
|-&lt;br /&gt;
 |'''BOOTRST'''&lt;br /&gt;
 |Gewöhnlich startet ein Programm im Controller nach einem RESET ab Adresse 0. Durch dieses Fusebit kann der Controller jedoch veranlasst werden, nach einem Reset einen sogenannten Bootloader-Bereich auszuführen. Ein [[Bootloader]] kann genutzt werden, um Controller über andere Schnittstellen (z.B. RS232) zu programmieren.&lt;br /&gt;
|-&lt;br /&gt;
 |'''BOOTSZ0, BOOTSZ1'''&lt;br /&gt;
 |Der zuvor genannte Bootloaderbereich kann bei AVR-Controllern verschieden groß sein. Über diese beiden Bits können vier verschiedene Größen eingestellt werden. Siehe unter [[Bootloader]].&lt;br /&gt;
|-&lt;br /&gt;
 |'''EESAVE'''&lt;br /&gt;
 |Dieses Bit legt fest, ob beim Programmieren des Controllers (man nennt es auch brennen) immer das EEPROM gelöscht werden soll.&lt;br /&gt;
|-&lt;br /&gt;
 |'''CKOPT'''&lt;br /&gt;
 |Abhängig von den Einstellungen von CKSEL kann hier dir Oszillator-Verstärkung eingestellt werden. Genaueres im Datenblatt des jeweiligen Controllers.&lt;br /&gt;
|-&lt;br /&gt;
 |'''WDTON'''&lt;br /&gt;
 |Schaltet den WatchDog-Timer beim Booten ein/aus. Dies ist auch per Software möglich&lt;br /&gt;
|-&lt;br /&gt;
 |'''RSTDISBL'''&lt;br /&gt;
 |Durch dieses Bit kann man den RESET-Pin deaktivieren und dann als normalen I/O-Port nutzen. Aber Vorsicht! Da die RESET-Leitung beim Programmieren (Brennen) des Chips genutzt wird, kann man nach dessen Deaktivierung den Controller mit den üblichen [[AVR-ISP Programmierkabel|ISP-Adaptern]] nicht mehr programmieren. In diesem Fall könnte man zwar den Controlle noch mit speziellen Programmiergeräten im Parallelmodus programmieren, aber in der Praxis verfügen nur wenige Bastler über ein Programmiergerät, das dies leistet.&lt;br /&gt;
|-&lt;br /&gt;
 |'''LB1, LB2'''&lt;br /&gt;
 |Das sind die sogenannten Lockbits, mit denen sich das Auslesen des Flash- als auch EEPROM-Speichers verhindern läßt. Zwar können andere Anwender immer noch Daten lesen, allerdings handelt es sich dabei nicht mehr um den wirklichen Inhalt sondern lediglich um wirre Datenbytefolgen. Programmierer, die den erarbeiteten Code vor Raubkopierern schützen wollen, nutzen diese Lockbits. Das Programmieren ist auch bei gesetzen Lockbits noch möglich. Der Bootloader-Bereich wird nicht durch die Lockbits geschützt.&lt;br /&gt;
|-&lt;br /&gt;
 |'''BLB01, BLB02'''&lt;br /&gt;
 |Durch diese Bits kann der Code sogar vor dem Zugriff durch den Bootloader geschützt werden&lt;br /&gt;
|-&lt;br /&gt;
 |'''BLB11, BLB12'''&lt;br /&gt;
 |Diese Bits schützen den Bootloaderbereich selbst&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wie man die Fusebits mit [[Bascom]] einstellt, wird im Beitrag [[Bascom - Erstes Programm in den AVR Controller übertragen]] erläutert.&lt;br /&gt;
&lt;br /&gt;
''Autoren des Artikels: Frank, Luma'' &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Atmel]]&lt;br /&gt;
* [[On Chip Debugging]]&lt;br /&gt;
* [[Bootloader]]&lt;br /&gt;
* [[Avr-gcc|avr-gcc]] - Leistungsfähiger AVR-Port des freien Compilers GCC&lt;br /&gt;
* [[Bascom]] - Sehr gutes Basic-Entwicklungssystem&lt;br /&gt;
* [[WinAVR]] - Ein freies Werkzeugpaket auf Basis avr-gcc für die Windows-Platform, integriert unter anderem das [[Programmer's Notepad]]&lt;br /&gt;
* [[AVR-Einstieg leicht gemacht]]&lt;br /&gt;
* [[Bascom - Erstes Programm in den AVR Controller übertragen]]&lt;br /&gt;
* [[AVR_Assembler_Einf%C3%BChrung|AVR Assembler Einführung (AvrStudio)]]&lt;br /&gt;
* [[AVR-ISP Programmierkabel]] - Bauanleitung für die AVR Controller Programmierkabel&lt;br /&gt;
* [[RN-Control]] - Eines der beliebtestet AVR-Boards im Roboternetz&lt;br /&gt;
* [[RNBFRA-Board]] - Größeres Board mit zwei Atmel Controllern&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.atmel.com/dyn/products/param_table.asp?family_id=607&amp;amp;OrderBy=part_no&amp;amp;Direction=ASC Aktuelle AVR Vergleichstabelle]&lt;br /&gt;
* [http://www.atmel.com/dyn/products/devices.asp?family_id=607 Die Datenblätter zu Atmel Controllern]&lt;br /&gt;
* [https://mpg.dnsalias.com/~magerlu/rn-wiki/avrtimer_applet Java Applet Timer Berechnung]&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/dload.php?action=file&amp;amp;file_id=169 AvrTimer Windows Berechnungstool]&lt;br /&gt;
* [http://people.freenet.de/gjl/helferlein/avr-uart-rechner.html AVR-Baudraten-Rechner (JavaScript)]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Abkürzung|AVR]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Analog-Komparator&amp;diff=7237</id>
		<title>Analog-Komparator</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Analog-Komparator&amp;diff=7237"/>
				<updated>2006-05-06T15:46:59Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein Analog-Komparator vergleicht zwei analoge Spannungsgrößen und gibt aus, welche der beiden Spannungen größer ist.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anwendungsbeispiele für einen Komparator:&lt;br /&gt;
* [[Avr#Analog-Digital-Wandler|Analog-Digital-Wandler]]&lt;br /&gt;
* [[PWM]]&lt;br /&gt;
* Netzteil zur Regelung&lt;br /&gt;
* Triggerschaltungen&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Avr#Analog Komparator|Analog Komparator der AVRs]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Diskussion:Avr&amp;diff=7189</id>
		<title>Diskussion:Avr</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Diskussion:Avr&amp;diff=7189"/>
				<updated>2006-05-05T22:10:13Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: Re: Analog-Digital-Wandler&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Timer Berechnung==&lt;br /&gt;
Bei der Timer Berechnung ist Dir noch Fehler unterlaufen, 8000.0000 / 32 ergibt ganz anderen Wert. Einheiten (Mhz /Hz etc.) auch nicht vergessen! Teilweise ist es für den unbedarften Anwender noch etwas unverständlich wo du gewisse Werte (wie Prescaler 32) plötzlich her bekommst. Du solltest das noch etwas klarer vorrechnen. Bei einfachen Rechnungen muss man nicht den MATH-Befehl nutzen, der andere Font macht sich in einer Aufzählung nicht so sehr gut.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Frank|Frank]] 12:35, 10. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Analog-Digital-Wandler==&lt;br /&gt;
&lt;br /&gt;
Programmbeispiele-&amp;gt;Bascom:&lt;br /&gt;
Zitat: &amp;quot;Dieses Programmbeispiel ist für die Atmel Controller Mega16 und Mega32 gedacht.&amp;quot;&lt;br /&gt;
Stimmt nicht, im Code steht $regfile &amp;quot;m32def.dat&amp;quot;, was also nichts mit dem Mega16 zu tun hat.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Shahri|Shahri]] 14:21, 5. Mai 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Re: Analog-Digital-Wandler ==&lt;br /&gt;
&lt;br /&gt;
Sorry. Ich kenn mich mit Bascom leider überhaupt nicht aus und darauf habe ich leider nicht geachtet. Der Fehler dürfte jetzt korrigiert sein.&lt;br /&gt;
Wenn jemand noch einen anderen Fehler finden sollte, dann korrigiert ihn einfach und schreibt einen entsprechenden Kommentar.&lt;br /&gt;
Luma&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Avr&amp;diff=7188</id>
		<title>Avr</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Avr&amp;diff=7188"/>
				<updated>2006-05-05T22:08:42Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: Kleiner Fehler korrigiert bei Beschreibung für Bascomprogrammbeispiel&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:AtmelController.jpg|thumb|Beispiel eines AVR Controllers]]&lt;br /&gt;
'''AVR''' ist eine 8-Bit [[Microcontroller]]-Familie mit RISC-Architektur.&lt;br /&gt;
Im Gegensatz zu vielen anderen Microcontroller-Architekturen hat die AVR-Architektur keine Vorgänger. Sie ist ein komplettes Neudesign, das Anfang der 90-Jahre an der Universität von Trondheim/Norwegen entwickelt und vom (bis heute einzigen) Hersteller [[Atmel]] aufgekauft wurde. Es gibt eine ganze Serie von AVR-Controllern. Sie alle werden ähnlich programmiert, haben vergleichbaren Befehlssatz und physikalische Eigenschaften, bieten jedoch unterschiedliche Features und Peripherie. &lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche und kostenlose Entwicklungssysteme in den Sprachen Basic, C/C++, Pascal und Assembler für diese Controller-Familie. &lt;br /&gt;
&lt;br /&gt;
== Wofür steht AVR? ==&lt;br /&gt;
&amp;quot;AVR&amp;quot; steht angeblich für ''Advanced Virtual RISC'' (in einem Paper der Entwickler des AVR-Kerns Alf Egin Bogen und Vegard Wollan). Laut [[Atmel]] bedeutet es nichts.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
AVR-Controller besitzen eine zweistufige Pipeline (fetch and execute), die es ermöglicht, die meisten Befehle innerhalb eines einzigen Prozessortaktes auszuführen. Dadurch ist ein AVR wesentlich schneller als etwa 8051-Controller, bei denen der Prozessortakt intern noch durch 12 geteilt wird.&lt;br /&gt;
&lt;br /&gt;
*AVR-Kern&lt;br /&gt;
** Harvard-Architektur (getrennter Befehls- und Datenspeicher) &lt;br /&gt;
** 32 Register, kein Akkumulator, 3 Pointerregister &lt;br /&gt;
** EEPROM-Datenspeicher&lt;br /&gt;
** [[Watchdog]], [[Bootloader]]-Support, verschiedene Stromspar-Modi, Brownout-Erkennung, Interner Oszillator&lt;br /&gt;
** Lineares Speichermodell (keine Segmentierung)&lt;br /&gt;
** 8-Bit Architektur ist für Hochsprachen (C) optimiert &lt;br /&gt;
* In-System programmierbar: die Controller können sehr einfach über ein  Programmierkabel (oft ISP-Kabel genannt), das mit dem PC verbunden wird, programmiert werden &amp;amp;ndash; auch dann, wenn sie sich nicht in einer Schaltung befindet.&lt;br /&gt;
* umfangreiche Peripherie&lt;br /&gt;
** 8- und 16-Bit-Timer/Counter mit [[PWM]], Capture/Compare, externe Betaktung, asynchrone Operation&lt;br /&gt;
** Kommunikation: [[UART|USART]], [[SPI]], [[I2C]] ([[TWI]])&lt;br /&gt;
** Analog-Comparator, Analog-Digital-Wandler &lt;br /&gt;
** unterschiedlichste externe und interne Interrupt-Quellen (UART, SPI, Timer, A/D-Wandler, Analog-Comparator, ...)&lt;br /&gt;
** JTAG (Debugerinterface)&lt;br /&gt;
* AVR Typen (AT90 &amp;quot;Classic AVR&amp;quot;, ATtiny, ATmega) &lt;br /&gt;
* erhältlich in unterschiedlichen Gehäusen, idR Durchsteck und als [[SMD]]&lt;br /&gt;
* Viele Entwicklungsboards erhältlich, z.B. das Roboternetzboard [[RN-Control]]&lt;br /&gt;
&lt;br /&gt;
==Einige Pinbelegungen der populärsten AVR-Controller==&lt;br /&gt;
(in etwa nach Leistungsfähigkeit sortiert)&lt;br /&gt;
&lt;br /&gt;
* [[AT90S2313]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:at90s2313tiny.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Atmel Controller Mega8]]&lt;br /&gt;
* [[Atmel Controller Mega48 Mega88 Mega168]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:mega8kompatibel.png|center]]&lt;br /&gt;
&lt;br /&gt;
* [[Atmel Controller Mega16 und Mega32]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mega1632.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Atmel Controller Mega128]] ([[SMD]]-Chip)&lt;br /&gt;
&lt;br /&gt;
[[Bild:mega128pin.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Die AVR-Pin-Bezeichnungen und deren Funktion ===&lt;br /&gt;
Die meisten Ports sind doppelt belegt und besitzen neben der normalen Port-Funktion noch eine Sonderfunktion. Die verschiedenen Pinbezeichnungen und Sonderfunktionen werden hier beschrieben:&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|+ '''Tabelle: Die AVR-Pin-Bezeichnungen und deren Funktion'''&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Versorgungs- und Referenzpins, Reset&lt;br /&gt;
|-&lt;br /&gt;
 |'''VCC''' &lt;br /&gt;
 | Versorgungsspannung von 2,7 Volt bis 6 V bei den L-Varianten (low power), ansonsten 4,5V bis 6V. Die nächste AVR-Generation soll ab 1,8 Volt funktionieren.&lt;br /&gt;
|-&lt;br /&gt;
 |'''GND''' &lt;br /&gt;
 |Masse &lt;br /&gt;
|-&lt;br /&gt;
 |'''AREF''' &lt;br /&gt;
 |Referenzspannung für den Analog-Digital-Wandler (kann auf 5V gesetzt werden). Auch die interne Bandgap-Referenzspannung kann über diesen Pin entstört werden (dann KEINE externe Spannung an diesen Pin geben (Kurzschluss)!). &lt;br /&gt;
|-&lt;br /&gt;
 |'''AGND''' &lt;br /&gt;
 |Alternative Masse, etwa um ein Verbindungspunkt mit GND zu haben und bei empfindlichen Messungen  Masseschleifen zu vermeiden.&lt;br /&gt;
|-&lt;br /&gt;
 |'''AVCC''' &lt;br /&gt;
 | &lt;br /&gt;
Die Betriebsspannung für den Analog-Digital-Wandler (siehe Beschaltungsskizze). Die Pins AVCC, AGND und AREF sollten immer beschaltet werden, da es sonst passieren kann, dass Port A nicht richtig funktioniert, selbst wenn man den AD-Wandler nicht benutzt. &lt;br /&gt;
|-&lt;br /&gt;
 |'''RESET''' &lt;br /&gt;
 |Rücksetz-Eingang, intern über einen [[Pullup]] mit VCC verbunden. Ein LOW–Pegel an diesem Pin für die Dauer von mindestens zwei Zyklen des Systemtaktes bei aktivem Oszillator setzt den Controller zurück. Rücksetzen der Ports erfolgt unabhängig von einem evtl. anliegenden Systemtakt.&lt;br /&gt;
|-&lt;br /&gt;
|'''PEN'''&lt;br /&gt;
|Programming Enable - Diesen Pin gibt es nur beim Mega128/64 u.ä. Wird dieser Pin beim Power-On Reset nach Masse gezogen, geht der Controller in den [[ISP]] Programmiermodus. Man kann ihn also alternativ zu Reset verwenden. In der Regel verwendet man aber die Reset-Leitung und PEN sollte man direkt mit VCC verbinden.&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| System-Takt&lt;br /&gt;
|-&lt;br /&gt;
 |'''XTAL1''' &lt;br /&gt;
 |Eingang des internen Oszillators zur Erzeugung des Systemtaktes bzw. Eingang für ein externes Taktsignal, wenn der interne Oszillator nicht verwendet werden soll bzw. Anschluss von Quarz/Keramik-Resonator/RC-Glied.&lt;br /&gt;
|-&lt;br /&gt;
 |'''XTAL2''' &lt;br /&gt;
 |Anschluss von Quarz oder Keramik-Resonator oder Ausgang des integrierten Oszillators zur Nutzung als Systemtakt (Je nach Fuse-Einstellungen). &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Digitale bidirektionale  I/O-Ports&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;| Jeder Pin der Ports kann individuell als Eingang oder Ausgang konfiguriert werden. Die I/O-Ports sind maximal 8 Bit breit und verfügen ja nach AVR-Typ über eine unterschiedliche Anzahl von Pins. An jedem als Eingang (Input) geschalteten Pin gibt es zuschaltbare [[Pullup]]-Widerstände, die teilweise auch bei aktivierter Sonderfunkton verfügbar sind.&lt;br /&gt;
&lt;br /&gt;
Bei eingeschalteten Sonderfunktionen wie UART, SPI, ADC, etc. sind die entsprechenden Pins nicht als &amp;quot;normale&amp;quot; digitale I/O verwendbar, sondern dienen der Sonderfunktion. Die Anzahl der als I/O verwendbaren Pins ist auch abhängig von den Fuse-Einstellungen (Vorsicht beim Umstellen, Handbuch GENAU lesen!).&lt;br /&gt;
|-&lt;br /&gt;
|'''PA 0 – 7''' || Port A &lt;br /&gt;
|-&lt;br /&gt;
|'''PB 0 – 7''' || Port B &lt;br /&gt;
|-&lt;br /&gt;
|'''PC 0 – 7''' || Port C &lt;br /&gt;
|-&lt;br /&gt;
|'''PD 0 – 7''' || Port D &lt;br /&gt;
|-&lt;br /&gt;
|'''PE 0 – 7''' || Port E &lt;br /&gt;
|-&lt;br /&gt;
|'''PF 0 – 7''' || Port F &lt;br /&gt;
|-&lt;br /&gt;
|'''PG 0 – 7''' || Port G &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Externe Interrupts&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;| Die PCINT-Interrupts gibt es nur für neuere AVRs wie den [[ATmega88]]. Falls die Anzahl an externen Interrupts nicht ausreicht, kann evtl. auch andere Hardware dafür eingesetzt werden, etwa der Analog-Comparator mit interner Bandgap-Referenz, falls er anderwärtig nicht gebraucht wird.&lt;br /&gt;
|-&lt;br /&gt;
 |'''INT0''' ||Externer Interrupt 0&lt;br /&gt;
|-&lt;br /&gt;
 |'''INT1''' ||Externer Interrupt 1&lt;br /&gt;
|-&lt;br /&gt;
 |'''INT2''' ||Externer Interrupt 2 &lt;br /&gt;
|-&lt;br /&gt;
 |'''PCINTx''' ||Pin-Change Interrupt&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| [[Timer]] und [[PWM]]&lt;br /&gt;
|-&lt;br /&gt;
 |'''T0''' &lt;br /&gt;
 |Timer-Eingang. Timer kann gestartet, gestoppt oder getaktet werden &lt;br /&gt;
|-&lt;br /&gt;
 |'''T1''' &lt;br /&gt;
 |Timer-Eingang. Timer kann gestartet, gestoppt oder getaktet werden &lt;br /&gt;
|-&lt;br /&gt;
 |'''OC0''' &lt;br /&gt;
 |PWM bzw. Output Compare Ausgang des Timers 0 &lt;br /&gt;
|-&lt;br /&gt;
 |'''OC1A''' &lt;br /&gt;
 |Ausgang für die Compare-Funktion des integrierten Zeitgeber- / Zählerbausteines &lt;br /&gt;
Der erste PWM-Ausgang des Timers1. Er kann zum Regeln der Bot-Motogeschwindigkeit benutzt werden. &lt;br /&gt;
|-&lt;br /&gt;
 |'''OC1B''' &lt;br /&gt;
 |Ausgang für die Compare-Funktion des integrierten Zeitgeber- / Zählerbausteines &lt;br /&gt;
Der zweite PWM-Ausgang des Timers1. Er kann zum Regeln der Bot-Motogeschwindigkeit benutzt werden. &lt;br /&gt;
|-&lt;br /&gt;
 |'''ICP1''' &lt;br /&gt;
 |Eingang für die Capture-Funktion des integrierten Zeitgebers / Zählerbausteines &lt;br /&gt;
|-&lt;br /&gt;
 |'''OC2''' &lt;br /&gt;
 |[[Pwm]] bzw. Output Compare Ausgang des Timers2. Er kann zum Regeln der Bot-Motogeschwindigkeit benutzt werden. &lt;br /&gt;
|-&lt;br /&gt;
 |'''TOSC1, TOSC2''' &lt;br /&gt;
 |TOSC1 und TOSC2 sind Eingänge für den asynchronen Modus von Timer2. Sie sind vorgesehen für den Anschluss eines externen Uhrenquarzes ( 32.768 kHz ). Damit lassen sich zum Beispiel sehr genaue Ein-Sekunden-Impulse für eine Uhr generien. &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Analog-Digital-Wandler&lt;br /&gt;
|-&lt;br /&gt;
 |'''ADC0''' bis '''ADC7''' &lt;br /&gt;
 |Eingänge des AD-Wandlers. Spannungen können hier gemessen werden oder an den Analog-Komparator weiter geleitet werden. &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Analog-Komparator&lt;br /&gt;
|-&lt;br /&gt;
 |'''AIN0, AIN1''' &lt;br /&gt;
 |Die beiden externen Eingänge des Analog-Komparators. &lt;br /&gt;
Mit AIN0(+) und AIN1(-) kann man zwei Spannungen miteinander vergleichen. Wenn die Spannung an AIN0 höher als bei AIN1 ist, liefert der Komparator &amp;quot;High&amp;quot;, ansonsten ein &amp;quot;Low&amp;quot;. Als interne Eingänge des Komparators können die Interne Bandgap-Referenzspannung oder Ausgänge des ADC-Multiplexers dienen.&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Serielle Schnittstelle ([[UART|USART]])&lt;br /&gt;
|-&lt;br /&gt;
 |'''RXD''' &lt;br /&gt;
 |Eingang der Seriellen Schnittstelle (Receive Data), TTL-Pegel &lt;br /&gt;
|-&lt;br /&gt;
 |'''TXD''' &lt;br /&gt;
 |Ausgang Serielle Schnittstelle (Transmit Data), TTL-Pegel &lt;br /&gt;
|-&lt;br /&gt;
 |'''XCK''' &lt;br /&gt;
 |Externe Takt für den USART. Wird nur in Sonderfällen für den Takt benötigt. &lt;br /&gt;
USART (&amp;quot;Universal Synchronous/Asynchronous Receiver and Transmitter&amp;quot;). Das ist die serielle Schnittstelle, die zur Datenübertragung zwischen Mikrocontroller und PC genutzt wird. Zur bidirektionalen Übertragung werden zwei Pins am Controller benötigt: TXD und RXD. Über TXD (&amp;quot;Transmit Data&amp;quot;) werden Daten gesendet, RXD (&amp;quot;Receive Data&amp;quot;) dient zum Empfang. &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| [[SPI]]-Schnittstelle&lt;br /&gt;
|-&lt;br /&gt;
 |'''SS''' &lt;br /&gt;
 |SPI-Interface – wird beneötigt um den richtigen Slave am Bus zu wählen &lt;br /&gt;
|-&lt;br /&gt;
 |'''MOSI''' &lt;br /&gt;
 |SPI-Interface – Datenausgang (als Master) oder Dateneingang (als Slave), verwendet bei ISP (In-System-Programmierung)&lt;br /&gt;
|-&lt;br /&gt;
 |'''MISO''' &lt;br /&gt;
 |SPI-Interface – Dateneingang (als Master) oder Datenausgang (als Slave), verwendet bei ISP (In-System-Programmierung)&lt;br /&gt;
|-&lt;br /&gt;
 |'''SCK''' &lt;br /&gt;
 |SPI-Interface – Bustakt vom Master, verwendet bei ISP (In-System-Programmierung)&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| [[I2C|I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C]]-Schnittstelle ([[TWI]])&lt;br /&gt;
|-&lt;br /&gt;
 |'''SDA''' &lt;br /&gt;
 |I2C-Schnittstelle (Bus aus 2 Leitungen) Datenleitung &lt;br /&gt;
|-&lt;br /&gt;
 |'''SCL''' &lt;br /&gt;
 |I2C-Schnittstelle (Bus aus 2 Leitungen) Clockleitung &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| [[JTAG]]-Interface&lt;br /&gt;
|-&lt;br /&gt;
 |'''TDI''' &lt;br /&gt;
 |JTAG-Debug Interface - Über dieses Interface kann man den AVR programmieren und debuggen. Die Schnittstelle ist ähnlich wie die SPI Schnittstelle und hat getrennte Dateneingangs- und Datenausgangsleitungen sowie eine Taktleitung. TDI ist die Dateneingangsleitung&lt;br /&gt;
|-&lt;br /&gt;
 |'''TDO''' &lt;br /&gt;
 |JTAG-Debug Interface - TDO ist die Datenausgangsleitung des JTAG Interface&lt;br /&gt;
|-&lt;br /&gt;
 |'''TMS''' &lt;br /&gt;
 |JTAG-Debug Interface&lt;br /&gt;
|-&lt;br /&gt;
 |'''TCK''' &lt;br /&gt;
 |JTAG-Debug Interface &lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Timer/Counter ==&lt;br /&gt;
&lt;br /&gt;
Die Mikrocontroller der AVR-Familie besitzen je nach Typ eine unterschiedliche Anzahl an programmierbaren [[Timer|Timern]]. Bei den aktuellen ATmegas sind das mindestens ein 8-Bit Timer und bei größeren Ausführungen der Serie auch 16-Bit Timer. Die Timer werden immer Timerx benannt, wobei x für die Timernummer steht (also 0, 1, 2, usw.). &lt;br /&gt;
Die Konfigurationsmöglichkeiten sind von Timer zu Timer unterschiedlich.&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' Die folgenden Code-Beispiele sind in C programmiert und wurden für einen [[ATMega32|ATmega32]] entwickelt. Sie lassen sich also ohne große Änderungen auch auf anderen Mikrocontrollern der AVR-Familie einsetzen.&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine Funktionsweise ===&lt;br /&gt;
Timer funktionieren nach dem allgemeinen Prinzip, dass sie eine Ganzzahl (im weiteren als Zähler bezeichnet) je nach Betriebsmodus auf- oder abwärtszählen, d.h. inkrementieren bzw. dekrementieren.&lt;br /&gt;
&lt;br /&gt;
Angenommen, der Timer arbeitet im einfachsten Betriebsmodus, dem normalen Modus (siehe [[Avr#Normaler Modus (Normal Mode)|Normaler Modus (Normal Mode)]]). Die Zählrichtung des Timers ist aufsteigend gerichtet. Je nach Auflösung, also 8-Bit oder 16-Bit, erreicht der Zähler irgendwann einen bestimmten Zustand. Möglich wäre, dass er überläuft, wenn z.B. bei einem 8-Bit Timer der Wert 255 inkrementiert wird (siehe Grafik).&lt;br /&gt;
&lt;br /&gt;
[[Bild:AbstrakterZaehlvorgang.png]]&lt;br /&gt;
&lt;br /&gt;
=== Der Prescaler ===&lt;br /&gt;
Der Prescaler (eng. = Vorteiler) kann dazu genutzt werden, den Takt, der den Timern zugeführt wird, zu verkleinern. U.a. kann man damit die Timer so konfigurieren, damit diese in den unterschiedlichsten Frequenzen takten. Hier eine Grafik die den Prescaler veranschaulicht:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Prescaler.png]]&lt;br /&gt;
&lt;br /&gt;
Das obere Diagramm zeigt den Betrieb ohne Prescaler, das untere mit Prescaler. Die gestrichelte Linie zeigt, wann ein Interrupt eintritt.&lt;br /&gt;
&lt;br /&gt;
Im Teil [[Avr#Die Betriebsmodi|Die Betriebsmodi]] wird weiter auf die praktische Verwendung des Prescalers eingegangen.&lt;br /&gt;
&lt;br /&gt;
=== Die Betriebsmodi ===&lt;br /&gt;
Die AVR-Timer können in unterschiedlichen Betriebsmodi betrieben werden. Diese sind:&lt;br /&gt;
* Normaler Modus&lt;br /&gt;
* CTC Modus&lt;br /&gt;
* PWM&lt;br /&gt;
&lt;br /&gt;
==== Normaler Modus (Normal Mode) ====&lt;br /&gt;
Der einfachste Betriebsmodus ist der normale Modus. Er funktioniert wie im Abschnitt  &amp;quot;[[Avr#Allgemeine Funktionsweise|Allgemeine Funktionsweise]]&amp;quot; beschrieben. Die Zählrichtung des Timers ist immer aufsteigend, und irgendwann kommt es zu dem Interrupt Timer-Overflow (welcher in einer passend ISR aufgefangen werden kann). Im einfachsten Fall kann man diesen Modus in folgendem Diagramm darstellen:&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_1.png]]&lt;br /&gt;
&lt;br /&gt;
Der Zähler des Timers (im Diagramm oben, die aufsteigende und dann wieder zurückgesetzte Linie) ist in dem Register TCNTx gespeichert, wobei x für eine Zahl steht. Soll z.B. auf den Timer0 (siehe Datenblatt des jeweiligen Controllers) des Controllers zugegriffen werden, so ist an TCNT eine 0 anzuhängen, also TCNT0.&lt;br /&gt;
Wie lange es braucht, bis der Zähler einen Overflow auslöst, ist von der Taktfrequenz des Controllers, dem eingestellten Prescaler-Wert und von der Timerauflösung abhängig. Nun wäre es ja sehr unpraktisch, wenn wir den Zähler nicht anpassen könnten. Denn sonst müssten wir unsere Software die den Timer benutzt evtl. anpassen und viel rechnen um z.B. für 1000 ms zu schlafen. Deswegen kann auf den Zähler zugreifen und ihn vorladen bevor dieser wieder vom eigentlichen Timer hochgezählt wird. Dies veranschaulicht folgendes Diagramm:&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_1_Vorladen.png]]&lt;br /&gt;
&lt;br /&gt;
Dadurch kann man den Timer beeinflussen, und beeinflussen wie lange es dauert, bis ein Overflow auftritt. Um zu berechnen, welchen Wert wir vorladen müssen, kann man auch ein Java-Applet nutzen, siehe unter [[Avr#Weblinks|Weblinks Java Applet]].&lt;br /&gt;
&lt;br /&gt;
Natürlich kann man das auch &amp;quot;von Hand&amp;quot; rechnen. Die Berechnung des Preloader- sowie Prescalerwerts bei Verwendung der Overflow-Interrupts, eines Prescalers von 64 (nicht alle Prescaler können verwendet werden) und eines Quarzes mit der Frequenz von 8 MHz sieht folgendermaßen aus (gesuchte Frequenz beträgt 1000 Hz unter der Verwendung des Timer0 eines ATmega32):&lt;br /&gt;
# &amp;lt;math&amp;gt;Prescale = Frequenz * 1000000 [Hz] = 8000000&amp;lt;/math&amp;gt;&lt;br /&gt;
# Wir definieren den maximalen Zählerwert. Dieser ist bei einem 8-Bit Timer 256, bei einem 16-Bit Timer 65536. In unserem Fall ist der maximale Zählerwert 256, weil Timer0 verwendet wird.&lt;br /&gt;
# Nun wird die Variable ''Prescale'' (s.o.) durch den verwendeten Prescaler (64) geteilt (&amp;lt;math&amp;gt;8000000 Hz / 64 = 125000&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Als nächstes wird der im dritten Punkt errechnete Wert durch die gesuchte Frequenz geteilt &amp;lt;math&amp;gt;=125000 / 1000Hz = 125&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Nun wird mathematisch überprüft, ob der errechnete Wert aus dem vierten Punkt kleiner als der maximale Zählerwert ist. Trifft dies zu, so subtrahiert man den errechneten Wert vom maximalen Zählerwert (&amp;lt;math&amp;gt;= 256 - 125 = 131&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Damit haben wir den Wert errechnet, der bei jedem Interrupt, den der Timer0 auslöst, in TCNTx (in diesem Fall TCNT0) nachgeladen werden muss, damit die Interrupts in dem gewünschten Zeitabstand von einer Millisekunde ausgelöst werden.&lt;br /&gt;
&lt;br /&gt;
Allerdings bleibt zu bemerken, dass bei der Verwendung einer &amp;quot;ungeraden&amp;quot; Quarzfrequenz (z.B. 7,3728 MHz) der Timer mit einer bestimmten Ungenauigkeit arbeitet. Würden wir z.B. den Quarz oben mit einem Quarz mit 7,3728 MHz austauschen, so wäre die Fehlerrate 0,17%. Diese Ungeauigkeit varriert von verwendetem Prescaler zu Prescaler. D.h. wenn wir einen Prescaler von 1024 (und einer Quarzfrequenz von 8 MHz) verwendet hätten, so hätten wir eine inakzeptable Ungeauigkeit von 11,61%. Deswegen sollte sie eines der genannten Programme unter [[Avr#Weblinks]] verwenden, denn diese zeigen nur die bestmögliche Konfiguration an.&lt;br /&gt;
&lt;br /&gt;
Die Fehlerrate kann natürlich auch ausgerechnet werden. Hier die Rechenschritte (sie sind erweiternd zu der oberen Berechnung):&lt;br /&gt;
# Als erstes wird mathematisch überprüft, ob der Preloaderwert (siehe fünften Schritt oben) größer als 1 ist.&lt;br /&gt;
# Trifft dies zu, so wird als nächstes die resultierende Frequenz errechnet. Die geschieht folgendermaßen: Der errechnete Preloaderwert aus der Rechnung oben wird vom maximalen Zählerwert subtrahiert, anschließend mit dem Prescaler multipliziert und dann das Ganze durch die Variable Prescale geteilt &lt;br /&gt;
&amp;lt;math&amp;gt;(256 - 131) \cdot 64 / 8\,000\,000 \mathrm{Hz} \cdot 1\,000\,000 = 1000&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Nun wird die gesuchte Frequenz vom errechneten Wert aus dem dritten Punkt subtrahiert und dann wiederum durch diese geteilt &amp;lt;math&amp;gt;(1000-1000) / 1000 = 0&amp;lt;/math&amp;gt;. Damit läuft dieser Timer genau mit einer Fehlerrate von 0 %.&lt;br /&gt;
&lt;br /&gt;
Betreibt man den Timer im Overflow-Modus, so muss man, wie bereits erwähnt, nach/bei jedem Overflow-Interrupt den Timer nachladen. Der Interrupt heißt in diesem Fall SIG_OVERFLOWx (x steht für die Nummer des Timers). Dieser muss in einer ISR abgefangen werden.&lt;br /&gt;
&lt;br /&gt;
Zusammenfassend ein Beispielprogramm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* Es wird der Timer2 (8-Bit) eines ATmega32 verwendet, der mit einem Quarz mit 7,3728 MHz&lt;br /&gt;
betrieben wird. Im Abstand von 0,001 ms erzeugt der Timer einen Interrupt, also eine&lt;br /&gt;
Frequenz von 1000000 Hz (oder 100 kHz). Der Timer wird auf einen Prescaler von 1 und&lt;br /&gt;
einem Preloader von  183 konfiguriert.*/&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t countTimer2;	// Speichert den aktuellen Zählerwert&lt;br /&gt;
&lt;br /&gt;
// ISR zum auffangen der Interrupts:&lt;br /&gt;
SIGNAL(SIG_SIG_OVERFLOW2)&lt;br /&gt;
{&lt;br /&gt;
	countTimer2++;&lt;br /&gt;
	TCNT2 = 183;		// Nachladen&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Initialisierung:&lt;br /&gt;
TCCR2 = (1&amp;lt;&amp;lt;CS22);		// Prescaler von 1&lt;br /&gt;
TCNT2  = 183;			// Vorladen&lt;br /&gt;
TIMSK |= (1&amp;lt;&amp;lt;TOIE2);		// Interrupts aktivieren und damit Timer starten&lt;br /&gt;
sei();&lt;br /&gt;
&lt;br /&gt;
// Funktionen zum benutzen der Timer:&lt;br /&gt;
/** Diese Funktion nicht aufrufen. Wird von sleep_millisec aufgerufen.&lt;br /&gt;
Bei t=100 schläft die Funktion 1 ms. */&lt;br /&gt;
inline void sleep (uint8_t t)&lt;br /&gt;
{&lt;br /&gt;
	// countTimer2 wird in der ISR oben inkrementiert&lt;br /&gt;
	countTimer2 = 0;&lt;br /&gt;
	while (countTimer2 &amp;lt; t);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** Schläft x-Millisekunden. */&lt;br /&gt;
inline void sleep_millisec(uint16_t msec)&lt;br /&gt;
{&lt;br /&gt;
	uint16_t i;&lt;br /&gt;
	for(i=0; i&amp;lt;msec; i++) {&lt;br /&gt;
		sleep(100);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Allerdings wird auf diese leicht veraltete Technik nun nicht weiter eingegangen. Der Artikel wendet sich nun dem neueren &amp;quot;Compare Output&amp;quot;-Betriebsmodus zu.&lt;br /&gt;
&lt;br /&gt;
Beim &amp;quot;Compare Output&amp;quot;-Betriebsmodus wird genauso ein Zähler hochgezählt. Allerdings wird der Zählerwert nach jeder Inkrementierung mit einem vom Benutzer festgelegten Wert verglichen. Entspricht der Zählerwert dem gespeicherten Wert, so kommt es zu einem Interrupt. Dieser Wert wird in das Register OCRx (x steht wieder für die Timernummer) gespeichert. Je nach Auflösung des Timers ist dieses Register 8-Bit oder 16-Bit breit. &lt;br /&gt;
&lt;br /&gt;
Hinweis: Siehe CTC Modus unten. Dieser wird benötigt um den Timer entsprechend im &amp;quot;Compare Output&amp;quot;-Betriebsmodus vernünftig zu betreiben.&lt;br /&gt;
&lt;br /&gt;
Hier ein typisches Diagramm dieses Betriebsmodus (Hinweis: Das Diagramm wurde unter Verwendung des CTC Modus erstellt. Für Begriffserklärung siehe CTC Modus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_CompareMatch.png]]&lt;br /&gt;
&lt;br /&gt;
Das Ausrechnen des Werts, der in OCRx geschrieben werden muss, damit Frequenz x entsteht, ist nicht sonderlich schwer. Man geht wie bei der Berechnung des Werts für den Overflow-Modus vor (s.o.) nur daß man das resultierende Ergebnis vom maximalen Zählerwert (bei 8-Bit Auflösung ist dieser 256, bei 16-Bit Auflösung 65536) subtrahiert. Das Ergebnis wird dann einmalig in das Register OCRx geschrieben. Mann muss also nicht wie beim Overflow-Modus den Timer nach jedem Interrupt nachladen. Der enstehende Interrupt heißt in diesem Fall SIG_OUTPUT_COMPAREx (x steht für die Nummer des Timers). Dieser muss in einer ISR abgefangen werden.&lt;br /&gt;
&lt;br /&gt;
Wiederum zusammenfassend ein Beispielprogramm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* Es wird der Timer2 (8-Bit) eines ATmega32 verwendet, der mit einem Quarz mit 7,3728 MHz&lt;br /&gt;
betrieben wird. Im Abstand von 0,001 ms erzeugt der Timer einen Interrupt, also eine Frequenz&lt;br /&gt;
von 1000000 Hz (oder 100 kHz). Der Timer wird auf einen Prescaler von 1 und einem OCR2-Wert&lt;br /&gt;
von 73 konfiguriert.*/&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t countTimer2;	// Speichert den aktuellen Zählerwert&lt;br /&gt;
&lt;br /&gt;
// ISR zum auffangen der Interrupts:&lt;br /&gt;
SIGNAL(SIG_OUTPUT_COMPARE2)&lt;br /&gt;
{&lt;br /&gt;
  countTimer2++;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Initialisierung:&lt;br /&gt;
TCCR2 = (1&amp;lt;&amp;lt;CS22) | (1&amp;lt;&amp;lt;WGM21);	// Prescaler von 1 | CTC-Modus (siehe unten für Beschreibung)&lt;br /&gt;
OCR2  = 73;			// Vergleichswert&lt;br /&gt;
TIMSK |= (1&amp;lt;&amp;lt;OCIE2);		// Interrupts aktivieren und damit Timer starten&lt;br /&gt;
sei();&lt;br /&gt;
&lt;br /&gt;
// Funktionen zum benutzen der Timer:&lt;br /&gt;
/** Diese Funktion nicht aufrufen. Wird von sleep_millisec aufgerufen.&lt;br /&gt;
Bei t=100 schläft die Funktion 1 ms. */&lt;br /&gt;
inline void sleep(uint8_t t)&lt;br /&gt;
{&lt;br /&gt;
	// countTimer2 wird in der ISR oben inkrementiert&lt;br /&gt;
	countTimer2 = 0;&lt;br /&gt;
	while (countTimer2 &amp;lt; t);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** Schläft x-Millisekunden. */&lt;br /&gt;
inline void sleep_millisec(uint16_t msec)&lt;br /&gt;
{&lt;br /&gt;
	uint16_t i;&lt;br /&gt;
	for(i=0; i&amp;lt;msec; i++) {&lt;br /&gt;
		sleep(100);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== CTC Modus (Clear Timer on Compare Match mode) ====&lt;br /&gt;
Der CTC Modus ist eine Erweiterung des &amp;quot;Compare Output&amp;quot;-Betriebsmodus. Der CTC Modus wird z.B. für das obere Beispielprogramm benötigt. Wird der Timer nämlich im normalen Betriebsmodus betrieben, so ist seine Zählergrenze je nach Auflösung 255 oder entsprechend für die 16-Bit Timer. Erst wenn diese Grenze erreicht wurde, wird der Timer zurückgesetzt (also auf 0). Durch den CTC Modus wird der Timer augenblicklich automatisch nachdem ein &amp;quot;Compare Output&amp;quot;-Interrupt auftrat zurückgesetzt. Man kann also die maximalen Zählergrenze selber definieren.&lt;br /&gt;
Dieses Diagramm veranschaulicht den CTC Modus. Nach dem Interrupt wird der Timer sofort wieder zurückgesetzt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_CompareMatch.png]]&lt;br /&gt;
&lt;br /&gt;
==== PWM ====&lt;br /&gt;
Für PWM siehe [[Pwm]].&lt;br /&gt;
&lt;br /&gt;
=== Registerübersicht ===&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' Diese Registertabelle wurde für den aktuellen [[Atmel Controller Mega16 und Mega32]] erstellt. Wenn Sie ein anderes Modell verwenden kann es sein, dass ein oder mehrere Register nicht existieren, oder sie eine andere Bezeichnung haben.&lt;br /&gt;
&lt;br /&gt;
{| {{Blaueschmaltabelle}} width=100%&lt;br /&gt;
 |'''TIMSK'''&lt;br /&gt;
 |-&lt;br /&gt;
 |Mit diesem Register, der von allen Timern verwendet wird, lässt sich die Interruptausführung und Art des jeweiligen Timers bestimmen.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Registertabelle8Bit|OCIE2|TOIE2|TICIE1|OCIE1A|OCIE1B|TOIE1|OCIE0|TOIE0}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
*'''OCIE2 (Timer/Counter2 Output Compare Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter2 Compare Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TOIE2 (Timer/Counter2 Overflow Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter2 Overflow Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TICIE1 (Timer/Counter1, Input Capture Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Input Capture Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''OCIE1A (Timer/Counter1 Output Compare A Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Output Compare A Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''OCIE1B (Timer/Counter1 Output Compare B Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Output Compare B Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TOIE1 (Timer/Counter1 Overflow Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Overflow Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''OCIE0 (Timer/Counter0 Output Compare Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, so wird der Timer/Counter0 Compare Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TOIE0 (Timer/Counter0 Overflow Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, so wird der Timer/Counter0 Overflow Interrupt aktiviert  (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Analog-Digital-Wandler ==&lt;br /&gt;
Mit einem Analog-Digital-Wandler (ADC, für Analog Digital Converter) ist es mit den AVRs möglich, auf einfache Art und Weise analoge Größe in digitale Werte umzuwandeln. Dies bietet sich z.B. an, wenn man die Batteriespannung eines Roboters bestimmen möchte.&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine Informationen ===&lt;br /&gt;
Für allgemeine Informationen zu ADCs: siehe [[ADC]].&lt;br /&gt;
&lt;br /&gt;
=== Kanäle ===&lt;br /&gt;
Ein AVR hat normalerweise nur einen ADC integriert. Öfters muss man aber mehrere analoge Größen von verschiedenen Quellen wandeln, deswegen besitzen die AVRs Kanäle (ein ATmega32 z.B. besitzt acht Kanäle auf Port A). Diese Kanäle werden dann mithilfe eines Multiplexer auf den ADC geschalten werden, der dann die anliegenden analoge Spannung in einen digitalten Wert wandelt.&lt;br /&gt;
&lt;br /&gt;
=== Betriebsmodi ===&lt;br /&gt;
Der ADC bietet verschiedene Betriebsmodi. Diese wären:&lt;br /&gt;
* Single Conversation: Der ADC wandelt eine analoge Größe um und gibt diese zurück.&lt;br /&gt;
* Free Running: Der ADC wandelt wie in einer Endlosschleife ständig die anliegenden analogen Größen in digitale Werte um und gibt diese zurück.&lt;br /&gt;
&lt;br /&gt;
=== Teilungsfaktor ===&lt;br /&gt;
Zum Wandeln benötigt der ADC einen eigenen Takt, der auf der Taktfrequenz des Mikrocontrollers basiert. Allerdings ist die Taktfrequenz des Mikrocontrollers zu schnell und deswegen wird diese durch den Vorteiler verkleinert. Der resultierende Takt muss zwischen 50kHz und 200kHz liegen. Folgende Teilungsfaktoren sind verfügbar:&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''Teilungsfaktoren'''&lt;br /&gt;
 |2&lt;br /&gt;
 |4&lt;br /&gt;
 |8&lt;br /&gt;
 |16&lt;br /&gt;
 |32&lt;br /&gt;
 |64&lt;br /&gt;
 |128&lt;br /&gt;
 |}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Um zu bestimmen welcher Teilungsfaktor geeignet ist, kann man folgende Formel verwenden.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Tacktfrequenz = 8 MHz&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Teilungsfaktor_{min} = {Tacktfrequenz \over {200 kHz}} = {{8000000 Hz} \over {200000 Hz}} = 40&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Teilungsfaktor_{max} = {Tacktfrequenz \over {50 kHz}} = {{8000000 Hz} \over {50000 Hz}} = 160&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Deswegen kann man nun zwischen einem der folgenden Teilungsfaktor wählen: 64 und 128. Im Interesse der Geschwindigkeit sollte 64 gewählt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Siehe bitte die Registerübersicht weiter unten. Dort wird gezeigt, welches Register entsprechend eingestellt werden muss, damit man einen der oben aufgelisteten Teilungsfaktoren auswählen kann.&lt;br /&gt;
&lt;br /&gt;
=== Referenzspannung ===&lt;br /&gt;
Das Ergebnis der Wandlung des ADC bezieht sich auf eine bestimmt Referenzspannung. Diese Referenzspannung lässt sich bestimmen. Je nach gewählter Referenzspannung darf man nur eine zu messende Spannung an den Port anlegen, die nicht höher liegt als die Referenzspannung. Sonst würde dieser zerstört werden. Die Referenzspannung ist also gleich der maximal zu messenden Spannung. Um einzustellen welche Referenzspannung verwendet werden soll, gibt es den Register ADMUX. Folgende Quellen sind als Referenzspannung möglich:&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''Referenzspannungsquelle'''&lt;br /&gt;
 |AREF, internes Vref deaktiviert&lt;br /&gt;
 |AVCC mit externen Kondensator am AREF Pin&lt;br /&gt;
 |Keine Funktion, reserviert&lt;br /&gt;
 |Interne 2,56V Spannungsreferenz mit externen Kondensator am AREF Pin&lt;br /&gt;
 |}&lt;br /&gt;
Siehe bitte die Registerübersicht. Dort steht genauer wie man den Register einzustellen hat.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Man benötigt die Referenzspannung auch (oder besserer deren analoge Größe) um den Wert den der ADC zurückgibt in V umzurechnen. Um den zurückgegebenen Wert des ADC umzuwandel geht man so vor:&amp;lt;br&amp;gt;&lt;br /&gt;
# Bestimmen der Auflösung des ADC. Bei den ATMegas normalerweiße 10 Bit. 10 Bit entsprechen einer Stufung von 1024.&lt;br /&gt;
# Ermitteln des digitalen Werts der analogen Größe. In der Beispielrechnung verwende ich den Wert 592.&lt;br /&gt;
# Größe der Referenzspannung. In der Beispielrechnung wird 5V verwendet.&lt;br /&gt;
Mit diesen Werten kann folgende Berechnung ausführen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;V = 592 * 5V&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;V = 2960 / 2 ^{Bit} = 2960 / 2 ^{10} = \underline {\underline { 2{,}9V }}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Programmbeispiele ===&lt;br /&gt;
'''C/C++'''&amp;lt;br&amp;gt;&lt;br /&gt;
Dieses Beispiel ist für die [[Atmel Controller Mega16 und Mega32]] gedacht, die mit einer Taktfrequenz von 8 MHz laufen. Es ist unbedingt darauf zu achten nicht die Referenzspannung von 2,56V zu überschreiten! Sonst stirbt der Port. Je nach Einsatzart muss man das Beispielprogramm entsprechend abändern (also diese Zeile mit ADMUX |= (1&amp;lt;&amp;lt;REFS1) | (1&amp;lt;&amp;lt;REFS0);).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;inttypes.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
uint16_t readADC(uint8_t channel) {&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
	uint16_t result = 0;&lt;br /&gt;
	&lt;br /&gt;
	// Den ADC aktivieren und Teilungsfaktor auf 64 stellen&lt;br /&gt;
	ADCSRA = (1&amp;lt;&amp;lt;ADEN) | (1&amp;lt;&amp;lt;ADPS2) | (1&amp;lt;&amp;lt;ADPS1);&lt;br /&gt;
&lt;br /&gt;
	// Kanal des Multiplexers waehlen&lt;br /&gt;
	ADMUX = channel;&lt;br /&gt;
	// Interne Referenzspannung verwenden (also 2,56 V)&lt;br /&gt;
	ADMUX |= (1&amp;lt;&amp;lt;REFS1) | (1&amp;lt;&amp;lt;REFS0);&lt;br /&gt;
	&lt;br /&gt;
	// Den ADC initialisieren und einen sog. Dummyreadout machen&lt;br /&gt;
	ADCSRA |= (1&amp;lt;&amp;lt;ADSC);&lt;br /&gt;
	while(ADCSRA &amp;amp; (1&amp;lt;&amp;lt;ADSC));&lt;br /&gt;
	&lt;br /&gt;
	// Jetzt 3x die analoge Spannung and Kanal channel auslesen&lt;br /&gt;
	// und dann Durchschnittswert ausrechnen.&lt;br /&gt;
	for(i=0; i&amp;lt;3; i++) {&lt;br /&gt;
		// Eine Wandlung&lt;br /&gt;
		ADCSRA |= (1&amp;lt;&amp;lt;ADSC);&lt;br /&gt;
		// Auf Ergebnis warten...&lt;br /&gt;
		while(ADCSRA &amp;amp; (1&amp;lt;&amp;lt;ADSC));&lt;br /&gt;
		&lt;br /&gt;
		result += ADCW;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// ADC wieder deaktivieren&lt;br /&gt;
	ADCSRA &amp;amp;= ~(1&amp;lt;&amp;lt;ADEN);&lt;br /&gt;
	&lt;br /&gt;
	result /= 3;&lt;br /&gt;
	&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
	uint16_t result = readADC(0);	//Auslesen der analogen Spannungen an Pin 0,&lt;br /&gt;
					// also ADC0. In result steht das Ergebnis.&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bascom'''&amp;lt;br&amp;gt;&lt;br /&gt;
Dieses Programmbeispiel ist für den Atmel Controller Mega32 gedacht. Es gibt nacheinander die Spannungen der einzelnen Kanäle (ADC0..7) aus. Dazwischen macht es immer 800 ms pause.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
' Die gemessene Spannung wird in der Variablen W gespeichert.&lt;br /&gt;
' Channel ist der Pin, an dem die Spannung gemessen werden soll.&lt;br /&gt;
&lt;br /&gt;
$baud = 9600&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
$regfile &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
Config Adc = Single , Prescaler = Auto&lt;br /&gt;
Start Adc&lt;br /&gt;
Dim W As Word , Channel As Byte&lt;br /&gt;
Channel = 0&lt;br /&gt;
Do&lt;br /&gt;
  W = Getadc(channel)&lt;br /&gt;
  Print &amp;quot;ADC-Pin &amp;quot; ; Channel ; &amp;quot;: Wert &amp;quot; ; W&lt;br /&gt;
  Incr Channel&lt;br /&gt;
  If Channel &amp;gt; 7 Then Channel = 0&lt;br /&gt;
  Waitms 800&lt;br /&gt;
Loop&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Registerübersicht ===&lt;br /&gt;
'''Hinweis:''' Diese Registertabellen wurden für den aktuellen [[Atmel Controller Mega16 und Mega32]] erstellt. Wenn Sie ein anderes Modell verwenden kann es sein, dass ein oder mehrere Register nicht existieren, oder sie eine andere Bezeichnung haben.&lt;br /&gt;
&lt;br /&gt;
{| {{Blaueschmaltabelle}} width=100%&lt;br /&gt;
 |'''ADCSRA (ADC Control and Status Register A)'''&lt;br /&gt;
 |-&lt;br /&gt;
 |Dieser Register dient dazu den ADC zu kontrollieren.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Registertabelle8Bit|ADEN|ADSC|ADATE|ADIF|ADIE|ADPS2|ADPS1|ADPS0}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
*'''ADEN (ADC Enable)'''&amp;lt;br/&amp;gt;Wird dieses Bit gesetzt (also 1), dann wird der ADC aktiviert. Schreibt man eine 0 wird der ADC deaktiert. Wird der ADC während einer Wandlung deaktiviert, wird die Wandlung abgebrochen.&lt;br /&gt;
*'''ADSC (ADC Start Conversion)'''&amp;lt;br/&amp;gt;Dieses Bit startet den Messvorgang, je nachdem in welchem Betriebsmodi der ADC läuft. Wird dieses Bit nach der Aktivierung des ADC über '''ADEN''' zum ersten Mal gesetzt, wird der ADC erst eine Initialisierungswandlung durchführen und danach erst die eigentliche Wandlung. Das Schreiben einer 0 auf das Bit hat keinen Effekt.&lt;br /&gt;
*'''ADATE (ADC Auto Trigger Enable)'''&amp;lt;br/&amp;gt;Wird dieses Bit gesetzt, wird das Auto Triggering des ADC aktiviert.&lt;br /&gt;
*'''ADIF (ADC Interrupt Flag)'''&amp;lt;br/&amp;gt;Dieses Bit wird auf 1 gesetzt, wenn eine Wandlung erfolgte und das Ergebnis nun verfügbar ist. Der ADC Complete Interrupt wird ausgelöst, wenn das '''ADIE'''-Bit gesetzt ist und die Interrupts global aktiviert sind. Das Bit wird gelöscht, wenn die entsprechende ISR abgearbeitet wird. Alternativ kann man es löschen, indem man eine 1 auf das Bit schreibt.&lt;br /&gt;
*'''ADIE (ADC Interrupt Enable)'''&amp;lt;br/&amp;gt;Wird dieses Bit gesetzt und die globalen Interrupts sind aktiviert, wird der ADC Complete Interrupt aktiviert, auf den man dann in der entsprechenden ISR reagieren kann.&lt;br /&gt;
*'''ADPS2 (ADC Prescaler Select Bit 2)'''&amp;lt;br/&amp;gt;Diese Bits bestimmen den Teilungsfaktor zwischen der XTAL-Frequenz (also der Taktfrequenz) und dem Eingangstakt des ADC. Zum Wandeln benötigt der ADC einen eigenen Takt, der auf der Taktfrequenz des Mikrocontrollers basiert. Allerdings ist die Taktfrequenz zu schnell und deswegen wird diese durch den Vorteiler verkleinert. Der resultierende Takt muss zwischen 50kHz und 200kHz liegen. Siehe [[Avr#Teilungsfaktor]]. Folgende Teilungsfaktoren sind verfügbar:&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''ADPS2'''&lt;br /&gt;
 |'''ADPS1'''&lt;br /&gt;
 |'''ADPS0'''&lt;br /&gt;
 |'''Teilungsfaktor'''&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |2&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |2&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |4&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |8&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |16&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |32&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |64&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |128&lt;br /&gt;
 |}&lt;br /&gt;
*'''ADPS1 (ADC Prescaler Select Bit 1)'''&amp;lt;br/&amp;gt;Siehe '''ADPS2''' für eine Beschreibung.&lt;br /&gt;
*'''ADPS0 (ADC Prescaler Select Bit 0)'''&amp;lt;br/&amp;gt;Siehe '''ADPS2''' für eine Beschreibung.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| {{Blaueschmaltabelle}} width=100%&lt;br /&gt;
 |'''ADMUX (ADC Multiplexer Selection Register)'''&lt;br /&gt;
 |-&lt;br /&gt;
 |Mit diesem Register wird der Multiplexer gesteuert.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Registertabelle8Bit|REFS1|REFS0|ADLAR|MUX4|MUX3|MUX2|MUX1|MUX0}}&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
*'''REFS1 (Reference Selection Bit 1)'''&amp;lt;br/&amp;gt;Mit diesem Bit kann steuern, welche Referenzspannung der ADC verwenden soll. Die möglichen Quellen sind unten aufgelistet. Wird während einer Wandlung die Quelle für die Referenzspannung geändert, wird die aktuelle Wandlung mit der &amp;quot;alten&amp;quot; Quellen zuerste beendet, bevor die neue Einstellung übernommen wird.&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''REFS1'''&lt;br /&gt;
 |'''REFS0'''&lt;br /&gt;
 |'''Referenzspannungsquelle'''&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |AREF, internes Vref deaktiviert&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |AVCC mit externen Kondensator am AREF Pin&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |Keine Funktion, reserviert&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |Interne 2,56V Spannungsreferenz mit externen Kondensator am AREF Pin&lt;br /&gt;
 |}&lt;br /&gt;
*'''REFS0 (ADC Start Conversion)'''&amp;lt;br/&amp;gt;Siehe '''REFS1'''.&lt;br /&gt;
*'''ADLAR (ADC Left Adjust Result)'''&amp;lt;br/&amp;gt;Dieses Bit beeinflusst, wie der ermittelte Messwert im ADC Data Register abgelegt wird.&lt;br /&gt;
*'''MUX4 (Analog Channel and Gain Selection Bit 4)'''&amp;lt;br/&amp;gt;Dieses Bit wird auf 1 gesetzt, wenn eine Wandlung erfolgte und das Ergebnis nun verfügbar ist. Der ADC Complete Interrupt wird ausgelöst, wenn das '''ADIE'''-Bit gesetzt ist und die Interrupts global aktiviert sind. Das Bit wird gelöscht, wenn die entsprechende ISR abgearbeitet wird. Alternativ kann man es löschen, indem man eine 1 auf das Bit schreibt.&lt;br /&gt;
*'''MUX3 (Analog Channel and Gain Selection Bit 3)'''&amp;lt;br/&amp;gt;Mit diesen Bits ('''MUX3''' bis '''MUX0''') wird der Kanal des Multiplexers eingestellt, der mit dem ADC verbunden ist.&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''MUX4..0'''&lt;br /&gt;
 |'''Pin'''&lt;br /&gt;
|-&lt;br /&gt;
 |00000&lt;br /&gt;
 |ADC0&lt;br /&gt;
|-&lt;br /&gt;
 |00001&lt;br /&gt;
 |ADC1&lt;br /&gt;
|-&lt;br /&gt;
 |00010&lt;br /&gt;
 |ADC2&lt;br /&gt;
|-&lt;br /&gt;
 |00011&lt;br /&gt;
 |ADC3&lt;br /&gt;
|-&lt;br /&gt;
 |00100&lt;br /&gt;
 |ADC4&lt;br /&gt;
|-&lt;br /&gt;
 |00101&lt;br /&gt;
 |ADC5&lt;br /&gt;
|-&lt;br /&gt;
 |00110&lt;br /&gt;
 |ADC6&lt;br /&gt;
|-&lt;br /&gt;
 |00111&lt;br /&gt;
 |ADC7&lt;br /&gt;
 |}&lt;br /&gt;
Es reicht also einfach die Pinnummer in ADMUX zu schreiben.&lt;br /&gt;
*'''MUX2 (Analog Channel and Gain Selection Bit 2)'''&amp;lt;br/&amp;gt;Siehe '''MUX3''' für eine Beschreibung.&lt;br /&gt;
*'''MUX1 (Analog Channel and Gain Selection Bit 1)'''&amp;lt;br/&amp;gt;Siehe '''MUX3''' für eine Beschreibung.&lt;br /&gt;
*'''MUX0 (Analog Channel and Gain Selection Bit 0)'''&amp;lt;br/&amp;gt;Siehe '''MUX3''' für eine Beschreibung.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Des Weiteren gibt es noch den Register '''ADCL/ADCH''' in dem das Ergebnis einer Wandlung steht. Man liest den Wert folgendermaßen aus:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uint16_t x = ADCL;&lt;br /&gt;
x += (ADCH&amp;lt;&amp;lt;8);&lt;br /&gt;
// oder&lt;br /&gt;
x = ADCW;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TWI/I2C ==&lt;br /&gt;
Für Details über das Two-wire Serial Interface (kurz TWI) siehe Artikel [[TWI]].&lt;br /&gt;
&lt;br /&gt;
== UART/USART ==&lt;br /&gt;
Für Details über den UART/USART siehe Artikel [[UART]].&lt;br /&gt;
&lt;br /&gt;
== Die Fusebits ==&lt;br /&gt;
Fusebits nennt man bestimmte Bits zur Konfigurierung eines AVR-Controllers. Bei der Auslieferung neuer AVR Controller sind die Fusebits bereits vorkonfiguriert. In vielen Fällen kann man die Konfiguration unverändert belassen, je nach Controllertyp. Bei den Typen Mega xxx bestimmen einige Fusebits beispielsweise, dass der interne Taktgeber aktiviert ist. Möchte man dagegen einen externen Quarz anschließen oder die Taktfrequenz ändern, so müssen auch die Fusebits geändert werden. Auch das Deaktivieren des &amp;quot;[[On Chip Debugging]]&amp;quot; Modus ist oft notwendig, wenn man alle Ports ausnutzen möchte. &lt;br /&gt;
&lt;br /&gt;
Die Fusebits werden in der Regel über die Software eingestellt, welche auch für das Übertragen des Programmcodes zuständig ist. Besonders einfach geht dies beispielsweise mit der Entwicklungsumgebung [[Bascom]]. Aber auch andere Programme wie [[PonyProg]] können für die Umstellung der Fusebits genutzt werden. Einmal eingestellte Fusebits bleiben bis zur erneuten Fusebit-Änderung erhalten. Der normale Programmiermodus verändert die Fusebits nicht. &lt;br /&gt;
&lt;br /&gt;
Je nach AVR Controllertyp sind unterschiedliche Fusebits (Einstellungen) vorhanden. Die genaue Beschreibung findet man im jeweiligen Datenblatt. Da aber falsch gesetzte Fusebit-Einstellungen zu den häufigsten Problemen gehören, liste ich hier die Funktion der üblichen Fusebits nochmals genauer auf:&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''CKSEL0, CKSEL1, CKSEL2, CKSEL3'''&lt;br /&gt;
 |Die Kombination dieser 4 Fusebits bestimmt die Taktquelle des Controllers. Das kann eine interner Taktgenerator, ein Quarz, Quarzoszillator, RC-Glied und ähnliches sein.&lt;br /&gt;
|-&lt;br /&gt;
 |'''JTAGEN'''&lt;br /&gt;
 |Hiermit wird die &amp;quot;[[On Chip Debugging]]&amp;quot; Schnittstelle aktiviert bzw. deaktiviert. Das sind die Bits mit den Bezeichnungen TDI, TDO, TMS und TCK. Möchte man diese Pins als normalen Port nutzen, so muss diese Schnittstelle immer deaktiviert werden. &lt;br /&gt;
|-&lt;br /&gt;
 |'''SUT0, SUT1'''&lt;br /&gt;
 |Die sogenannte StartUp-Zeit (PowerOn delay). Diese Einstellung muss abhängig von der Art des Taktgenerators eingestellt werden, genaueres im jeweiligen Datenblatt. &lt;br /&gt;
|-&lt;br /&gt;
 |'''SPIEN'''&lt;br /&gt;
 |Hiermit kann die serielle [[AVR-ISP Programmierkabel|ISP-Programmierung]], welche die meisten Programmierkabel nutzen, deaktiviert werden. Dies sollte man lieber vermeiden, denn wenn dieser Programmiermodus deaktiviert wurde, kann nur noch der Parallel-Programmiermodus genutzt werden. Der Parallel-Programmiermodus benötigt jedoch ein spezielles Programmiergerät, das die wenigsten Bastler besitzen. ''Also Vorsicht!''&lt;br /&gt;
|-&lt;br /&gt;
 |'''BODEN'''&lt;br /&gt;
 |Über dieses Bit wird der '''Brown-out Detector''' aktiviert bzw. deaktiviert. Dies ist eine Überwachung der Betriebsspannung. Diese Überwachung soll dafür sorgen, dass bei Spannungseinbrüchen ein ordentlicher RESET durchgeführt wird. Dadurch wird verhindert, dass ein Controller in einen undefinierten Zustand gerät (hängen bleibt).&lt;br /&gt;
|-&lt;br /&gt;
 |'''BOOTLEVEL'''&lt;br /&gt;
 |Über dieses  Bit kann die Spannung festgelegt werden, ab welcher der '''Brown-out Detector''' den Controller neu startet (also RESET ausführt). &lt;br /&gt;
|-&lt;br /&gt;
 |'''BOOTRST'''&lt;br /&gt;
 |Gewöhnlich startet ein Programm im Controller nach einem RESET ab Adresse 0. Durch dieses Fusebit kann der Controller jedoch veranlasst werden, nach einem Reset einen sogenannten Bootloader-Bereich auszuführen. Ein [[Bootloader]] kann genutzt werden, um Controller über andere Schnittstellen (z.B. RS232) zu programmieren.&lt;br /&gt;
|-&lt;br /&gt;
 |'''BOOTSZ0, BOOTSZ1'''&lt;br /&gt;
 |Der zuvor genannte Bootloaderbereich kann bei AVR-Controllern verschieden groß sein. Über diese beiden Bits können vier verschiedene Größen eingestellt werden. Siehe unter [[Bootloader]].&lt;br /&gt;
|-&lt;br /&gt;
 |'''EESAVE'''&lt;br /&gt;
 |Dieses Bit legt fest, ob beim Programmieren des Controllers (man nennt es auch brennen) immer das EEPROM gelöscht werden soll.&lt;br /&gt;
|-&lt;br /&gt;
 |'''CKOPT'''&lt;br /&gt;
 |Abhängig von den Einstellungen von CKSEL kann hier dir Oszillator-Verstärkung eingestellt werden. Genaueres im Datenblatt des jeweiligen Controllers.&lt;br /&gt;
|-&lt;br /&gt;
 |'''WDTON'''&lt;br /&gt;
 |Schaltet den WatchDog-Timer beim Booten ein/aus. Dies ist auch per Software möglich&lt;br /&gt;
|-&lt;br /&gt;
 |'''RSTDISBL'''&lt;br /&gt;
 |Durch dieses Bit kann man den RESET-Pin deaktivieren und dann als normalen I/O-Port nutzen. Aber Vorsicht! Da die RESET-Leitung beim Programmieren (Brennen) des Chips genutzt wird, kann man nach dessen Deaktivierung den Controller mit den üblichen [[AVR-ISP Programmierkabel|ISP-Adaptern]] nicht mehr programmieren. In diesem Fall könnte man zwar den Controlle noch mit speziellen Programmiergeräten im Parallelmodus programmieren, aber in der Praxis verfügen nur wenige Bastler über ein Programmiergerät, das dies leistet.&lt;br /&gt;
|-&lt;br /&gt;
 |'''LB1, LB2'''&lt;br /&gt;
 |Das sind die sogenannten Lockbits, mit denen sich das Auslesen des Flash- als auch EEPROM-Speichers verhindern läßt. Zwar können andere Anwender immer noch Daten lesen, allerdings handelt es sich dabei nicht mehr um den wirklichen Inhalt sondern lediglich um wirre Datenbytefolgen. Programmierer, die den erarbeiteten Code vor Raubkopierern schützen wollen, nutzen diese Lockbits. Das Programmieren ist auch bei gesetzen Lockbits noch möglich. Der Bootloader-Bereich wird nicht durch die Lockbits geschützt.&lt;br /&gt;
|-&lt;br /&gt;
 |'''BLB01, BLB02'''&lt;br /&gt;
 |Durch diese Bits kann der Code sogar vor dem Zugriff durch den Bootloader geschützt werden&lt;br /&gt;
|-&lt;br /&gt;
 |'''BLB11, BLB12'''&lt;br /&gt;
 |Diese Bits schützen den Bootloaderbereich selbst&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wie man die Fusebits mit [[Bascom]] einstellt, wird im Beitrag [[Bascom - Erstes Programm in den AVR Controller übertragen]] erläutert.&lt;br /&gt;
&lt;br /&gt;
''Autoren des Artikels: Frank, Luma'' &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Atmel]]&lt;br /&gt;
* [[On Chip Debugging]]&lt;br /&gt;
* [[Bootloader]]&lt;br /&gt;
* [[Avr-gcc|avr-gcc]] - Leistungsfähiger AVR-Port des freien Compilers GCC&lt;br /&gt;
* [[Bascom]] - Sehr gutes Basic-Entwicklungssystem&lt;br /&gt;
* [[WinAVR]] - Ein freies Werkzeugpaket auf Basis avr-gcc für die Windows-Platform, integriert unter anderem das [[Programmer's Notepad]]&lt;br /&gt;
* [[AVR-Einstieg leicht gemacht]]&lt;br /&gt;
* [[Bascom - Erstes Programm in den AVR Controller übertragen]]&lt;br /&gt;
* [[AVR_Assembler_Einf%C3%BChrung|AVR Assembler Einführung (AvrStudio)]]&lt;br /&gt;
* [[AVR-ISP Programmierkabel]] - Bauanleitung für die AVR Controller Programmierkabel&lt;br /&gt;
* [[RN-Control]] - Eines der beliebtestet AVR-Boards im Roboternetz&lt;br /&gt;
* [[RNBFRA-Board]] - Größeres Board mit zwei Atmel Controllern&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
* [http://www.atmel.com/dyn/products/param_table.asp?family_id=607&amp;amp;OrderBy=part_no&amp;amp;Direction=ASC Aktuelle AVR Vergleichstabelle]&lt;br /&gt;
* [http://www.atmel.com/dyn/products/devices.asp?family_id=607 Die Datenblätter zu Atmel Controllern]&lt;br /&gt;
* [https://mpg.dnsalias.com/~magerlu/rn-wiki/avrtimer_applet Java Applet Timer Berechnung]&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/dload.php?action=file&amp;amp;file_id=169 AvrTimer Windows Berechnungstool]&lt;br /&gt;
* [http://people.freenet.de/gjl/helferlein/avr-uart-rechner.html AVR-Baudraten-Rechner (JavaScript)]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Abkürzung|AVR]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Avr&amp;diff=7182</id>
		<title>Avr</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Avr&amp;diff=7182"/>
				<updated>2006-05-04T21:42:12Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: /* UART/USART */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:AtmelController.jpg|thumb|Beispiel eines AVR Controllers]]&lt;br /&gt;
'''AVR''' ist eine 8-Bit [[Microcontroller]]-Familie mit RISC-Architektur.&lt;br /&gt;
Im Gegensatz zu vielen anderen Microcontroller-Architekturen hat die AVR-Architektur keine Vorgänger. Sie ist ein komplettes Neudesign, das Anfang der 90-Jahre an der Universität von Trondheim/Norwegen entwickelt und vom (bis heute einzigen) Hersteller [[Atmel]] aufgekauft wurde. Es gibt eine ganze Serie von AVR-Controllern. Sie alle werden ähnlich programmiert, haben vergleichbaren Befehlssatz und physikalische Eigenschaften, bieten jedoch unterschiedliche Features und Peripherie. &lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche und kostenlose Entwicklungssysteme in den Sprachen Basic, C/C++, Pascal und Assembler für diese Controller-Familie. &lt;br /&gt;
&lt;br /&gt;
== Wofür steht AVR? ==&lt;br /&gt;
&amp;quot;AVR&amp;quot; steht angeblich für ''Advanced Virtual RISC'' (in einem Paper der Entwickler des AVR-Kerns Alf Egin Bogen und Vegard Wollan). Laut [[Atmel]] bedeutet es nichts.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
AVR-Controller besitzen eine zweistufige Pipeline (fetch and execute), die es ermöglicht, die meisten Befehle innerhalb eines einzigen Prozessortaktes auszuführen. Dadurch ist ein AVR wesentlich schneller als etwa 8051-Controller, bei denen der Prozessortakt intern noch durch 12 geteilt wird.&lt;br /&gt;
&lt;br /&gt;
*AVR-Kern&lt;br /&gt;
** Harvard-Architektur (getrennter Befehls- und Datenspeicher) &lt;br /&gt;
** 32 Register, kein Akkumulator, 3 Pointerregister &lt;br /&gt;
** EEPROM-Datenspeicher&lt;br /&gt;
** [[Watchdog]], [[Bootloader]]-Support, verschiedene Stromspar-Modi, Brownout-Erkennung, Interner Oszillator&lt;br /&gt;
** Lineares Speichermodell (keine Segmentierung)&lt;br /&gt;
** 8-Bit Architektur ist für Hochsprachen (C) optimiert &lt;br /&gt;
* In-System programmierbar: die Controller können sehr einfach über ein  Programmierkabel (oft ISP-Kabel genannt), das mit dem PC verbunden wird, programmiert werden &amp;amp;ndash; auch dann, wenn sie sich nicht in einer Schaltung befindet.&lt;br /&gt;
* umfangreiche Peripherie&lt;br /&gt;
** 8- und 16-Bit-Timer/Counter mit [[PWM]], Capture/Compare, externe Betaktung, asynchrone Operation&lt;br /&gt;
** Kommunikation: [[UART|USART]], [[SPI]], [[I2C]] ([[TWI]])&lt;br /&gt;
** Analog-Comparator, Analog-Digital-Wandler &lt;br /&gt;
** unterschiedlichste externe und interne Interrupt-Quellen (UART, SPI, Timer, A/D-Wandler, Analog-Comparator, ...)&lt;br /&gt;
** JTAG (Debugerinterface)&lt;br /&gt;
* AVR Typen (AT90 &amp;quot;Classic AVR&amp;quot;, ATtiny, ATmega) &lt;br /&gt;
* erhältlich in unterschiedlichen Gehäusen, idR Durchsteck und als [[SMD]]&lt;br /&gt;
* Viele Entwicklungsboards erhältlich, z.B. das Roboternetzboard [[RN-Control]]&lt;br /&gt;
&lt;br /&gt;
==Einige Pinbelegungen der populärsten AVR-Controller==&lt;br /&gt;
(in etwa nach Leistungsfähigkeit sortiert)&lt;br /&gt;
&lt;br /&gt;
* [[AT90S2313]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:at90s2313tiny.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Atmel Controller Mega8]]&lt;br /&gt;
* [[Atmel Controller Mega48 Mega88 Mega168]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:mega8kompatibel.png|center]]&lt;br /&gt;
&lt;br /&gt;
* [[Atmel Controller Mega16 und Mega32]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mega1632.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Atmel Controller Mega128]] ([[SMD]]-Chip)&lt;br /&gt;
&lt;br /&gt;
[[Bild:mega128pin.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Die AVR-Pin-Bezeichnungen und deren Funktion ===&lt;br /&gt;
Die meisten Ports sind doppelt belegt und besitzen neben der normalen Port-Funktion noch eine Sonderfunktion. Die verschiedenen Pinbezeichnungen und Sonderfunktionen werden hier beschrieben:&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|+ '''Tabelle: Die AVR-Pin-Bezeichnungen und deren Funktion'''&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Versorgungs- und Referenzpins, Reset&lt;br /&gt;
|-&lt;br /&gt;
 |'''VCC''' &lt;br /&gt;
 | Versorgungsspannung von 2,7 Volt bis 6 V bei den L-Varianten (low power), ansonsten 4,5V bis 6V. Die nächste AVR-Generation soll ab 1,8 Volt funktionieren.&lt;br /&gt;
|-&lt;br /&gt;
 |'''GND''' &lt;br /&gt;
 |Masse &lt;br /&gt;
|-&lt;br /&gt;
 |'''AREF''' &lt;br /&gt;
 |Referenzspannung für den Analog-Digital-Wandler (kann auf 5V gesetzt werden). Auch die interne Bandgap-Referenzspannung kann über diesen Pin entstört werden (dann KEINE externe Spannung an diesen Pin geben (Kurzschluss)!). &lt;br /&gt;
|-&lt;br /&gt;
 |'''AGND''' &lt;br /&gt;
 |Alternative Masse, etwa um ein Verbindungspunkt mit GND zu haben und bei empfindlichen Messungen  Masseschleifen zu vermeiden.&lt;br /&gt;
|-&lt;br /&gt;
 |'''AVCC''' &lt;br /&gt;
 | &lt;br /&gt;
Die Betriebsspannung für den Analog-Digital-Wandler (siehe Beschaltungsskizze). Die Pins AVCC, AGND und AREF sollten immer beschaltet werden, da es sonst passieren kann, dass Port A nicht richtig funktioniert, selbst wenn man den AD-Wandler nicht benutzt. &lt;br /&gt;
|-&lt;br /&gt;
 |'''RESET''' &lt;br /&gt;
 |Rücksetz-Eingang, intern über einen [[Pullup]] mit VCC verbunden. Ein LOW–Pegel an diesem Pin für die Dauer von mindestens zwei Zyklen des Systemtaktes bei aktivem Oszillator setzt den Controller zurück. Rücksetzen der Ports erfolgt unabhängig von einem evtl. anliegenden Systemtakt.&lt;br /&gt;
|-&lt;br /&gt;
|'''PEN'''&lt;br /&gt;
|Programming Enable - Diesen Pin gibt es nur beim Mega128/64 u.ä. Wird dieser Pin beim Power-On Reset nach Masse gezogen, geht der Controller in den [[ISP]] Programmiermodus. Man kann ihn also alternativ zu Reset verwenden. In der Regel verwendet man aber die Reset-Leitung und PEN sollte man direkt mit VCC verbinden.&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| System-Takt&lt;br /&gt;
|-&lt;br /&gt;
 |'''XTAL1''' &lt;br /&gt;
 |Eingang des internen Oszillators zur Erzeugung des Systemtaktes bzw. Eingang für ein externes Taktsignal, wenn der interne Oszillator nicht verwendet werden soll bzw. Anschluss von Quarz/Keramik-Resonator/RC-Glied.&lt;br /&gt;
|-&lt;br /&gt;
 |'''XTAL2''' &lt;br /&gt;
 |Anschluss von Quarz oder Keramik-Resonator oder Ausgang des integrierten Oszillators zur Nutzung als Systemtakt (Je nach Fuse-Einstellungen). &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Digitale bidirektionale  I/O-Ports&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;| Jeder Pin der Ports kann individuell als Eingang oder Ausgang konfiguriert werden. Die I/O-Ports sind maximal 8 Bit breit und verfügen ja nach AVR-Typ über eine unterschiedliche Anzahl von Pins. An jedem als Eingang (Input) geschalteten Pin gibt es zuschaltbare [[Pullup]]-Widerstände, die teilweise auch bei aktivierter Sonderfunkton verfügbar sind.&lt;br /&gt;
&lt;br /&gt;
Bei eingeschalteten Sonderfunktionen wie UART, SPI, ADC, etc. sind die entsprechenden Pins nicht als &amp;quot;normale&amp;quot; digitale I/O verwendbar, sondern dienen der Sonderfunktion. Die Anzahl der als I/O verwendbaren Pins ist auch abhängig von den Fuse-Einstellungen (Vorsicht beim Umstellen, Handbuch GENAU lesen!).&lt;br /&gt;
|-&lt;br /&gt;
|'''PA 0 – 7''' || Port A &lt;br /&gt;
|-&lt;br /&gt;
|'''PB 0 – 7''' || Port B &lt;br /&gt;
|-&lt;br /&gt;
|'''PC 0 – 7''' || Port C &lt;br /&gt;
|-&lt;br /&gt;
|'''PD 0 – 7''' || Port D &lt;br /&gt;
|-&lt;br /&gt;
|'''PE 0 – 7''' || Port E &lt;br /&gt;
|-&lt;br /&gt;
|'''PF 0 – 7''' || Port F &lt;br /&gt;
|-&lt;br /&gt;
|'''PG 0 – 7''' || Port G &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Externe Interrupts&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;| Die PCINT-Interrupts gibt es nur für neuere AVRs wie den [[ATmega88]]. Falls die Anzahl an externen Interrupts nicht ausreicht, kann evtl. auch andere Hardware dafür eingesetzt werden, etwa der Analog-Comparator mit interner Bandgap-Referenz, falls er anderwärtig nicht gebraucht wird.&lt;br /&gt;
|-&lt;br /&gt;
 |'''INT0''' ||Externer Interrupt 0&lt;br /&gt;
|-&lt;br /&gt;
 |'''INT1''' ||Externer Interrupt 1&lt;br /&gt;
|-&lt;br /&gt;
 |'''INT2''' ||Externer Interrupt 2 &lt;br /&gt;
|-&lt;br /&gt;
 |'''PCINTx''' ||Pin-Change Interrupt&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| [[Timer]] und [[PWM]]&lt;br /&gt;
|-&lt;br /&gt;
 |'''T0''' &lt;br /&gt;
 |Timer-Eingang. Timer kann gestartet, gestoppt oder getaktet werden &lt;br /&gt;
|-&lt;br /&gt;
 |'''T1''' &lt;br /&gt;
 |Timer-Eingang. Timer kann gestartet, gestoppt oder getaktet werden &lt;br /&gt;
|-&lt;br /&gt;
 |'''OC0''' &lt;br /&gt;
 |PWM bzw. Output Compare Ausgang des Timers 0 &lt;br /&gt;
|-&lt;br /&gt;
 |'''OC1A''' &lt;br /&gt;
 |Ausgang für die Compare-Funktion des integrierten Zeitgeber- / Zählerbausteines &lt;br /&gt;
Der erste PWM-Ausgang des Timers1. Er kann zum Regeln der Bot-Motogeschwindigkeit benutzt werden. &lt;br /&gt;
|-&lt;br /&gt;
 |'''OC1B''' &lt;br /&gt;
 |Ausgang für die Compare-Funktion des integrierten Zeitgeber- / Zählerbausteines &lt;br /&gt;
Der zweite PWM-Ausgang des Timers1. Er kann zum Regeln der Bot-Motogeschwindigkeit benutzt werden. &lt;br /&gt;
|-&lt;br /&gt;
 |'''ICP1''' &lt;br /&gt;
 |Eingang für die Capture-Funktion des integrierten Zeitgebers / Zählerbausteines &lt;br /&gt;
|-&lt;br /&gt;
 |'''OC2''' &lt;br /&gt;
 |[[Pwm]] bzw. Output Compare Ausgang des Timers2. Er kann zum Regeln der Bot-Motogeschwindigkeit benutzt werden. &lt;br /&gt;
|-&lt;br /&gt;
 |'''TOSC1, TOSC2''' &lt;br /&gt;
 |TOSC1 und TOSC2 sind Eingänge für den asynchronen Modus von Timer2. Sie sind vorgesehen für den Anschluss eines externen Uhrenquarzes ( 32.768 kHz ). Damit lassen sich zum Beispiel sehr genaue Ein-Sekunden-Impulse für eine Uhr generien. &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Analog-Digital-Wandler&lt;br /&gt;
|-&lt;br /&gt;
 |'''ADC0''' bis '''ADC7''' &lt;br /&gt;
 |Eingänge des AD-Wandlers. Spannungen können hier gemessen werden oder an den Analog-Komparator weiter geleitet werden. &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Analog-Komparator&lt;br /&gt;
|-&lt;br /&gt;
 |'''AIN0, AIN1''' &lt;br /&gt;
 |Die beiden externen Eingänge des Analog-Komparators. &lt;br /&gt;
Mit AIN0(+) und AIN1(-) kann man zwei Spannungen miteinander vergleichen. Wenn die Spannung an AIN0 höher als bei AIN1 ist, liefert der Komparator &amp;quot;High&amp;quot;, ansonsten ein &amp;quot;Low&amp;quot;. Als interne Eingänge des Komparators können die Interne Bandgap-Referenzspannung oder Ausgänge des ADC-Multiplexers dienen.&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Serielle Schnittstelle ([[UART|USART]])&lt;br /&gt;
|-&lt;br /&gt;
 |'''RXD''' &lt;br /&gt;
 |Eingang der Seriellen Schnittstelle (Receive Data), TTL-Pegel &lt;br /&gt;
|-&lt;br /&gt;
 |'''TXD''' &lt;br /&gt;
 |Ausgang Serielle Schnittstelle (Transmit Data), TTL-Pegel &lt;br /&gt;
|-&lt;br /&gt;
 |'''XCK''' &lt;br /&gt;
 |Externe Takt für den USART. Wird nur in Sonderfällen für den Takt benötigt. &lt;br /&gt;
USART (&amp;quot;Universal Synchronous/Asynchronous Receiver and Transmitter&amp;quot;). Das ist die serielle Schnittstelle, die zur Datenübertragung zwischen Mikrocontroller und PC genutzt wird. Zur bidirektionalen Übertragung werden zwei Pins am Controller benötigt: TXD und RXD. Über TXD (&amp;quot;Transmit Data&amp;quot;) werden Daten gesendet, RXD (&amp;quot;Receive Data&amp;quot;) dient zum Empfang. &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| [[SPI]]-Schnittstelle&lt;br /&gt;
|-&lt;br /&gt;
 |'''SS''' &lt;br /&gt;
 |SPI-Interface – wird beneötigt um den richtigen Slave am Bus zu wählen &lt;br /&gt;
|-&lt;br /&gt;
 |'''MOSI''' &lt;br /&gt;
 |SPI-Interface – Datenausgang (als Master) oder Dateneingang (als Slave), verwendet bei ISP (In-System-Programmierung)&lt;br /&gt;
|-&lt;br /&gt;
 |'''MISO''' &lt;br /&gt;
 |SPI-Interface – Dateneingang (als Master) oder Datenausgang (als Slave), verwendet bei ISP (In-System-Programmierung)&lt;br /&gt;
|-&lt;br /&gt;
 |'''SCK''' &lt;br /&gt;
 |SPI-Interface – Bustakt vom Master, verwendet bei ISP (In-System-Programmierung)&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| [[I2C|I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C]]-Schnittstelle ([[TWI]])&lt;br /&gt;
|-&lt;br /&gt;
 |'''SDA''' &lt;br /&gt;
 |I2C-Schnittstelle (Bus aus 2 Leitungen) Datenleitung &lt;br /&gt;
|-&lt;br /&gt;
 |'''SCL''' &lt;br /&gt;
 |I2C-Schnittstelle (Bus aus 2 Leitungen) Clockleitung &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| [[JTAG]]-Interface&lt;br /&gt;
|-&lt;br /&gt;
 |'''TDI''' &lt;br /&gt;
 |JTAG-Debug Interface - Über dieses Interface kann man den AVR programmieren und debuggen. Die Schnittstelle ist ähnlich wie die SPI Schnittstelle und hat getrennte Dateneingangs- und Datenausgangsleitungen sowie eine Taktleitung. TDI ist die Dateneingangsleitung&lt;br /&gt;
|-&lt;br /&gt;
 |'''TDO''' &lt;br /&gt;
 |JTAG-Debug Interface - TDO ist die Datenausgangsleitung des JTAG Interface&lt;br /&gt;
|-&lt;br /&gt;
 |'''TMS''' &lt;br /&gt;
 |JTAG-Debug Interface&lt;br /&gt;
|-&lt;br /&gt;
 |'''TCK''' &lt;br /&gt;
 |JTAG-Debug Interface &lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Timer/Counter ==&lt;br /&gt;
&lt;br /&gt;
Die Mikrocontroller der AVR-Familie besitzen je nach Typ eine unterschiedliche Anzahl an programmierbaren [[Timer|Timern]]. Bei den aktuellen ATmegas sind das mindestens ein 8-Bit Timer und bei größeren Ausführungen der Serie auch 16-Bit Timer. Die Timer werden immer Timerx benannt, wobei x für die Timernummer steht (also 0, 1, 2, usw.). &lt;br /&gt;
Die Konfigurationsmöglichkeiten sind von Timer zu Timer unterschiedlich.&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' Die folgenden Code-Beispiele sind in C programmiert und wurden für einen [[ATMega32|ATmega32]] entwickelt. Sie lassen sich also ohne große Änderungen auch auf anderen Mikrocontrollern der AVR-Familie einsetzen.&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine Funktionsweise ===&lt;br /&gt;
Timer funktionieren nach dem allgemeinen Prinzip, dass sie eine Ganzzahl (im weiteren als Zähler bezeichnet) je nach Betriebsmodus auf- oder abwärtszählen, d.h. inkrementieren bzw. dekrementieren.&lt;br /&gt;
&lt;br /&gt;
Angenommen, der Timer arbeitet im einfachsten Betriebsmodus, dem normalen Modus (siehe [[Avr#Normaler Modus (Normal Mode)|Normaler Modus (Normal Mode)]]). Die Zählrichtung des Timers ist aufsteigend gerichtet. Je nach Auflösung, also 8-Bit oder 16-Bit, erreicht der Zähler irgendwann einen bestimmten Zustand. Möglich wäre, dass er überläuft, wenn z.B. bei einem 8-Bit Timer der Wert 255 inkrementiert wird (siehe Grafik).&lt;br /&gt;
&lt;br /&gt;
[[Bild:AbstrakterZaehlvorgang.png]]&lt;br /&gt;
&lt;br /&gt;
=== Der Prescaler ===&lt;br /&gt;
Der Prescaler (eng. = Vorteiler) kann dazu genutzt werden, den Takt, der den Timern zugeführt wird, zu verkleinern. U.a. kann man damit die Timer so konfigurieren, damit diese in den unterschiedlichsten Frequenzen takten. Hier eine Grafik die den Prescaler veranschaulicht:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Prescaler.png]]&lt;br /&gt;
&lt;br /&gt;
Das obere Diagramm zeigt den Betrieb ohne Prescaler, das untere mit Prescaler. Die gestrichelte Linie zeigt, wann ein Interrupt eintritt.&lt;br /&gt;
&lt;br /&gt;
Im Teil [[Avr#Die Betriebsmodi|Die Betriebsmodi]] wird weiter auf die praktische Verwendung des Prescalers eingegangen.&lt;br /&gt;
&lt;br /&gt;
=== Die Betriebsmodi ===&lt;br /&gt;
Die AVR-Timer können in unterschiedlichen Betriebsmodi betrieben werden. Diese sind:&lt;br /&gt;
* Normaler Modus&lt;br /&gt;
* CTC Modus&lt;br /&gt;
* PWM&lt;br /&gt;
&lt;br /&gt;
==== Normaler Modus (Normal Mode) ====&lt;br /&gt;
Der einfachste Betriebsmodus ist der normale Modus. Er funktioniert wie im Abschnitt  &amp;quot;[[Avr#Allgemeine Funktionsweise|Allgemeine Funktionsweise]]&amp;quot; beschrieben. Die Zählrichtung des Timers ist immer aufsteigend, und irgendwann kommt es zu dem Interrupt Timer-Overflow (welcher in einer passend ISR aufgefangen werden kann). Im einfachsten Fall kann man diesen Modus in folgendem Diagramm darstellen:&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_1.png]]&lt;br /&gt;
&lt;br /&gt;
Der Zähler des Timers (im Diagramm oben, die aufsteigende und dann wieder zurückgesetzte Linie) ist in dem Register TCNTx gespeichert, wobei x für eine Zahl steht. Soll z.B. auf den Timer0 (siehe Datenblatt des jeweiligen Controllers) des Controllers zugegriffen werden, so ist an TCNT eine 0 anzuhängen, also TCNT0.&lt;br /&gt;
Wie lange es braucht, bis der Zähler einen Overflow auslöst, ist von der Taktfrequenz des Controllers, dem eingestellten Prescaler-Wert und von der Timerauflösung abhängig. Nun wäre es ja sehr unpraktisch, wenn wir den Zähler nicht anpassen könnten. Denn sonst müssten wir unsere Software die den Timer benutzt evtl. anpassen und viel rechnen um z.B. für 1000 ms zu schlafen. Deswegen kann auf den Zähler zugreifen und ihn vorladen bevor dieser wieder vom eigentlichen Timer hochgezählt wird. Dies veranschaulicht folgendes Diagramm:&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_1_Vorladen.png]]&lt;br /&gt;
&lt;br /&gt;
Dadurch kann man den Timer beeinflussen, und beeinflussen wie lange es dauert, bis ein Overflow auftritt. Um zu berechnen, welchen Wert wir vorladen müssen, kann man auch ein Java-Applet nutzen, siehe unter [[Avr#Weblinks|Weblinks Java Applet]].&lt;br /&gt;
&lt;br /&gt;
Natürlich kann man das auch &amp;quot;von Hand&amp;quot; rechnen. Die Berechnung des Preloader- sowie Prescalerwerts bei Verwendung der Overflow-Interrupts, eines Prescalers von 64 (nicht alle Prescaler können verwendet werden) und eines Quarzes mit der Frequenz von 8 MHz sieht folgendermaßen aus (gesuchte Frequenz beträgt 1000 Hz unter der Verwendung des Timer0 eines ATmega32):&lt;br /&gt;
# &amp;lt;math&amp;gt;Prescale = Frequenz * 1000000 [Hz] = 8000000&amp;lt;/math&amp;gt;&lt;br /&gt;
# Wir definieren den maximalen Zählerwert. Dieser ist bei einem 8-Bit Timer 256, bei einem 16-Bit Timer 65536. In unserem Fall ist der maximale Zählerwert 256, weil Timer0 verwendet wird.&lt;br /&gt;
# Nun wird die Variable ''Prescale'' (s.o.) durch den verwendeten Prescaler (64) geteilt (&amp;lt;math&amp;gt;8000000 Hz / 64 = 125000&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Als nächstes wird der im dritten Punkt errechnete Wert durch die gesuchte Frequenz geteilt &amp;lt;math&amp;gt;=125000 / 1000Hz = 125&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Nun wird mathematisch überprüft, ob der errechnete Wert aus dem vierten Punkt kleiner als der maximale Zählerwert ist. Trifft dies zu, so subtrahiert man den errechneten Wert vom maximalen Zählerwert (&amp;lt;math&amp;gt;= 256 - 125 = 131&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Damit haben wir den Wert errechnet, der bei jedem Interrupt, den der Timer0 auslöst, in TCNTx (in diesem Fall TCNT0) nachgeladen werden muss, damit die Interrupts in dem gewünschten Zeitabstand von einer Millisekunde ausgelöst werden.&lt;br /&gt;
&lt;br /&gt;
Allerdings bleibt zu bemerken, dass bei der Verwendung einer &amp;quot;ungeraden&amp;quot; Quarzfrequenz (z.B. 7,3728 MHz) der Timer mit einer bestimmten Ungenauigkeit arbeitet. Würden wir z.B. den Quarz oben mit einem Quarz mit 7,3728 MHz austauschen, so wäre die Fehlerrate 0,17%. Diese Ungeauigkeit varriert von verwendetem Prescaler zu Prescaler. D.h. wenn wir einen Prescaler von 1024 (und einer Quarzfrequenz von 8 MHz) verwendet hätten, so hätten wir eine inakzeptable Ungeauigkeit von 11,61%. Deswegen sollte sie eines der genannten Programme unter [[Avr#Weblinks]] verwenden, denn diese zeigen nur die bestmögliche Konfiguration an.&lt;br /&gt;
&lt;br /&gt;
Die Fehlerrate kann natürlich auch ausgerechnet werden. Hier die Rechenschritte (sie sind erweiternd zu der oberen Berechnung):&lt;br /&gt;
# Als erstes wird mathematisch überprüft, ob der Preloaderwert (siehe fünften Schritt oben) größer als 1 ist.&lt;br /&gt;
# Trifft dies zu, so wird als nächstes die resultierende Frequenz errechnet. Die geschieht folgendermaßen: Der errechnete Preloaderwert aus der Rechnung oben wird vom maximalen Zählerwert subtrahiert, anschließend mit dem Prescaler multipliziert und dann das Ganze durch die Variable Prescale geteilt &lt;br /&gt;
&amp;lt;math&amp;gt;(256 - 131) \cdot 64 / 8\,000\,000 \mathrm{Hz} \cdot 1\,000\,000 = 1000&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Nun wird die gesuchte Frequenz vom errechneten Wert aus dem dritten Punkt subtrahiert und dann wiederum durch diese geteilt &amp;lt;math&amp;gt;(1000-1000) / 1000 = 0&amp;lt;/math&amp;gt;. Damit läuft dieser Timer genau mit einer Fehlerrate von 0 %.&lt;br /&gt;
&lt;br /&gt;
Betreibt man den Timer im Overflow-Modus, so muss man, wie bereits erwähnt, nach/bei jedem Overflow-Interrupt den Timer nachladen. Der Interrupt heißt in diesem Fall SIG_OVERFLOWx (x steht für die Nummer des Timers). Dieser muss in einer ISR abgefangen werden.&lt;br /&gt;
&lt;br /&gt;
Zusammenfassend ein Beispielprogramm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* Es wird der Timer2 (8-Bit) eines ATmega32 verwendet, der mit einem Quarz mit 7,3728 MHz&lt;br /&gt;
betrieben wird. Im Abstand von 0,001 ms erzeugt der Timer einen Interrupt, also eine&lt;br /&gt;
Frequenz von 1000000 Hz (oder 100 kHz). Der Timer wird auf einen Prescaler von 1 und&lt;br /&gt;
einem Preloader von  183 konfiguriert.*/&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t countTimer2;	// Speichert den aktuellen Zählerwert&lt;br /&gt;
&lt;br /&gt;
// ISR zum auffangen der Interrupts:&lt;br /&gt;
SIGNAL(SIG_SIG_OVERFLOW2)&lt;br /&gt;
{&lt;br /&gt;
	countTimer2++;&lt;br /&gt;
	TCNT2 = 183;		// Nachladen&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Initialisierung:&lt;br /&gt;
TCCR2 = (1&amp;lt;&amp;lt;CS22);		// Prescaler von 1&lt;br /&gt;
TCNT2  = 183;			// Vorladen&lt;br /&gt;
TIMSK |= (1&amp;lt;&amp;lt;TOIE2);		// Interrupts aktivieren und damit Timer starten&lt;br /&gt;
sei();&lt;br /&gt;
&lt;br /&gt;
// Funktionen zum benutzen der Timer:&lt;br /&gt;
/** Diese Funktion nicht aufrufen. Wird von sleep_millisec aufgerufen.&lt;br /&gt;
Bei t=100 schläft die Funktion 1 ms. */&lt;br /&gt;
inline void sleep (uint8_t t)&lt;br /&gt;
{&lt;br /&gt;
	// countTimer2 wird in der ISR oben inkrementiert&lt;br /&gt;
	countTimer2 = 0;&lt;br /&gt;
	while (countTimer2 &amp;lt; t);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** Schläft x-Millisekunden. */&lt;br /&gt;
inline void sleep_millisec(uint16_t msec)&lt;br /&gt;
{&lt;br /&gt;
	uint16_t i;&lt;br /&gt;
	for(i=0; i&amp;lt;msec; i++) {&lt;br /&gt;
		sleep(100);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Allerdings wird auf diese leicht veraltete Technik nun nicht weiter eingegangen. Der Artikel wendet sich nun dem neueren &amp;quot;Compare Output&amp;quot;-Betriebsmodus zu.&lt;br /&gt;
&lt;br /&gt;
Beim &amp;quot;Compare Output&amp;quot;-Betriebsmodus wird genauso ein Zähler hochgezählt. Allerdings wird der Zählerwert nach jeder Inkrementierung mit einem vom Benutzer festgelegten Wert verglichen. Entspricht der Zählerwert dem gespeicherten Wert, so kommt es zu einem Interrupt. Dieser Wert wird in das Register OCRx (x steht wieder für die Timernummer) gespeichert. Je nach Auflösung des Timers ist dieses Register 8-Bit oder 16-Bit breit. &lt;br /&gt;
&lt;br /&gt;
Hinweis: Siehe CTC Modus unten. Dieser wird benötigt um den Timer entsprechend im &amp;quot;Compare Output&amp;quot;-Betriebsmodus vernünftig zu betreiben.&lt;br /&gt;
&lt;br /&gt;
Hier ein typisches Diagramm dieses Betriebsmodus (Hinweis: Das Diagramm wurde unter Verwendung des CTC Modus erstellt. Für Begriffserklärung siehe CTC Modus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_CompareMatch.png]]&lt;br /&gt;
&lt;br /&gt;
Das Ausrechnen des Werts, der in OCRx geschrieben werden muss, damit Frequenz x entsteht, ist nicht sonderlich schwer. Man geht wie bei der Berechnung des Werts für den Overflow-Modus vor (s.o.) nur daß man das resultierende Ergebnis vom maximalen Zählerwert (bei 8-Bit Auflösung ist dieser 256, bei 16-Bit Auflösung 65536) subtrahiert. Das Ergebnis wird dann einmalig in das Register OCRx geschrieben. Mann muss also nicht wie beim Overflow-Modus den Timer nach jedem Interrupt nachladen. Der enstehende Interrupt heißt in diesem Fall SIG_OUTPUT_COMPAREx (x steht für die Nummer des Timers). Dieser muss in einer ISR abgefangen werden.&lt;br /&gt;
&lt;br /&gt;
Wiederum zusammenfassend ein Beispielprogramm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* Es wird der Timer2 (8-Bit) eines ATmega32 verwendet, der mit einem Quarz mit 7,3728 MHz&lt;br /&gt;
betrieben wird. Im Abstand von 0,001 ms erzeugt der Timer einen Interrupt, also eine Frequenz&lt;br /&gt;
von 1000000 Hz (oder 100 kHz). Der Timer wird auf einen Prescaler von 1 und einem OCR2-Wert&lt;br /&gt;
von 73 konfiguriert.*/&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t countTimer2;	// Speichert den aktuellen Zählerwert&lt;br /&gt;
&lt;br /&gt;
// ISR zum auffangen der Interrupts:&lt;br /&gt;
SIGNAL(SIG_OUTPUT_COMPARE2)&lt;br /&gt;
{&lt;br /&gt;
  countTimer2++;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Initialisierung:&lt;br /&gt;
TCCR2 = (1&amp;lt;&amp;lt;CS22) | (1&amp;lt;&amp;lt;WGM21);	// Prescaler von 1 | CTC-Modus (siehe unten für Beschreibung)&lt;br /&gt;
OCR2  = 73;			// Vergleichswert&lt;br /&gt;
TIMSK |= (1&amp;lt;&amp;lt;OCIE2);		// Interrupts aktivieren und damit Timer starten&lt;br /&gt;
sei();&lt;br /&gt;
&lt;br /&gt;
// Funktionen zum benutzen der Timer:&lt;br /&gt;
/** Diese Funktion nicht aufrufen. Wird von sleep_millisec aufgerufen.&lt;br /&gt;
Bei t=100 schläft die Funktion 1 ms. */&lt;br /&gt;
inline void sleep(uint8_t t)&lt;br /&gt;
{&lt;br /&gt;
	// countTimer2 wird in der ISR oben inkrementiert&lt;br /&gt;
	countTimer2 = 0;&lt;br /&gt;
	while (countTimer2 &amp;lt; t);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** Schläft x-Millisekunden. */&lt;br /&gt;
inline void sleep_millisec(uint16_t msec)&lt;br /&gt;
{&lt;br /&gt;
	uint16_t i;&lt;br /&gt;
	for(i=0; i&amp;lt;msec; i++) {&lt;br /&gt;
		sleep(100);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== CTC Modus (Clear Timer on Compare Match mode) ====&lt;br /&gt;
Der CTC Modus ist eine Erweiterung des &amp;quot;Compare Output&amp;quot;-Betriebsmodus. Der CTC Modus wird z.B. für das obere Beispielprogramm benötigt. Wird der Timer nämlich im normalen Betriebsmodus betrieben, so ist seine Zählergrenze je nach Auflösung 255 oder entsprechend für die 16-Bit Timer. Erst wenn diese Grenze erreicht wurde, wird der Timer zurückgesetzt (also auf 0). Durch den CTC Modus wird der Timer augenblicklich automatisch nachdem ein &amp;quot;Compare Output&amp;quot;-Interrupt auftrat zurückgesetzt. Man kann also die maximalen Zählergrenze selber definieren.&lt;br /&gt;
Dieses Diagramm veranschaulicht den CTC Modus. Nach dem Interrupt wird der Timer sofort wieder zurückgesetzt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_CompareMatch.png]]&lt;br /&gt;
&lt;br /&gt;
==== PWM ====&lt;br /&gt;
Für PWM siehe [[Pwm]].&lt;br /&gt;
&lt;br /&gt;
=== Registerübersicht ===&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' Diese Registertabelle wurde für den aktuellen [[Atmel Controller Mega16 und Mega32]] erstellt. Wenn Sie ein anderes Modell verwenden kann es sein, dass ein oder mehrere Register nicht existieren, oder sie eine andere Bezeichnung haben.&lt;br /&gt;
&lt;br /&gt;
{| {{Blaueschmaltabelle}} width=100%&lt;br /&gt;
 |'''TIMSK'''&lt;br /&gt;
 |-&lt;br /&gt;
 |Mit diesem Register, der von allen Timern verwendet wird, lässt sich die Interruptausführung und Art des jeweiligen Timers bestimmen.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Registertabelle8Bit|OCIE2|TOIE2|TICIE1|OCIE1A|OCIE1B|TOIE1|OCIE0|TOIE0}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
*'''OCIE2 (Timer/Counter2 Output Compare Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter2 Compare Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TOIE2 (Timer/Counter2 Overflow Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter2 Overflow Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TICIE1 (Timer/Counter1, Input Capture Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Input Capture Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''OCIE1A (Timer/Counter1 Output Compare A Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Output Compare A Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''OCIE1B (Timer/Counter1 Output Compare B Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Output Compare B Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TOIE1 (Timer/Counter1 Overflow Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Overflow Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''OCIE0 (Timer/Counter0 Output Compare Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, so wird der Timer/Counter0 Compare Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TOIE0 (Timer/Counter0 Overflow Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, so wird der Timer/Counter0 Overflow Interrupt aktiviert  (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Analog-Digital-Wandler ==&lt;br /&gt;
Mit einem Analog-Digital-Wandler (ADC, für Analog Digital Converter) ist es mit den AVRs möglich, auf einfache Art und Weise analoge Größe in digitale Werte umzuwandeln. Dies bietet sich z.B. an, wenn man die Batteriespannung eines Roboters bestimmen möchte.&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine Informationen ===&lt;br /&gt;
Für allgemeine Informationen zu ADCs: siehe [[ADC]].&lt;br /&gt;
&lt;br /&gt;
=== Kanäle ===&lt;br /&gt;
Ein AVR hat normalerweise nur einen ADC integriert. Öfters muss man aber mehrere analoge Größen von verschiedenen Quellen wandeln, deswegen besitzen die AVRs Kanäle (ein ATmega32 z.B. besitzt acht Kanäle auf Port A). Diese Kanäle werden dann mithilfe eines Multiplexer auf den ADC geschalten werden, der dann die anliegenden analoge Spannung in einen digitalten Wert wandelt.&lt;br /&gt;
&lt;br /&gt;
=== Betriebsmodi ===&lt;br /&gt;
Der ADC bietet verschiedene Betriebsmodi. Diese wären:&lt;br /&gt;
* Single Conversation: Der ADC wandelt eine analoge Größe um und gibt diese zurück.&lt;br /&gt;
* Free Running: Der ADC wandelt wie in einer Endlosschleife ständig die anliegenden analogen Größen in digitale Werte um und gibt diese zurück.&lt;br /&gt;
&lt;br /&gt;
=== Teilungsfaktor ===&lt;br /&gt;
Zum Wandeln benötigt der ADC einen eigenen Takt, der auf der Taktfrequenz des Mikrocontrollers basiert. Allerdings ist die Taktfrequenz des Mikrocontrollers zu schnell und deswegen wird diese durch den Vorteiler verkleinert. Der resultierende Takt muss zwischen 50kHz und 200kHz liegen. Folgende Teilungsfaktoren sind verfügbar:&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''Teilungsfaktoren'''&lt;br /&gt;
 |2&lt;br /&gt;
 |4&lt;br /&gt;
 |8&lt;br /&gt;
 |16&lt;br /&gt;
 |32&lt;br /&gt;
 |64&lt;br /&gt;
 |128&lt;br /&gt;
 |}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Um zu bestimmen welcher Teilungsfaktor geeignet ist, kann man folgende Formel verwenden.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Tacktfrequenz = 8 MHz&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Teilungsfaktor_{min} = {Tacktfrequenz \over {200 kHz}} = {{8000000 Hz} \over {200000 Hz}} = 40&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Teilungsfaktor_{max} = {Tacktfrequenz \over {50 kHz}} = {{8000000 Hz} \over {50000 Hz}} = 160&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Deswegen kann man nun zwischen einem der folgenden Teilungsfaktor wählen: 64 und 128. Im Interesse der Geschwindigkeit sollte 64 gewählt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Siehe bitte die Registerübersicht weiter unten. Dort wird gezeigt, welches Register entsprechend eingestellt werden muss, damit man einen der oben aufgelisteten Teilungsfaktoren auswählen kann.&lt;br /&gt;
&lt;br /&gt;
=== Referenzspannung ===&lt;br /&gt;
Das Ergebnis der Wandlung des ADC bezieht sich auf eine bestimmt Referenzspannung. Diese Referenzspannung lässt sich bestimmen. Je nach gewählter Referenzspannung darf man nur eine zu messende Spannung an den Port anlegen, die nicht höher liegt als die Referenzspannung. Sonst würde dieser zerstört werden. Die Referenzspannung ist also gleich der maximal zu messenden Spannung. Um einzustellen welche Referenzspannung verwendet werden soll, gibt es den Register ADMUX. Folgende Quellen sind als Referenzspannung möglich:&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''Referenzspannungsquelle'''&lt;br /&gt;
 |AREF, internes Vref deaktiviert&lt;br /&gt;
 |AVCC mit externen Kondensator am AREF Pin&lt;br /&gt;
 |Keine Funktion, reserviert&lt;br /&gt;
 |Interne 2,56V Spannungsreferenz mit externen Kondensator am AREF Pin&lt;br /&gt;
 |}&lt;br /&gt;
Siehe bitte die Registerübersicht. Dort steht genauer wie man den Register einzustellen hat.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Man benötigt die Referenzspannung auch (oder besserer deren analoge Größe) um den Wert den der ADC zurückgibt in V umzurechnen. Um den zurückgegebenen Wert des ADC umzuwandel geht man so vor:&amp;lt;br&amp;gt;&lt;br /&gt;
# Bestimmen der Auflösung des ADC. Bei den ATMegas normalerweiße 10 Bit. 10 Bit entsprechen einer Stufung von 1024.&lt;br /&gt;
# Ermitteln des digitalen Werts der analogen Größe. In der Beispielrechnung verwende ich den Wert 592.&lt;br /&gt;
# Größe der Referenzspannung. In der Beispielrechnung wird 5V verwendet.&lt;br /&gt;
Mit diesen Werten kann folgende Berechnung ausführen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;V = 592 * 5V&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;V = 2960 / 2 ^{Bit} = 2960 / 2 ^{10} = \underline {\underline { 2{,}9V }}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Programmbeispiele ===&lt;br /&gt;
'''C/C++'''&amp;lt;br&amp;gt;&lt;br /&gt;
Dieses Beispiel ist für die [[Atmel Controller Mega16 und Mega32]] gedacht, die mit einer Taktfrequenz von 8 MHz laufen. Es ist unbedingt darauf zu achten nicht die Referenzspannung von 2,56V zu überschreiten! Sonst stirbt der Port. Je nach Einsatzart muss man das Beispielprogramm entsprechend abändern (also diese Zeile mit ADMUX |= (1&amp;lt;&amp;lt;REFS1) | (1&amp;lt;&amp;lt;REFS0);).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;inttypes.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
uint16_t readADC(uint8_t channel) {&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
	uint16_t result = 0;&lt;br /&gt;
	&lt;br /&gt;
	// Den ADC aktivieren und Teilungsfaktor auf 64 stellen&lt;br /&gt;
	ADCSRA = (1&amp;lt;&amp;lt;ADEN) | (1&amp;lt;&amp;lt;ADPS2) | (1&amp;lt;&amp;lt;ADPS1);&lt;br /&gt;
&lt;br /&gt;
	// Kanal des Multiplexers waehlen&lt;br /&gt;
	ADMUX = channel;&lt;br /&gt;
	// Interne Referenzspannung verwenden (also 2,56 V)&lt;br /&gt;
	ADMUX |= (1&amp;lt;&amp;lt;REFS1) | (1&amp;lt;&amp;lt;REFS0);&lt;br /&gt;
	&lt;br /&gt;
	// Den ADC initialisieren und einen sog. Dummyreadout machen&lt;br /&gt;
	ADCSRA |= (1&amp;lt;&amp;lt;ADSC);&lt;br /&gt;
	while(ADCSRA &amp;amp; (1&amp;lt;&amp;lt;ADSC));&lt;br /&gt;
	&lt;br /&gt;
	// Jetzt 3x die analoge Spannung and Kanal channel auslesen&lt;br /&gt;
	// und dann Durchschnittswert ausrechnen.&lt;br /&gt;
	for(i=0; i&amp;lt;3; i++) {&lt;br /&gt;
		// Eine Wandlung&lt;br /&gt;
		ADCSRA |= (1&amp;lt;&amp;lt;ADSC);&lt;br /&gt;
		// Auf Ergebnis warten...&lt;br /&gt;
		while(ADCSRA &amp;amp; (1&amp;lt;&amp;lt;ADSC));&lt;br /&gt;
		&lt;br /&gt;
		result += ADCW;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// ADC wieder deaktivieren&lt;br /&gt;
	ADCSRA &amp;amp;= ~(1&amp;lt;&amp;lt;ADEN);&lt;br /&gt;
	&lt;br /&gt;
	result /= 3;&lt;br /&gt;
	&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
	uint16_t result = readADC(0);	//Auslesen der analogen Spannungen an Pin 0,&lt;br /&gt;
					// also ADC0. In result steht das Ergebnis.&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bascom'''&amp;lt;br&amp;gt;&lt;br /&gt;
Dieses Programmbeispiel ist für die [[Atmel Controller Mega16 und Mega32]] gedacht. Es gibt nacheinander die Spannungen der einzelnen Kanäle (ADC0..7) aus. Dazwischen macht es immer 800 ms pause.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
' Die gemessene Spannung wird in der Variablen W gespeichert.&lt;br /&gt;
' Channel ist der Pin, an dem die Spannung gemessen werden soll.&lt;br /&gt;
&lt;br /&gt;
$baud = 9600&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
$regfile &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
Config Adc = Single , Prescaler = Auto&lt;br /&gt;
Start Adc&lt;br /&gt;
Dim W As Word , Channel As Byte&lt;br /&gt;
Channel = 0&lt;br /&gt;
Do&lt;br /&gt;
  W = Getadc(channel)&lt;br /&gt;
  Print &amp;quot;ADC-Pin &amp;quot; ; Channel ; &amp;quot;: Wert &amp;quot; ; W&lt;br /&gt;
  Incr Channel&lt;br /&gt;
  If Channel &amp;gt; 7 Then Channel = 0&lt;br /&gt;
  Waitms 800&lt;br /&gt;
Loop&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Registerübersicht ===&lt;br /&gt;
'''Hinweis:''' Diese Registertabellen wurden für den aktuellen [[Atmel Controller Mega16 und Mega32]] erstellt. Wenn Sie ein anderes Modell verwenden kann es sein, dass ein oder mehrere Register nicht existieren, oder sie eine andere Bezeichnung haben.&lt;br /&gt;
&lt;br /&gt;
{| {{Blaueschmaltabelle}} width=100%&lt;br /&gt;
 |'''ADCSRA (ADC Control and Status Register A)'''&lt;br /&gt;
 |-&lt;br /&gt;
 |Dieser Register dient dazu den ADC zu kontrollieren.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Registertabelle8Bit|ADEN|ADSC|ADATE|ADIF|ADIE|ADPS2|ADPS1|ADPS0}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
*'''ADEN (ADC Enable)'''&amp;lt;br/&amp;gt;Wird dieses Bit gesetzt (also 1), dann wird der ADC aktiviert. Schreibt man eine 0 wird der ADC deaktiert. Wird der ADC während einer Wandlung deaktiviert, wird die Wandlung abgebrochen.&lt;br /&gt;
*'''ADSC (ADC Start Conversion)'''&amp;lt;br/&amp;gt;Dieses Bit startet den Messvorgang, je nachdem in welchem Betriebsmodi der ADC läuft. Wird dieses Bit nach der Aktivierung des ADC über '''ADEN''' zum ersten Mal gesetzt, wird der ADC erst eine Initialisierungswandlung durchführen und danach erst die eigentliche Wandlung. Das Schreiben einer 0 auf das Bit hat keinen Effekt.&lt;br /&gt;
*'''ADATE (ADC Auto Trigger Enable)'''&amp;lt;br/&amp;gt;Wird dieses Bit gesetzt, wird das Auto Triggering des ADC aktiviert.&lt;br /&gt;
*'''ADIF (ADC Interrupt Flag)'''&amp;lt;br/&amp;gt;Dieses Bit wird auf 1 gesetzt, wenn eine Wandlung erfolgte und das Ergebnis nun verfügbar ist. Der ADC Complete Interrupt wird ausgelöst, wenn das '''ADIE'''-Bit gesetzt ist und die Interrupts global aktiviert sind. Das Bit wird gelöscht, wenn die entsprechende ISR abgearbeitet wird. Alternativ kann man es löschen, indem man eine 1 auf das Bit schreibt.&lt;br /&gt;
*'''ADIE (ADC Interrupt Enable)'''&amp;lt;br/&amp;gt;Wird dieses Bit gesetzt und die globalen Interrupts sind aktiviert, wird der ADC Complete Interrupt aktiviert, auf den man dann in der entsprechenden ISR reagieren kann.&lt;br /&gt;
*'''ADPS2 (ADC Prescaler Select Bit 2)'''&amp;lt;br/&amp;gt;Diese Bits bestimmen den Teilungsfaktor zwischen der XTAL-Frequenz (also der Taktfrequenz) und dem Eingangstakt des ADC. Zum Wandeln benötigt der ADC einen eigenen Takt, der auf der Taktfrequenz des Mikrocontrollers basiert. Allerdings ist die Taktfrequenz zu schnell und deswegen wird diese durch den Vorteiler verkleinert. Der resultierende Takt muss zwischen 50kHz und 200kHz liegen. Siehe [[Avr#Teilungsfaktor]]. Folgende Teilungsfaktoren sind verfügbar:&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''ADPS2'''&lt;br /&gt;
 |'''ADPS1'''&lt;br /&gt;
 |'''ADPS0'''&lt;br /&gt;
 |'''Teilungsfaktor'''&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |2&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |2&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |4&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |8&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |16&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |32&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |64&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |128&lt;br /&gt;
 |}&lt;br /&gt;
*'''ADPS1 (ADC Prescaler Select Bit 1)'''&amp;lt;br/&amp;gt;Siehe '''ADPS2''' für eine Beschreibung.&lt;br /&gt;
*'''ADPS0 (ADC Prescaler Select Bit 0)'''&amp;lt;br/&amp;gt;Siehe '''ADPS2''' für eine Beschreibung.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| {{Blaueschmaltabelle}} width=100%&lt;br /&gt;
 |'''ADMUX (ADC Multiplexer Selection Register)'''&lt;br /&gt;
 |-&lt;br /&gt;
 |Mit diesem Register wird der Multiplexer gesteuert.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Registertabelle8Bit|REFS1|REFS0|ADLAR|MUX4|MUX3|MUX2|MUX1|MUX0}}&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
*'''REFS1 (Reference Selection Bit 1)'''&amp;lt;br/&amp;gt;Mit diesem Bit kann steuern, welche Referenzspannung der ADC verwenden soll. Die möglichen Quellen sind unten aufgelistet. Wird während einer Wandlung die Quelle für die Referenzspannung geändert, wird die aktuelle Wandlung mit der &amp;quot;alten&amp;quot; Quellen zuerste beendet, bevor die neue Einstellung übernommen wird.&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''REFS1'''&lt;br /&gt;
 |'''REFS0'''&lt;br /&gt;
 |'''Referenzspannungsquelle'''&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |AREF, internes Vref deaktiviert&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |AVCC mit externen Kondensator am AREF Pin&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |Keine Funktion, reserviert&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |Interne 2,56V Spannungsreferenz mit externen Kondensator am AREF Pin&lt;br /&gt;
 |}&lt;br /&gt;
*'''REFS0 (ADC Start Conversion)'''&amp;lt;br/&amp;gt;Siehe '''REFS1'''.&lt;br /&gt;
*'''ADLAR (ADC Left Adjust Result)'''&amp;lt;br/&amp;gt;Dieses Bit beeinflusst, wie der ermittelte Messwert im ADC Data Register abgelegt wird.&lt;br /&gt;
*'''MUX4 (Analog Channel and Gain Selection Bit 4)'''&amp;lt;br/&amp;gt;Dieses Bit wird auf 1 gesetzt, wenn eine Wandlung erfolgte und das Ergebnis nun verfügbar ist. Der ADC Complete Interrupt wird ausgelöst, wenn das '''ADIE'''-Bit gesetzt ist und die Interrupts global aktiviert sind. Das Bit wird gelöscht, wenn die entsprechende ISR abgearbeitet wird. Alternativ kann man es löschen, indem man eine 1 auf das Bit schreibt.&lt;br /&gt;
*'''MUX3 (Analog Channel and Gain Selection Bit 3)'''&amp;lt;br/&amp;gt;Mit diesen Bits ('''MUX3''' bis '''MUX0''') wird der Kanal des Multiplexers eingestellt, der mit dem ADC verbunden ist.&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''MUX4..0'''&lt;br /&gt;
 |'''Pin'''&lt;br /&gt;
|-&lt;br /&gt;
 |00000&lt;br /&gt;
 |ADC0&lt;br /&gt;
|-&lt;br /&gt;
 |00001&lt;br /&gt;
 |ADC1&lt;br /&gt;
|-&lt;br /&gt;
 |00010&lt;br /&gt;
 |ADC2&lt;br /&gt;
|-&lt;br /&gt;
 |00011&lt;br /&gt;
 |ADC3&lt;br /&gt;
|-&lt;br /&gt;
 |00100&lt;br /&gt;
 |ADC4&lt;br /&gt;
|-&lt;br /&gt;
 |00101&lt;br /&gt;
 |ADC5&lt;br /&gt;
|-&lt;br /&gt;
 |00110&lt;br /&gt;
 |ADC6&lt;br /&gt;
|-&lt;br /&gt;
 |00111&lt;br /&gt;
 |ADC7&lt;br /&gt;
 |}&lt;br /&gt;
Es reicht also einfach die Pinnummer in ADMUX zu schreiben.&lt;br /&gt;
*'''MUX2 (Analog Channel and Gain Selection Bit 2)'''&amp;lt;br/&amp;gt;Siehe '''MUX3''' für eine Beschreibung.&lt;br /&gt;
*'''MUX1 (Analog Channel and Gain Selection Bit 1)'''&amp;lt;br/&amp;gt;Siehe '''MUX3''' für eine Beschreibung.&lt;br /&gt;
*'''MUX0 (Analog Channel and Gain Selection Bit 0)'''&amp;lt;br/&amp;gt;Siehe '''MUX3''' für eine Beschreibung.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Des Weiteren gibt es noch den Register '''ADCL/ADCH''' in dem das Ergebnis einer Wandlung steht. Man liest den Wert folgendermaßen aus:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uint16_t x = ADCL;&lt;br /&gt;
x += (ADCH&amp;lt;&amp;lt;8);&lt;br /&gt;
// oder&lt;br /&gt;
x = ADCW;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TWI/I2C ==&lt;br /&gt;
Für Details über das Two-wire Serial Interface (kurz TWI) siehe Artikel [[TWI]].&lt;br /&gt;
&lt;br /&gt;
== UART/USART ==&lt;br /&gt;
Für Details über den UART/USART siehe Artikel [[UART]].&lt;br /&gt;
&lt;br /&gt;
== Die Fusebits ==&lt;br /&gt;
Fusebits nennt man bestimmte Bits zur Konfigurierung eines AVR-Controllers. Bei der Auslieferung neuer AVR Controller sind die Fusebits bereits vorkonfiguriert. In vielen Fällen kann man die Konfiguration unverändert belassen, je nach Controllertyp. Bei den Typen Mega xxx bestimmen einige Fusebits beispielsweise, dass der interne Taktgeber aktiviert ist. Möchte man dagegen einen externen Quarz anschließen oder die Taktfrequenz ändern, so müssen auch die Fusebits geändert werden. Auch das Deaktivieren des &amp;quot;[[On Chip Debugging]]&amp;quot; Modus ist oft notwendig, wenn man alle Ports ausnutzen möchte. &lt;br /&gt;
&lt;br /&gt;
Die Fusebits werden in der Regel über die Software eingestellt, welche auch für das Übertragen des Programmcodes zuständig ist. Besonders einfach geht dies beispielsweise mit der Entwicklungsumgebung [[Bascom]]. Aber auch andere Programme wie [[PonyProg]] können für die Umstellung der Fusebits genutzt werden. Einmal eingestellte Fusebits bleiben bis zur erneuten Fusebit-Änderung erhalten. Der normale Programmiermodus verändert die Fusebits nicht. &lt;br /&gt;
&lt;br /&gt;
Je nach AVR Controllertyp sind unterschiedliche Fusebits (Einstellungen) vorhanden. Die genaue Beschreibung findet man im jeweiligen Datenblatt. Da aber falsch gesetzte Fusebit-Einstellungen zu den häufigsten Problemen gehören, liste ich hier die Funktion der üblichen Fusebits nochmals genauer auf:&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''CKSEL0, CKSEL1, CKSEL2, CKSEL3'''&lt;br /&gt;
 |Die Kombination dieser 4 Fusebits bestimmt die Taktquelle des Controllers. Das kann eine interner Taktgenerator, ein Quarz, Quarzoszillator, RC-Glied und ähnliches sein.&lt;br /&gt;
|-&lt;br /&gt;
 |'''JTAGEN'''&lt;br /&gt;
 |Hiermit wird die &amp;quot;[[On Chip Debugging]]&amp;quot; Schnittstelle aktiviert bzw. deaktiviert. Das sind die Bits mit den Bezeichnungen TDI, TDO, TMS und TCK. Möchte man diese Pins als normalen Port nutzen, so muss diese Schnittstelle immer deaktiviert werden. &lt;br /&gt;
|-&lt;br /&gt;
 |'''SUT0, SUT1'''&lt;br /&gt;
 |Die sogenannte StartUp-Zeit (PowerOn delay). Diese Einstellung muss abhängig von der Art des Taktgenerators eingestellt werden, genaueres im jeweiligen Datenblatt. &lt;br /&gt;
|-&lt;br /&gt;
 |'''SPIEN'''&lt;br /&gt;
 |Hiermit kann die serielle [[AVR-ISP Programmierkabel|ISP-Programmierung]], welche die meisten Programmierkabel nutzen, deaktiviert werden. Dies sollte man lieber vermeiden, denn wenn dieser Programmiermodus deaktiviert wurde, kann nur noch der Parallel-Programmiermodus genutzt werden. Der Parallel-Programmiermodus benötigt jedoch ein spezielles Programmiergerät, das die wenigsten Bastler besitzen. ''Also Vorsicht!''&lt;br /&gt;
|-&lt;br /&gt;
 |'''BODEN'''&lt;br /&gt;
 |Über dieses Bit wird der '''Brown-out Detector''' aktiviert bzw. deaktiviert. Dies ist eine Überwachung der Betriebsspannung. Diese Überwachung soll dafür sorgen, dass bei Spannungseinbrüchen ein ordentlicher RESET durchgeführt wird. Dadurch wird verhindert, dass ein Controller in einen undefinierten Zustand gerät (hängen bleibt).&lt;br /&gt;
|-&lt;br /&gt;
 |'''BOOTLEVEL'''&lt;br /&gt;
 |Über dieses  Bit kann die Spannung festgelegt werden, ab welcher der '''Brown-out Detector''' den Controller neu startet (also RESET ausführt). &lt;br /&gt;
|-&lt;br /&gt;
 |'''BOOTRST'''&lt;br /&gt;
 |Gewöhnlich startet ein Programm im Controller nach einem RESET ab Adresse 0. Durch dieses Fusebit kann der Controller jedoch veranlasst werden, nach einem Reset einen sogenannten Bootloader-Bereich auszuführen. Ein [[Bootloader]] kann genutzt werden, um Controller über andere Schnittstellen (z.B. RS232) zu programmieren.&lt;br /&gt;
|-&lt;br /&gt;
 |'''BOOTSZ0, BOOTSZ1'''&lt;br /&gt;
 |Der zuvor genannte Bootloaderbereich kann bei AVR-Controllern verschieden groß sein. Über diese beiden Bits können vier verschiedene Größen eingestellt werden. Siehe unter [[Bootloader]].&lt;br /&gt;
|-&lt;br /&gt;
 |'''EESAVE'''&lt;br /&gt;
 |Dieses Bit legt fest, ob beim Programmieren des Controllers (man nennt es auch brennen) immer das EEPROM gelöscht werden soll.&lt;br /&gt;
|-&lt;br /&gt;
 |'''CKOPT'''&lt;br /&gt;
 |Abhängig von den Einstellungen von CKSEL kann hier dir Oszillator-Verstärkung eingestellt werden. Genaueres im Datenblatt des jeweiligen Controllers.&lt;br /&gt;
|-&lt;br /&gt;
 |'''WDTON'''&lt;br /&gt;
 |Schaltet den WatchDog-Timer beim Booten ein/aus. Dies ist auch per Software möglich&lt;br /&gt;
|-&lt;br /&gt;
 |'''RSTDISBL'''&lt;br /&gt;
 |Durch dieses Bit kann man den RESET-Pin deaktivieren und dann als normalen I/O-Port nutzen. Aber Vorsicht! Da die RESET-Leitung beim Programmieren (Brennen) des Chips genutzt wird, kann man nach dessen Deaktivierung den Controller mit den üblichen [[AVR-ISP Programmierkabel|ISP-Adaptern]] nicht mehr programmieren. In diesem Fall könnte man zwar den Controlle noch mit speziellen Programmiergeräten im Parallelmodus programmieren, aber in der Praxis verfügen nur wenige Bastler über ein Programmiergerät, das dies leistet.&lt;br /&gt;
|-&lt;br /&gt;
 |'''LB1, LB2'''&lt;br /&gt;
 |Das sind die sogenannten Lockbits, mit denen sich das Auslesen des Flash- als auch EEPROM-Speichers verhindern läßt. Zwar können andere Anwender immer noch Daten lesen, allerdings handelt es sich dabei nicht mehr um den wirklichen Inhalt sondern lediglich um wirre Datenbytefolgen. Programmierer, die den erarbeiteten Code vor Raubkopierern schützen wollen, nutzen diese Lockbits. Das Programmieren ist auch bei gesetzen Lockbits noch möglich. Der Bootloader-Bereich wird nicht durch die Lockbits geschützt.&lt;br /&gt;
|-&lt;br /&gt;
 |'''BLB01, BLB02'''&lt;br /&gt;
 |Durch diese Bits kann der Code sogar vor dem Zugriff durch den Bootloader geschützt werden&lt;br /&gt;
|-&lt;br /&gt;
 |'''BLB11, BLB12'''&lt;br /&gt;
 |Diese Bits schützen den Bootloaderbereich selbst&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wie man die Fusebits mit [[Bascom]] einstellt, wird im Beitrag [[Bascom - Erstes Programm in den AVR Controller übertragen]] erläutert.&lt;br /&gt;
&lt;br /&gt;
''Autoren des Artikels: Frank, Luma'' &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Atmel]]&lt;br /&gt;
* [[On Chip Debugging]]&lt;br /&gt;
* [[Bootloader]]&lt;br /&gt;
* [[Avr-gcc|avr-gcc]] - Leistungsfähiger AVR-Port des freien Compilers GCC&lt;br /&gt;
* [[Bascom]] - Sehr gutes Basic-Entwicklungssystem&lt;br /&gt;
* [[WinAVR]] - Ein freies Werkzeugpaket auf Basis avr-gcc für die Windows-Platform, integriert unter anderem das [[Programmer's Notepad]]&lt;br /&gt;
* [[AVR-Einstieg leicht gemacht]]&lt;br /&gt;
* [[Bascom - Erstes Programm in den AVR Controller übertragen]]&lt;br /&gt;
* [[AVR_Assembler_Einf%C3%BChrung|AVR Assembler Einführung (AvrStudio)]]&lt;br /&gt;
* [[AVR-ISP Programmierkabel]] - Bauanleitung für die AVR Controller Programmierkabel&lt;br /&gt;
* [[RN-Control]] - Eines der beliebtestet AVR-Boards im Roboternetz&lt;br /&gt;
* [[RNBFRA-Board]] - Größeres Board mit zwei Atmel Controllern&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
* [http://www.atmel.com/dyn/products/param_table.asp?family_id=607&amp;amp;OrderBy=part_no&amp;amp;Direction=ASC Aktuelle AVR Vergleichstabelle]&lt;br /&gt;
* [http://www.atmel.com/dyn/products/devices.asp?family_id=607 Die Datenblätter zu Atmel Controllern]&lt;br /&gt;
* [https://mpg.dnsalias.com/~magerlu/rn-wiki/avrtimer_applet Java Applet Timer Berechnung]&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/dload.php?action=file&amp;amp;file_id=169 AvrTimer Windows Berechnungstool]&lt;br /&gt;
* [http://people.freenet.de/gjl/helferlein/avr-uart-rechner.html AVR-Baudraten-Rechner (JavaScript)]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Abkürzung|AVR]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Avr&amp;diff=7181</id>
		<title>Avr</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Avr&amp;diff=7181"/>
				<updated>2006-05-04T21:41:54Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: Weitere kleinere Verbesserungen, Siehe auch sortiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:AtmelController.jpg|thumb|Beispiel eines AVR Controllers]]&lt;br /&gt;
'''AVR''' ist eine 8-Bit [[Microcontroller]]-Familie mit RISC-Architektur.&lt;br /&gt;
Im Gegensatz zu vielen anderen Microcontroller-Architekturen hat die AVR-Architektur keine Vorgänger. Sie ist ein komplettes Neudesign, das Anfang der 90-Jahre an der Universität von Trondheim/Norwegen entwickelt und vom (bis heute einzigen) Hersteller [[Atmel]] aufgekauft wurde. Es gibt eine ganze Serie von AVR-Controllern. Sie alle werden ähnlich programmiert, haben vergleichbaren Befehlssatz und physikalische Eigenschaften, bieten jedoch unterschiedliche Features und Peripherie. &lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche und kostenlose Entwicklungssysteme in den Sprachen Basic, C/C++, Pascal und Assembler für diese Controller-Familie. &lt;br /&gt;
&lt;br /&gt;
== Wofür steht AVR? ==&lt;br /&gt;
&amp;quot;AVR&amp;quot; steht angeblich für ''Advanced Virtual RISC'' (in einem Paper der Entwickler des AVR-Kerns Alf Egin Bogen und Vegard Wollan). Laut [[Atmel]] bedeutet es nichts.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
AVR-Controller besitzen eine zweistufige Pipeline (fetch and execute), die es ermöglicht, die meisten Befehle innerhalb eines einzigen Prozessortaktes auszuführen. Dadurch ist ein AVR wesentlich schneller als etwa 8051-Controller, bei denen der Prozessortakt intern noch durch 12 geteilt wird.&lt;br /&gt;
&lt;br /&gt;
*AVR-Kern&lt;br /&gt;
** Harvard-Architektur (getrennter Befehls- und Datenspeicher) &lt;br /&gt;
** 32 Register, kein Akkumulator, 3 Pointerregister &lt;br /&gt;
** EEPROM-Datenspeicher&lt;br /&gt;
** [[Watchdog]], [[Bootloader]]-Support, verschiedene Stromspar-Modi, Brownout-Erkennung, Interner Oszillator&lt;br /&gt;
** Lineares Speichermodell (keine Segmentierung)&lt;br /&gt;
** 8-Bit Architektur ist für Hochsprachen (C) optimiert &lt;br /&gt;
* In-System programmierbar: die Controller können sehr einfach über ein  Programmierkabel (oft ISP-Kabel genannt), das mit dem PC verbunden wird, programmiert werden &amp;amp;ndash; auch dann, wenn sie sich nicht in einer Schaltung befindet.&lt;br /&gt;
* umfangreiche Peripherie&lt;br /&gt;
** 8- und 16-Bit-Timer/Counter mit [[PWM]], Capture/Compare, externe Betaktung, asynchrone Operation&lt;br /&gt;
** Kommunikation: [[UART|USART]], [[SPI]], [[I2C]] ([[TWI]])&lt;br /&gt;
** Analog-Comparator, Analog-Digital-Wandler &lt;br /&gt;
** unterschiedlichste externe und interne Interrupt-Quellen (UART, SPI, Timer, A/D-Wandler, Analog-Comparator, ...)&lt;br /&gt;
** JTAG (Debugerinterface)&lt;br /&gt;
* AVR Typen (AT90 &amp;quot;Classic AVR&amp;quot;, ATtiny, ATmega) &lt;br /&gt;
* erhältlich in unterschiedlichen Gehäusen, idR Durchsteck und als [[SMD]]&lt;br /&gt;
* Viele Entwicklungsboards erhältlich, z.B. das Roboternetzboard [[RN-Control]]&lt;br /&gt;
&lt;br /&gt;
==Einige Pinbelegungen der populärsten AVR-Controller==&lt;br /&gt;
(in etwa nach Leistungsfähigkeit sortiert)&lt;br /&gt;
&lt;br /&gt;
* [[AT90S2313]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:at90s2313tiny.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Atmel Controller Mega8]]&lt;br /&gt;
* [[Atmel Controller Mega48 Mega88 Mega168]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:mega8kompatibel.png|center]]&lt;br /&gt;
&lt;br /&gt;
* [[Atmel Controller Mega16 und Mega32]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mega1632.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Atmel Controller Mega128]] ([[SMD]]-Chip)&lt;br /&gt;
&lt;br /&gt;
[[Bild:mega128pin.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Die AVR-Pin-Bezeichnungen und deren Funktion ===&lt;br /&gt;
Die meisten Ports sind doppelt belegt und besitzen neben der normalen Port-Funktion noch eine Sonderfunktion. Die verschiedenen Pinbezeichnungen und Sonderfunktionen werden hier beschrieben:&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|+ '''Tabelle: Die AVR-Pin-Bezeichnungen und deren Funktion'''&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Versorgungs- und Referenzpins, Reset&lt;br /&gt;
|-&lt;br /&gt;
 |'''VCC''' &lt;br /&gt;
 | Versorgungsspannung von 2,7 Volt bis 6 V bei den L-Varianten (low power), ansonsten 4,5V bis 6V. Die nächste AVR-Generation soll ab 1,8 Volt funktionieren.&lt;br /&gt;
|-&lt;br /&gt;
 |'''GND''' &lt;br /&gt;
 |Masse &lt;br /&gt;
|-&lt;br /&gt;
 |'''AREF''' &lt;br /&gt;
 |Referenzspannung für den Analog-Digital-Wandler (kann auf 5V gesetzt werden). Auch die interne Bandgap-Referenzspannung kann über diesen Pin entstört werden (dann KEINE externe Spannung an diesen Pin geben (Kurzschluss)!). &lt;br /&gt;
|-&lt;br /&gt;
 |'''AGND''' &lt;br /&gt;
 |Alternative Masse, etwa um ein Verbindungspunkt mit GND zu haben und bei empfindlichen Messungen  Masseschleifen zu vermeiden.&lt;br /&gt;
|-&lt;br /&gt;
 |'''AVCC''' &lt;br /&gt;
 | &lt;br /&gt;
Die Betriebsspannung für den Analog-Digital-Wandler (siehe Beschaltungsskizze). Die Pins AVCC, AGND und AREF sollten immer beschaltet werden, da es sonst passieren kann, dass Port A nicht richtig funktioniert, selbst wenn man den AD-Wandler nicht benutzt. &lt;br /&gt;
|-&lt;br /&gt;
 |'''RESET''' &lt;br /&gt;
 |Rücksetz-Eingang, intern über einen [[Pullup]] mit VCC verbunden. Ein LOW–Pegel an diesem Pin für die Dauer von mindestens zwei Zyklen des Systemtaktes bei aktivem Oszillator setzt den Controller zurück. Rücksetzen der Ports erfolgt unabhängig von einem evtl. anliegenden Systemtakt.&lt;br /&gt;
|-&lt;br /&gt;
|'''PEN'''&lt;br /&gt;
|Programming Enable - Diesen Pin gibt es nur beim Mega128/64 u.ä. Wird dieser Pin beim Power-On Reset nach Masse gezogen, geht der Controller in den [[ISP]] Programmiermodus. Man kann ihn also alternativ zu Reset verwenden. In der Regel verwendet man aber die Reset-Leitung und PEN sollte man direkt mit VCC verbinden.&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| System-Takt&lt;br /&gt;
|-&lt;br /&gt;
 |'''XTAL1''' &lt;br /&gt;
 |Eingang des internen Oszillators zur Erzeugung des Systemtaktes bzw. Eingang für ein externes Taktsignal, wenn der interne Oszillator nicht verwendet werden soll bzw. Anschluss von Quarz/Keramik-Resonator/RC-Glied.&lt;br /&gt;
|-&lt;br /&gt;
 |'''XTAL2''' &lt;br /&gt;
 |Anschluss von Quarz oder Keramik-Resonator oder Ausgang des integrierten Oszillators zur Nutzung als Systemtakt (Je nach Fuse-Einstellungen). &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Digitale bidirektionale  I/O-Ports&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;| Jeder Pin der Ports kann individuell als Eingang oder Ausgang konfiguriert werden. Die I/O-Ports sind maximal 8 Bit breit und verfügen ja nach AVR-Typ über eine unterschiedliche Anzahl von Pins. An jedem als Eingang (Input) geschalteten Pin gibt es zuschaltbare [[Pullup]]-Widerstände, die teilweise auch bei aktivierter Sonderfunkton verfügbar sind.&lt;br /&gt;
&lt;br /&gt;
Bei eingeschalteten Sonderfunktionen wie UART, SPI, ADC, etc. sind die entsprechenden Pins nicht als &amp;quot;normale&amp;quot; digitale I/O verwendbar, sondern dienen der Sonderfunktion. Die Anzahl der als I/O verwendbaren Pins ist auch abhängig von den Fuse-Einstellungen (Vorsicht beim Umstellen, Handbuch GENAU lesen!).&lt;br /&gt;
|-&lt;br /&gt;
|'''PA 0 – 7''' || Port A &lt;br /&gt;
|-&lt;br /&gt;
|'''PB 0 – 7''' || Port B &lt;br /&gt;
|-&lt;br /&gt;
|'''PC 0 – 7''' || Port C &lt;br /&gt;
|-&lt;br /&gt;
|'''PD 0 – 7''' || Port D &lt;br /&gt;
|-&lt;br /&gt;
|'''PE 0 – 7''' || Port E &lt;br /&gt;
|-&lt;br /&gt;
|'''PF 0 – 7''' || Port F &lt;br /&gt;
|-&lt;br /&gt;
|'''PG 0 – 7''' || Port G &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Externe Interrupts&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;| Die PCINT-Interrupts gibt es nur für neuere AVRs wie den [[ATmega88]]. Falls die Anzahl an externen Interrupts nicht ausreicht, kann evtl. auch andere Hardware dafür eingesetzt werden, etwa der Analog-Comparator mit interner Bandgap-Referenz, falls er anderwärtig nicht gebraucht wird.&lt;br /&gt;
|-&lt;br /&gt;
 |'''INT0''' ||Externer Interrupt 0&lt;br /&gt;
|-&lt;br /&gt;
 |'''INT1''' ||Externer Interrupt 1&lt;br /&gt;
|-&lt;br /&gt;
 |'''INT2''' ||Externer Interrupt 2 &lt;br /&gt;
|-&lt;br /&gt;
 |'''PCINTx''' ||Pin-Change Interrupt&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| [[Timer]] und [[PWM]]&lt;br /&gt;
|-&lt;br /&gt;
 |'''T0''' &lt;br /&gt;
 |Timer-Eingang. Timer kann gestartet, gestoppt oder getaktet werden &lt;br /&gt;
|-&lt;br /&gt;
 |'''T1''' &lt;br /&gt;
 |Timer-Eingang. Timer kann gestartet, gestoppt oder getaktet werden &lt;br /&gt;
|-&lt;br /&gt;
 |'''OC0''' &lt;br /&gt;
 |PWM bzw. Output Compare Ausgang des Timers 0 &lt;br /&gt;
|-&lt;br /&gt;
 |'''OC1A''' &lt;br /&gt;
 |Ausgang für die Compare-Funktion des integrierten Zeitgeber- / Zählerbausteines &lt;br /&gt;
Der erste PWM-Ausgang des Timers1. Er kann zum Regeln der Bot-Motogeschwindigkeit benutzt werden. &lt;br /&gt;
|-&lt;br /&gt;
 |'''OC1B''' &lt;br /&gt;
 |Ausgang für die Compare-Funktion des integrierten Zeitgeber- / Zählerbausteines &lt;br /&gt;
Der zweite PWM-Ausgang des Timers1. Er kann zum Regeln der Bot-Motogeschwindigkeit benutzt werden. &lt;br /&gt;
|-&lt;br /&gt;
 |'''ICP1''' &lt;br /&gt;
 |Eingang für die Capture-Funktion des integrierten Zeitgebers / Zählerbausteines &lt;br /&gt;
|-&lt;br /&gt;
 |'''OC2''' &lt;br /&gt;
 |[[Pwm]] bzw. Output Compare Ausgang des Timers2. Er kann zum Regeln der Bot-Motogeschwindigkeit benutzt werden. &lt;br /&gt;
|-&lt;br /&gt;
 |'''TOSC1, TOSC2''' &lt;br /&gt;
 |TOSC1 und TOSC2 sind Eingänge für den asynchronen Modus von Timer2. Sie sind vorgesehen für den Anschluss eines externen Uhrenquarzes ( 32.768 kHz ). Damit lassen sich zum Beispiel sehr genaue Ein-Sekunden-Impulse für eine Uhr generien. &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Analog-Digital-Wandler&lt;br /&gt;
|-&lt;br /&gt;
 |'''ADC0''' bis '''ADC7''' &lt;br /&gt;
 |Eingänge des AD-Wandlers. Spannungen können hier gemessen werden oder an den Analog-Komparator weiter geleitet werden. &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Analog-Komparator&lt;br /&gt;
|-&lt;br /&gt;
 |'''AIN0, AIN1''' &lt;br /&gt;
 |Die beiden externen Eingänge des Analog-Komparators. &lt;br /&gt;
Mit AIN0(+) und AIN1(-) kann man zwei Spannungen miteinander vergleichen. Wenn die Spannung an AIN0 höher als bei AIN1 ist, liefert der Komparator &amp;quot;High&amp;quot;, ansonsten ein &amp;quot;Low&amp;quot;. Als interne Eingänge des Komparators können die Interne Bandgap-Referenzspannung oder Ausgänge des ADC-Multiplexers dienen.&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Serielle Schnittstelle ([[UART|USART]])&lt;br /&gt;
|-&lt;br /&gt;
 |'''RXD''' &lt;br /&gt;
 |Eingang der Seriellen Schnittstelle (Receive Data), TTL-Pegel &lt;br /&gt;
|-&lt;br /&gt;
 |'''TXD''' &lt;br /&gt;
 |Ausgang Serielle Schnittstelle (Transmit Data), TTL-Pegel &lt;br /&gt;
|-&lt;br /&gt;
 |'''XCK''' &lt;br /&gt;
 |Externe Takt für den USART. Wird nur in Sonderfällen für den Takt benötigt. &lt;br /&gt;
USART (&amp;quot;Universal Synchronous/Asynchronous Receiver and Transmitter&amp;quot;). Das ist die serielle Schnittstelle, die zur Datenübertragung zwischen Mikrocontroller und PC genutzt wird. Zur bidirektionalen Übertragung werden zwei Pins am Controller benötigt: TXD und RXD. Über TXD (&amp;quot;Transmit Data&amp;quot;) werden Daten gesendet, RXD (&amp;quot;Receive Data&amp;quot;) dient zum Empfang. &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| [[SPI]]-Schnittstelle&lt;br /&gt;
|-&lt;br /&gt;
 |'''SS''' &lt;br /&gt;
 |SPI-Interface – wird beneötigt um den richtigen Slave am Bus zu wählen &lt;br /&gt;
|-&lt;br /&gt;
 |'''MOSI''' &lt;br /&gt;
 |SPI-Interface – Datenausgang (als Master) oder Dateneingang (als Slave), verwendet bei ISP (In-System-Programmierung)&lt;br /&gt;
|-&lt;br /&gt;
 |'''MISO''' &lt;br /&gt;
 |SPI-Interface – Dateneingang (als Master) oder Datenausgang (als Slave), verwendet bei ISP (In-System-Programmierung)&lt;br /&gt;
|-&lt;br /&gt;
 |'''SCK''' &lt;br /&gt;
 |SPI-Interface – Bustakt vom Master, verwendet bei ISP (In-System-Programmierung)&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| [[I2C|I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C]]-Schnittstelle ([[TWI]])&lt;br /&gt;
|-&lt;br /&gt;
 |'''SDA''' &lt;br /&gt;
 |I2C-Schnittstelle (Bus aus 2 Leitungen) Datenleitung &lt;br /&gt;
|-&lt;br /&gt;
 |'''SCL''' &lt;br /&gt;
 |I2C-Schnittstelle (Bus aus 2 Leitungen) Clockleitung &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| [[JTAG]]-Interface&lt;br /&gt;
|-&lt;br /&gt;
 |'''TDI''' &lt;br /&gt;
 |JTAG-Debug Interface - Über dieses Interface kann man den AVR programmieren und debuggen. Die Schnittstelle ist ähnlich wie die SPI Schnittstelle und hat getrennte Dateneingangs- und Datenausgangsleitungen sowie eine Taktleitung. TDI ist die Dateneingangsleitung&lt;br /&gt;
|-&lt;br /&gt;
 |'''TDO''' &lt;br /&gt;
 |JTAG-Debug Interface - TDO ist die Datenausgangsleitung des JTAG Interface&lt;br /&gt;
|-&lt;br /&gt;
 |'''TMS''' &lt;br /&gt;
 |JTAG-Debug Interface&lt;br /&gt;
|-&lt;br /&gt;
 |'''TCK''' &lt;br /&gt;
 |JTAG-Debug Interface &lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Timer/Counter ==&lt;br /&gt;
&lt;br /&gt;
Die Mikrocontroller der AVR-Familie besitzen je nach Typ eine unterschiedliche Anzahl an programmierbaren [[Timer|Timern]]. Bei den aktuellen ATmegas sind das mindestens ein 8-Bit Timer und bei größeren Ausführungen der Serie auch 16-Bit Timer. Die Timer werden immer Timerx benannt, wobei x für die Timernummer steht (also 0, 1, 2, usw.). &lt;br /&gt;
Die Konfigurationsmöglichkeiten sind von Timer zu Timer unterschiedlich.&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' Die folgenden Code-Beispiele sind in C programmiert und wurden für einen [[ATMega32|ATmega32]] entwickelt. Sie lassen sich also ohne große Änderungen auch auf anderen Mikrocontrollern der AVR-Familie einsetzen.&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine Funktionsweise ===&lt;br /&gt;
Timer funktionieren nach dem allgemeinen Prinzip, dass sie eine Ganzzahl (im weiteren als Zähler bezeichnet) je nach Betriebsmodus auf- oder abwärtszählen, d.h. inkrementieren bzw. dekrementieren.&lt;br /&gt;
&lt;br /&gt;
Angenommen, der Timer arbeitet im einfachsten Betriebsmodus, dem normalen Modus (siehe [[Avr#Normaler Modus (Normal Mode)|Normaler Modus (Normal Mode)]]). Die Zählrichtung des Timers ist aufsteigend gerichtet. Je nach Auflösung, also 8-Bit oder 16-Bit, erreicht der Zähler irgendwann einen bestimmten Zustand. Möglich wäre, dass er überläuft, wenn z.B. bei einem 8-Bit Timer der Wert 255 inkrementiert wird (siehe Grafik).&lt;br /&gt;
&lt;br /&gt;
[[Bild:AbstrakterZaehlvorgang.png]]&lt;br /&gt;
&lt;br /&gt;
=== Der Prescaler ===&lt;br /&gt;
Der Prescaler (eng. = Vorteiler) kann dazu genutzt werden, den Takt, der den Timern zugeführt wird, zu verkleinern. U.a. kann man damit die Timer so konfigurieren, damit diese in den unterschiedlichsten Frequenzen takten. Hier eine Grafik die den Prescaler veranschaulicht:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Prescaler.png]]&lt;br /&gt;
&lt;br /&gt;
Das obere Diagramm zeigt den Betrieb ohne Prescaler, das untere mit Prescaler. Die gestrichelte Linie zeigt, wann ein Interrupt eintritt.&lt;br /&gt;
&lt;br /&gt;
Im Teil [[Avr#Die Betriebsmodi|Die Betriebsmodi]] wird weiter auf die praktische Verwendung des Prescalers eingegangen.&lt;br /&gt;
&lt;br /&gt;
=== Die Betriebsmodi ===&lt;br /&gt;
Die AVR-Timer können in unterschiedlichen Betriebsmodi betrieben werden. Diese sind:&lt;br /&gt;
* Normaler Modus&lt;br /&gt;
* CTC Modus&lt;br /&gt;
* PWM&lt;br /&gt;
&lt;br /&gt;
==== Normaler Modus (Normal Mode) ====&lt;br /&gt;
Der einfachste Betriebsmodus ist der normale Modus. Er funktioniert wie im Abschnitt  &amp;quot;[[Avr#Allgemeine Funktionsweise|Allgemeine Funktionsweise]]&amp;quot; beschrieben. Die Zählrichtung des Timers ist immer aufsteigend, und irgendwann kommt es zu dem Interrupt Timer-Overflow (welcher in einer passend ISR aufgefangen werden kann). Im einfachsten Fall kann man diesen Modus in folgendem Diagramm darstellen:&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_1.png]]&lt;br /&gt;
&lt;br /&gt;
Der Zähler des Timers (im Diagramm oben, die aufsteigende und dann wieder zurückgesetzte Linie) ist in dem Register TCNTx gespeichert, wobei x für eine Zahl steht. Soll z.B. auf den Timer0 (siehe Datenblatt des jeweiligen Controllers) des Controllers zugegriffen werden, so ist an TCNT eine 0 anzuhängen, also TCNT0.&lt;br /&gt;
Wie lange es braucht, bis der Zähler einen Overflow auslöst, ist von der Taktfrequenz des Controllers, dem eingestellten Prescaler-Wert und von der Timerauflösung abhängig. Nun wäre es ja sehr unpraktisch, wenn wir den Zähler nicht anpassen könnten. Denn sonst müssten wir unsere Software die den Timer benutzt evtl. anpassen und viel rechnen um z.B. für 1000 ms zu schlafen. Deswegen kann auf den Zähler zugreifen und ihn vorladen bevor dieser wieder vom eigentlichen Timer hochgezählt wird. Dies veranschaulicht folgendes Diagramm:&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_1_Vorladen.png]]&lt;br /&gt;
&lt;br /&gt;
Dadurch kann man den Timer beeinflussen, und beeinflussen wie lange es dauert, bis ein Overflow auftritt. Um zu berechnen, welchen Wert wir vorladen müssen, kann man auch ein Java-Applet nutzen, siehe unter [[Avr#Weblinks|Weblinks Java Applet]].&lt;br /&gt;
&lt;br /&gt;
Natürlich kann man das auch &amp;quot;von Hand&amp;quot; rechnen. Die Berechnung des Preloader- sowie Prescalerwerts bei Verwendung der Overflow-Interrupts, eines Prescalers von 64 (nicht alle Prescaler können verwendet werden) und eines Quarzes mit der Frequenz von 8 MHz sieht folgendermaßen aus (gesuchte Frequenz beträgt 1000 Hz unter der Verwendung des Timer0 eines ATmega32):&lt;br /&gt;
# &amp;lt;math&amp;gt;Prescale = Frequenz * 1000000 [Hz] = 8000000&amp;lt;/math&amp;gt;&lt;br /&gt;
# Wir definieren den maximalen Zählerwert. Dieser ist bei einem 8-Bit Timer 256, bei einem 16-Bit Timer 65536. In unserem Fall ist der maximale Zählerwert 256, weil Timer0 verwendet wird.&lt;br /&gt;
# Nun wird die Variable ''Prescale'' (s.o.) durch den verwendeten Prescaler (64) geteilt (&amp;lt;math&amp;gt;8000000 Hz / 64 = 125000&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Als nächstes wird der im dritten Punkt errechnete Wert durch die gesuchte Frequenz geteilt &amp;lt;math&amp;gt;=125000 / 1000Hz = 125&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Nun wird mathematisch überprüft, ob der errechnete Wert aus dem vierten Punkt kleiner als der maximale Zählerwert ist. Trifft dies zu, so subtrahiert man den errechneten Wert vom maximalen Zählerwert (&amp;lt;math&amp;gt;= 256 - 125 = 131&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Damit haben wir den Wert errechnet, der bei jedem Interrupt, den der Timer0 auslöst, in TCNTx (in diesem Fall TCNT0) nachgeladen werden muss, damit die Interrupts in dem gewünschten Zeitabstand von einer Millisekunde ausgelöst werden.&lt;br /&gt;
&lt;br /&gt;
Allerdings bleibt zu bemerken, dass bei der Verwendung einer &amp;quot;ungeraden&amp;quot; Quarzfrequenz (z.B. 7,3728 MHz) der Timer mit einer bestimmten Ungenauigkeit arbeitet. Würden wir z.B. den Quarz oben mit einem Quarz mit 7,3728 MHz austauschen, so wäre die Fehlerrate 0,17%. Diese Ungeauigkeit varriert von verwendetem Prescaler zu Prescaler. D.h. wenn wir einen Prescaler von 1024 (und einer Quarzfrequenz von 8 MHz) verwendet hätten, so hätten wir eine inakzeptable Ungeauigkeit von 11,61%. Deswegen sollte sie eines der genannten Programme unter [[Avr#Weblinks]] verwenden, denn diese zeigen nur die bestmögliche Konfiguration an.&lt;br /&gt;
&lt;br /&gt;
Die Fehlerrate kann natürlich auch ausgerechnet werden. Hier die Rechenschritte (sie sind erweiternd zu der oberen Berechnung):&lt;br /&gt;
# Als erstes wird mathematisch überprüft, ob der Preloaderwert (siehe fünften Schritt oben) größer als 1 ist.&lt;br /&gt;
# Trifft dies zu, so wird als nächstes die resultierende Frequenz errechnet. Die geschieht folgendermaßen: Der errechnete Preloaderwert aus der Rechnung oben wird vom maximalen Zählerwert subtrahiert, anschließend mit dem Prescaler multipliziert und dann das Ganze durch die Variable Prescale geteilt &lt;br /&gt;
&amp;lt;math&amp;gt;(256 - 131) \cdot 64 / 8\,000\,000 \mathrm{Hz} \cdot 1\,000\,000 = 1000&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Nun wird die gesuchte Frequenz vom errechneten Wert aus dem dritten Punkt subtrahiert und dann wiederum durch diese geteilt &amp;lt;math&amp;gt;(1000-1000) / 1000 = 0&amp;lt;/math&amp;gt;. Damit läuft dieser Timer genau mit einer Fehlerrate von 0 %.&lt;br /&gt;
&lt;br /&gt;
Betreibt man den Timer im Overflow-Modus, so muss man, wie bereits erwähnt, nach/bei jedem Overflow-Interrupt den Timer nachladen. Der Interrupt heißt in diesem Fall SIG_OVERFLOWx (x steht für die Nummer des Timers). Dieser muss in einer ISR abgefangen werden.&lt;br /&gt;
&lt;br /&gt;
Zusammenfassend ein Beispielprogramm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* Es wird der Timer2 (8-Bit) eines ATmega32 verwendet, der mit einem Quarz mit 7,3728 MHz&lt;br /&gt;
betrieben wird. Im Abstand von 0,001 ms erzeugt der Timer einen Interrupt, also eine&lt;br /&gt;
Frequenz von 1000000 Hz (oder 100 kHz). Der Timer wird auf einen Prescaler von 1 und&lt;br /&gt;
einem Preloader von  183 konfiguriert.*/&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t countTimer2;	// Speichert den aktuellen Zählerwert&lt;br /&gt;
&lt;br /&gt;
// ISR zum auffangen der Interrupts:&lt;br /&gt;
SIGNAL(SIG_SIG_OVERFLOW2)&lt;br /&gt;
{&lt;br /&gt;
	countTimer2++;&lt;br /&gt;
	TCNT2 = 183;		// Nachladen&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Initialisierung:&lt;br /&gt;
TCCR2 = (1&amp;lt;&amp;lt;CS22);		// Prescaler von 1&lt;br /&gt;
TCNT2  = 183;			// Vorladen&lt;br /&gt;
TIMSK |= (1&amp;lt;&amp;lt;TOIE2);		// Interrupts aktivieren und damit Timer starten&lt;br /&gt;
sei();&lt;br /&gt;
&lt;br /&gt;
// Funktionen zum benutzen der Timer:&lt;br /&gt;
/** Diese Funktion nicht aufrufen. Wird von sleep_millisec aufgerufen.&lt;br /&gt;
Bei t=100 schläft die Funktion 1 ms. */&lt;br /&gt;
inline void sleep (uint8_t t)&lt;br /&gt;
{&lt;br /&gt;
	// countTimer2 wird in der ISR oben inkrementiert&lt;br /&gt;
	countTimer2 = 0;&lt;br /&gt;
	while (countTimer2 &amp;lt; t);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** Schläft x-Millisekunden. */&lt;br /&gt;
inline void sleep_millisec(uint16_t msec)&lt;br /&gt;
{&lt;br /&gt;
	uint16_t i;&lt;br /&gt;
	for(i=0; i&amp;lt;msec; i++) {&lt;br /&gt;
		sleep(100);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Allerdings wird auf diese leicht veraltete Technik nun nicht weiter eingegangen. Der Artikel wendet sich nun dem neueren &amp;quot;Compare Output&amp;quot;-Betriebsmodus zu.&lt;br /&gt;
&lt;br /&gt;
Beim &amp;quot;Compare Output&amp;quot;-Betriebsmodus wird genauso ein Zähler hochgezählt. Allerdings wird der Zählerwert nach jeder Inkrementierung mit einem vom Benutzer festgelegten Wert verglichen. Entspricht der Zählerwert dem gespeicherten Wert, so kommt es zu einem Interrupt. Dieser Wert wird in das Register OCRx (x steht wieder für die Timernummer) gespeichert. Je nach Auflösung des Timers ist dieses Register 8-Bit oder 16-Bit breit. &lt;br /&gt;
&lt;br /&gt;
Hinweis: Siehe CTC Modus unten. Dieser wird benötigt um den Timer entsprechend im &amp;quot;Compare Output&amp;quot;-Betriebsmodus vernünftig zu betreiben.&lt;br /&gt;
&lt;br /&gt;
Hier ein typisches Diagramm dieses Betriebsmodus (Hinweis: Das Diagramm wurde unter Verwendung des CTC Modus erstellt. Für Begriffserklärung siehe CTC Modus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_CompareMatch.png]]&lt;br /&gt;
&lt;br /&gt;
Das Ausrechnen des Werts, der in OCRx geschrieben werden muss, damit Frequenz x entsteht, ist nicht sonderlich schwer. Man geht wie bei der Berechnung des Werts für den Overflow-Modus vor (s.o.) nur daß man das resultierende Ergebnis vom maximalen Zählerwert (bei 8-Bit Auflösung ist dieser 256, bei 16-Bit Auflösung 65536) subtrahiert. Das Ergebnis wird dann einmalig in das Register OCRx geschrieben. Mann muss also nicht wie beim Overflow-Modus den Timer nach jedem Interrupt nachladen. Der enstehende Interrupt heißt in diesem Fall SIG_OUTPUT_COMPAREx (x steht für die Nummer des Timers). Dieser muss in einer ISR abgefangen werden.&lt;br /&gt;
&lt;br /&gt;
Wiederum zusammenfassend ein Beispielprogramm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* Es wird der Timer2 (8-Bit) eines ATmega32 verwendet, der mit einem Quarz mit 7,3728 MHz&lt;br /&gt;
betrieben wird. Im Abstand von 0,001 ms erzeugt der Timer einen Interrupt, also eine Frequenz&lt;br /&gt;
von 1000000 Hz (oder 100 kHz). Der Timer wird auf einen Prescaler von 1 und einem OCR2-Wert&lt;br /&gt;
von 73 konfiguriert.*/&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t countTimer2;	// Speichert den aktuellen Zählerwert&lt;br /&gt;
&lt;br /&gt;
// ISR zum auffangen der Interrupts:&lt;br /&gt;
SIGNAL(SIG_OUTPUT_COMPARE2)&lt;br /&gt;
{&lt;br /&gt;
  countTimer2++;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Initialisierung:&lt;br /&gt;
TCCR2 = (1&amp;lt;&amp;lt;CS22) | (1&amp;lt;&amp;lt;WGM21);	// Prescaler von 1 | CTC-Modus (siehe unten für Beschreibung)&lt;br /&gt;
OCR2  = 73;			// Vergleichswert&lt;br /&gt;
TIMSK |= (1&amp;lt;&amp;lt;OCIE2);		// Interrupts aktivieren und damit Timer starten&lt;br /&gt;
sei();&lt;br /&gt;
&lt;br /&gt;
// Funktionen zum benutzen der Timer:&lt;br /&gt;
/** Diese Funktion nicht aufrufen. Wird von sleep_millisec aufgerufen.&lt;br /&gt;
Bei t=100 schläft die Funktion 1 ms. */&lt;br /&gt;
inline void sleep(uint8_t t)&lt;br /&gt;
{&lt;br /&gt;
	// countTimer2 wird in der ISR oben inkrementiert&lt;br /&gt;
	countTimer2 = 0;&lt;br /&gt;
	while (countTimer2 &amp;lt; t);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** Schläft x-Millisekunden. */&lt;br /&gt;
inline void sleep_millisec(uint16_t msec)&lt;br /&gt;
{&lt;br /&gt;
	uint16_t i;&lt;br /&gt;
	for(i=0; i&amp;lt;msec; i++) {&lt;br /&gt;
		sleep(100);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== CTC Modus (Clear Timer on Compare Match mode) ====&lt;br /&gt;
Der CTC Modus ist eine Erweiterung des &amp;quot;Compare Output&amp;quot;-Betriebsmodus. Der CTC Modus wird z.B. für das obere Beispielprogramm benötigt. Wird der Timer nämlich im normalen Betriebsmodus betrieben, so ist seine Zählergrenze je nach Auflösung 255 oder entsprechend für die 16-Bit Timer. Erst wenn diese Grenze erreicht wurde, wird der Timer zurückgesetzt (also auf 0). Durch den CTC Modus wird der Timer augenblicklich automatisch nachdem ein &amp;quot;Compare Output&amp;quot;-Interrupt auftrat zurückgesetzt. Man kann also die maximalen Zählergrenze selber definieren.&lt;br /&gt;
Dieses Diagramm veranschaulicht den CTC Modus. Nach dem Interrupt wird der Timer sofort wieder zurückgesetzt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_CompareMatch.png]]&lt;br /&gt;
&lt;br /&gt;
==== PWM ====&lt;br /&gt;
Für PWM siehe [[Pwm]].&lt;br /&gt;
&lt;br /&gt;
=== Registerübersicht ===&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' Diese Registertabelle wurde für den aktuellen [[Atmel Controller Mega16 und Mega32]] erstellt. Wenn Sie ein anderes Modell verwenden kann es sein, dass ein oder mehrere Register nicht existieren, oder sie eine andere Bezeichnung haben.&lt;br /&gt;
&lt;br /&gt;
{| {{Blaueschmaltabelle}} width=100%&lt;br /&gt;
 |'''TIMSK'''&lt;br /&gt;
 |-&lt;br /&gt;
 |Mit diesem Register, der von allen Timern verwendet wird, lässt sich die Interruptausführung und Art des jeweiligen Timers bestimmen.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Registertabelle8Bit|OCIE2|TOIE2|TICIE1|OCIE1A|OCIE1B|TOIE1|OCIE0|TOIE0}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
*'''OCIE2 (Timer/Counter2 Output Compare Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter2 Compare Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TOIE2 (Timer/Counter2 Overflow Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter2 Overflow Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TICIE1 (Timer/Counter1, Input Capture Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Input Capture Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''OCIE1A (Timer/Counter1 Output Compare A Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Output Compare A Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''OCIE1B (Timer/Counter1 Output Compare B Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Output Compare B Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TOIE1 (Timer/Counter1 Overflow Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Overflow Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''OCIE0 (Timer/Counter0 Output Compare Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, so wird der Timer/Counter0 Compare Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TOIE0 (Timer/Counter0 Overflow Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, so wird der Timer/Counter0 Overflow Interrupt aktiviert  (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Analog-Digital-Wandler ==&lt;br /&gt;
Mit einem Analog-Digital-Wandler (ADC, für Analog Digital Converter) ist es mit den AVRs möglich, auf einfache Art und Weise analoge Größe in digitale Werte umzuwandeln. Dies bietet sich z.B. an, wenn man die Batteriespannung eines Roboters bestimmen möchte.&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine Informationen ===&lt;br /&gt;
Für allgemeine Informationen zu ADCs: siehe [[ADC]].&lt;br /&gt;
&lt;br /&gt;
=== Kanäle ===&lt;br /&gt;
Ein AVR hat normalerweise nur einen ADC integriert. Öfters muss man aber mehrere analoge Größen von verschiedenen Quellen wandeln, deswegen besitzen die AVRs Kanäle (ein ATmega32 z.B. besitzt acht Kanäle auf Port A). Diese Kanäle werden dann mithilfe eines Multiplexer auf den ADC geschalten werden, der dann die anliegenden analoge Spannung in einen digitalten Wert wandelt.&lt;br /&gt;
&lt;br /&gt;
=== Betriebsmodi ===&lt;br /&gt;
Der ADC bietet verschiedene Betriebsmodi. Diese wären:&lt;br /&gt;
* Single Conversation: Der ADC wandelt eine analoge Größe um und gibt diese zurück.&lt;br /&gt;
* Free Running: Der ADC wandelt wie in einer Endlosschleife ständig die anliegenden analogen Größen in digitale Werte um und gibt diese zurück.&lt;br /&gt;
&lt;br /&gt;
=== Teilungsfaktor ===&lt;br /&gt;
Zum Wandeln benötigt der ADC einen eigenen Takt, der auf der Taktfrequenz des Mikrocontrollers basiert. Allerdings ist die Taktfrequenz des Mikrocontrollers zu schnell und deswegen wird diese durch den Vorteiler verkleinert. Der resultierende Takt muss zwischen 50kHz und 200kHz liegen. Folgende Teilungsfaktoren sind verfügbar:&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''Teilungsfaktoren'''&lt;br /&gt;
 |2&lt;br /&gt;
 |4&lt;br /&gt;
 |8&lt;br /&gt;
 |16&lt;br /&gt;
 |32&lt;br /&gt;
 |64&lt;br /&gt;
 |128&lt;br /&gt;
 |}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Um zu bestimmen welcher Teilungsfaktor geeignet ist, kann man folgende Formel verwenden.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Tacktfrequenz = 8 MHz&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Teilungsfaktor_{min} = {Tacktfrequenz \over {200 kHz}} = {{8000000 Hz} \over {200000 Hz}} = 40&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Teilungsfaktor_{max} = {Tacktfrequenz \over {50 kHz}} = {{8000000 Hz} \over {50000 Hz}} = 160&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Deswegen kann man nun zwischen einem der folgenden Teilungsfaktor wählen: 64 und 128. Im Interesse der Geschwindigkeit sollte 64 gewählt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Siehe bitte die Registerübersicht weiter unten. Dort wird gezeigt, welches Register entsprechend eingestellt werden muss, damit man einen der oben aufgelisteten Teilungsfaktoren auswählen kann.&lt;br /&gt;
&lt;br /&gt;
=== Referenzspannung ===&lt;br /&gt;
Das Ergebnis der Wandlung des ADC bezieht sich auf eine bestimmt Referenzspannung. Diese Referenzspannung lässt sich bestimmen. Je nach gewählter Referenzspannung darf man nur eine zu messende Spannung an den Port anlegen, die nicht höher liegt als die Referenzspannung. Sonst würde dieser zerstört werden. Die Referenzspannung ist also gleich der maximal zu messenden Spannung. Um einzustellen welche Referenzspannung verwendet werden soll, gibt es den Register ADMUX. Folgende Quellen sind als Referenzspannung möglich:&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''Referenzspannungsquelle'''&lt;br /&gt;
 |AREF, internes Vref deaktiviert&lt;br /&gt;
 |AVCC mit externen Kondensator am AREF Pin&lt;br /&gt;
 |Keine Funktion, reserviert&lt;br /&gt;
 |Interne 2,56V Spannungsreferenz mit externen Kondensator am AREF Pin&lt;br /&gt;
 |}&lt;br /&gt;
Siehe bitte die Registerübersicht. Dort steht genauer wie man den Register einzustellen hat.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Man benötigt die Referenzspannung auch (oder besserer deren analoge Größe) um den Wert den der ADC zurückgibt in V umzurechnen. Um den zurückgegebenen Wert des ADC umzuwandel geht man so vor:&amp;lt;br&amp;gt;&lt;br /&gt;
# Bestimmen der Auflösung des ADC. Bei den ATMegas normalerweiße 10 Bit. 10 Bit entsprechen einer Stufung von 1024.&lt;br /&gt;
# Ermitteln des digitalen Werts der analogen Größe. In der Beispielrechnung verwende ich den Wert 592.&lt;br /&gt;
# Größe der Referenzspannung. In der Beispielrechnung wird 5V verwendet.&lt;br /&gt;
Mit diesen Werten kann folgende Berechnung ausführen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;V = 592 * 5V&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;V = 2960 / 2 ^{Bit} = 2960 / 2 ^{10} = \underline {\underline { 2{,}9V }}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Programmbeispiele ===&lt;br /&gt;
'''C/C++'''&amp;lt;br&amp;gt;&lt;br /&gt;
Dieses Beispiel ist für die [[Atmel Controller Mega16 und Mega32]] gedacht, die mit einer Taktfrequenz von 8 MHz laufen. Es ist unbedingt darauf zu achten nicht die Referenzspannung von 2,56V zu überschreiten! Sonst stirbt der Port. Je nach Einsatzart muss man das Beispielprogramm entsprechend abändern (also diese Zeile mit ADMUX |= (1&amp;lt;&amp;lt;REFS1) | (1&amp;lt;&amp;lt;REFS0);).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;inttypes.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
uint16_t readADC(uint8_t channel) {&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
	uint16_t result = 0;&lt;br /&gt;
	&lt;br /&gt;
	// Den ADC aktivieren und Teilungsfaktor auf 64 stellen&lt;br /&gt;
	ADCSRA = (1&amp;lt;&amp;lt;ADEN) | (1&amp;lt;&amp;lt;ADPS2) | (1&amp;lt;&amp;lt;ADPS1);&lt;br /&gt;
&lt;br /&gt;
	// Kanal des Multiplexers waehlen&lt;br /&gt;
	ADMUX = channel;&lt;br /&gt;
	// Interne Referenzspannung verwenden (also 2,56 V)&lt;br /&gt;
	ADMUX |= (1&amp;lt;&amp;lt;REFS1) | (1&amp;lt;&amp;lt;REFS0);&lt;br /&gt;
	&lt;br /&gt;
	// Den ADC initialisieren und einen sog. Dummyreadout machen&lt;br /&gt;
	ADCSRA |= (1&amp;lt;&amp;lt;ADSC);&lt;br /&gt;
	while(ADCSRA &amp;amp; (1&amp;lt;&amp;lt;ADSC));&lt;br /&gt;
	&lt;br /&gt;
	// Jetzt 3x die analoge Spannung and Kanal channel auslesen&lt;br /&gt;
	// und dann Durchschnittswert ausrechnen.&lt;br /&gt;
	for(i=0; i&amp;lt;3; i++) {&lt;br /&gt;
		// Eine Wandlung&lt;br /&gt;
		ADCSRA |= (1&amp;lt;&amp;lt;ADSC);&lt;br /&gt;
		// Auf Ergebnis warten...&lt;br /&gt;
		while(ADCSRA &amp;amp; (1&amp;lt;&amp;lt;ADSC));&lt;br /&gt;
		&lt;br /&gt;
		result += ADCW;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// ADC wieder deaktivieren&lt;br /&gt;
	ADCSRA &amp;amp;= ~(1&amp;lt;&amp;lt;ADEN);&lt;br /&gt;
	&lt;br /&gt;
	result /= 3;&lt;br /&gt;
	&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
	uint16_t result = readADC(0);	//Auslesen der analogen Spannungen an Pin 0,&lt;br /&gt;
					// also ADC0. In result steht das Ergebnis.&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bascom'''&amp;lt;br&amp;gt;&lt;br /&gt;
Dieses Programmbeispiel ist für die [[Atmel Controller Mega16 und Mega32]] gedacht. Es gibt nacheinander die Spannungen der einzelnen Kanäle (ADC0..7) aus. Dazwischen macht es immer 800 ms pause.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
' Die gemessene Spannung wird in der Variablen W gespeichert.&lt;br /&gt;
' Channel ist der Pin, an dem die Spannung gemessen werden soll.&lt;br /&gt;
&lt;br /&gt;
$baud = 9600&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
$regfile &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
Config Adc = Single , Prescaler = Auto&lt;br /&gt;
Start Adc&lt;br /&gt;
Dim W As Word , Channel As Byte&lt;br /&gt;
Channel = 0&lt;br /&gt;
Do&lt;br /&gt;
  W = Getadc(channel)&lt;br /&gt;
  Print &amp;quot;ADC-Pin &amp;quot; ; Channel ; &amp;quot;: Wert &amp;quot; ; W&lt;br /&gt;
  Incr Channel&lt;br /&gt;
  If Channel &amp;gt; 7 Then Channel = 0&lt;br /&gt;
  Waitms 800&lt;br /&gt;
Loop&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Registerübersicht ===&lt;br /&gt;
'''Hinweis:''' Diese Registertabellen wurden für den aktuellen [[Atmel Controller Mega16 und Mega32]] erstellt. Wenn Sie ein anderes Modell verwenden kann es sein, dass ein oder mehrere Register nicht existieren, oder sie eine andere Bezeichnung haben.&lt;br /&gt;
&lt;br /&gt;
{| {{Blaueschmaltabelle}} width=100%&lt;br /&gt;
 |'''ADCSRA (ADC Control and Status Register A)'''&lt;br /&gt;
 |-&lt;br /&gt;
 |Dieser Register dient dazu den ADC zu kontrollieren.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Registertabelle8Bit|ADEN|ADSC|ADATE|ADIF|ADIE|ADPS2|ADPS1|ADPS0}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
*'''ADEN (ADC Enable)'''&amp;lt;br/&amp;gt;Wird dieses Bit gesetzt (also 1), dann wird der ADC aktiviert. Schreibt man eine 0 wird der ADC deaktiert. Wird der ADC während einer Wandlung deaktiviert, wird die Wandlung abgebrochen.&lt;br /&gt;
*'''ADSC (ADC Start Conversion)'''&amp;lt;br/&amp;gt;Dieses Bit startet den Messvorgang, je nachdem in welchem Betriebsmodi der ADC läuft. Wird dieses Bit nach der Aktivierung des ADC über '''ADEN''' zum ersten Mal gesetzt, wird der ADC erst eine Initialisierungswandlung durchführen und danach erst die eigentliche Wandlung. Das Schreiben einer 0 auf das Bit hat keinen Effekt.&lt;br /&gt;
*'''ADATE (ADC Auto Trigger Enable)'''&amp;lt;br/&amp;gt;Wird dieses Bit gesetzt, wird das Auto Triggering des ADC aktiviert.&lt;br /&gt;
*'''ADIF (ADC Interrupt Flag)'''&amp;lt;br/&amp;gt;Dieses Bit wird auf 1 gesetzt, wenn eine Wandlung erfolgte und das Ergebnis nun verfügbar ist. Der ADC Complete Interrupt wird ausgelöst, wenn das '''ADIE'''-Bit gesetzt ist und die Interrupts global aktiviert sind. Das Bit wird gelöscht, wenn die entsprechende ISR abgearbeitet wird. Alternativ kann man es löschen, indem man eine 1 auf das Bit schreibt.&lt;br /&gt;
*'''ADIE (ADC Interrupt Enable)'''&amp;lt;br/&amp;gt;Wird dieses Bit gesetzt und die globalen Interrupts sind aktiviert, wird der ADC Complete Interrupt aktiviert, auf den man dann in der entsprechenden ISR reagieren kann.&lt;br /&gt;
*'''ADPS2 (ADC Prescaler Select Bit 2)'''&amp;lt;br/&amp;gt;Diese Bits bestimmen den Teilungsfaktor zwischen der XTAL-Frequenz (also der Taktfrequenz) und dem Eingangstakt des ADC. Zum Wandeln benötigt der ADC einen eigenen Takt, der auf der Taktfrequenz des Mikrocontrollers basiert. Allerdings ist die Taktfrequenz zu schnell und deswegen wird diese durch den Vorteiler verkleinert. Der resultierende Takt muss zwischen 50kHz und 200kHz liegen. Siehe [[Avr#Teilungsfaktor]]. Folgende Teilungsfaktoren sind verfügbar:&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''ADPS2'''&lt;br /&gt;
 |'''ADPS1'''&lt;br /&gt;
 |'''ADPS0'''&lt;br /&gt;
 |'''Teilungsfaktor'''&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |2&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |2&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |4&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |8&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |16&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |32&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |64&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |128&lt;br /&gt;
 |}&lt;br /&gt;
*'''ADPS1 (ADC Prescaler Select Bit 1)'''&amp;lt;br/&amp;gt;Siehe '''ADPS2''' für eine Beschreibung.&lt;br /&gt;
*'''ADPS0 (ADC Prescaler Select Bit 0)'''&amp;lt;br/&amp;gt;Siehe '''ADPS2''' für eine Beschreibung.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| {{Blaueschmaltabelle}} width=100%&lt;br /&gt;
 |'''ADMUX (ADC Multiplexer Selection Register)'''&lt;br /&gt;
 |-&lt;br /&gt;
 |Mit diesem Register wird der Multiplexer gesteuert.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Registertabelle8Bit|REFS1|REFS0|ADLAR|MUX4|MUX3|MUX2|MUX1|MUX0}}&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
*'''REFS1 (Reference Selection Bit 1)'''&amp;lt;br/&amp;gt;Mit diesem Bit kann steuern, welche Referenzspannung der ADC verwenden soll. Die möglichen Quellen sind unten aufgelistet. Wird während einer Wandlung die Quelle für die Referenzspannung geändert, wird die aktuelle Wandlung mit der &amp;quot;alten&amp;quot; Quellen zuerste beendet, bevor die neue Einstellung übernommen wird.&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''REFS1'''&lt;br /&gt;
 |'''REFS0'''&lt;br /&gt;
 |'''Referenzspannungsquelle'''&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |AREF, internes Vref deaktiviert&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |AVCC mit externen Kondensator am AREF Pin&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |Keine Funktion, reserviert&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |Interne 2,56V Spannungsreferenz mit externen Kondensator am AREF Pin&lt;br /&gt;
 |}&lt;br /&gt;
*'''REFS0 (ADC Start Conversion)'''&amp;lt;br/&amp;gt;Siehe '''REFS1'''.&lt;br /&gt;
*'''ADLAR (ADC Left Adjust Result)'''&amp;lt;br/&amp;gt;Dieses Bit beeinflusst, wie der ermittelte Messwert im ADC Data Register abgelegt wird.&lt;br /&gt;
*'''MUX4 (Analog Channel and Gain Selection Bit 4)'''&amp;lt;br/&amp;gt;Dieses Bit wird auf 1 gesetzt, wenn eine Wandlung erfolgte und das Ergebnis nun verfügbar ist. Der ADC Complete Interrupt wird ausgelöst, wenn das '''ADIE'''-Bit gesetzt ist und die Interrupts global aktiviert sind. Das Bit wird gelöscht, wenn die entsprechende ISR abgearbeitet wird. Alternativ kann man es löschen, indem man eine 1 auf das Bit schreibt.&lt;br /&gt;
*'''MUX3 (Analog Channel and Gain Selection Bit 3)'''&amp;lt;br/&amp;gt;Mit diesen Bits ('''MUX3''' bis '''MUX0''') wird der Kanal des Multiplexers eingestellt, der mit dem ADC verbunden ist.&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''MUX4..0'''&lt;br /&gt;
 |'''Pin'''&lt;br /&gt;
|-&lt;br /&gt;
 |00000&lt;br /&gt;
 |ADC0&lt;br /&gt;
|-&lt;br /&gt;
 |00001&lt;br /&gt;
 |ADC1&lt;br /&gt;
|-&lt;br /&gt;
 |00010&lt;br /&gt;
 |ADC2&lt;br /&gt;
|-&lt;br /&gt;
 |00011&lt;br /&gt;
 |ADC3&lt;br /&gt;
|-&lt;br /&gt;
 |00100&lt;br /&gt;
 |ADC4&lt;br /&gt;
|-&lt;br /&gt;
 |00101&lt;br /&gt;
 |ADC5&lt;br /&gt;
|-&lt;br /&gt;
 |00110&lt;br /&gt;
 |ADC6&lt;br /&gt;
|-&lt;br /&gt;
 |00111&lt;br /&gt;
 |ADC7&lt;br /&gt;
 |}&lt;br /&gt;
Es reicht also einfach die Pinnummer in ADMUX zu schreiben.&lt;br /&gt;
*'''MUX2 (Analog Channel and Gain Selection Bit 2)'''&amp;lt;br/&amp;gt;Siehe '''MUX3''' für eine Beschreibung.&lt;br /&gt;
*'''MUX1 (Analog Channel and Gain Selection Bit 1)'''&amp;lt;br/&amp;gt;Siehe '''MUX3''' für eine Beschreibung.&lt;br /&gt;
*'''MUX0 (Analog Channel and Gain Selection Bit 0)'''&amp;lt;br/&amp;gt;Siehe '''MUX3''' für eine Beschreibung.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Des Weiteren gibt es noch den Register '''ADCL/ADCH''' in dem das Ergebnis einer Wandlung steht. Man liest den Wert folgendermaßen aus:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uint16_t x = ADCL;&lt;br /&gt;
x += (ADCH&amp;lt;&amp;lt;8);&lt;br /&gt;
// oder&lt;br /&gt;
x = ADCW;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TWI/I2C ==&lt;br /&gt;
Für Details über das Two-wire Serial Interface (kurz TWI) siehe Artikel [[TWI]].&lt;br /&gt;
&lt;br /&gt;
== UART/USART ==&lt;br /&gt;
Für Details über den UART)/USART siehe Artikel [[UART]].&lt;br /&gt;
&lt;br /&gt;
== Die Fusebits ==&lt;br /&gt;
Fusebits nennt man bestimmte Bits zur Konfigurierung eines AVR-Controllers. Bei der Auslieferung neuer AVR Controller sind die Fusebits bereits vorkonfiguriert. In vielen Fällen kann man die Konfiguration unverändert belassen, je nach Controllertyp. Bei den Typen Mega xxx bestimmen einige Fusebits beispielsweise, dass der interne Taktgeber aktiviert ist. Möchte man dagegen einen externen Quarz anschließen oder die Taktfrequenz ändern, so müssen auch die Fusebits geändert werden. Auch das Deaktivieren des &amp;quot;[[On Chip Debugging]]&amp;quot; Modus ist oft notwendig, wenn man alle Ports ausnutzen möchte. &lt;br /&gt;
&lt;br /&gt;
Die Fusebits werden in der Regel über die Software eingestellt, welche auch für das Übertragen des Programmcodes zuständig ist. Besonders einfach geht dies beispielsweise mit der Entwicklungsumgebung [[Bascom]]. Aber auch andere Programme wie [[PonyProg]] können für die Umstellung der Fusebits genutzt werden. Einmal eingestellte Fusebits bleiben bis zur erneuten Fusebit-Änderung erhalten. Der normale Programmiermodus verändert die Fusebits nicht. &lt;br /&gt;
&lt;br /&gt;
Je nach AVR Controllertyp sind unterschiedliche Fusebits (Einstellungen) vorhanden. Die genaue Beschreibung findet man im jeweiligen Datenblatt. Da aber falsch gesetzte Fusebit-Einstellungen zu den häufigsten Problemen gehören, liste ich hier die Funktion der üblichen Fusebits nochmals genauer auf:&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''CKSEL0, CKSEL1, CKSEL2, CKSEL3'''&lt;br /&gt;
 |Die Kombination dieser 4 Fusebits bestimmt die Taktquelle des Controllers. Das kann eine interner Taktgenerator, ein Quarz, Quarzoszillator, RC-Glied und ähnliches sein.&lt;br /&gt;
|-&lt;br /&gt;
 |'''JTAGEN'''&lt;br /&gt;
 |Hiermit wird die &amp;quot;[[On Chip Debugging]]&amp;quot; Schnittstelle aktiviert bzw. deaktiviert. Das sind die Bits mit den Bezeichnungen TDI, TDO, TMS und TCK. Möchte man diese Pins als normalen Port nutzen, so muss diese Schnittstelle immer deaktiviert werden. &lt;br /&gt;
|-&lt;br /&gt;
 |'''SUT0, SUT1'''&lt;br /&gt;
 |Die sogenannte StartUp-Zeit (PowerOn delay). Diese Einstellung muss abhängig von der Art des Taktgenerators eingestellt werden, genaueres im jeweiligen Datenblatt. &lt;br /&gt;
|-&lt;br /&gt;
 |'''SPIEN'''&lt;br /&gt;
 |Hiermit kann die serielle [[AVR-ISP Programmierkabel|ISP-Programmierung]], welche die meisten Programmierkabel nutzen, deaktiviert werden. Dies sollte man lieber vermeiden, denn wenn dieser Programmiermodus deaktiviert wurde, kann nur noch der Parallel-Programmiermodus genutzt werden. Der Parallel-Programmiermodus benötigt jedoch ein spezielles Programmiergerät, das die wenigsten Bastler besitzen. ''Also Vorsicht!''&lt;br /&gt;
|-&lt;br /&gt;
 |'''BODEN'''&lt;br /&gt;
 |Über dieses Bit wird der '''Brown-out Detector''' aktiviert bzw. deaktiviert. Dies ist eine Überwachung der Betriebsspannung. Diese Überwachung soll dafür sorgen, dass bei Spannungseinbrüchen ein ordentlicher RESET durchgeführt wird. Dadurch wird verhindert, dass ein Controller in einen undefinierten Zustand gerät (hängen bleibt).&lt;br /&gt;
|-&lt;br /&gt;
 |'''BOOTLEVEL'''&lt;br /&gt;
 |Über dieses  Bit kann die Spannung festgelegt werden, ab welcher der '''Brown-out Detector''' den Controller neu startet (also RESET ausführt). &lt;br /&gt;
|-&lt;br /&gt;
 |'''BOOTRST'''&lt;br /&gt;
 |Gewöhnlich startet ein Programm im Controller nach einem RESET ab Adresse 0. Durch dieses Fusebit kann der Controller jedoch veranlasst werden, nach einem Reset einen sogenannten Bootloader-Bereich auszuführen. Ein [[Bootloader]] kann genutzt werden, um Controller über andere Schnittstellen (z.B. RS232) zu programmieren.&lt;br /&gt;
|-&lt;br /&gt;
 |'''BOOTSZ0, BOOTSZ1'''&lt;br /&gt;
 |Der zuvor genannte Bootloaderbereich kann bei AVR-Controllern verschieden groß sein. Über diese beiden Bits können vier verschiedene Größen eingestellt werden. Siehe unter [[Bootloader]].&lt;br /&gt;
|-&lt;br /&gt;
 |'''EESAVE'''&lt;br /&gt;
 |Dieses Bit legt fest, ob beim Programmieren des Controllers (man nennt es auch brennen) immer das EEPROM gelöscht werden soll.&lt;br /&gt;
|-&lt;br /&gt;
 |'''CKOPT'''&lt;br /&gt;
 |Abhängig von den Einstellungen von CKSEL kann hier dir Oszillator-Verstärkung eingestellt werden. Genaueres im Datenblatt des jeweiligen Controllers.&lt;br /&gt;
|-&lt;br /&gt;
 |'''WDTON'''&lt;br /&gt;
 |Schaltet den WatchDog-Timer beim Booten ein/aus. Dies ist auch per Software möglich&lt;br /&gt;
|-&lt;br /&gt;
 |'''RSTDISBL'''&lt;br /&gt;
 |Durch dieses Bit kann man den RESET-Pin deaktivieren und dann als normalen I/O-Port nutzen. Aber Vorsicht! Da die RESET-Leitung beim Programmieren (Brennen) des Chips genutzt wird, kann man nach dessen Deaktivierung den Controller mit den üblichen [[AVR-ISP Programmierkabel|ISP-Adaptern]] nicht mehr programmieren. In diesem Fall könnte man zwar den Controlle noch mit speziellen Programmiergeräten im Parallelmodus programmieren, aber in der Praxis verfügen nur wenige Bastler über ein Programmiergerät, das dies leistet.&lt;br /&gt;
|-&lt;br /&gt;
 |'''LB1, LB2'''&lt;br /&gt;
 |Das sind die sogenannten Lockbits, mit denen sich das Auslesen des Flash- als auch EEPROM-Speichers verhindern läßt. Zwar können andere Anwender immer noch Daten lesen, allerdings handelt es sich dabei nicht mehr um den wirklichen Inhalt sondern lediglich um wirre Datenbytefolgen. Programmierer, die den erarbeiteten Code vor Raubkopierern schützen wollen, nutzen diese Lockbits. Das Programmieren ist auch bei gesetzen Lockbits noch möglich. Der Bootloader-Bereich wird nicht durch die Lockbits geschützt.&lt;br /&gt;
|-&lt;br /&gt;
 |'''BLB01, BLB02'''&lt;br /&gt;
 |Durch diese Bits kann der Code sogar vor dem Zugriff durch den Bootloader geschützt werden&lt;br /&gt;
|-&lt;br /&gt;
 |'''BLB11, BLB12'''&lt;br /&gt;
 |Diese Bits schützen den Bootloaderbereich selbst&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wie man die Fusebits mit [[Bascom]] einstellt, wird im Beitrag [[Bascom - Erstes Programm in den AVR Controller übertragen]] erläutert.&lt;br /&gt;
&lt;br /&gt;
''Autoren des Artikels: Frank, Luma'' &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Atmel]]&lt;br /&gt;
* [[On Chip Debugging]]&lt;br /&gt;
* [[Bootloader]]&lt;br /&gt;
* [[Avr-gcc|avr-gcc]] - Leistungsfähiger AVR-Port des freien Compilers GCC&lt;br /&gt;
* [[Bascom]] - Sehr gutes Basic-Entwicklungssystem&lt;br /&gt;
* [[WinAVR]] - Ein freies Werkzeugpaket auf Basis avr-gcc für die Windows-Platform, integriert unter anderem das [[Programmer's Notepad]]&lt;br /&gt;
* [[AVR-Einstieg leicht gemacht]]&lt;br /&gt;
* [[Bascom - Erstes Programm in den AVR Controller übertragen]]&lt;br /&gt;
* [[AVR_Assembler_Einf%C3%BChrung|AVR Assembler Einführung (AvrStudio)]]&lt;br /&gt;
* [[AVR-ISP Programmierkabel]] - Bauanleitung für die AVR Controller Programmierkabel&lt;br /&gt;
* [[RN-Control]] - Eines der beliebtestet AVR-Boards im Roboternetz&lt;br /&gt;
* [[RNBFRA-Board]] - Größeres Board mit zwei Atmel Controllern&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
* [http://www.atmel.com/dyn/products/param_table.asp?family_id=607&amp;amp;OrderBy=part_no&amp;amp;Direction=ASC Aktuelle AVR Vergleichstabelle]&lt;br /&gt;
* [http://www.atmel.com/dyn/products/devices.asp?family_id=607 Die Datenblätter zu Atmel Controllern]&lt;br /&gt;
* [https://mpg.dnsalias.com/~magerlu/rn-wiki/avrtimer_applet Java Applet Timer Berechnung]&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/dload.php?action=file&amp;amp;file_id=169 AvrTimer Windows Berechnungstool]&lt;br /&gt;
* [http://people.freenet.de/gjl/helferlein/avr-uart-rechner.html AVR-Baudraten-Rechner (JavaScript)]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Abkürzung|AVR]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Avr&amp;diff=7180</id>
		<title>Avr</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Avr&amp;diff=7180"/>
				<updated>2006-05-04T21:26:37Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: Kleine Detailverbesserungen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:AtmelController.jpg|thumb|Beispiel eines AVR Controllers]]&lt;br /&gt;
'''AVR''' ist eine 8-Bit [[Microcontroller]]-Familie mit RISC-Architektur.&lt;br /&gt;
Im Gegensatz zu vielen anderen Microcontroller-Architekturen hat die AVR-Architektur keine Vorgänger. Sie ist ein komplettes Neudesign, das Anfang der 90-Jahre an der Universität von Trondheim/Norwegen entwickelt und vom (bis heute einzigen) Hersteller [[Atmel]] aufgekauft wurde. Es gibt eine ganze Serie von AVR-Controllern. Sie alle werden ähnlich programmiert, haben vergleichbaren Befehlssatz und physikalische Eigenschaften, bieten jedoch unterschiedliche Features und Peripherie. &lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche und kostenlose Entwicklungssysteme in den Sprachen Basic, C/C++, Pascal und Assembler für diese Controller-Familie. &lt;br /&gt;
&lt;br /&gt;
==Wofür steht AVR?==&lt;br /&gt;
&amp;quot;AVR&amp;quot; steht angeblich für ''Advanced Virtual RISC'' (in einem Paper der Entwickler des AVR-Kerns Alf Egin Bogen und Vegard Wollan). Laut [[Atmel]] bedeutet es nichts.&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
AVR-Controller besitzen eine zweistufige Pipeline (fetch and execute), die es ermöglicht, die meisten Befehle innerhalb eines einzigen Prozessortaktes auszuführen. Dadurch ist ein AVR wesentlich schneller als etwa 8051-Controller, bei denen der Prozessortakt intern noch durch 12 geteilt wird.&lt;br /&gt;
&lt;br /&gt;
*AVR-Kern&lt;br /&gt;
** Harvard-Architektur (getrennter Befehls- und Datenspeicher) &lt;br /&gt;
** 32 Register, kein Akkumulator, 3 Pointerregister &lt;br /&gt;
** EEPROM-Datenspeicher&lt;br /&gt;
** [[Watchdog]], [[Bootloader]]-Support, verschiedene Stromspar-Modi, Brownout-Erkennung, Interner Oszillator&lt;br /&gt;
** Lineares Speichermodell (keine Segmentierung)&lt;br /&gt;
** 8-Bit Architektur ist für Hochsprachen (C) optimiert &lt;br /&gt;
* In-System programmierbar: die Controller können sehr einfach über ein  Programmierkabel (oft ISP-Kabel genannt), das mit dem PC verbunden wird, programmiert werden &amp;amp;ndash; auch dann, wenn sie sich nicht in einer Schaltung befindet.&lt;br /&gt;
* umfangreiche Peripherie&lt;br /&gt;
** 8- und 16-Bit-Timer/Counter mit [[PWM]], Capture/Compare, externe Betaktung, asynchrone Operation&lt;br /&gt;
** Kommunikation: [[UART|USART]], [[SPI]], [[I2C]] ([[TWI]])&lt;br /&gt;
** Analog-Comparator, Analog-Digital-Wandler &lt;br /&gt;
** unterschiedlichste externe und interne Interrupt-Quellen (UART, SPI, Timer, A/D-Wandler, Analog-Comparator, ...)&lt;br /&gt;
** JTAG (Debugerinterface)&lt;br /&gt;
* AVR Typen (AT90 &amp;quot;Classic AVR&amp;quot;, ATtiny, ATmega) &lt;br /&gt;
* erhältlich in unterschiedlichen Gehäusen, idR Durchsteck und als [[SMD]]&lt;br /&gt;
* Viele Entwicklungsboards erhältlich, z.B. das Roboternetzboard [[RN-Control]]&lt;br /&gt;
&lt;br /&gt;
==Einige Pinbelegungen der populärsten AVR-Controller==&lt;br /&gt;
(in etwa nach Leistungsfähigkeit sortiert)&lt;br /&gt;
&lt;br /&gt;
* [[AT90S2313]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:at90s2313tiny.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Atmel Controller Mega8]]&lt;br /&gt;
* [[Atmel Controller Mega48 Mega88 Mega168]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:mega8kompatibel.png|center]]&lt;br /&gt;
&lt;br /&gt;
* [[Atmel Controller Mega16 und Mega32]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mega1632.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Atmel Controller Mega128]] ([[SMD]]-Chip)&lt;br /&gt;
&lt;br /&gt;
[[Bild:mega128pin.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===Die AVR-Pin-Bezeichnungen und deren Funktion===&lt;br /&gt;
Die meisten Ports sind doppelt belegt und besitzen neben der normalen Port-Funktion noch eine Sonderfunktion. Die verschiedenen Pinbezeichnungen und Sonderfunktionen werden hier beschrieben:&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|+ '''Tabelle: Die AVR-Pin-Bezeichnungen und deren Funktion'''&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Versorgungs- und Referenzpins, Reset&lt;br /&gt;
|-&lt;br /&gt;
 |'''VCC''' &lt;br /&gt;
 | Versorgungsspannung von 2,7 Volt bis 6 V bei den L-Varianten (low power), ansonsten 4,5V bis 6V. Die nächste AVR-Generation soll ab 1,8 Volt funktionieren.&lt;br /&gt;
|-&lt;br /&gt;
 |'''GND''' &lt;br /&gt;
 |Masse &lt;br /&gt;
|-&lt;br /&gt;
 |'''AREF''' &lt;br /&gt;
 |Referenzspannung für den Analog-Digital-Wandler (kann auf 5V gesetzt werden). Auch die interne Bandgap-Referenzspannung kann über diesen Pin entstört werden (dann KEINE externe Spannung an diesen Pin geben (Kurzschluss)!). &lt;br /&gt;
|-&lt;br /&gt;
 |'''AGND''' &lt;br /&gt;
 |Alternative Masse, etwa um ein Verbindungspunkt mit GND zu haben und bei empfindlichen Messungen  Masseschleifen zu vermeiden.&lt;br /&gt;
|-&lt;br /&gt;
 |'''AVCC''' &lt;br /&gt;
 | &lt;br /&gt;
Die Betriebsspannung für den Analog-Digital-Wandler (siehe Beschaltungsskizze). Die Pins AVCC, AGND und AREF sollten immer beschaltet werden, da es sonst passieren kann, dass Port A nicht richtig funktioniert, selbst wenn man den AD-Wandler nicht benutzt. &lt;br /&gt;
|-&lt;br /&gt;
 |'''RESET''' &lt;br /&gt;
 |Rücksetz-Eingang, intern über einen [[Pullup]] mit VCC verbunden. Ein LOW–Pegel an diesem Pin für die Dauer von mindestens zwei Zyklen des Systemtaktes bei aktivem Oszillator setzt den Controller zurück. Rücksetzen der Ports erfolgt unabhängig von einem evtl. anliegenden Systemtakt.&lt;br /&gt;
|-&lt;br /&gt;
|'''PEN'''&lt;br /&gt;
|Programming Enable - Diesen Pin gibt es nur beim Mega128/64 u.ä. Wird dieser Pin beim Power-On Reset nach Masse gezogen, geht der Controller in den [[ISP]] Programmiermodus. Man kann ihn also alternativ zu Reset verwenden. In der Regel verwendet man aber die Reset-Leitung und PEN sollte man direkt mit VCC verbinden.&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| System-Takt&lt;br /&gt;
|-&lt;br /&gt;
 |'''XTAL1''' &lt;br /&gt;
 |Eingang des internen Oszillators zur Erzeugung des Systemtaktes bzw. Eingang für ein externes Taktsignal, wenn der interne Oszillator nicht verwendet werden soll bzw. Anschluss von Quarz/Keramik-Resonator/RC-Glied.&lt;br /&gt;
|-&lt;br /&gt;
 |'''XTAL2''' &lt;br /&gt;
 |Anschluss von Quarz oder Keramik-Resonator oder Ausgang des integrierten Oszillators zur Nutzung als Systemtakt (Je nach Fuse-Einstellungen). &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Digitale bidirektionale  I/O-Ports&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;| Jeder Pin der Ports kann individuell als Eingang oder Ausgang konfiguriert werden. Die I/O-Ports sind maximal 8 Bit breit und verfügen ja nach AVR-Typ über eine unterschiedliche Anzahl von Pins. An jedem als Eingang (Input) geschalteten Pin gibt es zuschaltbare [[Pullup]]-Widerstände, die teilweise auch bei aktivierter Sonderfunkton verfügbar sind.&lt;br /&gt;
&lt;br /&gt;
Bei eingeschalteten Sonderfunktionen wie UART, SPI, ADC, etc. sind die entsprechenden Pins nicht als &amp;quot;normale&amp;quot; digitale I/O verwendbar, sondern dienen der Sonderfunktion. Die Anzahl der als I/O verwendbaren Pins ist auch abhängig von den Fuse-Einstellungen (Vorsicht beim Umstellen, Handbuch GENAU lesen!).&lt;br /&gt;
|-&lt;br /&gt;
|'''PA 0 – 7''' || Port A &lt;br /&gt;
|-&lt;br /&gt;
|'''PB 0 – 7''' || Port B &lt;br /&gt;
|-&lt;br /&gt;
|'''PC 0 – 7''' || Port C &lt;br /&gt;
|-&lt;br /&gt;
|'''PD 0 – 7''' || Port D &lt;br /&gt;
|-&lt;br /&gt;
|'''PE 0 – 7''' || Port E &lt;br /&gt;
|-&lt;br /&gt;
|'''PF 0 – 7''' || Port F &lt;br /&gt;
|-&lt;br /&gt;
|'''PG 0 – 7''' || Port G &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Externe Interrupts&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;| Die PCINT-Interrupts gibt es nur für neuere AVRs wie den [[ATmega88]]. Falls die Anzahl an externen Interrupts nicht ausreicht, kann evtl. auch andere Hardware dafür eingesetzt werden, etwa der Analog-Comparator mit interner Bandgap-Referenz, falls er anderwärtig nicht gebraucht wird.&lt;br /&gt;
|-&lt;br /&gt;
 |'''INT0''' ||Externer Interrupt 0&lt;br /&gt;
|-&lt;br /&gt;
 |'''INT1''' ||Externer Interrupt 1&lt;br /&gt;
|-&lt;br /&gt;
 |'''INT2''' ||Externer Interrupt 2 &lt;br /&gt;
|-&lt;br /&gt;
 |'''PCINTx''' ||Pin-Change Interrupt&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| [[Timer]] und [[PWM]]&lt;br /&gt;
|-&lt;br /&gt;
 |'''T0''' &lt;br /&gt;
 |Timer-Eingang. Timer kann gestartet, gestoppt oder getaktet werden &lt;br /&gt;
|-&lt;br /&gt;
 |'''T1''' &lt;br /&gt;
 |Timer-Eingang. Timer kann gestartet, gestoppt oder getaktet werden &lt;br /&gt;
|-&lt;br /&gt;
 |'''OC0''' &lt;br /&gt;
 |PWM bzw. Output Compare Ausgang des Timers 0 &lt;br /&gt;
|-&lt;br /&gt;
 |'''OC1A''' &lt;br /&gt;
 |Ausgang für die Compare-Funktion des integrierten Zeitgeber- / Zählerbausteines &lt;br /&gt;
Der erste PWM-Ausgang des Timers1. Er kann zum Regeln der Bot-Motogeschwindigkeit benutzt werden. &lt;br /&gt;
|-&lt;br /&gt;
 |'''OC1B''' &lt;br /&gt;
 |Ausgang für die Compare-Funktion des integrierten Zeitgeber- / Zählerbausteines &lt;br /&gt;
Der zweite PWM-Ausgang des Timers1. Er kann zum Regeln der Bot-Motogeschwindigkeit benutzt werden. &lt;br /&gt;
|-&lt;br /&gt;
 |'''ICP1''' &lt;br /&gt;
 |Eingang für die Capture-Funktion des integrierten Zeitgebers / Zählerbausteines &lt;br /&gt;
|-&lt;br /&gt;
 |'''OC2''' &lt;br /&gt;
 |[[Pwm]] bzw. Output Compare Ausgang des Timers2. Er kann zum Regeln der Bot-Motogeschwindigkeit benutzt werden. &lt;br /&gt;
|-&lt;br /&gt;
 |'''TOSC1, TOSC2''' &lt;br /&gt;
 |TOSC1 und TOSC2 sind Eingänge für den asynchronen Modus von Timer2. Sie sind vorgesehen für den Anschluss eines externen Uhrenquarzes ( 32.768 kHz ). Damit lassen sich zum Beispiel sehr genaue Ein-Sekunden-Impulse für eine Uhr generien. &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Analog-Digital-Wandler&lt;br /&gt;
|-&lt;br /&gt;
 |'''ADC0''' bis '''ADC7''' &lt;br /&gt;
 |Eingänge des AD-Wandlers. Spannungen können hier gemessen werden oder an den Analog-Komparator weiter geleitet werden. &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Analog-Komparator&lt;br /&gt;
|-&lt;br /&gt;
 |'''AIN0, AIN1''' &lt;br /&gt;
 |Die beiden externen Eingänge des Analog-Komparators. &lt;br /&gt;
Mit AIN0(+) und AIN1(-) kann man zwei Spannungen miteinander vergleichen. Wenn die Spannung an AIN0 höher als bei AIN1 ist, liefert der Komparator &amp;quot;High&amp;quot;, ansonsten ein &amp;quot;Low&amp;quot;. Als interne Eingänge des Komparators können die Interne Bandgap-Referenzspannung oder Ausgänge des ADC-Multiplexers dienen.&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Serielle Schnittstelle ([[UART|USART]])&lt;br /&gt;
|-&lt;br /&gt;
 |'''RXD''' &lt;br /&gt;
 |Eingang der Seriellen Schnittstelle (Receive Data), TTL-Pegel &lt;br /&gt;
|-&lt;br /&gt;
 |'''TXD''' &lt;br /&gt;
 |Ausgang Serielle Schnittstelle (Transmit Data), TTL-Pegel &lt;br /&gt;
|-&lt;br /&gt;
 |'''XCK''' &lt;br /&gt;
 |Externe Takt für den USART. Wird nur in Sonderfällen für den Takt benötigt. &lt;br /&gt;
USART (&amp;quot;Universal Synchronous/Asynchronous Receiver and Transmitter&amp;quot;). Das ist die serielle Schnittstelle, die zur Datenübertragung zwischen Mikrocontroller und PC genutzt wird. Zur bidirektionalen Übertragung werden zwei Pins am Controller benötigt: TXD und RXD. Über TXD (&amp;quot;Transmit Data&amp;quot;) werden Daten gesendet, RXD (&amp;quot;Receive Data&amp;quot;) dient zum Empfang. &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| [[SPI]]-Schnittstelle&lt;br /&gt;
|-&lt;br /&gt;
 |'''SS''' &lt;br /&gt;
 |SPI-Interface – wird beneötigt um den richtigen Slave am Bus zu wählen &lt;br /&gt;
|-&lt;br /&gt;
 |'''MOSI''' &lt;br /&gt;
 |SPI-Interface – Datenausgang (als Master) oder Dateneingang (als Slave), verwendet bei ISP (In-System-Programmierung)&lt;br /&gt;
|-&lt;br /&gt;
 |'''MISO''' &lt;br /&gt;
 |SPI-Interface – Dateneingang (als Master) oder Datenausgang (als Slave), verwendet bei ISP (In-System-Programmierung)&lt;br /&gt;
|-&lt;br /&gt;
 |'''SCK''' &lt;br /&gt;
 |SPI-Interface – Bustakt vom Master, verwendet bei ISP (In-System-Programmierung)&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| [[I2C|I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C]]-Schnittstelle ([[TWI]])&lt;br /&gt;
|-&lt;br /&gt;
 |'''SDA''' &lt;br /&gt;
 |I2C-Schnittstelle (Bus aus 2 Leitungen) Datenleitung &lt;br /&gt;
|-&lt;br /&gt;
 |'''SCL''' &lt;br /&gt;
 |I2C-Schnittstelle (Bus aus 2 Leitungen) Clockleitung &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| [[JTAG]]-Interface&lt;br /&gt;
|-&lt;br /&gt;
 |'''TDI''' &lt;br /&gt;
 |JTAG-Debug Interface - Über dieses Interface kann man den AVR programmieren und debuggen. Die Schnittstelle ist ähnlich wie die SPI Schnittstelle und hat getrennte Dateneingangs- und Datenausgangsleitungen sowie eine Taktleitung. TDI ist die Dateneingangsleitung&lt;br /&gt;
|-&lt;br /&gt;
 |'''TDO''' &lt;br /&gt;
 |JTAG-Debug Interface - TDO ist die Datenausgangsleitung des JTAG Interface&lt;br /&gt;
|-&lt;br /&gt;
 |'''TMS''' &lt;br /&gt;
 |JTAG-Debug Interface&lt;br /&gt;
|-&lt;br /&gt;
 |'''TCK''' &lt;br /&gt;
 |JTAG-Debug Interface &lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Timer/Counter ==&lt;br /&gt;
&lt;br /&gt;
Die Mikrocontroller der AVR-Familie besitzen je nach Typ eine unterschiedliche Anzahl an programmierbaren [[Timer|Timern]]. Bei den aktuellen ATmegas sind das mindestens ein 8-Bit Timer und bei größeren Ausführungen der Serie auch 16-Bit Timer. Die Timer werden immer Timerx benannt, wobei x für die Timernummer steht (also 0, 1, 2, usw.). &lt;br /&gt;
Die Konfigurationsmöglichkeiten sind von Timer zu Timer unterschiedlich.&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' Die folgenden Code-Beispiele sind in C programmiert und wurden für einen [[ATMega32|ATmega32]] entwickelt. Sie lassen sich also ohne große Änderungen auch auf anderen Mikrocontrollern der AVR-Familie einsetzen.&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine Funktionsweise ===&lt;br /&gt;
Timer funktionieren nach dem allgemeinen Prinzip, dass sie eine Ganzzahl (im weiteren als Zähler bezeichnet) je nach Betriebsmodus auf- oder abwärtszählen, d.h. inkrementieren bzw. dekrementieren.&lt;br /&gt;
&lt;br /&gt;
Angenommen, der Timer arbeitet im einfachsten Betriebsmodus, dem normalen Modus (siehe [[Avr#Normaler Modus (Normal Mode)|Normaler Modus (Normal Mode)]]). Die Zählrichtung des Timers ist aufsteigend gerichtet. Je nach Auflösung, also 8-Bit oder 16-Bit, erreicht der Zähler irgendwann einen bestimmten Zustand. Möglich wäre, dass er überläuft, wenn z.B. bei einem 8-Bit Timer der Wert 255 inkrementiert wird (siehe Grafik).&lt;br /&gt;
&lt;br /&gt;
[[Bild:AbstrakterZaehlvorgang.png]]&lt;br /&gt;
&lt;br /&gt;
=== Der Prescaler ===&lt;br /&gt;
Der Prescaler (eng. = Vorteiler) kann dazu genutzt werden, den Takt, der den Timern zugeführt wird, zu verkleinern. U.a. kann man damit die Timer so konfigurieren, damit diese in den unterschiedlichsten Frequenzen takten. Hier eine Grafik die den Prescaler veranschaulicht:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Prescaler.png]]&lt;br /&gt;
&lt;br /&gt;
Das obere Diagramm zeigt den Betrieb ohne Prescaler, das untere mit Prescaler. Die gestrichelte Linie zeigt, wann ein Interrupt eintritt.&lt;br /&gt;
&lt;br /&gt;
Im Teil [[Avr#Die Betriebsmodi|Die Betriebsmodi]] wird weiter auf die praktische Verwendung des Prescalers eingegangen.&lt;br /&gt;
&lt;br /&gt;
=== Die Betriebsmodi ===&lt;br /&gt;
Die AVR-Timer können in unterschiedlichen Betriebsmodi betrieben werden. Diese sind:&lt;br /&gt;
* Normaler Modus&lt;br /&gt;
* CTC Modus&lt;br /&gt;
* PWM&lt;br /&gt;
&lt;br /&gt;
==== Normaler Modus (Normal Mode) ====&lt;br /&gt;
Der einfachste Betriebsmodus ist der normale Modus. Er funktioniert wie im Abschnitt  &amp;quot;[[Avr#Allgemeine Funktionsweise|Allgemeine Funktionsweise]]&amp;quot; beschrieben. Die Zählrichtung des Timers ist immer aufsteigend, und irgendwann kommt es zu dem Interrupt Timer-Overflow (welcher in einer passend ISR aufgefangen werden kann). Im einfachsten Fall kann man diesen Modus in folgendem Diagramm darstellen:&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_1.png]]&lt;br /&gt;
&lt;br /&gt;
Der Zähler des Timers (im Diagramm oben, die aufsteigende und dann wieder zurückgesetzte Linie) ist in dem Register TCNTx gespeichert, wobei x für eine Zahl steht. Soll z.B. auf den Timer0 (siehe Datenblatt des jeweiligen Controllers) des Controllers zugegriffen werden, so ist an TCNT eine 0 anzuhängen, also TCNT0.&lt;br /&gt;
Wie lange es braucht, bis der Zähler einen Overflow auslöst, ist von der Taktfrequenz des Controllers, dem eingestellten Prescaler-Wert und von der Timerauflösung abhängig. Nun wäre es ja sehr unpraktisch, wenn wir den Zähler nicht anpassen könnten. Denn sonst müssten wir unsere Software die den Timer benutzt evtl. anpassen und viel rechnen um z.B. für 1000 ms zu schlafen. Deswegen kann auf den Zähler zugreifen und ihn vorladen bevor dieser wieder vom eigentlichen Timer hochgezählt wird. Dies veranschaulicht folgendes Diagramm:&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_1_Vorladen.png]]&lt;br /&gt;
&lt;br /&gt;
Dadurch kann man den Timer beeinflussen, und beeinflussen wie lange es dauert, bis ein Overflow auftritt. Um zu berechnen, welchen Wert wir vorladen müssen, kann man auch ein Java-Applet nutzen, siehe unter [[Avr#Weblinks|Weblinks Java Applet]].&lt;br /&gt;
&lt;br /&gt;
Natürlich kann man das auch &amp;quot;von Hand&amp;quot; rechnen. Die Berechnung des Preloader- sowie Prescalerwerts bei Verwendung der Overflow-Interrupts, eines Prescalers von 64 (nicht alle Prescaler können verwendet werden) und eines Quarzes mit der Frequenz von 8 MHz sieht folgendermaßen aus (gesuchte Frequenz beträgt 1000 Hz unter der Verwendung des Timer0 eines ATmega32):&lt;br /&gt;
# &amp;lt;math&amp;gt;Prescale = Frequenz * 1000000 [Hz] = 8000000&amp;lt;/math&amp;gt;&lt;br /&gt;
# Wir definieren den maximalen Zählerwert. Dieser ist bei einem 8-Bit Timer 256, bei einem 16-Bit Timer 65536. In unserem Fall ist der maximale Zählerwert 256, weil Timer0 verwendet wird.&lt;br /&gt;
# Nun wird die Variable ''Prescale'' (s.o.) durch den verwendeten Prescaler (64) geteilt (&amp;lt;math&amp;gt;8000000 Hz / 64 = 125000&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Als nächstes wird der im dritten Punkt errechnete Wert durch die gesuchte Frequenz geteilt &amp;lt;math&amp;gt;=125000 / 1000Hz = 125&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Nun wird mathematisch überprüft, ob der errechnete Wert aus dem vierten Punkt kleiner als der maximale Zählerwert ist. Trifft dies zu, so subtrahiert man den errechneten Wert vom maximalen Zählerwert (&amp;lt;math&amp;gt;= 256 - 125 = 131&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Damit haben wir den Wert errechnet, der bei jedem Interrupt, den der Timer0 auslöst, in TCNTx (in diesem Fall TCNT0) nachgeladen werden muss, damit die Interrupts in dem gewünschten Zeitabstand von einer Millisekunde ausgelöst werden.&lt;br /&gt;
&lt;br /&gt;
Allerdings bleibt zu bemerken, dass bei der Verwendung einer &amp;quot;ungeraden&amp;quot; Quarzfrequenz (z.B. 7,3728 MHz) der Timer mit einer bestimmten Ungenauigkeit arbeitet. Würden wir z.B. den Quarz oben mit einem Quarz mit 7,3728 MHz austauschen, so wäre die Fehlerrate 0,17%. Diese Ungeauigkeit varriert von verwendetem Prescaler zu Prescaler. D.h. wenn wir einen Prescaler von 1024 (und einer Quarzfrequenz von 8 MHz) verwendet hätten, so hätten wir eine inakzeptable Ungeauigkeit von 11,61%. Deswegen sollte sie eines der genannten Programme unter [[Avr#Weblinks]] verwenden, denn diese zeigen nur die bestmögliche Konfiguration an.&lt;br /&gt;
&lt;br /&gt;
Die Fehlerrate kann natürlich auch ausgerechnet werden. Hier die Rechenschritte (sie sind erweiternd zu der oberen Berechnung):&lt;br /&gt;
# Als erstes wird mathematisch überprüft, ob der Preloaderwert (siehe fünften Schritt oben) größer als 1 ist.&lt;br /&gt;
# Trifft dies zu, so wird als nächstes die resultierende Frequenz errechnet. Die geschieht folgendermaßen: Der errechnete Preloaderwert aus der Rechnung oben wird vom maximalen Zählerwert subtrahiert, anschließend mit dem Prescaler multipliziert und dann das Ganze durch die Variable Prescale geteilt &lt;br /&gt;
&amp;lt;math&amp;gt;(256 - 131) \cdot 64 / 8\,000\,000 \mathrm{Hz} \cdot 1\,000\,000 = 1000&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Nun wird die gesuchte Frequenz vom errechneten Wert aus dem dritten Punkt subtrahiert und dann wiederum durch diese geteilt &amp;lt;math&amp;gt;(1000-1000) / 1000 = 0&amp;lt;/math&amp;gt;. Damit läuft dieser Timer genau mit einer Fehlerrate von 0 %.&lt;br /&gt;
&lt;br /&gt;
Betreibt man den Timer im Overflow-Modus, so muss man, wie bereits erwähnt, nach/bei jedem Overflow-Interrupt den Timer nachladen. Der Interrupt heißt in diesem Fall SIG_OVERFLOWx (x steht für die Nummer des Timers). Dieser muss in einer ISR abgefangen werden.&lt;br /&gt;
&lt;br /&gt;
Zusammenfassend ein Beispielprogramm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* Es wird der Timer2 (8-Bit) eines ATmega32 verwendet, der mit einem Quarz mit 7,3728 MHz&lt;br /&gt;
betrieben wird. Im Abstand von 0,001 ms erzeugt der Timer einen Interrupt, also eine&lt;br /&gt;
Frequenz von 1000000 Hz (oder 100 kHz). Der Timer wird auf einen Prescaler von 1 und&lt;br /&gt;
einem Preloader von  183 konfiguriert.*/&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t countTimer2;	// Speichert den aktuellen Zählerwert&lt;br /&gt;
&lt;br /&gt;
// ISR zum auffangen der Interrupts:&lt;br /&gt;
SIGNAL(SIG_SIG_OVERFLOW2)&lt;br /&gt;
{&lt;br /&gt;
	countTimer2++;&lt;br /&gt;
	TCNT2 = 183;		// Nachladen&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Initialisierung:&lt;br /&gt;
TCCR2 = (1&amp;lt;&amp;lt;CS22);		// Prescaler von 1&lt;br /&gt;
TCNT2  = 183;			// Vorladen&lt;br /&gt;
TIMSK |= (1&amp;lt;&amp;lt;TOIE2);		// Interrupts aktivieren und damit Timer starten&lt;br /&gt;
sei();&lt;br /&gt;
&lt;br /&gt;
// Funktionen zum benutzen der Timer:&lt;br /&gt;
/** Diese Funktion nicht aufrufen. Wird von sleep_millisec aufgerufen.&lt;br /&gt;
Bei t=100 schläft die Funktion 1 ms. */&lt;br /&gt;
inline void sleep (uint8_t t)&lt;br /&gt;
{&lt;br /&gt;
	// countTimer2 wird in der ISR oben inkrementiert&lt;br /&gt;
	countTimer2 = 0;&lt;br /&gt;
	while (countTimer2 &amp;lt; t);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** Schläft x-Millisekunden. */&lt;br /&gt;
inline void sleep_millisec(uint16_t msec)&lt;br /&gt;
{&lt;br /&gt;
	uint16_t i;&lt;br /&gt;
	for(i=0; i&amp;lt;msec; i++) {&lt;br /&gt;
		sleep(100);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Allerdings wird auf diese leicht veraltete Technik nun nicht weiter eingegangen. Der Artikel wendet sich nun dem neueren &amp;quot;Compare Output&amp;quot;-Betriebsmodus zu.&lt;br /&gt;
&lt;br /&gt;
Beim &amp;quot;Compare Output&amp;quot;-Betriebsmodus wird genauso ein Zähler hochgezählt. Allerdings wird der Zählerwert nach jeder Inkrementierung mit einem vom Benutzer festgelegten Wert verglichen. Entspricht der Zählerwert dem gespeicherten Wert, so kommt es zu einem Interrupt. Dieser Wert wird in das Register OCRx (x steht wieder für die Timernummer) gespeichert. Je nach Auflösung des Timers ist dieses Register 8-Bit oder 16-Bit breit. &lt;br /&gt;
&lt;br /&gt;
Hinweis: Siehe CTC Modus unten. Dieser wird benötigt um den Timer entsprechend im &amp;quot;Compare Output&amp;quot;-Betriebsmodus vernünftig zu betreiben.&lt;br /&gt;
&lt;br /&gt;
Hier ein typisches Diagramm dieses Betriebsmodus (Hinweis: Das Diagramm wurde unter Verwendung des CTC Modus erstellt. Für Begriffserklärung siehe CTC Modus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_CompareMatch.png]]&lt;br /&gt;
&lt;br /&gt;
Das Ausrechnen des Werts, der in OCRx geschrieben werden muss, damit Frequenz x entsteht, ist nicht sonderlich schwer. Man geht wie bei der Berechnung des Werts für den Overflow-Modus vor (s.o.) nur daß man das resultierende Ergebnis vom maximalen Zählerwert (bei 8-Bit Auflösung ist dieser 256, bei 16-Bit Auflösung 65536) subtrahiert. Das Ergebnis wird dann einmalig in das Register OCRx geschrieben. Mann muss also nicht wie beim Overflow-Modus den Timer nach jedem Interrupt nachladen. Der enstehende Interrupt heißt in diesem Fall SIG_OUTPUT_COMPAREx (x steht für die Nummer des Timers). Dieser muss in einer ISR abgefangen werden.&lt;br /&gt;
&lt;br /&gt;
Wiederum zusammenfassend ein Beispielprogramm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* Es wird der Timer2 (8-Bit) eines ATmega32 verwendet, der mit einem Quarz mit 7,3728 MHz&lt;br /&gt;
betrieben wird. Im Abstand von 0,001 ms erzeugt der Timer einen Interrupt, also eine Frequenz&lt;br /&gt;
von 1000000 Hz (oder 100 kHz). Der Timer wird auf einen Prescaler von 1 und einem OCR2-Wert&lt;br /&gt;
von 73 konfiguriert.*/&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t countTimer2;	// Speichert den aktuellen Zählerwert&lt;br /&gt;
&lt;br /&gt;
// ISR zum auffangen der Interrupts:&lt;br /&gt;
SIGNAL(SIG_OUTPUT_COMPARE2)&lt;br /&gt;
{&lt;br /&gt;
  countTimer2++;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Initialisierung:&lt;br /&gt;
TCCR2 = (1&amp;lt;&amp;lt;CS22) | (1&amp;lt;&amp;lt;WGM21);	// Prescaler von 1 | CTC-Modus (siehe unten für Beschreibung)&lt;br /&gt;
OCR2  = 73;			// Vergleichswert&lt;br /&gt;
TIMSK |= (1&amp;lt;&amp;lt;OCIE2);		// Interrupts aktivieren und damit Timer starten&lt;br /&gt;
sei();&lt;br /&gt;
&lt;br /&gt;
// Funktionen zum benutzen der Timer:&lt;br /&gt;
/** Diese Funktion nicht aufrufen. Wird von sleep_millisec aufgerufen.&lt;br /&gt;
Bei t=100 schläft die Funktion 1 ms. */&lt;br /&gt;
inline void sleep(uint8_t t)&lt;br /&gt;
{&lt;br /&gt;
	// countTimer2 wird in der ISR oben inkrementiert&lt;br /&gt;
	countTimer2 = 0;&lt;br /&gt;
	while (countTimer2 &amp;lt; t);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** Schläft x-Millisekunden. */&lt;br /&gt;
inline void sleep_millisec(uint16_t msec)&lt;br /&gt;
{&lt;br /&gt;
	uint16_t i;&lt;br /&gt;
	for(i=0; i&amp;lt;msec; i++) {&lt;br /&gt;
		sleep(100);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== CTC Modus (Clear Timer on Compare Match mode) ====&lt;br /&gt;
Der CTC Modus ist eine Erweiterung des &amp;quot;Compare Output&amp;quot;-Betriebsmodus. Der CTC Modus wird z.B. für das obere Beispielprogramm benötigt. Wird der Timer nämlich im normalen Betriebsmodus betrieben, so ist seine Zählergrenze je nach Auflösung 255 oder entsprechend für die 16-Bit Timer. Erst wenn diese Grenze erreicht wurde, wird der Timer zurückgesetzt (also auf 0). Durch den CTC Modus wird der Timer augenblicklich automatisch nachdem ein &amp;quot;Compare Output&amp;quot;-Interrupt auftrat zurückgesetzt. Man kann also die maximalen Zählergrenze selber definieren.&lt;br /&gt;
Dieses Diagramm veranschaulicht den CTC Modus. Nach dem Interrupt wird der Timer sofort wieder zurückgesetzt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_CompareMatch.png]]&lt;br /&gt;
&lt;br /&gt;
==== PWM ====&lt;br /&gt;
Für PWM siehe [[Pwm]].&lt;br /&gt;
&lt;br /&gt;
=== Registerübersicht ===&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' Diese Registertabelle wurde für den aktuellen [[Atmel Controller Mega16 und Mega32]] erstellt. Wenn Sie ein anderes Modell verwenden kann es sein, dass ein oder mehrere Register nicht existieren, oder sie eine andere Bezeichnung haben.&lt;br /&gt;
&lt;br /&gt;
{| {{Blaueschmaltabelle}} width=100%&lt;br /&gt;
 |'''TIMSK'''&lt;br /&gt;
 |-&lt;br /&gt;
 |Mit diesem Register, der von allen Timern verwendet wird, lässt sich die Interruptausführung und Art des jeweiligen Timers bestimmen.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Registertabelle8Bit|OCIE2|TOIE2|TICIE1|OCIE1A|OCIE1B|TOIE1|OCIE0|TOIE0}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
*'''OCIE2 (Timer/Counter2 Output Compare Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter2 Compare Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TOIE2 (Timer/Counter2 Overflow Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter2 Overflow Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TICIE1 (Timer/Counter1, Input Capture Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Input Capture Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''OCIE1A (Timer/Counter1 Output Compare A Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Output Compare A Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''OCIE1B (Timer/Counter1 Output Compare B Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Output Compare B Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TOIE1 (Timer/Counter1 Overflow Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Overflow Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''OCIE0 (Timer/Counter0 Output Compare Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, so wird der Timer/Counter0 Compare Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TOIE0 (Timer/Counter0 Overflow Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, so wird der Timer/Counter0 Overflow Interrupt aktiviert  (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Analog-Digital-Wandler ==&lt;br /&gt;
Mit einem Analog-Digital-Wandler (ADC, für Analog Digital Converter) ist es mit den AVRs möglich, auf einfache Art und Weise analoge Größe in digitale Werte umzuwandeln. Dies bietet sich z.B. an, wenn man die Batteriespannung eines Roboters bestimmen möchte.&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine Informationen ===&lt;br /&gt;
Für allgemeine Informationen zu ADCs: siehe [[ADC]].&lt;br /&gt;
&lt;br /&gt;
=== Kanäle ===&lt;br /&gt;
Ein AVR hat normalerweise nur einen ADC integriert. Öfters muss man aber mehrere analoge Größen von verschiedenen Quellen wandeln, deswegen besitzen die AVRs Kanäle (ein ATmega32 z.B. besitzt acht Kanäle auf Port A). Diese Kanäle werden dann mithilfe eines Multiplexer auf den ADC geschalten werden, der dann die anliegenden analoge Spannung in einen digitalten Wert wandelt.&lt;br /&gt;
&lt;br /&gt;
=== Betriebsmodi ===&lt;br /&gt;
Der ADC bietet verschiedene Betriebsmodi. Diese wären:&lt;br /&gt;
* Single Conversation: Der ADC wandelt eine analoge Größe um und gibt diese zurück.&lt;br /&gt;
* Free Running: Der ADC wandelt wie in einer Endlosschleife ständig die anliegenden analogen Größen in digitale Werte um und gibt diese zurück.&lt;br /&gt;
&lt;br /&gt;
=== Teilungsfaktor ===&lt;br /&gt;
Zum Wandeln benötigt der ADC einen eigenen Takt, der auf der Taktfrequenz des Mikrocontrollers basiert. Allerdings ist die Taktfrequenz des Mikrocontrollers zu schnell und deswegen wird diese durch den Vorteiler verkleinert. Der resultierende Takt muss zwischen 50kHz und 200kHz liegen. Folgende Teilungsfaktoren sind verfügbar:&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''Teilungsfaktoren'''&lt;br /&gt;
 |2&lt;br /&gt;
 |4&lt;br /&gt;
 |8&lt;br /&gt;
 |16&lt;br /&gt;
 |32&lt;br /&gt;
 |64&lt;br /&gt;
 |128&lt;br /&gt;
 |}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Um zu bestimmen welcher Teilungsfaktor geeignet ist, kann man folgende Formel verwenden.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Tacktfrequenz = 8 MHz&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Teilungsfaktor_{min} = {Tacktfrequenz \over {200 kHz}} = {{8000000 Hz} \over {200000 Hz}} = 40&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Teilungsfaktor_{max} = {Tacktfrequenz \over {50 kHz}} = {{8000000 Hz} \over {50000 Hz}} = 160&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Deswegen kann man nun zwischen einem der folgenden Teilungsfaktor wählen: 64 und 128. Im Interesse der Geschwindigkeit sollte 64 gewählt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Siehe bitte die Registerübersicht weiter unten. Dort wird gezeigt, welches Register entsprechend eingestellt werden muss, damit man einen der oben aufgelisteten Teilungsfaktoren auswählen kann.&lt;br /&gt;
&lt;br /&gt;
=== Referenzspannung ===&lt;br /&gt;
Das Ergebnis der Wandlung des ADC bezieht sich auf eine bestimmt Referenzspannung. Diese Referenzspannung lässt sich bestimmen. Je nach gewählter Referenzspannung darf man nur eine zu messende Spannung an den Port anlegen, die nicht höher liegt als die Referenzspannung. Sonst würde dieser zerstört werden. Die Referenzspannung ist also gleich der maximal zu messenden Spannung. Um einzustellen welche Referenzspannung verwendet werden soll, gibt es den Register ADMUX. Folgende Quellen sind als Referenzspannung möglich:&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''Referenzspannungsquelle'''&lt;br /&gt;
 |AREF, internes Vref deaktiviert&lt;br /&gt;
 |AVCC mit externen Kondensator am AREF Pin&lt;br /&gt;
 |Keine Funktion, reserviert&lt;br /&gt;
 |Interne 2,56V Spannungsreferenz mit externen Kondensator am AREF Pin&lt;br /&gt;
 |}&lt;br /&gt;
Siehe bitte die Registerübersicht. Dort steht genauer wie man den Register einzustellen hat.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Man benötigt die Referenzspannung auch (oder besserer deren analoge Größe) um den Wert den der ADC zurückgibt in V umzurechnen. Um den zurückgegebenen Wert des ADC umzuwandel geht man so vor:&amp;lt;br&amp;gt;&lt;br /&gt;
# Bestimmen der Auflösung des ADC. Bei den ATMegas normalerweiße 10 Bit. 10 Bit entsprechen einer Stufung von 1024.&lt;br /&gt;
# Ermitteln des digitalen Werts der analogen Größe. In der Beispielrechnung verwende ich den Wert 592.&lt;br /&gt;
# Größe der Referenzspannung. In der Beispielrechnung wird 5V verwendet.&lt;br /&gt;
Mit diesen Werten kann folgende Berechnung ausführen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;V = 592 * 5V&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;V = 2960 / 2 ^{Bit} = 2960 / 2 ^{10} = \underline {\underline { 2{,}9V }}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Programmbeispiele ===&lt;br /&gt;
'''C/C++'''&amp;lt;br&amp;gt;&lt;br /&gt;
Dieses Beispiel ist für die [[Atmel Controller Mega16 und Mega32]] gedacht, die mit einer Taktfrequenz von 8 MHz laufen. Es ist unbedingt darauf zu achten nicht die Referenzspannung von 2,56V zu überschreiten! Sonst stirbt der Port. Je nach Einsatzart muss man das Beispielprogramm entsprechend abändern (also diese Zeile mit ADMUX |= (1&amp;lt;&amp;lt;REFS1) | (1&amp;lt;&amp;lt;REFS0);).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;inttypes.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
uint16_t readADC(uint8_t channel) {&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
	uint16_t result = 0;&lt;br /&gt;
	&lt;br /&gt;
	// Den ADC aktivieren und Teilungsfaktor auf 64 stellen&lt;br /&gt;
	ADCSRA = (1&amp;lt;&amp;lt;ADEN) | (1&amp;lt;&amp;lt;ADPS2) | (1&amp;lt;&amp;lt;ADPS1);&lt;br /&gt;
&lt;br /&gt;
	// Kanal des Multiplexers waehlen&lt;br /&gt;
	ADMUX = channel;&lt;br /&gt;
	// Interne Referenzspannung verwenden (also 2,56 V)&lt;br /&gt;
	ADMUX |= (1&amp;lt;&amp;lt;REFS1) | (1&amp;lt;&amp;lt;REFS0);&lt;br /&gt;
	&lt;br /&gt;
	// Den ADC initialisieren und einen sog. Dummyreadout machen&lt;br /&gt;
	ADCSRA |= (1&amp;lt;&amp;lt;ADSC);&lt;br /&gt;
	while(ADCSRA &amp;amp; (1&amp;lt;&amp;lt;ADSC));&lt;br /&gt;
	&lt;br /&gt;
	// Jetzt 3x die analoge Spannung and Kanal channel auslesen&lt;br /&gt;
	// und dann Durchschnittswert ausrechnen.&lt;br /&gt;
	for(i=0; i&amp;lt;3; i++) {&lt;br /&gt;
		// Eine Wandlung&lt;br /&gt;
		ADCSRA |= (1&amp;lt;&amp;lt;ADSC);&lt;br /&gt;
		// Auf Ergebnis warten...&lt;br /&gt;
		while(ADCSRA &amp;amp; (1&amp;lt;&amp;lt;ADSC));&lt;br /&gt;
		&lt;br /&gt;
		result += ADCW;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// ADC wieder deaktivieren&lt;br /&gt;
	ADCSRA &amp;amp;= ~(1&amp;lt;&amp;lt;ADEN);&lt;br /&gt;
	&lt;br /&gt;
	result /= 3;&lt;br /&gt;
	&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
	uint16_t result = readADC(0);	//Auslesen der analogen Spannungen an Pin 0,&lt;br /&gt;
					// also ADC0. In result steht das Ergebnis.&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bascom'''&amp;lt;br&amp;gt;&lt;br /&gt;
Dieses Programmbeispiel ist für die [[Atmel Controller Mega16 und Mega32]] gedacht. Es gibt nacheinander die Spannungen der einzelnen Kanäle (ADC0..7) aus. Dazwischen macht es immer 800 ms pause.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
' Die gemessene Spannung wird in der Variablen W gespeichert.&lt;br /&gt;
' Channel ist der Pin, an dem die Spannung gemessen werden soll.&lt;br /&gt;
&lt;br /&gt;
$baud = 9600&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
$regfile &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
Config Adc = Single , Prescaler = Auto&lt;br /&gt;
Start Adc&lt;br /&gt;
Dim W As Word , Channel As Byte&lt;br /&gt;
Channel = 0&lt;br /&gt;
Do&lt;br /&gt;
  W = Getadc(channel)&lt;br /&gt;
  Print &amp;quot;ADC-Pin &amp;quot; ; Channel ; &amp;quot;: Wert &amp;quot; ; W&lt;br /&gt;
  Incr Channel&lt;br /&gt;
  If Channel &amp;gt; 7 Then Channel = 0&lt;br /&gt;
  Waitms 800&lt;br /&gt;
Loop&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Registerübersicht ===&lt;br /&gt;
'''Hinweis:''' Diese Registertabellen wurden für den aktuellen [[Atmel Controller Mega16 und Mega32]] erstellt. Wenn Sie ein anderes Modell verwenden kann es sein, dass ein oder mehrere Register nicht existieren, oder sie eine andere Bezeichnung haben.&lt;br /&gt;
&lt;br /&gt;
{| {{Blaueschmaltabelle}} width=100%&lt;br /&gt;
 |'''ADCSRA (ADC Control and Status Register A)'''&lt;br /&gt;
 |-&lt;br /&gt;
 |Dieser Register dient dazu den ADC zu kontrollieren.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Registertabelle8Bit|ADEN|ADSC|ADATE|ADIF|ADIE|ADPS2|ADPS1|ADPS0}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
*'''ADEN (ADC Enable)'''&amp;lt;br/&amp;gt;Wird dieses Bit gesetzt (also 1), dann wird der ADC aktiviert. Schreibt man eine 0 wird der ADC deaktiert. Wird der ADC während einer Wandlung deaktiviert, wird die Wandlung abgebrochen.&lt;br /&gt;
*'''ADSC (ADC Start Conversion)'''&amp;lt;br/&amp;gt;Dieses Bit startet den Messvorgang, je nachdem in welchem Betriebsmodi der ADC läuft. Wird dieses Bit nach der Aktivierung des ADC über '''ADEN''' zum ersten Mal gesetzt, wird der ADC erst eine Initialisierungswandlung durchführen und danach erst die eigentliche Wandlung. Das Schreiben einer 0 auf das Bit hat keinen Effekt.&lt;br /&gt;
*'''ADATE (ADC Auto Trigger Enable)'''&amp;lt;br/&amp;gt;Wird dieses Bit gesetzt, wird das Auto Triggering des ADC aktiviert.&lt;br /&gt;
*'''ADIF (ADC Interrupt Flag)'''&amp;lt;br/&amp;gt;Dieses Bit wird auf 1 gesetzt, wenn eine Wandlung erfolgte und das Ergebnis nun verfügbar ist. Der ADC Complete Interrupt wird ausgelöst, wenn das '''ADIE'''-Bit gesetzt ist und die Interrupts global aktiviert sind. Das Bit wird gelöscht, wenn die entsprechende ISR abgearbeitet wird. Alternativ kann man es löschen, indem man eine 1 auf das Bit schreibt.&lt;br /&gt;
*'''ADIE (ADC Interrupt Enable)'''&amp;lt;br/&amp;gt;Wird dieses Bit gesetzt und die globalen Interrupts sind aktiviert, wird der ADC Complete Interrupt aktiviert, auf den man dann in der entsprechenden ISR reagieren kann.&lt;br /&gt;
*'''ADPS2 (ADC Prescaler Select Bit 2)'''&amp;lt;br/&amp;gt;Diese Bits bestimmen den Teilungsfaktor zwischen der XTAL-Frequenz (also der Taktfrequenz) und dem Eingangstakt des ADC. Zum Wandeln benötigt der ADC einen eigenen Takt, der auf der Taktfrequenz des Mikrocontrollers basiert. Allerdings ist die Taktfrequenz zu schnell und deswegen wird diese durch den Vorteiler verkleinert. Der resultierende Takt muss zwischen 50kHz und 200kHz liegen. Siehe [[Avr#Teilungsfaktor]]. Folgende Teilungsfaktoren sind verfügbar:&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''ADPS2'''&lt;br /&gt;
 |'''ADPS1'''&lt;br /&gt;
 |'''ADPS0'''&lt;br /&gt;
 |'''Teilungsfaktor'''&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |2&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |2&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |4&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |8&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |16&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |32&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |64&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |128&lt;br /&gt;
 |}&lt;br /&gt;
*'''ADPS1 (ADC Prescaler Select Bit 1)'''&amp;lt;br/&amp;gt;Siehe '''ADPS2''' für eine Beschreibung.&lt;br /&gt;
*'''ADPS0 (ADC Prescaler Select Bit 0)'''&amp;lt;br/&amp;gt;Siehe '''ADPS2''' für eine Beschreibung.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| {{Blaueschmaltabelle}} width=100%&lt;br /&gt;
 |'''ADMUX (ADC Multiplexer Selection Register)'''&lt;br /&gt;
 |-&lt;br /&gt;
 |Mit diesem Register wird der Multiplexer gesteuert.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Registertabelle8Bit|REFS1|REFS0|ADLAR|MUX4|MUX3|MUX2|MUX1|MUX0}}&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
*'''REFS1 (Reference Selection Bit 1)'''&amp;lt;br/&amp;gt;Mit diesem Bit kann steuern, welche Referenzspannung der ADC verwenden soll. Die möglichen Quellen sind unten aufgelistet. Wird während einer Wandlung die Quelle für die Referenzspannung geändert, wird die aktuelle Wandlung mit der &amp;quot;alten&amp;quot; Quellen zuerste beendet, bevor die neue Einstellung übernommen wird.&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''REFS1'''&lt;br /&gt;
 |'''REFS0'''&lt;br /&gt;
 |'''Referenzspannungsquelle'''&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |AREF, internes Vref deaktiviert&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |AVCC mit externen Kondensator am AREF Pin&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |Keine Funktion, reserviert&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |Interne 2,56V Spannungsreferenz mit externen Kondensator am AREF Pin&lt;br /&gt;
 |}&lt;br /&gt;
*'''REFS0 (ADC Start Conversion)'''&amp;lt;br/&amp;gt;Siehe '''REFS1'''.&lt;br /&gt;
*'''ADLAR (ADC Left Adjust Result)'''&amp;lt;br/&amp;gt;Dieses Bit beeinflusst, wie der ermittelte Messwert im ADC Data Register abgelegt wird.&lt;br /&gt;
*'''MUX4 (Analog Channel and Gain Selection Bit 4)'''&amp;lt;br/&amp;gt;Dieses Bit wird auf 1 gesetzt, wenn eine Wandlung erfolgte und das Ergebnis nun verfügbar ist. Der ADC Complete Interrupt wird ausgelöst, wenn das '''ADIE'''-Bit gesetzt ist und die Interrupts global aktiviert sind. Das Bit wird gelöscht, wenn die entsprechende ISR abgearbeitet wird. Alternativ kann man es löschen, indem man eine 1 auf das Bit schreibt.&lt;br /&gt;
*'''MUX3 (Analog Channel and Gain Selection Bit 3)'''&amp;lt;br/&amp;gt;Mit diesen Bits ('''MUX3''' bis '''MUX0''') wird der Kanal des Multiplexers eingestellt, der mit dem ADC verbunden ist.&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''MUX4..0'''&lt;br /&gt;
 |'''Pin'''&lt;br /&gt;
|-&lt;br /&gt;
 |00000&lt;br /&gt;
 |ADC0&lt;br /&gt;
|-&lt;br /&gt;
 |00001&lt;br /&gt;
 |ADC1&lt;br /&gt;
|-&lt;br /&gt;
 |00010&lt;br /&gt;
 |ADC2&lt;br /&gt;
|-&lt;br /&gt;
 |00011&lt;br /&gt;
 |ADC3&lt;br /&gt;
|-&lt;br /&gt;
 |00100&lt;br /&gt;
 |ADC4&lt;br /&gt;
|-&lt;br /&gt;
 |00101&lt;br /&gt;
 |ADC5&lt;br /&gt;
|-&lt;br /&gt;
 |00110&lt;br /&gt;
 |ADC6&lt;br /&gt;
|-&lt;br /&gt;
 |00111&lt;br /&gt;
 |ADC7&lt;br /&gt;
 |}&lt;br /&gt;
Es reicht also einfach die Pinnummer in ADMUX zu schreiben.&lt;br /&gt;
*'''MUX2 (Analog Channel and Gain Selection Bit 2)'''&amp;lt;br/&amp;gt;Siehe '''MUX3''' für eine Beschreibung.&lt;br /&gt;
*'''MUX1 (Analog Channel and Gain Selection Bit 1)'''&amp;lt;br/&amp;gt;Siehe '''MUX3''' für eine Beschreibung.&lt;br /&gt;
*'''MUX0 (Analog Channel and Gain Selection Bit 0)'''&amp;lt;br/&amp;gt;Siehe '''MUX3''' für eine Beschreibung.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Des Weiteren gibt es noch den Register '''ADCL/ADCH''' in dem das Ergebnis einer Wandlung steht. Man liest den Wert folgendermaßen aus:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uint16_t x = ADCL;&lt;br /&gt;
x += (ADCH&amp;lt;&amp;lt;8);&lt;br /&gt;
// oder&lt;br /&gt;
x = ADCW;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Die Fusebits==&lt;br /&gt;
Fusebits nennt man bestimmte Bits zur Konfigurierung eines AVR-Controllers. Bei der Auslieferung neuer AVR Controller sind die Fusebits bereits vorkonfiguriert. In vielen Fällen kann man die Konfiguration unverändert belassen, je nach Controllertyp. Bei den Typen Mega xxx bestimmen einige Fusebits beispielsweise, dass der interne Taktgeber aktiviert ist. Möchte man dagegen einen externen Quarz anschließen oder die Taktfrequenz ändern, so müssen auch die Fusebits geändert werden. Auch das Deaktivieren des &amp;quot;[[On Chip Debugging]]&amp;quot; Modus ist oft notwendig, wenn man alle Ports ausnutzen möchte. &lt;br /&gt;
&lt;br /&gt;
Die Fusebits werden in der Regel über die Software eingestellt, welche auch für das Übertragen des Programmcodes zuständig ist. Besonders einfach geht dies beispielsweise mit der Entwicklungsumgebung [[Bascom]]. Aber auch andere Programme wie [[PonyProg]] können für die Umstellung der Fusebits genutzt werden. Einmal eingestellte Fusebits bleiben bis zur erneuten Fusebit-Änderung erhalten. Der normale Programmiermodus verändert die Fusebits nicht. &lt;br /&gt;
&lt;br /&gt;
Je nach AVR Controllertyp sind unterschiedliche Fusebits (Einstellungen) vorhanden. Die genaue Beschreibung findet man im jeweiligen Datenblatt. Da aber falsch gesetzte Fusebit-Einstellungen zu den häufigsten Problemen gehören, liste ich hier die Funktion der üblichen Fusebits nochmals genauer auf:&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''CKSEL0, CKSEL1, CKSEL2, CKSEL3'''&lt;br /&gt;
 |Die Kombination dieser 4 Fusebits bestimmt die Taktquelle des Controllers. Das kann eine interner Taktgenerator, ein Quarz, Quarzoszillator, RC-Glied und ähnliches sein.&lt;br /&gt;
|-&lt;br /&gt;
 |'''JTAGEN'''&lt;br /&gt;
 |Hiermit wird die &amp;quot;[[On Chip Debugging]]&amp;quot; Schnittstelle aktiviert bzw. deaktiviert. Das sind die Bits mit den Bezeichnungen TDI, TDO, TMS und TCK. Möchte man diese Pins als normalen Port nutzen, so muss diese Schnittstelle immer deaktiviert werden. &lt;br /&gt;
|-&lt;br /&gt;
 |'''SUT0, SUT1'''&lt;br /&gt;
 |Die sogenannte StartUp-Zeit (PowerOn delay). Diese Einstellung muss abhängig von der Art des Taktgenerators eingestellt werden, genaueres im jeweiligen Datenblatt. &lt;br /&gt;
|-&lt;br /&gt;
 |'''SPIEN'''&lt;br /&gt;
 |Hiermit kann die serielle [[AVR-ISP Programmierkabel|ISP-Programmierung]], welche die meisten Programmierkabel nutzen, deaktiviert werden. Dies sollte man lieber vermeiden, denn wenn dieser Programmiermodus deaktiviert wurde, kann nur noch der Parallel-Programmiermodus genutzt werden. Der Parallel-Programmiermodus benötigt jedoch ein spezielles Programmiergerät, das die wenigsten Bastler besitzen. ''Also Vorsicht!''&lt;br /&gt;
|-&lt;br /&gt;
 |'''BODEN'''&lt;br /&gt;
 |Über dieses Bit wird der '''Brown-out Detector''' aktiviert bzw. deaktiviert. Dies ist eine Überwachung der Betriebsspannung. Diese Überwachung soll dafür sorgen, dass bei Spannungseinbrüchen ein ordentlicher RESET durchgeführt wird. Dadurch wird verhindert, dass ein Controller in einen undefinierten Zustand gerät (hängen bleibt).&lt;br /&gt;
|-&lt;br /&gt;
 |'''BOOTLEVEL'''&lt;br /&gt;
 |Über dieses  Bit kann die Spannung festgelegt werden, ab welcher der '''Brown-out Detector''' den Controller neu startet (also RESET ausführt). &lt;br /&gt;
|-&lt;br /&gt;
 |'''BOOTRST'''&lt;br /&gt;
 |Gewöhnlich startet ein Programm im Controller nach einem RESET ab Adresse 0. Durch dieses Fusebit kann der Controller jedoch veranlasst werden, nach einem Reset einen sogenannten Bootloader-Bereich auszuführen. Ein [[Bootloader]] kann genutzt werden, um Controller über andere Schnittstellen (z.B. RS232) zu programmieren.&lt;br /&gt;
|-&lt;br /&gt;
 |'''BOOTSZ0, BOOTSZ1'''&lt;br /&gt;
 |Der zuvor genannte Bootloaderbereich kann bei AVR-Controllern verschieden groß sein. Über diese beiden Bits können vier verschiedene Größen eingestellt werden. Siehe unter [[Bootloader]].&lt;br /&gt;
|-&lt;br /&gt;
 |'''EESAVE'''&lt;br /&gt;
 |Dieses Bit legt fest, ob beim Programmieren des Controllers (man nennt es auch brennen) immer das EEPROM gelöscht werden soll.&lt;br /&gt;
|-&lt;br /&gt;
 |'''CKOPT'''&lt;br /&gt;
 |Abhängig von den Einstellungen von CKSEL kann hier dir Oszillator-Verstärkung eingestellt werden. Genaueres im Datenblatt des jeweiligen Controllers.&lt;br /&gt;
|-&lt;br /&gt;
 |'''WDTON'''&lt;br /&gt;
 |Schaltet den WatchDog-Timer beim Booten ein/aus. Dies ist auch per Software möglich&lt;br /&gt;
|-&lt;br /&gt;
 |'''RSTDISBL'''&lt;br /&gt;
 |Durch dieses Bit kann man den RESET-Pin deaktivieren und dann als normalen I/O-Port nutzen. Aber Vorsicht! Da die RESET-Leitung beim Programmieren (Brennen) des Chips genutzt wird, kann man nach dessen Deaktivierung den Controller mit den üblichen [[AVR-ISP Programmierkabel|ISP-Adaptern]] nicht mehr programmieren. In diesem Fall könnte man zwar den Controlle noch mit speziellen Programmiergeräten im Parallelmodus programmieren, aber in der Praxis verfügen nur wenige Bastler über ein Programmiergerät, das dies leistet.&lt;br /&gt;
|-&lt;br /&gt;
 |'''LB1, LB2'''&lt;br /&gt;
 |Das sind die sogenannten Lockbits, mit denen sich das Auslesen des Flash- als auch EEPROM-Speichers verhindern läßt. Zwar können andere Anwender immer noch Daten lesen, allerdings handelt es sich dabei nicht mehr um den wirklichen Inhalt sondern lediglich um wirre Datenbytefolgen. Programmierer, die den erarbeiteten Code vor Raubkopierern schützen wollen, nutzen diese Lockbits. Das Programmieren ist auch bei gesetzen Lockbits noch möglich. Der Bootloader-Bereich wird nicht durch die Lockbits geschützt.&lt;br /&gt;
|-&lt;br /&gt;
 |'''BLB01, BLB02'''&lt;br /&gt;
 |Durch diese Bits kann der Code sogar vor dem Zugriff durch den Bootloader geschützt werden&lt;br /&gt;
|-&lt;br /&gt;
 |'''BLB11, BLB12'''&lt;br /&gt;
 |Diese Bits schützen den Bootloaderbereich selbst&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wie man die Fusebits mit [[Bascom]] einstellt, wird im Beitrag [[Bascom - Erstes Programm in den AVR Controller übertragen]] erläutert.&lt;br /&gt;
&lt;br /&gt;
''Autoren des Artikels: Frank, Luma'' &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Atmel]]&lt;br /&gt;
* [[AVR-Einstieg leicht gemacht]]&lt;br /&gt;
* [[Avr-gcc|avr-gcc]] - Leistungsfähiger AVR-Port des freien Compilers GCC&lt;br /&gt;
* [[WinAVR]] - Ein freies Werkzeugpaket auf Basis avr-gcc für die Windows-Platform, integriert unter anderem das [[Programmer's Notepad]]&lt;br /&gt;
* [[AVR_Assembler_Einf%C3%BChrung|AVR Assembler Einführung (AvrStudio)]]&lt;br /&gt;
* [[AVR-ISP Programmierkabel]] - Bauanleitung für die AVR Controller Programmierkabel&lt;br /&gt;
* [[RN-Control]] - Eines der beliebtestet AVR-Boards im Roboternetz&lt;br /&gt;
* [[RNBFRA-Board]] - Größeres Board mit zwei Atmel Controllern&lt;br /&gt;
* [[Bascom]] - Sehr gutes Basic-Entwicklungssystem&lt;br /&gt;
* [[Bascom - Erstes Programm in den AVR Controller übertragen]]&lt;br /&gt;
* [[On Chip Debugging]]&lt;br /&gt;
* [[Bootloader]]&lt;br /&gt;
* [[Timer]]&lt;br /&gt;
* [[TWI]] - I2C beim AVR&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
* [http://www.atmel.com/dyn/products/param_table.asp?family_id=607&amp;amp;OrderBy=part_no&amp;amp;Direction=ASC Aktuelle AVR Vergleichstabelle]&lt;br /&gt;
* [http://www.atmel.com/dyn/products/devices.asp?family_id=607 Die Datenblätter zu Atmel Controllern]&lt;br /&gt;
* [https://mpg.dnsalias.com/~magerlu/rn-wiki/avrtimer_applet Java Applet Timer Berechnung]&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/dload.php?action=file&amp;amp;file_id=169 AvrTimer Windows Berechnungstool]&lt;br /&gt;
* [http://people.freenet.de/gjl/helferlein/avr-uart-rechner.html AVR-Baudraten-Rechner (JavaScript)]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Abkürzung|AVR]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=ADC&amp;diff=7179</id>
		<title>ADC</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=ADC&amp;diff=7179"/>
				<updated>2006-05-04T21:23:10Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Abkürzung des englischen Begriffs '''Analog to Digital Converter''', im deutschen Sprachgebrauch '''A/D-Wandler''' (Analog nach Digital Wandler) oder '''A/D-Umsetzer''' genannt.&lt;br /&gt;
__NOTOC__&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
&lt;br /&gt;
Da es in der digitalen Welt nur zwei Zustände gibt um Informationen darzustellen, benötigt man einen A/D-Wandler um analoge Größen in digitale Werte umzuwandeln. Er ist somit das Gegenteil zum [[DAC]] (Digital-Analog-Wandler) der digitale Werte in analoge Größen wandelt.&lt;br /&gt;
&lt;br /&gt;
;Merkmale eines A/D-Wandlers&lt;br /&gt;
* Auflösung in Bit&lt;br /&gt;
* Geschwindigkeit der Umwandlung&lt;br /&gt;
* Spannungsbereich in dem Gemessen werden kann&lt;br /&gt;
* Größe der Referenzspannung&lt;br /&gt;
* Wiederholgenauigkeit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In der Regel werden verschieden hohe Spannungen analysiert und je nach Genauigkeit des Wandlers (Auflösung) ein entsprechender Wert als Zahl zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
;Beispiel der Auflösung eines Wandlers&lt;br /&gt;
Liegt der Messbereich zwischen 0V und 5V, bei einer Genauigkeit von 8 Bit, und einer Referenzspannung von ebenfalls 5V, so ergibt der analoge Wert von 0V am Eingang den digitalen Wert 0. Entsprechend 5V am Eingang den Wert 255. Der kleinste messbare Spannungsunterschied liegt so bei ca. 0,02 Volt. Bei einer Auflösung von 10 Bit verringert sich dieser Wert schon auf etwa 0,005 Volt, also 4mal genauer weil 2 Bit mehr Auflösung.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Beispielgeräte mit integriertem A/D-Wandler&lt;br /&gt;
* Soundkarten&lt;br /&gt;
* ISDN-Telefone&lt;br /&gt;
* DVD-Brenner&lt;br /&gt;
* Scanner&lt;br /&gt;
* Fax-Geräte&lt;br /&gt;
* TV- und Videokarten&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In vielen [[Microcontroller|Microcontrollern]] sind A/D-Wandler enthalten, meistens mit mehreren Eingängen und einer Genauigkeit von 8 bis 10 Bit. Es gibt aber auch eigenständige Bausteine (ICs) die es mit einer Vielzahl von verschiedenen Schnittstellen gibt um an das digitale Ergebnis zu kommen, wie u.a. [[I2C]].&lt;br /&gt;
&lt;br /&gt;
== ADC des AVR ==&lt;br /&gt;
&lt;br /&gt;
In den [[Atmel]] [[AVR]]s wird das Funktionisprinzip der ''Sukzessiven Approximation''&lt;br /&gt;
[http://de.wikipedia.org/wiki/Analog-digital-Umsetzer#Sukzessive_Approximation] &lt;br /&gt;
angewandt. Bei einer Auflösung von 10 Bit und einer Frequenz von max. 200kHz. Daraus ergibt sich eine Samplingrate von etwa 15kHz. Eine höhere Frequenz (bis zu 1MHz) ist zwar möglich, resultiert aber in einer Verringerung der Genauigkeit.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Für weitere Details und Programmbeispiele über den ADC der AVRs, siehe [[Avr#Analog-Digital-Wandler|ADC der AVRs]].&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
*[http://de.wikipedia.org/wiki/Analog-digital-Umsetzer Analog-digital-Umsetzer] - hier wird genauer erklärt wie ein AD-Wandler funktioniert, und welche Funktionsprinzipen es gibt.&lt;br /&gt;
*[http://www.sprut.de/electronic/referenz/index.htm] - Informationen über Referenzspannungsquellen&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Abkürzung]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Sensoren]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Avr&amp;diff=7178</id>
		<title>Avr</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Avr&amp;diff=7178"/>
				<updated>2006-05-04T21:19:32Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:AtmelController.jpg|thumb|Beispiel eines AVR Controllers]]&lt;br /&gt;
'''AVR''' ist eine 8-Bit [[Microcontroller]]-Familie mit RISC-Architektur.&lt;br /&gt;
Im Gegensatz zu vielen anderen Microcontroller-Architekturen hat die AVR-Architektur keine Vorgänger. Sie ist ein komplettes Neudesign, das Anfang der 90-Jahre an der Universität von Trondheim/Norwegen entwickelt und vom (bis heute einzigen) Hersteller [[Atmel]] aufgekauft wurde. Es gibt eine ganze Serie von AVR-Controllern. Sie alle werden ähnlich programmiert, haben vergleichbaren Befehlssatz und physikalische Eigenschaften, bieten jedoch unterschiedliche Features und Peripherie. &lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche und kostenlose Entwicklungssysteme in den Sprachen Basic, C/C++, Pascal und Assembler für diese Controller-Familie. &lt;br /&gt;
&lt;br /&gt;
==Wofür steht AVR?==&lt;br /&gt;
&amp;quot;AVR&amp;quot; steht angeblich für ''Advanced Virtual RISC'' (in einem Paper der Entwickler des AVR-Kerns Alf Egin Bogen und Vegard Wollan). Laut [[Atmel]] bedeutet es nichts.&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
AVR-Controller besitzen eine zweistufige Pipeline (fetch and execute), die es ermöglicht, die meisten Befehle innerhalb eines einzigen Prozessortaktes auszuführen. Dadurch ist ein AVR wesentlich schneller als etwa 8051-Controller, bei denen der Prozessortakt intern noch durch 12 geteilt wird.&lt;br /&gt;
&lt;br /&gt;
*AVR-Kern&lt;br /&gt;
** Harvard-Architektur (getrennter Befehls- und Datenspeicher) &lt;br /&gt;
** 32 Register, kein Akkumulator, 3 Pointerregister &lt;br /&gt;
** EEPROM-Datenspeicher&lt;br /&gt;
** [[Watchdog]], [[Bootloader]]-Support, verschiedene Stromspar-Modi, Brownout-Erkennung, Interner Oszillator&lt;br /&gt;
** Lineares Speichermodell (keine Segmentierung)&lt;br /&gt;
** 8-Bit Architektur ist für Hochsprachen (C) optimiert &lt;br /&gt;
* In-System programmierbar: die Controller können sehr einfach über ein  Programmierkabel (oft ISP-Kabel genannt), das mit dem PC verbunden wird, programmiert werden &amp;amp;ndash; auch dann, wenn sie sich nicht in einer Schaltung befindet.&lt;br /&gt;
* umfangreiche Peripherie&lt;br /&gt;
** 8- und 16-Bit-Timer/Counter mit [[PWM]], Capture/Compare, externe Betaktung, asynchrone Operation&lt;br /&gt;
** Kommunikation: [[UART|USART]], [[SPI]], [[I2C]] ([[TWI]])&lt;br /&gt;
** Analog-Comparator, Analog-Digital-Wandler &lt;br /&gt;
** unterschiedlichste externe und interne Interrupt-Quellen (UART, SPI, Timer, A/D-Wandler, Analog-Comparator, ...)&lt;br /&gt;
** JTAG (Debugerinterface)&lt;br /&gt;
* AVR Typen (AT90 &amp;quot;Classic AVR&amp;quot;, ATtiny, ATmega) &lt;br /&gt;
* erhältlich in unterschiedlichen Gehäusen, idR Durchsteck und als [[SMD]]&lt;br /&gt;
* Viele Entwicklungsboards erhältlich, z.B. das Roboternetzboard [[RN-Control]]&lt;br /&gt;
&lt;br /&gt;
==Einige Pinbelegungen der populärsten AVR-Controller==&lt;br /&gt;
(in etwa nach Leistungsfähigkeit sortiert)&lt;br /&gt;
&lt;br /&gt;
* [[AT90S2313]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:at90s2313tiny.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Atmel Controller Mega8]]&lt;br /&gt;
* [[Atmel Controller Mega48 Mega88 Mega168]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:mega8kompatibel.png|center]]&lt;br /&gt;
&lt;br /&gt;
* [[Atmel Controller Mega16 und Mega32]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mega1632.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Atmel Controller Mega128]] ([[SMD]]-Chip)&lt;br /&gt;
&lt;br /&gt;
[[Bild:mega128pin.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===Die AVR-Pin-Bezeichnungen und deren Funktion===&lt;br /&gt;
Die meisten Ports sind doppelt belegt und besitzen neben der normalen Port-Funktion noch eine Sonderfunktion. Die verschiedenen Pinbezeichnungen und Sonderfunktionen werden hier beschrieben:&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|+ '''Tabelle: Die AVR-Pin-Bezeichnungen und deren Funktion'''&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Versorgungs- und Referenzpins, Reset&lt;br /&gt;
|-&lt;br /&gt;
 |'''VCC''' &lt;br /&gt;
 | Versorgungsspannung von 2,7 Volt bis 6 V bei den L-Varianten (low power), ansonsten 4,5V bis 6V. Die nächste AVR-Generation soll ab 1,8 Volt funktionieren.&lt;br /&gt;
|-&lt;br /&gt;
 |'''GND''' &lt;br /&gt;
 |Masse &lt;br /&gt;
|-&lt;br /&gt;
 |'''AREF''' &lt;br /&gt;
 |Referenzspannung für den Analog-Digital-Wandler (kann auf 5V gesetzt werden). Auch die interne Bandgap-Referenzspannung kann über diesen Pin entstört werden (dann KEINE externe Spannung an diesen Pin geben (Kurzschluss)!). &lt;br /&gt;
|-&lt;br /&gt;
 |'''AGND''' &lt;br /&gt;
 |Alternative Masse, etwa um ein Verbindungspunkt mit GND zu haben und bei empfindlichen Messungen  Masseschleifen zu vermeiden.&lt;br /&gt;
|-&lt;br /&gt;
 |'''AVCC''' &lt;br /&gt;
 | &lt;br /&gt;
Die Betriebsspannung für den Analog-Digital-Wandler (siehe Beschaltungsskizze). Die Pins AVCC, AGND und AREF sollten immer beschaltet werden, da es sonst passieren kann, dass Port A nicht richtig funktioniert, selbst wenn man den AD-Wandler nicht benutzt. &lt;br /&gt;
|-&lt;br /&gt;
 |'''RESET''' &lt;br /&gt;
 |Rücksetz-Eingang, intern über einen [[Pullup]] mit VCC verbunden. Ein LOW–Pegel an diesem Pin für die Dauer von mindestens zwei Zyklen des Systemtaktes bei aktivem Oszillator setzt den Controller zurück. Rücksetzen der Ports erfolgt unabhängig von einem evtl. anliegenden Systemtakt.&lt;br /&gt;
|-&lt;br /&gt;
|'''PEN'''&lt;br /&gt;
|Programming Enable - Diesen Pin gibt es nur beim Mega128/64 u.ä. Wird dieser Pin beim Power-On Reset nach Masse gezogen, geht der Controller in den [[ISP]] Programmiermodus. Man kann ihn also alternativ zu Reset verwenden. In der Regel verwendet man aber die Reset-Leitung und PEN sollte man direkt mit VCC verbinden.&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| System-Takt&lt;br /&gt;
|-&lt;br /&gt;
 |'''XTAL1''' &lt;br /&gt;
 |Eingang des internen Oszillators zur Erzeugung des Systemtaktes bzw. Eingang für ein externes Taktsignal, wenn der interne Oszillator nicht verwendet werden soll bzw. Anschluss von Quarz/Keramik-Resonator/RC-Glied.&lt;br /&gt;
|-&lt;br /&gt;
 |'''XTAL2''' &lt;br /&gt;
 |Anschluss von Quarz oder Keramik-Resonator oder Ausgang des integrierten Oszillators zur Nutzung als Systemtakt (Je nach Fuse-Einstellungen). &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Digitale bidirektionale  I/O-Ports&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;| Jeder Pin der Ports kann individuell als Eingang oder Ausgang konfiguriert werden. Die I/O-Ports sind maximal 8 Bit breit und verfügen ja nach AVR-Typ über eine unterschiedliche Anzahl von Pins. An jedem als Eingang (Input) geschalteten Pin gibt es zuschaltbare [[Pullup]]-Widerstände, die teilweise auch bei aktivierter Sonderfunkton verfügbar sind.&lt;br /&gt;
&lt;br /&gt;
Bei eingeschalteten Sonderfunktionen wie UART, SPI, ADC, etc. sind die entsprechenden Pins nicht als &amp;quot;normale&amp;quot; digitale I/O verwendbar, sondern dienen der Sonderfunktion. Die Anzahl der als I/O verwendbaren Pins ist auch abhängig von den Fuse-Einstellungen (Vorsicht beim Umstellen, Handbuch GENAU lesen!).&lt;br /&gt;
|-&lt;br /&gt;
|'''PA 0 – 7''' || Port A &lt;br /&gt;
|-&lt;br /&gt;
|'''PB 0 – 7''' || Port B &lt;br /&gt;
|-&lt;br /&gt;
|'''PC 0 – 7''' || Port C &lt;br /&gt;
|-&lt;br /&gt;
|'''PD 0 – 7''' || Port D &lt;br /&gt;
|-&lt;br /&gt;
|'''PE 0 – 7''' || Port E &lt;br /&gt;
|-&lt;br /&gt;
|'''PF 0 – 7''' || Port F &lt;br /&gt;
|-&lt;br /&gt;
|'''PG 0 – 7''' || Port G &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Externe Interrupts&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;| Die PCINT-Interrupts gibt es nur für neuere AVRs wie den [[ATmega88]]. Falls die Anzahl an externen Interrupts nicht ausreicht, kann evtl. auch andere Hardware dafür eingesetzt werden, etwa der Analog-Comparator mit interner Bandgap-Referenz, falls er anderwärtig nicht gebraucht wird.&lt;br /&gt;
|-&lt;br /&gt;
 |'''INT0''' ||Externer Interrupt 0&lt;br /&gt;
|-&lt;br /&gt;
 |'''INT1''' ||Externer Interrupt 1&lt;br /&gt;
|-&lt;br /&gt;
 |'''INT2''' ||Externer Interrupt 2 &lt;br /&gt;
|-&lt;br /&gt;
 |'''PCINTx''' ||Pin-Change Interrupt&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| [[Timer]] und [[PWM]]&lt;br /&gt;
|-&lt;br /&gt;
 |'''T0''' &lt;br /&gt;
 |Timer-Eingang. Timer kann gestartet, gestoppt oder getaktet werden &lt;br /&gt;
|-&lt;br /&gt;
 |'''T1''' &lt;br /&gt;
 |Timer-Eingang. Timer kann gestartet, gestoppt oder getaktet werden &lt;br /&gt;
|-&lt;br /&gt;
 |'''OC0''' &lt;br /&gt;
 |PWM bzw. Output Compare Ausgang des Timers 0 &lt;br /&gt;
|-&lt;br /&gt;
 |'''OC1A''' &lt;br /&gt;
 |Ausgang für die Compare-Funktion des integrierten Zeitgeber- / Zählerbausteines &lt;br /&gt;
Der erste PWM-Ausgang des Timers1. Er kann zum Regeln der Bot-Motogeschwindigkeit benutzt werden. &lt;br /&gt;
|-&lt;br /&gt;
 |'''OC1B''' &lt;br /&gt;
 |Ausgang für die Compare-Funktion des integrierten Zeitgeber- / Zählerbausteines &lt;br /&gt;
Der zweite PWM-Ausgang des Timers1. Er kann zum Regeln der Bot-Motogeschwindigkeit benutzt werden. &lt;br /&gt;
|-&lt;br /&gt;
 |'''ICP1''' &lt;br /&gt;
 |Eingang für die Capture-Funktion des integrierten Zeitgebers / Zählerbausteines &lt;br /&gt;
|-&lt;br /&gt;
 |'''OC2''' &lt;br /&gt;
 |[[Pwm]] bzw. Output Compare Ausgang des Timers2. Er kann zum Regeln der Bot-Motogeschwindigkeit benutzt werden. &lt;br /&gt;
|-&lt;br /&gt;
 |'''TOSC1, TOSC2''' &lt;br /&gt;
 |TOSC1 und TOSC2 sind Eingänge für den asynchronen Modus von Timer2. Sie sind vorgesehen für den Anschluss eines externen Uhrenquarzes ( 32.768 kHz ). Damit lassen sich zum Beispiel sehr genaue Ein-Sekunden-Impulse für eine Uhr generien. &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Analog-Digital-Wandler&lt;br /&gt;
|-&lt;br /&gt;
 |'''ADC0''' bis '''ADC7''' &lt;br /&gt;
 |Eingänge des AD-Wandlers. Spannungen können hier gemessen werden oder an den Analog-Komparator weiter geleitet werden. &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Analog-Komparator&lt;br /&gt;
|-&lt;br /&gt;
 |'''AIN0, AIN1''' &lt;br /&gt;
 |Die beiden externen Eingänge des Analog-Komparators. &lt;br /&gt;
Mit AIN0(+) und AIN1(-) kann man zwei Spannungen miteinander vergleichen. Wenn die Spannung an AIN0 höher als bei AIN1 ist, liefert der Komparator &amp;quot;High&amp;quot;, ansonsten ein &amp;quot;Low&amp;quot;. Als interne Eingänge des Komparators können die Interne Bandgap-Referenzspannung oder Ausgänge des ADC-Multiplexers dienen.&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Serielle Schnittstelle ([[UART|USART]])&lt;br /&gt;
|-&lt;br /&gt;
 |'''RXD''' &lt;br /&gt;
 |Eingang der Seriellen Schnittstelle (Receive Data), TTL-Pegel &lt;br /&gt;
|-&lt;br /&gt;
 |'''TXD''' &lt;br /&gt;
 |Ausgang Serielle Schnittstelle (Transmit Data), TTL-Pegel &lt;br /&gt;
|-&lt;br /&gt;
 |'''XCK''' &lt;br /&gt;
 |Externe Takt für den USART. Wird nur in Sonderfällen für den Takt benötigt. &lt;br /&gt;
USART (&amp;quot;Universal Synchronous/Asynchronous Receiver and Transmitter&amp;quot;). Das ist die serielle Schnittstelle, die zur Datenübertragung zwischen Mikrocontroller und PC genutzt wird. Zur bidirektionalen Übertragung werden zwei Pins am Controller benötigt: TXD und RXD. Über TXD (&amp;quot;Transmit Data&amp;quot;) werden Daten gesendet, RXD (&amp;quot;Receive Data&amp;quot;) dient zum Empfang. &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| [[SPI]]-Schnittstelle&lt;br /&gt;
|-&lt;br /&gt;
 |'''SS''' &lt;br /&gt;
 |SPI-Interface – wird beneötigt um den richtigen Slave am Bus zu wählen &lt;br /&gt;
|-&lt;br /&gt;
 |'''MOSI''' &lt;br /&gt;
 |SPI-Interface – Datenausgang (als Master) oder Dateneingang (als Slave), verwendet bei ISP (In-System-Programmierung)&lt;br /&gt;
|-&lt;br /&gt;
 |'''MISO''' &lt;br /&gt;
 |SPI-Interface – Dateneingang (als Master) oder Datenausgang (als Slave), verwendet bei ISP (In-System-Programmierung)&lt;br /&gt;
|-&lt;br /&gt;
 |'''SCK''' &lt;br /&gt;
 |SPI-Interface – Bustakt vom Master, verwendet bei ISP (In-System-Programmierung)&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| [[I2C|I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C]]-Schnittstelle ([[TWI]])&lt;br /&gt;
|-&lt;br /&gt;
 |'''SDA''' &lt;br /&gt;
 |I2C-Schnittstelle (Bus aus 2 Leitungen) Datenleitung &lt;br /&gt;
|-&lt;br /&gt;
 |'''SCL''' &lt;br /&gt;
 |I2C-Schnittstelle (Bus aus 2 Leitungen) Clockleitung &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| [[JTAG]]-Interface&lt;br /&gt;
|-&lt;br /&gt;
 |'''TDI''' &lt;br /&gt;
 |JTAG-Debug Interface - Über dieses Interface kann man den AVR programmieren und debuggen. Die Schnittstelle ist ähnlich wie die SPI Schnittstelle und hat getrennte Dateneingangs- und Datenausgangsleitungen sowie eine Taktleitung. TDI ist die Dateneingangsleitung&lt;br /&gt;
|-&lt;br /&gt;
 |'''TDO''' &lt;br /&gt;
 |JTAG-Debug Interface - TDO ist die Datenausgangsleitung des JTAG Interface&lt;br /&gt;
|-&lt;br /&gt;
 |'''TMS''' &lt;br /&gt;
 |JTAG-Debug Interface&lt;br /&gt;
|-&lt;br /&gt;
 |'''TCK''' &lt;br /&gt;
 |JTAG-Debug Interface &lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Timer/Counter ==&lt;br /&gt;
&lt;br /&gt;
Die Mikrocontroller der AVR-Familie besitzen je nach Typ eine unterschiedliche Anzahl an programmierbaren [[Timer|Timern]]. Bei den aktuellen ATmegas sind das mindestens ein 8-Bit Timer und bei größeren Ausführungen der Serie auch 16-Bit Timer. Die Timer werden immer Timerx benannt, wobei x für die Timernummer steht (also 0, 1, 2, usw.). &lt;br /&gt;
Die Konfigurationsmöglichkeiten sind von Timer zu Timer unterschiedlich.&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' Die folgenden Code-Beispiele sind in C programmiert und wurden für einen [[ATMega32|ATmega32]] entwickelt. Sie lassen sich also ohne große Änderungen auch auf anderen Mikrocontrollern der AVR-Familie einsetzen.&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine Funktionsweise ===&lt;br /&gt;
Timer funktionieren nach dem allgemeinen Prinzip, dass sie eine Ganzzahl (im weiteren als Zähler bezeichnet) je nach Betriebsmodus auf- oder abwärtszählen, d.h. inkrementieren bzw. dekrementieren.&lt;br /&gt;
&lt;br /&gt;
Angenommen, der Timer arbeitet im einfachsten Betriebsmodus, dem normalen Modus (siehe [[Avr#Normaler Modus (Normal Mode)|Normaler Modus (Normal Mode)]]). Die Zählrichtung des Timers ist aufsteigend gerichtet. Je nach Auflösung, also 8-Bit oder 16-Bit, erreicht der Zähler irgendwann einen bestimmten Zustand. Möglich wäre, dass er überläuft, wenn z.B. bei einem 8-Bit Timer der Wert 255 inkrementiert wird (siehe Grafik).&lt;br /&gt;
&lt;br /&gt;
[[Bild:AbstrakterZaehlvorgang.png]]&lt;br /&gt;
&lt;br /&gt;
=== Der Prescaler ===&lt;br /&gt;
Der Prescaler (eng. = Vorteiler) kann dazu genutzt werden, den Takt, der den Timern zugeführt wird, zu verkleinern. U.a. kann man damit die Timer so konfigurieren, damit diese in den unterschiedlichsten Frequenzen takten. Hier eine Grafik die den Prescaler veranschaulicht:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Prescaler.png]]&lt;br /&gt;
&lt;br /&gt;
Das obere Diagramm zeigt den Betrieb ohne Prescaler, das untere mit Prescaler. Die gestrichelte Linie zeigt, wann ein Interrupt eintritt.&lt;br /&gt;
&lt;br /&gt;
Im Teil [[Avr#Die Betriebsmodi|Die Betriebsmodi]] wird weiter auf die praktische Verwendung des Prescalers eingegangen.&lt;br /&gt;
&lt;br /&gt;
=== Die Betriebsmodi ===&lt;br /&gt;
Die AVR-Timer können in unterschiedlichen Betriebsmodi betrieben werden. Diese sind:&lt;br /&gt;
* Normaler Modus&lt;br /&gt;
* CTC Modus&lt;br /&gt;
* PWM&lt;br /&gt;
&lt;br /&gt;
==== Normaler Modus (Normal Mode) ====&lt;br /&gt;
Der einfachste Betriebsmodus ist der normale Modus. Er funktioniert wie im Abschnitt  &amp;quot;[[Avr#Allgemeine Funktionsweise|Allgemeine Funktionsweise]]&amp;quot; beschrieben. Die Zählrichtung des Timers ist immer aufsteigend, und irgendwann kommt es zu dem Interrupt Timer-Overflow (welcher in einer passend ISR aufgefangen werden kann). Im einfachsten Fall kann man diesen Modus in folgendem Diagramm darstellen:&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_1.png]]&lt;br /&gt;
&lt;br /&gt;
Der Zähler des Timers (im Diagramm oben, die aufsteigende und dann wieder zurückgesetzte Linie) ist in dem Register TCNTx gespeichert, wobei x für eine Zahl steht. Soll z.B. auf den Timer0 (siehe Datenblatt des jeweiligen Controllers) des Controllers zugegriffen werden, so ist an TCNT eine 0 anzuhängen, also TCNT0.&lt;br /&gt;
Wie lange es braucht, bis der Zähler einen Overflow auslöst, ist von der Taktfrequenz des Controllers, dem eingestellten Prescaler-Wert und von der Timerauflösung abhängig. Nun wäre es ja sehr unpraktisch, wenn wir den Zähler nicht anpassen könnten. Denn sonst müssten wir unsere Software die den Timer benutzt evtl. anpassen und viel rechnen um z.B. für 1000 ms zu schlafen. Deswegen kann auf den Zähler zugreifen und ihn vorladen bevor dieser wieder vom eigentlichen Timer hochgezählt wird. Dies veranschaulicht folgendes Diagramm:&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_1_Vorladen.png]]&lt;br /&gt;
&lt;br /&gt;
Dadurch kann man den Timer beeinflussen, und beeinflussen wie lange es dauert, bis ein Overflow auftritt. Um zu berechnen, welchen Wert wir vorladen müssen, kann man auch ein Java-Applet nutzen, siehe unter [[Avr#Weblinks|Weblinks Java Applet]].&lt;br /&gt;
&lt;br /&gt;
Natürlich kann man das auch &amp;quot;von Hand&amp;quot; rechnen. Die Berechnung des Preloader- sowie Prescalerwerts bei Verwendung der Overflow-Interrupts, eines Prescalers von 64 (nicht alle Prescaler können verwendet werden) und eines Quarzes mit der Frequenz von 8 MHz sieht folgendermaßen aus (gesuchte Frequenz beträgt 1000 Hz unter der Verwendung des Timer0 eines ATmega32):&lt;br /&gt;
# &amp;lt;math&amp;gt;Prescale = Frequenz * 1000000 [Hz] = 8000000&amp;lt;/math&amp;gt;&lt;br /&gt;
# Wir definieren den maximalen Zählerwert. Dieser ist bei einem 8-Bit Timer 256, bei einem 16-Bit Timer 65536. In unserem Fall ist der maximale Zählerwert 256, weil Timer0 verwendet wird.&lt;br /&gt;
# Nun wird die Variable ''Prescale'' (s.o.) durch den verwendeten Prescaler (64) geteilt (&amp;lt;math&amp;gt;8000000 Hz / 64 = 125000&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Als nächstes wird der im dritten Punkt errechnete Wert durch die gesuchte Frequenz geteilt &amp;lt;math&amp;gt;=125000 / 1000Hz = 125&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Nun wird mathematisch überprüft, ob der errechnete Wert aus dem vierten Punkt kleiner als der maximale Zählerwert ist. Trifft dies zu, so subtrahiert man den errechneten Wert vom maximalen Zählerwert (&amp;lt;math&amp;gt;= 256 - 125 = 131&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Damit haben wir den Wert errechnet, der bei jedem Interrupt, den der Timer0 auslöst, in TCNTx (in diesem Fall TCNT0) nachgeladen werden muss, damit die Interrupts in dem gewünschten Zeitabstand von einer Millisekunde ausgelöst werden.&lt;br /&gt;
&lt;br /&gt;
Allerdings bleibt zu bemerken, dass bei der Verwendung einer &amp;quot;ungeraden&amp;quot; Quarzfrequenz (z.B. 7,3728 MHz) der Timer mit einer bestimmten Ungenauigkeit arbeitet. Würden wir z.B. den Quarz oben mit einem Quarz mit 7,3728 MHz austauschen, so wäre die Fehlerrate 0,17%. Diese Ungeauigkeit varriert von verwendetem Prescaler zu Prescaler. D.h. wenn wir einen Prescaler von 1024 (und einer Quarzfrequenz von 8 MHz) verwendet hätten, so hätten wir eine inakzeptable Ungeauigkeit von 11,61%. Deswegen sollte sie eines der genannten Programme unter [[Avr#Weblinks]] verwenden, denn diese zeigen nur die bestmögliche Konfiguration an.&lt;br /&gt;
&lt;br /&gt;
Die Fehlerrate kann natürlich auch ausgerechnet werden. Hier die Rechenschritte (sie sind erweiternd zu der oberen Berechnung):&lt;br /&gt;
# Als erstes wird mathematisch überprüft, ob der Preloaderwert (siehe fünften Schritt oben) größer als 1 ist.&lt;br /&gt;
# Trifft dies zu, so wird als nächstes die resultierende Frequenz errechnet. Die geschieht folgendermaßen: Der errechnete Preloaderwert aus der Rechnung oben wird vom maximalen Zählerwert subtrahiert, anschließend mit dem Prescaler multipliziert und dann das Ganze durch die Variable Prescale geteilt &lt;br /&gt;
&amp;lt;math&amp;gt;(256 - 131) \cdot 64 / 8\,000\,000 \mathrm{Hz} \cdot 1\,000\,000 = 1000&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Nun wird die gesuchte Frequenz vom errechneten Wert aus dem dritten Punkt subtrahiert und dann wiederum durch diese geteilt &amp;lt;math&amp;gt;(1000-1000) / 1000 = 0&amp;lt;/math&amp;gt;. Damit läuft dieser Timer genau mit einer Fehlerrate von 0 %.&lt;br /&gt;
&lt;br /&gt;
Betreibt man den Timer im Overflow-Modus, so muss man, wie bereits erwähnt, nach/bei jedem Overflow-Interrupt den Timer nachladen. Der Interrupt heißt in diesem Fall SIG_OVERFLOWx (x steht für die Nummer des Timers). Dieser muss in einer ISR abgefangen werden.&lt;br /&gt;
&lt;br /&gt;
Zusammenfassend ein Beispielprogramm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* Es wird der Timer2 (8-Bit) eines ATmega32 verwendet, der mit einem Quarz mit 7,3728 MHz&lt;br /&gt;
betrieben wird. Im Abstand von 0,001 ms erzeugt der Timer einen Interrupt, also eine&lt;br /&gt;
Frequenz von 1000000 Hz (oder 100 kHz). Der Timer wird auf einen Prescaler von 1 und&lt;br /&gt;
einem Preloader von  183 konfiguriert.*/&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t countTimer2;	// Speichert den aktuellen Zählerwert&lt;br /&gt;
&lt;br /&gt;
// ISR zum auffangen der Interrupts:&lt;br /&gt;
SIGNAL(SIG_SIG_OVERFLOW2)&lt;br /&gt;
{&lt;br /&gt;
	countTimer2++;&lt;br /&gt;
	TCNT2 = 183;		// Nachladen&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Initialisierung:&lt;br /&gt;
TCCR2 = (1&amp;lt;&amp;lt;CS22);		// Prescaler von 1&lt;br /&gt;
TCNT2  = 183;			// Vorladen&lt;br /&gt;
TIMSK |= (1&amp;lt;&amp;lt;TOIE2);		// Interrupts aktivieren und damit Timer starten&lt;br /&gt;
sei();&lt;br /&gt;
&lt;br /&gt;
// Funktionen zum benutzen der Timer:&lt;br /&gt;
/** Diese Funktion nicht aufrufen. Wird von sleep_millisec aufgerufen.&lt;br /&gt;
Bei t=100 schläft die Funktion 1 ms. */&lt;br /&gt;
inline void sleep (uint8_t t)&lt;br /&gt;
{&lt;br /&gt;
	// countTimer2 wird in der ISR oben inkrementiert&lt;br /&gt;
	countTimer2 = 0;&lt;br /&gt;
	while (countTimer2 &amp;lt; t);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** Schläft x-Millisekunden. */&lt;br /&gt;
inline void sleep_millisec(uint16_t msec)&lt;br /&gt;
{&lt;br /&gt;
	uint16_t i;&lt;br /&gt;
	for(i=0; i&amp;lt;msec; i++) {&lt;br /&gt;
		sleep(100);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Allerdings wird auf diese leicht veraltete Technik nun nicht weiter eingegangen. Der Artikel wendet sich nun dem neueren &amp;quot;Compare Output&amp;quot;-Betriebsmodus zu.&lt;br /&gt;
&lt;br /&gt;
Beim &amp;quot;Compare Output&amp;quot;-Betriebsmodus wird genauso ein Zähler hochgezählt. Allerdings wird der Zählerwert nach jeder Inkrementierung mit einem vom Benutzer festgelegten Wert verglichen. Entspricht der Zählerwert dem gespeicherten Wert, so kommt es zu einem Interrupt. Dieser Wert wird in das Register OCRx (x steht wieder für die Timernummer) gespeichert. Je nach Auflösung des Timers ist dieses Register 8-Bit oder 16-Bit breit. &lt;br /&gt;
&lt;br /&gt;
Hinweis: Siehe CTC Modus unten. Dieser wird benötigt um den Timer entsprechend im &amp;quot;Compare Output&amp;quot;-Betriebsmodus vernünftig zu betreiben.&lt;br /&gt;
&lt;br /&gt;
Hier ein typisches Diagramm dieses Betriebsmodus (Hinweis: Das Diagramm wurde unter Verwendung des CTC Modus erstellt. Für Begriffserklärung siehe CTC Modus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_CompareMatch.png]]&lt;br /&gt;
&lt;br /&gt;
Das Ausrechnen des Werts, der in OCRx geschrieben werden muss, damit Frequenz x entsteht, ist nicht sonderlich schwer. Man geht wie bei der Berechnung des Werts für den Overflow-Modus vor (s.o.) nur daß man das resultierende Ergebnis vom maximalen Zählerwert (bei 8-Bit Auflösung ist dieser 256, bei 16-Bit Auflösung 65536) subtrahiert. Das Ergebnis wird dann einmalig in das Register OCRx geschrieben. Mann muss also nicht wie beim Overflow-Modus den Timer nach jedem Interrupt nachladen. Der enstehende Interrupt heißt in diesem Fall SIG_OUTPUT_COMPAREx (x steht für die Nummer des Timers). Dieser muss in einer ISR abgefangen werden.&lt;br /&gt;
&lt;br /&gt;
Wiederum zusammenfassend ein Beispielprogramm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* Es wird der Timer2 (8-Bit) eines ATmega32 verwendet, der mit einem Quarz mit 7,3728 MHz&lt;br /&gt;
betrieben wird. Im Abstand von 0,001 ms erzeugt der Timer einen Interrupt, also eine Frequenz&lt;br /&gt;
von 1000000 Hz (oder 100 kHz). Der Timer wird auf einen Prescaler von 1 und einem OCR2-Wert&lt;br /&gt;
von 73 konfiguriert.*/&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t countTimer2;	// Speichert den aktuellen Zählerwert&lt;br /&gt;
&lt;br /&gt;
// ISR zum auffangen der Interrupts:&lt;br /&gt;
SIGNAL(SIG_OUTPUT_COMPARE2)&lt;br /&gt;
{&lt;br /&gt;
  countTimer2++;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Initialisierung:&lt;br /&gt;
TCCR2 = (1&amp;lt;&amp;lt;CS22) | (1&amp;lt;&amp;lt;WGM21);	// Prescaler von 1 | CTC-Modus (siehe unten für Beschreibung)&lt;br /&gt;
OCR2  = 73;			// Vergleichswert&lt;br /&gt;
TIMSK |= (1&amp;lt;&amp;lt;OCIE2);		// Interrupts aktivieren und damit Timer starten&lt;br /&gt;
sei();&lt;br /&gt;
&lt;br /&gt;
// Funktionen zum benutzen der Timer:&lt;br /&gt;
/** Diese Funktion nicht aufrufen. Wird von sleep_millisec aufgerufen.&lt;br /&gt;
Bei t=100 schläft die Funktion 1 ms. */&lt;br /&gt;
inline void sleep(uint8_t t)&lt;br /&gt;
{&lt;br /&gt;
	// countTimer2 wird in der ISR oben inkrementiert&lt;br /&gt;
	countTimer2 = 0;&lt;br /&gt;
	while (countTimer2 &amp;lt; t);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** Schläft x-Millisekunden. */&lt;br /&gt;
inline void sleep_millisec(uint16_t msec)&lt;br /&gt;
{&lt;br /&gt;
	uint16_t i;&lt;br /&gt;
	for(i=0; i&amp;lt;msec; i++) {&lt;br /&gt;
		sleep(100);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== CTC Modus (Clear Timer on Compare Match mode) ====&lt;br /&gt;
Der CTC Modus ist eine Erweiterung des &amp;quot;Compare Output&amp;quot;-Betriebsmodus. Der CTC Modus wird z.B. für das obere Beispielprogramm benötigt. Wird der Timer nämlich im normalen Betriebsmodus betrieben, so ist seine Zählergrenze je nach Auflösung 255 oder entsprechend für die 16-Bit Timer. Erst wenn diese Grenze erreicht wurde, wird der Timer zurückgesetzt (also auf 0). Durch den CTC Modus wird der Timer augenblicklich automatisch nachdem ein &amp;quot;Compare Output&amp;quot;-Interrupt auftrat zurückgesetzt. Man kann also die maximalen Zählergrenze selber definieren.&lt;br /&gt;
Dieses Diagramm veranschaulicht den CTC Modus. Nach dem Interrupt wird der Timer sofort wieder zurückgesetzt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_CompareMatch.png]]&lt;br /&gt;
&lt;br /&gt;
==== PWM ====&lt;br /&gt;
Für PWM siehe [[Pwm]].&lt;br /&gt;
&lt;br /&gt;
=== Registerübersicht ===&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' Diese Registertabelle wurde für den aktuellen [[Atmel Controller Mega16 und Mega32]] erstellt. Wenn Sie ein anderes Modell verwenden kann es sein, dass ein oder mehrere Register nicht existieren, oder sie eine andere Bezeichnung haben.&lt;br /&gt;
&lt;br /&gt;
{| {{Blaueschmaltabelle}} width=100%&lt;br /&gt;
 |'''TIMSK'''&lt;br /&gt;
 |-&lt;br /&gt;
 |Mit diesem Register, der von allen Timern verwendet wird, lässt sich die Interruptausführung und Art des jeweiligen Timers bestimmen.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Registertabelle8Bit|OCIE2|TOIE2|TICIE1|OCIE1A|OCIE1B|TOIE1|OCIE0|TOIE0}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
*'''OCIE2 (Timer/Counter2 Output Compare Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter2 Compare Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TOIE2 (Timer/Counter2 Overflow Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter2 Overflow Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TICIE1 (Timer/Counter1, Input Capture Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Input Capture Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''OCIE1A (Timer/Counter1 Output Compare A Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Output Compare A Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''OCIE1B (Timer/Counter1 Output Compare B Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Output Compare B Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TOIE1 (Timer/Counter1 Overflow Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Overflow Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''OCIE0 (Timer/Counter0 Output Compare Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, so wird der Timer/Counter0 Compare Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TOIE0 (Timer/Counter0 Overflow Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, so wird der Timer/Counter0 Overflow Interrupt aktiviert  (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Analog-Digital-Wandler ==&lt;br /&gt;
Mit einem Analog-Digital-Wandler (ADC, für Analog Digital Converter) ist es mit den AVRs möglich, auf einfache Art und Weise analoge Größe in digitale Werte umzuwandeln. Dies bietet sich z.B. an, wenn man die Batteriespannung eines Roboters bestimmen möchte.&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine Informationen ===&lt;br /&gt;
Für allgemeine Informationen zu ADCs: siehe [[ADC]].&lt;br /&gt;
&lt;br /&gt;
=== Kanäle ===&lt;br /&gt;
Ein AVR hat normalerweise nur einen ADC integriert. Öfters muss man aber mehrere analoge Größen von verschiedenen Quellen wandeln, deswegen besitzen die AVRs Kanäle (ein ATmega32 z.B. besitzt acht Kanäle auf Port A). Diese Kanäle werden dann mithilfe eines Multiplexer auf den ADC geschalten werden, der dann die anliegenden analoge Spannung in einen digitalten Wert wandelt.&lt;br /&gt;
&lt;br /&gt;
=== Betriebsmodi ===&lt;br /&gt;
Der ADC bietet verschiedene Betriebsmodi. Diese wären:&lt;br /&gt;
* Single Conversation: Der ADC wandelt eine analoge Größe um und gibt diese zurück.&lt;br /&gt;
* Free Running: Der ADC wandelt wie in einer Endlosschleife ständig die anliegenden analogen Größen in digitale Werte um und gibt diese zurück.&lt;br /&gt;
&lt;br /&gt;
=== Teilungsfaktor ===&lt;br /&gt;
Zum Wandeln benötigt der ADC einen eigenen Takt, der auf der Taktfrequenz des Mikrocontrollers basiert. Allerdings ist die Taktfrequenz des Mikrocontrollers zu schnell und deswegen wird diese durch den Vorteiler verkleinert. Der resultierende Takt muss zwischen 50kHz und 200kHz liegen. Folgende Teilungsfaktoren sind verfügbar:&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''Teilungsfaktoren'''&lt;br /&gt;
 |2&lt;br /&gt;
 |4&lt;br /&gt;
 |8&lt;br /&gt;
 |16&lt;br /&gt;
 |32&lt;br /&gt;
 |64&lt;br /&gt;
 |128&lt;br /&gt;
 |}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Um zu bestimmen welcher Teilungsfaktor geeignet ist, kann man folgende Formel verwenden.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Tacktfrequenz = 8 MHz&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Teilungsfaktor_{min} = {Tacktfrequenz \over {200 kHz}} = {{8000000 Hz} \over {200000 Hz}} = 40&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Teilungsfaktor_{max} = {Tacktfrequenz \over {50 kHz}} = {{8000000 Hz} \over {50000 Hz}} = 160&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Deswegen kann man nun zwischen einem der folgenden Teilungsfaktor wählen: 64 und 128. Im Interesse der Geschwindigkeit sollte 64 gewählt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Siehe bitte die Registerübersicht weiter unten. Dort wird gezeigt, welches Register entsprechend eingestellt werden muss, damit man einen der oben aufgelisteten Teilungsfaktoren auswählen kann.&lt;br /&gt;
&lt;br /&gt;
=== Referenzspannung ===&lt;br /&gt;
Das Ergebnis der Wandlung des ADC bezieht sich auf eine bestimmt Referenzspannung. Diese Referenzspannung lässt sich bestimmen. Je nach gewählter Referenzspannung darf man nur eine zu messende Spannung an den Port anlegen, die nicht höher liegt als die Referenzspannung. Sonst würde dieser zerstört werden. Die Referenzspannung ist also gleich der maximal zu messenden Spannung. Um einzustellen welche Referenzspannung verwendet werden soll, gibt es den Register ADMUX. Folgende Quellen sind als Referenzspannung möglich:&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''Referenzspannungsquelle'''&lt;br /&gt;
 |AREF, internes Vref deaktiviert&lt;br /&gt;
 |AVCC mit externen Kondensator am AREF Pin&lt;br /&gt;
 |Keine Funktion, reserviert&lt;br /&gt;
 |Interne 2,56V Spannungsreferenz mit externen Kondensator am AREF Pin&lt;br /&gt;
 |}&lt;br /&gt;
Siehe bitte die Registerübersicht. Dort steht genauer wie man den Register einzustellen hat.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Man benötigt die Referenzspannung auch (oder besserer deren analoge Größe) um den Wert den der ADC zurückgibt in V umzurechnen. Um den zurückgegebenen Wert des ADC umzuwandel geht man so vor:&amp;lt;br&amp;gt;&lt;br /&gt;
# Bestimmen der Auflösung des ADC. Bei den ATMegas normalerweiße 10 Bit. 10 Bit entsprechen einer Stufung von 1024.&lt;br /&gt;
# Ermitteln des digitalen Werts der analogen Größe. In der Beispielrechnung verwende ich den Wert 592.&lt;br /&gt;
# Größe der Referenzspannung. In der Beispielrechnung wird 5V verwendet.&lt;br /&gt;
Mit diesen Werten kann folgende Berechnung ausführen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;V = 592 * 5V&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;V = 2960 / 1024 = \underline {\underline { 2{,}9V }}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Programmbeispiele ===&lt;br /&gt;
'''C/C++'''&amp;lt;br&amp;gt;&lt;br /&gt;
Dieses Beispiel ist für die [[Atmel Controller Mega16 und Mega32]] gedacht, die mit einer Taktfrequenz von 8 MHz laufen. Es ist unbedingt darauf zu achten nicht die Referenzspannung von 2,56V zu überschreiten! Sonst stirbt der Port. Je nach Einsatzart muss man das Beispielprogramm entsprechend abändern (also diese Zeile mit ADMUX |= (1&amp;lt;&amp;lt;REFS1) | (1&amp;lt;&amp;lt;REFS0);).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;inttypes.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
uint16_t readADC(uint8_t channel) {&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
	uint16_t result = 0;&lt;br /&gt;
	&lt;br /&gt;
	// Den ADC aktivieren und Teilungsfaktor auf 64 stellen&lt;br /&gt;
	ADCSRA = (1&amp;lt;&amp;lt;ADEN) | (1&amp;lt;&amp;lt;ADPS2) | (1&amp;lt;&amp;lt;ADPS1);&lt;br /&gt;
&lt;br /&gt;
	// Kanal des Multiplexers waehlen&lt;br /&gt;
	ADMUX = channel;&lt;br /&gt;
	// Interne Referenzspannung verwenden (also 2,56 V)&lt;br /&gt;
	ADMUX |= (1&amp;lt;&amp;lt;REFS1) | (1&amp;lt;&amp;lt;REFS0);&lt;br /&gt;
	&lt;br /&gt;
	// Den ADC initialisieren und einen sog. Dummyreadout machen&lt;br /&gt;
	ADCSRA |= (1&amp;lt;&amp;lt;ADSC);&lt;br /&gt;
	while(ADCSRA &amp;amp; (1&amp;lt;&amp;lt;ADSC));&lt;br /&gt;
	&lt;br /&gt;
	// Jetzt 3x die analoge Spannung and Kanal channel auslesen&lt;br /&gt;
	// und dann Durchschnittswert ausrechnen.&lt;br /&gt;
	for(i=0; i&amp;lt;3; i++) {&lt;br /&gt;
		// Eine Wandlung&lt;br /&gt;
		ADCSRA |= (1&amp;lt;&amp;lt;ADSC);&lt;br /&gt;
		// Auf Ergebnis warten...&lt;br /&gt;
		while(ADCSRA &amp;amp; (1&amp;lt;&amp;lt;ADSC));&lt;br /&gt;
		&lt;br /&gt;
		result += ADCW;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// ADC wieder deaktivieren&lt;br /&gt;
	ADCSRA &amp;amp;= ~(1&amp;lt;&amp;lt;ADEN);&lt;br /&gt;
	&lt;br /&gt;
	result /= 3;&lt;br /&gt;
	&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
	uint16_t result = readADC(0);	//Auslesen der analogen Spannungen an Pin 0,&lt;br /&gt;
					// also ADC0. In result steht das Ergebnis.&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bascom'''&amp;lt;br&amp;gt;&lt;br /&gt;
Dieses Programmbeispiel ist für die [[Atmel Controller Mega16 und Mega32]] gedacht. Es gibt nacheinander die Spannungen der einzelnen Kanäle (ADC0..7) aus. Dazwischen macht es immer 800 ms pause.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
' Die gemessene Spannung wird in der Variablen W gespeichert.&lt;br /&gt;
' Channel ist der Pin, an dem die Spannung gemessen werden soll.&lt;br /&gt;
&lt;br /&gt;
$baud = 9600&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
$regfile &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
Config Adc = Single , Prescaler = Auto&lt;br /&gt;
Start Adc&lt;br /&gt;
Dim W As Word , Channel As Byte&lt;br /&gt;
Channel = 0&lt;br /&gt;
Do&lt;br /&gt;
  W = Getadc(channel)&lt;br /&gt;
  Print &amp;quot;ADC-Pin &amp;quot; ; Channel ; &amp;quot;: Wert &amp;quot; ; W&lt;br /&gt;
  Incr Channel&lt;br /&gt;
  If Channel &amp;gt; 7 Then Channel = 0&lt;br /&gt;
  Waitms 800&lt;br /&gt;
Loop&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Registerübersicht ===&lt;br /&gt;
'''Hinweis:''' Diese Registertabellen wurden für den aktuellen [[Atmel Controller Mega16 und Mega32]] erstellt. Wenn Sie ein anderes Modell verwenden kann es sein, dass ein oder mehrere Register nicht existieren, oder sie eine andere Bezeichnung haben.&lt;br /&gt;
&lt;br /&gt;
{| {{Blaueschmaltabelle}} width=100%&lt;br /&gt;
 |'''ADCSRA (ADC Control and Status Register A)'''&lt;br /&gt;
 |-&lt;br /&gt;
 |Dieser Register dient dazu den ADC zu kontrollieren.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Registertabelle8Bit|ADEN|ADSC|ADATE|ADIF|ADIE|ADPS2|ADPS1|ADPS0}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
*'''ADEN (ADC Enable)'''&amp;lt;br/&amp;gt;Wird dieses Bit gesetzt (also 1), dann wird der ADC aktiviert. Schreibt man eine 0 wird der ADC deaktiert. Wird der ADC während einer Wandlung deaktiviert, wird die Wandlung abgebrochen.&lt;br /&gt;
*'''ADSC (ADC Start Conversion)'''&amp;lt;br/&amp;gt;Dieses Bit startet den Messvorgang, je nachdem in welchem Betriebsmodi der ADC läuft. Wird dieses Bit nach der Aktivierung des ADC über '''ADEN''' zum ersten Mal gesetzt, wird der ADC erst eine Initialisierungswandlung durchführen und danach erst die eigentliche Wandlung. Das Schreiben einer 0 auf das Bit hat keinen Effekt.&lt;br /&gt;
*'''ADATE (ADC Auto Trigger Enable)'''&amp;lt;br/&amp;gt;Wird dieses Bit gesetzt, wird das Auto Triggering des ADC aktiviert.&lt;br /&gt;
*'''ADIF (ADC Interrupt Flag)'''&amp;lt;br/&amp;gt;Dieses Bit wird auf 1 gesetzt, wenn eine Wandlung erfolgte und das Ergebnis nun verfügbar ist. Der ADC Complete Interrupt wird ausgelöst, wenn das '''ADIE'''-Bit gesetzt ist und die Interrupts global aktiviert sind. Das Bit wird gelöscht, wenn die entsprechende ISR abgearbeitet wird. Alternativ kann man es löschen, indem man eine 1 auf das Bit schreibt.&lt;br /&gt;
*'''ADIE (ADC Interrupt Enable)'''&amp;lt;br/&amp;gt;Wird dieses Bit gesetzt und die globalen Interrupts sind aktiviert, wird der ADC Complete Interrupt aktiviert, auf den man dann in der entsprechenden ISR reagieren kann.&lt;br /&gt;
*'''ADPS2 (ADC Prescaler Select Bit 2)'''&amp;lt;br/&amp;gt;Diese Bits bestimmen den Teilungsfaktor zwischen der XTAL-Frequenz (also der Taktfrequenz) und dem Eingangstakt des ADC. Zum Wandeln benötigt der ADC einen eigenen Takt, der auf der Taktfrequenz des Mikrocontrollers basiert. Allerdings ist die Taktfrequenz zu schnell und deswegen wird diese durch den Vorteiler verkleinert. Der resultierende Takt muss zwischen 50kHz und 200kHz liegen. Siehe [[Avr#Teilungsfaktor]]. Folgende Teilungsfaktoren sind verfügbar:&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''ADPS2'''&lt;br /&gt;
 |'''ADPS1'''&lt;br /&gt;
 |'''ADPS0'''&lt;br /&gt;
 |'''Teilungsfaktor'''&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |2&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |2&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |4&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |8&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |16&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |32&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |64&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |128&lt;br /&gt;
 |}&lt;br /&gt;
*'''ADPS1 (ADC Prescaler Select Bit 1)'''&amp;lt;br/&amp;gt;Siehe '''ADPS2''' für eine Beschreibung.&lt;br /&gt;
*'''ADPS0 (ADC Prescaler Select Bit 0)'''&amp;lt;br/&amp;gt;Siehe '''ADPS2''' für eine Beschreibung.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| {{Blaueschmaltabelle}} width=100%&lt;br /&gt;
 |'''ADMUX (ADC Multiplexer Selection Register)'''&lt;br /&gt;
 |-&lt;br /&gt;
 |Mit diesem Register wird der Multiplexer gesteuert.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Registertabelle8Bit|REFS1|REFS0|ADLAR|MUX4|MUX3|MUX2|MUX1|MUX0}}&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
*'''REFS1 (Reference Selection Bit 1)'''&amp;lt;br/&amp;gt;Mit diesem Bit kann steuern, welche Referenzspannung der ADC verwenden soll. Die möglichen Quellen sind unten aufgelistet. Wird während einer Wandlung die Quelle für die Referenzspannung geändert, wird die aktuelle Wandlung mit der &amp;quot;alten&amp;quot; Quellen zuerste beendet, bevor die neue Einstellung übernommen wird.&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''REFS1'''&lt;br /&gt;
 |'''REFS0'''&lt;br /&gt;
 |'''Referenzspannungsquelle'''&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |AREF, internes Vref deaktiviert&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |AVCC mit externen Kondensator am AREF Pin&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |Keine Funktion, reserviert&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |Interne 2,56V Spannungsreferenz mit externen Kondensator am AREF Pin&lt;br /&gt;
 |}&lt;br /&gt;
*'''REFS0 (ADC Start Conversion)'''&amp;lt;br/&amp;gt;Siehe '''REFS1'''.&lt;br /&gt;
*'''ADLAR (ADC Left Adjust Result)'''&amp;lt;br/&amp;gt;Dieses Bit beeinflusst, wie der ermittelte Messwert im ADC Data Register abgelegt wird.&lt;br /&gt;
*'''MUX4 (Analog Channel and Gain Selection Bit 4)'''&amp;lt;br/&amp;gt;Dieses Bit wird auf 1 gesetzt, wenn eine Wandlung erfolgte und das Ergebnis nun verfügbar ist. Der ADC Complete Interrupt wird ausgelöst, wenn das '''ADIE'''-Bit gesetzt ist und die Interrupts global aktiviert sind. Das Bit wird gelöscht, wenn die entsprechende ISR abgearbeitet wird. Alternativ kann man es löschen, indem man eine 1 auf das Bit schreibt.&lt;br /&gt;
*'''MUX3 (Analog Channel and Gain Selection Bit 3)'''&amp;lt;br/&amp;gt;Mit diesen Bits ('''MUX3''' bis '''MUX0''') wird der Kanal des Multiplexers eingestellt, der mit dem ADC verbunden ist.&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''MUX4..0'''&lt;br /&gt;
 |'''Pin'''&lt;br /&gt;
|-&lt;br /&gt;
 |00000&lt;br /&gt;
 |ADC0&lt;br /&gt;
|-&lt;br /&gt;
 |00001&lt;br /&gt;
 |ADC1&lt;br /&gt;
|-&lt;br /&gt;
 |00010&lt;br /&gt;
 |ADC2&lt;br /&gt;
|-&lt;br /&gt;
 |00011&lt;br /&gt;
 |ADC3&lt;br /&gt;
|-&lt;br /&gt;
 |00100&lt;br /&gt;
 |ADC4&lt;br /&gt;
|-&lt;br /&gt;
 |00101&lt;br /&gt;
 |ADC5&lt;br /&gt;
|-&lt;br /&gt;
 |00110&lt;br /&gt;
 |ADC6&lt;br /&gt;
|-&lt;br /&gt;
 |00111&lt;br /&gt;
 |ADC7&lt;br /&gt;
 |}&lt;br /&gt;
Es reicht also einfach die Pinnummer in ADMUX zu schreiben.&lt;br /&gt;
*'''MUX2 (Analog Channel and Gain Selection Bit 2)'''&amp;lt;br/&amp;gt;Siehe '''MUX3''' für eine Beschreibung.&lt;br /&gt;
*'''MUX1 (Analog Channel and Gain Selection Bit 1)'''&amp;lt;br/&amp;gt;Siehe '''MUX3''' für eine Beschreibung.&lt;br /&gt;
*'''MUX0 (Analog Channel and Gain Selection Bit 0)'''&amp;lt;br/&amp;gt;Siehe '''MUX3''' für eine Beschreibung.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Des Weiteren gibt es noch den Register '''ADCL/ADCH''' in dem das Ergebnis einer Wandlung steht. Man liest den Wert folgendermaßen aus:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uint16_t x = ADCL;&lt;br /&gt;
x += (ADCH&amp;lt;&amp;lt;8);&lt;br /&gt;
// oder&lt;br /&gt;
x = ADCW;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Die Fusebits==&lt;br /&gt;
Fusebits nennt man bestimmte Bits zur Konfigurierung eines AVR-Controllers. Bei der Auslieferung neuer AVR Controller sind die Fusebits bereits vorkonfiguriert. In vielen Fällen kann man die Konfiguration unverändert belassen, je nach Controllertyp. Bei den Typen Mega xxx bestimmen einige Fusebits beispielsweise, dass der interne Taktgeber aktiviert ist. Möchte man dagegen einen externen Quarz anschließen oder die Taktfrequenz ändern, so müssen auch die Fusebits geändert werden. Auch das Deaktivieren des &amp;quot;[[On Chip Debugging]]&amp;quot; Modus ist oft notwendig, wenn man alle Ports ausnutzen möchte. &lt;br /&gt;
&lt;br /&gt;
Die Fusebits werden in der Regel über die Software eingestellt, welche auch für das Übertragen des Programmcodes zuständig ist. Besonders einfach geht dies beispielsweise mit der Entwicklungsumgebung [[Bascom]]. Aber auch andere Programme wie [[PonyProg]] können für die Umstellung der Fusebits genutzt werden. Einmal eingestellte Fusebits bleiben bis zur erneuten Fusebit-Änderung erhalten. Der normale Programmiermodus verändert die Fusebits nicht. &lt;br /&gt;
&lt;br /&gt;
Je nach AVR Controllertyp sind unterschiedliche Fusebits (Einstellungen) vorhanden. Die genaue Beschreibung findet man im jeweiligen Datenblatt. Da aber falsch gesetzte Fusebit-Einstellungen zu den häufigsten Problemen gehören, liste ich hier die Funktion der üblichen Fusebits nochmals genauer auf:&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''CKSEL0, CKSEL1, CKSEL2, CKSEL3'''&lt;br /&gt;
 |Die Kombination dieser 4 Fusebits bestimmt die Taktquelle des Controllers. Das kann eine interner Taktgenerator, ein Quarz, Quarzoszillator, RC-Glied und ähnliches sein.&lt;br /&gt;
|-&lt;br /&gt;
 |'''JTAGEN'''&lt;br /&gt;
 |Hiermit wird die &amp;quot;[[On Chip Debugging]]&amp;quot; Schnittstelle aktiviert bzw. deaktiviert. Das sind die Bits mit den Bezeichnungen TDI, TDO, TMS und TCK. Möchte man diese Pins als normalen Port nutzen, so muss diese Schnittstelle immer deaktiviert werden. &lt;br /&gt;
|-&lt;br /&gt;
 |'''SUT0, SUT1'''&lt;br /&gt;
 |Die sogenannte StartUp-Zeit (PowerOn delay). Diese Einstellung muss abhängig von der Art des Taktgenerators eingestellt werden, genaueres im jeweiligen Datenblatt. &lt;br /&gt;
|-&lt;br /&gt;
 |'''SPIEN'''&lt;br /&gt;
 |Hiermit kann die serielle [[AVR-ISP Programmierkabel|ISP-Programmierung]], welche die meisten Programmierkabel nutzen, deaktiviert werden. Dies sollte man lieber vermeiden, denn wenn dieser Programmiermodus deaktiviert wurde, kann nur noch der Parallel-Programmiermodus genutzt werden. Der Parallel-Programmiermodus benötigt jedoch ein spezielles Programmiergerät, das die wenigsten Bastler besitzen. ''Also Vorsicht!''&lt;br /&gt;
|-&lt;br /&gt;
 |'''BODEN'''&lt;br /&gt;
 |Über dieses Bit wird der '''Brown-out Detector''' aktiviert bzw. deaktiviert. Dies ist eine Überwachung der Betriebsspannung. Diese Überwachung soll dafür sorgen, dass bei Spannungseinbrüchen ein ordentlicher RESET durchgeführt wird. Dadurch wird verhindert, dass ein Controller in einen undefinierten Zustand gerät (hängen bleibt).&lt;br /&gt;
|-&lt;br /&gt;
 |'''BOOTLEVEL'''&lt;br /&gt;
 |Über dieses  Bit kann die Spannung festgelegt werden, ab welcher der '''Brown-out Detector''' den Controller neu startet (also RESET ausführt). &lt;br /&gt;
|-&lt;br /&gt;
 |'''BOOTRST'''&lt;br /&gt;
 |Gewöhnlich startet ein Programm im Controller nach einem RESET ab Adresse 0. Durch dieses Fusebit kann der Controller jedoch veranlasst werden, nach einem Reset einen sogenannten Bootloader-Bereich auszuführen. Ein [[Bootloader]] kann genutzt werden, um Controller über andere Schnittstellen (z.B. RS232) zu programmieren.&lt;br /&gt;
|-&lt;br /&gt;
 |'''BOOTSZ0, BOOTSZ1'''&lt;br /&gt;
 |Der zuvor genannte Bootloaderbereich kann bei AVR-Controllern verschieden groß sein. Über diese beiden Bits können vier verschiedene Größen eingestellt werden. Siehe unter [[Bootloader]].&lt;br /&gt;
|-&lt;br /&gt;
 |'''EESAVE'''&lt;br /&gt;
 |Dieses Bit legt fest, ob beim Programmieren des Controllers (man nennt es auch brennen) immer das EEPROM gelöscht werden soll.&lt;br /&gt;
|-&lt;br /&gt;
 |'''CKOPT'''&lt;br /&gt;
 |Abhängig von den Einstellungen von CKSEL kann hier dir Oszillator-Verstärkung eingestellt werden. Genaueres im Datenblatt des jeweiligen Controllers.&lt;br /&gt;
|-&lt;br /&gt;
 |'''WDTON'''&lt;br /&gt;
 |Schaltet den WatchDog-Timer beim Booten ein/aus. Dies ist auch per Software möglich&lt;br /&gt;
|-&lt;br /&gt;
 |'''RSTDISBL'''&lt;br /&gt;
 |Durch dieses Bit kann man den RESET-Pin deaktivieren und dann als normalen I/O-Port nutzen. Aber Vorsicht! Da die RESET-Leitung beim Programmieren (Brennen) des Chips genutzt wird, kann man nach dessen Deaktivierung den Controller mit den üblichen [[AVR-ISP Programmierkabel|ISP-Adaptern]] nicht mehr programmieren. In diesem Fall könnte man zwar den Controlle noch mit speziellen Programmiergeräten im Parallelmodus programmieren, aber in der Praxis verfügen nur wenige Bastler über ein Programmiergerät, das dies leistet.&lt;br /&gt;
|-&lt;br /&gt;
 |'''LB1, LB2'''&lt;br /&gt;
 |Das sind die sogenannten Lockbits, mit denen sich das Auslesen des Flash- als auch EEPROM-Speichers verhindern läßt. Zwar können andere Anwender immer noch Daten lesen, allerdings handelt es sich dabei nicht mehr um den wirklichen Inhalt sondern lediglich um wirre Datenbytefolgen. Programmierer, die den erarbeiteten Code vor Raubkopierern schützen wollen, nutzen diese Lockbits. Das Programmieren ist auch bei gesetzen Lockbits noch möglich. Der Bootloader-Bereich wird nicht durch die Lockbits geschützt.&lt;br /&gt;
|-&lt;br /&gt;
 |'''BLB01, BLB02'''&lt;br /&gt;
 |Durch diese Bits kann der Code sogar vor dem Zugriff durch den Bootloader geschützt werden&lt;br /&gt;
|-&lt;br /&gt;
 |'''BLB11, BLB12'''&lt;br /&gt;
 |Diese Bits schützen den Bootloaderbereich selbst&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wie man die Fusebits mit [[Bascom]] einstellt, wird im Beitrag [[Bascom - Erstes Programm in den AVR Controller übertragen]] erläutert.&lt;br /&gt;
&lt;br /&gt;
''Autoren des Artikels: Frank, Luma'' &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Atmel]]&lt;br /&gt;
* [[AVR-Einstieg leicht gemacht]]&lt;br /&gt;
* [[Avr-gcc|avr-gcc]] - Leistungsfähiger AVR-Port des freien Compilers GCC&lt;br /&gt;
* [[WinAVR]] - Ein freies Werkzeugpaket auf Basis avr-gcc für die Windows-Platform, integriert unter anderem das [[Programmer's Notepad]]&lt;br /&gt;
* [[AVR_Assembler_Einf%C3%BChrung|AVR Assembler Einführung (AvrStudio)]]&lt;br /&gt;
* [[AVR-ISP Programmierkabel]] - Bauanleitung für die AVR Controller Programmierkabel&lt;br /&gt;
* [[RN-Control]] - Eines der beliebtestet AVR-Boards im Roboternetz&lt;br /&gt;
* [[RNBFRA-Board]] - Größeres Board mit zwei Atmel Controllern&lt;br /&gt;
* [[Bascom]] - Sehr gutes Basic-Entwicklungssystem&lt;br /&gt;
* [[Bascom - Erstes Programm in den AVR Controller übertragen]]&lt;br /&gt;
* [[On Chip Debugging]]&lt;br /&gt;
* [[Bootloader]]&lt;br /&gt;
* [[Timer]]&lt;br /&gt;
* [[TWI]] - I2C beim AVR&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
* [http://www.atmel.com/dyn/products/param_table.asp?family_id=607&amp;amp;OrderBy=part_no&amp;amp;Direction=ASC Aktuelle AVR Vergleichstabelle]&lt;br /&gt;
* [http://www.atmel.com/dyn/products/devices.asp?family_id=607 Die Datenblätter zu Atmel Controllern]&lt;br /&gt;
* [https://mpg.dnsalias.com/~magerlu/rn-wiki/avrtimer_applet Java Applet Timer Berechnung]&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/dload.php?action=file&amp;amp;file_id=169 AvrTimer Windows Berechnungstool]&lt;br /&gt;
* [http://people.freenet.de/gjl/helferlein/avr-uart-rechner.html AVR-Baudraten-Rechner (JavaScript)]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Abkürzung|AVR]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Avr&amp;diff=7177</id>
		<title>Avr</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Avr&amp;diff=7177"/>
				<updated>2006-05-04T21:19:10Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:AtmelController.jpg|thumb|Beispiel eines AVR Controllers]]&lt;br /&gt;
'''AVR''' ist eine 8-Bit [[Microcontroller]]-Familie mit RISC-Architektur.&lt;br /&gt;
Im Gegensatz zu vielen anderen Microcontroller-Architekturen hat die AVR-Architektur keine Vorgänger. Sie ist ein komplettes Neudesign, das Anfang der 90-Jahre an der Universität von Trondheim/Norwegen entwickelt und vom (bis heute einzigen) Hersteller [[Atmel]] aufgekauft wurde. Es gibt eine ganze Serie von AVR-Controllern. Sie alle werden ähnlich programmiert, haben vergleichbaren Befehlssatz und physikalische Eigenschaften, bieten jedoch unterschiedliche Features und Peripherie. &lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche und kostenlose Entwicklungssysteme in den Sprachen Basic, C/C++, Pascal und Assembler für diese Controller-Familie. &lt;br /&gt;
&lt;br /&gt;
==Wofür steht AVR?==&lt;br /&gt;
&amp;quot;AVR&amp;quot; steht angeblich für ''Advanced Virtual RISC'' (in einem Paper der Entwickler des AVR-Kerns Alf Egin Bogen und Vegard Wollan). Laut [[Atmel]] bedeutet es nichts.&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
AVR-Controller besitzen eine zweistufige Pipeline (fetch and execute), die es ermöglicht, die meisten Befehle innerhalb eines einzigen Prozessortaktes auszuführen. Dadurch ist ein AVR wesentlich schneller als etwa 8051-Controller, bei denen der Prozessortakt intern noch durch 12 geteilt wird.&lt;br /&gt;
&lt;br /&gt;
*AVR-Kern&lt;br /&gt;
** Harvard-Architektur (getrennter Befehls- und Datenspeicher) &lt;br /&gt;
** 32 Register, kein Akkumulator, 3 Pointerregister &lt;br /&gt;
** EEPROM-Datenspeicher&lt;br /&gt;
** [[Watchdog]], [[Bootloader]]-Support, verschiedene Stromspar-Modi, Brownout-Erkennung, Interner Oszillator&lt;br /&gt;
** Lineares Speichermodell (keine Segmentierung)&lt;br /&gt;
** 8-Bit Architektur ist für Hochsprachen (C) optimiert &lt;br /&gt;
* In-System programmierbar: die Controller können sehr einfach über ein  Programmierkabel (oft ISP-Kabel genannt), das mit dem PC verbunden wird, programmiert werden &amp;amp;ndash; auch dann, wenn sie sich nicht in einer Schaltung befindet.&lt;br /&gt;
* umfangreiche Peripherie&lt;br /&gt;
** 8- und 16-Bit-Timer/Counter mit [[PWM]], Capture/Compare, externe Betaktung, asynchrone Operation&lt;br /&gt;
** Kommunikation: [[UART|USART]], [[SPI]], [[I2C]] ([[TWI]])&lt;br /&gt;
** Analog-Comparator, Analog-Digital-Wandler &lt;br /&gt;
** unterschiedlichste externe und interne Interrupt-Quellen (UART, SPI, Timer, A/D-Wandler, Analog-Comparator, ...)&lt;br /&gt;
** JTAG (Debugerinterface)&lt;br /&gt;
* AVR Typen (AT90 &amp;quot;Classic AVR&amp;quot;, ATtiny, ATmega) &lt;br /&gt;
* erhältlich in unterschiedlichen Gehäusen, idR Durchsteck und als [[SMD]]&lt;br /&gt;
* Viele Entwicklungsboards erhältlich, z.B. das Roboternetzboard [[RN-Control]]&lt;br /&gt;
&lt;br /&gt;
==Einige Pinbelegungen der populärsten AVR-Controller==&lt;br /&gt;
(in etwa nach Leistungsfähigkeit sortiert)&lt;br /&gt;
&lt;br /&gt;
* [[AT90S2313]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:at90s2313tiny.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Atmel Controller Mega8]]&lt;br /&gt;
* [[Atmel Controller Mega48 Mega88 Mega168]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:mega8kompatibel.png|center]]&lt;br /&gt;
&lt;br /&gt;
* [[Atmel Controller Mega16 und Mega32]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mega1632.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Atmel Controller Mega128]] ([[SMD]]-Chip)&lt;br /&gt;
&lt;br /&gt;
[[Bild:mega128pin.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===Die AVR-Pin-Bezeichnungen und deren Funktion===&lt;br /&gt;
Die meisten Ports sind doppelt belegt und besitzen neben der normalen Port-Funktion noch eine Sonderfunktion. Die verschiedenen Pinbezeichnungen und Sonderfunktionen werden hier beschrieben:&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|+ '''Tabelle: Die AVR-Pin-Bezeichnungen und deren Funktion'''&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Versorgungs- und Referenzpins, Reset&lt;br /&gt;
|-&lt;br /&gt;
 |'''VCC''' &lt;br /&gt;
 | Versorgungsspannung von 2,7 Volt bis 6 V bei den L-Varianten (low power), ansonsten 4,5V bis 6V. Die nächste AVR-Generation soll ab 1,8 Volt funktionieren.&lt;br /&gt;
|-&lt;br /&gt;
 |'''GND''' &lt;br /&gt;
 |Masse &lt;br /&gt;
|-&lt;br /&gt;
 |'''AREF''' &lt;br /&gt;
 |Referenzspannung für den Analog-Digital-Wandler (kann auf 5V gesetzt werden). Auch die interne Bandgap-Referenzspannung kann über diesen Pin entstört werden (dann KEINE externe Spannung an diesen Pin geben (Kurzschluss)!). &lt;br /&gt;
|-&lt;br /&gt;
 |'''AGND''' &lt;br /&gt;
 |Alternative Masse, etwa um ein Verbindungspunkt mit GND zu haben und bei empfindlichen Messungen  Masseschleifen zu vermeiden.&lt;br /&gt;
|-&lt;br /&gt;
 |'''AVCC''' &lt;br /&gt;
 | &lt;br /&gt;
Die Betriebsspannung für den Analog-Digital-Wandler (siehe Beschaltungsskizze). Die Pins AVCC, AGND und AREF sollten immer beschaltet werden, da es sonst passieren kann, dass Port A nicht richtig funktioniert, selbst wenn man den AD-Wandler nicht benutzt. &lt;br /&gt;
|-&lt;br /&gt;
 |'''RESET''' &lt;br /&gt;
 |Rücksetz-Eingang, intern über einen [[Pullup]] mit VCC verbunden. Ein LOW–Pegel an diesem Pin für die Dauer von mindestens zwei Zyklen des Systemtaktes bei aktivem Oszillator setzt den Controller zurück. Rücksetzen der Ports erfolgt unabhängig von einem evtl. anliegenden Systemtakt.&lt;br /&gt;
|-&lt;br /&gt;
|'''PEN'''&lt;br /&gt;
|Programming Enable - Diesen Pin gibt es nur beim Mega128/64 u.ä. Wird dieser Pin beim Power-On Reset nach Masse gezogen, geht der Controller in den [[ISP]] Programmiermodus. Man kann ihn also alternativ zu Reset verwenden. In der Regel verwendet man aber die Reset-Leitung und PEN sollte man direkt mit VCC verbinden.&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| System-Takt&lt;br /&gt;
|-&lt;br /&gt;
 |'''XTAL1''' &lt;br /&gt;
 |Eingang des internen Oszillators zur Erzeugung des Systemtaktes bzw. Eingang für ein externes Taktsignal, wenn der interne Oszillator nicht verwendet werden soll bzw. Anschluss von Quarz/Keramik-Resonator/RC-Glied.&lt;br /&gt;
|-&lt;br /&gt;
 |'''XTAL2''' &lt;br /&gt;
 |Anschluss von Quarz oder Keramik-Resonator oder Ausgang des integrierten Oszillators zur Nutzung als Systemtakt (Je nach Fuse-Einstellungen). &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Digitale bidirektionale  I/O-Ports&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;| Jeder Pin der Ports kann individuell als Eingang oder Ausgang konfiguriert werden. Die I/O-Ports sind maximal 8 Bit breit und verfügen ja nach AVR-Typ über eine unterschiedliche Anzahl von Pins. An jedem als Eingang (Input) geschalteten Pin gibt es zuschaltbare [[Pullup]]-Widerstände, die teilweise auch bei aktivierter Sonderfunkton verfügbar sind.&lt;br /&gt;
&lt;br /&gt;
Bei eingeschalteten Sonderfunktionen wie UART, SPI, ADC, etc. sind die entsprechenden Pins nicht als &amp;quot;normale&amp;quot; digitale I/O verwendbar, sondern dienen der Sonderfunktion. Die Anzahl der als I/O verwendbaren Pins ist auch abhängig von den Fuse-Einstellungen (Vorsicht beim Umstellen, Handbuch GENAU lesen!).&lt;br /&gt;
|-&lt;br /&gt;
|'''PA 0 – 7''' || Port A &lt;br /&gt;
|-&lt;br /&gt;
|'''PB 0 – 7''' || Port B &lt;br /&gt;
|-&lt;br /&gt;
|'''PC 0 – 7''' || Port C &lt;br /&gt;
|-&lt;br /&gt;
|'''PD 0 – 7''' || Port D &lt;br /&gt;
|-&lt;br /&gt;
|'''PE 0 – 7''' || Port E &lt;br /&gt;
|-&lt;br /&gt;
|'''PF 0 – 7''' || Port F &lt;br /&gt;
|-&lt;br /&gt;
|'''PG 0 – 7''' || Port G &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Externe Interrupts&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;| Die PCINT-Interrupts gibt es nur für neuere AVRs wie den [[ATmega88]]. Falls die Anzahl an externen Interrupts nicht ausreicht, kann evtl. auch andere Hardware dafür eingesetzt werden, etwa der Analog-Comparator mit interner Bandgap-Referenz, falls er anderwärtig nicht gebraucht wird.&lt;br /&gt;
|-&lt;br /&gt;
 |'''INT0''' ||Externer Interrupt 0&lt;br /&gt;
|-&lt;br /&gt;
 |'''INT1''' ||Externer Interrupt 1&lt;br /&gt;
|-&lt;br /&gt;
 |'''INT2''' ||Externer Interrupt 2 &lt;br /&gt;
|-&lt;br /&gt;
 |'''PCINTx''' ||Pin-Change Interrupt&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| [[Timer]] und [[PWM]]&lt;br /&gt;
|-&lt;br /&gt;
 |'''T0''' &lt;br /&gt;
 |Timer-Eingang. Timer kann gestartet, gestoppt oder getaktet werden &lt;br /&gt;
|-&lt;br /&gt;
 |'''T1''' &lt;br /&gt;
 |Timer-Eingang. Timer kann gestartet, gestoppt oder getaktet werden &lt;br /&gt;
|-&lt;br /&gt;
 |'''OC0''' &lt;br /&gt;
 |PWM bzw. Output Compare Ausgang des Timers 0 &lt;br /&gt;
|-&lt;br /&gt;
 |'''OC1A''' &lt;br /&gt;
 |Ausgang für die Compare-Funktion des integrierten Zeitgeber- / Zählerbausteines &lt;br /&gt;
Der erste PWM-Ausgang des Timers1. Er kann zum Regeln der Bot-Motogeschwindigkeit benutzt werden. &lt;br /&gt;
|-&lt;br /&gt;
 |'''OC1B''' &lt;br /&gt;
 |Ausgang für die Compare-Funktion des integrierten Zeitgeber- / Zählerbausteines &lt;br /&gt;
Der zweite PWM-Ausgang des Timers1. Er kann zum Regeln der Bot-Motogeschwindigkeit benutzt werden. &lt;br /&gt;
|-&lt;br /&gt;
 |'''ICP1''' &lt;br /&gt;
 |Eingang für die Capture-Funktion des integrierten Zeitgebers / Zählerbausteines &lt;br /&gt;
|-&lt;br /&gt;
 |'''OC2''' &lt;br /&gt;
 |[[Pwm]] bzw. Output Compare Ausgang des Timers2. Er kann zum Regeln der Bot-Motogeschwindigkeit benutzt werden. &lt;br /&gt;
|-&lt;br /&gt;
 |'''TOSC1, TOSC2''' &lt;br /&gt;
 |TOSC1 und TOSC2 sind Eingänge für den asynchronen Modus von Timer2. Sie sind vorgesehen für den Anschluss eines externen Uhrenquarzes ( 32.768 kHz ). Damit lassen sich zum Beispiel sehr genaue Ein-Sekunden-Impulse für eine Uhr generien. &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Analog-Digital-Wandler&lt;br /&gt;
|-&lt;br /&gt;
 |'''ADC0''' bis '''ADC7''' &lt;br /&gt;
 |Eingänge des AD-Wandlers. Spannungen können hier gemessen werden oder an den Analog-Komparator weiter geleitet werden. &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Analog-Komparator&lt;br /&gt;
|-&lt;br /&gt;
 |'''AIN0, AIN1''' &lt;br /&gt;
 |Die beiden externen Eingänge des Analog-Komparators. &lt;br /&gt;
Mit AIN0(+) und AIN1(-) kann man zwei Spannungen miteinander vergleichen. Wenn die Spannung an AIN0 höher als bei AIN1 ist, liefert der Komparator &amp;quot;High&amp;quot;, ansonsten ein &amp;quot;Low&amp;quot;. Als interne Eingänge des Komparators können die Interne Bandgap-Referenzspannung oder Ausgänge des ADC-Multiplexers dienen.&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Serielle Schnittstelle ([[UART|USART]])&lt;br /&gt;
|-&lt;br /&gt;
 |'''RXD''' &lt;br /&gt;
 |Eingang der Seriellen Schnittstelle (Receive Data), TTL-Pegel &lt;br /&gt;
|-&lt;br /&gt;
 |'''TXD''' &lt;br /&gt;
 |Ausgang Serielle Schnittstelle (Transmit Data), TTL-Pegel &lt;br /&gt;
|-&lt;br /&gt;
 |'''XCK''' &lt;br /&gt;
 |Externe Takt für den USART. Wird nur in Sonderfällen für den Takt benötigt. &lt;br /&gt;
USART (&amp;quot;Universal Synchronous/Asynchronous Receiver and Transmitter&amp;quot;). Das ist die serielle Schnittstelle, die zur Datenübertragung zwischen Mikrocontroller und PC genutzt wird. Zur bidirektionalen Übertragung werden zwei Pins am Controller benötigt: TXD und RXD. Über TXD (&amp;quot;Transmit Data&amp;quot;) werden Daten gesendet, RXD (&amp;quot;Receive Data&amp;quot;) dient zum Empfang. &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| [[SPI]]-Schnittstelle&lt;br /&gt;
|-&lt;br /&gt;
 |'''SS''' &lt;br /&gt;
 |SPI-Interface – wird beneötigt um den richtigen Slave am Bus zu wählen &lt;br /&gt;
|-&lt;br /&gt;
 |'''MOSI''' &lt;br /&gt;
 |SPI-Interface – Datenausgang (als Master) oder Dateneingang (als Slave), verwendet bei ISP (In-System-Programmierung)&lt;br /&gt;
|-&lt;br /&gt;
 |'''MISO''' &lt;br /&gt;
 |SPI-Interface – Dateneingang (als Master) oder Datenausgang (als Slave), verwendet bei ISP (In-System-Programmierung)&lt;br /&gt;
|-&lt;br /&gt;
 |'''SCK''' &lt;br /&gt;
 |SPI-Interface – Bustakt vom Master, verwendet bei ISP (In-System-Programmierung)&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| [[I2C|I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C]]-Schnittstelle ([[TWI]])&lt;br /&gt;
|-&lt;br /&gt;
 |'''SDA''' &lt;br /&gt;
 |I2C-Schnittstelle (Bus aus 2 Leitungen) Datenleitung &lt;br /&gt;
|-&lt;br /&gt;
 |'''SCL''' &lt;br /&gt;
 |I2C-Schnittstelle (Bus aus 2 Leitungen) Clockleitung &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| [[JTAG]]-Interface&lt;br /&gt;
|-&lt;br /&gt;
 |'''TDI''' &lt;br /&gt;
 |JTAG-Debug Interface - Über dieses Interface kann man den AVR programmieren und debuggen. Die Schnittstelle ist ähnlich wie die SPI Schnittstelle und hat getrennte Dateneingangs- und Datenausgangsleitungen sowie eine Taktleitung. TDI ist die Dateneingangsleitung&lt;br /&gt;
|-&lt;br /&gt;
 |'''TDO''' &lt;br /&gt;
 |JTAG-Debug Interface - TDO ist die Datenausgangsleitung des JTAG Interface&lt;br /&gt;
|-&lt;br /&gt;
 |'''TMS''' &lt;br /&gt;
 |JTAG-Debug Interface&lt;br /&gt;
|-&lt;br /&gt;
 |'''TCK''' &lt;br /&gt;
 |JTAG-Debug Interface &lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Timer/Counter ==&lt;br /&gt;
&lt;br /&gt;
Die Mikrocontroller der AVR-Familie besitzen je nach Typ eine unterschiedliche Anzahl an programmierbaren [[Timer|Timern]]. Bei den aktuellen ATmegas sind das mindestens ein 8-Bit Timer und bei größeren Ausführungen der Serie auch 16-Bit Timer. Die Timer werden immer Timerx benannt, wobei x für die Timernummer steht (also 0, 1, 2, usw.). &lt;br /&gt;
Die Konfigurationsmöglichkeiten sind von Timer zu Timer unterschiedlich.&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' Die folgenden Code-Beispiele sind in C programmiert und wurden für einen [[ATMega32|ATmega32]] entwickelt. Sie lassen sich also ohne große Änderungen auch auf anderen Mikrocontrollern der AVR-Familie einsetzen.&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine Funktionsweise ===&lt;br /&gt;
Timer funktionieren nach dem allgemeinen Prinzip, dass sie eine Ganzzahl (im weiteren als Zähler bezeichnet) je nach Betriebsmodus auf- oder abwärtszählen, d.h. inkrementieren bzw. dekrementieren.&lt;br /&gt;
&lt;br /&gt;
Angenommen, der Timer arbeitet im einfachsten Betriebsmodus, dem normalen Modus (siehe [[Avr#Normaler Modus (Normal Mode)|Normaler Modus (Normal Mode)]]). Die Zählrichtung des Timers ist aufsteigend gerichtet. Je nach Auflösung, also 8-Bit oder 16-Bit, erreicht der Zähler irgendwann einen bestimmten Zustand. Möglich wäre, dass er überläuft, wenn z.B. bei einem 8-Bit Timer der Wert 255 inkrementiert wird (siehe Grafik).&lt;br /&gt;
&lt;br /&gt;
[[Bild:AbstrakterZaehlvorgang.png]]&lt;br /&gt;
&lt;br /&gt;
=== Der Prescaler ===&lt;br /&gt;
Der Prescaler (eng. = Vorteiler) kann dazu genutzt werden, den Takt, der den Timern zugeführt wird, zu verkleinern. U.a. kann man damit die Timer so konfigurieren, damit diese in den unterschiedlichsten Frequenzen takten. Hier eine Grafik die den Prescaler veranschaulicht:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Prescaler.png]]&lt;br /&gt;
&lt;br /&gt;
Das obere Diagramm zeigt den Betrieb ohne Prescaler, das untere mit Prescaler. Die gestrichelte Linie zeigt, wann ein Interrupt eintritt.&lt;br /&gt;
&lt;br /&gt;
Im Teil [[Avr#Die Betriebsmodi|Die Betriebsmodi]] wird weiter auf die praktische Verwendung des Prescalers eingegangen.&lt;br /&gt;
&lt;br /&gt;
=== Die Betriebsmodi ===&lt;br /&gt;
Die AVR-Timer können in unterschiedlichen Betriebsmodi betrieben werden. Diese sind:&lt;br /&gt;
* Normaler Modus&lt;br /&gt;
* CTC Modus&lt;br /&gt;
* PWM&lt;br /&gt;
&lt;br /&gt;
==== Normaler Modus (Normal Mode) ====&lt;br /&gt;
Der einfachste Betriebsmodus ist der normale Modus. Er funktioniert wie im Abschnitt  &amp;quot;[[Avr#Allgemeine Funktionsweise|Allgemeine Funktionsweise]]&amp;quot; beschrieben. Die Zählrichtung des Timers ist immer aufsteigend, und irgendwann kommt es zu dem Interrupt Timer-Overflow (welcher in einer passend ISR aufgefangen werden kann). Im einfachsten Fall kann man diesen Modus in folgendem Diagramm darstellen:&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_1.png]]&lt;br /&gt;
&lt;br /&gt;
Der Zähler des Timers (im Diagramm oben, die aufsteigende und dann wieder zurückgesetzte Linie) ist in dem Register TCNTx gespeichert, wobei x für eine Zahl steht. Soll z.B. auf den Timer0 (siehe Datenblatt des jeweiligen Controllers) des Controllers zugegriffen werden, so ist an TCNT eine 0 anzuhängen, also TCNT0.&lt;br /&gt;
Wie lange es braucht, bis der Zähler einen Overflow auslöst, ist von der Taktfrequenz des Controllers, dem eingestellten Prescaler-Wert und von der Timerauflösung abhängig. Nun wäre es ja sehr unpraktisch, wenn wir den Zähler nicht anpassen könnten. Denn sonst müssten wir unsere Software die den Timer benutzt evtl. anpassen und viel rechnen um z.B. für 1000 ms zu schlafen. Deswegen kann auf den Zähler zugreifen und ihn vorladen bevor dieser wieder vom eigentlichen Timer hochgezählt wird. Dies veranschaulicht folgendes Diagramm:&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_1_Vorladen.png]]&lt;br /&gt;
&lt;br /&gt;
Dadurch kann man den Timer beeinflussen, und beeinflussen wie lange es dauert, bis ein Overflow auftritt. Um zu berechnen, welchen Wert wir vorladen müssen, kann man auch ein Java-Applet nutzen, siehe unter [[Avr#Weblinks|Weblinks Java Applet]].&lt;br /&gt;
&lt;br /&gt;
Natürlich kann man das auch &amp;quot;von Hand&amp;quot; rechnen. Die Berechnung des Preloader- sowie Prescalerwerts bei Verwendung der Overflow-Interrupts, eines Prescalers von 64 (nicht alle Prescaler können verwendet werden) und eines Quarzes mit der Frequenz von 8 MHz sieht folgendermaßen aus (gesuchte Frequenz beträgt 1000 Hz unter der Verwendung des Timer0 eines ATmega32):&lt;br /&gt;
# &amp;lt;math&amp;gt;Prescale = Frequenz * 1000000 [Hz] = 8000000&amp;lt;/math&amp;gt;&lt;br /&gt;
# Wir definieren den maximalen Zählerwert. Dieser ist bei einem 8-Bit Timer 256, bei einem 16-Bit Timer 65536. In unserem Fall ist der maximale Zählerwert 256, weil Timer0 verwendet wird.&lt;br /&gt;
# Nun wird die Variable ''Prescale'' (s.o.) durch den verwendeten Prescaler (64) geteilt (&amp;lt;math&amp;gt;8000000 Hz / 64 = 125000&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Als nächstes wird der im dritten Punkt errechnete Wert durch die gesuchte Frequenz geteilt &amp;lt;math&amp;gt;=125000 / 1000Hz = 125&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Nun wird mathematisch überprüft, ob der errechnete Wert aus dem vierten Punkt kleiner als der maximale Zählerwert ist. Trifft dies zu, so subtrahiert man den errechneten Wert vom maximalen Zählerwert (&amp;lt;math&amp;gt;= 256 - 125 = 131&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Damit haben wir den Wert errechnet, der bei jedem Interrupt, den der Timer0 auslöst, in TCNTx (in diesem Fall TCNT0) nachgeladen werden muss, damit die Interrupts in dem gewünschten Zeitabstand von einer Millisekunde ausgelöst werden.&lt;br /&gt;
&lt;br /&gt;
Allerdings bleibt zu bemerken, dass bei der Verwendung einer &amp;quot;ungeraden&amp;quot; Quarzfrequenz (z.B. 7,3728 MHz) der Timer mit einer bestimmten Ungenauigkeit arbeitet. Würden wir z.B. den Quarz oben mit einem Quarz mit 7,3728 MHz austauschen, so wäre die Fehlerrate 0,17%. Diese Ungeauigkeit varriert von verwendetem Prescaler zu Prescaler. D.h. wenn wir einen Prescaler von 1024 (und einer Quarzfrequenz von 8 MHz) verwendet hätten, so hätten wir eine inakzeptable Ungeauigkeit von 11,61%. Deswegen sollte sie eines der genannten Programme unter [[Avr#Weblinks]] verwenden, denn diese zeigen nur die bestmögliche Konfiguration an.&lt;br /&gt;
&lt;br /&gt;
Die Fehlerrate kann natürlich auch ausgerechnet werden. Hier die Rechenschritte (sie sind erweiternd zu der oberen Berechnung):&lt;br /&gt;
# Als erstes wird mathematisch überprüft, ob der Preloaderwert (siehe fünften Schritt oben) größer als 1 ist.&lt;br /&gt;
# Trifft dies zu, so wird als nächstes die resultierende Frequenz errechnet. Die geschieht folgendermaßen: Der errechnete Preloaderwert aus der Rechnung oben wird vom maximalen Zählerwert subtrahiert, anschließend mit dem Prescaler multipliziert und dann das Ganze durch die Variable Prescale geteilt &lt;br /&gt;
&amp;lt;math&amp;gt;(256 - 131) \cdot 64 / 8\,000\,000 \mathrm{Hz} \cdot 1\,000\,000 = 1000&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Nun wird die gesuchte Frequenz vom errechneten Wert aus dem dritten Punkt subtrahiert und dann wiederum durch diese geteilt &amp;lt;math&amp;gt;(1000-1000) / 1000 = 0&amp;lt;/math&amp;gt;. Damit läuft dieser Timer genau mit einer Fehlerrate von 0 %.&lt;br /&gt;
&lt;br /&gt;
Betreibt man den Timer im Overflow-Modus, so muss man, wie bereits erwähnt, nach/bei jedem Overflow-Interrupt den Timer nachladen. Der Interrupt heißt in diesem Fall SIG_OVERFLOWx (x steht für die Nummer des Timers). Dieser muss in einer ISR abgefangen werden.&lt;br /&gt;
&lt;br /&gt;
Zusammenfassend ein Beispielprogramm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* Es wird der Timer2 (8-Bit) eines ATmega32 verwendet, der mit einem Quarz mit 7,3728 MHz&lt;br /&gt;
betrieben wird. Im Abstand von 0,001 ms erzeugt der Timer einen Interrupt, also eine&lt;br /&gt;
Frequenz von 1000000 Hz (oder 100 kHz). Der Timer wird auf einen Prescaler von 1 und&lt;br /&gt;
einem Preloader von  183 konfiguriert.*/&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t countTimer2;	// Speichert den aktuellen Zählerwert&lt;br /&gt;
&lt;br /&gt;
// ISR zum auffangen der Interrupts:&lt;br /&gt;
SIGNAL(SIG_SIG_OVERFLOW2)&lt;br /&gt;
{&lt;br /&gt;
	countTimer2++;&lt;br /&gt;
	TCNT2 = 183;		// Nachladen&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Initialisierung:&lt;br /&gt;
TCCR2 = (1&amp;lt;&amp;lt;CS22);		// Prescaler von 1&lt;br /&gt;
TCNT2  = 183;			// Vorladen&lt;br /&gt;
TIMSK |= (1&amp;lt;&amp;lt;TOIE2);		// Interrupts aktivieren und damit Timer starten&lt;br /&gt;
sei();&lt;br /&gt;
&lt;br /&gt;
// Funktionen zum benutzen der Timer:&lt;br /&gt;
/** Diese Funktion nicht aufrufen. Wird von sleep_millisec aufgerufen.&lt;br /&gt;
Bei t=100 schläft die Funktion 1 ms. */&lt;br /&gt;
inline void sleep (uint8_t t)&lt;br /&gt;
{&lt;br /&gt;
	// countTimer2 wird in der ISR oben inkrementiert&lt;br /&gt;
	countTimer2 = 0;&lt;br /&gt;
	while (countTimer2 &amp;lt; t);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** Schläft x-Millisekunden. */&lt;br /&gt;
inline void sleep_millisec(uint16_t msec)&lt;br /&gt;
{&lt;br /&gt;
	uint16_t i;&lt;br /&gt;
	for(i=0; i&amp;lt;msec; i++) {&lt;br /&gt;
		sleep(100);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Allerdings wird auf diese leicht veraltete Technik nun nicht weiter eingegangen. Der Artikel wendet sich nun dem neueren &amp;quot;Compare Output&amp;quot;-Betriebsmodus zu.&lt;br /&gt;
&lt;br /&gt;
Beim &amp;quot;Compare Output&amp;quot;-Betriebsmodus wird genauso ein Zähler hochgezählt. Allerdings wird der Zählerwert nach jeder Inkrementierung mit einem vom Benutzer festgelegten Wert verglichen. Entspricht der Zählerwert dem gespeicherten Wert, so kommt es zu einem Interrupt. Dieser Wert wird in das Register OCRx (x steht wieder für die Timernummer) gespeichert. Je nach Auflösung des Timers ist dieses Register 8-Bit oder 16-Bit breit. &lt;br /&gt;
&lt;br /&gt;
Hinweis: Siehe CTC Modus unten. Dieser wird benötigt um den Timer entsprechend im &amp;quot;Compare Output&amp;quot;-Betriebsmodus vernünftig zu betreiben.&lt;br /&gt;
&lt;br /&gt;
Hier ein typisches Diagramm dieses Betriebsmodus (Hinweis: Das Diagramm wurde unter Verwendung des CTC Modus erstellt. Für Begriffserklärung siehe CTC Modus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_CompareMatch.png]]&lt;br /&gt;
&lt;br /&gt;
Das Ausrechnen des Werts, der in OCRx geschrieben werden muss, damit Frequenz x entsteht, ist nicht sonderlich schwer. Man geht wie bei der Berechnung des Werts für den Overflow-Modus vor (s.o.) nur daß man das resultierende Ergebnis vom maximalen Zählerwert (bei 8-Bit Auflösung ist dieser 256, bei 16-Bit Auflösung 65536) subtrahiert. Das Ergebnis wird dann einmalig in das Register OCRx geschrieben. Mann muss also nicht wie beim Overflow-Modus den Timer nach jedem Interrupt nachladen. Der enstehende Interrupt heißt in diesem Fall SIG_OUTPUT_COMPAREx (x steht für die Nummer des Timers). Dieser muss in einer ISR abgefangen werden.&lt;br /&gt;
&lt;br /&gt;
Wiederum zusammenfassend ein Beispielprogramm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* Es wird der Timer2 (8-Bit) eines ATmega32 verwendet, der mit einem Quarz mit 7,3728 MHz&lt;br /&gt;
betrieben wird. Im Abstand von 0,001 ms erzeugt der Timer einen Interrupt, also eine Frequenz&lt;br /&gt;
von 1000000 Hz (oder 100 kHz). Der Timer wird auf einen Prescaler von 1 und einem OCR2-Wert&lt;br /&gt;
von 73 konfiguriert.*/&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t countTimer2;	// Speichert den aktuellen Zählerwert&lt;br /&gt;
&lt;br /&gt;
// ISR zum auffangen der Interrupts:&lt;br /&gt;
SIGNAL(SIG_OUTPUT_COMPARE2)&lt;br /&gt;
{&lt;br /&gt;
  countTimer2++;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Initialisierung:&lt;br /&gt;
TCCR2 = (1&amp;lt;&amp;lt;CS22) | (1&amp;lt;&amp;lt;WGM21);	// Prescaler von 1 | CTC-Modus (siehe unten für Beschreibung)&lt;br /&gt;
OCR2  = 73;			// Vergleichswert&lt;br /&gt;
TIMSK |= (1&amp;lt;&amp;lt;OCIE2);		// Interrupts aktivieren und damit Timer starten&lt;br /&gt;
sei();&lt;br /&gt;
&lt;br /&gt;
// Funktionen zum benutzen der Timer:&lt;br /&gt;
/** Diese Funktion nicht aufrufen. Wird von sleep_millisec aufgerufen.&lt;br /&gt;
Bei t=100 schläft die Funktion 1 ms. */&lt;br /&gt;
inline void sleep(uint8_t t)&lt;br /&gt;
{&lt;br /&gt;
	// countTimer2 wird in der ISR oben inkrementiert&lt;br /&gt;
	countTimer2 = 0;&lt;br /&gt;
	while (countTimer2 &amp;lt; t);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** Schläft x-Millisekunden. */&lt;br /&gt;
inline void sleep_millisec(uint16_t msec)&lt;br /&gt;
{&lt;br /&gt;
	uint16_t i;&lt;br /&gt;
	for(i=0; i&amp;lt;msec; i++) {&lt;br /&gt;
		sleep(100);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== CTC Modus (Clear Timer on Compare Match mode) ====&lt;br /&gt;
Der CTC Modus ist eine Erweiterung des &amp;quot;Compare Output&amp;quot;-Betriebsmodus. Der CTC Modus wird z.B. für das obere Beispielprogramm benötigt. Wird der Timer nämlich im normalen Betriebsmodus betrieben, so ist seine Zählergrenze je nach Auflösung 255 oder entsprechend für die 16-Bit Timer. Erst wenn diese Grenze erreicht wurde, wird der Timer zurückgesetzt (also auf 0). Durch den CTC Modus wird der Timer augenblicklich automatisch nachdem ein &amp;quot;Compare Output&amp;quot;-Interrupt auftrat zurückgesetzt. Man kann also die maximalen Zählergrenze selber definieren.&lt;br /&gt;
Dieses Diagramm veranschaulicht den CTC Modus. Nach dem Interrupt wird der Timer sofort wieder zurückgesetzt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_CompareMatch.png]]&lt;br /&gt;
&lt;br /&gt;
==== PWM ====&lt;br /&gt;
Für PWM siehe [[Pwm]].&lt;br /&gt;
&lt;br /&gt;
=== Registerübersicht ===&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' Diese Registertabelle wurde für den aktuellen [[Atmel Controller Mega16 und Mega32]] erstellt. Wenn Sie ein anderes Modell verwenden kann es sein, dass ein oder mehrere Register nicht existieren, oder sie eine andere Bezeichnung haben.&lt;br /&gt;
&lt;br /&gt;
{| {{Blaueschmaltabelle}} width=100%&lt;br /&gt;
 |'''TIMSK'''&lt;br /&gt;
 |-&lt;br /&gt;
 |Mit diesem Register, der von allen Timern verwendet wird, lässt sich die Interruptausführung und Art des jeweiligen Timers bestimmen.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Registertabelle8Bit|OCIE2|TOIE2|TICIE1|OCIE1A|OCIE1B|TOIE1|OCIE0|TOIE0}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
*'''OCIE2 (Timer/Counter2 Output Compare Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter2 Compare Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TOIE2 (Timer/Counter2 Overflow Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter2 Overflow Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TICIE1 (Timer/Counter1, Input Capture Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Input Capture Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''OCIE1A (Timer/Counter1 Output Compare A Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Output Compare A Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''OCIE1B (Timer/Counter1 Output Compare B Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Output Compare B Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TOIE1 (Timer/Counter1 Overflow Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Overflow Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''OCIE0 (Timer/Counter0 Output Compare Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, so wird der Timer/Counter0 Compare Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TOIE0 (Timer/Counter0 Overflow Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, so wird der Timer/Counter0 Overflow Interrupt aktiviert  (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Analog-Digital-Wandler ==&lt;br /&gt;
Mit einem Analog-Digital-Wandler (ADC, für Analog Digital Converter) ist es mit den AVRs möglich, auf einfache Art und Weise analoge Größe in digitale Werte umzuwandeln. Dies bietet sich z.B. an, wenn man die Batteriespannung eines Roboters bestimmen möchte.&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine Informationen ===&lt;br /&gt;
Für allgemeine Informationen zu ADCs: siehe [[ADC]].&lt;br /&gt;
&lt;br /&gt;
=== Kanäle ===&lt;br /&gt;
Ein AVR hat normalerweise nur einen ADC integriert. Öfters muss man aber mehrere analoge Größen von verschiedenen Quellen wandeln, deswegen besitzen die AVRs Kanäle (ein ATmega32 z.B. besitzt acht Kanäle auf Port A). Diese Kanäle werden dann mithilfe eines Multiplexer auf den ADC geschalten werden, der dann die anliegenden analoge Spannung in einen digitalten Wert wandelt.&lt;br /&gt;
&lt;br /&gt;
=== Betriebsmodi ===&lt;br /&gt;
Der ADC bietet verschiedene Betriebsmodi. Diese wären:&lt;br /&gt;
* Single Conversation: Der ADC wandelt eine analoge Größe um und gibt diese zurück.&lt;br /&gt;
* Free Running: Der ADC wandelt wie in einer Endlosschleife ständig die anliegenden analogen Größen in digitale Werte um und gibt diese zurück.&lt;br /&gt;
&lt;br /&gt;
=== Teilungsfaktor ===&lt;br /&gt;
Zum Wandeln benötigt der ADC einen eigenen Takt, der auf der Taktfrequenz des Mikrocontrollers basiert. Allerdings ist die Taktfrequenz des Mikrocontrollers zu schnell und deswegen wird diese durch den Vorteiler verkleinert. Der resultierende Takt muss zwischen 50kHz und 200kHz liegen. Folgende Teilungsfaktoren sind verfügbar:&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''Teilungsfaktoren'''&lt;br /&gt;
 |2&lt;br /&gt;
 |4&lt;br /&gt;
 |8&lt;br /&gt;
 |16&lt;br /&gt;
 |32&lt;br /&gt;
 |64&lt;br /&gt;
 |128&lt;br /&gt;
 |}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Um zu bestimmen welcher Teilungsfaktor geeignet ist, kann man folgende Formel verwenden.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Tacktfrequenz = 8 MHz&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Teilungsfaktor_{min} = {Tacktfrequenz \over {200 kHz}} = {{8000000 Hz} \over {200000 Hz}} = 40&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Teilungsfaktor_{max} = {Tacktfrequenz \over {50 kHz}} = {{8000000 Hz} \over {50000 Hz}} = 160&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Deswegen kann man nun zwischen einem der folgenden Teilungsfaktor wählen: 64 und 128. Im Interesse der Geschwindigkeit sollte 64 gewählt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Siehe bitte die Registerübersicht weiter unten. Dort wird gezeigt, welches Register entsprechend eingestellt werden muss, damit man einen der oben aufgelisteten Teilungsfaktoren auswählen kann.&lt;br /&gt;
&lt;br /&gt;
=== Referenzspannung ===&lt;br /&gt;
Das Ergebnis der Wandlung des ADC bezieht sich auf eine bestimmt Referenzspannung. Diese Referenzspannung lässt sich bestimmen. Je nach gewählter Referenzspannung darf man nur eine zu messende Spannung an den Port anlegen, die nicht höher liegt als die Referenzspannung. Sonst würde dieser zerstört werden. Die Referenzspannung ist also gleich der maximal zu messenden Spannung. Um einzustellen welche Referenzspannung verwendet werden soll, gibt es den Register ADMUX. Folgende Quellen sind als Referenzspannung möglich:&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''Referenzspannungsquelle'''&lt;br /&gt;
 |AREF, internes Vref deaktiviert&lt;br /&gt;
 |AVCC mit externen Kondensator am AREF Pin&lt;br /&gt;
 |Keine Funktion, reserviert&lt;br /&gt;
 |Interne 2,56V Spannungsreferenz mit externen Kondensator am AREF Pin&lt;br /&gt;
 |}&lt;br /&gt;
Siehe bitte die Registerübersicht. Dort steht genauer wie man den Register einzustellen hat.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Man benötigt die Referenzspannung auch (oder besserer deren analoge Größe) um den Wert den der ADC zurückgibt in V umzurechnen. Um den zurückgegebenen Wert des ADC umzuwandel geht man so vor:&amp;lt;br&amp;gt;&lt;br /&gt;
# Bestimmen der Auflösung des ADC. Bei den ATMegas normalerweiße 10 Bit. 10 Bit entsprechen einer Stufung von 1024.&lt;br /&gt;
# Ermitteln des digitalen Werts der analogen Größe. In der Beispielrechnung verwende ich den Wert 592.&lt;br /&gt;
# Größe der Referenzspannung. In der Beispielrechnung wird 5V verwendet.&lt;br /&gt;
Mit diesen Werten kann folgende Berechnung ausführen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;V = 592 * 5V&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;V = 2960 / 1024 = \underline {\underline { 2{,}9V }}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Programmbeispiele ===&lt;br /&gt;
'''C/C++'''&amp;lt;br&amp;gt;&lt;br /&gt;
Dieses Beispiel ist für die [[Atmel Controller Mega16 und Mega32]] gedacht, die mit einer Taktfrequenz von 8 MHz laufen. Es ist unbedingt darauf zu achten nicht die Referenzspannung von 2,56V zu überschreiten! Sonst stirbt der Port. Je nach Einsatzart muss man das Beispielprogramm entsprechend abändern (also diese Zeile mit ADMUX |= (1&amp;lt;&amp;lt;REFS1) | (1&amp;lt;&amp;lt;REFS0);).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;inttypes.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
uint16_t readADC(uint8_t channel) {&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
	uint16_t result = 0;&lt;br /&gt;
	&lt;br /&gt;
	// Den ADC aktivieren und Teilungsfaktor auf 64 stellen&lt;br /&gt;
	ADCSRA = (1&amp;lt;&amp;lt;ADEN) | (1&amp;lt;&amp;lt;ADPS2) | (1&amp;lt;&amp;lt;ADPS1);&lt;br /&gt;
&lt;br /&gt;
	// Kanal des Multiplexers waehlen&lt;br /&gt;
	ADMUX = channel;&lt;br /&gt;
	// Interne Referenzspannung verwenden (also 2,56 V)&lt;br /&gt;
	ADMUX |= (1&amp;lt;&amp;lt;REFS1) | (1&amp;lt;&amp;lt;REFS0);&lt;br /&gt;
	&lt;br /&gt;
	// Den ADC initialisieren und einen sog. Dummyreadout machen&lt;br /&gt;
	ADCSRA |= (1&amp;lt;&amp;lt;ADSC);&lt;br /&gt;
	while(ADCSRA &amp;amp; (1&amp;lt;&amp;lt;ADSC));&lt;br /&gt;
	&lt;br /&gt;
	// Jetzt 3x die analoge Spannung and Kanal channel auslesen&lt;br /&gt;
	// und dann Durchschnittswert ausrechnen.&lt;br /&gt;
	for(i=0; i&amp;lt;3; i++) {&lt;br /&gt;
		// Eine Wandlung&lt;br /&gt;
		ADCSRA |= (1&amp;lt;&amp;lt;ADSC);&lt;br /&gt;
		// Auf Ergebnis warten...&lt;br /&gt;
		while(ADCSRA &amp;amp; (1&amp;lt;&amp;lt;ADSC));&lt;br /&gt;
		&lt;br /&gt;
		result += ADCW;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// ADC wieder deaktivieren&lt;br /&gt;
	ADCSRA &amp;amp;= ~(1&amp;lt;&amp;lt;ADEN);&lt;br /&gt;
	&lt;br /&gt;
	result /= 3;&lt;br /&gt;
	&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
	uint16_t result = readADC(0);	//Auslesen der analogen Spannungen an Pin 0,&lt;br /&gt;
					// also ADC0. In result steht das Ergebnis.&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bascom'''&amp;lt;br&amp;gt;&lt;br /&gt;
Dieses Programmbeispiel ist für die [[Atmel Controller Mega16 und Mega32]] gedacht. Es gibt nacheinander die Spannungen der einzelnen Kanäle (ADC0..7) aus. Dazwischen macht es immer 800 ms pause.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
' Die gemessene Spannung wird in der Variablen W gespeichert.&lt;br /&gt;
' Channel ist der Pin, an dem die Spannung gemessen werden soll.&lt;br /&gt;
&lt;br /&gt;
$baud = 9600&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
$regfile &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
Config Adc = Single , Prescaler = Auto&lt;br /&gt;
Start Adc&lt;br /&gt;
Dim W As Word , Channel As Byte&lt;br /&gt;
Channel = 0&lt;br /&gt;
Do&lt;br /&gt;
  W = Getadc(channel)&lt;br /&gt;
  Print &amp;quot;ADC-Pin &amp;quot; ; Channel ; &amp;quot;: Wert &amp;quot; ; W&lt;br /&gt;
  Incr Channel&lt;br /&gt;
  If Channel &amp;gt; 7 Then Channel = 0&lt;br /&gt;
  Waitms 800&lt;br /&gt;
Loop&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Registerübersicht ===&lt;br /&gt;
'''Hinweis:''' Diese Registertabelle wurde für den aktuellen [[Atmel Controller Mega16 und Mega32]] erstellt. Wenn Sie ein anderes Modell verwenden kann es sein, dass ein oder mehrere Register nicht existieren, oder sie eine andere Bezeichnung haben.&lt;br /&gt;
&lt;br /&gt;
{| {{Blaueschmaltabelle}} width=100%&lt;br /&gt;
 |'''ADCSRA (ADC Control and Status Register A)'''&lt;br /&gt;
 |-&lt;br /&gt;
 |Dieser Register dient dazu den ADC zu kontrollieren.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Registertabelle8Bit|ADEN|ADSC|ADATE|ADIF|ADIE|ADPS2|ADPS1|ADPS0}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
*'''ADEN (ADC Enable)'''&amp;lt;br/&amp;gt;Wird dieses Bit gesetzt (also 1), dann wird der ADC aktiviert. Schreibt man eine 0 wird der ADC deaktiert. Wird der ADC während einer Wandlung deaktiviert, wird die Wandlung abgebrochen.&lt;br /&gt;
*'''ADSC (ADC Start Conversion)'''&amp;lt;br/&amp;gt;Dieses Bit startet den Messvorgang, je nachdem in welchem Betriebsmodi der ADC läuft. Wird dieses Bit nach der Aktivierung des ADC über '''ADEN''' zum ersten Mal gesetzt, wird der ADC erst eine Initialisierungswandlung durchführen und danach erst die eigentliche Wandlung. Das Schreiben einer 0 auf das Bit hat keinen Effekt.&lt;br /&gt;
*'''ADATE (ADC Auto Trigger Enable)'''&amp;lt;br/&amp;gt;Wird dieses Bit gesetzt, wird das Auto Triggering des ADC aktiviert.&lt;br /&gt;
*'''ADIF (ADC Interrupt Flag)'''&amp;lt;br/&amp;gt;Dieses Bit wird auf 1 gesetzt, wenn eine Wandlung erfolgte und das Ergebnis nun verfügbar ist. Der ADC Complete Interrupt wird ausgelöst, wenn das '''ADIE'''-Bit gesetzt ist und die Interrupts global aktiviert sind. Das Bit wird gelöscht, wenn die entsprechende ISR abgearbeitet wird. Alternativ kann man es löschen, indem man eine 1 auf das Bit schreibt.&lt;br /&gt;
*'''ADIE (ADC Interrupt Enable)'''&amp;lt;br/&amp;gt;Wird dieses Bit gesetzt und die globalen Interrupts sind aktiviert, wird der ADC Complete Interrupt aktiviert, auf den man dann in der entsprechenden ISR reagieren kann.&lt;br /&gt;
*'''ADPS2 (ADC Prescaler Select Bit 2)'''&amp;lt;br/&amp;gt;Diese Bits bestimmen den Teilungsfaktor zwischen der XTAL-Frequenz (also der Taktfrequenz) und dem Eingangstakt des ADC. Zum Wandeln benötigt der ADC einen eigenen Takt, der auf der Taktfrequenz des Mikrocontrollers basiert. Allerdings ist die Taktfrequenz zu schnell und deswegen wird diese durch den Vorteiler verkleinert. Der resultierende Takt muss zwischen 50kHz und 200kHz liegen. Siehe [[Avr#Teilungsfaktor]]. Folgende Teilungsfaktoren sind verfügbar:&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''ADPS2'''&lt;br /&gt;
 |'''ADPS1'''&lt;br /&gt;
 |'''ADPS0'''&lt;br /&gt;
 |'''Teilungsfaktor'''&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |2&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |2&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |4&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |8&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |16&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |32&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |64&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |128&lt;br /&gt;
 |}&lt;br /&gt;
*'''ADPS1 (ADC Prescaler Select Bit 1)'''&amp;lt;br/&amp;gt;Siehe '''ADPS2''' für eine Beschreibung.&lt;br /&gt;
*'''ADPS0 (ADC Prescaler Select Bit 0)'''&amp;lt;br/&amp;gt;Siehe '''ADPS2''' für eine Beschreibung.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| {{Blaueschmaltabelle}} width=100%&lt;br /&gt;
 |'''ADMUX (ADC Multiplexer Selection Register)'''&lt;br /&gt;
 |-&lt;br /&gt;
 |Mit diesem Register wird der Multiplexer gesteuert.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Registertabelle8Bit|REFS1|REFS0|ADLAR|MUX4|MUX3|MUX2|MUX1|MUX0}}&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
*'''REFS1 (Reference Selection Bit 1)'''&amp;lt;br/&amp;gt;Mit diesem Bit kann steuern, welche Referenzspannung der ADC verwenden soll. Die möglichen Quellen sind unten aufgelistet. Wird während einer Wandlung die Quelle für die Referenzspannung geändert, wird die aktuelle Wandlung mit der &amp;quot;alten&amp;quot; Quellen zuerste beendet, bevor die neue Einstellung übernommen wird.&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''REFS1'''&lt;br /&gt;
 |'''REFS0'''&lt;br /&gt;
 |'''Referenzspannungsquelle'''&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |AREF, internes Vref deaktiviert&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |AVCC mit externen Kondensator am AREF Pin&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |Keine Funktion, reserviert&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |Interne 2,56V Spannungsreferenz mit externen Kondensator am AREF Pin&lt;br /&gt;
 |}&lt;br /&gt;
*'''REFS0 (ADC Start Conversion)'''&amp;lt;br/&amp;gt;Siehe '''REFS1'''.&lt;br /&gt;
*'''ADLAR (ADC Left Adjust Result)'''&amp;lt;br/&amp;gt;Dieses Bit beeinflusst, wie der ermittelte Messwert im ADC Data Register abgelegt wird.&lt;br /&gt;
*'''MUX4 (Analog Channel and Gain Selection Bit 4)'''&amp;lt;br/&amp;gt;Dieses Bit wird auf 1 gesetzt, wenn eine Wandlung erfolgte und das Ergebnis nun verfügbar ist. Der ADC Complete Interrupt wird ausgelöst, wenn das '''ADIE'''-Bit gesetzt ist und die Interrupts global aktiviert sind. Das Bit wird gelöscht, wenn die entsprechende ISR abgearbeitet wird. Alternativ kann man es löschen, indem man eine 1 auf das Bit schreibt.&lt;br /&gt;
*'''MUX3 (Analog Channel and Gain Selection Bit 3)'''&amp;lt;br/&amp;gt;Mit diesen Bits ('''MUX3''' bis '''MUX0''') wird der Kanal des Multiplexers eingestellt, der mit dem ADC verbunden ist.&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''MUX4..0'''&lt;br /&gt;
 |'''Pin'''&lt;br /&gt;
|-&lt;br /&gt;
 |00000&lt;br /&gt;
 |ADC0&lt;br /&gt;
|-&lt;br /&gt;
 |00001&lt;br /&gt;
 |ADC1&lt;br /&gt;
|-&lt;br /&gt;
 |00010&lt;br /&gt;
 |ADC2&lt;br /&gt;
|-&lt;br /&gt;
 |00011&lt;br /&gt;
 |ADC3&lt;br /&gt;
|-&lt;br /&gt;
 |00100&lt;br /&gt;
 |ADC4&lt;br /&gt;
|-&lt;br /&gt;
 |00101&lt;br /&gt;
 |ADC5&lt;br /&gt;
|-&lt;br /&gt;
 |00110&lt;br /&gt;
 |ADC6&lt;br /&gt;
|-&lt;br /&gt;
 |00111&lt;br /&gt;
 |ADC7&lt;br /&gt;
 |}&lt;br /&gt;
Es reicht also einfach die Pinnummer in ADMUX zu schreiben.&lt;br /&gt;
*'''MUX2 (Analog Channel and Gain Selection Bit 2)'''&amp;lt;br/&amp;gt;Siehe '''MUX3''' für eine Beschreibung.&lt;br /&gt;
*'''MUX1 (Analog Channel and Gain Selection Bit 1)'''&amp;lt;br/&amp;gt;Siehe '''MUX3''' für eine Beschreibung.&lt;br /&gt;
*'''MUX0 (Analog Channel and Gain Selection Bit 0)'''&amp;lt;br/&amp;gt;Siehe '''MUX3''' für eine Beschreibung.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Des Weiteren gibt es noch den Register '''ADCL/ADCH''' in dem das Ergebnis einer Wandlung steht. Man liest den Wert folgendermaßen aus:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uint16_t x = ADCL;&lt;br /&gt;
x += (ADCH&amp;lt;&amp;lt;8);&lt;br /&gt;
// oder&lt;br /&gt;
x = ADCW;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Die Fusebits==&lt;br /&gt;
Fusebits nennt man bestimmte Bits zur Konfigurierung eines AVR-Controllers. Bei der Auslieferung neuer AVR Controller sind die Fusebits bereits vorkonfiguriert. In vielen Fällen kann man die Konfiguration unverändert belassen, je nach Controllertyp. Bei den Typen Mega xxx bestimmen einige Fusebits beispielsweise, dass der interne Taktgeber aktiviert ist. Möchte man dagegen einen externen Quarz anschließen oder die Taktfrequenz ändern, so müssen auch die Fusebits geändert werden. Auch das Deaktivieren des &amp;quot;[[On Chip Debugging]]&amp;quot; Modus ist oft notwendig, wenn man alle Ports ausnutzen möchte. &lt;br /&gt;
&lt;br /&gt;
Die Fusebits werden in der Regel über die Software eingestellt, welche auch für das Übertragen des Programmcodes zuständig ist. Besonders einfach geht dies beispielsweise mit der Entwicklungsumgebung [[Bascom]]. Aber auch andere Programme wie [[PonyProg]] können für die Umstellung der Fusebits genutzt werden. Einmal eingestellte Fusebits bleiben bis zur erneuten Fusebit-Änderung erhalten. Der normale Programmiermodus verändert die Fusebits nicht. &lt;br /&gt;
&lt;br /&gt;
Je nach AVR Controllertyp sind unterschiedliche Fusebits (Einstellungen) vorhanden. Die genaue Beschreibung findet man im jeweiligen Datenblatt. Da aber falsch gesetzte Fusebit-Einstellungen zu den häufigsten Problemen gehören, liste ich hier die Funktion der üblichen Fusebits nochmals genauer auf:&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''CKSEL0, CKSEL1, CKSEL2, CKSEL3'''&lt;br /&gt;
 |Die Kombination dieser 4 Fusebits bestimmt die Taktquelle des Controllers. Das kann eine interner Taktgenerator, ein Quarz, Quarzoszillator, RC-Glied und ähnliches sein.&lt;br /&gt;
|-&lt;br /&gt;
 |'''JTAGEN'''&lt;br /&gt;
 |Hiermit wird die &amp;quot;[[On Chip Debugging]]&amp;quot; Schnittstelle aktiviert bzw. deaktiviert. Das sind die Bits mit den Bezeichnungen TDI, TDO, TMS und TCK. Möchte man diese Pins als normalen Port nutzen, so muss diese Schnittstelle immer deaktiviert werden. &lt;br /&gt;
|-&lt;br /&gt;
 |'''SUT0, SUT1'''&lt;br /&gt;
 |Die sogenannte StartUp-Zeit (PowerOn delay). Diese Einstellung muss abhängig von der Art des Taktgenerators eingestellt werden, genaueres im jeweiligen Datenblatt. &lt;br /&gt;
|-&lt;br /&gt;
 |'''SPIEN'''&lt;br /&gt;
 |Hiermit kann die serielle [[AVR-ISP Programmierkabel|ISP-Programmierung]], welche die meisten Programmierkabel nutzen, deaktiviert werden. Dies sollte man lieber vermeiden, denn wenn dieser Programmiermodus deaktiviert wurde, kann nur noch der Parallel-Programmiermodus genutzt werden. Der Parallel-Programmiermodus benötigt jedoch ein spezielles Programmiergerät, das die wenigsten Bastler besitzen. ''Also Vorsicht!''&lt;br /&gt;
|-&lt;br /&gt;
 |'''BODEN'''&lt;br /&gt;
 |Über dieses Bit wird der '''Brown-out Detector''' aktiviert bzw. deaktiviert. Dies ist eine Überwachung der Betriebsspannung. Diese Überwachung soll dafür sorgen, dass bei Spannungseinbrüchen ein ordentlicher RESET durchgeführt wird. Dadurch wird verhindert, dass ein Controller in einen undefinierten Zustand gerät (hängen bleibt).&lt;br /&gt;
|-&lt;br /&gt;
 |'''BOOTLEVEL'''&lt;br /&gt;
 |Über dieses  Bit kann die Spannung festgelegt werden, ab welcher der '''Brown-out Detector''' den Controller neu startet (also RESET ausführt). &lt;br /&gt;
|-&lt;br /&gt;
 |'''BOOTRST'''&lt;br /&gt;
 |Gewöhnlich startet ein Programm im Controller nach einem RESET ab Adresse 0. Durch dieses Fusebit kann der Controller jedoch veranlasst werden, nach einem Reset einen sogenannten Bootloader-Bereich auszuführen. Ein [[Bootloader]] kann genutzt werden, um Controller über andere Schnittstellen (z.B. RS232) zu programmieren.&lt;br /&gt;
|-&lt;br /&gt;
 |'''BOOTSZ0, BOOTSZ1'''&lt;br /&gt;
 |Der zuvor genannte Bootloaderbereich kann bei AVR-Controllern verschieden groß sein. Über diese beiden Bits können vier verschiedene Größen eingestellt werden. Siehe unter [[Bootloader]].&lt;br /&gt;
|-&lt;br /&gt;
 |'''EESAVE'''&lt;br /&gt;
 |Dieses Bit legt fest, ob beim Programmieren des Controllers (man nennt es auch brennen) immer das EEPROM gelöscht werden soll.&lt;br /&gt;
|-&lt;br /&gt;
 |'''CKOPT'''&lt;br /&gt;
 |Abhängig von den Einstellungen von CKSEL kann hier dir Oszillator-Verstärkung eingestellt werden. Genaueres im Datenblatt des jeweiligen Controllers.&lt;br /&gt;
|-&lt;br /&gt;
 |'''WDTON'''&lt;br /&gt;
 |Schaltet den WatchDog-Timer beim Booten ein/aus. Dies ist auch per Software möglich&lt;br /&gt;
|-&lt;br /&gt;
 |'''RSTDISBL'''&lt;br /&gt;
 |Durch dieses Bit kann man den RESET-Pin deaktivieren und dann als normalen I/O-Port nutzen. Aber Vorsicht! Da die RESET-Leitung beim Programmieren (Brennen) des Chips genutzt wird, kann man nach dessen Deaktivierung den Controller mit den üblichen [[AVR-ISP Programmierkabel|ISP-Adaptern]] nicht mehr programmieren. In diesem Fall könnte man zwar den Controlle noch mit speziellen Programmiergeräten im Parallelmodus programmieren, aber in der Praxis verfügen nur wenige Bastler über ein Programmiergerät, das dies leistet.&lt;br /&gt;
|-&lt;br /&gt;
 |'''LB1, LB2'''&lt;br /&gt;
 |Das sind die sogenannten Lockbits, mit denen sich das Auslesen des Flash- als auch EEPROM-Speichers verhindern läßt. Zwar können andere Anwender immer noch Daten lesen, allerdings handelt es sich dabei nicht mehr um den wirklichen Inhalt sondern lediglich um wirre Datenbytefolgen. Programmierer, die den erarbeiteten Code vor Raubkopierern schützen wollen, nutzen diese Lockbits. Das Programmieren ist auch bei gesetzen Lockbits noch möglich. Der Bootloader-Bereich wird nicht durch die Lockbits geschützt.&lt;br /&gt;
|-&lt;br /&gt;
 |'''BLB01, BLB02'''&lt;br /&gt;
 |Durch diese Bits kann der Code sogar vor dem Zugriff durch den Bootloader geschützt werden&lt;br /&gt;
|-&lt;br /&gt;
 |'''BLB11, BLB12'''&lt;br /&gt;
 |Diese Bits schützen den Bootloaderbereich selbst&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wie man die Fusebits mit [[Bascom]] einstellt, wird im Beitrag [[Bascom - Erstes Programm in den AVR Controller übertragen]] erläutert.&lt;br /&gt;
&lt;br /&gt;
''Autoren des Artikels: Frank, Luma'' &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Atmel]]&lt;br /&gt;
* [[AVR-Einstieg leicht gemacht]]&lt;br /&gt;
* [[Avr-gcc|avr-gcc]] - Leistungsfähiger AVR-Port des freien Compilers GCC&lt;br /&gt;
* [[WinAVR]] - Ein freies Werkzeugpaket auf Basis avr-gcc für die Windows-Platform, integriert unter anderem das [[Programmer's Notepad]]&lt;br /&gt;
* [[AVR_Assembler_Einf%C3%BChrung|AVR Assembler Einführung (AvrStudio)]]&lt;br /&gt;
* [[AVR-ISP Programmierkabel]] - Bauanleitung für die AVR Controller Programmierkabel&lt;br /&gt;
* [[RN-Control]] - Eines der beliebtestet AVR-Boards im Roboternetz&lt;br /&gt;
* [[RNBFRA-Board]] - Größeres Board mit zwei Atmel Controllern&lt;br /&gt;
* [[Bascom]] - Sehr gutes Basic-Entwicklungssystem&lt;br /&gt;
* [[Bascom - Erstes Programm in den AVR Controller übertragen]]&lt;br /&gt;
* [[On Chip Debugging]]&lt;br /&gt;
* [[Bootloader]]&lt;br /&gt;
* [[Timer]]&lt;br /&gt;
* [[TWI]] - I2C beim AVR&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
* [http://www.atmel.com/dyn/products/param_table.asp?family_id=607&amp;amp;OrderBy=part_no&amp;amp;Direction=ASC Aktuelle AVR Vergleichstabelle]&lt;br /&gt;
* [http://www.atmel.com/dyn/products/devices.asp?family_id=607 Die Datenblätter zu Atmel Controllern]&lt;br /&gt;
* [https://mpg.dnsalias.com/~magerlu/rn-wiki/avrtimer_applet Java Applet Timer Berechnung]&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/dload.php?action=file&amp;amp;file_id=169 AvrTimer Windows Berechnungstool]&lt;br /&gt;
* [http://people.freenet.de/gjl/helferlein/avr-uart-rechner.html AVR-Baudraten-Rechner (JavaScript)]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Abkürzung|AVR]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Avr&amp;diff=7176</id>
		<title>Avr</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Avr&amp;diff=7176"/>
				<updated>2006-05-04T21:18:38Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: ADC, weitere Verbesserungen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:AtmelController.jpg|thumb|Beispiel eines AVR Controllers]]&lt;br /&gt;
'''AVR''' ist eine 8-Bit [[Microcontroller]]-Familie mit RISC-Architektur.&lt;br /&gt;
Im Gegensatz zu vielen anderen Microcontroller-Architekturen hat die AVR-Architektur keine Vorgänger. Sie ist ein komplettes Neudesign, das Anfang der 90-Jahre an der Universität von Trondheim/Norwegen entwickelt und vom (bis heute einzigen) Hersteller [[Atmel]] aufgekauft wurde. Es gibt eine ganze Serie von AVR-Controllern. Sie alle werden ähnlich programmiert, haben vergleichbaren Befehlssatz und physikalische Eigenschaften, bieten jedoch unterschiedliche Features und Peripherie. &lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche und kostenlose Entwicklungssysteme in den Sprachen Basic, C/C++, Pascal und Assembler für diese Controller-Familie. &lt;br /&gt;
&lt;br /&gt;
==Wofür steht AVR?==&lt;br /&gt;
&amp;quot;AVR&amp;quot; steht angeblich für ''Advanced Virtual RISC'' (in einem Paper der Entwickler des AVR-Kerns Alf Egin Bogen und Vegard Wollan). Laut [[Atmel]] bedeutet es nichts.&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
AVR-Controller besitzen eine zweistufige Pipeline (fetch and execute), die es ermöglicht, die meisten Befehle innerhalb eines einzigen Prozessortaktes auszuführen. Dadurch ist ein AVR wesentlich schneller als etwa 8051-Controller, bei denen der Prozessortakt intern noch durch 12 geteilt wird.&lt;br /&gt;
&lt;br /&gt;
*AVR-Kern&lt;br /&gt;
** Harvard-Architektur (getrennter Befehls- und Datenspeicher) &lt;br /&gt;
** 32 Register, kein Akkumulator, 3 Pointerregister &lt;br /&gt;
** EEPROM-Datenspeicher&lt;br /&gt;
** [[Watchdog]], [[Bootloader]]-Support, verschiedene Stromspar-Modi, Brownout-Erkennung, Interner Oszillator&lt;br /&gt;
** Lineares Speichermodell (keine Segmentierung)&lt;br /&gt;
** 8-Bit Architektur ist für Hochsprachen (C) optimiert &lt;br /&gt;
* In-System programmierbar: die Controller können sehr einfach über ein  Programmierkabel (oft ISP-Kabel genannt), das mit dem PC verbunden wird, programmiert werden &amp;amp;ndash; auch dann, wenn sie sich nicht in einer Schaltung befindet.&lt;br /&gt;
* umfangreiche Peripherie&lt;br /&gt;
** 8- und 16-Bit-Timer/Counter mit [[PWM]], Capture/Compare, externe Betaktung, asynchrone Operation&lt;br /&gt;
** Kommunikation: [[UART|USART]], [[SPI]], [[I2C]] ([[TWI]])&lt;br /&gt;
** Analog-Comparator, Analog-Digital-Wandler &lt;br /&gt;
** unterschiedlichste externe und interne Interrupt-Quellen (UART, SPI, Timer, A/D-Wandler, Analog-Comparator, ...)&lt;br /&gt;
** JTAG (Debugerinterface)&lt;br /&gt;
* AVR Typen (AT90 &amp;quot;Classic AVR&amp;quot;, ATtiny, ATmega) &lt;br /&gt;
* erhältlich in unterschiedlichen Gehäusen, idR Durchsteck und als [[SMD]]&lt;br /&gt;
* Viele Entwicklungsboards erhältlich, z.B. das Roboternetzboard [[RN-Control]]&lt;br /&gt;
&lt;br /&gt;
==Einige Pinbelegungen der populärsten AVR-Controller==&lt;br /&gt;
(in etwa nach Leistungsfähigkeit sortiert)&lt;br /&gt;
&lt;br /&gt;
* [[AT90S2313]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:at90s2313tiny.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Atmel Controller Mega8]]&lt;br /&gt;
* [[Atmel Controller Mega48 Mega88 Mega168]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:mega8kompatibel.png|center]]&lt;br /&gt;
&lt;br /&gt;
* [[Atmel Controller Mega16 und Mega32]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mega1632.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Atmel Controller Mega128]] ([[SMD]]-Chip)&lt;br /&gt;
&lt;br /&gt;
[[Bild:mega128pin.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===Die AVR-Pin-Bezeichnungen und deren Funktion===&lt;br /&gt;
Die meisten Ports sind doppelt belegt und besitzen neben der normalen Port-Funktion noch eine Sonderfunktion. Die verschiedenen Pinbezeichnungen und Sonderfunktionen werden hier beschrieben:&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|+ '''Tabelle: Die AVR-Pin-Bezeichnungen und deren Funktion'''&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Versorgungs- und Referenzpins, Reset&lt;br /&gt;
|-&lt;br /&gt;
 |'''VCC''' &lt;br /&gt;
 | Versorgungsspannung von 2,7 Volt bis 6 V bei den L-Varianten (low power), ansonsten 4,5V bis 6V. Die nächste AVR-Generation soll ab 1,8 Volt funktionieren.&lt;br /&gt;
|-&lt;br /&gt;
 |'''GND''' &lt;br /&gt;
 |Masse &lt;br /&gt;
|-&lt;br /&gt;
 |'''AREF''' &lt;br /&gt;
 |Referenzspannung für den Analog-Digital-Wandler (kann auf 5V gesetzt werden). Auch die interne Bandgap-Referenzspannung kann über diesen Pin entstört werden (dann KEINE externe Spannung an diesen Pin geben (Kurzschluss)!). &lt;br /&gt;
|-&lt;br /&gt;
 |'''AGND''' &lt;br /&gt;
 |Alternative Masse, etwa um ein Verbindungspunkt mit GND zu haben und bei empfindlichen Messungen  Masseschleifen zu vermeiden.&lt;br /&gt;
|-&lt;br /&gt;
 |'''AVCC''' &lt;br /&gt;
 | &lt;br /&gt;
Die Betriebsspannung für den Analog-Digital-Wandler (siehe Beschaltungsskizze). Die Pins AVCC, AGND und AREF sollten immer beschaltet werden, da es sonst passieren kann, dass Port A nicht richtig funktioniert, selbst wenn man den AD-Wandler nicht benutzt. &lt;br /&gt;
|-&lt;br /&gt;
 |'''RESET''' &lt;br /&gt;
 |Rücksetz-Eingang, intern über einen [[Pullup]] mit VCC verbunden. Ein LOW–Pegel an diesem Pin für die Dauer von mindestens zwei Zyklen des Systemtaktes bei aktivem Oszillator setzt den Controller zurück. Rücksetzen der Ports erfolgt unabhängig von einem evtl. anliegenden Systemtakt.&lt;br /&gt;
|-&lt;br /&gt;
|'''PEN'''&lt;br /&gt;
|Programming Enable - Diesen Pin gibt es nur beim Mega128/64 u.ä. Wird dieser Pin beim Power-On Reset nach Masse gezogen, geht der Controller in den [[ISP]] Programmiermodus. Man kann ihn also alternativ zu Reset verwenden. In der Regel verwendet man aber die Reset-Leitung und PEN sollte man direkt mit VCC verbinden.&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| System-Takt&lt;br /&gt;
|-&lt;br /&gt;
 |'''XTAL1''' &lt;br /&gt;
 |Eingang des internen Oszillators zur Erzeugung des Systemtaktes bzw. Eingang für ein externes Taktsignal, wenn der interne Oszillator nicht verwendet werden soll bzw. Anschluss von Quarz/Keramik-Resonator/RC-Glied.&lt;br /&gt;
|-&lt;br /&gt;
 |'''XTAL2''' &lt;br /&gt;
 |Anschluss von Quarz oder Keramik-Resonator oder Ausgang des integrierten Oszillators zur Nutzung als Systemtakt (Je nach Fuse-Einstellungen). &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Digitale bidirektionale  I/O-Ports&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;| Jeder Pin der Ports kann individuell als Eingang oder Ausgang konfiguriert werden. Die I/O-Ports sind maximal 8 Bit breit und verfügen ja nach AVR-Typ über eine unterschiedliche Anzahl von Pins. An jedem als Eingang (Input) geschalteten Pin gibt es zuschaltbare [[Pullup]]-Widerstände, die teilweise auch bei aktivierter Sonderfunkton verfügbar sind.&lt;br /&gt;
&lt;br /&gt;
Bei eingeschalteten Sonderfunktionen wie UART, SPI, ADC, etc. sind die entsprechenden Pins nicht als &amp;quot;normale&amp;quot; digitale I/O verwendbar, sondern dienen der Sonderfunktion. Die Anzahl der als I/O verwendbaren Pins ist auch abhängig von den Fuse-Einstellungen (Vorsicht beim Umstellen, Handbuch GENAU lesen!).&lt;br /&gt;
|-&lt;br /&gt;
|'''PA 0 – 7''' || Port A &lt;br /&gt;
|-&lt;br /&gt;
|'''PB 0 – 7''' || Port B &lt;br /&gt;
|-&lt;br /&gt;
|'''PC 0 – 7''' || Port C &lt;br /&gt;
|-&lt;br /&gt;
|'''PD 0 – 7''' || Port D &lt;br /&gt;
|-&lt;br /&gt;
|'''PE 0 – 7''' || Port E &lt;br /&gt;
|-&lt;br /&gt;
|'''PF 0 – 7''' || Port F &lt;br /&gt;
|-&lt;br /&gt;
|'''PG 0 – 7''' || Port G &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Externe Interrupts&lt;br /&gt;
|- &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;| Die PCINT-Interrupts gibt es nur für neuere AVRs wie den [[ATmega88]]. Falls die Anzahl an externen Interrupts nicht ausreicht, kann evtl. auch andere Hardware dafür eingesetzt werden, etwa der Analog-Comparator mit interner Bandgap-Referenz, falls er anderwärtig nicht gebraucht wird.&lt;br /&gt;
|-&lt;br /&gt;
 |'''INT0''' ||Externer Interrupt 0&lt;br /&gt;
|-&lt;br /&gt;
 |'''INT1''' ||Externer Interrupt 1&lt;br /&gt;
|-&lt;br /&gt;
 |'''INT2''' ||Externer Interrupt 2 &lt;br /&gt;
|-&lt;br /&gt;
 |'''PCINTx''' ||Pin-Change Interrupt&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| [[Timer]] und [[PWM]]&lt;br /&gt;
|-&lt;br /&gt;
 |'''T0''' &lt;br /&gt;
 |Timer-Eingang. Timer kann gestartet, gestoppt oder getaktet werden &lt;br /&gt;
|-&lt;br /&gt;
 |'''T1''' &lt;br /&gt;
 |Timer-Eingang. Timer kann gestartet, gestoppt oder getaktet werden &lt;br /&gt;
|-&lt;br /&gt;
 |'''OC0''' &lt;br /&gt;
 |PWM bzw. Output Compare Ausgang des Timers 0 &lt;br /&gt;
|-&lt;br /&gt;
 |'''OC1A''' &lt;br /&gt;
 |Ausgang für die Compare-Funktion des integrierten Zeitgeber- / Zählerbausteines &lt;br /&gt;
Der erste PWM-Ausgang des Timers1. Er kann zum Regeln der Bot-Motogeschwindigkeit benutzt werden. &lt;br /&gt;
|-&lt;br /&gt;
 |'''OC1B''' &lt;br /&gt;
 |Ausgang für die Compare-Funktion des integrierten Zeitgeber- / Zählerbausteines &lt;br /&gt;
Der zweite PWM-Ausgang des Timers1. Er kann zum Regeln der Bot-Motogeschwindigkeit benutzt werden. &lt;br /&gt;
|-&lt;br /&gt;
 |'''ICP1''' &lt;br /&gt;
 |Eingang für die Capture-Funktion des integrierten Zeitgebers / Zählerbausteines &lt;br /&gt;
|-&lt;br /&gt;
 |'''OC2''' &lt;br /&gt;
 |[[Pwm]] bzw. Output Compare Ausgang des Timers2. Er kann zum Regeln der Bot-Motogeschwindigkeit benutzt werden. &lt;br /&gt;
|-&lt;br /&gt;
 |'''TOSC1, TOSC2''' &lt;br /&gt;
 |TOSC1 und TOSC2 sind Eingänge für den asynchronen Modus von Timer2. Sie sind vorgesehen für den Anschluss eines externen Uhrenquarzes ( 32.768 kHz ). Damit lassen sich zum Beispiel sehr genaue Ein-Sekunden-Impulse für eine Uhr generien. &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Analog-Digital-Wandler&lt;br /&gt;
|-&lt;br /&gt;
 |'''ADC0''' bis '''ADC7''' &lt;br /&gt;
 |Eingänge des AD-Wandlers. Spannungen können hier gemessen werden oder an den Analog-Komparator weiter geleitet werden. &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Analog-Komparator&lt;br /&gt;
|-&lt;br /&gt;
 |'''AIN0, AIN1''' &lt;br /&gt;
 |Die beiden externen Eingänge des Analog-Komparators. &lt;br /&gt;
Mit AIN0(+) und AIN1(-) kann man zwei Spannungen miteinander vergleichen. Wenn die Spannung an AIN0 höher als bei AIN1 ist, liefert der Komparator &amp;quot;High&amp;quot;, ansonsten ein &amp;quot;Low&amp;quot;. Als interne Eingänge des Komparators können die Interne Bandgap-Referenzspannung oder Ausgänge des ADC-Multiplexers dienen.&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Serielle Schnittstelle ([[UART|USART]])&lt;br /&gt;
|-&lt;br /&gt;
 |'''RXD''' &lt;br /&gt;
 |Eingang der Seriellen Schnittstelle (Receive Data), TTL-Pegel &lt;br /&gt;
|-&lt;br /&gt;
 |'''TXD''' &lt;br /&gt;
 |Ausgang Serielle Schnittstelle (Transmit Data), TTL-Pegel &lt;br /&gt;
|-&lt;br /&gt;
 |'''XCK''' &lt;br /&gt;
 |Externe Takt für den USART. Wird nur in Sonderfällen für den Takt benötigt. &lt;br /&gt;
USART (&amp;quot;Universal Synchronous/Asynchronous Receiver and Transmitter&amp;quot;). Das ist die serielle Schnittstelle, die zur Datenübertragung zwischen Mikrocontroller und PC genutzt wird. Zur bidirektionalen Übertragung werden zwei Pins am Controller benötigt: TXD und RXD. Über TXD (&amp;quot;Transmit Data&amp;quot;) werden Daten gesendet, RXD (&amp;quot;Receive Data&amp;quot;) dient zum Empfang. &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| [[SPI]]-Schnittstelle&lt;br /&gt;
|-&lt;br /&gt;
 |'''SS''' &lt;br /&gt;
 |SPI-Interface – wird beneötigt um den richtigen Slave am Bus zu wählen &lt;br /&gt;
|-&lt;br /&gt;
 |'''MOSI''' &lt;br /&gt;
 |SPI-Interface – Datenausgang (als Master) oder Dateneingang (als Slave), verwendet bei ISP (In-System-Programmierung)&lt;br /&gt;
|-&lt;br /&gt;
 |'''MISO''' &lt;br /&gt;
 |SPI-Interface – Dateneingang (als Master) oder Datenausgang (als Slave), verwendet bei ISP (In-System-Programmierung)&lt;br /&gt;
|-&lt;br /&gt;
 |'''SCK''' &lt;br /&gt;
 |SPI-Interface – Bustakt vom Master, verwendet bei ISP (In-System-Programmierung)&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| [[I2C|I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C]]-Schnittstelle ([[TWI]])&lt;br /&gt;
|-&lt;br /&gt;
 |'''SDA''' &lt;br /&gt;
 |I2C-Schnittstelle (Bus aus 2 Leitungen) Datenleitung &lt;br /&gt;
|-&lt;br /&gt;
 |'''SCL''' &lt;br /&gt;
 |I2C-Schnittstelle (Bus aus 2 Leitungen) Clockleitung &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------------------------------&amp;gt;&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| [[JTAG]]-Interface&lt;br /&gt;
|-&lt;br /&gt;
 |'''TDI''' &lt;br /&gt;
 |JTAG-Debug Interface - Über dieses Interface kann man den AVR programmieren und debuggen. Die Schnittstelle ist ähnlich wie die SPI Schnittstelle und hat getrennte Dateneingangs- und Datenausgangsleitungen sowie eine Taktleitung. TDI ist die Dateneingangsleitung&lt;br /&gt;
|-&lt;br /&gt;
 |'''TDO''' &lt;br /&gt;
 |JTAG-Debug Interface - TDO ist die Datenausgangsleitung des JTAG Interface&lt;br /&gt;
|-&lt;br /&gt;
 |'''TMS''' &lt;br /&gt;
 |JTAG-Debug Interface&lt;br /&gt;
|-&lt;br /&gt;
 |'''TCK''' &lt;br /&gt;
 |JTAG-Debug Interface &lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Timer/Counter ==&lt;br /&gt;
&lt;br /&gt;
Die Mikrocontroller der AVR-Familie besitzen je nach Typ eine unterschiedliche Anzahl an programmierbaren [[Timer|Timern]]. Bei den aktuellen ATmegas sind das mindestens ein 8-Bit Timer und bei größeren Ausführungen der Serie auch 16-Bit Timer. Die Timer werden immer Timerx benannt, wobei x für die Timernummer steht (also 0, 1, 2, usw.). &lt;br /&gt;
Die Konfigurationsmöglichkeiten sind von Timer zu Timer unterschiedlich.&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' Die folgenden Code-Beispiele sind in C programmiert und wurden für einen [[ATMega32|ATmega32]] entwickelt. Sie lassen sich also ohne große Änderungen auch auf anderen Mikrocontrollern der AVR-Familie einsetzen.&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine Funktionsweise ===&lt;br /&gt;
Timer funktionieren nach dem allgemeinen Prinzip, dass sie eine Ganzzahl (im weiteren als Zähler bezeichnet) je nach Betriebsmodus auf- oder abwärtszählen, d.h. inkrementieren bzw. dekrementieren.&lt;br /&gt;
&lt;br /&gt;
Angenommen, der Timer arbeitet im einfachsten Betriebsmodus, dem normalen Modus (siehe [[Avr#Normaler Modus (Normal Mode)|Normaler Modus (Normal Mode)]]). Die Zählrichtung des Timers ist aufsteigend gerichtet. Je nach Auflösung, also 8-Bit oder 16-Bit, erreicht der Zähler irgendwann einen bestimmten Zustand. Möglich wäre, dass er überläuft, wenn z.B. bei einem 8-Bit Timer der Wert 255 inkrementiert wird (siehe Grafik).&lt;br /&gt;
&lt;br /&gt;
[[Bild:AbstrakterZaehlvorgang.png]]&lt;br /&gt;
&lt;br /&gt;
=== Der Prescaler ===&lt;br /&gt;
Der Prescaler (eng. = Vorteiler) kann dazu genutzt werden, den Takt, der den Timern zugeführt wird, zu verkleinern. U.a. kann man damit die Timer so konfigurieren, damit diese in den unterschiedlichsten Frequenzen takten. Hier eine Grafik die den Prescaler veranschaulicht:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Prescaler.png]]&lt;br /&gt;
&lt;br /&gt;
Das obere Diagramm zeigt den Betrieb ohne Prescaler, das untere mit Prescaler. Die gestrichelte Linie zeigt, wann ein Interrupt eintritt.&lt;br /&gt;
&lt;br /&gt;
Im Teil [[Avr#Die Betriebsmodi|Die Betriebsmodi]] wird weiter auf die praktische Verwendung des Prescalers eingegangen.&lt;br /&gt;
&lt;br /&gt;
=== Die Betriebsmodi ===&lt;br /&gt;
Die AVR-Timer können in unterschiedlichen Betriebsmodi betrieben werden. Diese sind:&lt;br /&gt;
* Normaler Modus&lt;br /&gt;
* CTC Modus&lt;br /&gt;
* PWM&lt;br /&gt;
&lt;br /&gt;
==== Normaler Modus (Normal Mode) ====&lt;br /&gt;
Der einfachste Betriebsmodus ist der normale Modus. Er funktioniert wie im Abschnitt  &amp;quot;[[Avr#Allgemeine Funktionsweise|Allgemeine Funktionsweise]]&amp;quot; beschrieben. Die Zählrichtung des Timers ist immer aufsteigend, und irgendwann kommt es zu dem Interrupt Timer-Overflow (welcher in einer passend ISR aufgefangen werden kann). Im einfachsten Fall kann man diesen Modus in folgendem Diagramm darstellen:&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_1.png]]&lt;br /&gt;
&lt;br /&gt;
Der Zähler des Timers (im Diagramm oben, die aufsteigende und dann wieder zurückgesetzte Linie) ist in dem Register TCNTx gespeichert, wobei x für eine Zahl steht. Soll z.B. auf den Timer0 (siehe Datenblatt des jeweiligen Controllers) des Controllers zugegriffen werden, so ist an TCNT eine 0 anzuhängen, also TCNT0.&lt;br /&gt;
Wie lange es braucht, bis der Zähler einen Overflow auslöst, ist von der Taktfrequenz des Controllers, dem eingestellten Prescaler-Wert und von der Timerauflösung abhängig. Nun wäre es ja sehr unpraktisch, wenn wir den Zähler nicht anpassen könnten. Denn sonst müssten wir unsere Software die den Timer benutzt evtl. anpassen und viel rechnen um z.B. für 1000 ms zu schlafen. Deswegen kann auf den Zähler zugreifen und ihn vorladen bevor dieser wieder vom eigentlichen Timer hochgezählt wird. Dies veranschaulicht folgendes Diagramm:&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_1_Vorladen.png]]&lt;br /&gt;
&lt;br /&gt;
Dadurch kann man den Timer beeinflussen, und beeinflussen wie lange es dauert, bis ein Overflow auftritt. Um zu berechnen, welchen Wert wir vorladen müssen, kann man auch ein Java-Applet nutzen, siehe unter [[Avr#Weblinks|Weblinks Java Applet]].&lt;br /&gt;
&lt;br /&gt;
Natürlich kann man das auch &amp;quot;von Hand&amp;quot; rechnen. Die Berechnung des Preloader- sowie Prescalerwerts bei Verwendung der Overflow-Interrupts, eines Prescalers von 64 (nicht alle Prescaler können verwendet werden) und eines Quarzes mit der Frequenz von 8 MHz sieht folgendermaßen aus (gesuchte Frequenz beträgt 1000 Hz unter der Verwendung des Timer0 eines ATmega32):&lt;br /&gt;
# &amp;lt;math&amp;gt;Prescale = Frequenz * 1000000 [Hz] = 8000000&amp;lt;/math&amp;gt;&lt;br /&gt;
# Wir definieren den maximalen Zählerwert. Dieser ist bei einem 8-Bit Timer 256, bei einem 16-Bit Timer 65536. In unserem Fall ist der maximale Zählerwert 256, weil Timer0 verwendet wird.&lt;br /&gt;
# Nun wird die Variable ''Prescale'' (s.o.) durch den verwendeten Prescaler (64) geteilt (&amp;lt;math&amp;gt;8000000 Hz / 64 = 125000&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Als nächstes wird der im dritten Punkt errechnete Wert durch die gesuchte Frequenz geteilt &amp;lt;math&amp;gt;=125000 / 1000Hz = 125&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Nun wird mathematisch überprüft, ob der errechnete Wert aus dem vierten Punkt kleiner als der maximale Zählerwert ist. Trifft dies zu, so subtrahiert man den errechneten Wert vom maximalen Zählerwert (&amp;lt;math&amp;gt;= 256 - 125 = 131&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Damit haben wir den Wert errechnet, der bei jedem Interrupt, den der Timer0 auslöst, in TCNTx (in diesem Fall TCNT0) nachgeladen werden muss, damit die Interrupts in dem gewünschten Zeitabstand von einer Millisekunde ausgelöst werden.&lt;br /&gt;
&lt;br /&gt;
Allerdings bleibt zu bemerken, dass bei der Verwendung einer &amp;quot;ungeraden&amp;quot; Quarzfrequenz (z.B. 7,3728 MHz) der Timer mit einer bestimmten Ungenauigkeit arbeitet. Würden wir z.B. den Quarz oben mit einem Quarz mit 7,3728 MHz austauschen, so wäre die Fehlerrate 0,17%. Diese Ungeauigkeit varriert von verwendetem Prescaler zu Prescaler. D.h. wenn wir einen Prescaler von 1024 (und einer Quarzfrequenz von 8 MHz) verwendet hätten, so hätten wir eine inakzeptable Ungeauigkeit von 11,61%. Deswegen sollte sie eines der genannten Programme unter [[Avr#Weblinks]] verwenden, denn diese zeigen nur die bestmögliche Konfiguration an.&lt;br /&gt;
&lt;br /&gt;
Die Fehlerrate kann natürlich auch ausgerechnet werden. Hier die Rechenschritte (sie sind erweiternd zu der oberen Berechnung):&lt;br /&gt;
# Als erstes wird mathematisch überprüft, ob der Preloaderwert (siehe fünften Schritt oben) größer als 1 ist.&lt;br /&gt;
# Trifft dies zu, so wird als nächstes die resultierende Frequenz errechnet. Die geschieht folgendermaßen: Der errechnete Preloaderwert aus der Rechnung oben wird vom maximalen Zählerwert subtrahiert, anschließend mit dem Prescaler multipliziert und dann das Ganze durch die Variable Prescale geteilt &lt;br /&gt;
&amp;lt;math&amp;gt;(256 - 131) \cdot 64 / 8\,000\,000 \mathrm{Hz} \cdot 1\,000\,000 = 1000&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Nun wird die gesuchte Frequenz vom errechneten Wert aus dem dritten Punkt subtrahiert und dann wiederum durch diese geteilt &amp;lt;math&amp;gt;(1000-1000) / 1000 = 0&amp;lt;/math&amp;gt;. Damit läuft dieser Timer genau mit einer Fehlerrate von 0 %.&lt;br /&gt;
&lt;br /&gt;
Betreibt man den Timer im Overflow-Modus, so muss man, wie bereits erwähnt, nach/bei jedem Overflow-Interrupt den Timer nachladen. Der Interrupt heißt in diesem Fall SIG_OVERFLOWx (x steht für die Nummer des Timers). Dieser muss in einer ISR abgefangen werden.&lt;br /&gt;
&lt;br /&gt;
Zusammenfassend ein Beispielprogramm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* Es wird der Timer2 (8-Bit) eines ATmega32 verwendet, der mit einem Quarz mit 7,3728 MHz&lt;br /&gt;
betrieben wird. Im Abstand von 0,001 ms erzeugt der Timer einen Interrupt, also eine&lt;br /&gt;
Frequenz von 1000000 Hz (oder 100 kHz). Der Timer wird auf einen Prescaler von 1 und&lt;br /&gt;
einem Preloader von  183 konfiguriert.*/&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t countTimer2;	// Speichert den aktuellen Zählerwert&lt;br /&gt;
&lt;br /&gt;
// ISR zum auffangen der Interrupts:&lt;br /&gt;
SIGNAL(SIG_SIG_OVERFLOW2)&lt;br /&gt;
{&lt;br /&gt;
	countTimer2++;&lt;br /&gt;
	TCNT2 = 183;		// Nachladen&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Initialisierung:&lt;br /&gt;
TCCR2 = (1&amp;lt;&amp;lt;CS22);		// Prescaler von 1&lt;br /&gt;
TCNT2  = 183;			// Vorladen&lt;br /&gt;
TIMSK |= (1&amp;lt;&amp;lt;TOIE2);		// Interrupts aktivieren und damit Timer starten&lt;br /&gt;
sei();&lt;br /&gt;
&lt;br /&gt;
// Funktionen zum benutzen der Timer:&lt;br /&gt;
/** Diese Funktion nicht aufrufen. Wird von sleep_millisec aufgerufen.&lt;br /&gt;
Bei t=100 schläft die Funktion 1 ms. */&lt;br /&gt;
inline void sleep (uint8_t t)&lt;br /&gt;
{&lt;br /&gt;
	// countTimer2 wird in der ISR oben inkrementiert&lt;br /&gt;
	countTimer2 = 0;&lt;br /&gt;
	while (countTimer2 &amp;lt; t);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** Schläft x-Millisekunden. */&lt;br /&gt;
inline void sleep_millisec(uint16_t msec)&lt;br /&gt;
{&lt;br /&gt;
	uint16_t i;&lt;br /&gt;
	for(i=0; i&amp;lt;msec; i++) {&lt;br /&gt;
		sleep(100);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Allerdings wird auf diese leicht veraltete Technik nun nicht weiter eingegangen. Der Artikel wendet sich nun dem neueren &amp;quot;Compare Output&amp;quot;-Betriebsmodus zu.&lt;br /&gt;
&lt;br /&gt;
Beim &amp;quot;Compare Output&amp;quot;-Betriebsmodus wird genauso ein Zähler hochgezählt. Allerdings wird der Zählerwert nach jeder Inkrementierung mit einem vom Benutzer festgelegten Wert verglichen. Entspricht der Zählerwert dem gespeicherten Wert, so kommt es zu einem Interrupt. Dieser Wert wird in das Register OCRx (x steht wieder für die Timernummer) gespeichert. Je nach Auflösung des Timers ist dieses Register 8-Bit oder 16-Bit breit. &lt;br /&gt;
&lt;br /&gt;
Hinweis: Siehe CTC Modus unten. Dieser wird benötigt um den Timer entsprechend im &amp;quot;Compare Output&amp;quot;-Betriebsmodus vernünftig zu betreiben.&lt;br /&gt;
&lt;br /&gt;
Hier ein typisches Diagramm dieses Betriebsmodus (Hinweis: Das Diagramm wurde unter Verwendung des CTC Modus erstellt. Für Begriffserklärung siehe CTC Modus):&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_CompareMatch.png]]&lt;br /&gt;
&lt;br /&gt;
Das Ausrechnen des Werts, der in OCRx geschrieben werden muss, damit Frequenz x entsteht, ist nicht sonderlich schwer. Man geht wie bei der Berechnung des Werts für den Overflow-Modus vor (s.o.) nur daß man das resultierende Ergebnis vom maximalen Zählerwert (bei 8-Bit Auflösung ist dieser 256, bei 16-Bit Auflösung 65536) subtrahiert. Das Ergebnis wird dann einmalig in das Register OCRx geschrieben. Mann muss also nicht wie beim Overflow-Modus den Timer nach jedem Interrupt nachladen. Der enstehende Interrupt heißt in diesem Fall SIG_OUTPUT_COMPAREx (x steht für die Nummer des Timers). Dieser muss in einer ISR abgefangen werden.&lt;br /&gt;
&lt;br /&gt;
Wiederum zusammenfassend ein Beispielprogramm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* Es wird der Timer2 (8-Bit) eines ATmega32 verwendet, der mit einem Quarz mit 7,3728 MHz&lt;br /&gt;
betrieben wird. Im Abstand von 0,001 ms erzeugt der Timer einen Interrupt, also eine Frequenz&lt;br /&gt;
von 1000000 Hz (oder 100 kHz). Der Timer wird auf einen Prescaler von 1 und einem OCR2-Wert&lt;br /&gt;
von 73 konfiguriert.*/&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t countTimer2;	// Speichert den aktuellen Zählerwert&lt;br /&gt;
&lt;br /&gt;
// ISR zum auffangen der Interrupts:&lt;br /&gt;
SIGNAL(SIG_OUTPUT_COMPARE2)&lt;br /&gt;
{&lt;br /&gt;
  countTimer2++;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Initialisierung:&lt;br /&gt;
TCCR2 = (1&amp;lt;&amp;lt;CS22) | (1&amp;lt;&amp;lt;WGM21);	// Prescaler von 1 | CTC-Modus (siehe unten für Beschreibung)&lt;br /&gt;
OCR2  = 73;			// Vergleichswert&lt;br /&gt;
TIMSK |= (1&amp;lt;&amp;lt;OCIE2);		// Interrupts aktivieren und damit Timer starten&lt;br /&gt;
sei();&lt;br /&gt;
&lt;br /&gt;
// Funktionen zum benutzen der Timer:&lt;br /&gt;
/** Diese Funktion nicht aufrufen. Wird von sleep_millisec aufgerufen.&lt;br /&gt;
Bei t=100 schläft die Funktion 1 ms. */&lt;br /&gt;
inline void sleep(uint8_t t)&lt;br /&gt;
{&lt;br /&gt;
	// countTimer2 wird in der ISR oben inkrementiert&lt;br /&gt;
	countTimer2 = 0;&lt;br /&gt;
	while (countTimer2 &amp;lt; t);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** Schläft x-Millisekunden. */&lt;br /&gt;
inline void sleep_millisec(uint16_t msec)&lt;br /&gt;
{&lt;br /&gt;
	uint16_t i;&lt;br /&gt;
	for(i=0; i&amp;lt;msec; i++) {&lt;br /&gt;
		sleep(100);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== CTC Modus (Clear Timer on Compare Match mode) ====&lt;br /&gt;
Der CTC Modus ist eine Erweiterung des &amp;quot;Compare Output&amp;quot;-Betriebsmodus. Der CTC Modus wird z.B. für das obere Beispielprogramm benötigt. Wird der Timer nämlich im normalen Betriebsmodus betrieben, so ist seine Zählergrenze je nach Auflösung 255 oder entsprechend für die 16-Bit Timer. Erst wenn diese Grenze erreicht wurde, wird der Timer zurückgesetzt (also auf 0). Durch den CTC Modus wird der Timer augenblicklich automatisch nachdem ein &amp;quot;Compare Output&amp;quot;-Interrupt auftrat zurückgesetzt. Man kann also die maximalen Zählergrenze selber definieren.&lt;br /&gt;
Dieses Diagramm veranschaulicht den CTC Modus. Nach dem Interrupt wird der Timer sofort wieder zurückgesetzt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:NormalerModus_CompareMatch.png]]&lt;br /&gt;
&lt;br /&gt;
==== PWM ====&lt;br /&gt;
Für PWM siehe [[Pwm]].&lt;br /&gt;
&lt;br /&gt;
=== Registerübersicht ===&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' Diese Registertabelle wurde für den aktuellen [[Atmel Controller Mega16 und Mega32]] erstellt. Wenn Sie ein anderes Modell verwenden kann es sein, dass ein oder mehrere Register nicht existieren, oder sie eine andere Bezeichnung haben.&lt;br /&gt;
&lt;br /&gt;
{| {{Blaueschmaltabelle}} width=100%&lt;br /&gt;
 |'''TIMSK'''&lt;br /&gt;
 |-&lt;br /&gt;
 |Mit diesem Register, der von allen Timern verwendet wird, lässt sich die Interruptausführung und Art des jeweiligen Timers bestimmen.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Registertabelle8Bit|OCIE2|TOIE2|TICIE1|OCIE1A|OCIE1B|TOIE1|OCIE0|TOIE0}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
*'''OCIE2 (Timer/Counter2 Output Compare Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter2 Compare Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TOIE2 (Timer/Counter2 Overflow Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter2 Overflow Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TICIE1 (Timer/Counter1, Input Capture Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Input Capture Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''OCIE1A (Timer/Counter1 Output Compare A Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Output Compare A Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''OCIE1B (Timer/Counter1 Output Compare B Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Output Compare B Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TOIE1 (Timer/Counter1 Overflow Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, wird der Timer/Counter1 Overflow Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''OCIE0 (Timer/Counter0 Output Compare Match Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, so wird der Timer/Counter0 Compare Match Interrupt aktiviert (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
*'''TOIE0 (Timer/Counter0 Overflow Interrupt Enable)'''&amp;lt;br/&amp;gt;Wenn dieses Bit gesetzt wird, so wird der Timer/Counter0 Overflow Interrupt aktiviert  (vorrausgesetzt die Interrupts sind global aktiviert).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Analog-Digital-Wandler ==&lt;br /&gt;
Mit einem Analog-Digital-Wandler (ADC, für Analog Digital Converter) ist es mit den AVRs möglich, auf einfache Art und Weise analoge Größe in digitale Werte umzuwandeln. Dies bietet sich z.B. an, wenn man die Batteriespannung eines Roboters bestimmen möchte.&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine Informationen ===&lt;br /&gt;
Für allgemeine Informationen zu ADCs: siehe [[ADC]].&lt;br /&gt;
&lt;br /&gt;
=== Kanäle ===&lt;br /&gt;
Ein AVR hat normalerweise nur einen ADC integriert. Öfters muss man aber mehrere analoge Größen von verschiedenen Quellen wandeln, deswegen besitzen die AVRs Kanäle (ein ATmega32 z.B. besitzt acht Kanäle auf Port A). Diese Kanäle werden dann mithilfe eines Multiplexer auf den ADC geschalten werden, der dann die anliegenden analoge Spannung in einen digitalten Wert wandelt.&lt;br /&gt;
&lt;br /&gt;
=== Betriebsmodi ===&lt;br /&gt;
Der ADC bietet verschiedene Betriebsmodi. Diese wären:&lt;br /&gt;
* Single Conversation: Der ADC wandelt eine analoge Größe um und gibt diese zurück.&lt;br /&gt;
* Free Running: Der ADC wandelt wie in einer Endlosschleife ständig die anliegenden analogen Größen in digitale Werte um und gibt diese zurück.&lt;br /&gt;
&lt;br /&gt;
=== Teilungsfaktor ===&lt;br /&gt;
Zum Wandeln benötigt der ADC einen eigenen Takt, der auf der Taktfrequenz des Mikrocontrollers basiert. Allerdings ist die Taktfrequenz des Mikrocontrollers zu schnell und deswegen wird diese durch den Vorteiler verkleinert. Der resultierende Takt muss zwischen 50kHz und 200kHz liegen. Folgende Teilungsfaktoren sind verfügbar:&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''Teilungsfaktoren'''&lt;br /&gt;
 |2&lt;br /&gt;
 |4&lt;br /&gt;
 |8&lt;br /&gt;
 |16&lt;br /&gt;
 |32&lt;br /&gt;
 |64&lt;br /&gt;
 |128&lt;br /&gt;
 |}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Um zu bestimmen welcher Teilungsfaktor geeignet ist, kann man folgende Formel verwenden.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Tacktfrequenz = 8 MHz&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Teilungsfaktor_{min} = {Tacktfrequenz \over {200 kHz}} = {{8000000 Hz} \over {200000 Hz}} = 40&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Teilungsfaktor_{max} = {Tacktfrequenz \over {50 kHz}} = {{8000000 Hz} \over {50000 Hz}} = 160&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Deswegen kann man nun zwischen einem der folgenden Teilungsfaktor wählen: 64 und 128. Im Interesse der Geschwindigkeit sollte 64 gewählt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Siehe bitte die Registerübersicht weiter unten. Dort wird gezeigt, welches Register entsprechend eingestellt werden muss, damit man einen der oben aufgelisteten Teilungsfaktoren auswählen kann.&lt;br /&gt;
&lt;br /&gt;
=== Referenzspannung ===&lt;br /&gt;
Das Ergebnis der Wandlung des ADC bezieht sich auf eine bestimmt Referenzspannung. Diese Referenzspannung lässt sich bestimmen. Je nach gewählter Referenzspannung darf man nur eine zu messende Spannung an den Port anlegen, die nicht höher liegt als die Referenzspannung. Sonst würde dieser zerstört werden. Die Referenzspannung ist also gleich der maximal zu messenden Spannung. Um einzustellen welche Referenzspannung verwendet werden soll, gibt es den Register ADMUX. Folgende Quellen sind als Referenzspannung möglich:&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''Referenzspannungsquelle'''&lt;br /&gt;
 |AREF, internes Vref deaktiviert&lt;br /&gt;
 |AVCC mit externen Kondensator am AREF Pin&lt;br /&gt;
 |Keine Funktion, reserviert&lt;br /&gt;
 |Interne 2,56V Spannungsreferenz mit externen Kondensator am AREF Pin&lt;br /&gt;
 |}&lt;br /&gt;
Siehe bitte die Registerübersicht. Dort steht genauer wie man den Register einzustellen hat.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Man benötigt die Referenzspannung auch (oder besserer deren analoge Größe) um den Wert den der ADC zurückgibt in V umzurechnen. Um den zurückgegebenen Wert des ADC umzuwandel geht man so vor:&amp;lt;br&amp;gt;&lt;br /&gt;
# Bestimmen der Auflösung des ADC. Bei den ATMegas normalerweiße 10 Bit. 10 Bit entsprechen einer Stufung von 1024.&lt;br /&gt;
# Ermitteln des digitalen Werts der analogen Größe. In der Beispielrechnung verwende ich den Wert 592.&lt;br /&gt;
# Größe der Referenzspannung. In der Beispielrechnung wird 5V verwendet.&lt;br /&gt;
Mit diesen Werten kann folgende Berechnung ausführen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;V = 592 * 5V&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;V = 2960 / 1024 = \underline {\underline { 2{,}9V }}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Programmbeispiele ===&lt;br /&gt;
'''C/C++'''&amp;lt;br&amp;gt;&lt;br /&gt;
Dieses Beispiel ist für die [[Atmel Controller Mega16 und Mega32]] gedacht, die mit einer Taktfrequenz von 8 MHz laufen. Es ist unbedingt darauf zu achten nicht die Referenzspannung von 2,56V zu überschreiten! Sonst stirbt der Port. Je nach Einsatzart muss man das Beispielprogramm entsprechend abändern (also diese Zeile mit ADMUX |= (1&amp;lt;&amp;lt;REFS1) | (1&amp;lt;&amp;lt;REFS0);).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;inttypes.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
uint16_t readADC(uint8_t channel) {&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
	uint16_t result = 0;&lt;br /&gt;
	&lt;br /&gt;
	// Den ADC aktivieren und Teilungsfaktor auf 64 stellen&lt;br /&gt;
	ADCSRA = (1&amp;lt;&amp;lt;ADEN) | (1&amp;lt;&amp;lt;ADPS2) | (1&amp;lt;&amp;lt;ADPS1);&lt;br /&gt;
&lt;br /&gt;
	// Kanal des Multiplexers waehlen&lt;br /&gt;
	ADMUX = channel;&lt;br /&gt;
	// Interne Referenzspannung verwenden (also 2,56 V)&lt;br /&gt;
	ADMUX |= (1&amp;lt;&amp;lt;REFS1) | (1&amp;lt;&amp;lt;REFS0);&lt;br /&gt;
	&lt;br /&gt;
	// Den ADC initialisieren und einen sog. Dummyreadout machen&lt;br /&gt;
	ADCSRA |= (1&amp;lt;&amp;lt;ADSC);&lt;br /&gt;
	while(ADCSRA &amp;amp; (1&amp;lt;&amp;lt;ADSC));&lt;br /&gt;
	&lt;br /&gt;
	// Jetzt 3x die analoge Spannung and Kanal channel auslesen&lt;br /&gt;
	// und dann Durchschnittswert ausrechnen.&lt;br /&gt;
	for(i=0; i&amp;lt;3; i++) {&lt;br /&gt;
		// Eine Wandlung&lt;br /&gt;
		ADCSRA |= (1&amp;lt;&amp;lt;ADSC);&lt;br /&gt;
		// Auf Ergebnis warten...&lt;br /&gt;
		while(ADCSRA &amp;amp; (1&amp;lt;&amp;lt;ADSC));&lt;br /&gt;
		&lt;br /&gt;
		result += ADCW;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// ADC wieder deaktivieren&lt;br /&gt;
	ADCSRA &amp;amp;= ~(1&amp;lt;&amp;lt;ADEN);&lt;br /&gt;
	&lt;br /&gt;
	result /= 3;&lt;br /&gt;
	&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
	uint16_t result = readADC(0);	//Auslesen der analogen Spannungen an Pin 0,&lt;br /&gt;
					// also ADC0. In result steht das Ergebnis.&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Bascom'''&amp;lt;br&amp;gt;&lt;br /&gt;
Dieses Programmbeispiel ist für die [[Atmel Controller Mega16 und Mega32]] gedacht. Es gibt nacheinander die Spannungen der einzelnen Kanäle (ADC0..7) aus. Dazwischen macht es immer 800 ms pause.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
' Die gemessene Spannung wird in der Variablen W gespeichert.&lt;br /&gt;
' Channel ist der Pin, an dem die Spannung gemessen werden soll.&lt;br /&gt;
&lt;br /&gt;
$baud = 9600&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
$regfile &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
Config Adc = Single , Prescaler = Auto&lt;br /&gt;
Start Adc&lt;br /&gt;
Dim W As Word , Channel As Byte&lt;br /&gt;
Channel = 0&lt;br /&gt;
Do&lt;br /&gt;
  W = Getadc(channel)&lt;br /&gt;
  Print &amp;quot;ADC-Pin &amp;quot; ; Channel ; &amp;quot;: Wert &amp;quot; ; W&lt;br /&gt;
  Incr Channel&lt;br /&gt;
  If Channel &amp;gt; 7 Then Channel = 0&lt;br /&gt;
  Waitms 800&lt;br /&gt;
Loop&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Registerübersicht ===&lt;br /&gt;
'''Hinweis:''' Diese Registertabelle wurde für den aktuellen [[Atmel Controller Mega16 und Mega32]] erstellt. Wenn Sie ein anderes Modell verwenden kann es sein, dass ein oder mehrere Register nicht existieren, oder sie eine andere Bezeichnung haben.&lt;br /&gt;
&lt;br /&gt;
{| {{Blaueschmaltabelle}} width=100%&lt;br /&gt;
 |'''ADCSRA (ADC Control and Status Register A)'''&lt;br /&gt;
 |-&lt;br /&gt;
 |Dieser Register dient dazu den ADC zu kontrollieren.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Registertabelle8Bit|ADEN|ADSC|ADATE|ADIF|ADIE|ADPS2|ADPS1|ADPS0}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
*'''ADEN (ADC Enable)'''&amp;lt;br/&amp;gt;Wird dieses Bit gesetzt (also 1), dann wird der ADC aktiviert. Schreibt man eine 0 wird der ADC deaktiert. Wird der ADC während einer Wandlung deaktiviert, wird die Wandlung abgebrochen.&lt;br /&gt;
*'''ADSC (ADC Start Conversion)'''&amp;lt;br/&amp;gt;Dieses Bit startet den Messvorgang, je nachdem in welchem Betriebsmodi der ADC läuft. Wird dieses Bit nach der Aktivierung des ADC über '''ADEN''' zum ersten Mal gesetzt, wird der ADC erst eine Initialisierungswandlung durchführen und danach erst die eigentliche Wandlung. Das Schreiben einer 0 auf das Bit hat keinen Effekt.&lt;br /&gt;
*'''ADATE (ADC Auto Trigger Enable)'''&amp;lt;br/&amp;gt;Wird dieses Bit gesetzt, wird das Auto Triggering des ADC aktiviert.&lt;br /&gt;
*'''ADIF (ADC Interrupt Flag)'''&amp;lt;br/&amp;gt;Dieses Bit wird auf 1 gesetzt, wenn eine Wandlung erfolgte und das Ergebnis nun verfügbar ist. Der ADC Complete Interrupt wird ausgelöst, wenn das '''ADIE'''-Bit gesetzt ist und die Interrupts global aktiviert sind. Das Bit wird gelöscht, wenn die entsprechende ISR abgearbeitet wird. Alternativ kann man es löschen, indem man eine 1 auf das Bit schreibt.&lt;br /&gt;
*'''ADIE (ADC Interrupt Enable)'''&amp;lt;br/&amp;gt;Wird dieses Bit gesetzt und die globalen Interrupts sind aktiviert, wird der ADC Complete Interrupt aktiviert, auf den man dann in der entsprechenden ISR reagieren kann.&lt;br /&gt;
*'''ADPS2 (ADC Prescaler Select Bit 2)'''&amp;lt;br/&amp;gt;Diese Bits bestimmen den Teilungsfaktor zwischen der XTAL-Frequenz (also der Taktfrequenz) und dem Eingangstakt des ADC. Zum Wandeln benötigt der ADC einen eigenen Takt, der auf der Taktfrequenz des Mikrocontrollers basiert. Allerdings ist die Taktfrequenz zu schnell und deswegen wird diese durch den Vorteiler verkleinert. Der resultierende Takt muss zwischen 50kHz und 200kHz liegen. Siehe [[Avr#Teilungsfaktor]]. Folgende Teilungsfaktoren sind verfügbar:&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''ADPS2'''&lt;br /&gt;
 |'''ADPS1'''&lt;br /&gt;
 |'''ADPS0'''&lt;br /&gt;
 |'''Teilungsfaktor'''&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |2&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |2&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |4&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |8&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |16&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |32&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |64&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |128&lt;br /&gt;
 |}&lt;br /&gt;
*'''ADPS1 (ADC Prescaler Select Bit 1)'''&amp;lt;br/&amp;gt;Siehe '''ADPS2''' für eine Beschreibung.&lt;br /&gt;
*'''ADPS0 (ADC Prescaler Select Bit 0)'''&amp;lt;br/&amp;gt;Siehe '''ADPS2''' für eine Beschreibung.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| {{Blaueschmaltabelle}} width=100%&lt;br /&gt;
 |'''ADMUX (ADC Multiplexer Selection Register)'''&lt;br /&gt;
 |-&lt;br /&gt;
 |Mit diesem Register wird der Multiplexer gesteuert.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Registertabelle8Bit|REFS1|REFS0|ADLAR|MUX4|MUX3|MUX2|MUX1|MUX0}}&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
*'''REFS1 (Reference Selection Bit 1)'''&amp;lt;br/&amp;gt;Mit diesem Bit kann steuern, welche Referenzspannung der ADC verwenden soll. Die möglichen Quellen sind unten aufgelistet. Wird während einer Wandlung die Quelle für die Referenzspannung geändert, wird die aktuelle Wandlung mit der &amp;quot;alten&amp;quot; Quellen zuerste beendet, bevor die neue Einstellung übernommen wird.&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''REFS1'''&lt;br /&gt;
 |'''REFS0'''&lt;br /&gt;
 |'''Referenzspannungsquelle'''&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |AREF, internes Vref deaktiviert&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |1&lt;br /&gt;
 |AVCC mit externen Kondensator am AREF Pin&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |0&lt;br /&gt;
 |Keine Funktion, reserviert&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |1&lt;br /&gt;
 |Interne 2,56V Spannungsreferenz mit externen Kondensator am AREF Pin&lt;br /&gt;
 |}&lt;br /&gt;
*'''REFS0 (ADC Start Conversion)'''&amp;lt;br/&amp;gt;Siehe '''REFS1'''.&lt;br /&gt;
*'''ADLAR (ADC Left Adjust Result)'''&amp;lt;br/&amp;gt;Dieses Bit beeinflusst, wie der ermittelte Messwert im ADC Data Register abgelegt wird.&lt;br /&gt;
*'''MUX4 (Analog Channel and Gain Selection Bit 4)'''&amp;lt;br/&amp;gt;Dieses Bit wird auf 1 gesetzt, wenn eine Wandlung erfolgte und das Ergebnis nun verfügbar ist. Der ADC Complete Interrupt wird ausgelöst, wenn das '''ADIE'''-Bit gesetzt ist und die Interrupts global aktiviert sind. Das Bit wird gelöscht, wenn die entsprechende ISR abgearbeitet wird. Alternativ kann man es löschen, indem man eine 1 auf das Bit schreibt.&lt;br /&gt;
*'''MUX3 (Analog Channel and Gain Selection Bit 3)'''&amp;lt;br/&amp;gt;Mit diesen Bits ('''MUX3''' bis '''MUX0''') wird der Kanal des Multiplexers eingestellt, der mit dem ADC verbunden ist.&amp;lt;br&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''MUX4..0'''&lt;br /&gt;
 |'''Pin'''&lt;br /&gt;
|-&lt;br /&gt;
 |00000&lt;br /&gt;
 |ADC0&lt;br /&gt;
|-&lt;br /&gt;
 |00001&lt;br /&gt;
 |ADC1&lt;br /&gt;
|-&lt;br /&gt;
 |00010&lt;br /&gt;
 |ADC2&lt;br /&gt;
|-&lt;br /&gt;
 |00011&lt;br /&gt;
 |ADC3&lt;br /&gt;
|-&lt;br /&gt;
 |00100&lt;br /&gt;
 |ADC4&lt;br /&gt;
|-&lt;br /&gt;
 |00101&lt;br /&gt;
 |ADC5&lt;br /&gt;
|-&lt;br /&gt;
 |00110&lt;br /&gt;
 |ADC6&lt;br /&gt;
|-&lt;br /&gt;
 |00111&lt;br /&gt;
 |ADC7&lt;br /&gt;
 |}&lt;br /&gt;
Es reicht also einfach die Pinnummer in ADMUX zu schreiben.&lt;br /&gt;
*'''MUX2 (Analog Channel and Gain Selection Bit 2)'''&amp;lt;br/&amp;gt;Siehe '''MUX3''' für eine Beschreibung.&lt;br /&gt;
*'''MUX1 (Analog Channel and Gain Selection Bit 1)'''&amp;lt;br/&amp;gt;Siehe '''MUX3''' für eine Beschreibung.&lt;br /&gt;
*'''MUX0 (Analog Channel and Gain Selection Bit 0)'''&amp;lt;br/&amp;gt;Siehe '''MUX3''' für eine Beschreibung.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Des Weiteren gibt es noch den Register '''ADCL/ADCH''' in dem das Ergebnis einer Wandlung steht. Man liest den Wert folgendermaßen aus:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uint16_t x = ADCL;&lt;br /&gt;
x += (ADCH&amp;lt;&amp;lt;8);&lt;br /&gt;
// oder&lt;br /&gt;
x = ADCW;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Die Fusebits==&lt;br /&gt;
Fusebits nennt man bestimmte Bits zur Konfigurierung eines AVR-Controllers. Bei der Auslieferung neuer AVR Controller sind die Fusebits bereits vorkonfiguriert. In vielen Fällen kann man die Konfiguration unverändert belassen, je nach Controllertyp. Bei den Typen Mega xxx bestimmen einige Fusebits beispielsweise, dass der interne Taktgeber aktiviert ist. Möchte man dagegen einen externen Quarz anschließen oder die Taktfrequenz ändern, so müssen auch die Fusebits geändert werden. Auch das Deaktivieren des &amp;quot;[[On Chip Debugging]]&amp;quot; Modus ist oft notwendig, wenn man alle Ports ausnutzen möchte. &lt;br /&gt;
&lt;br /&gt;
Die Fusebits werden in der Regel über die Software eingestellt, welche auch für das Übertragen des Programmcodes zuständig ist. Besonders einfach geht dies beispielsweise mit der Entwicklungsumgebung [[Bascom]]. Aber auch andere Programme wie [[PonyProg]] können für die Umstellung der Fusebits genutzt werden. Einmal eingestellte Fusebits bleiben bis zur erneuten Fusebit-Änderung erhalten. Der normale Programmiermodus verändert die Fusebits nicht. &lt;br /&gt;
&lt;br /&gt;
Je nach AVR Controllertyp sind unterschiedliche Fusebits (Einstellungen) vorhanden. Die genaue Beschreibung findet man im jeweiligen Datenblatt. Da aber falsch gesetzte Fusebit-Einstellungen zu den häufigsten Problemen gehören, liste ich hier die Funktion der üblichen Fusebits nochmals genauer auf:&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |'''CKSEL0, CKSEL1, CKSEL2, CKSEL3'''&lt;br /&gt;
 |Die Kombination dieser 4 Fusebits bestimmt die Taktquelle des Controllers. Das kann eine interner Taktgenerator, ein Quarz, Quarzoszillator, RC-Glied und ähnliches sein.&lt;br /&gt;
|-&lt;br /&gt;
 |'''JTAGEN'''&lt;br /&gt;
 |Hiermit wird die &amp;quot;[[On Chip Debugging]]&amp;quot; Schnittstelle aktiviert bzw. deaktiviert. Das sind die Bits mit den Bezeichnungen TDI, TDO, TMS und TCK. Möchte man diese Pins als normalen Port nutzen, so muss diese Schnittstelle immer deaktiviert werden. &lt;br /&gt;
|-&lt;br /&gt;
 |'''SUT0, SUT1'''&lt;br /&gt;
 |Die sogenannte StartUp-Zeit (PowerOn delay). Diese Einstellung muss abhängig von der Art des Taktgenerators eingestellt werden, genaueres im jeweiligen Datenblatt. &lt;br /&gt;
|-&lt;br /&gt;
 |'''SPIEN'''&lt;br /&gt;
 |Hiermit kann die serielle [[AVR-ISP Programmierkabel|ISP-Programmierung]], welche die meisten Programmierkabel nutzen, deaktiviert werden. Dies sollte man lieber vermeiden, denn wenn dieser Programmiermodus deaktiviert wurde, kann nur noch der Parallel-Programmiermodus genutzt werden. Der Parallel-Programmiermodus benötigt jedoch ein spezielles Programmiergerät, das die wenigsten Bastler besitzen. ''Also Vorsicht!''&lt;br /&gt;
|-&lt;br /&gt;
 |'''BODEN'''&lt;br /&gt;
 |Über dieses Bit wird der '''Brown-out Detector''' aktiviert bzw. deaktiviert. Dies ist eine Überwachung der Betriebsspannung. Diese Überwachung soll dafür sorgen, dass bei Spannungseinbrüchen ein ordentlicher RESET durchgeführt wird. Dadurch wird verhindert, dass ein Controller in einen undefinierten Zustand gerät (hängen bleibt).&lt;br /&gt;
|-&lt;br /&gt;
 |'''BOOTLEVEL'''&lt;br /&gt;
 |Über dieses  Bit kann die Spannung festgelegt werden, ab welcher der '''Brown-out Detector''' den Controller neu startet (also RESET ausführt). &lt;br /&gt;
|-&lt;br /&gt;
 |'''BOOTRST'''&lt;br /&gt;
 |Gewöhnlich startet ein Programm im Controller nach einem RESET ab Adresse 0. Durch dieses Fusebit kann der Controller jedoch veranlasst werden, nach einem Reset einen sogenannten Bootloader-Bereich auszuführen. Ein [[Bootloader]] kann genutzt werden, um Controller über andere Schnittstellen (z.B. RS232) zu programmieren.&lt;br /&gt;
|-&lt;br /&gt;
 |'''BOOTSZ0, BOOTSZ1'''&lt;br /&gt;
 |Der zuvor genannte Bootloaderbereich kann bei AVR-Controllern verschieden groß sein. Über diese beiden Bits können vier verschiedene Größen eingestellt werden. Siehe unter [[Bootloader]].&lt;br /&gt;
|-&lt;br /&gt;
 |'''EESAVE'''&lt;br /&gt;
 |Dieses Bit legt fest, ob beim Programmieren des Controllers (man nennt es auch brennen) immer das EEPROM gelöscht werden soll.&lt;br /&gt;
|-&lt;br /&gt;
 |'''CKOPT'''&lt;br /&gt;
 |Abhängig von den Einstellungen von CKSEL kann hier dir Oszillator-Verstärkung eingestellt werden. Genaueres im Datenblatt des jeweiligen Controllers.&lt;br /&gt;
|-&lt;br /&gt;
 |'''WDTON'''&lt;br /&gt;
 |Schaltet den WatchDog-Timer beim Booten ein/aus. Dies ist auch per Software möglich&lt;br /&gt;
|-&lt;br /&gt;
 |'''RSTDISBL'''&lt;br /&gt;
 |Durch dieses Bit kann man den RESET-Pin deaktivieren und dann als normalen I/O-Port nutzen. Aber Vorsicht! Da die RESET-Leitung beim Programmieren (Brennen) des Chips genutzt wird, kann man nach dessen Deaktivierung den Controller mit den üblichen [[AVR-ISP Programmierkabel|ISP-Adaptern]] nicht mehr programmieren. In diesem Fall könnte man zwar den Controlle noch mit speziellen Programmiergeräten im Parallelmodus programmieren, aber in der Praxis verfügen nur wenige Bastler über ein Programmiergerät, das dies leistet.&lt;br /&gt;
|-&lt;br /&gt;
 |'''LB1, LB2'''&lt;br /&gt;
 |Das sind die sogenannten Lockbits, mit denen sich das Auslesen des Flash- als auch EEPROM-Speichers verhindern läßt. Zwar können andere Anwender immer noch Daten lesen, allerdings handelt es sich dabei nicht mehr um den wirklichen Inhalt sondern lediglich um wirre Datenbytefolgen. Programmierer, die den erarbeiteten Code vor Raubkopierern schützen wollen, nutzen diese Lockbits. Das Programmieren ist auch bei gesetzen Lockbits noch möglich. Der Bootloader-Bereich wird nicht durch die Lockbits geschützt.&lt;br /&gt;
|-&lt;br /&gt;
 |'''BLB01, BLB02'''&lt;br /&gt;
 |Durch diese Bits kann der Code sogar vor dem Zugriff durch den Bootloader geschützt werden&lt;br /&gt;
|-&lt;br /&gt;
 |'''BLB11, BLB12'''&lt;br /&gt;
 |Diese Bits schützen den Bootloaderbereich selbst&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wie man die Fusebits mit [[Bascom]] einstellt, wird im Beitrag [[Bascom - Erstes Programm in den AVR Controller übertragen]] erläutert.&lt;br /&gt;
&lt;br /&gt;
''Autoren des Artikels: Frank, Luma'' &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Atmel]]&lt;br /&gt;
* [[AVR-Einstieg leicht gemacht]]&lt;br /&gt;
* [[Avr-gcc|avr-gcc]] - Leistungsfähiger AVR-Port des freien Compilers GCC&lt;br /&gt;
* [[WinAVR]] - Ein freies Werkzeugpaket auf Basis avr-gcc für die Windows-Platform, integriert unter anderem das [[Programmer's Notepad]]&lt;br /&gt;
* [[AVR_Assembler_Einf%C3%BChrung|AVR Assembler Einführung (AvrStudio)]]&lt;br /&gt;
* [[AVR-ISP Programmierkabel]] - Bauanleitung für die AVR Controller Programmierkabel&lt;br /&gt;
* [[RN-Control]] - Eines der beliebtestet AVR-Boards im Roboternetz&lt;br /&gt;
* [[RNBFRA-Board]] - Größeres Board mit zwei Atmel Controllern&lt;br /&gt;
* [[Bascom]] - Sehr gutes Basic-Entwicklungssystem&lt;br /&gt;
* [[Bascom - Erstes Programm in den AVR Controller übertragen]]&lt;br /&gt;
* [[On Chip Debugging]]&lt;br /&gt;
* [[Bootloader]]&lt;br /&gt;
* [[Timer]]&lt;br /&gt;
* [[TWI]] - I2C beim AVR&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
* [http://www.atmel.com/dyn/products/param_table.asp?family_id=607&amp;amp;OrderBy=part_no&amp;amp;Direction=ASC Aktuelle AVR Vergleichstabelle]&lt;br /&gt;
* [http://www.atmel.com/dyn/products/devices.asp?family_id=607 Die Datenblätter zu Atmel Controllern]&lt;br /&gt;
* [https://mpg.dnsalias.com/~magerlu/rn-wiki/avrtimer_applet Java Applet Timer Berechnung]&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/dload.php?action=file&amp;amp;file_id=169 AvrTimer Windows Berechnungstool]&lt;br /&gt;
* [http://people.freenet.de/gjl/helferlein/avr-uart-rechner.html AVR-Baudraten-Rechner (JavaScript)]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Abkürzung|AVR]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Timer&amp;diff=7175</id>
		<title>Timer</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Timer&amp;diff=7175"/>
				<updated>2006-05-04T21:18:22Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: Name geändert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein '''Timer''' (von engl. ''time'' für Zeit) ist ein Zeitgeber. Er kann dazu verwendet werden, Zeitspannen zu messen oder Zeitspannen bestimmter Länge zu erzeugen bzw. Spannungspulse bestimmter Längen zu erzeugen. Timer gibt es in unterschiedlichen Ausprägungen:&lt;br /&gt;
;Timer-IC: Timer-ICs wie NE555 sind integrierte Schaltkreise. Je nach Beschaltung können sie als Monoflop, astabiler Multivibrator, spannungsabhängiger Oszillator, etc verschaltet werden&lt;br /&gt;
;Timer in [[Microcontroller|Mikrocontrollern]]: Praktisch jeder Mikrocontroller verfügt über Zähler, die als Timer verwenbar sind. In festgelegten Zeitabständen wird der Zähler erniedrigt/erhöht und löst beim Erreichen einstellbarer Zählerwerte bestimmte Ereignisse aus wie: [[Interrupt]] auslösen, Ausgangs-Port umschalten ([[PWM]]), etc. Die Taktung dieser Zähler ist oft einstellbar durch programmierbare Vorteiler (prescaler) oder eine PLL (phase locked loop). Typische Timerauflösungen sind 8, 16, bzw 24 Bit, was einer Auflösung von 256, 65536 bzw. 16777216 Schritten entspricht. Aber auch andere Auflösungen sind nicht unüblich. Zusätzlich bieten viele Timer die Möglichkeit, durch externe Signale getaktet zu werden und sind so als Pulszähler einsetzbar, oder bieten über Capture-Compare Einheiten ein Werkzeug für sehr genaue Zeitmessungen. Mitunter besteht die Möglichkeit, Timer zu verketten und damit die Auflösung zu erhöhen, oder die Einzeltimer eines Timer-Arrays können kaskadiert werden, um komplexe Wellenformen wie eine drei-Phasen-PWM zu erzeugen.&lt;br /&gt;
;Timer in Software: Auch sie dienen dazu, Timeouts festzulegen oder Ereignisse in einem bestimmten Zeitraster auszuführen. Man findet sie in vielen Betriebssystemen als Systemtimer und -funktionen, oder sie werden durch eine API zur Verfügung gestellt wie die Java-Klasse &amp;lt;tt&amp;gt;Timer&amp;lt;/tt&amp;gt; aus dem Paket &amp;lt;tt&amp;gt;java.util&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Einsatzmöglichkeiten sind u.a.:&lt;br /&gt;
* Eine [[Diode#Lumineszenzdiode|LED]] blinken zu lassen.&lt;br /&gt;
* Einen Controller für eine bestimmte Zeitspanne warten zu lassen (Uhr).&lt;br /&gt;
* Das genaue Messen einer Zeitspanne zwischen zwei oder mehreren Signalen.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Avr#Timer/Counter|Timer/Counter der AVRs]]&lt;br /&gt;
* [[Bascom und Timer]]&lt;br /&gt;
* [[Hallo Welt für AVR (LED blinken)|C-Code Beispiel für eine blinkende LED]]&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Luma|Luma]] 13:52, 10. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=DAC&amp;diff=7173</id>
		<title>DAC</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=DAC&amp;diff=7173"/>
				<updated>2006-05-04T16:43:56Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein Digital-Analog-Wandler (manchmal auch Digital-Analog-Umsetzer genannt), kurz DAC, wandelt digitale Werte in analoge Signale um. Er ist damit das Gegenstück zum [[ADC]].&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Diskussion:DAC&amp;diff=7172</id>
		<title>Diskussion:DAC</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Diskussion:DAC&amp;diff=7172"/>
				<updated>2006-05-04T16:43:39Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der Artikel ist etwas kurz, ich weiß. Ich habe ihn nur wegen der Vollständigkeit eingetragen.&amp;lt;br&amp;gt;&lt;br /&gt;
Luma&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=ADC&amp;diff=7171</id>
		<title>ADC</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=ADC&amp;diff=7171"/>
				<updated>2006-05-04T16:42:27Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: DAC | Allgemeine Verbesserungen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Abkürzung des englischen Begriffs '''Analog to Digital Converter''', im deutschen Sprachgebrauch '''A/D-Wandler''' (Analog nach Digital Wandler) oder '''A/D-Umsetzer''' genannt.&lt;br /&gt;
__NOTOC__&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
&lt;br /&gt;
Da es in der digitalen Welt nur zwei Zustände gibt um Informationen darzustellen, benötigt man einen A/D-Wandler um analoge Größen in digitale Werte umzuwandeln. Er ist somit das Gegenteil zum [[DAC]] (Digital-Analog-Wandler) der digitale Werte in analoge Größen wandelt.&lt;br /&gt;
&lt;br /&gt;
;Merkmale eines A/D-Wandlers&lt;br /&gt;
* Auflösung in Bit&lt;br /&gt;
* Geschwindigkeit der Umwandlung&lt;br /&gt;
* Spannungsbereich in dem Gemessen werden kann&lt;br /&gt;
* Größe der Referenzspannung&lt;br /&gt;
* Wiederholgenauigkeit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In der Regel werden verschieden hohe Spannungen analysiert und je nach Genauigkeit des Wandlers (Auflösung) ein entsprechender Wert als Zahl zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
;Beispiel der Auflösung eines Wandlers&lt;br /&gt;
Liegt der Messbereich zwischen 0V und 5V, bei einer Genauigkeit von 8 Bit, und einer Referenzspannung von ebenfalls 5V, so ergibt der analoge Wert von 0V am Eingang den digitalen Wert 0. Entsprechend 5V am Eingang den Wert 255. Der kleinste messbare Spannungsunterschied liegt so bei ca. 0,02 Volt. Bei einer Auflösung von 10 Bit verringert sich dieser Wert schon auf etwa 0,005 Volt, also 4mal genauer weil 2 Bit mehr Auflösung.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Beispielgeräte mit integriertem A/D-Wandler&lt;br /&gt;
* Soundkarten&lt;br /&gt;
* ISDN-Telefone&lt;br /&gt;
* DVD-Brenner&lt;br /&gt;
* Scanner&lt;br /&gt;
* Fax-Geräte&lt;br /&gt;
* TV- und Videokarten&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In vielen [[Microcontroller|Microcontrollern]] sind A/D-Wandler enthalten, meistens mit mehreren Eingängen und einer Genauigkeit von 8 bis 10 Bit. Es gibt aber auch eigenständige Bausteine (ICs) die es mit einer Vielzahl von verschiedenen Schnittstellen gibt um an das digitale Ergebnis zu kommen, wie u.a. [[I2C]].&lt;br /&gt;
&lt;br /&gt;
== ADC des AVR ==&lt;br /&gt;
&lt;br /&gt;
In den [[Atmel]] [[AVR]]s wird das Funktionisprinzip der ''Sukzessiven Approximation''&lt;br /&gt;
[http://de.wikipedia.org/wiki/Analog-digital-Umsetzer#Sukzessive_Approximation] &lt;br /&gt;
angewandt. Bei einer Auflösung von 10 Bit und einer Frequenz von max. 200kHz. Daraus ergibt sich eine Samplingrate von etwa 15kHz. Eine höhere Frequenz (bis zu 1MHz) ist zwar möglich, resultiert aber in einer Verringerung der Genauigkeit.&lt;br /&gt;
&lt;br /&gt;
== AVR ATMega32 Programmierbeispiel ==&lt;br /&gt;
&lt;br /&gt;
Das Programm misst die Spannung am ersten ADC Pin des Mikrocontrollers und gibt sie über ein Terminal aus.&lt;br /&gt;
Dann wartet es 800ms und gibt die Spannung am zweiten Pin aus, wartet wieder 800ms, usw.&lt;br /&gt;
 &lt;br /&gt;
 $baud = 9600&lt;br /&gt;
 $crystal = 1000000&lt;br /&gt;
 $regfile &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
 Config Adc = Single , Prescaler = Auto&lt;br /&gt;
 Start Adc&lt;br /&gt;
 Dim W As Word , Channel As Byte&lt;br /&gt;
 Channel = 0&lt;br /&gt;
 Do&lt;br /&gt;
   W = Getadc(channel)&lt;br /&gt;
   Print &amp;quot;ADC-Pin &amp;quot; ; Channel ; &amp;quot;: Wert &amp;quot; ; W&lt;br /&gt;
   Incr Channel&lt;br /&gt;
   If Channel &amp;gt; 7 Then Channel = 0&lt;br /&gt;
   Waitms 800&lt;br /&gt;
 Loop&lt;br /&gt;
 End &lt;br /&gt;
&lt;br /&gt;
Die gemessene Spannung wird in der Variablen W gespeichert.&lt;br /&gt;
Channel ist der Pin, an dem die Spannung gemessen werden soll.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
*[http://de.wikipedia.org/wiki/Analog-digital-Umsetzer Analog-digital-Umsetzer] - hier wird genauer erklärt wie ein AD-Wandler funktioniert, und welche Funktionsprinzipen es gibt.&lt;br /&gt;
*[http://www.sprut.de/electronic/referenz/index.htm] - Informationen über Referenzspannungsquellen&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Abkürzung]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Sensoren]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=DAC&amp;diff=7170</id>
		<title>DAC</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=DAC&amp;diff=7170"/>
				<updated>2006-05-04T16:42:08Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein Digital-Analog-Wandler, kurz DAC (manchmal auch Digital-Analog-Umsetzer genannt), wandelt digitale Werte in analoge Signale um. Er ist damit das Gegenstück zum [[ADC]].&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=WinAVR&amp;diff=7107</id>
		<title>WinAVR</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=WinAVR&amp;diff=7107"/>
				<updated>2006-04-30T18:13:21Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: /* Weblinks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;WinAVR ist ein Paket für die C-Programmierung von [[AVR]]-Controllern. genauer gesagt ist es eine Portierung des beliebten Open Source Compilers [[avr-gcc]]. &lt;br /&gt;
Das Paket beinhaltet neben dem GCC-Compiler (Cross Compiler) noch Linker, Editor, Standard Libarys und viele kleinere Tools. Die Installation erfolgt jedoch unter Windows bequem über ein einziges SETUP-Programm. Der Vorteil dieses Paketes ist also die einfache Installation. &lt;br /&gt;
&lt;br /&gt;
=Tools in WinAVR=&lt;br /&gt;
&lt;br /&gt;
* [[avr-gcc]] &amp;amp;ndash; der C Compiler &lt;br /&gt;
* Binutils:&lt;br /&gt;
** Assembler: &amp;lt;tt&amp;gt;avr-as&amp;lt;/tt&amp;gt;&lt;br /&gt;
** Linker: &amp;lt;tt&amp;gt;avr-ld&amp;lt;/tt&amp;gt;&lt;br /&gt;
** Tools: &amp;lt;tt&amp;gt;avr-size&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;avr-objdump&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;avr-objcopy&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;avr-nm&amp;lt;/tt&amp;gt;, ...&lt;br /&gt;
* avr-libc  &amp;amp;ndash; Libary mit Standard Funktionen inclusive Dokumentation (pdf und HTML).&lt;br /&gt;
* Mfile &amp;amp;ndash; Tool zum Erstellen von Makefiles &lt;br /&gt;
* AVR Insight &amp;amp;ndash; Debugger &lt;br /&gt;
* Programmers Notepad - Editor mit Syntax Highlightning &lt;br /&gt;
* avrdude &amp;amp;ndash; Übertragungssoftware für Programmcode (verschiedene ISP Programmer)&lt;br /&gt;
* uisp &amp;amp;ndash; dito&lt;br /&gt;
* Demo-Projekte&lt;br /&gt;
** LED an PWM&lt;br /&gt;
** TWI&lt;br /&gt;
* viele Linux-Tools wie &amp;lt;tt&amp;gt;make&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;grep&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;sed&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;tar&amp;lt;/tt&amp;gt;, etc.&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
=Verzeichnisbaum=&lt;br /&gt;
&lt;br /&gt;
Ein Auszug:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.                               avr-gcc Installations-Verzeichnis&lt;br /&gt;
./avr/include                   Standard Includes &lt;br /&gt;
./avr/include/avr               Includes AVR-spezifisch &lt;br /&gt;
./avr/lib                       Startup-Code, Libs (avr2)&lt;br /&gt;
./avr/lib/avr3                            &amp;quot;        (avr3)&lt;br /&gt;
./avr/lib/avr4                            &amp;quot;        (avr4)&lt;br /&gt;
./avr/lib/avr5                            &amp;quot;        (avr5)&lt;br /&gt;
./avr/lib/ldscripts             Linker-Skripte&lt;br /&gt;
./bin                           Programme (avr-gcc.exe, giveio.sys, ...&lt;br /&gt;
./doc                           Doku (HTML + pdf)   &lt;br /&gt;
./doc/avr-libc                     avr-libc &lt;br /&gt;
./doc/avrdude-xxx                  avrdude&lt;br /&gt;
./doc/simulavr-xxx                 simulavr      &lt;br /&gt;
./doc/uisp-xxx                     uisp&lt;br /&gt;
./examples                      Beispiel-Projekte&lt;br /&gt;
./examples/demo                    PWM mit AT90S2313&lt;br /&gt;
./examples/twitest                 I2C mit ATMega&lt;br /&gt;
./info                          info pages&lt;br /&gt;
./man                           man pages&lt;br /&gt;
./mfile                         mfile&lt;br /&gt;
./pn                            Programmers Notepad&lt;br /&gt;
./utils/bin                     bzip2, diff, gawk, grep, make, sed, tar, ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
* [[C-Tutorial]]&lt;br /&gt;
* [[avr-gcc]]&lt;br /&gt;
* [[Sourcevergleich]]&lt;br /&gt;
* [[AVR]]&lt;br /&gt;
* [[Atmel]]&lt;br /&gt;
* [[Compiler]]&lt;br /&gt;
&lt;br /&gt;
=Weblinks=&lt;br /&gt;
* [http://winavr.sourceforge.net/ Offizielle Homepage des Projekts]&lt;br /&gt;
* [http://sourceforge.net/projects/winavr/ aktuellste Version über sourceforge.net]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]&lt;br /&gt;
[[Kategorie:Software]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Diskussion:Terminals&amp;diff=5633</id>
		<title>Diskussion:Terminals</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Diskussion:Terminals&amp;diff=5633"/>
				<updated>2006-01-26T14:06:56Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beim Ausbessern sollte man sich auf effektive Fehler beschränken. Darüber hinaus wirkt es schulmeisterlich, und das mag nicht jeder. Beistriche zwischen vollständigen Sätzen sind übrigens wahlfrei. &lt;br /&gt;
&lt;br /&gt;
--PicNick 14:13, 19. Jan 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
== Artikel Terminals und Terminalprogramme  zusammenfügen ==&lt;br /&gt;
&lt;br /&gt;
Hio. Wäre es nicht besser die zwei Artikel Terminals und Terminalprogramme in dem Artikel Terminals zusammenzufügen?&lt;br /&gt;
Lutz&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Im Prinzip wohl kein Problem. Die paar Zeilen &amp;quot;Terminalprogramme&amp;quot; könnt' man bei den Terminal ruhig dazuschreiben. Um die ev. Verlinkungen müßt' man sich kümmern &lt;br /&gt;
&lt;br /&gt;
--PicNick 15:55, 19. Jan 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
So, ich hab den [[Terminalprogramm]]-Artikel jetzt so geändert, dass man direkt auf diesen Artikel umgeleitet wird. Den Inhalt des Artikels hab ich in diese kopiert. Luma&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Terminalprogramm&amp;diff=5632</id>
		<title>Terminalprogramm</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Terminalprogramm&amp;diff=5632"/>
				<updated>2006-01-26T14:04:17Z</updated>
		
		<summary type="html">&lt;p&gt;Luma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Terminals#Terminalprogramme|Terminalprogramme]]&lt;/div&gt;</summary>
		<author><name>Luma</name></author>	</entry>

	</feed>