<?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=Ratzfatz</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=Ratzfatz"/>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Spezial:Beitr%C3%A4ge/Ratzfatz"/>
		<updated>2026-04-11T16:14:53Z</updated>
		<subtitle>Benutzerbeiträge</subtitle>
		<generator>MediaWiki 1.25.1</generator>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=LCD-Modul_am_AVR&amp;diff=14992</id>
		<title>LCD-Modul am AVR</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=LCD-Modul_am_AVR&amp;diff=14992"/>
				<updated>2009-06-12T13:12:38Z</updated>
		
		<summary type="html">&lt;p&gt;Ratzfatz: /* 4-Bit Ansteuerung mit Busy(I/O Mode) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:lcdmodul_2.jpg|right|thumb|350px|LCD-Modul]]&lt;br /&gt;
&lt;br /&gt;
==Einleitung==&lt;br /&gt;
&lt;br /&gt;
LCD ist eine Abkürzung und bedeutet '''''L'''iquid '''C'''rystal '''D'''isplay''. Übersetzt bedeutet dies Flüssigkristall-Anzeige. Flüssigkristalle sind organische Verbindungen, die Eigenschaften von Flüssigkeiten und Festkörpern besitzen. Zwischen zwei Glasplatten mit Polarisationsfiltern schwimmen die Flüssigkristalle. Durch Anlegen einer Wechselspannung ändert sich die Polarisationsebene der Flüssigkristalle und damit, ob das einfallende Licht reflektiert oder absorbiert wird.&lt;br /&gt;
&lt;br /&gt;
Bei einem LCD-Modul befindet sich neben dem LCD auch ein Controller zur Ansteuerung des LCDs.&lt;br /&gt;
&lt;br /&gt;
==Text-Displays==&lt;br /&gt;
&lt;br /&gt;
Text-Displays kommen wegen der problemlosen Anbindung in Mikrocontroller Projekten wie Robotern am häufigsten zum Einsatz. Bei Text-LCDs kommen meistens der HD44780 von Hitachi oder ein kompatibler Controller zum Einsatz. Dieser Controller unterstützt Displays mit bis zu 80 Zeichen. Gängige Displaygrößen sind: 8 &amp;amp;times; 1, 8 &amp;amp;times; 2, 16 &amp;amp;times; 1, 16 &amp;amp;times; 2, 20 &amp;amp;times; 2, 20 &amp;amp;times; 4, 40 &amp;amp;times; 2 Zeichen Displays (Spalten &amp;amp;times; Zeilen). Hat das Display mehr als 80 Zeichen, dann benötigt das Display 2 Controller und verhält sich nach außen zur  Ansteuerung, wie 2 Displays (zusätzliche Enable Leitung)     &lt;br /&gt;
&lt;br /&gt;
===Anschlußbelegung für &amp;amp;le;80 Zeichen Displays===&lt;br /&gt;
&lt;br /&gt;
Text-Displays verfügen über genormte 14 Anschluss Pins (LCD-Module mit Backlight über 16 Pins). Lediglich bei der Backlight Versorgungsspannung und Polung kann es Unterschiede geben. Im Zweifelsfall hilft hier der Blick ins Datenblatt. Entweder sind die Anschlüsse in einer Reihe (1 &amp;amp;times; 14(16)) oder zweireihig (2 &amp;amp;times; 7(8)) herausgeführt.&lt;br /&gt;
&lt;br /&gt;
{|{{Blauetabelle}} &lt;br /&gt;
|-{{Hintergrund1}}&lt;br /&gt;
|'''Pin'''&lt;br /&gt;
|'''Bezeichnung'''&lt;br /&gt;
|'''Beschreibung''' &lt;br /&gt;
|- &lt;br /&gt;
|1&lt;br /&gt;
|GND&lt;br /&gt;
|Masse&lt;br /&gt;
|---&lt;br /&gt;
|2 &lt;br /&gt;
|VCC&lt;br /&gt;
|Spannungsversorgung +5V&lt;br /&gt;
|---&lt;br /&gt;
|3&lt;br /&gt;
|VEE&lt;br /&gt;
|Kontrast Poti 0..0,5V&lt;br /&gt;
|--- &lt;br /&gt;
|4&lt;br /&gt;
|RS&lt;br /&gt;
|Register Select, 1=Daten schreiben / 0=Kommando senden.&lt;br /&gt;
|---  &lt;br /&gt;
|5&lt;br /&gt;
|R/W&lt;br /&gt;
|1=Read / 0=Write zum lesen / schreiben in das Display RAM &lt;br /&gt;
|---&lt;br /&gt;
|6&lt;br /&gt;
|Enable&lt;br /&gt;
|Fallende Flanke -&amp;gt; Übertragen des Kommandos oder der Daten, H-Pegel -&amp;gt; Lesen von Daten aus dem Display&lt;br /&gt;
|---&lt;br /&gt;
|7 &lt;br /&gt;
|DB0 &lt;br /&gt;
|Datenbus Bit0 LSB&lt;br /&gt;
|---&lt;br /&gt;
|8&lt;br /&gt;
|DB1&lt;br /&gt;
|Datenbus Bit1&lt;br /&gt;
|---&lt;br /&gt;
|9&lt;br /&gt;
|DB2&lt;br /&gt;
|Datenbus Bit2&lt;br /&gt;
|---&lt;br /&gt;
|10&lt;br /&gt;
|DB3&lt;br /&gt;
|Datenbus Bit3&lt;br /&gt;
|---&lt;br /&gt;
|11&lt;br /&gt;
|DB4&lt;br /&gt;
|Datenbus Bit4&lt;br /&gt;
|---&lt;br /&gt;
|12&lt;br /&gt;
|DB5&lt;br /&gt;
|Datenbus Bit5&lt;br /&gt;
|---&lt;br /&gt;
|13&lt;br /&gt;
|DB6&lt;br /&gt;
|Datenbus Bit6&lt;br /&gt;
|---&lt;br /&gt;
|14&lt;br /&gt;
|DB7&lt;br /&gt;
|Datenbus Bit7 MSB&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===HD44780 kompatibler LCD Controller===&lt;br /&gt;
&lt;br /&gt;
Der HD44780 LCD Controller besitzt 3 Speicher. Den DDRAM (Display Data RAM) Darin werden die anzuzeigenden Daten geschrieben.&lt;br /&gt;
Der CGROM (Character Generator ROM) enthält die Zeichen in Form von 5x8 oder 5x10 Punktmatrizen. &lt;br /&gt;
Im CGRAM (Character Generator RAM) können acht benutzerdefinierte Zeichen 5x8 Pixel oder vier 5x10 Pixel abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
====Befehlsübersicht==== &lt;br /&gt;
&lt;br /&gt;
{|{{Blauetabelle}} &lt;br /&gt;
|-{{Hintergrund1}} &lt;br /&gt;
|'''Befehl'''&lt;br /&gt;
| '''RS'''&lt;br /&gt;
| '''R/W'''&lt;br /&gt;
| '''DB7'''&lt;br /&gt;
| '''DB6'''&lt;br /&gt;
| '''DB5'''&lt;br /&gt;
| '''DB4'''&lt;br /&gt;
| '''DB3'''&lt;br /&gt;
| '''DB2'''&lt;br /&gt;
| '''DB1'''&lt;br /&gt;
| '''DB0'''&lt;br /&gt;
| '''Beschreibung'''&lt;br /&gt;
| '''Ausführungszeit bei f&amp;lt;sub&amp;gt;osc&amp;lt;/sub&amp;gt;=250kHz'''&lt;br /&gt;
|- &lt;br /&gt;
|Clear Display&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|Löscht das Display und setzt den Cursor auf den Anfang der 1. Zeile (Addresse 0).&lt;br /&gt;
|1.64mS&lt;br /&gt;
|- &lt;br /&gt;
|Cursor Home&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|*&lt;br /&gt;
|setzt den Cursor auf das Anfang der 1. Zeile (Addresse 0)&lt;br /&gt;
|1.64mS&lt;br /&gt;
|- &lt;br /&gt;
|Entry mode set&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|I/D&lt;br /&gt;
|S&lt;br /&gt;
|Setzt die Cursor Bewegungsrichtung (I/D), spezifiziert das Display zu schieben (S). Diese Operationen werden während des Daten lesen/schreiben durchgeführt.&lt;br /&gt;
|40uS&lt;br /&gt;
|- &lt;br /&gt;
|Display on/off Control&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|D&lt;br /&gt;
|C&lt;br /&gt;
|B&lt;br /&gt;
|Schaltet an/aus: das gesamte Display (D), Den Cursor (C) Cursor blinken (B).&lt;br /&gt;
|40uS&lt;br /&gt;
|- &lt;br /&gt;
|Cursor/Display shift&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|S/C&lt;br /&gt;
|R/L&lt;br /&gt;
|*&lt;br /&gt;
|*&lt;br /&gt;
|Setzt Cursor Bewegung oder Display Bewegung (S/C), Bewegungsrichtung (R/L)&lt;br /&gt;
|40uS&lt;br /&gt;
|- &lt;br /&gt;
|Function set&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|DL&lt;br /&gt;
|N&lt;br /&gt;
|F&lt;br /&gt;
|*&lt;br /&gt;
|*&lt;br /&gt;
|Einstellen der Schnittstellen Datenlänge (DL), Anzahl Display Zeilen (N) und Zeichen Font (F).&lt;br /&gt;
|40uS&lt;br /&gt;
|- &lt;br /&gt;
|Set CGRAM Address&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|colspan=6 |CGRAM Adresse&lt;br /&gt;
|Setzen der CGRAM Adresse. CGRAM Daten werden gesendet und empfangen nach dem setzen.&lt;br /&gt;
|40uS&lt;br /&gt;
|- &lt;br /&gt;
|Set DDRAM Address&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|colspan=7 |DDRAM Adresse&lt;br /&gt;
|Setzen der DDRAM Adresse. DDRAM Daten werden gesendet und empfangen nach dem setzen.&lt;br /&gt;
|40uS&lt;br /&gt;
|- &lt;br /&gt;
|Read busy-flag and address counter&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|BF&lt;br /&gt;
|colspan=7 |CGRAM / DDRAM Adresse&lt;br /&gt;
|Liest das Busy-flag (BF), welches anzeigt das interne Operationen ausgeführt werden, und liest den CGRAM oder DDRAM Adress Zeiger Inhalt.&lt;br /&gt;
|0uS&lt;br /&gt;
|- &lt;br /&gt;
|Write to CGRAM or DDRAM&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|colspan=8 |Schreib Daten&lt;br /&gt;
|Schreibt Daten zum CGRAM oder DDRAM.&lt;br /&gt;
|40uS&lt;br /&gt;
|- &lt;br /&gt;
|read from CGRAM or DDRAM&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|colspan=8 |Lese Daten&lt;br /&gt;
|Liest Daten vom CGRAM oder DDRAM.&lt;br /&gt;
|40uS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Anmerkungen:&lt;br /&gt;
* DDRAM = Display Data RAM.&lt;br /&gt;
* CGRAM = Character Generator RAM.&lt;br /&gt;
* DDRAM Adresse entspricht der Cursor Position.&lt;br /&gt;
* * = egal.&lt;br /&gt;
&lt;br /&gt;
{|{{Blauetabelle}} &lt;br /&gt;
|-{{Hintergrund1}} &lt;br /&gt;
|'''Bit Name'''&lt;br /&gt;
|'''Einstellung / Status'''&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|I/D&lt;br /&gt;
|0 = Erniedrige Cursor Position&lt;br /&gt;
|1 = Erhöhe Cursor Position&lt;br /&gt;
|- &lt;br /&gt;
|S&lt;br /&gt;
|0 = Display nicht schieben&lt;br /&gt;
|1 = Display schieben&lt;br /&gt;
|- &lt;br /&gt;
|D&lt;br /&gt;
|0 = Display aus&lt;br /&gt;
|1 = Display an&lt;br /&gt;
|- &lt;br /&gt;
|C&lt;br /&gt;
|0 = Cursor aus&lt;br /&gt;
|1 = Cursor an&lt;br /&gt;
|- &lt;br /&gt;
|B&lt;br /&gt;
|0 = Cursor blinken aus&lt;br /&gt;
|1 = Cursor blinken an&lt;br /&gt;
|- &lt;br /&gt;
|S/C&lt;br /&gt;
|0 = Bewege Cursor&lt;br /&gt;
|1 = Schiebe Display&lt;br /&gt;
|- &lt;br /&gt;
|R/L&lt;br /&gt;
|0 = Schiebe nach links&lt;br /&gt;
|1 = Schiebe nach rechts&lt;br /&gt;
|- &lt;br /&gt;
|DL&lt;br /&gt;
|0 = 4-bit Interface&lt;br /&gt;
|1 = 8-bit Interface&lt;br /&gt;
|- &lt;br /&gt;
|N&lt;br /&gt;
|0 = 1/8 oder 1/11 Duty (1 Zeile)&lt;br /&gt;
|1 = 1/16 Duty (2 Zeilen)&lt;br /&gt;
|- &lt;br /&gt;
|F&lt;br /&gt;
|0 = 5x7 Punkte&lt;br /&gt;
|1 = 5x10 Punkte&lt;br /&gt;
|- &lt;br /&gt;
|BF&lt;br /&gt;
|0 = Befehle werden akzeptiert &lt;br /&gt;
|1 = Interne Operation wird ausgeführt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===8-Bit Ansteuerung (Busmode)===&lt;br /&gt;
&lt;br /&gt;
Für die 8-Bit Busmode Ansteuerung funktioniert nur bei AVR Prozessoren mit externem Bus Interface. Diesen Mode unterstützen allerdings nur die wenigsten Atmel AVR Prozessoren, z.B. der AT90S8515 und ATmega128. Der Busmode empfiehlt sich, wenn man in der Applikation auch externen Speicher verwendet.&lt;br /&gt;
&lt;br /&gt;
[[Bild:lcdmodul_8bit_schem.png|center|thumb|600px|8-Bit Ansteuerung. Quelle: Peter Fleury]]&lt;br /&gt;
&lt;br /&gt;
====BASCOM-AVR Programm====&lt;br /&gt;
Das Programm zur Ansteuerung des Displays im 8-Bit Bus Mode.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $regfile = &amp;quot;8515def.dat&amp;quot;&lt;br /&gt;
 $crystal = 4000000&lt;br /&gt;
 $lcd = &amp;amp;HC000       'Adresse LCD Daten&lt;br /&gt;
 $lcdrs = &amp;amp;H8000     'Adresse LCD Register select&lt;br /&gt;
&lt;br /&gt;
 Config Lcdbus = 8   'LCD im 8-Bit Bus Mode&lt;br /&gt;
 Config Lcd = 16 * 2 'wir verwenden ein 16 x 2 Zeichen Display&lt;br /&gt;
&lt;br /&gt;
 Cls                 'loesche das LCD Display&lt;br /&gt;
 Locate 1 , 1        'Cursor auf 1 Zeile, 1 Spalte &lt;br /&gt;
 Lcd &amp;quot;Hello world.&amp;quot;  'String auf Display anzeigen&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====AVR-GCC Programm====&lt;br /&gt;
&lt;br /&gt;
Das Programm zur Ansteuerung des Displays im 8-Bit Bus Mode. Verwendet wird die lcdlibrary von Peter Fleury.&lt;br /&gt;
&lt;br /&gt;
Folgende Einstellungen sind für obiges Beispiele in der Header Datei lcd.h vorzunehmen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 *  @name  Definitions for MCU Clock Frequency&lt;br /&gt;
 *  Adapt the MCU clock frequency in Hz to your target. &lt;br /&gt;
 */&lt;br /&gt;
#define XTAL 4000000              /**&amp;lt; clock frequency in Hz, used to calculate delay timer */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * @name  Definition for LCD controller type&lt;br /&gt;
 * Use 0 for HD44780 controller, change to 1 for displays with KS0073 controller.&lt;br /&gt;
 */&lt;br /&gt;
#define LCD_CONTROLLER_KS0073 0  /**&amp;lt; Use 0 for HD44780 controller, 1 for KS0073 controller */&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 *  @name  Definitions for Display Size &lt;br /&gt;
 *  Change these definitions to adapt setting to your display&lt;br /&gt;
 */&lt;br /&gt;
#define LCD_LINES           2     /**&amp;lt; number of visible lines of the display */&lt;br /&gt;
#define LCD_DISP_LENGTH    16     /**&amp;lt; visibles characters per line of the display */&lt;br /&gt;
#define LCD_LINE_LENGTH  0x40     /**&amp;lt; internal line length of the display    */&lt;br /&gt;
#define LCD_START_LINE1  0x00     /**&amp;lt; DDRAM address of first char of line 1 */&lt;br /&gt;
#define LCD_START_LINE2  0x40     /**&amp;lt; DDRAM address of first char of line 2 */&lt;br /&gt;
#define LCD_START_LINE3  0x14     /**&amp;lt; DDRAM address of first char of line 3 */&lt;br /&gt;
#define LCD_START_LINE4  0x54     /**&amp;lt; DDRAM address of first char of line 4 */&lt;br /&gt;
#define LCD_WRAP_LINES      0     /**&amp;lt; 0: no wrap, 1: wrap at end of visibile line */&lt;br /&gt;
&lt;br /&gt;
#define LCD_IO_MODE      0         /**&amp;lt; 0: memory mapped mode, 1: IO port mode */&lt;br /&gt;
#if LCD_IO_MODE&lt;br /&gt;
...&lt;br /&gt;
#elif defined(__AVR_AT90S4414__) || defined(__AVR_AT90S8515__) || defined(__AVR_ATmega64__) || \&lt;br /&gt;
      defined(__AVR_ATmega8515__)|| defined(__AVR_ATmega103__) || defined(__AVR_ATmega128__) || \&lt;br /&gt;
      defined(__AVR_ATmega161__) || defined(__AVR_ATmega162__)&lt;br /&gt;
/*&lt;br /&gt;
 *  memory mapped mode is only supported when the device has an external data memory interface&lt;br /&gt;
 */&lt;br /&gt;
#define LCD_IO_DATA      0xC000    /* A15=E=1, A14=RS=1                 */&lt;br /&gt;
#define LCD_IO_FUNCTION  0x8000    /* A15=E=1, A14=RS=0                 */&lt;br /&gt;
#define LCD_IO_READ      0x0100    /* A8 =R/W=1 (R/W: 1=Read, 0=Write   */&lt;br /&gt;
#else&lt;br /&gt;
#error &amp;quot;external data memory interface not available for this device, use 4-bit IO port mode&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So sieht das Programmbeispiel in AVR-GCC aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;quot;lcd.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    /* Initialisiere Display, Cursor aus */&lt;br /&gt;
    lcd_init(LCD_DISP_ON);&lt;br /&gt;
&lt;br /&gt;
    /* loesche das LCD Display und Cursor auf 1 Zeile, 1 Spalte */&lt;br /&gt;
    lcd_clrscr();&lt;br /&gt;
        &lt;br /&gt;
    /* String auf Display anzeigen */&lt;br /&gt;
    lcd_puts(&amp;quot;Hello world.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===4-Bit Ansteuerung mit Busy(I/O Mode)===&lt;br /&gt;
&lt;br /&gt;
Mit die häufigste Anbindungsart ist sicher die 4-Bit Ansteuerung. Dabei werden die Display-Daten Nibble-weise in den Display Speicher übertragen. Das ist zwar etwas langsamer als im 8-Bit Mode, das spielt aber kaum eine Rolle. Für diese Ansteuerung werden 7 Prozessor Ports benötigt. Die Abfrage des Busy Flags ist durch die Verdrahtung des R/W Pins möglich. &lt;br /&gt;
&lt;br /&gt;
[[Bild:lcdmodul_4bitbusy_schem.png|center|thumb|600px|4-Bit Ansteuerung mit Busy]]&lt;br /&gt;
Anmerkung: Unbenutzte Pins des Datenports vom LCD sollten auf GND gelegt werden, da sie ansonsten auf keinen definierten Pegel liegen und Störsignale empfangen.&lt;br /&gt;
&lt;br /&gt;
Hier ein [http://picasaweb.google.de/lh/photo/7xU12-9CwCJUXh5XCC7LsQ?authkey=Gv1sRgCI3H2aul1-TmNg&amp;amp;feat=directlink Beispielaufbau] auf einem Steckboard.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====BASCOM-AVR Programm====&lt;br /&gt;
&lt;br /&gt;
Das Programm zur Ansteuerung des Displays im 4-Bit I/O Mode benötigt einer spezielle LCD Bibliothek, die 'lcd4busy.lib'. Leider müssen bei der Verwendung dieser Bibliothek alle Pins des LCD Modul an den selben Prozessor Port angeschlossen werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $lib &amp;quot;lcd4busy.lib&amp;quot;   'ersetzt die Standard LCD Bibliothek&lt;br /&gt;
 $regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
 $crystal = 16000000&lt;br /&gt;
&lt;br /&gt;
 Config Lcd = 20 * 4   'wir verwenden ein 4 x 20 Zeichen Display&lt;br /&gt;
 Const _lcdport = Portc&lt;br /&gt;
 Const _lcdddr = Ddrc&lt;br /&gt;
 Const _lcdin = Pinc&lt;br /&gt;
 Const _lcd_e = 1&lt;br /&gt;
 Const _lcd_rw = 2&lt;br /&gt;
 Const _lcd_rs = 3&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 Cls                   'loesche das LCD Display&lt;br /&gt;
 Locate 1 , 1          'Cursor auf 1 Zeile, 1 Spalte &lt;br /&gt;
 Lcd &amp;quot;Hello world.&amp;quot;    'String auf Display anzeigen&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====AVR-GCC Programm====&lt;br /&gt;
&lt;br /&gt;
Das Programm zur Ansteuerung des Displays im 4-Bit I/O Mode. Verwendet wird die lcdlibrary von Peter Fleury.&lt;br /&gt;
&lt;br /&gt;
Folgende Einstellungen sind für obiges Beispiele in der Header Datei lcd.h vorzunehmen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 *  @name  Definitions for MCU Clock Frequency&lt;br /&gt;
 *  Adapt the MCU clock frequency in Hz to your target. &lt;br /&gt;
 */&lt;br /&gt;
#define XTAL 16000000              /**&amp;lt; clock frequency in Hz, used to calculate delay timer */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * @name  Definition for LCD controller type&lt;br /&gt;
 * Use 0 for HD44780 controller, change to 1 for displays with KS0073 controller.&lt;br /&gt;
 */&lt;br /&gt;
#define LCD_CONTROLLER_KS0073 0  /**&amp;lt; Use 0 for HD44780 controller, 1 for KS0073 controller */&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 *  @name  Definitions for Display Size &lt;br /&gt;
 *  Change these definitions to adapt setting to your display&lt;br /&gt;
 */&lt;br /&gt;
#define LCD_LINES           4     /**&amp;lt; number of visible lines of the display */&lt;br /&gt;
#define LCD_DISP_LENGTH    20     /**&amp;lt; visibles characters per line of the display */&lt;br /&gt;
#define LCD_LINE_LENGTH  0x40     /**&amp;lt; internal line length of the display    */&lt;br /&gt;
#define LCD_START_LINE1  0x00     /**&amp;lt; DDRAM address of first char of line 1 */&lt;br /&gt;
#define LCD_START_LINE2  0x40     /**&amp;lt; DDRAM address of first char of line 2 */&lt;br /&gt;
#define LCD_START_LINE3  0x14     /**&amp;lt; DDRAM address of first char of line 3 */&lt;br /&gt;
#define LCD_START_LINE4  0x54     /**&amp;lt; DDRAM address of first char of line 4 */&lt;br /&gt;
#define LCD_WRAP_LINES      0     /**&amp;lt; 0: no wrap, 1: wrap at end of visibile line */&lt;br /&gt;
&lt;br /&gt;
#define LCD_IO_MODE      1         /**&amp;lt; 0: memory mapped mode, 1: IO port mode */&lt;br /&gt;
#if LCD_IO_MODE&lt;br /&gt;
/**&lt;br /&gt;
 *  @name Definitions for 4-bit IO mode&lt;br /&gt;
 *  Change LCD_PORT if you want to use a different port for the LCD pins.&lt;br /&gt;
 *&lt;br /&gt;
 *  The four LCD data lines and the three control lines RS, RW, E can be on the &lt;br /&gt;
 *  same port or on different ports. &lt;br /&gt;
 *  Change LCD_RS_PORT, LCD_RW_PORT, LCD_E_PORT if you want the control lines on&lt;br /&gt;
 *  different ports. &lt;br /&gt;
 *&lt;br /&gt;
 *  Normally the four data lines should be mapped to bit 0..3 on one port, but it&lt;br /&gt;
 *  is possible to connect these data lines in different order or even on different&lt;br /&gt;
 *  ports by adapting the LCD_DATAx_PORT and LCD_DATAx_PIN definitions.&lt;br /&gt;
 *  &lt;br /&gt;
 */&lt;br /&gt;
#define LCD_PORT         PORTC        /**&amp;lt; port for the LCD lines   */&lt;br /&gt;
#define LCD_DATA0_PORT   LCD_PORT     /**&amp;lt; port for 4bit data bit 0 */&lt;br /&gt;
#define LCD_DATA1_PORT   LCD_PORT     /**&amp;lt; port for 4bit data bit 1 */&lt;br /&gt;
#define LCD_DATA2_PORT   LCD_PORT     /**&amp;lt; port for 4bit data bit 2 */&lt;br /&gt;
#define LCD_DATA3_PORT   LCD_PORT     /**&amp;lt; port for 4bit data bit 3 */&lt;br /&gt;
#define LCD_DATA0_PIN    4            /**&amp;lt; pin for 4bit data bit 0  */&lt;br /&gt;
#define LCD_DATA1_PIN    5            /**&amp;lt; pin for 4bit data bit 1  */&lt;br /&gt;
#define LCD_DATA2_PIN    6            /**&amp;lt; pin for 4bit data bit 2  */&lt;br /&gt;
#define LCD_DATA3_PIN    7            /**&amp;lt; pin for 4bit data bit 3  */&lt;br /&gt;
#define LCD_RS_PORT      LCD_PORT     /**&amp;lt; port for RS line         */&lt;br /&gt;
#define LCD_RS_PIN       3            /**&amp;lt; pin  for RS line         */&lt;br /&gt;
#define LCD_RW_PORT      LCD_PORT     /**&amp;lt; port for RW line         */&lt;br /&gt;
#define LCD_RW_PIN       2            /**&amp;lt; pin  for RW line         */&lt;br /&gt;
#define LCD_E_PORT       LCD_PORT     /**&amp;lt; port for Enable line     */&lt;br /&gt;
#define LCD_E_PIN        1            /**&amp;lt; pin  for Enable line     */&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So sieht das Programmbeispiel in AVR-GCC aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;quot;lcd.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    /* Initialisiere Display, Cursor aus */&lt;br /&gt;
    lcd_init(LCD_DISP_ON);&lt;br /&gt;
&lt;br /&gt;
    /* loesche das LCD Display und Cursor auf 1 Zeile, 1 Spalte */&lt;br /&gt;
    lcd_clrscr();&lt;br /&gt;
        &lt;br /&gt;
    /* String auf Display anzeigen */&lt;br /&gt;
    lcd_puts(&amp;quot;Hello world.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===4-Bit Ansteuerung ohne Busy(I/O Mode)===&lt;br /&gt;
&lt;br /&gt;
Mit die häufigste Anbindungsart ist sicher die 4-Bit Ansteuerung. Dabei werden die Display-Daten Nibble-weise in den Display Speicher übertragen. Das ist zwar etwas langsamer als im 8-Bit Mode, das spielt aber kaum eine Rolle. Für diese Ansteuerung werden 6 Prozessor Ports benötigt. Die R/W Leitung des Displays kann man dabei einfach auf GND legen, dann ist aber keine Busy-Bit Abfrage möglich.&lt;br /&gt;
&lt;br /&gt;
[[Bild:lcdmodul_4bit_schem.png|center|thumb|600px|4-Bit Ansteuerung]]&lt;br /&gt;
&lt;br /&gt;
====BASCOM-AVR Programm====&lt;br /&gt;
&lt;br /&gt;
Das Programm zur Ansteuerung des Displays im 4-Bit I/O Mode.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
 $crystal = 16000000&lt;br /&gt;
&lt;br /&gt;
 Config Lcd = 20 * 4   'wir verwenden ein 4 x 20 Zeichen Display&lt;br /&gt;
 ' Im I/O Mode wird jeder Prozessor Pin einzeln angegeben&lt;br /&gt;
 Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4&lt;br /&gt;
 &lt;br /&gt;
 Cls                   'loesche das LCD Display&lt;br /&gt;
 Locate 1 , 1          'Cursor auf 1 Zeile, 1 Spalte &lt;br /&gt;
 Lcd &amp;quot;Hello world.&amp;quot;    'String auf Display anzeigen&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====AVR-GCC Programm====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  TODO....&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ansteuerung über Porterweiterung===&lt;br /&gt;
&lt;br /&gt;
Mit einem Porterweiterungs Baustein wie dem 74HC595 lassen sich weitere Prozessor-Ports einsparen. Diese Lösung kommt mit 4 Prozessor Ports aus, läßt man die Abfrage des Busy-Bits (PC5) weg, sogar nur mit 3 Prozessor Ports. Trotzdem wird das Display im 8-Bit Mode betrieben.&lt;br /&gt;
&lt;br /&gt;
[[Bild:lcdmodul_portexp_schem.png|center|thumb|600px|Ansteuerung über Porterweiterung]]&lt;br /&gt;
&lt;br /&gt;
====BASCOM-AVR Programm====&lt;br /&gt;
&lt;br /&gt;
Das BASCOM Programm für diese Ansteuerung ist nicht ganz so einfach, da es nicht von der BASCOM Library unterstützt wird. Die Routinen zum Ansprechen des Displays muß man selbst coden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  TODO....&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====AVR-GCC Programm====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  TODO....&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ansteuerung über I&amp;amp;sup2;C===&lt;br /&gt;
&lt;br /&gt;
Nur 2 Prozessor Ports benötigt man bei der I&amp;amp;sup2;C-Ansteuerung. Dazu wird als I&amp;amp;sup2;C Porterweiterungs IC der PCF8574P benötigt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:lcdmodul_i2c_schem.png|center|thumb|600px|I&amp;amp;sup2;C-Ansteuerung]]&lt;br /&gt;
&lt;br /&gt;
====BASCOM-AVR Programm====&lt;br /&gt;
Diese Ansteuerung basiert auf der Application Note AN#118 von MCS electronics. Dazu gibt es auch eine fertige Library zu BASCOM-AVR, die die Standard LCD Library ersetzt. Dadurch können die gleichen Befehle zur Ansteuerung verwendet werden wie bei der Standard LCD Library. Das BASCOM-AVR Programm, um das LCD-Modul über I&amp;amp;sup2;C anzusprechen, sieht dann so aus.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $lib &amp;quot;Lcd_i2c.lib&amp;quot;   'ersetzt die Standard LCD Library&lt;br /&gt;
 $regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
 $crystal = 16000000&lt;br /&gt;
&lt;br /&gt;
 Const Pcf8574_lcd = &amp;amp;H40   'I2C Adresse &lt;br /&gt;
 Config Scl = Portc.0       'I2C SCL Pin&lt;br /&gt;
 Config Sda = Portc.1       'I2C SDA Pin&lt;br /&gt;
 Dim _lcd_e As Byte&lt;br /&gt;
 _lcd_e = 128               'LCD im 4-Bit Mode betreiben&lt;br /&gt;
&lt;br /&gt;
 Cls                'loesche das LCD Display&lt;br /&gt;
 Locate 1 , 1       'Cursor auf 1 Zeile, 1 Spalte &lt;br /&gt;
 Lcd &amp;quot;Hello world.&amp;quot; 'String auf Display anzeigen&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====AVR-GCC Programm====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  TODO....&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ansteuerung über RS232===&lt;br /&gt;
&lt;br /&gt;
Ebenfalls nur 2 Pins zur Ansteuerung benötigt die Lösung. Allerdings ist die serielle Schnittstelle bei Mikrocontrollern oft schon mit anderen Aufgaben belegt. Deshalb befindet sich meistens noch zusätzlich eine I&amp;amp;sup2;C-Bus Schnittstelle zur Ansteuerung auf dem Modul.&lt;br /&gt;
&lt;br /&gt;
==Graphik-Displays==&lt;br /&gt;
&lt;br /&gt;
In Mikrocontroller-Anwendungen werden seit neuestem, einhergehend mit der größeren Verbreitung von Controllern mit mehr Speicherplatz, auch immer öfter Grafik-Displays und Farb-TFTs eingesetzt. Der Aufwand an Software und Hardware ist hier allerdings um einiges höher (jedes Pixel ist einzeln anzusteuern). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==LCD über RN LCD Adapter Std an RN-Control==&lt;br /&gt;
&lt;br /&gt;
Hierbei handelt es sich um eine Beispielansteuerung eines LCD über RN LCD Adapter Std an RN-Control in C.&lt;br /&gt;
&lt;br /&gt;
Komfortabel lässt sich ein LCD in C mit der LCD Library von Peter Fleury ansteuern (LCD Controller HD44780 &amp;amp; KS0073).&lt;br /&gt;
Die Library selbst sowie deren Online Dokumentation und weiterführende informationen sind von [http://jump.to/fleury Peter Fleury's Home Page]zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
Im hier aufgeführten Beispiel wird ein Crystalfontz 20x4 LCD verwendet (CFAH2004A-YYH-JPE).&lt;br /&gt;
&lt;br /&gt;
Pinbelegung nach [http://www.crystalfontz.com/product/CFAH2004AYYHJPE.html Datenblatt]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 Pin No.	Symbol 	Level 	Description&lt;br /&gt;
 1 	VSS 	0V 		Ground&lt;br /&gt;
 2 	VDD 	5.0V 		Supply Voltage for logic&lt;br /&gt;
 3	VO 	(Variable) 	Operating voltage for LCD&lt;br /&gt;
 4 	RS 	H/L 		H: DATA, L: Instruction code&lt;br /&gt;
 5 	R/W 	H/L 		H: Read(MPU?Module) L: Write(MPU?Module)&lt;br /&gt;
 6 	E 	H,H?L 		Chip enable signal&lt;br /&gt;
 7 	DB0 	H/L 		Data bit 0&lt;br /&gt;
 8 	DB1 	H/L 		Data bit 1&lt;br /&gt;
 9 	DB2 	H/L 		Data bit 2&lt;br /&gt;
 10 	DB3 	H/L 		Data bit 3&lt;br /&gt;
 11 	DB4 	H/L 		Data bit 4&lt;br /&gt;
 12 	DB5 	H/L 		Data bit 5&lt;br /&gt;
 13 	DB6 	H/L 		Data bit 6&lt;br /&gt;
 14 	DB7 	H/L 		Data bit 7&lt;br /&gt;
 15 	A 	- 		LED +&lt;br /&gt;
 16 	K 	- 		LED -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pinbelegung des LCD Adapters nach [http://www.robotikhardware.de/download/rn_LCD_adapter_std.pdf Datenblatt] &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 Pin 1 	LCD DB7&lt;br /&gt;
 Pin 2 	LCD DB6&lt;br /&gt;
 Pin 3 	LCD DB5&lt;br /&gt;
 Pin 4 	LCD DB4&lt;br /&gt;
 Pin 5 	Licht ein/aus per Port (da EN2 hier nicht benötigt wird)&lt;br /&gt;
 Pin 6 	LCD EN&lt;br /&gt;
 Pin 7 	LCD R/W&lt;br /&gt;
 Pin 8 	LCD RS&lt;br /&gt;
 Pin 9 	GND LCD GND und Licht Kathode&lt;br /&gt;
 Pin 10 +5V LCD VCC und Licht Anode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Berücksichtigt man die folgenden Tatsachen:&lt;br /&gt;
* ATMega32 auf dem RN-Control stellt kein &amp;quot;external memory interface&amp;quot; zur Verfügung, daher ist ohne Weiteres keine 8-Bit Ansteuerung des LCD möglich. Es wird 4-Bit I/O verwendet&lt;br /&gt;
* die Zählweise der Pins beginnt in lcd.h bei 0, nicht bei 1&lt;br /&gt;
* der LCD Adapter ist mit PORTC des RN Control verbunden (Vorteil: an den LEDs von PORTC kann erkannt werden, ob überhaupt Daten an das LCD gesendet werden)&lt;br /&gt;
* der Controler im LCD ist ein SPLC780D, welcher mit dem in lcd.h genutzten HD44780 kompatibel ist&lt;br /&gt;
müssen die nachfolgenden Zeilen in lcd.h entsprechend angepasst werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define XTAL 16000000              /**&amp;lt; clock frequency in Hz, used to calculate delay timer */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die DDRAM Adressen der einzelnen Zeilen sind im Datenblatt hinterlegt. Zeile 1 und 3 sowie 2 und 4 bilden intern je eine Zeile.&lt;br /&gt;
Der manuelle Zeilenumbruch am Ende des Codeblocks bleibt Geschmacksache.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define LCD_LINES           4     /**&amp;lt; number of visible lines of the display */&lt;br /&gt;
#define LCD_DISP_LENGTH    20     /**&amp;lt; visibles characters per line of the display */&lt;br /&gt;
#define LCD_LINE_LENGTH  0x40     /**&amp;lt; internal line length of the display    */&lt;br /&gt;
#define LCD_START_LINE1  0x00     /**&amp;lt; DDRAM address of first char of line 1 */&lt;br /&gt;
#define LCD_START_LINE2  0x40     /**&amp;lt; DDRAM address of first char of line 2 */&lt;br /&gt;
#define LCD_START_LINE3  0x14     /**&amp;lt; DDRAM address of first char of line 3 */&lt;br /&gt;
#define LCD_START_LINE4  0x54     /**&amp;lt; DDRAM address of first char of line 4 */&lt;br /&gt;
#define LCD_WRAP_LINES      1     /**&amp;lt; 0: no wrap, 1: wrap at end of visibile line */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
4-Bit I/O Mode wird verwendet.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define LCD_IO_MODE      1         /**&amp;lt; 0: memory mapped mode, 1: IO port mode */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Wie oben angedeutet werden die Pins von 0 an gezählt. &amp;quot;LCD_DATA3_PIN 0&amp;quot; ist somit Pin 1 des LCD Adapters.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define LCD_PORT         PORTC        /**&amp;lt; port for the LCD lines   */&lt;br /&gt;
#define LCD_DATA0_PORT   LCD_PORT     /**&amp;lt; port for 4bit data bit 0 */&lt;br /&gt;
#define LCD_DATA1_PORT   LCD_PORT     /**&amp;lt; port for 4bit data bit 1 */&lt;br /&gt;
#define LCD_DATA2_PORT   LCD_PORT     /**&amp;lt; port for 4bit data bit 2 */&lt;br /&gt;
#define LCD_DATA3_PORT   LCD_PORT     /**&amp;lt; port for 4bit data bit 3 */&lt;br /&gt;
#define LCD_DATA0_PIN    3            /**&amp;lt; pin for 4bit data bit 0  */&lt;br /&gt;
#define LCD_DATA1_PIN    2            /**&amp;lt; pin for 4bit data bit 1  */&lt;br /&gt;
#define LCD_DATA2_PIN    1            /**&amp;lt; pin for 4bit data bit 2  */&lt;br /&gt;
#define LCD_DATA3_PIN    0            /**&amp;lt; pin for 4bit data bit 3  */&lt;br /&gt;
#define LCD_RS_PORT      LCD_PORT     /**&amp;lt; port for RS line         */&lt;br /&gt;
#define LCD_RS_PIN       7            /**&amp;lt; pin  for RS line         */&lt;br /&gt;
#define LCD_RW_PORT      LCD_PORT     /**&amp;lt; port for RW line         */&lt;br /&gt;
#define LCD_RW_PIN       6            /**&amp;lt; pin  for RW line         */&lt;br /&gt;
#define LCD_E_PORT       LCD_PORT     /**&amp;lt; port for Enable line     */&lt;br /&gt;
#define LCD_E_PIN        5            /**&amp;lt; pin  for Enable line     */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Testprogramm:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt; &lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;lcd.c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	lcd_init(LCD_DISP_ON_CURSOR_BLINK);&lt;br /&gt;
	lcd_clrscr();&lt;br /&gt;
	lcd_puts(&amp;quot;test&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
* [[Bascom_und_LCD%27s|BASCOM und LCD's]]&lt;br /&gt;
* [[Portexpander_am_AVR|Portexpander am AVR]]&lt;br /&gt;
* [[AVR]]&lt;br /&gt;
* [[I2C|I&amp;amp;sup2;C-Bus]]&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mcselec.com/index.php?option=com_content&amp;amp;task=view&amp;amp;id=82&amp;amp;Itemid=57 MCS electronics AN #118] - I&amp;amp;sup2;C LCD and Keyboard library&lt;br /&gt;
* [http://jump.to/fleury Peter Fleury's Homepage] - Interfacing a HD44780 Based LCD to an AVR, LCD library for HD44870 based LCD's&lt;br /&gt;
* [http://www.display3000.com Display3000 Homepage] - Verkaufen Farb-TFTs und TFT-Komplettlösungen inkl. Bascom und GCC (WinAVR) Ansteuerung und div. Utilities&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Autore(en)==&lt;br /&gt;
&lt;br /&gt;
[[Benutzer:m_a_r_v_i_n|m a r v i n]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]&lt;br /&gt;
[[Kategorie:Quellcode_Bascom]]&lt;br /&gt;
[[Kategorie:Quellcode_C]]&lt;/div&gt;</summary>
		<author><name>Ratzfatz</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=AVR-Einstieg_leicht_gemacht&amp;diff=14987</id>
		<title>AVR-Einstieg leicht gemacht</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=AVR-Einstieg_leicht_gemacht&amp;diff=14987"/>
				<updated>2009-06-11T13:22:45Z</updated>
		
		<summary type="html">&lt;p&gt;Ratzfatz: /* Wie bekommt man das Programm in den Controller? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:avr8.jpg|thumb|300px|Einen Controller zum Leben zu erwecken ist nicht schwer, manchmal reichen ein paar Teile! Beispiel mit Mega8]]&lt;br /&gt;
==Wir starten mit einem ATMega32== &lt;br /&gt;
Immer wieder gibt es in Foren, wie dem Roboternetz, Einsteiger, die das erstemal mit einem [[Microcontroller]] in Berührung kommen. Trotz zahlreicher Einstiegsbeiträge im Forum wiederholen sich doch bestimmte Anfängerfragen immer wieder, daher soll dieser Artikel noch einmal aufzeigen, wie man den ersten Schritt tut und einen Controller zum Leben erweckt. Es werden verschiedene Grundschaltungen aufgezeigt und erläutert, welche Bauteile welche Funktion besitzen.&lt;br /&gt;
Als Controller verwenden wir einen [[AVR]] [[ATMega32]], der derzeit größte [[AVR]]-Controller, welcher noch im bastlerfreundlichen DIP-Gehäuse verfügbar ist.  Für kleine bis mittlere Projekte ein sehr empfehlenswerter Controller, zumal er preislich mit ca. 6-7 Euro noch sehr günstig ist und zudem mit seinem 40-Pin-Gehäuse reichlich Anschlussmöglichkeiten besitzt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mega1632.gif|center]]&lt;br /&gt;
&lt;br /&gt;
Wie auf dem Bild zu sehen, verfügt auch der etwas günstigere ATMega16 über die gleiche Pinbelegung, daher könnten wir in diesem Tutorial auch diesen Typ verwenden. Der ATMega32 hat aber doppelt soviel Speicherplatz für Programmdaten (Flash), daher hat man für eine geringe Preisdifferenz doch mehr Möglichkeiten.&lt;br /&gt;
Wer noch 3 bis 4 Euro sparen will, dem sei der [[ATMega8]] oder [[ATMega168]] empfohlen, diese Typen sind sehr ähnlich, so dass das Tutorial weitgehend auch auf diese Typen bezogen werden kann. Allerdings haben diese Typen deutlich weniger Anschlussmöglichkeiten (28 Pin DIP Gehäuse). &lt;br /&gt;
&lt;br /&gt;
Die Frage, ob man mit einem fertigen Controllerboard, einer Experimentierplatine oder einem Steckbrett beginnen sollte, wurde ja in dem RN-Wissen Wiki Beitrag &amp;quot;[[Mit welchem Controllerboard fang ich an]]&amp;quot; angesprochen. In den meisten Fällen favorisiert der Autor dieses Artikels ein fertiges Controllerboard. Warum das so ist, dazu am Ende noch ein paar Anmerkungen. Dennoch soll diese Einführung schrittweise anhand eines Steckbrettes erläutert werden.&lt;br /&gt;
&lt;br /&gt;
==Start mit handelsüblichem Steckbrett==&lt;br /&gt;
Ein Steckbrett hat den Vorteil, dass man theoretisch ohne Löten alle Bauteile relativ zügig zusammenstecken kann. Bestimmte Steckkontakte innerhalb einer Reihe sind im Steckbrett miteinander verbunden, so dass man nachher pro Bauteilbeinchen noch einige Steckkontakte zum Verdrahten mit Schaltdraht oder speziell konfektionierter Litze verwenden kann.&lt;br /&gt;
&lt;br /&gt;
'''Die Vorteile eines Steckbretts:'''&lt;br /&gt;
&lt;br /&gt;
*Bauteile können ohne Löten eingesetzt und verdrahtet werden&lt;br /&gt;
*recht zügiger Schaltungsaufbau&lt;br /&gt;
*eine Schaltung kann leicht geändert oder korrigiert werden, defekte Teile sind leicht tauschbar&lt;br /&gt;
*ein Steckbrett kann auch für ganz andere Schaltungen verwendet werden&lt;br /&gt;
'''Die Nachteile eines Steckbretts gegenüber gedruckten Schaltungen und Experimentierplatinen sind:'''&lt;br /&gt;
&lt;br /&gt;
*nicht alle Bauteile passen, so dass wir doch noch etwas löten müssen&lt;br /&gt;
*nur geringer Schaltungsumfang möglich, da es schnell unübersichtlich wird&lt;br /&gt;
*sehr störanfällig wegen grosser Kabellängen, dadurch oft Funktionsstörungen&lt;br /&gt;
*Bauteile müssen zum Teil verbogen werden, damit sie passen&lt;br /&gt;
&lt;br /&gt;
Man beginnt, indem man den Controller AVR [[ATMega32]] auf das Board aufsetzt:&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrettmega32.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
==Die Grundschaltung==&lt;br /&gt;
Damit ein Controller erst mal zum Laufen kommt, benötigt man zumindest einen 10-k-Widerstand, einen 100-nF-Kondensator und eine 5V-Spannungsquelle. Das Ganze muss entsprechend dem unteren Schaltplan verschaltet werden, man spricht von einer sogenannten Grundschaltung. In dem Schaltplan wurde der Controller im Übrigen pinkompatibel als Schaltzeichen verwendet, die Pinreihenfolge ist also im Schaltplan identisch mit der echten Bauteilpin-Reihenfolge. Diese Darstellung erleichtert den Nachbau der Schaltung auf einem Steckbrett aber auch einer Experimentierplatine ungemein. Gewöhnlich verwendet man in Schaltplänen eine etwas andere Darstellung, bei der die Pins nach Funktionsgruppen geordnet sind. Bei solchen Schaltplänen muss man sich dann anhand der Pin-Nummern orientieren, man wird dies am Ende des Artikels noch bei dem IC MAX232 sehen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mega32.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn man schon einige Grundschaltungen in anderen Tutorials gesehen hat, dann wird man bemerken, dass unsere doch noch etwas einfacher ist und weniger Bauteile benötigt.  Hier wird beispielsweise kein Quarz verwendet, da der ATMega32 auch intern einen Takt generieren kann. Wer mit dem ADC genau messen will, sollte statt der Beschaltung im Bild, zwischen Vcc und AVcc eine Spule von 10uH und einen Kondensator von 100nF zwischen AVcc und GND schalten. Will man AVcc als Referenzspannung verwenden, muss noch ein 100nF Kondensator von ARef nach GND.&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht die obere Schaltung wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett1.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um den Controller in Betrieb zu nehmen, benötigt man bei dieser Schaltung ein Netzteil, das eine stabilisierte Spannung von 4 bis 5V liefert. Wir gehen erst einmal davon aus, dass man über dieses verfügt. &lt;br /&gt;
Erwähnenswert ist noch, dass der Kondensator als [[Abblockkondensator]] zur Unterdrückung von Störungen dient. Er muss so nah wie möglich an die Spannungszuführung am Controller selbst gesetzt werden. Ohne Kondensator enstehen erhebliche Störungen in der Versorgungsspannung, das Bild verdeutlicht es:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Abblockkondensator OhneC amAVR.jpg|center]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Der Widerstand in der Grundschaltung dient dazu, die Reset-Leitung konstant auf definiertem High-Pegel zu halten. Verbindet man diesen RESET-Pin später kurz mit GND (Masse), dann wird das Programm im Controller neu gestartet.&lt;br /&gt;
&lt;br /&gt;
==Woran merkt man, dass der Controller funktioniert?==&lt;br /&gt;
Gute Frage! Man merkt es garnicht. Genau genommen funktioniert ja auch trotz korrekter Schaltung noch immer nix, denn es muss zuerst ein Programm in den Controller geladen werden, damit er überhaupt weiss, was zu tun ist. Ohne Programm ist der Controller quasi tot.&lt;br /&gt;
&lt;br /&gt;
==Wie bekommt man das Programm in den Controller?==&lt;br /&gt;
Der Controller verfügt über eine sogenannte [[ISP]]-Schnittstelle. Das bedeutet, über bestimmte Pins ([[SPI]]) kann der Controller mit einer geeigneten PC-Software (zum Beispiel Bascom) programmiert werden. Zum Anschluss an den PC benötigt man jedoch einen sogenannten ISP-Dongle, auch Programmieradapter genannt. Hier gibt es verschiedene Lösungen, serielle und parallele Adapter. Original von Atmel oder kompatible Lösungen. Der am meisten verwendete ISP-Dongle wird am Druckerport betrieben. Diese gibt es inzwischen recht preiswert, sodass sich das Selbstbauen eigentlich nicht lohnt. Da man auch gern auf ein paar Fehlerquellen verzichten sollte, würde ich eine Fertiglösung empfehlen. Wer ihn selbst bauen möchte, findet ([[AVR-ISP_Programmierkabel|hier]] eine ISP-Dongle-Bauanleitung und sogar eine fertige Platine dafür  ([[AVR-ISP_Programmierkabel]]).&lt;br /&gt;
&lt;br /&gt;
Sowas sieht dann so aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Avrtutorial_ispkabel.jpeg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan eines solchen Programmierkabels:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:ispschaltplan.gif|center|thumb|400px|Schaltplan des ISP-Dongels nach unserem Wiki-Bauplan, mit SUB-D Buchse. Bitte beachten, dass das IC1 hier im Plan als verschiedene Blöcke (IC1A/IC1B) dargestellt wird. Dies dient nur zur Übersicht, es handelt sich nur um ein IC, einfach auf die Pinnummern achten. Zum vergrößern anklicken.]]&lt;br /&gt;
&lt;br /&gt;
Ein noch einfacheres Programmierkabel ist auf der Seite http://thomaspfeifer.net/ beschrieben.&lt;br /&gt;
Dort findet man unter &amp;quot;AVR-Projekte&amp;quot; den Artikel &amp;quot;Ein einfaches Programmierkabel für Atmel-AVR Mikrocontroller&amp;quot;.&lt;br /&gt;
Will man dieses Kabel verwenden, sollte man in BASCOM unter &amp;quot;Options/Programmer&amp;quot; den Programmertyp &amp;quot;Samples Electronic Programmer&amp;quot; wählen, sonst funktioniert das Autodetect, das die eingestzte Version des AVR (Mikrocontroller) erkennt nicht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Problem ist nun, wie schließe ich einen handelsüblichen ISP-Programmieradapter an den Controller auf dem Steckbrett an? Der normale 10-polige Wannenstecker (nach [[RN-Definitionen]]) passt nicht in ein Steckbrett. Das ist wieder so ein typischer Nachteil bei Steckbrettern! In unserem Beispiel haben wir dazu auf einem kleinen Stück Experimentierplatine einen steckbaren Adapter für das Steckboard gelötet.&lt;br /&gt;
Somit kann man die Schaltung um einen üblichen 10-poligen ISP-Programmieranschluss ergänzen:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mitisp.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht das gleiche so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_mitisp.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jetzt endlich ist es soweit, jetzt kann man den Controller über einen ISP-Programmieradapter mit dem PC verbinden. Aber unbedingt darauf achten, dass auch alles korrekt nach Schaltplan gesteckt wurde und dass die Betriebsspannung 5V nicht übersteigt. Ansonsten könnte man sich Dongle oder sogar die PC-Schnittstelle beschädigen.&lt;br /&gt;
Als Entwicklungsumgebung nutzen wir hier im Tutorial [[Bascom]]. [[Bascom]] ist ein sehr beliebter Basic-[[Compiler]], der zahlreiche [[AVR]] Controllertypen programmieren kann. Da auch ein [[Terminalprogramm]] und ein Programmer integriert ist, enthält diese PC-Software alles, was man braucht, das erleichtert den Einstieg zusätzlich. Die Software gibts kostenlos als Demo bis 4K Code, für unsere Beispiele und den Einstieg reicht das allemal, siehe dazu Artikel Bascom.&lt;br /&gt;
&lt;br /&gt;
Wie man ein Programm schreibt, kompiliert und überträgt, wurde schon in diesem Beitrag [[Bascom - Erstes Programm in den AVR Controller übertragen]] ausführlich behandelt, wir ersparen uns deshalb diese Details. Man sollte aber bei Unklarheiten zum Kompilieren und Übertragen diesen Artikel auf jeden Fall lesen.&lt;br /&gt;
&lt;br /&gt;
Als erstes kompilieren und übertragen wir folgendes Programm:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step1.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Programm macht eigentlich nichts, außer dass es eine Endlosschleife ausführt. Aber da wir noch überhaupt nix am Controller angeschlossen haben, können wir eh noch nicht sehen, ob ein Programm nun richtig ausgeführt wird oder nicht.&lt;br /&gt;
Allerdings können wir schonmal üben, das Programm mit Bascom zu übertragen. Wenn wir alles richtig aufgebaut haben und Spannung anliegt, dann sollte automatisch der Controller in Bascom erkannt werden. Die Übertragung sollte dann ohne Fehlermeldung erfolgen können. Wenn wir das geschafft haben, geht’s weiter.&lt;br /&gt;
&lt;br /&gt;
==Läuft die Schaltung und das Programm?==&lt;br /&gt;
Damit wir nun endlich sehen, ob sich bei unserer Schaltung auch was tut, schließen wir eine LED über einen 1K-Vorwiderstand an einen Port an. Da wir die Kathode an den Controllerpin und die Anode an Plus legen, leuchtet die LED immer dann, wenn dieser Pin auf Low geschaltet wird.&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mitled.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht's nun so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_mitled.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Damit man nun auch wirklich sieht, ob das Programm läuft, schreiben wir ein kleines Basic-Programm, welches eine LED abwechselnd ein– und ausschaltet. Wir kompilieren und übertragen also folgendes Programm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step2.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
&lt;br /&gt;
Config Portc.0 = Output       'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C)&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
  Portc.0 = 1                 'Pin wird auf High, also 5V geschaltet&lt;br /&gt;
  Waitms 100&lt;br /&gt;
  Portc.0 = 0                 'Pin wird auf Low, also 0V geschaltet&lt;br /&gt;
  Waitms 100&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn die LED nun schnell blinkt, dann funktioniert die aufgebaute Schaltung perfekt. Wir haben gleichzeitig gelernt, wie man einen Ausgangsport, also Controllerpin, ein- und ausschalten kann. Nahezu alle Pins beim ATMega32 können auf diese Weise als Ausgangsport betrieben werden. Somit lassen sich nicht nur viele Leds, sondern unter Zuhilfenahme eines Treibers (z.B. Transistors) auch Relais und andere Aktoren schalten.&lt;br /&gt;
&lt;br /&gt;
==Eingangsport fragt Taster ab==&lt;br /&gt;
Nun erweitern wir die Schaltung noch um einen Taster. Nahezu jedes Port kann bei einem ATMega32 auch per Software als Eingangsport konfiguriert werden. Wir schließen z.B. einen Taster an Port-Pin PA7 an. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mittaster.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Port wird in der Software so konfiguriert, dass es als Eingang arbeitet und intern über einen hohen Widerstand  (Pullup-Widerstand) ständig auf High-Pegel gelegt wird. Wird nun eine Taste gedrückt, so wird der Pegel auf Low gezogen.&lt;br /&gt;
Das Beispielprogramm ist nun so gestaltet, dass bei gedrückter Taste die LED leuchtet und beim Loslassen wieder ausgeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step3.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
&lt;br /&gt;
Config Portc.0 = Output        'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C)&lt;br /&gt;
&lt;br /&gt;
Config Pina.7 = Input          'Ein Pin (PA0) wird als Eingang definiert&lt;br /&gt;
Porta.7 = 1                    'Interner Pullup Widerstand ein&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
  If Pina.7 = 1 Then&lt;br /&gt;
    Portc.0 = 1                'Pin wird auf High, also 5V geschaltet&lt;br /&gt;
  Else&lt;br /&gt;
    Portc.0 = 0                'Pin wird auf Low, also 0V geschaltet&lt;br /&gt;
  End If&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Grundschaltung mit Quarz==&lt;br /&gt;
Obwohl wir ab der letzten Schaltung schon einiges mit dem Controller anfangen können, so fehlt doch noch etwas Wichtiges. Oft ist es nämlich notwendig, dass ein Controller sehr genaue Frequenzen mißt oder ganz genaue Taktraten ausgeben kann. Leider ist der interne Taktgenerator nicht 100% exakt, was bei manchen Anwendungen störend ist. Zum Beispiel können über die RS232-Schnittstelle Daten nicht immer ganz fehlerfrei übertragen werden, wenn die Taktfrequenz nicht genau stimmt. Daher wird in den meisten Anwendungsfällen ein Quarz zur Takterzeugung genutzt, Sie kennen das sicher aus anderen Grundschaltungen. Also erweitern wir unsere Schaltung gleich noch um einen Quarz mit den zugehörigen 22pF-Kondensatoren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mitquarz.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf unserem Steckbrett wird's langsam voller, hier sieht's also inzwischen so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_mitquarz.jpg|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Normalerweise sollte der Quarz genauso wie die beiden 22pF-Kondensatoren, die zum Anschwingen des Quarzes dienen, möglichst nahe am Controller platziert werden. Auf dem Steckbrett ist das manchmal gar nicht so einfach, insbesondere wenn man wie in diesem Fall den Quarz erst später hinzufügt. Wichtig ist nämlich, dass die Leitungen vom Quarz zum Controller möglichst kurz sind, bei gedruckten Schaltungen oft nur 1 bis 2 cm! Auch die einzelnen Bauteilbeinchen, z.B. der Kondensatoren, sollten normalerweise so kurz wie möglich sein.&lt;br /&gt;
Ist dies nicht der Fall, wie auch in unserem Bild, dann fungieren diese Leitungen fast wie eine Funkantenne. Dies führt in der Regel zu starken Hochfrequenzsignalen, die nicht nur unsere Schaltung, sondern auch andere Schaltungen in der Nähe stören könnten. Man merkt dies auch oft daran, dass sich ein Board bei höherer Quarzfrequenz immer seltener fehlerfrei ohne Übertragungsfehler programmieren läßt.&lt;br /&gt;
Grundsätzlich sind daher Schaltungen mit Quarz auf einem Steckbrett nicht sonderlich zu empfehlen, die Betriebssicherheit ist nicht immer gegeben. &lt;br /&gt;
&lt;br /&gt;
Auch wenn nun ein Quarz angeschlossen ist, so wird er noch immer nicht genutzt. Noch immer arbeitet der [[ATMega32]] mit seiner intern voreingestellten 1 Mhz Taktfrequenz. Um dies umzustellen, muss man ein sogenanntes [[Fusebits|Fusebit]] im Controller umprogrammieren. Auch dies wurde schon im Beitrag [[Bascom - Erstes Programm in den AVR_Controller übertragen]] näher beschrieben. Hier sei daher nur nochmals gesagt, dass dies auch sehr bequem in [[Bascom]] erfolgt:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_bascomfusebitquarz.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sobald wir das umgestellt haben, müssen wir auch in dem Programm die Anweisung &lt;br /&gt;
&lt;br /&gt;
 $crystal = 1000000 &lt;br /&gt;
&lt;br /&gt;
durch &lt;br /&gt;
&lt;br /&gt;
 $crystal = 16000000 &lt;br /&gt;
&lt;br /&gt;
ersetzen, denn unser Quarz taktet nun mit 16 MHz.&lt;br /&gt;
&lt;br /&gt;
==Spannung stabilisieren==&lt;br /&gt;
Auch wenn unsere Basis-Schaltung für Experimente inzwischen schon ganz nett ist, so ist es doch etwas ungünstig, dass wir stets 5V zur Verfügung haben müssen. Nicht immer steht ein geeignetes Netzteil zur Verfügung, zudem soll ein Controller auch oft mit Batterien versorgt werden. Aus diesem Grund verfügen fast alle Entwicklungsboards wie ([[RN-Control]], STK500 etc.) über einen [[Spannungsregler]].&lt;br /&gt;
[[Bild:78s05.jpg|thumb|Spannungsregler 78S05]] Dieser wandelt eine höhere Eingangsspannung (ca. 7 bis 20 V) immer genau in  5V  um. Sowas erhöht die Betriebssicherheit einer Schaltung nochmals immens. Als [[Spannungsregler]] (IC2) wird oft der 7805 genutzt, empfehlenswert ist der Typ 78S05, welcher 2A verträgt sowie über einen Kurzschluss- und Überlastungsschutz verfügt. &lt;br /&gt;
Die beiden 100nF-Kondensatoren sind wichtig, sie sollen HF-Störungen und Schwingungen vermeiden. Der Elko vor dem Spannungsregler ist vor allem dann wichtig, wenn die Spannung von einem Netzgerät kommt und noch etwas geglättet werden muss. Je höher der Strombedarf der Schaltung, desto größer kann man die Kapazität wählen. Es schadet nicht, wenn man den Elko einige Nummern größer wählt, man ist dann quasi für alle Fälle gerüstet. So sind Werte zwischen 100 uF und 2200 uF durchaus denkbar. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wir erweitern unsere Schaltung somit wie folgt:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_spannung.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht's wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_spannung.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
==Daten und Texte zum PC übertragen==&lt;br /&gt;
In vielen Programmen müssen Daten oder Texte vom Controller an den PC oder umgekehrt gesendet werden. Insbesondere bei komplexen Programmen kann man auf diese Weise Variableninhalte ausgeben und somit auch Fehler im Programmcode schneller finden und korrigieren. In der Regel ist das ganz einfach, denn der [[Microcontroller]] [[ATMega32]] verfügt über einen internen [[UART]], also ein Modul, das Daten über die [[RS232]]-Schnittstelle zum PC senden bzw. auch von ihm empfangen kann. Leider arbeitet jedoch die Controllerschnittstelle mit 5V und die PC-Schnittstelle der Norm entsprechend mit +-12V. Daher muss unbedingt ein Schaltkreis dazwischen, welcher die Pegel anpasst. Gewöhnlich nimmt man hier das IC MAX232(CPE), welches inzwischen sehr preiswert erhältlich ist.&lt;br /&gt;
&lt;br /&gt;
Wir müssen also die Schaltung nochmals erweitern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_max232.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das IC Max232 ist im Schaltplan in der üblichen funktionsorientierten Darstellung gezeichnet. Zur besseren Übersichtlichkeit wurden die immer benötigten Anschlüsse für VCC (Pin 16) und GND (Pin 15) getrennt oben rechts im Schaltplan dargestellt. Also nicht vergessen !!&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht's so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_max232.jpg|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Über eine dreipolige Stiftleiste ([[RN-Definitionen]]) wird nun das Steckboard mit der [[RS232]]-Schnittstelle des PC verbunden. Es ist nun ein Leichtes, mit einem Programm Daten zum PC zu senden. Das nachfolgende Programm gibt Hinweise mit der Anweisung '''PRINT''' aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step5.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 16000000&lt;br /&gt;
$baud = 9600&lt;br /&gt;
&lt;br /&gt;
Config Portc.0 = Output              'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C)&lt;br /&gt;
&lt;br /&gt;
Config Pina.7 = Input                'Ein Pin (PA0) wird als Eingang definiert&lt;br /&gt;
Porta.7 = 1                          'Interner Pullup Widerstand ein&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
  If Pina.7 = 1 Then&lt;br /&gt;
    Portc.0 = 1                      'Pin wird auf High, also 5V geschaltet&lt;br /&gt;
    Print &amp;quot;Schalter nicht gedrückt&amp;quot;&lt;br /&gt;
  Else&lt;br /&gt;
    Portc.0 = 0                      'Pin wird auf Low, also 0V geschaltet&lt;br /&gt;
    Print &amp;quot;Schalter gedrückt&amp;quot;&lt;br /&gt;
  End If&lt;br /&gt;
  Wait 1&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Möglichkeiten des Steckbrettes erreicht==&lt;br /&gt;
Inzwischen füllt der Schaltplan fast ein DIN-A4-Blatt und auf dem Steckbrett sieht's auch schon recht wirr aus, dabei haben wir nur die wichtigsten Grundelemente auf dem Steckbrett. Für eine Roboter-Steuerung oder andere Anwendung fehlt doch noch einiges. Zum Beispiel weitere Taster, weitere LEDs, Motortreiber, damit der Controller auch Motoren ansteuern kann und ein [[I2C]]-Bus-Anschluss.&lt;br /&gt;
Dies alles noch auf einem Steckbrett zu realisieren macht wenig Sinn, zumal bereits jetzt schon durch die doch recht langen Leitungen/Verkabelungen erhebliche Störungen auftreten. In der letzten Phase ist es immer öfters zu Übertragungsfehlern beim Programmieren gekommen, oft musste dies 20mal wiederholt werden. Dies zeigt, dass ein Steckbrett bestenfalls für ganz kleine Controller-Experimente herhalten kann. Für größere Dinge sollte man dann doch zu einer Lösung auf einer gedruckten Platine greifen. Spezielle Experimentierboards  bieten mehr Sicherheit und haben neben den Grundelementen, die hier beschrieben wurden, noch eine ganze Menge mehr drauf. Bei [[RN-Control]] zum Beispiel 5 Tasten, 8 Leds, Motortreiber, Lautsprecher, diverse Anschlüsse etc. &lt;br /&gt;
Der Größenunterschied wird im Bild deutlich:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_rncontrol.jpg|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auch wenn das Steckbrett also kein Controllerboard ersetzen kann, so hat das kleine Tutorial doch gezeigt, wie eine [[Avr]]-Schaltung aufzubauen ist. Dieses Wissen sollte man auch besitzen, wenn man ein Controllerboard nutzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Was braucht man, wenn man mit einem Controllerboard den Einstieg startet?==&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_ispkabel.jpg|thumb|ISP-Programmierkabel]]Neben dem eigentlichen Board braucht man, wie schon zuvor angesprochen, ein [[AVR-ISP Programmierkabel]]. Da das Selbstbauen kaum billiger ist, ist zu empfehlen, ein solches fertig mitzubestellen. Am preiswertesten und zugleich vielseitigsten sind die ISP-Adapter, die man an das Druckerport anschließt (siehe Bild). Es gibt aber auch USB-Lösungen, wobei diese jedoch oft teuer sind und auch oft weniger Controller programmieren können. Hat man jedoch einen PC oder Notebook ohne parellelen Druckeranschluss, so muss man wohl oder übel in den meisten Fällen zu einem seriellen oder USB-Programmieradapter greifen. Neben den erwähnten Nachteilen hat der USB Dongle aber oft auch den Vorteil, dass er etwas schneller ist. Dieser Unterschied macht sich aber nur bei sehr großen Programmen und Controllern wirklich bemerkbar.&lt;br /&gt;
&lt;br /&gt;
Als zweites braucht man natürlich eine Stromversorgung. Ideal sind Gleichspannungsnetzgeräte, die zwischen 9 und 12V liefern, vorausgesetzt, das Board hat einen Spannungsregler wie in der Regel die RN-Boards. Man kann hier ein normales Steckernetzteil oder ein komfortables Labornetzteil nehmen. Um etwas Reserve zu haben, wäre es gut, wenn das Netzteil mindestens 1 A liefern kann. Alternativ kann man auch Akkupacks oder Batterien nutzen, allerdings mindestens 7,2V sollten die schon liefern können, sicherer sind 8,4-, 9,6- oder 12V-Akkus.&lt;br /&gt;
Das wäre eigentlich schon das Wichtigste, um ein Board in Betrieb zu nehmen und Experimente zu machen. &lt;br /&gt;
&lt;br /&gt;
Allerdings, ein RS232-Kabel ist ebenfalls noch sehr empfehlenswert. Dieses erlaubt die Ausgabe von Texten und Variablen auf den PC, wir haben es ja oben im Steckbrettbeispiel schon gesehen. Dazu wird auf dem PC ein [[Terminalprogramm]] gestartet und über die [[RS232]] Schnittstelle mit dem PC verbunden. Bei manchen Boards ist sowieso ein RS232 Kabel unerläßlich, wie z.B. RN-Motor, RN-Speak etc. Nützlich ist es aber überall. Man kann ein solches Kabel selbst bauen oder gleich beim Kauf eines Boardes mitbestellen.&lt;br /&gt;
&lt;br /&gt;
Also nochmal die Zusammenfassung für den Einstieg:&lt;br /&gt;
&lt;br /&gt;
* Controllerboard&lt;br /&gt;
* [[AVR-ISP Programmierkabel]] mit 10-poligem Wannenstecker&lt;br /&gt;
* RS-232-Kabel (mit 3-poligem Adapter, wenn Board [[RN-Definitionen]] erfüllt)&lt;br /&gt;
* Netzgerät oder Akku (ideal 9 bis 12V, notfalls auch 7,2 bis 20V)&lt;br /&gt;
* [[Bascom]]-Compiler-Vollversion ist nur nötig, wenn man gleich größere Sachen anstrebt, ansonsten reicht das Demo, genauso wie ein [[Avr-gcc]]-Compiler. Bei RN-Boards sind diese Programme beim Board- oder Platinenkauf sowieso dabei, ansonsten kann man diese im Internet downloaden.&lt;br /&gt;
* Ein gutes Buch ist immer gut, siehe [[Buchvorstellungen]]&lt;br /&gt;
&lt;br /&gt;
==Autor==&lt;br /&gt;
*[[Benutzer:Frank|Frank]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Quellen===&lt;br /&gt;
* [[Abblockkondensator]] Artikel von Uwegw&lt;br /&gt;
* RN-Board Dokumentationen aus [[:Kategorie:Projekte]]&lt;br /&gt;
* diverse Datenblätter&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
*[[AVR-ISP Programmierkabel]]&lt;br /&gt;
*[[Mit welchem Controllerboard fang ich an]]&lt;br /&gt;
*[[Abblockkondensator]]&lt;br /&gt;
*[[Bascom]]&lt;br /&gt;
*[[Bascom - Erstes Programm in den AVR_Controller übertragen]]&lt;br /&gt;
*[[Avr]]&lt;br /&gt;
*[[Atmel Controller Mega16 und Mega32]]&lt;br /&gt;
*[[Spannungsregler]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Projekte]]&lt;/div&gt;</summary>
		<author><name>Ratzfatz</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=AVR-Einstieg_leicht_gemacht&amp;diff=14986</id>
		<title>AVR-Einstieg leicht gemacht</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=AVR-Einstieg_leicht_gemacht&amp;diff=14986"/>
				<updated>2009-06-11T13:16:54Z</updated>
		
		<summary type="html">&lt;p&gt;Ratzfatz: /* Wie bekommt man das Programm in den Controller? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:avr8.jpg|thumb|300px|Einen Controller zum Leben zu erwecken ist nicht schwer, manchmal reichen ein paar Teile! Beispiel mit Mega8]]&lt;br /&gt;
==Wir starten mit einem ATMega32== &lt;br /&gt;
Immer wieder gibt es in Foren, wie dem Roboternetz, Einsteiger, die das erstemal mit einem [[Microcontroller]] in Berührung kommen. Trotz zahlreicher Einstiegsbeiträge im Forum wiederholen sich doch bestimmte Anfängerfragen immer wieder, daher soll dieser Artikel noch einmal aufzeigen, wie man den ersten Schritt tut und einen Controller zum Leben erweckt. Es werden verschiedene Grundschaltungen aufgezeigt und erläutert, welche Bauteile welche Funktion besitzen.&lt;br /&gt;
Als Controller verwenden wir einen [[AVR]] [[ATMega32]], der derzeit größte [[AVR]]-Controller, welcher noch im bastlerfreundlichen DIP-Gehäuse verfügbar ist.  Für kleine bis mittlere Projekte ein sehr empfehlenswerter Controller, zumal er preislich mit ca. 6-7 Euro noch sehr günstig ist und zudem mit seinem 40-Pin-Gehäuse reichlich Anschlussmöglichkeiten besitzt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mega1632.gif|center]]&lt;br /&gt;
&lt;br /&gt;
Wie auf dem Bild zu sehen, verfügt auch der etwas günstigere ATMega16 über die gleiche Pinbelegung, daher könnten wir in diesem Tutorial auch diesen Typ verwenden. Der ATMega32 hat aber doppelt soviel Speicherplatz für Programmdaten (Flash), daher hat man für eine geringe Preisdifferenz doch mehr Möglichkeiten.&lt;br /&gt;
Wer noch 3 bis 4 Euro sparen will, dem sei der [[ATMega8]] oder [[ATMega168]] empfohlen, diese Typen sind sehr ähnlich, so dass das Tutorial weitgehend auch auf diese Typen bezogen werden kann. Allerdings haben diese Typen deutlich weniger Anschlussmöglichkeiten (28 Pin DIP Gehäuse). &lt;br /&gt;
&lt;br /&gt;
Die Frage, ob man mit einem fertigen Controllerboard, einer Experimentierplatine oder einem Steckbrett beginnen sollte, wurde ja in dem RN-Wissen Wiki Beitrag &amp;quot;[[Mit welchem Controllerboard fang ich an]]&amp;quot; angesprochen. In den meisten Fällen favorisiert der Autor dieses Artikels ein fertiges Controllerboard. Warum das so ist, dazu am Ende noch ein paar Anmerkungen. Dennoch soll diese Einführung schrittweise anhand eines Steckbrettes erläutert werden.&lt;br /&gt;
&lt;br /&gt;
==Start mit handelsüblichem Steckbrett==&lt;br /&gt;
Ein Steckbrett hat den Vorteil, dass man theoretisch ohne Löten alle Bauteile relativ zügig zusammenstecken kann. Bestimmte Steckkontakte innerhalb einer Reihe sind im Steckbrett miteinander verbunden, so dass man nachher pro Bauteilbeinchen noch einige Steckkontakte zum Verdrahten mit Schaltdraht oder speziell konfektionierter Litze verwenden kann.&lt;br /&gt;
&lt;br /&gt;
'''Die Vorteile eines Steckbretts:'''&lt;br /&gt;
&lt;br /&gt;
*Bauteile können ohne Löten eingesetzt und verdrahtet werden&lt;br /&gt;
*recht zügiger Schaltungsaufbau&lt;br /&gt;
*eine Schaltung kann leicht geändert oder korrigiert werden, defekte Teile sind leicht tauschbar&lt;br /&gt;
*ein Steckbrett kann auch für ganz andere Schaltungen verwendet werden&lt;br /&gt;
'''Die Nachteile eines Steckbretts gegenüber gedruckten Schaltungen und Experimentierplatinen sind:'''&lt;br /&gt;
&lt;br /&gt;
*nicht alle Bauteile passen, so dass wir doch noch etwas löten müssen&lt;br /&gt;
*nur geringer Schaltungsumfang möglich, da es schnell unübersichtlich wird&lt;br /&gt;
*sehr störanfällig wegen grosser Kabellängen, dadurch oft Funktionsstörungen&lt;br /&gt;
*Bauteile müssen zum Teil verbogen werden, damit sie passen&lt;br /&gt;
&lt;br /&gt;
Man beginnt, indem man den Controller AVR [[ATMega32]] auf das Board aufsetzt:&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrettmega32.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
==Die Grundschaltung==&lt;br /&gt;
Damit ein Controller erst mal zum Laufen kommt, benötigt man zumindest einen 10-k-Widerstand, einen 100-nF-Kondensator und eine 5V-Spannungsquelle. Das Ganze muss entsprechend dem unteren Schaltplan verschaltet werden, man spricht von einer sogenannten Grundschaltung. In dem Schaltplan wurde der Controller im Übrigen pinkompatibel als Schaltzeichen verwendet, die Pinreihenfolge ist also im Schaltplan identisch mit der echten Bauteilpin-Reihenfolge. Diese Darstellung erleichtert den Nachbau der Schaltung auf einem Steckbrett aber auch einer Experimentierplatine ungemein. Gewöhnlich verwendet man in Schaltplänen eine etwas andere Darstellung, bei der die Pins nach Funktionsgruppen geordnet sind. Bei solchen Schaltplänen muss man sich dann anhand der Pin-Nummern orientieren, man wird dies am Ende des Artikels noch bei dem IC MAX232 sehen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mega32.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn man schon einige Grundschaltungen in anderen Tutorials gesehen hat, dann wird man bemerken, dass unsere doch noch etwas einfacher ist und weniger Bauteile benötigt.  Hier wird beispielsweise kein Quarz verwendet, da der ATMega32 auch intern einen Takt generieren kann. Wer mit dem ADC genau messen will, sollte statt der Beschaltung im Bild, zwischen Vcc und AVcc eine Spule von 10uH und einen Kondensator von 100nF zwischen AVcc und GND schalten. Will man AVcc als Referenzspannung verwenden, muss noch ein 100nF Kondensator von ARef nach GND.&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht die obere Schaltung wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett1.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um den Controller in Betrieb zu nehmen, benötigt man bei dieser Schaltung ein Netzteil, das eine stabilisierte Spannung von 4 bis 5V liefert. Wir gehen erst einmal davon aus, dass man über dieses verfügt. &lt;br /&gt;
Erwähnenswert ist noch, dass der Kondensator als [[Abblockkondensator]] zur Unterdrückung von Störungen dient. Er muss so nah wie möglich an die Spannungszuführung am Controller selbst gesetzt werden. Ohne Kondensator enstehen erhebliche Störungen in der Versorgungsspannung, das Bild verdeutlicht es:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Abblockkondensator OhneC amAVR.jpg|center]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Der Widerstand in der Grundschaltung dient dazu, die Reset-Leitung konstant auf definiertem High-Pegel zu halten. Verbindet man diesen RESET-Pin später kurz mit GND (Masse), dann wird das Programm im Controller neu gestartet.&lt;br /&gt;
&lt;br /&gt;
==Woran merkt man, dass der Controller funktioniert?==&lt;br /&gt;
Gute Frage! Man merkt es garnicht. Genau genommen funktioniert ja auch trotz korrekter Schaltung noch immer nix, denn es muss zuerst ein Programm in den Controller geladen werden, damit er überhaupt weiss, was zu tun ist. Ohne Programm ist der Controller quasi tot.&lt;br /&gt;
&lt;br /&gt;
==Wie bekommt man das Programm in den Controller?==&lt;br /&gt;
Der Controller verfügt über eine sogenannte [[ISP]]-Schnittstelle. Das bedeutet, über bestimmte Pins ([[SPI]]) kann der Controller mit einer geeigneten PC-Software (zum Beispiel Bascom) programmiert werden. Zum Anschluss an den PC benötigt man jedoch einen sogenannten ISP-Dongle, auch Programmieradapter genannt. Hier gibt es verschiedene Lösungen, serielle und parallele Adapter. Original von Atmel oder kompatible Lösungen. Der am meisten verwendete ISP-Dongle wird am Druckerport betrieben. Diese gibt es inzwischen recht preiswert, sodass sich das Selbstbauen eigentlich nicht lohnt. Da man auch gern auf ein paar Fehlerquellen verzichten sollte, würde ich eine Fertiglösung empfehlen. Wer ihn selbst bauen möchte, findet ([[AVR-ISP_Programmierkabel|hier]] eine ISP-Dongle-Bauanleitung und sogar eine fertige Platine dafür  ([[AVR-ISP_Programmierkabel]]).&lt;br /&gt;
&lt;br /&gt;
Sowas sieht dann so aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Avrtutorial_ispkabel.jpeg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan eines solchen Programmierkabels:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:ispschaltplan.gif|center|thumb|400px|Schaltplan des ISP-Dongels nach unserem Wiki-Bauplan, mit SUB-D Buchse. Bitte beachten, dass das IC1 hier im Plan als verschiedene Blöcke (IC1A/IC1B) dargestellt wird. Dies dient nur zur Übersicht, es handelt sich nur um ein IC, einfach auf die Pinnummern achten. Zum vergrößern anklicken.]]&lt;br /&gt;
&lt;br /&gt;
Ein noch einfacheres Programmierkabel ist auf der Seite http://thomaspfeifer.net/ beschrieben.&lt;br /&gt;
Dort findet man unter &amp;quot;AVR-Projekte&amp;quot; den Artikel &amp;quot;Ein einfaches Programmierkabel für Atmel-AVR Mikrocontroller&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Das Problem ist nun, wie schließe ich einen handelsüblichen ISP-Programmieradapter an den Controller auf dem Steckbrett an? Der normale 10-polige Wannenstecker (nach [[RN-Definitionen]]) passt nicht in ein Steckbrett. Das ist wieder so ein typischer Nachteil bei Steckbrettern! In unserem Beispiel haben wir dazu auf einem kleinen Stück Experimentierplatine einen steckbaren Adapter für das Steckboard gelötet.&lt;br /&gt;
Somit kann man die Schaltung um einen üblichen 10-poligen ISP-Programmieranschluss ergänzen:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mitisp.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht das gleiche so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_mitisp.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jetzt endlich ist es soweit, jetzt kann man den Controller über einen ISP-Programmieradapter mit dem PC verbinden. Aber unbedingt darauf achten, dass auch alles korrekt nach Schaltplan gesteckt wurde und dass die Betriebsspannung 5V nicht übersteigt. Ansonsten könnte man sich Dongle oder sogar die PC-Schnittstelle beschädigen.&lt;br /&gt;
Als Entwicklungsumgebung nutzen wir hier im Tutorial [[Bascom]]. [[Bascom]] ist ein sehr beliebter Basic-[[Compiler]], der zahlreiche [[AVR]] Controllertypen programmieren kann. Da auch ein [[Terminalprogramm]] und ein Programmer integriert ist, enthält diese PC-Software alles, was man braucht, das erleichtert den Einstieg zusätzlich. Die Software gibts kostenlos als Demo bis 4K Code, für unsere Beispiele und den Einstieg reicht das allemal, siehe dazu Artikel Bascom.&lt;br /&gt;
&lt;br /&gt;
Wie man ein Programm schreibt, kompiliert und überträgt, wurde schon in diesem Beitrag [[Bascom - Erstes Programm in den AVR Controller übertragen]] ausführlich behandelt, wir ersparen uns deshalb diese Details. Man sollte aber bei Unklarheiten zum Kompilieren und Übertragen diesen Artikel auf jeden Fall lesen.&lt;br /&gt;
&lt;br /&gt;
Als erstes kompilieren und übertragen wir folgendes Programm:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step1.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Programm macht eigentlich nichts, außer dass es eine Endlosschleife ausführt. Aber da wir noch überhaupt nix am Controller angeschlossen haben, können wir eh noch nicht sehen, ob ein Programm nun richtig ausgeführt wird oder nicht.&lt;br /&gt;
Allerdings können wir schonmal üben, das Programm mit Bascom zu übertragen. Wenn wir alles richtig aufgebaut haben und Spannung anliegt, dann sollte automatisch der Controller in Bascom erkannt werden. Die Übertragung sollte dann ohne Fehlermeldung erfolgen können. Wenn wir das geschafft haben, geht’s weiter.&lt;br /&gt;
&lt;br /&gt;
==Läuft die Schaltung und das Programm?==&lt;br /&gt;
Damit wir nun endlich sehen, ob sich bei unserer Schaltung auch was tut, schließen wir eine LED über einen 1K-Vorwiderstand an einen Port an. Da wir die Kathode an den Controllerpin und die Anode an Plus legen, leuchtet die LED immer dann, wenn dieser Pin auf Low geschaltet wird.&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mitled.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht's nun so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_mitled.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Damit man nun auch wirklich sieht, ob das Programm läuft, schreiben wir ein kleines Basic-Programm, welches eine LED abwechselnd ein– und ausschaltet. Wir kompilieren und übertragen also folgendes Programm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step2.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
&lt;br /&gt;
Config Portc.0 = Output       'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C)&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
  Portc.0 = 1                 'Pin wird auf High, also 5V geschaltet&lt;br /&gt;
  Waitms 100&lt;br /&gt;
  Portc.0 = 0                 'Pin wird auf Low, also 0V geschaltet&lt;br /&gt;
  Waitms 100&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn die LED nun schnell blinkt, dann funktioniert die aufgebaute Schaltung perfekt. Wir haben gleichzeitig gelernt, wie man einen Ausgangsport, also Controllerpin, ein- und ausschalten kann. Nahezu alle Pins beim ATMega32 können auf diese Weise als Ausgangsport betrieben werden. Somit lassen sich nicht nur viele Leds, sondern unter Zuhilfenahme eines Treibers (z.B. Transistors) auch Relais und andere Aktoren schalten.&lt;br /&gt;
&lt;br /&gt;
==Eingangsport fragt Taster ab==&lt;br /&gt;
Nun erweitern wir die Schaltung noch um einen Taster. Nahezu jedes Port kann bei einem ATMega32 auch per Software als Eingangsport konfiguriert werden. Wir schließen z.B. einen Taster an Port-Pin PA7 an. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mittaster.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Port wird in der Software so konfiguriert, dass es als Eingang arbeitet und intern über einen hohen Widerstand  (Pullup-Widerstand) ständig auf High-Pegel gelegt wird. Wird nun eine Taste gedrückt, so wird der Pegel auf Low gezogen.&lt;br /&gt;
Das Beispielprogramm ist nun so gestaltet, dass bei gedrückter Taste die LED leuchtet und beim Loslassen wieder ausgeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step3.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
&lt;br /&gt;
Config Portc.0 = Output        'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C)&lt;br /&gt;
&lt;br /&gt;
Config Pina.7 = Input          'Ein Pin (PA0) wird als Eingang definiert&lt;br /&gt;
Porta.7 = 1                    'Interner Pullup Widerstand ein&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
  If Pina.7 = 1 Then&lt;br /&gt;
    Portc.0 = 1                'Pin wird auf High, also 5V geschaltet&lt;br /&gt;
  Else&lt;br /&gt;
    Portc.0 = 0                'Pin wird auf Low, also 0V geschaltet&lt;br /&gt;
  End If&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Grundschaltung mit Quarz==&lt;br /&gt;
Obwohl wir ab der letzten Schaltung schon einiges mit dem Controller anfangen können, so fehlt doch noch etwas Wichtiges. Oft ist es nämlich notwendig, dass ein Controller sehr genaue Frequenzen mißt oder ganz genaue Taktraten ausgeben kann. Leider ist der interne Taktgenerator nicht 100% exakt, was bei manchen Anwendungen störend ist. Zum Beispiel können über die RS232-Schnittstelle Daten nicht immer ganz fehlerfrei übertragen werden, wenn die Taktfrequenz nicht genau stimmt. Daher wird in den meisten Anwendungsfällen ein Quarz zur Takterzeugung genutzt, Sie kennen das sicher aus anderen Grundschaltungen. Also erweitern wir unsere Schaltung gleich noch um einen Quarz mit den zugehörigen 22pF-Kondensatoren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mitquarz.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf unserem Steckbrett wird's langsam voller, hier sieht's also inzwischen so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_mitquarz.jpg|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Normalerweise sollte der Quarz genauso wie die beiden 22pF-Kondensatoren, die zum Anschwingen des Quarzes dienen, möglichst nahe am Controller platziert werden. Auf dem Steckbrett ist das manchmal gar nicht so einfach, insbesondere wenn man wie in diesem Fall den Quarz erst später hinzufügt. Wichtig ist nämlich, dass die Leitungen vom Quarz zum Controller möglichst kurz sind, bei gedruckten Schaltungen oft nur 1 bis 2 cm! Auch die einzelnen Bauteilbeinchen, z.B. der Kondensatoren, sollten normalerweise so kurz wie möglich sein.&lt;br /&gt;
Ist dies nicht der Fall, wie auch in unserem Bild, dann fungieren diese Leitungen fast wie eine Funkantenne. Dies führt in der Regel zu starken Hochfrequenzsignalen, die nicht nur unsere Schaltung, sondern auch andere Schaltungen in der Nähe stören könnten. Man merkt dies auch oft daran, dass sich ein Board bei höherer Quarzfrequenz immer seltener fehlerfrei ohne Übertragungsfehler programmieren läßt.&lt;br /&gt;
Grundsätzlich sind daher Schaltungen mit Quarz auf einem Steckbrett nicht sonderlich zu empfehlen, die Betriebssicherheit ist nicht immer gegeben. &lt;br /&gt;
&lt;br /&gt;
Auch wenn nun ein Quarz angeschlossen ist, so wird er noch immer nicht genutzt. Noch immer arbeitet der [[ATMega32]] mit seiner intern voreingestellten 1 Mhz Taktfrequenz. Um dies umzustellen, muss man ein sogenanntes [[Fusebits|Fusebit]] im Controller umprogrammieren. Auch dies wurde schon im Beitrag [[Bascom - Erstes Programm in den AVR_Controller übertragen]] näher beschrieben. Hier sei daher nur nochmals gesagt, dass dies auch sehr bequem in [[Bascom]] erfolgt:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_bascomfusebitquarz.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sobald wir das umgestellt haben, müssen wir auch in dem Programm die Anweisung &lt;br /&gt;
&lt;br /&gt;
 $crystal = 1000000 &lt;br /&gt;
&lt;br /&gt;
durch &lt;br /&gt;
&lt;br /&gt;
 $crystal = 16000000 &lt;br /&gt;
&lt;br /&gt;
ersetzen, denn unser Quarz taktet nun mit 16 MHz.&lt;br /&gt;
&lt;br /&gt;
==Spannung stabilisieren==&lt;br /&gt;
Auch wenn unsere Basis-Schaltung für Experimente inzwischen schon ganz nett ist, so ist es doch etwas ungünstig, dass wir stets 5V zur Verfügung haben müssen. Nicht immer steht ein geeignetes Netzteil zur Verfügung, zudem soll ein Controller auch oft mit Batterien versorgt werden. Aus diesem Grund verfügen fast alle Entwicklungsboards wie ([[RN-Control]], STK500 etc.) über einen [[Spannungsregler]].&lt;br /&gt;
[[Bild:78s05.jpg|thumb|Spannungsregler 78S05]] Dieser wandelt eine höhere Eingangsspannung (ca. 7 bis 20 V) immer genau in  5V  um. Sowas erhöht die Betriebssicherheit einer Schaltung nochmals immens. Als [[Spannungsregler]] (IC2) wird oft der 7805 genutzt, empfehlenswert ist der Typ 78S05, welcher 2A verträgt sowie über einen Kurzschluss- und Überlastungsschutz verfügt. &lt;br /&gt;
Die beiden 100nF-Kondensatoren sind wichtig, sie sollen HF-Störungen und Schwingungen vermeiden. Der Elko vor dem Spannungsregler ist vor allem dann wichtig, wenn die Spannung von einem Netzgerät kommt und noch etwas geglättet werden muss. Je höher der Strombedarf der Schaltung, desto größer kann man die Kapazität wählen. Es schadet nicht, wenn man den Elko einige Nummern größer wählt, man ist dann quasi für alle Fälle gerüstet. So sind Werte zwischen 100 uF und 2200 uF durchaus denkbar. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wir erweitern unsere Schaltung somit wie folgt:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_spannung.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht's wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_spannung.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
==Daten und Texte zum PC übertragen==&lt;br /&gt;
In vielen Programmen müssen Daten oder Texte vom Controller an den PC oder umgekehrt gesendet werden. Insbesondere bei komplexen Programmen kann man auf diese Weise Variableninhalte ausgeben und somit auch Fehler im Programmcode schneller finden und korrigieren. In der Regel ist das ganz einfach, denn der [[Microcontroller]] [[ATMega32]] verfügt über einen internen [[UART]], also ein Modul, das Daten über die [[RS232]]-Schnittstelle zum PC senden bzw. auch von ihm empfangen kann. Leider arbeitet jedoch die Controllerschnittstelle mit 5V und die PC-Schnittstelle der Norm entsprechend mit +-12V. Daher muss unbedingt ein Schaltkreis dazwischen, welcher die Pegel anpasst. Gewöhnlich nimmt man hier das IC MAX232(CPE), welches inzwischen sehr preiswert erhältlich ist.&lt;br /&gt;
&lt;br /&gt;
Wir müssen also die Schaltung nochmals erweitern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_max232.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das IC Max232 ist im Schaltplan in der üblichen funktionsorientierten Darstellung gezeichnet. Zur besseren Übersichtlichkeit wurden die immer benötigten Anschlüsse für VCC (Pin 16) und GND (Pin 15) getrennt oben rechts im Schaltplan dargestellt. Also nicht vergessen !!&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht's so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_max232.jpg|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Über eine dreipolige Stiftleiste ([[RN-Definitionen]]) wird nun das Steckboard mit der [[RS232]]-Schnittstelle des PC verbunden. Es ist nun ein Leichtes, mit einem Programm Daten zum PC zu senden. Das nachfolgende Programm gibt Hinweise mit der Anweisung '''PRINT''' aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step5.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 16000000&lt;br /&gt;
$baud = 9600&lt;br /&gt;
&lt;br /&gt;
Config Portc.0 = Output              'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C)&lt;br /&gt;
&lt;br /&gt;
Config Pina.7 = Input                'Ein Pin (PA0) wird als Eingang definiert&lt;br /&gt;
Porta.7 = 1                          'Interner Pullup Widerstand ein&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
  If Pina.7 = 1 Then&lt;br /&gt;
    Portc.0 = 1                      'Pin wird auf High, also 5V geschaltet&lt;br /&gt;
    Print &amp;quot;Schalter nicht gedrückt&amp;quot;&lt;br /&gt;
  Else&lt;br /&gt;
    Portc.0 = 0                      'Pin wird auf Low, also 0V geschaltet&lt;br /&gt;
    Print &amp;quot;Schalter gedrückt&amp;quot;&lt;br /&gt;
  End If&lt;br /&gt;
  Wait 1&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Möglichkeiten des Steckbrettes erreicht==&lt;br /&gt;
Inzwischen füllt der Schaltplan fast ein DIN-A4-Blatt und auf dem Steckbrett sieht's auch schon recht wirr aus, dabei haben wir nur die wichtigsten Grundelemente auf dem Steckbrett. Für eine Roboter-Steuerung oder andere Anwendung fehlt doch noch einiges. Zum Beispiel weitere Taster, weitere LEDs, Motortreiber, damit der Controller auch Motoren ansteuern kann und ein [[I2C]]-Bus-Anschluss.&lt;br /&gt;
Dies alles noch auf einem Steckbrett zu realisieren macht wenig Sinn, zumal bereits jetzt schon durch die doch recht langen Leitungen/Verkabelungen erhebliche Störungen auftreten. In der letzten Phase ist es immer öfters zu Übertragungsfehlern beim Programmieren gekommen, oft musste dies 20mal wiederholt werden. Dies zeigt, dass ein Steckbrett bestenfalls für ganz kleine Controller-Experimente herhalten kann. Für größere Dinge sollte man dann doch zu einer Lösung auf einer gedruckten Platine greifen. Spezielle Experimentierboards  bieten mehr Sicherheit und haben neben den Grundelementen, die hier beschrieben wurden, noch eine ganze Menge mehr drauf. Bei [[RN-Control]] zum Beispiel 5 Tasten, 8 Leds, Motortreiber, Lautsprecher, diverse Anschlüsse etc. &lt;br /&gt;
Der Größenunterschied wird im Bild deutlich:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_rncontrol.jpg|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auch wenn das Steckbrett also kein Controllerboard ersetzen kann, so hat das kleine Tutorial doch gezeigt, wie eine [[Avr]]-Schaltung aufzubauen ist. Dieses Wissen sollte man auch besitzen, wenn man ein Controllerboard nutzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Was braucht man, wenn man mit einem Controllerboard den Einstieg startet?==&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_ispkabel.jpg|thumb|ISP-Programmierkabel]]Neben dem eigentlichen Board braucht man, wie schon zuvor angesprochen, ein [[AVR-ISP Programmierkabel]]. Da das Selbstbauen kaum billiger ist, ist zu empfehlen, ein solches fertig mitzubestellen. Am preiswertesten und zugleich vielseitigsten sind die ISP-Adapter, die man an das Druckerport anschließt (siehe Bild). Es gibt aber auch USB-Lösungen, wobei diese jedoch oft teuer sind und auch oft weniger Controller programmieren können. Hat man jedoch einen PC oder Notebook ohne parellelen Druckeranschluss, so muss man wohl oder übel in den meisten Fällen zu einem seriellen oder USB-Programmieradapter greifen. Neben den erwähnten Nachteilen hat der USB Dongle aber oft auch den Vorteil, dass er etwas schneller ist. Dieser Unterschied macht sich aber nur bei sehr großen Programmen und Controllern wirklich bemerkbar.&lt;br /&gt;
&lt;br /&gt;
Als zweites braucht man natürlich eine Stromversorgung. Ideal sind Gleichspannungsnetzgeräte, die zwischen 9 und 12V liefern, vorausgesetzt, das Board hat einen Spannungsregler wie in der Regel die RN-Boards. Man kann hier ein normales Steckernetzteil oder ein komfortables Labornetzteil nehmen. Um etwas Reserve zu haben, wäre es gut, wenn das Netzteil mindestens 1 A liefern kann. Alternativ kann man auch Akkupacks oder Batterien nutzen, allerdings mindestens 7,2V sollten die schon liefern können, sicherer sind 8,4-, 9,6- oder 12V-Akkus.&lt;br /&gt;
Das wäre eigentlich schon das Wichtigste, um ein Board in Betrieb zu nehmen und Experimente zu machen. &lt;br /&gt;
&lt;br /&gt;
Allerdings, ein RS232-Kabel ist ebenfalls noch sehr empfehlenswert. Dieses erlaubt die Ausgabe von Texten und Variablen auf den PC, wir haben es ja oben im Steckbrettbeispiel schon gesehen. Dazu wird auf dem PC ein [[Terminalprogramm]] gestartet und über die [[RS232]] Schnittstelle mit dem PC verbunden. Bei manchen Boards ist sowieso ein RS232 Kabel unerläßlich, wie z.B. RN-Motor, RN-Speak etc. Nützlich ist es aber überall. Man kann ein solches Kabel selbst bauen oder gleich beim Kauf eines Boardes mitbestellen.&lt;br /&gt;
&lt;br /&gt;
Also nochmal die Zusammenfassung für den Einstieg:&lt;br /&gt;
&lt;br /&gt;
* Controllerboard&lt;br /&gt;
* [[AVR-ISP Programmierkabel]] mit 10-poligem Wannenstecker&lt;br /&gt;
* RS-232-Kabel (mit 3-poligem Adapter, wenn Board [[RN-Definitionen]] erfüllt)&lt;br /&gt;
* Netzgerät oder Akku (ideal 9 bis 12V, notfalls auch 7,2 bis 20V)&lt;br /&gt;
* [[Bascom]]-Compiler-Vollversion ist nur nötig, wenn man gleich größere Sachen anstrebt, ansonsten reicht das Demo, genauso wie ein [[Avr-gcc]]-Compiler. Bei RN-Boards sind diese Programme beim Board- oder Platinenkauf sowieso dabei, ansonsten kann man diese im Internet downloaden.&lt;br /&gt;
* Ein gutes Buch ist immer gut, siehe [[Buchvorstellungen]]&lt;br /&gt;
&lt;br /&gt;
==Autor==&lt;br /&gt;
*[[Benutzer:Frank|Frank]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Quellen===&lt;br /&gt;
* [[Abblockkondensator]] Artikel von Uwegw&lt;br /&gt;
* RN-Board Dokumentationen aus [[:Kategorie:Projekte]]&lt;br /&gt;
* diverse Datenblätter&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
*[[AVR-ISP Programmierkabel]]&lt;br /&gt;
*[[Mit welchem Controllerboard fang ich an]]&lt;br /&gt;
*[[Abblockkondensator]]&lt;br /&gt;
*[[Bascom]]&lt;br /&gt;
*[[Bascom - Erstes Programm in den AVR_Controller übertragen]]&lt;br /&gt;
*[[Avr]]&lt;br /&gt;
*[[Atmel Controller Mega16 und Mega32]]&lt;br /&gt;
*[[Spannungsregler]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Projekte]]&lt;/div&gt;</summary>
		<author><name>Ratzfatz</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=AVR-Einstieg_leicht_gemacht&amp;diff=14985</id>
		<title>AVR-Einstieg leicht gemacht</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=AVR-Einstieg_leicht_gemacht&amp;diff=14985"/>
				<updated>2009-06-11T13:15:46Z</updated>
		
		<summary type="html">&lt;p&gt;Ratzfatz: /* Wie bekommt man das Programm in den Controller? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:avr8.jpg|thumb|300px|Einen Controller zum Leben zu erwecken ist nicht schwer, manchmal reichen ein paar Teile! Beispiel mit Mega8]]&lt;br /&gt;
==Wir starten mit einem ATMega32== &lt;br /&gt;
Immer wieder gibt es in Foren, wie dem Roboternetz, Einsteiger, die das erstemal mit einem [[Microcontroller]] in Berührung kommen. Trotz zahlreicher Einstiegsbeiträge im Forum wiederholen sich doch bestimmte Anfängerfragen immer wieder, daher soll dieser Artikel noch einmal aufzeigen, wie man den ersten Schritt tut und einen Controller zum Leben erweckt. Es werden verschiedene Grundschaltungen aufgezeigt und erläutert, welche Bauteile welche Funktion besitzen.&lt;br /&gt;
Als Controller verwenden wir einen [[AVR]] [[ATMega32]], der derzeit größte [[AVR]]-Controller, welcher noch im bastlerfreundlichen DIP-Gehäuse verfügbar ist.  Für kleine bis mittlere Projekte ein sehr empfehlenswerter Controller, zumal er preislich mit ca. 6-7 Euro noch sehr günstig ist und zudem mit seinem 40-Pin-Gehäuse reichlich Anschlussmöglichkeiten besitzt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mega1632.gif|center]]&lt;br /&gt;
&lt;br /&gt;
Wie auf dem Bild zu sehen, verfügt auch der etwas günstigere ATMega16 über die gleiche Pinbelegung, daher könnten wir in diesem Tutorial auch diesen Typ verwenden. Der ATMega32 hat aber doppelt soviel Speicherplatz für Programmdaten (Flash), daher hat man für eine geringe Preisdifferenz doch mehr Möglichkeiten.&lt;br /&gt;
Wer noch 3 bis 4 Euro sparen will, dem sei der [[ATMega8]] oder [[ATMega168]] empfohlen, diese Typen sind sehr ähnlich, so dass das Tutorial weitgehend auch auf diese Typen bezogen werden kann. Allerdings haben diese Typen deutlich weniger Anschlussmöglichkeiten (28 Pin DIP Gehäuse). &lt;br /&gt;
&lt;br /&gt;
Die Frage, ob man mit einem fertigen Controllerboard, einer Experimentierplatine oder einem Steckbrett beginnen sollte, wurde ja in dem RN-Wissen Wiki Beitrag &amp;quot;[[Mit welchem Controllerboard fang ich an]]&amp;quot; angesprochen. In den meisten Fällen favorisiert der Autor dieses Artikels ein fertiges Controllerboard. Warum das so ist, dazu am Ende noch ein paar Anmerkungen. Dennoch soll diese Einführung schrittweise anhand eines Steckbrettes erläutert werden.&lt;br /&gt;
&lt;br /&gt;
==Start mit handelsüblichem Steckbrett==&lt;br /&gt;
Ein Steckbrett hat den Vorteil, dass man theoretisch ohne Löten alle Bauteile relativ zügig zusammenstecken kann. Bestimmte Steckkontakte innerhalb einer Reihe sind im Steckbrett miteinander verbunden, so dass man nachher pro Bauteilbeinchen noch einige Steckkontakte zum Verdrahten mit Schaltdraht oder speziell konfektionierter Litze verwenden kann.&lt;br /&gt;
&lt;br /&gt;
'''Die Vorteile eines Steckbretts:'''&lt;br /&gt;
&lt;br /&gt;
*Bauteile können ohne Löten eingesetzt und verdrahtet werden&lt;br /&gt;
*recht zügiger Schaltungsaufbau&lt;br /&gt;
*eine Schaltung kann leicht geändert oder korrigiert werden, defekte Teile sind leicht tauschbar&lt;br /&gt;
*ein Steckbrett kann auch für ganz andere Schaltungen verwendet werden&lt;br /&gt;
'''Die Nachteile eines Steckbretts gegenüber gedruckten Schaltungen und Experimentierplatinen sind:'''&lt;br /&gt;
&lt;br /&gt;
*nicht alle Bauteile passen, so dass wir doch noch etwas löten müssen&lt;br /&gt;
*nur geringer Schaltungsumfang möglich, da es schnell unübersichtlich wird&lt;br /&gt;
*sehr störanfällig wegen grosser Kabellängen, dadurch oft Funktionsstörungen&lt;br /&gt;
*Bauteile müssen zum Teil verbogen werden, damit sie passen&lt;br /&gt;
&lt;br /&gt;
Man beginnt, indem man den Controller AVR [[ATMega32]] auf das Board aufsetzt:&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrettmega32.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
==Die Grundschaltung==&lt;br /&gt;
Damit ein Controller erst mal zum Laufen kommt, benötigt man zumindest einen 10-k-Widerstand, einen 100-nF-Kondensator und eine 5V-Spannungsquelle. Das Ganze muss entsprechend dem unteren Schaltplan verschaltet werden, man spricht von einer sogenannten Grundschaltung. In dem Schaltplan wurde der Controller im Übrigen pinkompatibel als Schaltzeichen verwendet, die Pinreihenfolge ist also im Schaltplan identisch mit der echten Bauteilpin-Reihenfolge. Diese Darstellung erleichtert den Nachbau der Schaltung auf einem Steckbrett aber auch einer Experimentierplatine ungemein. Gewöhnlich verwendet man in Schaltplänen eine etwas andere Darstellung, bei der die Pins nach Funktionsgruppen geordnet sind. Bei solchen Schaltplänen muss man sich dann anhand der Pin-Nummern orientieren, man wird dies am Ende des Artikels noch bei dem IC MAX232 sehen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mega32.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn man schon einige Grundschaltungen in anderen Tutorials gesehen hat, dann wird man bemerken, dass unsere doch noch etwas einfacher ist und weniger Bauteile benötigt.  Hier wird beispielsweise kein Quarz verwendet, da der ATMega32 auch intern einen Takt generieren kann. Wer mit dem ADC genau messen will, sollte statt der Beschaltung im Bild, zwischen Vcc und AVcc eine Spule von 10uH und einen Kondensator von 100nF zwischen AVcc und GND schalten. Will man AVcc als Referenzspannung verwenden, muss noch ein 100nF Kondensator von ARef nach GND.&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht die obere Schaltung wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett1.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um den Controller in Betrieb zu nehmen, benötigt man bei dieser Schaltung ein Netzteil, das eine stabilisierte Spannung von 4 bis 5V liefert. Wir gehen erst einmal davon aus, dass man über dieses verfügt. &lt;br /&gt;
Erwähnenswert ist noch, dass der Kondensator als [[Abblockkondensator]] zur Unterdrückung von Störungen dient. Er muss so nah wie möglich an die Spannungszuführung am Controller selbst gesetzt werden. Ohne Kondensator enstehen erhebliche Störungen in der Versorgungsspannung, das Bild verdeutlicht es:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Abblockkondensator OhneC amAVR.jpg|center]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Der Widerstand in der Grundschaltung dient dazu, die Reset-Leitung konstant auf definiertem High-Pegel zu halten. Verbindet man diesen RESET-Pin später kurz mit GND (Masse), dann wird das Programm im Controller neu gestartet.&lt;br /&gt;
&lt;br /&gt;
==Woran merkt man, dass der Controller funktioniert?==&lt;br /&gt;
Gute Frage! Man merkt es garnicht. Genau genommen funktioniert ja auch trotz korrekter Schaltung noch immer nix, denn es muss zuerst ein Programm in den Controller geladen werden, damit er überhaupt weiss, was zu tun ist. Ohne Programm ist der Controller quasi tot.&lt;br /&gt;
&lt;br /&gt;
==Wie bekommt man das Programm in den Controller?==&lt;br /&gt;
Der Controller verfügt über eine sogenannte [[ISP]]-Schnittstelle. Das bedeutet, über bestimmte Pins ([[SPI]]) kann der Controller mit einer geeigneten PC-Software (zum Beispiel Bascom) programmiert werden. Zum Anschluss an den PC benötigt man jedoch einen sogenannten ISP-Dongle, auch Programmieradapter genannt. Hier gibt es verschiedene Lösungen, serielle und parallele Adapter. Original von Atmel oder kompatible Lösungen. Der am meisten verwendete ISP-Dongle wird am Druckerport betrieben. Diese gibt es inzwischen recht preiswert, sodass sich das Selbstbauen eigentlich nicht lohnt. Da man auch gern auf ein paar Fehlerquellen verzichten sollte, würde ich eine Fertiglösung empfehlen. Wer ihn selbst bauen möchte, findet ([[AVR-ISP_Programmierkabel|hier]] eine ISP-Dongle-Bauanleitung und sogar eine fertige Platine dafür  ([[AVR-ISP_Programmierkabel]]).&lt;br /&gt;
&lt;br /&gt;
Sowas sieht dann so aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Avrtutorial_ispkabel.jpeg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan eines solchen Programmierkabels:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:ispschaltplan.gif|center|thumb|400px|Schaltplan des ISP-Dongels nach unserem Wiki-Bauplan, mit SUB-D Buchse. Bitte beachten, dass das IC1 hier im Plan als verschiedene Blöcke (IC1A/IC1B) dargestellt wird. Dies dient nur zur Übersicht, es handelt sich nur um ein IC, einfach auf die Pinnummern achten. Zum vergrößern anklicken.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Problem ist nun, wie schließe ich einen handelsüblichen ISP-Programmieradapter an den Controller auf dem Steckbrett an? Der normale 10-polige Wannenstecker (nach [[RN-Definitionen]]) passt nicht in ein Steckbrett. Das ist wieder so ein typischer Nachteil bei Steckbrettern! In unserem Beispiel haben wir dazu auf einem kleinen Stück Experimentierplatine einen steckbaren Adapter für das Steckboard gelötet.&lt;br /&gt;
Somit kann man die Schaltung um einen üblichen 10-poligen ISP-Programmieranschluss ergänzen:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mitisp.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
Ein noch einfacheres Programmierkabel ist auf der Seite http://thomaspfeifer.net/ beschrieben.&lt;br /&gt;
Dort findet man unter &amp;quot;AVR-Projekte&amp;quot; den Artikel &amp;quot;Ein einfaches Programmierkabel für Atmel-AVR Mikrocontroller&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht das gleiche so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_mitisp.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jetzt endlich ist es soweit, jetzt kann man den Controller über einen ISP-Programmieradapter mit dem PC verbinden. Aber unbedingt darauf achten, dass auch alles korrekt nach Schaltplan gesteckt wurde und dass die Betriebsspannung 5V nicht übersteigt. Ansonsten könnte man sich Dongle oder sogar die PC-Schnittstelle beschädigen.&lt;br /&gt;
Als Entwicklungsumgebung nutzen wir hier im Tutorial [[Bascom]]. [[Bascom]] ist ein sehr beliebter Basic-[[Compiler]], der zahlreiche [[AVR]] Controllertypen programmieren kann. Da auch ein [[Terminalprogramm]] und ein Programmer integriert ist, enthält diese PC-Software alles, was man braucht, das erleichtert den Einstieg zusätzlich. Die Software gibts kostenlos als Demo bis 4K Code, für unsere Beispiele und den Einstieg reicht das allemal, siehe dazu Artikel Bascom.&lt;br /&gt;
&lt;br /&gt;
Wie man ein Programm schreibt, kompiliert und überträgt, wurde schon in diesem Beitrag [[Bascom - Erstes Programm in den AVR Controller übertragen]] ausführlich behandelt, wir ersparen uns deshalb diese Details. Man sollte aber bei Unklarheiten zum Kompilieren und Übertragen diesen Artikel auf jeden Fall lesen.&lt;br /&gt;
&lt;br /&gt;
Als erstes kompilieren und übertragen wir folgendes Programm:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step1.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Programm macht eigentlich nichts, außer dass es eine Endlosschleife ausführt. Aber da wir noch überhaupt nix am Controller angeschlossen haben, können wir eh noch nicht sehen, ob ein Programm nun richtig ausgeführt wird oder nicht.&lt;br /&gt;
Allerdings können wir schonmal üben, das Programm mit Bascom zu übertragen. Wenn wir alles richtig aufgebaut haben und Spannung anliegt, dann sollte automatisch der Controller in Bascom erkannt werden. Die Übertragung sollte dann ohne Fehlermeldung erfolgen können. Wenn wir das geschafft haben, geht’s weiter.&lt;br /&gt;
&lt;br /&gt;
==Läuft die Schaltung und das Programm?==&lt;br /&gt;
Damit wir nun endlich sehen, ob sich bei unserer Schaltung auch was tut, schließen wir eine LED über einen 1K-Vorwiderstand an einen Port an. Da wir die Kathode an den Controllerpin und die Anode an Plus legen, leuchtet die LED immer dann, wenn dieser Pin auf Low geschaltet wird.&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mitled.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht's nun so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_mitled.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Damit man nun auch wirklich sieht, ob das Programm läuft, schreiben wir ein kleines Basic-Programm, welches eine LED abwechselnd ein– und ausschaltet. Wir kompilieren und übertragen also folgendes Programm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step2.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
&lt;br /&gt;
Config Portc.0 = Output       'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C)&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
  Portc.0 = 1                 'Pin wird auf High, also 5V geschaltet&lt;br /&gt;
  Waitms 100&lt;br /&gt;
  Portc.0 = 0                 'Pin wird auf Low, also 0V geschaltet&lt;br /&gt;
  Waitms 100&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn die LED nun schnell blinkt, dann funktioniert die aufgebaute Schaltung perfekt. Wir haben gleichzeitig gelernt, wie man einen Ausgangsport, also Controllerpin, ein- und ausschalten kann. Nahezu alle Pins beim ATMega32 können auf diese Weise als Ausgangsport betrieben werden. Somit lassen sich nicht nur viele Leds, sondern unter Zuhilfenahme eines Treibers (z.B. Transistors) auch Relais und andere Aktoren schalten.&lt;br /&gt;
&lt;br /&gt;
==Eingangsport fragt Taster ab==&lt;br /&gt;
Nun erweitern wir die Schaltung noch um einen Taster. Nahezu jedes Port kann bei einem ATMega32 auch per Software als Eingangsport konfiguriert werden. Wir schließen z.B. einen Taster an Port-Pin PA7 an. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mittaster.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Port wird in der Software so konfiguriert, dass es als Eingang arbeitet und intern über einen hohen Widerstand  (Pullup-Widerstand) ständig auf High-Pegel gelegt wird. Wird nun eine Taste gedrückt, so wird der Pegel auf Low gezogen.&lt;br /&gt;
Das Beispielprogramm ist nun so gestaltet, dass bei gedrückter Taste die LED leuchtet und beim Loslassen wieder ausgeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step3.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
&lt;br /&gt;
Config Portc.0 = Output        'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C)&lt;br /&gt;
&lt;br /&gt;
Config Pina.7 = Input          'Ein Pin (PA0) wird als Eingang definiert&lt;br /&gt;
Porta.7 = 1                    'Interner Pullup Widerstand ein&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
  If Pina.7 = 1 Then&lt;br /&gt;
    Portc.0 = 1                'Pin wird auf High, also 5V geschaltet&lt;br /&gt;
  Else&lt;br /&gt;
    Portc.0 = 0                'Pin wird auf Low, also 0V geschaltet&lt;br /&gt;
  End If&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Grundschaltung mit Quarz==&lt;br /&gt;
Obwohl wir ab der letzten Schaltung schon einiges mit dem Controller anfangen können, so fehlt doch noch etwas Wichtiges. Oft ist es nämlich notwendig, dass ein Controller sehr genaue Frequenzen mißt oder ganz genaue Taktraten ausgeben kann. Leider ist der interne Taktgenerator nicht 100% exakt, was bei manchen Anwendungen störend ist. Zum Beispiel können über die RS232-Schnittstelle Daten nicht immer ganz fehlerfrei übertragen werden, wenn die Taktfrequenz nicht genau stimmt. Daher wird in den meisten Anwendungsfällen ein Quarz zur Takterzeugung genutzt, Sie kennen das sicher aus anderen Grundschaltungen. Also erweitern wir unsere Schaltung gleich noch um einen Quarz mit den zugehörigen 22pF-Kondensatoren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mitquarz.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf unserem Steckbrett wird's langsam voller, hier sieht's also inzwischen so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_mitquarz.jpg|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Normalerweise sollte der Quarz genauso wie die beiden 22pF-Kondensatoren, die zum Anschwingen des Quarzes dienen, möglichst nahe am Controller platziert werden. Auf dem Steckbrett ist das manchmal gar nicht so einfach, insbesondere wenn man wie in diesem Fall den Quarz erst später hinzufügt. Wichtig ist nämlich, dass die Leitungen vom Quarz zum Controller möglichst kurz sind, bei gedruckten Schaltungen oft nur 1 bis 2 cm! Auch die einzelnen Bauteilbeinchen, z.B. der Kondensatoren, sollten normalerweise so kurz wie möglich sein.&lt;br /&gt;
Ist dies nicht der Fall, wie auch in unserem Bild, dann fungieren diese Leitungen fast wie eine Funkantenne. Dies führt in der Regel zu starken Hochfrequenzsignalen, die nicht nur unsere Schaltung, sondern auch andere Schaltungen in der Nähe stören könnten. Man merkt dies auch oft daran, dass sich ein Board bei höherer Quarzfrequenz immer seltener fehlerfrei ohne Übertragungsfehler programmieren läßt.&lt;br /&gt;
Grundsätzlich sind daher Schaltungen mit Quarz auf einem Steckbrett nicht sonderlich zu empfehlen, die Betriebssicherheit ist nicht immer gegeben. &lt;br /&gt;
&lt;br /&gt;
Auch wenn nun ein Quarz angeschlossen ist, so wird er noch immer nicht genutzt. Noch immer arbeitet der [[ATMega32]] mit seiner intern voreingestellten 1 Mhz Taktfrequenz. Um dies umzustellen, muss man ein sogenanntes [[Fusebits|Fusebit]] im Controller umprogrammieren. Auch dies wurde schon im Beitrag [[Bascom - Erstes Programm in den AVR_Controller übertragen]] näher beschrieben. Hier sei daher nur nochmals gesagt, dass dies auch sehr bequem in [[Bascom]] erfolgt:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_bascomfusebitquarz.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sobald wir das umgestellt haben, müssen wir auch in dem Programm die Anweisung &lt;br /&gt;
&lt;br /&gt;
 $crystal = 1000000 &lt;br /&gt;
&lt;br /&gt;
durch &lt;br /&gt;
&lt;br /&gt;
 $crystal = 16000000 &lt;br /&gt;
&lt;br /&gt;
ersetzen, denn unser Quarz taktet nun mit 16 MHz.&lt;br /&gt;
&lt;br /&gt;
==Spannung stabilisieren==&lt;br /&gt;
Auch wenn unsere Basis-Schaltung für Experimente inzwischen schon ganz nett ist, so ist es doch etwas ungünstig, dass wir stets 5V zur Verfügung haben müssen. Nicht immer steht ein geeignetes Netzteil zur Verfügung, zudem soll ein Controller auch oft mit Batterien versorgt werden. Aus diesem Grund verfügen fast alle Entwicklungsboards wie ([[RN-Control]], STK500 etc.) über einen [[Spannungsregler]].&lt;br /&gt;
[[Bild:78s05.jpg|thumb|Spannungsregler 78S05]] Dieser wandelt eine höhere Eingangsspannung (ca. 7 bis 20 V) immer genau in  5V  um. Sowas erhöht die Betriebssicherheit einer Schaltung nochmals immens. Als [[Spannungsregler]] (IC2) wird oft der 7805 genutzt, empfehlenswert ist der Typ 78S05, welcher 2A verträgt sowie über einen Kurzschluss- und Überlastungsschutz verfügt. &lt;br /&gt;
Die beiden 100nF-Kondensatoren sind wichtig, sie sollen HF-Störungen und Schwingungen vermeiden. Der Elko vor dem Spannungsregler ist vor allem dann wichtig, wenn die Spannung von einem Netzgerät kommt und noch etwas geglättet werden muss. Je höher der Strombedarf der Schaltung, desto größer kann man die Kapazität wählen. Es schadet nicht, wenn man den Elko einige Nummern größer wählt, man ist dann quasi für alle Fälle gerüstet. So sind Werte zwischen 100 uF und 2200 uF durchaus denkbar. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wir erweitern unsere Schaltung somit wie folgt:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_spannung.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht's wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_spannung.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
==Daten und Texte zum PC übertragen==&lt;br /&gt;
In vielen Programmen müssen Daten oder Texte vom Controller an den PC oder umgekehrt gesendet werden. Insbesondere bei komplexen Programmen kann man auf diese Weise Variableninhalte ausgeben und somit auch Fehler im Programmcode schneller finden und korrigieren. In der Regel ist das ganz einfach, denn der [[Microcontroller]] [[ATMega32]] verfügt über einen internen [[UART]], also ein Modul, das Daten über die [[RS232]]-Schnittstelle zum PC senden bzw. auch von ihm empfangen kann. Leider arbeitet jedoch die Controllerschnittstelle mit 5V und die PC-Schnittstelle der Norm entsprechend mit +-12V. Daher muss unbedingt ein Schaltkreis dazwischen, welcher die Pegel anpasst. Gewöhnlich nimmt man hier das IC MAX232(CPE), welches inzwischen sehr preiswert erhältlich ist.&lt;br /&gt;
&lt;br /&gt;
Wir müssen also die Schaltung nochmals erweitern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_max232.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das IC Max232 ist im Schaltplan in der üblichen funktionsorientierten Darstellung gezeichnet. Zur besseren Übersichtlichkeit wurden die immer benötigten Anschlüsse für VCC (Pin 16) und GND (Pin 15) getrennt oben rechts im Schaltplan dargestellt. Also nicht vergessen !!&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht's so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_max232.jpg|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Über eine dreipolige Stiftleiste ([[RN-Definitionen]]) wird nun das Steckboard mit der [[RS232]]-Schnittstelle des PC verbunden. Es ist nun ein Leichtes, mit einem Programm Daten zum PC zu senden. Das nachfolgende Programm gibt Hinweise mit der Anweisung '''PRINT''' aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step5.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 16000000&lt;br /&gt;
$baud = 9600&lt;br /&gt;
&lt;br /&gt;
Config Portc.0 = Output              'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C)&lt;br /&gt;
&lt;br /&gt;
Config Pina.7 = Input                'Ein Pin (PA0) wird als Eingang definiert&lt;br /&gt;
Porta.7 = 1                          'Interner Pullup Widerstand ein&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
  If Pina.7 = 1 Then&lt;br /&gt;
    Portc.0 = 1                      'Pin wird auf High, also 5V geschaltet&lt;br /&gt;
    Print &amp;quot;Schalter nicht gedrückt&amp;quot;&lt;br /&gt;
  Else&lt;br /&gt;
    Portc.0 = 0                      'Pin wird auf Low, also 0V geschaltet&lt;br /&gt;
    Print &amp;quot;Schalter gedrückt&amp;quot;&lt;br /&gt;
  End If&lt;br /&gt;
  Wait 1&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Möglichkeiten des Steckbrettes erreicht==&lt;br /&gt;
Inzwischen füllt der Schaltplan fast ein DIN-A4-Blatt und auf dem Steckbrett sieht's auch schon recht wirr aus, dabei haben wir nur die wichtigsten Grundelemente auf dem Steckbrett. Für eine Roboter-Steuerung oder andere Anwendung fehlt doch noch einiges. Zum Beispiel weitere Taster, weitere LEDs, Motortreiber, damit der Controller auch Motoren ansteuern kann und ein [[I2C]]-Bus-Anschluss.&lt;br /&gt;
Dies alles noch auf einem Steckbrett zu realisieren macht wenig Sinn, zumal bereits jetzt schon durch die doch recht langen Leitungen/Verkabelungen erhebliche Störungen auftreten. In der letzten Phase ist es immer öfters zu Übertragungsfehlern beim Programmieren gekommen, oft musste dies 20mal wiederholt werden. Dies zeigt, dass ein Steckbrett bestenfalls für ganz kleine Controller-Experimente herhalten kann. Für größere Dinge sollte man dann doch zu einer Lösung auf einer gedruckten Platine greifen. Spezielle Experimentierboards  bieten mehr Sicherheit und haben neben den Grundelementen, die hier beschrieben wurden, noch eine ganze Menge mehr drauf. Bei [[RN-Control]] zum Beispiel 5 Tasten, 8 Leds, Motortreiber, Lautsprecher, diverse Anschlüsse etc. &lt;br /&gt;
Der Größenunterschied wird im Bild deutlich:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_rncontrol.jpg|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auch wenn das Steckbrett also kein Controllerboard ersetzen kann, so hat das kleine Tutorial doch gezeigt, wie eine [[Avr]]-Schaltung aufzubauen ist. Dieses Wissen sollte man auch besitzen, wenn man ein Controllerboard nutzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Was braucht man, wenn man mit einem Controllerboard den Einstieg startet?==&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_ispkabel.jpg|thumb|ISP-Programmierkabel]]Neben dem eigentlichen Board braucht man, wie schon zuvor angesprochen, ein [[AVR-ISP Programmierkabel]]. Da das Selbstbauen kaum billiger ist, ist zu empfehlen, ein solches fertig mitzubestellen. Am preiswertesten und zugleich vielseitigsten sind die ISP-Adapter, die man an das Druckerport anschließt (siehe Bild). Es gibt aber auch USB-Lösungen, wobei diese jedoch oft teuer sind und auch oft weniger Controller programmieren können. Hat man jedoch einen PC oder Notebook ohne parellelen Druckeranschluss, so muss man wohl oder übel in den meisten Fällen zu einem seriellen oder USB-Programmieradapter greifen. Neben den erwähnten Nachteilen hat der USB Dongle aber oft auch den Vorteil, dass er etwas schneller ist. Dieser Unterschied macht sich aber nur bei sehr großen Programmen und Controllern wirklich bemerkbar.&lt;br /&gt;
&lt;br /&gt;
Als zweites braucht man natürlich eine Stromversorgung. Ideal sind Gleichspannungsnetzgeräte, die zwischen 9 und 12V liefern, vorausgesetzt, das Board hat einen Spannungsregler wie in der Regel die RN-Boards. Man kann hier ein normales Steckernetzteil oder ein komfortables Labornetzteil nehmen. Um etwas Reserve zu haben, wäre es gut, wenn das Netzteil mindestens 1 A liefern kann. Alternativ kann man auch Akkupacks oder Batterien nutzen, allerdings mindestens 7,2V sollten die schon liefern können, sicherer sind 8,4-, 9,6- oder 12V-Akkus.&lt;br /&gt;
Das wäre eigentlich schon das Wichtigste, um ein Board in Betrieb zu nehmen und Experimente zu machen. &lt;br /&gt;
&lt;br /&gt;
Allerdings, ein RS232-Kabel ist ebenfalls noch sehr empfehlenswert. Dieses erlaubt die Ausgabe von Texten und Variablen auf den PC, wir haben es ja oben im Steckbrettbeispiel schon gesehen. Dazu wird auf dem PC ein [[Terminalprogramm]] gestartet und über die [[RS232]] Schnittstelle mit dem PC verbunden. Bei manchen Boards ist sowieso ein RS232 Kabel unerläßlich, wie z.B. RN-Motor, RN-Speak etc. Nützlich ist es aber überall. Man kann ein solches Kabel selbst bauen oder gleich beim Kauf eines Boardes mitbestellen.&lt;br /&gt;
&lt;br /&gt;
Also nochmal die Zusammenfassung für den Einstieg:&lt;br /&gt;
&lt;br /&gt;
* Controllerboard&lt;br /&gt;
* [[AVR-ISP Programmierkabel]] mit 10-poligem Wannenstecker&lt;br /&gt;
* RS-232-Kabel (mit 3-poligem Adapter, wenn Board [[RN-Definitionen]] erfüllt)&lt;br /&gt;
* Netzgerät oder Akku (ideal 9 bis 12V, notfalls auch 7,2 bis 20V)&lt;br /&gt;
* [[Bascom]]-Compiler-Vollversion ist nur nötig, wenn man gleich größere Sachen anstrebt, ansonsten reicht das Demo, genauso wie ein [[Avr-gcc]]-Compiler. Bei RN-Boards sind diese Programme beim Board- oder Platinenkauf sowieso dabei, ansonsten kann man diese im Internet downloaden.&lt;br /&gt;
* Ein gutes Buch ist immer gut, siehe [[Buchvorstellungen]]&lt;br /&gt;
&lt;br /&gt;
==Autor==&lt;br /&gt;
*[[Benutzer:Frank|Frank]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Quellen===&lt;br /&gt;
* [[Abblockkondensator]] Artikel von Uwegw&lt;br /&gt;
* RN-Board Dokumentationen aus [[:Kategorie:Projekte]]&lt;br /&gt;
* diverse Datenblätter&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
*[[AVR-ISP Programmierkabel]]&lt;br /&gt;
*[[Mit welchem Controllerboard fang ich an]]&lt;br /&gt;
*[[Abblockkondensator]]&lt;br /&gt;
*[[Bascom]]&lt;br /&gt;
*[[Bascom - Erstes Programm in den AVR_Controller übertragen]]&lt;br /&gt;
*[[Avr]]&lt;br /&gt;
*[[Atmel Controller Mega16 und Mega32]]&lt;br /&gt;
*[[Spannungsregler]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Projekte]]&lt;/div&gt;</summary>
		<author><name>Ratzfatz</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=AVR-Einstieg_leicht_gemacht&amp;diff=14984</id>
		<title>AVR-Einstieg leicht gemacht</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=AVR-Einstieg_leicht_gemacht&amp;diff=14984"/>
				<updated>2009-06-11T13:15:16Z</updated>
		
		<summary type="html">&lt;p&gt;Ratzfatz: /* Wie bekommt man das Programm in den Controller? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:avr8.jpg|thumb|300px|Einen Controller zum Leben zu erwecken ist nicht schwer, manchmal reichen ein paar Teile! Beispiel mit Mega8]]&lt;br /&gt;
==Wir starten mit einem ATMega32== &lt;br /&gt;
Immer wieder gibt es in Foren, wie dem Roboternetz, Einsteiger, die das erstemal mit einem [[Microcontroller]] in Berührung kommen. Trotz zahlreicher Einstiegsbeiträge im Forum wiederholen sich doch bestimmte Anfängerfragen immer wieder, daher soll dieser Artikel noch einmal aufzeigen, wie man den ersten Schritt tut und einen Controller zum Leben erweckt. Es werden verschiedene Grundschaltungen aufgezeigt und erläutert, welche Bauteile welche Funktion besitzen.&lt;br /&gt;
Als Controller verwenden wir einen [[AVR]] [[ATMega32]], der derzeit größte [[AVR]]-Controller, welcher noch im bastlerfreundlichen DIP-Gehäuse verfügbar ist.  Für kleine bis mittlere Projekte ein sehr empfehlenswerter Controller, zumal er preislich mit ca. 6-7 Euro noch sehr günstig ist und zudem mit seinem 40-Pin-Gehäuse reichlich Anschlussmöglichkeiten besitzt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mega1632.gif|center]]&lt;br /&gt;
&lt;br /&gt;
Wie auf dem Bild zu sehen, verfügt auch der etwas günstigere ATMega16 über die gleiche Pinbelegung, daher könnten wir in diesem Tutorial auch diesen Typ verwenden. Der ATMega32 hat aber doppelt soviel Speicherplatz für Programmdaten (Flash), daher hat man für eine geringe Preisdifferenz doch mehr Möglichkeiten.&lt;br /&gt;
Wer noch 3 bis 4 Euro sparen will, dem sei der [[ATMega8]] oder [[ATMega168]] empfohlen, diese Typen sind sehr ähnlich, so dass das Tutorial weitgehend auch auf diese Typen bezogen werden kann. Allerdings haben diese Typen deutlich weniger Anschlussmöglichkeiten (28 Pin DIP Gehäuse). &lt;br /&gt;
&lt;br /&gt;
Die Frage, ob man mit einem fertigen Controllerboard, einer Experimentierplatine oder einem Steckbrett beginnen sollte, wurde ja in dem RN-Wissen Wiki Beitrag &amp;quot;[[Mit welchem Controllerboard fang ich an]]&amp;quot; angesprochen. In den meisten Fällen favorisiert der Autor dieses Artikels ein fertiges Controllerboard. Warum das so ist, dazu am Ende noch ein paar Anmerkungen. Dennoch soll diese Einführung schrittweise anhand eines Steckbrettes erläutert werden.&lt;br /&gt;
&lt;br /&gt;
==Start mit handelsüblichem Steckbrett==&lt;br /&gt;
Ein Steckbrett hat den Vorteil, dass man theoretisch ohne Löten alle Bauteile relativ zügig zusammenstecken kann. Bestimmte Steckkontakte innerhalb einer Reihe sind im Steckbrett miteinander verbunden, so dass man nachher pro Bauteilbeinchen noch einige Steckkontakte zum Verdrahten mit Schaltdraht oder speziell konfektionierter Litze verwenden kann.&lt;br /&gt;
&lt;br /&gt;
'''Die Vorteile eines Steckbretts:'''&lt;br /&gt;
&lt;br /&gt;
*Bauteile können ohne Löten eingesetzt und verdrahtet werden&lt;br /&gt;
*recht zügiger Schaltungsaufbau&lt;br /&gt;
*eine Schaltung kann leicht geändert oder korrigiert werden, defekte Teile sind leicht tauschbar&lt;br /&gt;
*ein Steckbrett kann auch für ganz andere Schaltungen verwendet werden&lt;br /&gt;
'''Die Nachteile eines Steckbretts gegenüber gedruckten Schaltungen und Experimentierplatinen sind:'''&lt;br /&gt;
&lt;br /&gt;
*nicht alle Bauteile passen, so dass wir doch noch etwas löten müssen&lt;br /&gt;
*nur geringer Schaltungsumfang möglich, da es schnell unübersichtlich wird&lt;br /&gt;
*sehr störanfällig wegen grosser Kabellängen, dadurch oft Funktionsstörungen&lt;br /&gt;
*Bauteile müssen zum Teil verbogen werden, damit sie passen&lt;br /&gt;
&lt;br /&gt;
Man beginnt, indem man den Controller AVR [[ATMega32]] auf das Board aufsetzt:&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrettmega32.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
==Die Grundschaltung==&lt;br /&gt;
Damit ein Controller erst mal zum Laufen kommt, benötigt man zumindest einen 10-k-Widerstand, einen 100-nF-Kondensator und eine 5V-Spannungsquelle. Das Ganze muss entsprechend dem unteren Schaltplan verschaltet werden, man spricht von einer sogenannten Grundschaltung. In dem Schaltplan wurde der Controller im Übrigen pinkompatibel als Schaltzeichen verwendet, die Pinreihenfolge ist also im Schaltplan identisch mit der echten Bauteilpin-Reihenfolge. Diese Darstellung erleichtert den Nachbau der Schaltung auf einem Steckbrett aber auch einer Experimentierplatine ungemein. Gewöhnlich verwendet man in Schaltplänen eine etwas andere Darstellung, bei der die Pins nach Funktionsgruppen geordnet sind. Bei solchen Schaltplänen muss man sich dann anhand der Pin-Nummern orientieren, man wird dies am Ende des Artikels noch bei dem IC MAX232 sehen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mega32.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn man schon einige Grundschaltungen in anderen Tutorials gesehen hat, dann wird man bemerken, dass unsere doch noch etwas einfacher ist und weniger Bauteile benötigt.  Hier wird beispielsweise kein Quarz verwendet, da der ATMega32 auch intern einen Takt generieren kann. Wer mit dem ADC genau messen will, sollte statt der Beschaltung im Bild, zwischen Vcc und AVcc eine Spule von 10uH und einen Kondensator von 100nF zwischen AVcc und GND schalten. Will man AVcc als Referenzspannung verwenden, muss noch ein 100nF Kondensator von ARef nach GND.&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht die obere Schaltung wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett1.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um den Controller in Betrieb zu nehmen, benötigt man bei dieser Schaltung ein Netzteil, das eine stabilisierte Spannung von 4 bis 5V liefert. Wir gehen erst einmal davon aus, dass man über dieses verfügt. &lt;br /&gt;
Erwähnenswert ist noch, dass der Kondensator als [[Abblockkondensator]] zur Unterdrückung von Störungen dient. Er muss so nah wie möglich an die Spannungszuführung am Controller selbst gesetzt werden. Ohne Kondensator enstehen erhebliche Störungen in der Versorgungsspannung, das Bild verdeutlicht es:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Abblockkondensator OhneC amAVR.jpg|center]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Der Widerstand in der Grundschaltung dient dazu, die Reset-Leitung konstant auf definiertem High-Pegel zu halten. Verbindet man diesen RESET-Pin später kurz mit GND (Masse), dann wird das Programm im Controller neu gestartet.&lt;br /&gt;
&lt;br /&gt;
==Woran merkt man, dass der Controller funktioniert?==&lt;br /&gt;
Gute Frage! Man merkt es garnicht. Genau genommen funktioniert ja auch trotz korrekter Schaltung noch immer nix, denn es muss zuerst ein Programm in den Controller geladen werden, damit er überhaupt weiss, was zu tun ist. Ohne Programm ist der Controller quasi tot.&lt;br /&gt;
&lt;br /&gt;
==Wie bekommt man das Programm in den Controller?==&lt;br /&gt;
Der Controller verfügt über eine sogenannte [[ISP]]-Schnittstelle. Das bedeutet, über bestimmte Pins ([[SPI]]) kann der Controller mit einer geeigneten PC-Software (zum Beispiel Bascom) programmiert werden. Zum Anschluss an den PC benötigt man jedoch einen sogenannten ISP-Dongle, auch Programmieradapter genannt. Hier gibt es verschiedene Lösungen, serielle und parallele Adapter. Original von Atmel oder kompatible Lösungen. Der am meisten verwendete ISP-Dongle wird am Druckerport betrieben. Diese gibt es inzwischen recht preiswert, sodass sich das Selbstbauen eigentlich nicht lohnt. Da man auch gern auf ein paar Fehlerquellen verzichten sollte, würde ich eine Fertiglösung empfehlen. Wer ihn selbst bauen möchte, findet ([[AVR-ISP_Programmierkabel|hier]] eine ISP-Dongle-Bauanleitung und sogar eine fertige Platine dafür  ([[AVR-ISP_Programmierkabel]]).&lt;br /&gt;
&lt;br /&gt;
Sowas sieht dann so aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Avrtutorial_ispkabel.jpeg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan eines solchen Programmierkabels:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:ispschaltplan.gif|center|thumb|400px|Schaltplan des ISP-Dongels nach unserem Wiki-Bauplan, mit SUB-D Buchse. Bitte beachten, dass das IC1 hier im Plan als verschiedene Blöcke (IC1A/IC1B) dargestellt wird. Dies dient nur zur Übersicht, es handelt sich nur um ein IC, einfach auf die Pinnummern achten. Zum vergrößern anklicken.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Problem ist nun, wie schließe ich einen handelsüblichen ISP-Programmieradapter an den Controller auf dem Steckbrett an. Der normale 10-polige Wannenstecker (nach [[RN-Definitionen]]) passt nicht in ein Steckbrett. Das ist wieder so ein typischer Nachteil bei Steckbrettern! In unserem Beispiel haben wir dazu auf einem kleinen Stück Experimentierplatine einen steckbaren Adapter für das Steckboard gelötet.&lt;br /&gt;
Somit kann man die Schaltung um einen üblichen 10-poligen ISP-Programmieranschluss ergänzen:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mitisp.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
Ein noch einfacheres Programmierkabel ist auf der Seite http://thomaspfeifer.net/ beschrieben.&lt;br /&gt;
Dort findet man unter &amp;quot;AVR-Projekte&amp;quot; den Artikel &amp;quot;Ein einfaches Programmierkabel für Atmel-AVR Mikrocontroller&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht das gleiche so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_mitisp.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jetzt endlich ist es soweit, jetzt kann man den Controller über einen ISP-Programmieradapter mit dem PC verbinden. Aber unbedingt darauf achten, dass auch alles korrekt nach Schaltplan gesteckt wurde und dass die Betriebsspannung 5V nicht übersteigt. Ansonsten könnte man sich Dongle oder sogar die PC-Schnittstelle beschädigen.&lt;br /&gt;
Als Entwicklungsumgebung nutzen wir hier im Tutorial [[Bascom]]. [[Bascom]] ist ein sehr beliebter Basic-[[Compiler]], der zahlreiche [[AVR]] Controllertypen programmieren kann. Da auch ein [[Terminalprogramm]] und ein Programmer integriert ist, enthält diese PC-Software alles, was man braucht, das erleichtert den Einstieg zusätzlich. Die Software gibts kostenlos als Demo bis 4K Code, für unsere Beispiele und den Einstieg reicht das allemal, siehe dazu Artikel Bascom.&lt;br /&gt;
&lt;br /&gt;
Wie man ein Programm schreibt, kompiliert und überträgt, wurde schon in diesem Beitrag [[Bascom - Erstes Programm in den AVR Controller übertragen]] ausführlich behandelt, wir ersparen uns deshalb diese Details. Man sollte aber bei Unklarheiten zum Kompilieren und Übertragen diesen Artikel auf jeden Fall lesen.&lt;br /&gt;
&lt;br /&gt;
Als erstes kompilieren und übertragen wir folgendes Programm:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step1.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Programm macht eigentlich nichts, außer dass es eine Endlosschleife ausführt. Aber da wir noch überhaupt nix am Controller angeschlossen haben, können wir eh noch nicht sehen, ob ein Programm nun richtig ausgeführt wird oder nicht.&lt;br /&gt;
Allerdings können wir schonmal üben, das Programm mit Bascom zu übertragen. Wenn wir alles richtig aufgebaut haben und Spannung anliegt, dann sollte automatisch der Controller in Bascom erkannt werden. Die Übertragung sollte dann ohne Fehlermeldung erfolgen können. Wenn wir das geschafft haben, geht’s weiter.&lt;br /&gt;
&lt;br /&gt;
==Läuft die Schaltung und das Programm?==&lt;br /&gt;
Damit wir nun endlich sehen, ob sich bei unserer Schaltung auch was tut, schließen wir eine LED über einen 1K-Vorwiderstand an einen Port an. Da wir die Kathode an den Controllerpin und die Anode an Plus legen, leuchtet die LED immer dann, wenn dieser Pin auf Low geschaltet wird.&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mitled.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht's nun so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_mitled.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Damit man nun auch wirklich sieht, ob das Programm läuft, schreiben wir ein kleines Basic-Programm, welches eine LED abwechselnd ein– und ausschaltet. Wir kompilieren und übertragen also folgendes Programm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step2.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
&lt;br /&gt;
Config Portc.0 = Output       'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C)&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
  Portc.0 = 1                 'Pin wird auf High, also 5V geschaltet&lt;br /&gt;
  Waitms 100&lt;br /&gt;
  Portc.0 = 0                 'Pin wird auf Low, also 0V geschaltet&lt;br /&gt;
  Waitms 100&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn die LED nun schnell blinkt, dann funktioniert die aufgebaute Schaltung perfekt. Wir haben gleichzeitig gelernt, wie man einen Ausgangsport, also Controllerpin, ein- und ausschalten kann. Nahezu alle Pins beim ATMega32 können auf diese Weise als Ausgangsport betrieben werden. Somit lassen sich nicht nur viele Leds, sondern unter Zuhilfenahme eines Treibers (z.B. Transistors) auch Relais und andere Aktoren schalten.&lt;br /&gt;
&lt;br /&gt;
==Eingangsport fragt Taster ab==&lt;br /&gt;
Nun erweitern wir die Schaltung noch um einen Taster. Nahezu jedes Port kann bei einem ATMega32 auch per Software als Eingangsport konfiguriert werden. Wir schließen z.B. einen Taster an Port-Pin PA7 an. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mittaster.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Port wird in der Software so konfiguriert, dass es als Eingang arbeitet und intern über einen hohen Widerstand  (Pullup-Widerstand) ständig auf High-Pegel gelegt wird. Wird nun eine Taste gedrückt, so wird der Pegel auf Low gezogen.&lt;br /&gt;
Das Beispielprogramm ist nun so gestaltet, dass bei gedrückter Taste die LED leuchtet und beim Loslassen wieder ausgeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step3.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
&lt;br /&gt;
Config Portc.0 = Output        'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C)&lt;br /&gt;
&lt;br /&gt;
Config Pina.7 = Input          'Ein Pin (PA0) wird als Eingang definiert&lt;br /&gt;
Porta.7 = 1                    'Interner Pullup Widerstand ein&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
  If Pina.7 = 1 Then&lt;br /&gt;
    Portc.0 = 1                'Pin wird auf High, also 5V geschaltet&lt;br /&gt;
  Else&lt;br /&gt;
    Portc.0 = 0                'Pin wird auf Low, also 0V geschaltet&lt;br /&gt;
  End If&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Grundschaltung mit Quarz==&lt;br /&gt;
Obwohl wir ab der letzten Schaltung schon einiges mit dem Controller anfangen können, so fehlt doch noch etwas Wichtiges. Oft ist es nämlich notwendig, dass ein Controller sehr genaue Frequenzen mißt oder ganz genaue Taktraten ausgeben kann. Leider ist der interne Taktgenerator nicht 100% exakt, was bei manchen Anwendungen störend ist. Zum Beispiel können über die RS232-Schnittstelle Daten nicht immer ganz fehlerfrei übertragen werden, wenn die Taktfrequenz nicht genau stimmt. Daher wird in den meisten Anwendungsfällen ein Quarz zur Takterzeugung genutzt, Sie kennen das sicher aus anderen Grundschaltungen. Also erweitern wir unsere Schaltung gleich noch um einen Quarz mit den zugehörigen 22pF-Kondensatoren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mitquarz.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf unserem Steckbrett wird's langsam voller, hier sieht's also inzwischen so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_mitquarz.jpg|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Normalerweise sollte der Quarz genauso wie die beiden 22pF-Kondensatoren, die zum Anschwingen des Quarzes dienen, möglichst nahe am Controller platziert werden. Auf dem Steckbrett ist das manchmal gar nicht so einfach, insbesondere wenn man wie in diesem Fall den Quarz erst später hinzufügt. Wichtig ist nämlich, dass die Leitungen vom Quarz zum Controller möglichst kurz sind, bei gedruckten Schaltungen oft nur 1 bis 2 cm! Auch die einzelnen Bauteilbeinchen, z.B. der Kondensatoren, sollten normalerweise so kurz wie möglich sein.&lt;br /&gt;
Ist dies nicht der Fall, wie auch in unserem Bild, dann fungieren diese Leitungen fast wie eine Funkantenne. Dies führt in der Regel zu starken Hochfrequenzsignalen, die nicht nur unsere Schaltung, sondern auch andere Schaltungen in der Nähe stören könnten. Man merkt dies auch oft daran, dass sich ein Board bei höherer Quarzfrequenz immer seltener fehlerfrei ohne Übertragungsfehler programmieren läßt.&lt;br /&gt;
Grundsätzlich sind daher Schaltungen mit Quarz auf einem Steckbrett nicht sonderlich zu empfehlen, die Betriebssicherheit ist nicht immer gegeben. &lt;br /&gt;
&lt;br /&gt;
Auch wenn nun ein Quarz angeschlossen ist, so wird er noch immer nicht genutzt. Noch immer arbeitet der [[ATMega32]] mit seiner intern voreingestellten 1 Mhz Taktfrequenz. Um dies umzustellen, muss man ein sogenanntes [[Fusebits|Fusebit]] im Controller umprogrammieren. Auch dies wurde schon im Beitrag [[Bascom - Erstes Programm in den AVR_Controller übertragen]] näher beschrieben. Hier sei daher nur nochmals gesagt, dass dies auch sehr bequem in [[Bascom]] erfolgt:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_bascomfusebitquarz.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sobald wir das umgestellt haben, müssen wir auch in dem Programm die Anweisung &lt;br /&gt;
&lt;br /&gt;
 $crystal = 1000000 &lt;br /&gt;
&lt;br /&gt;
durch &lt;br /&gt;
&lt;br /&gt;
 $crystal = 16000000 &lt;br /&gt;
&lt;br /&gt;
ersetzen, denn unser Quarz taktet nun mit 16 MHz.&lt;br /&gt;
&lt;br /&gt;
==Spannung stabilisieren==&lt;br /&gt;
Auch wenn unsere Basis-Schaltung für Experimente inzwischen schon ganz nett ist, so ist es doch etwas ungünstig, dass wir stets 5V zur Verfügung haben müssen. Nicht immer steht ein geeignetes Netzteil zur Verfügung, zudem soll ein Controller auch oft mit Batterien versorgt werden. Aus diesem Grund verfügen fast alle Entwicklungsboards wie ([[RN-Control]], STK500 etc.) über einen [[Spannungsregler]].&lt;br /&gt;
[[Bild:78s05.jpg|thumb|Spannungsregler 78S05]] Dieser wandelt eine höhere Eingangsspannung (ca. 7 bis 20 V) immer genau in  5V  um. Sowas erhöht die Betriebssicherheit einer Schaltung nochmals immens. Als [[Spannungsregler]] (IC2) wird oft der 7805 genutzt, empfehlenswert ist der Typ 78S05, welcher 2A verträgt sowie über einen Kurzschluss- und Überlastungsschutz verfügt. &lt;br /&gt;
Die beiden 100nF-Kondensatoren sind wichtig, sie sollen HF-Störungen und Schwingungen vermeiden. Der Elko vor dem Spannungsregler ist vor allem dann wichtig, wenn die Spannung von einem Netzgerät kommt und noch etwas geglättet werden muss. Je höher der Strombedarf der Schaltung, desto größer kann man die Kapazität wählen. Es schadet nicht, wenn man den Elko einige Nummern größer wählt, man ist dann quasi für alle Fälle gerüstet. So sind Werte zwischen 100 uF und 2200 uF durchaus denkbar. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wir erweitern unsere Schaltung somit wie folgt:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_spannung.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht's wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_spannung.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
==Daten und Texte zum PC übertragen==&lt;br /&gt;
In vielen Programmen müssen Daten oder Texte vom Controller an den PC oder umgekehrt gesendet werden. Insbesondere bei komplexen Programmen kann man auf diese Weise Variableninhalte ausgeben und somit auch Fehler im Programmcode schneller finden und korrigieren. In der Regel ist das ganz einfach, denn der [[Microcontroller]] [[ATMega32]] verfügt über einen internen [[UART]], also ein Modul, das Daten über die [[RS232]]-Schnittstelle zum PC senden bzw. auch von ihm empfangen kann. Leider arbeitet jedoch die Controllerschnittstelle mit 5V und die PC-Schnittstelle der Norm entsprechend mit +-12V. Daher muss unbedingt ein Schaltkreis dazwischen, welcher die Pegel anpasst. Gewöhnlich nimmt man hier das IC MAX232(CPE), welches inzwischen sehr preiswert erhältlich ist.&lt;br /&gt;
&lt;br /&gt;
Wir müssen also die Schaltung nochmals erweitern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_max232.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das IC Max232 ist im Schaltplan in der üblichen funktionsorientierten Darstellung gezeichnet. Zur besseren Übersichtlichkeit wurden die immer benötigten Anschlüsse für VCC (Pin 16) und GND (Pin 15) getrennt oben rechts im Schaltplan dargestellt. Also nicht vergessen !!&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht's so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_max232.jpg|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Über eine dreipolige Stiftleiste ([[RN-Definitionen]]) wird nun das Steckboard mit der [[RS232]]-Schnittstelle des PC verbunden. Es ist nun ein Leichtes, mit einem Programm Daten zum PC zu senden. Das nachfolgende Programm gibt Hinweise mit der Anweisung '''PRINT''' aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step5.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 16000000&lt;br /&gt;
$baud = 9600&lt;br /&gt;
&lt;br /&gt;
Config Portc.0 = Output              'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C)&lt;br /&gt;
&lt;br /&gt;
Config Pina.7 = Input                'Ein Pin (PA0) wird als Eingang definiert&lt;br /&gt;
Porta.7 = 1                          'Interner Pullup Widerstand ein&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
  If Pina.7 = 1 Then&lt;br /&gt;
    Portc.0 = 1                      'Pin wird auf High, also 5V geschaltet&lt;br /&gt;
    Print &amp;quot;Schalter nicht gedrückt&amp;quot;&lt;br /&gt;
  Else&lt;br /&gt;
    Portc.0 = 0                      'Pin wird auf Low, also 0V geschaltet&lt;br /&gt;
    Print &amp;quot;Schalter gedrückt&amp;quot;&lt;br /&gt;
  End If&lt;br /&gt;
  Wait 1&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Möglichkeiten des Steckbrettes erreicht==&lt;br /&gt;
Inzwischen füllt der Schaltplan fast ein DIN-A4-Blatt und auf dem Steckbrett sieht's auch schon recht wirr aus, dabei haben wir nur die wichtigsten Grundelemente auf dem Steckbrett. Für eine Roboter-Steuerung oder andere Anwendung fehlt doch noch einiges. Zum Beispiel weitere Taster, weitere LEDs, Motortreiber, damit der Controller auch Motoren ansteuern kann und ein [[I2C]]-Bus-Anschluss.&lt;br /&gt;
Dies alles noch auf einem Steckbrett zu realisieren macht wenig Sinn, zumal bereits jetzt schon durch die doch recht langen Leitungen/Verkabelungen erhebliche Störungen auftreten. In der letzten Phase ist es immer öfters zu Übertragungsfehlern beim Programmieren gekommen, oft musste dies 20mal wiederholt werden. Dies zeigt, dass ein Steckbrett bestenfalls für ganz kleine Controller-Experimente herhalten kann. Für größere Dinge sollte man dann doch zu einer Lösung auf einer gedruckten Platine greifen. Spezielle Experimentierboards  bieten mehr Sicherheit und haben neben den Grundelementen, die hier beschrieben wurden, noch eine ganze Menge mehr drauf. Bei [[RN-Control]] zum Beispiel 5 Tasten, 8 Leds, Motortreiber, Lautsprecher, diverse Anschlüsse etc. &lt;br /&gt;
Der Größenunterschied wird im Bild deutlich:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_rncontrol.jpg|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auch wenn das Steckbrett also kein Controllerboard ersetzen kann, so hat das kleine Tutorial doch gezeigt, wie eine [[Avr]]-Schaltung aufzubauen ist. Dieses Wissen sollte man auch besitzen, wenn man ein Controllerboard nutzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Was braucht man, wenn man mit einem Controllerboard den Einstieg startet?==&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_ispkabel.jpg|thumb|ISP-Programmierkabel]]Neben dem eigentlichen Board braucht man, wie schon zuvor angesprochen, ein [[AVR-ISP Programmierkabel]]. Da das Selbstbauen kaum billiger ist, ist zu empfehlen, ein solches fertig mitzubestellen. Am preiswertesten und zugleich vielseitigsten sind die ISP-Adapter, die man an das Druckerport anschließt (siehe Bild). Es gibt aber auch USB-Lösungen, wobei diese jedoch oft teuer sind und auch oft weniger Controller programmieren können. Hat man jedoch einen PC oder Notebook ohne parellelen Druckeranschluss, so muss man wohl oder übel in den meisten Fällen zu einem seriellen oder USB-Programmieradapter greifen. Neben den erwähnten Nachteilen hat der USB Dongle aber oft auch den Vorteil, dass er etwas schneller ist. Dieser Unterschied macht sich aber nur bei sehr großen Programmen und Controllern wirklich bemerkbar.&lt;br /&gt;
&lt;br /&gt;
Als zweites braucht man natürlich eine Stromversorgung. Ideal sind Gleichspannungsnetzgeräte, die zwischen 9 und 12V liefern, vorausgesetzt, das Board hat einen Spannungsregler wie in der Regel die RN-Boards. Man kann hier ein normales Steckernetzteil oder ein komfortables Labornetzteil nehmen. Um etwas Reserve zu haben, wäre es gut, wenn das Netzteil mindestens 1 A liefern kann. Alternativ kann man auch Akkupacks oder Batterien nutzen, allerdings mindestens 7,2V sollten die schon liefern können, sicherer sind 8,4-, 9,6- oder 12V-Akkus.&lt;br /&gt;
Das wäre eigentlich schon das Wichtigste, um ein Board in Betrieb zu nehmen und Experimente zu machen. &lt;br /&gt;
&lt;br /&gt;
Allerdings, ein RS232-Kabel ist ebenfalls noch sehr empfehlenswert. Dieses erlaubt die Ausgabe von Texten und Variablen auf den PC, wir haben es ja oben im Steckbrettbeispiel schon gesehen. Dazu wird auf dem PC ein [[Terminalprogramm]] gestartet und über die [[RS232]] Schnittstelle mit dem PC verbunden. Bei manchen Boards ist sowieso ein RS232 Kabel unerläßlich, wie z.B. RN-Motor, RN-Speak etc. Nützlich ist es aber überall. Man kann ein solches Kabel selbst bauen oder gleich beim Kauf eines Boardes mitbestellen.&lt;br /&gt;
&lt;br /&gt;
Also nochmal die Zusammenfassung für den Einstieg:&lt;br /&gt;
&lt;br /&gt;
* Controllerboard&lt;br /&gt;
* [[AVR-ISP Programmierkabel]] mit 10-poligem Wannenstecker&lt;br /&gt;
* RS-232-Kabel (mit 3-poligem Adapter, wenn Board [[RN-Definitionen]] erfüllt)&lt;br /&gt;
* Netzgerät oder Akku (ideal 9 bis 12V, notfalls auch 7,2 bis 20V)&lt;br /&gt;
* [[Bascom]]-Compiler-Vollversion ist nur nötig, wenn man gleich größere Sachen anstrebt, ansonsten reicht das Demo, genauso wie ein [[Avr-gcc]]-Compiler. Bei RN-Boards sind diese Programme beim Board- oder Platinenkauf sowieso dabei, ansonsten kann man diese im Internet downloaden.&lt;br /&gt;
* Ein gutes Buch ist immer gut, siehe [[Buchvorstellungen]]&lt;br /&gt;
&lt;br /&gt;
==Autor==&lt;br /&gt;
*[[Benutzer:Frank|Frank]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Quellen===&lt;br /&gt;
* [[Abblockkondensator]] Artikel von Uwegw&lt;br /&gt;
* RN-Board Dokumentationen aus [[:Kategorie:Projekte]]&lt;br /&gt;
* diverse Datenblätter&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
*[[AVR-ISP Programmierkabel]]&lt;br /&gt;
*[[Mit welchem Controllerboard fang ich an]]&lt;br /&gt;
*[[Abblockkondensator]]&lt;br /&gt;
*[[Bascom]]&lt;br /&gt;
*[[Bascom - Erstes Programm in den AVR_Controller übertragen]]&lt;br /&gt;
*[[Avr]]&lt;br /&gt;
*[[Atmel Controller Mega16 und Mega32]]&lt;br /&gt;
*[[Spannungsregler]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Projekte]]&lt;/div&gt;</summary>
		<author><name>Ratzfatz</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=AVR-Einstieg_leicht_gemacht&amp;diff=14983</id>
		<title>AVR-Einstieg leicht gemacht</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=AVR-Einstieg_leicht_gemacht&amp;diff=14983"/>
				<updated>2009-06-11T13:14:28Z</updated>
		
		<summary type="html">&lt;p&gt;Ratzfatz: /* Wie bekommt man das Programm in den Controller? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:avr8.jpg|thumb|300px|Einen Controller zum Leben zu erwecken ist nicht schwer, manchmal reichen ein paar Teile! Beispiel mit Mega8]]&lt;br /&gt;
==Wir starten mit einem ATMega32== &lt;br /&gt;
Immer wieder gibt es in Foren, wie dem Roboternetz, Einsteiger, die das erstemal mit einem [[Microcontroller]] in Berührung kommen. Trotz zahlreicher Einstiegsbeiträge im Forum wiederholen sich doch bestimmte Anfängerfragen immer wieder, daher soll dieser Artikel noch einmal aufzeigen, wie man den ersten Schritt tut und einen Controller zum Leben erweckt. Es werden verschiedene Grundschaltungen aufgezeigt und erläutert, welche Bauteile welche Funktion besitzen.&lt;br /&gt;
Als Controller verwenden wir einen [[AVR]] [[ATMega32]], der derzeit größte [[AVR]]-Controller, welcher noch im bastlerfreundlichen DIP-Gehäuse verfügbar ist.  Für kleine bis mittlere Projekte ein sehr empfehlenswerter Controller, zumal er preislich mit ca. 6-7 Euro noch sehr günstig ist und zudem mit seinem 40-Pin-Gehäuse reichlich Anschlussmöglichkeiten besitzt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mega1632.gif|center]]&lt;br /&gt;
&lt;br /&gt;
Wie auf dem Bild zu sehen, verfügt auch der etwas günstigere ATMega16 über die gleiche Pinbelegung, daher könnten wir in diesem Tutorial auch diesen Typ verwenden. Der ATMega32 hat aber doppelt soviel Speicherplatz für Programmdaten (Flash), daher hat man für eine geringe Preisdifferenz doch mehr Möglichkeiten.&lt;br /&gt;
Wer noch 3 bis 4 Euro sparen will, dem sei der [[ATMega8]] oder [[ATMega168]] empfohlen, diese Typen sind sehr ähnlich, so dass das Tutorial weitgehend auch auf diese Typen bezogen werden kann. Allerdings haben diese Typen deutlich weniger Anschlussmöglichkeiten (28 Pin DIP Gehäuse). &lt;br /&gt;
&lt;br /&gt;
Die Frage, ob man mit einem fertigen Controllerboard, einer Experimentierplatine oder einem Steckbrett beginnen sollte, wurde ja in dem RN-Wissen Wiki Beitrag &amp;quot;[[Mit welchem Controllerboard fang ich an]]&amp;quot; angesprochen. In den meisten Fällen favorisiert der Autor dieses Artikels ein fertiges Controllerboard. Warum das so ist, dazu am Ende noch ein paar Anmerkungen. Dennoch soll diese Einführung schrittweise anhand eines Steckbrettes erläutert werden.&lt;br /&gt;
&lt;br /&gt;
==Start mit handelsüblichem Steckbrett==&lt;br /&gt;
Ein Steckbrett hat den Vorteil, dass man theoretisch ohne Löten alle Bauteile relativ zügig zusammenstecken kann. Bestimmte Steckkontakte innerhalb einer Reihe sind im Steckbrett miteinander verbunden, so dass man nachher pro Bauteilbeinchen noch einige Steckkontakte zum Verdrahten mit Schaltdraht oder speziell konfektionierter Litze verwenden kann.&lt;br /&gt;
&lt;br /&gt;
'''Die Vorteile eines Steckbretts:'''&lt;br /&gt;
&lt;br /&gt;
*Bauteile können ohne Löten eingesetzt und verdrahtet werden&lt;br /&gt;
*recht zügiger Schaltungsaufbau&lt;br /&gt;
*eine Schaltung kann leicht geändert oder korrigiert werden, defekte Teile sind leicht tauschbar&lt;br /&gt;
*ein Steckbrett kann auch für ganz andere Schaltungen verwendet werden&lt;br /&gt;
'''Die Nachteile eines Steckbretts gegenüber gedruckten Schaltungen und Experimentierplatinen sind:'''&lt;br /&gt;
&lt;br /&gt;
*nicht alle Bauteile passen, so dass wir doch noch etwas löten müssen&lt;br /&gt;
*nur geringer Schaltungsumfang möglich, da es schnell unübersichtlich wird&lt;br /&gt;
*sehr störanfällig wegen grosser Kabellängen, dadurch oft Funktionsstörungen&lt;br /&gt;
*Bauteile müssen zum Teil verbogen werden, damit sie passen&lt;br /&gt;
&lt;br /&gt;
Man beginnt, indem man den Controller AVR [[ATMega32]] auf das Board aufsetzt:&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrettmega32.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
==Die Grundschaltung==&lt;br /&gt;
Damit ein Controller erst mal zum Laufen kommt, benötigt man zumindest einen 10-k-Widerstand, einen 100-nF-Kondensator und eine 5V-Spannungsquelle. Das Ganze muss entsprechend dem unteren Schaltplan verschaltet werden, man spricht von einer sogenannten Grundschaltung. In dem Schaltplan wurde der Controller im Übrigen pinkompatibel als Schaltzeichen verwendet, die Pinreihenfolge ist also im Schaltplan identisch mit der echten Bauteilpin-Reihenfolge. Diese Darstellung erleichtert den Nachbau der Schaltung auf einem Steckbrett aber auch einer Experimentierplatine ungemein. Gewöhnlich verwendet man in Schaltplänen eine etwas andere Darstellung, bei der die Pins nach Funktionsgruppen geordnet sind. Bei solchen Schaltplänen muss man sich dann anhand der Pin-Nummern orientieren, man wird dies am Ende des Artikels noch bei dem IC MAX232 sehen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mega32.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn man schon einige Grundschaltungen in anderen Tutorials gesehen hat, dann wird man bemerken, dass unsere doch noch etwas einfacher ist und weniger Bauteile benötigt.  Hier wird beispielsweise kein Quarz verwendet, da der ATMega32 auch intern einen Takt generieren kann. Wer mit dem ADC genau messen will, sollte statt der Beschaltung im Bild, zwischen Vcc und AVcc eine Spule von 10uH und einen Kondensator von 100nF zwischen AVcc und GND schalten. Will man AVcc als Referenzspannung verwenden, muss noch ein 100nF Kondensator von ARef nach GND.&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht die obere Schaltung wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett1.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um den Controller in Betrieb zu nehmen, benötigt man bei dieser Schaltung ein Netzteil, das eine stabilisierte Spannung von 4 bis 5V liefert. Wir gehen erst einmal davon aus, dass man über dieses verfügt. &lt;br /&gt;
Erwähnenswert ist noch, dass der Kondensator als [[Abblockkondensator]] zur Unterdrückung von Störungen dient. Er muss so nah wie möglich an die Spannungszuführung am Controller selbst gesetzt werden. Ohne Kondensator enstehen erhebliche Störungen in der Versorgungsspannung, das Bild verdeutlicht es:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Abblockkondensator OhneC amAVR.jpg|center]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Der Widerstand in der Grundschaltung dient dazu, die Reset-Leitung konstant auf definiertem High-Pegel zu halten. Verbindet man diesen RESET-Pin später kurz mit GND (Masse), dann wird das Programm im Controller neu gestartet.&lt;br /&gt;
&lt;br /&gt;
==Woran merkt man, dass der Controller funktioniert?==&lt;br /&gt;
Gute Frage! Man merkt es garnicht. Genau genommen funktioniert ja auch trotz korrekter Schaltung noch immer nix, denn es muss zuerst ein Programm in den Controller geladen werden, damit er überhaupt weiss, was zu tun ist. Ohne Programm ist der Controller quasi tot.&lt;br /&gt;
&lt;br /&gt;
==Wie bekommt man das Programm in den Controller?==&lt;br /&gt;
Der Controller verfügt über eine sogenannte [[ISP]]-Schnittstelle. Das bedeutet, über bestimmte Pins ([[SPI]]) kann der Controller mit einer geeigneten PC-Software (zum Beispiel Bascom) programmiert werden. Zum Anschluss an den PC benötigt man jedoch einen sogenannten ISP-Dongle, auch Programmieradapter genannt. Hier gibt es verschiedene Lösungen, serielle und parallele Adapter. Original von Atmel oder kompatible Lösungen. Der am meisten verwendete ISP-Dongle wird am Druckerport betrieben. Diese gibt es inzwischen recht preiswert, sodass sich das Selbstbauen eigentlich nicht lohnt. Da man auch gern auf ein paar Fehlerquellen verzichten sollte, würde ich eine Fertiglösung empfehlen. Wer ihn selbst bauen möchte, findet ([[AVR-ISP_Programmierkabel|hier]] eine ISP-Dongle-Bauanleitung und sogar eine fertige Platine dafür  ([[AVR-ISP_Programmierkabel]]).&lt;br /&gt;
&lt;br /&gt;
Sowas sieht dann so aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Avrtutorial_ispkabel.jpeg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan eines solchen Programmierkabels:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:ispschaltplan.gif|center|thumb|400px|Schaltplan des ISP-Dongels nach unserem Wiki-Bauplan, mit SUB-D Buchse. Bitte beachten, dass das IC1 hier im Plan als verschiedene Blöcke (IC1A/IC1B) dargestellt wird. Dies dient nur zur Übersicht, es handelt sich nur um ein IC, einfach auf die Pinnummern achten. Zum vergrößern anklicken.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Problem ist nun, wie schließe ich einen handelsüblichen ISP-Programmieradapter an den Controller auf dem Steckbrett an. Der normale 10-polige Wannenstecker (nach [[RN-Definitionen]]) passt nicht in ein Steckbrett. Das ist wieder so ein typischer Nachteil bei Steckbrettern! In unserem Beispiel haben wir dazu auf einem kleinen Stück Experimentierplatine einen steckbaren Adapter für das Steckboard gelötet.&lt;br /&gt;
Somit kann man die Schaltung um einen üblichen 10-poligen ISP-Programmieranschluss ergänzen:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mitisp.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
Ein noch einfacheres Programmierkabel ist auf der Seite http://thomaspfeifer.net/ beschrieben.&lt;br /&gt;
Dort findet man unter &amp;quot;AVR-Projekte&amp;quot; den Artikel &amp;quot;Ein einfaches Programmierkabel für Atmel-AVR Mikrocontroller&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Im Bascom stellt man, um mit diesen einfachen Programmierkabeln zu arbeiten folgendes ein:&lt;br /&gt;
Unter &amp;quot;Options/Programmer&amp;quot; wird &amp;quot;STK200/STK300 Programmer&amp;quot; eingestellt, wenn es nicht schon so da steht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht das gleiche so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_mitisp.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jetzt endlich ist es soweit, jetzt kann man den Controller über einen ISP-Programmieradapter mit dem PC verbinden. Aber unbedingt darauf achten, dass auch alles korrekt nach Schaltplan gesteckt wurde und dass die Betriebsspannung 5V nicht übersteigt. Ansonsten könnte man sich Dongle oder sogar die PC-Schnittstelle beschädigen.&lt;br /&gt;
Als Entwicklungsumgebung nutzen wir hier im Tutorial [[Bascom]]. [[Bascom]] ist ein sehr beliebter Basic-[[Compiler]], der zahlreiche [[AVR]] Controllertypen programmieren kann. Da auch ein [[Terminalprogramm]] und ein Programmer integriert ist, enthält diese PC-Software alles, was man braucht, das erleichtert den Einstieg zusätzlich. Die Software gibts kostenlos als Demo bis 4K Code, für unsere Beispiele und den Einstieg reicht das allemal, siehe dazu Artikel Bascom.&lt;br /&gt;
&lt;br /&gt;
Wie man ein Programm schreibt, kompiliert und überträgt, wurde schon in diesem Beitrag [[Bascom - Erstes Programm in den AVR Controller übertragen]] ausführlich behandelt, wir ersparen uns deshalb diese Details. Man sollte aber bei Unklarheiten zum Kompilieren und Übertragen diesen Artikel auf jeden Fall lesen.&lt;br /&gt;
&lt;br /&gt;
Als erstes kompilieren und übertragen wir folgendes Programm:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step1.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Programm macht eigentlich nichts, außer dass es eine Endlosschleife ausführt. Aber da wir noch überhaupt nix am Controller angeschlossen haben, können wir eh noch nicht sehen, ob ein Programm nun richtig ausgeführt wird oder nicht.&lt;br /&gt;
Allerdings können wir schonmal üben, das Programm mit Bascom zu übertragen. Wenn wir alles richtig aufgebaut haben und Spannung anliegt, dann sollte automatisch der Controller in Bascom erkannt werden. Die Übertragung sollte dann ohne Fehlermeldung erfolgen können. Wenn wir das geschafft haben, geht’s weiter.&lt;br /&gt;
&lt;br /&gt;
==Läuft die Schaltung und das Programm?==&lt;br /&gt;
Damit wir nun endlich sehen, ob sich bei unserer Schaltung auch was tut, schließen wir eine LED über einen 1K-Vorwiderstand an einen Port an. Da wir die Kathode an den Controllerpin und die Anode an Plus legen, leuchtet die LED immer dann, wenn dieser Pin auf Low geschaltet wird.&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mitled.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht's nun so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_mitled.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Damit man nun auch wirklich sieht, ob das Programm läuft, schreiben wir ein kleines Basic-Programm, welches eine LED abwechselnd ein– und ausschaltet. Wir kompilieren und übertragen also folgendes Programm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step2.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
&lt;br /&gt;
Config Portc.0 = Output       'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C)&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
  Portc.0 = 1                 'Pin wird auf High, also 5V geschaltet&lt;br /&gt;
  Waitms 100&lt;br /&gt;
  Portc.0 = 0                 'Pin wird auf Low, also 0V geschaltet&lt;br /&gt;
  Waitms 100&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn die LED nun schnell blinkt, dann funktioniert die aufgebaute Schaltung perfekt. Wir haben gleichzeitig gelernt, wie man einen Ausgangsport, also Controllerpin, ein- und ausschalten kann. Nahezu alle Pins beim ATMega32 können auf diese Weise als Ausgangsport betrieben werden. Somit lassen sich nicht nur viele Leds, sondern unter Zuhilfenahme eines Treibers (z.B. Transistors) auch Relais und andere Aktoren schalten.&lt;br /&gt;
&lt;br /&gt;
==Eingangsport fragt Taster ab==&lt;br /&gt;
Nun erweitern wir die Schaltung noch um einen Taster. Nahezu jedes Port kann bei einem ATMega32 auch per Software als Eingangsport konfiguriert werden. Wir schließen z.B. einen Taster an Port-Pin PA7 an. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mittaster.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Port wird in der Software so konfiguriert, dass es als Eingang arbeitet und intern über einen hohen Widerstand  (Pullup-Widerstand) ständig auf High-Pegel gelegt wird. Wird nun eine Taste gedrückt, so wird der Pegel auf Low gezogen.&lt;br /&gt;
Das Beispielprogramm ist nun so gestaltet, dass bei gedrückter Taste die LED leuchtet und beim Loslassen wieder ausgeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step3.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
&lt;br /&gt;
Config Portc.0 = Output        'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C)&lt;br /&gt;
&lt;br /&gt;
Config Pina.7 = Input          'Ein Pin (PA0) wird als Eingang definiert&lt;br /&gt;
Porta.7 = 1                    'Interner Pullup Widerstand ein&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
  If Pina.7 = 1 Then&lt;br /&gt;
    Portc.0 = 1                'Pin wird auf High, also 5V geschaltet&lt;br /&gt;
  Else&lt;br /&gt;
    Portc.0 = 0                'Pin wird auf Low, also 0V geschaltet&lt;br /&gt;
  End If&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Grundschaltung mit Quarz==&lt;br /&gt;
Obwohl wir ab der letzten Schaltung schon einiges mit dem Controller anfangen können, so fehlt doch noch etwas Wichtiges. Oft ist es nämlich notwendig, dass ein Controller sehr genaue Frequenzen mißt oder ganz genaue Taktraten ausgeben kann. Leider ist der interne Taktgenerator nicht 100% exakt, was bei manchen Anwendungen störend ist. Zum Beispiel können über die RS232-Schnittstelle Daten nicht immer ganz fehlerfrei übertragen werden, wenn die Taktfrequenz nicht genau stimmt. Daher wird in den meisten Anwendungsfällen ein Quarz zur Takterzeugung genutzt, Sie kennen das sicher aus anderen Grundschaltungen. Also erweitern wir unsere Schaltung gleich noch um einen Quarz mit den zugehörigen 22pF-Kondensatoren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mitquarz.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf unserem Steckbrett wird's langsam voller, hier sieht's also inzwischen so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_mitquarz.jpg|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Normalerweise sollte der Quarz genauso wie die beiden 22pF-Kondensatoren, die zum Anschwingen des Quarzes dienen, möglichst nahe am Controller platziert werden. Auf dem Steckbrett ist das manchmal gar nicht so einfach, insbesondere wenn man wie in diesem Fall den Quarz erst später hinzufügt. Wichtig ist nämlich, dass die Leitungen vom Quarz zum Controller möglichst kurz sind, bei gedruckten Schaltungen oft nur 1 bis 2 cm! Auch die einzelnen Bauteilbeinchen, z.B. der Kondensatoren, sollten normalerweise so kurz wie möglich sein.&lt;br /&gt;
Ist dies nicht der Fall, wie auch in unserem Bild, dann fungieren diese Leitungen fast wie eine Funkantenne. Dies führt in der Regel zu starken Hochfrequenzsignalen, die nicht nur unsere Schaltung, sondern auch andere Schaltungen in der Nähe stören könnten. Man merkt dies auch oft daran, dass sich ein Board bei höherer Quarzfrequenz immer seltener fehlerfrei ohne Übertragungsfehler programmieren läßt.&lt;br /&gt;
Grundsätzlich sind daher Schaltungen mit Quarz auf einem Steckbrett nicht sonderlich zu empfehlen, die Betriebssicherheit ist nicht immer gegeben. &lt;br /&gt;
&lt;br /&gt;
Auch wenn nun ein Quarz angeschlossen ist, so wird er noch immer nicht genutzt. Noch immer arbeitet der [[ATMega32]] mit seiner intern voreingestellten 1 Mhz Taktfrequenz. Um dies umzustellen, muss man ein sogenanntes [[Fusebits|Fusebit]] im Controller umprogrammieren. Auch dies wurde schon im Beitrag [[Bascom - Erstes Programm in den AVR_Controller übertragen]] näher beschrieben. Hier sei daher nur nochmals gesagt, dass dies auch sehr bequem in [[Bascom]] erfolgt:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_bascomfusebitquarz.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sobald wir das umgestellt haben, müssen wir auch in dem Programm die Anweisung &lt;br /&gt;
&lt;br /&gt;
 $crystal = 1000000 &lt;br /&gt;
&lt;br /&gt;
durch &lt;br /&gt;
&lt;br /&gt;
 $crystal = 16000000 &lt;br /&gt;
&lt;br /&gt;
ersetzen, denn unser Quarz taktet nun mit 16 MHz.&lt;br /&gt;
&lt;br /&gt;
==Spannung stabilisieren==&lt;br /&gt;
Auch wenn unsere Basis-Schaltung für Experimente inzwischen schon ganz nett ist, so ist es doch etwas ungünstig, dass wir stets 5V zur Verfügung haben müssen. Nicht immer steht ein geeignetes Netzteil zur Verfügung, zudem soll ein Controller auch oft mit Batterien versorgt werden. Aus diesem Grund verfügen fast alle Entwicklungsboards wie ([[RN-Control]], STK500 etc.) über einen [[Spannungsregler]].&lt;br /&gt;
[[Bild:78s05.jpg|thumb|Spannungsregler 78S05]] Dieser wandelt eine höhere Eingangsspannung (ca. 7 bis 20 V) immer genau in  5V  um. Sowas erhöht die Betriebssicherheit einer Schaltung nochmals immens. Als [[Spannungsregler]] (IC2) wird oft der 7805 genutzt, empfehlenswert ist der Typ 78S05, welcher 2A verträgt sowie über einen Kurzschluss- und Überlastungsschutz verfügt. &lt;br /&gt;
Die beiden 100nF-Kondensatoren sind wichtig, sie sollen HF-Störungen und Schwingungen vermeiden. Der Elko vor dem Spannungsregler ist vor allem dann wichtig, wenn die Spannung von einem Netzgerät kommt und noch etwas geglättet werden muss. Je höher der Strombedarf der Schaltung, desto größer kann man die Kapazität wählen. Es schadet nicht, wenn man den Elko einige Nummern größer wählt, man ist dann quasi für alle Fälle gerüstet. So sind Werte zwischen 100 uF und 2200 uF durchaus denkbar. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wir erweitern unsere Schaltung somit wie folgt:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_spannung.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht's wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_spannung.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
==Daten und Texte zum PC übertragen==&lt;br /&gt;
In vielen Programmen müssen Daten oder Texte vom Controller an den PC oder umgekehrt gesendet werden. Insbesondere bei komplexen Programmen kann man auf diese Weise Variableninhalte ausgeben und somit auch Fehler im Programmcode schneller finden und korrigieren. In der Regel ist das ganz einfach, denn der [[Microcontroller]] [[ATMega32]] verfügt über einen internen [[UART]], also ein Modul, das Daten über die [[RS232]]-Schnittstelle zum PC senden bzw. auch von ihm empfangen kann. Leider arbeitet jedoch die Controllerschnittstelle mit 5V und die PC-Schnittstelle der Norm entsprechend mit +-12V. Daher muss unbedingt ein Schaltkreis dazwischen, welcher die Pegel anpasst. Gewöhnlich nimmt man hier das IC MAX232(CPE), welches inzwischen sehr preiswert erhältlich ist.&lt;br /&gt;
&lt;br /&gt;
Wir müssen also die Schaltung nochmals erweitern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_max232.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das IC Max232 ist im Schaltplan in der üblichen funktionsorientierten Darstellung gezeichnet. Zur besseren Übersichtlichkeit wurden die immer benötigten Anschlüsse für VCC (Pin 16) und GND (Pin 15) getrennt oben rechts im Schaltplan dargestellt. Also nicht vergessen !!&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht's so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_max232.jpg|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Über eine dreipolige Stiftleiste ([[RN-Definitionen]]) wird nun das Steckboard mit der [[RS232]]-Schnittstelle des PC verbunden. Es ist nun ein Leichtes, mit einem Programm Daten zum PC zu senden. Das nachfolgende Programm gibt Hinweise mit der Anweisung '''PRINT''' aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step5.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 16000000&lt;br /&gt;
$baud = 9600&lt;br /&gt;
&lt;br /&gt;
Config Portc.0 = Output              'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C)&lt;br /&gt;
&lt;br /&gt;
Config Pina.7 = Input                'Ein Pin (PA0) wird als Eingang definiert&lt;br /&gt;
Porta.7 = 1                          'Interner Pullup Widerstand ein&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
  If Pina.7 = 1 Then&lt;br /&gt;
    Portc.0 = 1                      'Pin wird auf High, also 5V geschaltet&lt;br /&gt;
    Print &amp;quot;Schalter nicht gedrückt&amp;quot;&lt;br /&gt;
  Else&lt;br /&gt;
    Portc.0 = 0                      'Pin wird auf Low, also 0V geschaltet&lt;br /&gt;
    Print &amp;quot;Schalter gedrückt&amp;quot;&lt;br /&gt;
  End If&lt;br /&gt;
  Wait 1&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Möglichkeiten des Steckbrettes erreicht==&lt;br /&gt;
Inzwischen füllt der Schaltplan fast ein DIN-A4-Blatt und auf dem Steckbrett sieht's auch schon recht wirr aus, dabei haben wir nur die wichtigsten Grundelemente auf dem Steckbrett. Für eine Roboter-Steuerung oder andere Anwendung fehlt doch noch einiges. Zum Beispiel weitere Taster, weitere LEDs, Motortreiber, damit der Controller auch Motoren ansteuern kann und ein [[I2C]]-Bus-Anschluss.&lt;br /&gt;
Dies alles noch auf einem Steckbrett zu realisieren macht wenig Sinn, zumal bereits jetzt schon durch die doch recht langen Leitungen/Verkabelungen erhebliche Störungen auftreten. In der letzten Phase ist es immer öfters zu Übertragungsfehlern beim Programmieren gekommen, oft musste dies 20mal wiederholt werden. Dies zeigt, dass ein Steckbrett bestenfalls für ganz kleine Controller-Experimente herhalten kann. Für größere Dinge sollte man dann doch zu einer Lösung auf einer gedruckten Platine greifen. Spezielle Experimentierboards  bieten mehr Sicherheit und haben neben den Grundelementen, die hier beschrieben wurden, noch eine ganze Menge mehr drauf. Bei [[RN-Control]] zum Beispiel 5 Tasten, 8 Leds, Motortreiber, Lautsprecher, diverse Anschlüsse etc. &lt;br /&gt;
Der Größenunterschied wird im Bild deutlich:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_rncontrol.jpg|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auch wenn das Steckbrett also kein Controllerboard ersetzen kann, so hat das kleine Tutorial doch gezeigt, wie eine [[Avr]]-Schaltung aufzubauen ist. Dieses Wissen sollte man auch besitzen, wenn man ein Controllerboard nutzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Was braucht man, wenn man mit einem Controllerboard den Einstieg startet?==&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_ispkabel.jpg|thumb|ISP-Programmierkabel]]Neben dem eigentlichen Board braucht man, wie schon zuvor angesprochen, ein [[AVR-ISP Programmierkabel]]. Da das Selbstbauen kaum billiger ist, ist zu empfehlen, ein solches fertig mitzubestellen. Am preiswertesten und zugleich vielseitigsten sind die ISP-Adapter, die man an das Druckerport anschließt (siehe Bild). Es gibt aber auch USB-Lösungen, wobei diese jedoch oft teuer sind und auch oft weniger Controller programmieren können. Hat man jedoch einen PC oder Notebook ohne parellelen Druckeranschluss, so muss man wohl oder übel in den meisten Fällen zu einem seriellen oder USB-Programmieradapter greifen. Neben den erwähnten Nachteilen hat der USB Dongle aber oft auch den Vorteil, dass er etwas schneller ist. Dieser Unterschied macht sich aber nur bei sehr großen Programmen und Controllern wirklich bemerkbar.&lt;br /&gt;
&lt;br /&gt;
Als zweites braucht man natürlich eine Stromversorgung. Ideal sind Gleichspannungsnetzgeräte, die zwischen 9 und 12V liefern, vorausgesetzt, das Board hat einen Spannungsregler wie in der Regel die RN-Boards. Man kann hier ein normales Steckernetzteil oder ein komfortables Labornetzteil nehmen. Um etwas Reserve zu haben, wäre es gut, wenn das Netzteil mindestens 1 A liefern kann. Alternativ kann man auch Akkupacks oder Batterien nutzen, allerdings mindestens 7,2V sollten die schon liefern können, sicherer sind 8,4-, 9,6- oder 12V-Akkus.&lt;br /&gt;
Das wäre eigentlich schon das Wichtigste, um ein Board in Betrieb zu nehmen und Experimente zu machen. &lt;br /&gt;
&lt;br /&gt;
Allerdings, ein RS232-Kabel ist ebenfalls noch sehr empfehlenswert. Dieses erlaubt die Ausgabe von Texten und Variablen auf den PC, wir haben es ja oben im Steckbrettbeispiel schon gesehen. Dazu wird auf dem PC ein [[Terminalprogramm]] gestartet und über die [[RS232]] Schnittstelle mit dem PC verbunden. Bei manchen Boards ist sowieso ein RS232 Kabel unerläßlich, wie z.B. RN-Motor, RN-Speak etc. Nützlich ist es aber überall. Man kann ein solches Kabel selbst bauen oder gleich beim Kauf eines Boardes mitbestellen.&lt;br /&gt;
&lt;br /&gt;
Also nochmal die Zusammenfassung für den Einstieg:&lt;br /&gt;
&lt;br /&gt;
* Controllerboard&lt;br /&gt;
* [[AVR-ISP Programmierkabel]] mit 10-poligem Wannenstecker&lt;br /&gt;
* RS-232-Kabel (mit 3-poligem Adapter, wenn Board [[RN-Definitionen]] erfüllt)&lt;br /&gt;
* Netzgerät oder Akku (ideal 9 bis 12V, notfalls auch 7,2 bis 20V)&lt;br /&gt;
* [[Bascom]]-Compiler-Vollversion ist nur nötig, wenn man gleich größere Sachen anstrebt, ansonsten reicht das Demo, genauso wie ein [[Avr-gcc]]-Compiler. Bei RN-Boards sind diese Programme beim Board- oder Platinenkauf sowieso dabei, ansonsten kann man diese im Internet downloaden.&lt;br /&gt;
* Ein gutes Buch ist immer gut, siehe [[Buchvorstellungen]]&lt;br /&gt;
&lt;br /&gt;
==Autor==&lt;br /&gt;
*[[Benutzer:Frank|Frank]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Quellen===&lt;br /&gt;
* [[Abblockkondensator]] Artikel von Uwegw&lt;br /&gt;
* RN-Board Dokumentationen aus [[:Kategorie:Projekte]]&lt;br /&gt;
* diverse Datenblätter&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
*[[AVR-ISP Programmierkabel]]&lt;br /&gt;
*[[Mit welchem Controllerboard fang ich an]]&lt;br /&gt;
*[[Abblockkondensator]]&lt;br /&gt;
*[[Bascom]]&lt;br /&gt;
*[[Bascom - Erstes Programm in den AVR_Controller übertragen]]&lt;br /&gt;
*[[Avr]]&lt;br /&gt;
*[[Atmel Controller Mega16 und Mega32]]&lt;br /&gt;
*[[Spannungsregler]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Projekte]]&lt;/div&gt;</summary>
		<author><name>Ratzfatz</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=AVR-Einstieg_leicht_gemacht&amp;diff=14982</id>
		<title>AVR-Einstieg leicht gemacht</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=AVR-Einstieg_leicht_gemacht&amp;diff=14982"/>
				<updated>2009-06-11T13:07:58Z</updated>
		
		<summary type="html">&lt;p&gt;Ratzfatz: /* Wie bekommt man das Programm in den Controller? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:avr8.jpg|thumb|300px|Einen Controller zum Leben zu erwecken ist nicht schwer, manchmal reichen ein paar Teile! Beispiel mit Mega8]]&lt;br /&gt;
==Wir starten mit einem ATMega32== &lt;br /&gt;
Immer wieder gibt es in Foren, wie dem Roboternetz, Einsteiger, die das erstemal mit einem [[Microcontroller]] in Berührung kommen. Trotz zahlreicher Einstiegsbeiträge im Forum wiederholen sich doch bestimmte Anfängerfragen immer wieder, daher soll dieser Artikel noch einmal aufzeigen, wie man den ersten Schritt tut und einen Controller zum Leben erweckt. Es werden verschiedene Grundschaltungen aufgezeigt und erläutert, welche Bauteile welche Funktion besitzen.&lt;br /&gt;
Als Controller verwenden wir einen [[AVR]] [[ATMega32]], der derzeit größte [[AVR]]-Controller, welcher noch im bastlerfreundlichen DIP-Gehäuse verfügbar ist.  Für kleine bis mittlere Projekte ein sehr empfehlenswerter Controller, zumal er preislich mit ca. 6-7 Euro noch sehr günstig ist und zudem mit seinem 40-Pin-Gehäuse reichlich Anschlussmöglichkeiten besitzt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mega1632.gif|center]]&lt;br /&gt;
&lt;br /&gt;
Wie auf dem Bild zu sehen, verfügt auch der etwas günstigere ATMega16 über die gleiche Pinbelegung, daher könnten wir in diesem Tutorial auch diesen Typ verwenden. Der ATMega32 hat aber doppelt soviel Speicherplatz für Programmdaten (Flash), daher hat man für eine geringe Preisdifferenz doch mehr Möglichkeiten.&lt;br /&gt;
Wer noch 3 bis 4 Euro sparen will, dem sei der [[ATMega8]] oder [[ATMega168]] empfohlen, diese Typen sind sehr ähnlich, so dass das Tutorial weitgehend auch auf diese Typen bezogen werden kann. Allerdings haben diese Typen deutlich weniger Anschlussmöglichkeiten (28 Pin DIP Gehäuse). &lt;br /&gt;
&lt;br /&gt;
Die Frage, ob man mit einem fertigen Controllerboard, einer Experimentierplatine oder einem Steckbrett beginnen sollte, wurde ja in dem RN-Wissen Wiki Beitrag &amp;quot;[[Mit welchem Controllerboard fang ich an]]&amp;quot; angesprochen. In den meisten Fällen favorisiert der Autor dieses Artikels ein fertiges Controllerboard. Warum das so ist, dazu am Ende noch ein paar Anmerkungen. Dennoch soll diese Einführung schrittweise anhand eines Steckbrettes erläutert werden.&lt;br /&gt;
&lt;br /&gt;
==Start mit handelsüblichem Steckbrett==&lt;br /&gt;
Ein Steckbrett hat den Vorteil, dass man theoretisch ohne Löten alle Bauteile relativ zügig zusammenstecken kann. Bestimmte Steckkontakte innerhalb einer Reihe sind im Steckbrett miteinander verbunden, so dass man nachher pro Bauteilbeinchen noch einige Steckkontakte zum Verdrahten mit Schaltdraht oder speziell konfektionierter Litze verwenden kann.&lt;br /&gt;
&lt;br /&gt;
'''Die Vorteile eines Steckbretts:'''&lt;br /&gt;
&lt;br /&gt;
*Bauteile können ohne Löten eingesetzt und verdrahtet werden&lt;br /&gt;
*recht zügiger Schaltungsaufbau&lt;br /&gt;
*eine Schaltung kann leicht geändert oder korrigiert werden, defekte Teile sind leicht tauschbar&lt;br /&gt;
*ein Steckbrett kann auch für ganz andere Schaltungen verwendet werden&lt;br /&gt;
'''Die Nachteile eines Steckbretts gegenüber gedruckten Schaltungen und Experimentierplatinen sind:'''&lt;br /&gt;
&lt;br /&gt;
*nicht alle Bauteile passen, so dass wir doch noch etwas löten müssen&lt;br /&gt;
*nur geringer Schaltungsumfang möglich, da es schnell unübersichtlich wird&lt;br /&gt;
*sehr störanfällig wegen grosser Kabellängen, dadurch oft Funktionsstörungen&lt;br /&gt;
*Bauteile müssen zum Teil verbogen werden, damit sie passen&lt;br /&gt;
&lt;br /&gt;
Man beginnt, indem man den Controller AVR [[ATMega32]] auf das Board aufsetzt:&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrettmega32.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
==Die Grundschaltung==&lt;br /&gt;
Damit ein Controller erst mal zum Laufen kommt, benötigt man zumindest einen 10-k-Widerstand, einen 100-nF-Kondensator und eine 5V-Spannungsquelle. Das Ganze muss entsprechend dem unteren Schaltplan verschaltet werden, man spricht von einer sogenannten Grundschaltung. In dem Schaltplan wurde der Controller im Übrigen pinkompatibel als Schaltzeichen verwendet, die Pinreihenfolge ist also im Schaltplan identisch mit der echten Bauteilpin-Reihenfolge. Diese Darstellung erleichtert den Nachbau der Schaltung auf einem Steckbrett aber auch einer Experimentierplatine ungemein. Gewöhnlich verwendet man in Schaltplänen eine etwas andere Darstellung, bei der die Pins nach Funktionsgruppen geordnet sind. Bei solchen Schaltplänen muss man sich dann anhand der Pin-Nummern orientieren, man wird dies am Ende des Artikels noch bei dem IC MAX232 sehen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mega32.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn man schon einige Grundschaltungen in anderen Tutorials gesehen hat, dann wird man bemerken, dass unsere doch noch etwas einfacher ist und weniger Bauteile benötigt.  Hier wird beispielsweise kein Quarz verwendet, da der ATMega32 auch intern einen Takt generieren kann. Wer mit dem ADC genau messen will, sollte statt der Beschaltung im Bild, zwischen Vcc und AVcc eine Spule von 10uH und einen Kondensator von 100nF zwischen AVcc und GND schalten. Will man AVcc als Referenzspannung verwenden, muss noch ein 100nF Kondensator von ARef nach GND.&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht die obere Schaltung wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett1.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um den Controller in Betrieb zu nehmen, benötigt man bei dieser Schaltung ein Netzteil, das eine stabilisierte Spannung von 4 bis 5V liefert. Wir gehen erst einmal davon aus, dass man über dieses verfügt. &lt;br /&gt;
Erwähnenswert ist noch, dass der Kondensator als [[Abblockkondensator]] zur Unterdrückung von Störungen dient. Er muss so nah wie möglich an die Spannungszuführung am Controller selbst gesetzt werden. Ohne Kondensator enstehen erhebliche Störungen in der Versorgungsspannung, das Bild verdeutlicht es:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Abblockkondensator OhneC amAVR.jpg|center]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Der Widerstand in der Grundschaltung dient dazu, die Reset-Leitung konstant auf definiertem High-Pegel zu halten. Verbindet man diesen RESET-Pin später kurz mit GND (Masse), dann wird das Programm im Controller neu gestartet.&lt;br /&gt;
&lt;br /&gt;
==Woran merkt man, dass der Controller funktioniert?==&lt;br /&gt;
Gute Frage! Man merkt es garnicht. Genau genommen funktioniert ja auch trotz korrekter Schaltung noch immer nix, denn es muss zuerst ein Programm in den Controller geladen werden, damit er überhaupt weiss, was zu tun ist. Ohne Programm ist der Controller quasi tot.&lt;br /&gt;
&lt;br /&gt;
==Wie bekommt man das Programm in den Controller?==&lt;br /&gt;
Der Controller verfügt über eine sogenannte [[ISP]]-Schnittstelle. Das bedeutet, über bestimmte Pins ([[SPI]]) kann der Controller mit einer geeigneten PC-Software (zum Beispiel Bascom) programmiert werden. Zum Anschluss an den PC benötigt man jedoch einen sogenannten ISP-Dongle, auch Programmieradapter genannt. Hier gibt es verschiedene Lösungen, serielle und parallele Adapter. Original von Atmel oder kompatible Lösungen. Der am meisten verwendete ISP-Dongle wird am Druckerport betrieben. Diese gibt es inzwischen recht preiswert, sodass sich das Selbstbauen eigentlich nicht lohnt. Da man auch gern auf ein paar Fehlerquellen verzichten sollte, würde ich eine Fertiglösung empfehlen. Wer ihn selbst bauen möchte, findet ([[AVR-ISP_Programmierkabel|hier]] eine ISP-Dongle-Bauanleitung und sogar eine fertige Platine dafür  ([[AVR-ISP_Programmierkabel]]).&lt;br /&gt;
&lt;br /&gt;
Sowas sieht dann so aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Avrtutorial_ispkabel.jpeg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan eines solchen Programmierkabels:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:ispschaltplan.gif|center|thumb|400px|Schaltplan des ISP-Dongels nach unserem Wiki-Bauplan, mit SUB-D Buchse. Bitte beachten, dass das IC1 hier im Plan als verschiedene Blöcke (IC1A/IC1B) dargestellt wird. Dies dient nur zur Übersicht, es handelt sich nur um ein IC, einfach auf die Pinnummern achten. Zum vergrößern anklicken.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Problem ist nun, wie schließe ich einen handelsüblichen ISP-Programmieradapter an den Controller auf dem Steckbrett an. Der normale 10-polige Wannenstecker (nach [[RN-Definitionen]]) passt nicht in ein Steckbrett. Das ist wieder so ein typischer Nachteil bei Steckbrettern! In unserem Beispiel haben wir dazu auf einem kleinen Stück Experimentierplatine einen steckbaren Adapter für das Steckboard gelötet.&lt;br /&gt;
Somit kann man die Schaltung um einen üblichen 10-poligen ISP-Programmieranschluss ergänzen:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mitisp.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
Ein noch einfacheres Programmierkabel ist auf der Seite http://thomaspfeifer.net/ beschrieben.&lt;br /&gt;
Dort findet man unter &amp;quot;AVR-Projekte&amp;quot; den Artikel &amp;quot;Ein einfaches Programmierkabel für Atmel-AVR Mikrocontroller&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Im Bascom stellt man, um mit diesen einfachen Programmierkabeln zu arbeiten folgendes ein:&lt;br /&gt;
Unter &amp;quot;Options/Programmer&amp;quot; wird &amp;quot;STK200/STK300 Programmer&amp;quot; eingestellt, wenn es nicht schon so da steht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht das gleiche so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_mitisp.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jetzt endlich ist es soweit, jetzt kann man den Controller über einen ISP-Programmieradapter mit dem PC verbinden. Aber unbedingt darauf achten, dass auch alles korrekt nach Schaltplan gesteckt wurde und dass die Betriebsspannung 5V nicht übersteigt. Ansonsten könnte man sich Dongle oder sogar die PC-Schnittstelle beschädigen.&lt;br /&gt;
Als Entwicklungsumgebung nutzen wir hier im Tutorial [[Bascom]]. [[Bascom]] ist ein sehr beliebter Basic-[[Compiler]], der zahlreiche [[AVR]] Controllertypen programmieren kann. Da auch ein [[Terminalprogramm]] und ein Programmer integriert ist, enthält diese PC-Software alles, was man braucht, das erleichtert den Einstieg zusätzlich. Die Software gibts kostenlos als Demo bis 4K Code, für unsere Beispiele und den Einstieg reicht das allemal, siehe dazu Artikel Bascom.&lt;br /&gt;
Wie man ein Programm schreibt, kompiliert und überträgt, wurde schon in diesem Beitrag [[Bascom - Erstes Programm in den AVR Controller übertragen]] ausführlich behandelt, wir ersparen uns deshalb diese Details. &lt;br /&gt;
&lt;br /&gt;
Als erstes kompilieren und übertragen wir folgendes Programm:&lt;br /&gt;
Das Kompilieren geht in BASCOM mit der Taste F7 oder dem entsprechenden ICON.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step1.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Programm macht eigentlich nichts, außer dass es eine Endlosschleife ausführt. Aber da wir noch überhaupt nix am Controller angeschlossen haben, können wir eh noch nicht sehen, ob ein Programm nun richtig ausgeführt wird oder nicht.&lt;br /&gt;
Allerdings können wir schonmal üben, das Programm mit Bascom zu übertragen. Wenn wir alles richtig aufgebaut haben und Spannung anliegt, dann sollte automatisch der Controller in Bascom erkannt werden. Die Übertragung sollte dann ohne Fehlermeldung erfolgen können. Wenn wir das geschafft haben, geht’s weiter.&lt;br /&gt;
&lt;br /&gt;
==Läuft die Schaltung und das Programm?==&lt;br /&gt;
Damit wir nun endlich sehen, ob sich bei unserer Schaltung auch was tut, schließen wir eine LED über einen 1K-Vorwiderstand an einen Port an. Da wir die Kathode an den Controllerpin und die Anode an Plus legen, leuchtet die LED immer dann, wenn dieser Pin auf Low geschaltet wird.&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mitled.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht's nun so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_mitled.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Damit man nun auch wirklich sieht, ob das Programm läuft, schreiben wir ein kleines Basic-Programm, welches eine LED abwechselnd ein– und ausschaltet. Wir kompilieren und übertragen also folgendes Programm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step2.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
&lt;br /&gt;
Config Portc.0 = Output       'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C)&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
  Portc.0 = 1                 'Pin wird auf High, also 5V geschaltet&lt;br /&gt;
  Waitms 100&lt;br /&gt;
  Portc.0 = 0                 'Pin wird auf Low, also 0V geschaltet&lt;br /&gt;
  Waitms 100&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn die LED nun schnell blinkt, dann funktioniert die aufgebaute Schaltung perfekt. Wir haben gleichzeitig gelernt, wie man einen Ausgangsport, also Controllerpin, ein- und ausschalten kann. Nahezu alle Pins beim ATMega32 können auf diese Weise als Ausgangsport betrieben werden. Somit lassen sich nicht nur viele Leds, sondern unter Zuhilfenahme eines Treibers (z.B. Transistors) auch Relais und andere Aktoren schalten.&lt;br /&gt;
&lt;br /&gt;
==Eingangsport fragt Taster ab==&lt;br /&gt;
Nun erweitern wir die Schaltung noch um einen Taster. Nahezu jedes Port kann bei einem ATMega32 auch per Software als Eingangsport konfiguriert werden. Wir schließen z.B. einen Taster an Port-Pin PA7 an. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mittaster.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Port wird in der Software so konfiguriert, dass es als Eingang arbeitet und intern über einen hohen Widerstand  (Pullup-Widerstand) ständig auf High-Pegel gelegt wird. Wird nun eine Taste gedrückt, so wird der Pegel auf Low gezogen.&lt;br /&gt;
Das Beispielprogramm ist nun so gestaltet, dass bei gedrückter Taste die LED leuchtet und beim Loslassen wieder ausgeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step3.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
&lt;br /&gt;
Config Portc.0 = Output        'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C)&lt;br /&gt;
&lt;br /&gt;
Config Pina.7 = Input          'Ein Pin (PA0) wird als Eingang definiert&lt;br /&gt;
Porta.7 = 1                    'Interner Pullup Widerstand ein&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
  If Pina.7 = 1 Then&lt;br /&gt;
    Portc.0 = 1                'Pin wird auf High, also 5V geschaltet&lt;br /&gt;
  Else&lt;br /&gt;
    Portc.0 = 0                'Pin wird auf Low, also 0V geschaltet&lt;br /&gt;
  End If&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Grundschaltung mit Quarz==&lt;br /&gt;
Obwohl wir ab der letzten Schaltung schon einiges mit dem Controller anfangen können, so fehlt doch noch etwas Wichtiges. Oft ist es nämlich notwendig, dass ein Controller sehr genaue Frequenzen mißt oder ganz genaue Taktraten ausgeben kann. Leider ist der interne Taktgenerator nicht 100% exakt, was bei manchen Anwendungen störend ist. Zum Beispiel können über die RS232-Schnittstelle Daten nicht immer ganz fehlerfrei übertragen werden, wenn die Taktfrequenz nicht genau stimmt. Daher wird in den meisten Anwendungsfällen ein Quarz zur Takterzeugung genutzt, Sie kennen das sicher aus anderen Grundschaltungen. Also erweitern wir unsere Schaltung gleich noch um einen Quarz mit den zugehörigen 22pF-Kondensatoren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mitquarz.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf unserem Steckbrett wird's langsam voller, hier sieht's also inzwischen so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_mitquarz.jpg|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Normalerweise sollte der Quarz genauso wie die beiden 22pF-Kondensatoren, die zum Anschwingen des Quarzes dienen, möglichst nahe am Controller platziert werden. Auf dem Steckbrett ist das manchmal gar nicht so einfach, insbesondere wenn man wie in diesem Fall den Quarz erst später hinzufügt. Wichtig ist nämlich, dass die Leitungen vom Quarz zum Controller möglichst kurz sind, bei gedruckten Schaltungen oft nur 1 bis 2 cm! Auch die einzelnen Bauteilbeinchen, z.B. der Kondensatoren, sollten normalerweise so kurz wie möglich sein.&lt;br /&gt;
Ist dies nicht der Fall, wie auch in unserem Bild, dann fungieren diese Leitungen fast wie eine Funkantenne. Dies führt in der Regel zu starken Hochfrequenzsignalen, die nicht nur unsere Schaltung, sondern auch andere Schaltungen in der Nähe stören könnten. Man merkt dies auch oft daran, dass sich ein Board bei höherer Quarzfrequenz immer seltener fehlerfrei ohne Übertragungsfehler programmieren läßt.&lt;br /&gt;
Grundsätzlich sind daher Schaltungen mit Quarz auf einem Steckbrett nicht sonderlich zu empfehlen, die Betriebssicherheit ist nicht immer gegeben. &lt;br /&gt;
&lt;br /&gt;
Auch wenn nun ein Quarz angeschlossen ist, so wird er noch immer nicht genutzt. Noch immer arbeitet der [[ATMega32]] mit seiner intern voreingestellten 1 Mhz Taktfrequenz. Um dies umzustellen, muss man ein sogenanntes [[Fusebits|Fusebit]] im Controller umprogrammieren. Auch dies wurde schon im Beitrag [[Bascom - Erstes Programm in den AVR_Controller übertragen]] näher beschrieben. Hier sei daher nur nochmals gesagt, dass dies auch sehr bequem in [[Bascom]] erfolgt:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_bascomfusebitquarz.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sobald wir das umgestellt haben, müssen wir auch in dem Programm die Anweisung &lt;br /&gt;
&lt;br /&gt;
 $crystal = 1000000 &lt;br /&gt;
&lt;br /&gt;
durch &lt;br /&gt;
&lt;br /&gt;
 $crystal = 16000000 &lt;br /&gt;
&lt;br /&gt;
ersetzen, denn unser Quarz taktet nun mit 16 MHz.&lt;br /&gt;
&lt;br /&gt;
==Spannung stabilisieren==&lt;br /&gt;
Auch wenn unsere Basis-Schaltung für Experimente inzwischen schon ganz nett ist, so ist es doch etwas ungünstig, dass wir stets 5V zur Verfügung haben müssen. Nicht immer steht ein geeignetes Netzteil zur Verfügung, zudem soll ein Controller auch oft mit Batterien versorgt werden. Aus diesem Grund verfügen fast alle Entwicklungsboards wie ([[RN-Control]], STK500 etc.) über einen [[Spannungsregler]].&lt;br /&gt;
[[Bild:78s05.jpg|thumb|Spannungsregler 78S05]] Dieser wandelt eine höhere Eingangsspannung (ca. 7 bis 20 V) immer genau in  5V  um. Sowas erhöht die Betriebssicherheit einer Schaltung nochmals immens. Als [[Spannungsregler]] (IC2) wird oft der 7805 genutzt, empfehlenswert ist der Typ 78S05, welcher 2A verträgt sowie über einen Kurzschluss- und Überlastungsschutz verfügt. &lt;br /&gt;
Die beiden 100nF-Kondensatoren sind wichtig, sie sollen HF-Störungen und Schwingungen vermeiden. Der Elko vor dem Spannungsregler ist vor allem dann wichtig, wenn die Spannung von einem Netzgerät kommt und noch etwas geglättet werden muss. Je höher der Strombedarf der Schaltung, desto größer kann man die Kapazität wählen. Es schadet nicht, wenn man den Elko einige Nummern größer wählt, man ist dann quasi für alle Fälle gerüstet. So sind Werte zwischen 100 uF und 2200 uF durchaus denkbar. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wir erweitern unsere Schaltung somit wie folgt:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_spannung.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht's wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_spannung.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
==Daten und Texte zum PC übertragen==&lt;br /&gt;
In vielen Programmen müssen Daten oder Texte vom Controller an den PC oder umgekehrt gesendet werden. Insbesondere bei komplexen Programmen kann man auf diese Weise Variableninhalte ausgeben und somit auch Fehler im Programmcode schneller finden und korrigieren. In der Regel ist das ganz einfach, denn der [[Microcontroller]] [[ATMega32]] verfügt über einen internen [[UART]], also ein Modul, das Daten über die [[RS232]]-Schnittstelle zum PC senden bzw. auch von ihm empfangen kann. Leider arbeitet jedoch die Controllerschnittstelle mit 5V und die PC-Schnittstelle der Norm entsprechend mit +-12V. Daher muss unbedingt ein Schaltkreis dazwischen, welcher die Pegel anpasst. Gewöhnlich nimmt man hier das IC MAX232(CPE), welches inzwischen sehr preiswert erhältlich ist.&lt;br /&gt;
&lt;br /&gt;
Wir müssen also die Schaltung nochmals erweitern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_max232.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das IC Max232 ist im Schaltplan in der üblichen funktionsorientierten Darstellung gezeichnet. Zur besseren Übersichtlichkeit wurden die immer benötigten Anschlüsse für VCC (Pin 16) und GND (Pin 15) getrennt oben rechts im Schaltplan dargestellt. Also nicht vergessen !!&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht's so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_max232.jpg|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Über eine dreipolige Stiftleiste ([[RN-Definitionen]]) wird nun das Steckboard mit der [[RS232]]-Schnittstelle des PC verbunden. Es ist nun ein Leichtes, mit einem Programm Daten zum PC zu senden. Das nachfolgende Programm gibt Hinweise mit der Anweisung '''PRINT''' aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step5.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 16000000&lt;br /&gt;
$baud = 9600&lt;br /&gt;
&lt;br /&gt;
Config Portc.0 = Output              'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C)&lt;br /&gt;
&lt;br /&gt;
Config Pina.7 = Input                'Ein Pin (PA0) wird als Eingang definiert&lt;br /&gt;
Porta.7 = 1                          'Interner Pullup Widerstand ein&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
  If Pina.7 = 1 Then&lt;br /&gt;
    Portc.0 = 1                      'Pin wird auf High, also 5V geschaltet&lt;br /&gt;
    Print &amp;quot;Schalter nicht gedrückt&amp;quot;&lt;br /&gt;
  Else&lt;br /&gt;
    Portc.0 = 0                      'Pin wird auf Low, also 0V geschaltet&lt;br /&gt;
    Print &amp;quot;Schalter gedrückt&amp;quot;&lt;br /&gt;
  End If&lt;br /&gt;
  Wait 1&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Möglichkeiten des Steckbrettes erreicht==&lt;br /&gt;
Inzwischen füllt der Schaltplan fast ein DIN-A4-Blatt und auf dem Steckbrett sieht's auch schon recht wirr aus, dabei haben wir nur die wichtigsten Grundelemente auf dem Steckbrett. Für eine Roboter-Steuerung oder andere Anwendung fehlt doch noch einiges. Zum Beispiel weitere Taster, weitere LEDs, Motortreiber, damit der Controller auch Motoren ansteuern kann und ein [[I2C]]-Bus-Anschluss.&lt;br /&gt;
Dies alles noch auf einem Steckbrett zu realisieren macht wenig Sinn, zumal bereits jetzt schon durch die doch recht langen Leitungen/Verkabelungen erhebliche Störungen auftreten. In der letzten Phase ist es immer öfters zu Übertragungsfehlern beim Programmieren gekommen, oft musste dies 20mal wiederholt werden. Dies zeigt, dass ein Steckbrett bestenfalls für ganz kleine Controller-Experimente herhalten kann. Für größere Dinge sollte man dann doch zu einer Lösung auf einer gedruckten Platine greifen. Spezielle Experimentierboards  bieten mehr Sicherheit und haben neben den Grundelementen, die hier beschrieben wurden, noch eine ganze Menge mehr drauf. Bei [[RN-Control]] zum Beispiel 5 Tasten, 8 Leds, Motortreiber, Lautsprecher, diverse Anschlüsse etc. &lt;br /&gt;
Der Größenunterschied wird im Bild deutlich:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_rncontrol.jpg|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auch wenn das Steckbrett also kein Controllerboard ersetzen kann, so hat das kleine Tutorial doch gezeigt, wie eine [[Avr]]-Schaltung aufzubauen ist. Dieses Wissen sollte man auch besitzen, wenn man ein Controllerboard nutzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Was braucht man, wenn man mit einem Controllerboard den Einstieg startet?==&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_ispkabel.jpg|thumb|ISP-Programmierkabel]]Neben dem eigentlichen Board braucht man, wie schon zuvor angesprochen, ein [[AVR-ISP Programmierkabel]]. Da das Selbstbauen kaum billiger ist, ist zu empfehlen, ein solches fertig mitzubestellen. Am preiswertesten und zugleich vielseitigsten sind die ISP-Adapter, die man an das Druckerport anschließt (siehe Bild). Es gibt aber auch USB-Lösungen, wobei diese jedoch oft teuer sind und auch oft weniger Controller programmieren können. Hat man jedoch einen PC oder Notebook ohne parellelen Druckeranschluss, so muss man wohl oder übel in den meisten Fällen zu einem seriellen oder USB-Programmieradapter greifen. Neben den erwähnten Nachteilen hat der USB Dongle aber oft auch den Vorteil, dass er etwas schneller ist. Dieser Unterschied macht sich aber nur bei sehr großen Programmen und Controllern wirklich bemerkbar.&lt;br /&gt;
&lt;br /&gt;
Als zweites braucht man natürlich eine Stromversorgung. Ideal sind Gleichspannungsnetzgeräte, die zwischen 9 und 12V liefern, vorausgesetzt, das Board hat einen Spannungsregler wie in der Regel die RN-Boards. Man kann hier ein normales Steckernetzteil oder ein komfortables Labornetzteil nehmen. Um etwas Reserve zu haben, wäre es gut, wenn das Netzteil mindestens 1 A liefern kann. Alternativ kann man auch Akkupacks oder Batterien nutzen, allerdings mindestens 7,2V sollten die schon liefern können, sicherer sind 8,4-, 9,6- oder 12V-Akkus.&lt;br /&gt;
Das wäre eigentlich schon das Wichtigste, um ein Board in Betrieb zu nehmen und Experimente zu machen. &lt;br /&gt;
&lt;br /&gt;
Allerdings, ein RS232-Kabel ist ebenfalls noch sehr empfehlenswert. Dieses erlaubt die Ausgabe von Texten und Variablen auf den PC, wir haben es ja oben im Steckbrettbeispiel schon gesehen. Dazu wird auf dem PC ein [[Terminalprogramm]] gestartet und über die [[RS232]] Schnittstelle mit dem PC verbunden. Bei manchen Boards ist sowieso ein RS232 Kabel unerläßlich, wie z.B. RN-Motor, RN-Speak etc. Nützlich ist es aber überall. Man kann ein solches Kabel selbst bauen oder gleich beim Kauf eines Boardes mitbestellen.&lt;br /&gt;
&lt;br /&gt;
Also nochmal die Zusammenfassung für den Einstieg:&lt;br /&gt;
&lt;br /&gt;
* Controllerboard&lt;br /&gt;
* [[AVR-ISP Programmierkabel]] mit 10-poligem Wannenstecker&lt;br /&gt;
* RS-232-Kabel (mit 3-poligem Adapter, wenn Board [[RN-Definitionen]] erfüllt)&lt;br /&gt;
* Netzgerät oder Akku (ideal 9 bis 12V, notfalls auch 7,2 bis 20V)&lt;br /&gt;
* [[Bascom]]-Compiler-Vollversion ist nur nötig, wenn man gleich größere Sachen anstrebt, ansonsten reicht das Demo, genauso wie ein [[Avr-gcc]]-Compiler. Bei RN-Boards sind diese Programme beim Board- oder Platinenkauf sowieso dabei, ansonsten kann man diese im Internet downloaden.&lt;br /&gt;
* Ein gutes Buch ist immer gut, siehe [[Buchvorstellungen]]&lt;br /&gt;
&lt;br /&gt;
==Autor==&lt;br /&gt;
*[[Benutzer:Frank|Frank]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Quellen===&lt;br /&gt;
* [[Abblockkondensator]] Artikel von Uwegw&lt;br /&gt;
* RN-Board Dokumentationen aus [[:Kategorie:Projekte]]&lt;br /&gt;
* diverse Datenblätter&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
*[[AVR-ISP Programmierkabel]]&lt;br /&gt;
*[[Mit welchem Controllerboard fang ich an]]&lt;br /&gt;
*[[Abblockkondensator]]&lt;br /&gt;
*[[Bascom]]&lt;br /&gt;
*[[Bascom - Erstes Programm in den AVR_Controller übertragen]]&lt;br /&gt;
*[[Avr]]&lt;br /&gt;
*[[Atmel Controller Mega16 und Mega32]]&lt;br /&gt;
*[[Spannungsregler]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Projekte]]&lt;/div&gt;</summary>
		<author><name>Ratzfatz</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=AVR-Einstieg_leicht_gemacht&amp;diff=14981</id>
		<title>AVR-Einstieg leicht gemacht</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=AVR-Einstieg_leicht_gemacht&amp;diff=14981"/>
				<updated>2009-06-11T12:48:49Z</updated>
		
		<summary type="html">&lt;p&gt;Ratzfatz: /* Wie bekommt man das Programm in den Controller? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:avr8.jpg|thumb|300px|Einen Controller zum Leben zu erwecken ist nicht schwer, manchmal reichen ein paar Teile! Beispiel mit Mega8]]&lt;br /&gt;
==Wir starten mit einem ATMega32== &lt;br /&gt;
Immer wieder gibt es in Foren, wie dem Roboternetz, Einsteiger, die das erstemal mit einem [[Microcontroller]] in Berührung kommen. Trotz zahlreicher Einstiegsbeiträge im Forum wiederholen sich doch bestimmte Anfängerfragen immer wieder, daher soll dieser Artikel noch einmal aufzeigen, wie man den ersten Schritt tut und einen Controller zum Leben erweckt. Es werden verschiedene Grundschaltungen aufgezeigt und erläutert, welche Bauteile welche Funktion besitzen.&lt;br /&gt;
Als Controller verwenden wir einen [[AVR]] [[ATMega32]], der derzeit größte [[AVR]]-Controller, welcher noch im bastlerfreundlichen DIP-Gehäuse verfügbar ist.  Für kleine bis mittlere Projekte ein sehr empfehlenswerter Controller, zumal er preislich mit ca. 6-7 Euro noch sehr günstig ist und zudem mit seinem 40-Pin-Gehäuse reichlich Anschlussmöglichkeiten besitzt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mega1632.gif|center]]&lt;br /&gt;
&lt;br /&gt;
Wie auf dem Bild zu sehen, verfügt auch der etwas günstigere ATMega16 über die gleiche Pinbelegung, daher könnten wir in diesem Tutorial auch diesen Typ verwenden. Der ATMega32 hat aber doppelt soviel Speicherplatz für Programmdaten (Flash), daher hat man für eine geringe Preisdifferenz doch mehr Möglichkeiten.&lt;br /&gt;
Wer noch 3 bis 4 Euro sparen will, dem sei der [[ATMega8]] oder [[ATMega168]] empfohlen, diese Typen sind sehr ähnlich, so dass das Tutorial weitgehend auch auf diese Typen bezogen werden kann. Allerdings haben diese Typen deutlich weniger Anschlussmöglichkeiten (28 Pin DIP Gehäuse). &lt;br /&gt;
&lt;br /&gt;
Die Frage, ob man mit einem fertigen Controllerboard, einer Experimentierplatine oder einem Steckbrett beginnen sollte, wurde ja in dem RN-Wissen Wiki Beitrag &amp;quot;[[Mit welchem Controllerboard fang ich an]]&amp;quot; angesprochen. In den meisten Fällen favorisiert der Autor dieses Artikels ein fertiges Controllerboard. Warum das so ist, dazu am Ende noch ein paar Anmerkungen. Dennoch soll diese Einführung schrittweise anhand eines Steckbrettes erläutert werden.&lt;br /&gt;
&lt;br /&gt;
==Start mit handelsüblichem Steckbrett==&lt;br /&gt;
Ein Steckbrett hat den Vorteil, dass man theoretisch ohne Löten alle Bauteile relativ zügig zusammenstecken kann. Bestimmte Steckkontakte innerhalb einer Reihe sind im Steckbrett miteinander verbunden, so dass man nachher pro Bauteilbeinchen noch einige Steckkontakte zum Verdrahten mit Schaltdraht oder speziell konfektionierter Litze verwenden kann.&lt;br /&gt;
&lt;br /&gt;
'''Die Vorteile eines Steckbretts:'''&lt;br /&gt;
&lt;br /&gt;
*Bauteile können ohne Löten eingesetzt und verdrahtet werden&lt;br /&gt;
*recht zügiger Schaltungsaufbau&lt;br /&gt;
*eine Schaltung kann leicht geändert oder korrigiert werden, defekte Teile sind leicht tauschbar&lt;br /&gt;
*ein Steckbrett kann auch für ganz andere Schaltungen verwendet werden&lt;br /&gt;
'''Die Nachteile eines Steckbretts gegenüber gedruckten Schaltungen und Experimentierplatinen sind:'''&lt;br /&gt;
&lt;br /&gt;
*nicht alle Bauteile passen, so dass wir doch noch etwas löten müssen&lt;br /&gt;
*nur geringer Schaltungsumfang möglich, da es schnell unübersichtlich wird&lt;br /&gt;
*sehr störanfällig wegen grosser Kabellängen, dadurch oft Funktionsstörungen&lt;br /&gt;
*Bauteile müssen zum Teil verbogen werden, damit sie passen&lt;br /&gt;
&lt;br /&gt;
Man beginnt, indem man den Controller AVR [[ATMega32]] auf das Board aufsetzt:&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrettmega32.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
==Die Grundschaltung==&lt;br /&gt;
Damit ein Controller erst mal zum Laufen kommt, benötigt man zumindest einen 10-k-Widerstand, einen 100-nF-Kondensator und eine 5V-Spannungsquelle. Das Ganze muss entsprechend dem unteren Schaltplan verschaltet werden, man spricht von einer sogenannten Grundschaltung. In dem Schaltplan wurde der Controller im Übrigen pinkompatibel als Schaltzeichen verwendet, die Pinreihenfolge ist also im Schaltplan identisch mit der echten Bauteilpin-Reihenfolge. Diese Darstellung erleichtert den Nachbau der Schaltung auf einem Steckbrett aber auch einer Experimentierplatine ungemein. Gewöhnlich verwendet man in Schaltplänen eine etwas andere Darstellung, bei der die Pins nach Funktionsgruppen geordnet sind. Bei solchen Schaltplänen muss man sich dann anhand der Pin-Nummern orientieren, man wird dies am Ende des Artikels noch bei dem IC MAX232 sehen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mega32.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn man schon einige Grundschaltungen in anderen Tutorials gesehen hat, dann wird man bemerken, dass unsere doch noch etwas einfacher ist und weniger Bauteile benötigt.  Hier wird beispielsweise kein Quarz verwendet, da der ATMega32 auch intern einen Takt generieren kann. Wer mit dem ADC genau messen will, sollte statt der Beschaltung im Bild, zwischen Vcc und AVcc eine Spule von 10uH und einen Kondensator von 100nF zwischen AVcc und GND schalten. Will man AVcc als Referenzspannung verwenden, muss noch ein 100nF Kondensator von ARef nach GND.&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht die obere Schaltung wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett1.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um den Controller in Betrieb zu nehmen, benötigt man bei dieser Schaltung ein Netzteil, das eine stabilisierte Spannung von 4 bis 5V liefert. Wir gehen erst einmal davon aus, dass man über dieses verfügt. &lt;br /&gt;
Erwähnenswert ist noch, dass der Kondensator als [[Abblockkondensator]] zur Unterdrückung von Störungen dient. Er muss so nah wie möglich an die Spannungszuführung am Controller selbst gesetzt werden. Ohne Kondensator enstehen erhebliche Störungen in der Versorgungsspannung, das Bild verdeutlicht es:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Abblockkondensator OhneC amAVR.jpg|center]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Der Widerstand in der Grundschaltung dient dazu, die Reset-Leitung konstant auf definiertem High-Pegel zu halten. Verbindet man diesen RESET-Pin später kurz mit GND (Masse), dann wird das Programm im Controller neu gestartet.&lt;br /&gt;
&lt;br /&gt;
==Woran merkt man, dass der Controller funktioniert?==&lt;br /&gt;
Gute Frage! Man merkt es garnicht. Genau genommen funktioniert ja auch trotz korrekter Schaltung noch immer nix, denn es muss zuerst ein Programm in den Controller geladen werden, damit er überhaupt weiss, was zu tun ist. Ohne Programm ist der Controller quasi tot.&lt;br /&gt;
&lt;br /&gt;
==Wie bekommt man das Programm in den Controller?==&lt;br /&gt;
Der Controller verfügt über eine sogenannte [[ISP]]-Schnittstelle. Das bedeutet, über bestimmte Pins ([[SPI]]) kann der Controller mit einer geeigneten PC-Software (zum Beispiel Bascom) programmiert werden. Zum Anschluss an den PC benötigt man jedoch einen sogenannten ISP-Dongle, auch Programmieradapter genannt. Hier gibt es verschiedene Lösungen, serielle und parallele Adapter. Original von Atmel oder kompatible Lösungen. Der am meisten verwendete ISP-Dongle wird am Druckerport betrieben. Diese gibt es inzwischen recht preiswert, sodass sich das Selbstbauen eigentlich nicht lohnt. Da man auch gern auf ein paar Fehlerquellen verzichten sollte, würde ich eine Fertiglösung empfehlen. Wer ihn selbst bauen möchte, findet ([[AVR-ISP_Programmierkabel|hier]] eine ISP-Dongle-Bauanleitung und sogar eine fertige Platine dafür  ([[AVR-ISP_Programmierkabel]]).&lt;br /&gt;
&lt;br /&gt;
Sowas sieht dann so aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Avrtutorial_ispkabel.jpeg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan eines solchen Programmierkabels:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:ispschaltplan.gif|center|thumb|400px|Schaltplan des ISP-Dongels nach unserem Wiki-Bauplan, mit SUB-D Buchse. Bitte beachten, dass das IC1 hier im Plan als verschiedene Blöcke (IC1A/IC1B) dargestellt wird. Dies dient nur zur Übersicht, es handelt sich nur um ein IC, einfach auf die Pinnummern achten. Zum vergrößern anklicken.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Problem ist nun, wie schließe ich einen handelsüblichen ISP-Programmieradapter an den Controller auf dem Steckbrett an. Der normale 10-polige Wannenstecker (nach [[RN-Definitionen]]) passt nicht in ein Steckbrett. Das ist wieder so ein typischer Nachteil bei Steckbrettern! In unserem Beispiel haben wir dazu auf einem kleinen Stück Experimentierplatine einen steckbaren Adapter für das Steckboard gelötet.&lt;br /&gt;
Somit kann man die Schaltung um einen üblichen 10-poligen ISP-Programmieranschluss ergänzen:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mitisp.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
Ein noch einfacheres Programmierkabel ist auf der Seite http://thomaspfeifer.net/ beschrieben.&lt;br /&gt;
Dort findet man unter &amp;quot;AVR-Projekte&amp;quot; den Artikel &amp;quot;Ein einfaches Programmierkabel für Atmel-AVR Mikrocontroller&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Im Bascom stellt man, um mit diesen einfachen Programmierkabeln zu arbeiten folgendes ein:&lt;br /&gt;
Unter &amp;quot;Options/Programmer&amp;quot; wird &amp;quot;Sample Electronics Programmer&amp;quot; eingestellt, wenn es nicht schon so da steht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht das gleiche so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_mitisp.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jetzt endlich ist es soweit, jetzt kann man den Controller über einen ISP-Programmieradapter mit dem PC verbinden. Aber unbedingt darauf achten, dass auch alles korrekt nach Schaltplan gesteckt wurde und dass die Betriebsspannung 5V nicht übersteigt. Ansonsten könnte man sich Dongle oder sogar die PC-Schnittstelle beschädigen.&lt;br /&gt;
Als Entwicklungsumgebung nutzen wir hier im Tutorial [[Bascom]]. [[Bascom]] ist ein sehr beliebter Basic-[[Compiler]], der zahlreiche [[AVR]] Controllertypen programmieren kann. Da auch ein [[Terminalprogramm]] und ein Programmer integriert ist, enthält diese PC-Software alles, was man braucht, das erleichtert den Einstieg zusätzlich. Die Software gibts kostenlos als Demo bis 4K Code, für unsere Beispiele und den Einstieg reicht das allemal, siehe dazu Artikel Bascom.&lt;br /&gt;
Wie man ein Programm schreibt, kompiliert und überträgt, wurde schon in diesem Beitrag [[Bascom - Erstes Programm in den AVR Controller übertragen]] ausführlich behandelt, wir ersparen uns deshalb diese Details. &lt;br /&gt;
&lt;br /&gt;
Als erstes kompilieren und übertragen wir folgendes Programm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step1.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Programm macht eigentlich nichts, außer dass es eine Endlosschleife ausführt. Aber da wir noch überhaupt nix am Controller angeschlossen haben, können wir eh noch nicht sehen, ob ein Programm nun richtig ausgeführt wird oder nicht.&lt;br /&gt;
Allerdings können wir schonmal üben, das Programm mit Bascom zu übertragen. Wenn wir alles richtig aufgebaut haben und Spannung anliegt, dann sollte automatisch der Controller in Bascom erkannt werden. Die Übertragung sollte dann ohne Fehlermeldung erfolgen können. Wenn wir das geschafft haben, geht’s weiter.&lt;br /&gt;
&lt;br /&gt;
==Läuft die Schaltung und das Programm?==&lt;br /&gt;
Damit wir nun endlich sehen, ob sich bei unserer Schaltung auch was tut, schließen wir eine LED über einen 1K-Vorwiderstand an einen Port an. Da wir die Kathode an den Controllerpin und die Anode an Plus legen, leuchtet die LED immer dann, wenn dieser Pin auf Low geschaltet wird.&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mitled.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht's nun so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_mitled.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Damit man nun auch wirklich sieht, ob das Programm läuft, schreiben wir ein kleines Basic-Programm, welches eine LED abwechselnd ein– und ausschaltet. Wir kompilieren und übertragen also folgendes Programm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step2.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
&lt;br /&gt;
Config Portc.0 = Output       'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C)&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
  Portc.0 = 1                 'Pin wird auf High, also 5V geschaltet&lt;br /&gt;
  Waitms 100&lt;br /&gt;
  Portc.0 = 0                 'Pin wird auf Low, also 0V geschaltet&lt;br /&gt;
  Waitms 100&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn die LED nun schnell blinkt, dann funktioniert die aufgebaute Schaltung perfekt. Wir haben gleichzeitig gelernt, wie man einen Ausgangsport, also Controllerpin, ein- und ausschalten kann. Nahezu alle Pins beim ATMega32 können auf diese Weise als Ausgangsport betrieben werden. Somit lassen sich nicht nur viele Leds, sondern unter Zuhilfenahme eines Treibers (z.B. Transistors) auch Relais und andere Aktoren schalten.&lt;br /&gt;
&lt;br /&gt;
==Eingangsport fragt Taster ab==&lt;br /&gt;
Nun erweitern wir die Schaltung noch um einen Taster. Nahezu jedes Port kann bei einem ATMega32 auch per Software als Eingangsport konfiguriert werden. Wir schließen z.B. einen Taster an Port-Pin PA7 an. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mittaster.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Port wird in der Software so konfiguriert, dass es als Eingang arbeitet und intern über einen hohen Widerstand  (Pullup-Widerstand) ständig auf High-Pegel gelegt wird. Wird nun eine Taste gedrückt, so wird der Pegel auf Low gezogen.&lt;br /&gt;
Das Beispielprogramm ist nun so gestaltet, dass bei gedrückter Taste die LED leuchtet und beim Loslassen wieder ausgeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step3.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
&lt;br /&gt;
Config Portc.0 = Output        'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C)&lt;br /&gt;
&lt;br /&gt;
Config Pina.7 = Input          'Ein Pin (PA0) wird als Eingang definiert&lt;br /&gt;
Porta.7 = 1                    'Interner Pullup Widerstand ein&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
  If Pina.7 = 1 Then&lt;br /&gt;
    Portc.0 = 1                'Pin wird auf High, also 5V geschaltet&lt;br /&gt;
  Else&lt;br /&gt;
    Portc.0 = 0                'Pin wird auf Low, also 0V geschaltet&lt;br /&gt;
  End If&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Grundschaltung mit Quarz==&lt;br /&gt;
Obwohl wir ab der letzten Schaltung schon einiges mit dem Controller anfangen können, so fehlt doch noch etwas Wichtiges. Oft ist es nämlich notwendig, dass ein Controller sehr genaue Frequenzen mißt oder ganz genaue Taktraten ausgeben kann. Leider ist der interne Taktgenerator nicht 100% exakt, was bei manchen Anwendungen störend ist. Zum Beispiel können über die RS232-Schnittstelle Daten nicht immer ganz fehlerfrei übertragen werden, wenn die Taktfrequenz nicht genau stimmt. Daher wird in den meisten Anwendungsfällen ein Quarz zur Takterzeugung genutzt, Sie kennen das sicher aus anderen Grundschaltungen. Also erweitern wir unsere Schaltung gleich noch um einen Quarz mit den zugehörigen 22pF-Kondensatoren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mitquarz.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf unserem Steckbrett wird's langsam voller, hier sieht's also inzwischen so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_mitquarz.jpg|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Normalerweise sollte der Quarz genauso wie die beiden 22pF-Kondensatoren, die zum Anschwingen des Quarzes dienen, möglichst nahe am Controller platziert werden. Auf dem Steckbrett ist das manchmal gar nicht so einfach, insbesondere wenn man wie in diesem Fall den Quarz erst später hinzufügt. Wichtig ist nämlich, dass die Leitungen vom Quarz zum Controller möglichst kurz sind, bei gedruckten Schaltungen oft nur 1 bis 2 cm! Auch die einzelnen Bauteilbeinchen, z.B. der Kondensatoren, sollten normalerweise so kurz wie möglich sein.&lt;br /&gt;
Ist dies nicht der Fall, wie auch in unserem Bild, dann fungieren diese Leitungen fast wie eine Funkantenne. Dies führt in der Regel zu starken Hochfrequenzsignalen, die nicht nur unsere Schaltung, sondern auch andere Schaltungen in der Nähe stören könnten. Man merkt dies auch oft daran, dass sich ein Board bei höherer Quarzfrequenz immer seltener fehlerfrei ohne Übertragungsfehler programmieren läßt.&lt;br /&gt;
Grundsätzlich sind daher Schaltungen mit Quarz auf einem Steckbrett nicht sonderlich zu empfehlen, die Betriebssicherheit ist nicht immer gegeben. &lt;br /&gt;
&lt;br /&gt;
Auch wenn nun ein Quarz angeschlossen ist, so wird er noch immer nicht genutzt. Noch immer arbeitet der [[ATMega32]] mit seiner intern voreingestellten 1 Mhz Taktfrequenz. Um dies umzustellen, muss man ein sogenanntes [[Fusebits|Fusebit]] im Controller umprogrammieren. Auch dies wurde schon im Beitrag [[Bascom - Erstes Programm in den AVR_Controller übertragen]] näher beschrieben. Hier sei daher nur nochmals gesagt, dass dies auch sehr bequem in [[Bascom]] erfolgt:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_bascomfusebitquarz.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sobald wir das umgestellt haben, müssen wir auch in dem Programm die Anweisung &lt;br /&gt;
&lt;br /&gt;
 $crystal = 1000000 &lt;br /&gt;
&lt;br /&gt;
durch &lt;br /&gt;
&lt;br /&gt;
 $crystal = 16000000 &lt;br /&gt;
&lt;br /&gt;
ersetzen, denn unser Quarz taktet nun mit 16 MHz.&lt;br /&gt;
&lt;br /&gt;
==Spannung stabilisieren==&lt;br /&gt;
Auch wenn unsere Basis-Schaltung für Experimente inzwischen schon ganz nett ist, so ist es doch etwas ungünstig, dass wir stets 5V zur Verfügung haben müssen. Nicht immer steht ein geeignetes Netzteil zur Verfügung, zudem soll ein Controller auch oft mit Batterien versorgt werden. Aus diesem Grund verfügen fast alle Entwicklungsboards wie ([[RN-Control]], STK500 etc.) über einen [[Spannungsregler]].&lt;br /&gt;
[[Bild:78s05.jpg|thumb|Spannungsregler 78S05]] Dieser wandelt eine höhere Eingangsspannung (ca. 7 bis 20 V) immer genau in  5V  um. Sowas erhöht die Betriebssicherheit einer Schaltung nochmals immens. Als [[Spannungsregler]] (IC2) wird oft der 7805 genutzt, empfehlenswert ist der Typ 78S05, welcher 2A verträgt sowie über einen Kurzschluss- und Überlastungsschutz verfügt. &lt;br /&gt;
Die beiden 100nF-Kondensatoren sind wichtig, sie sollen HF-Störungen und Schwingungen vermeiden. Der Elko vor dem Spannungsregler ist vor allem dann wichtig, wenn die Spannung von einem Netzgerät kommt und noch etwas geglättet werden muss. Je höher der Strombedarf der Schaltung, desto größer kann man die Kapazität wählen. Es schadet nicht, wenn man den Elko einige Nummern größer wählt, man ist dann quasi für alle Fälle gerüstet. So sind Werte zwischen 100 uF und 2200 uF durchaus denkbar. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wir erweitern unsere Schaltung somit wie folgt:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_spannung.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht's wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_spannung.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
==Daten und Texte zum PC übertragen==&lt;br /&gt;
In vielen Programmen müssen Daten oder Texte vom Controller an den PC oder umgekehrt gesendet werden. Insbesondere bei komplexen Programmen kann man auf diese Weise Variableninhalte ausgeben und somit auch Fehler im Programmcode schneller finden und korrigieren. In der Regel ist das ganz einfach, denn der [[Microcontroller]] [[ATMega32]] verfügt über einen internen [[UART]], also ein Modul, das Daten über die [[RS232]]-Schnittstelle zum PC senden bzw. auch von ihm empfangen kann. Leider arbeitet jedoch die Controllerschnittstelle mit 5V und die PC-Schnittstelle der Norm entsprechend mit +-12V. Daher muss unbedingt ein Schaltkreis dazwischen, welcher die Pegel anpasst. Gewöhnlich nimmt man hier das IC MAX232(CPE), welches inzwischen sehr preiswert erhältlich ist.&lt;br /&gt;
&lt;br /&gt;
Wir müssen also die Schaltung nochmals erweitern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_max232.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das IC Max232 ist im Schaltplan in der üblichen funktionsorientierten Darstellung gezeichnet. Zur besseren Übersichtlichkeit wurden die immer benötigten Anschlüsse für VCC (Pin 16) und GND (Pin 15) getrennt oben rechts im Schaltplan dargestellt. Also nicht vergessen !!&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht's so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_max232.jpg|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Über eine dreipolige Stiftleiste ([[RN-Definitionen]]) wird nun das Steckboard mit der [[RS232]]-Schnittstelle des PC verbunden. Es ist nun ein Leichtes, mit einem Programm Daten zum PC zu senden. Das nachfolgende Programm gibt Hinweise mit der Anweisung '''PRINT''' aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step5.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 16000000&lt;br /&gt;
$baud = 9600&lt;br /&gt;
&lt;br /&gt;
Config Portc.0 = Output              'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C)&lt;br /&gt;
&lt;br /&gt;
Config Pina.7 = Input                'Ein Pin (PA0) wird als Eingang definiert&lt;br /&gt;
Porta.7 = 1                          'Interner Pullup Widerstand ein&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
  If Pina.7 = 1 Then&lt;br /&gt;
    Portc.0 = 1                      'Pin wird auf High, also 5V geschaltet&lt;br /&gt;
    Print &amp;quot;Schalter nicht gedrückt&amp;quot;&lt;br /&gt;
  Else&lt;br /&gt;
    Portc.0 = 0                      'Pin wird auf Low, also 0V geschaltet&lt;br /&gt;
    Print &amp;quot;Schalter gedrückt&amp;quot;&lt;br /&gt;
  End If&lt;br /&gt;
  Wait 1&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Möglichkeiten des Steckbrettes erreicht==&lt;br /&gt;
Inzwischen füllt der Schaltplan fast ein DIN-A4-Blatt und auf dem Steckbrett sieht's auch schon recht wirr aus, dabei haben wir nur die wichtigsten Grundelemente auf dem Steckbrett. Für eine Roboter-Steuerung oder andere Anwendung fehlt doch noch einiges. Zum Beispiel weitere Taster, weitere LEDs, Motortreiber, damit der Controller auch Motoren ansteuern kann und ein [[I2C]]-Bus-Anschluss.&lt;br /&gt;
Dies alles noch auf einem Steckbrett zu realisieren macht wenig Sinn, zumal bereits jetzt schon durch die doch recht langen Leitungen/Verkabelungen erhebliche Störungen auftreten. In der letzten Phase ist es immer öfters zu Übertragungsfehlern beim Programmieren gekommen, oft musste dies 20mal wiederholt werden. Dies zeigt, dass ein Steckbrett bestenfalls für ganz kleine Controller-Experimente herhalten kann. Für größere Dinge sollte man dann doch zu einer Lösung auf einer gedruckten Platine greifen. Spezielle Experimentierboards  bieten mehr Sicherheit und haben neben den Grundelementen, die hier beschrieben wurden, noch eine ganze Menge mehr drauf. Bei [[RN-Control]] zum Beispiel 5 Tasten, 8 Leds, Motortreiber, Lautsprecher, diverse Anschlüsse etc. &lt;br /&gt;
Der Größenunterschied wird im Bild deutlich:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_rncontrol.jpg|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auch wenn das Steckbrett also kein Controllerboard ersetzen kann, so hat das kleine Tutorial doch gezeigt, wie eine [[Avr]]-Schaltung aufzubauen ist. Dieses Wissen sollte man auch besitzen, wenn man ein Controllerboard nutzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Was braucht man, wenn man mit einem Controllerboard den Einstieg startet?==&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_ispkabel.jpg|thumb|ISP-Programmierkabel]]Neben dem eigentlichen Board braucht man, wie schon zuvor angesprochen, ein [[AVR-ISP Programmierkabel]]. Da das Selbstbauen kaum billiger ist, ist zu empfehlen, ein solches fertig mitzubestellen. Am preiswertesten und zugleich vielseitigsten sind die ISP-Adapter, die man an das Druckerport anschließt (siehe Bild). Es gibt aber auch USB-Lösungen, wobei diese jedoch oft teuer sind und auch oft weniger Controller programmieren können. Hat man jedoch einen PC oder Notebook ohne parellelen Druckeranschluss, so muss man wohl oder übel in den meisten Fällen zu einem seriellen oder USB-Programmieradapter greifen. Neben den erwähnten Nachteilen hat der USB Dongle aber oft auch den Vorteil, dass er etwas schneller ist. Dieser Unterschied macht sich aber nur bei sehr großen Programmen und Controllern wirklich bemerkbar.&lt;br /&gt;
&lt;br /&gt;
Als zweites braucht man natürlich eine Stromversorgung. Ideal sind Gleichspannungsnetzgeräte, die zwischen 9 und 12V liefern, vorausgesetzt, das Board hat einen Spannungsregler wie in der Regel die RN-Boards. Man kann hier ein normales Steckernetzteil oder ein komfortables Labornetzteil nehmen. Um etwas Reserve zu haben, wäre es gut, wenn das Netzteil mindestens 1 A liefern kann. Alternativ kann man auch Akkupacks oder Batterien nutzen, allerdings mindestens 7,2V sollten die schon liefern können, sicherer sind 8,4-, 9,6- oder 12V-Akkus.&lt;br /&gt;
Das wäre eigentlich schon das Wichtigste, um ein Board in Betrieb zu nehmen und Experimente zu machen. &lt;br /&gt;
&lt;br /&gt;
Allerdings, ein RS232-Kabel ist ebenfalls noch sehr empfehlenswert. Dieses erlaubt die Ausgabe von Texten und Variablen auf den PC, wir haben es ja oben im Steckbrettbeispiel schon gesehen. Dazu wird auf dem PC ein [[Terminalprogramm]] gestartet und über die [[RS232]] Schnittstelle mit dem PC verbunden. Bei manchen Boards ist sowieso ein RS232 Kabel unerläßlich, wie z.B. RN-Motor, RN-Speak etc. Nützlich ist es aber überall. Man kann ein solches Kabel selbst bauen oder gleich beim Kauf eines Boardes mitbestellen.&lt;br /&gt;
&lt;br /&gt;
Also nochmal die Zusammenfassung für den Einstieg:&lt;br /&gt;
&lt;br /&gt;
* Controllerboard&lt;br /&gt;
* [[AVR-ISP Programmierkabel]] mit 10-poligem Wannenstecker&lt;br /&gt;
* RS-232-Kabel (mit 3-poligem Adapter, wenn Board [[RN-Definitionen]] erfüllt)&lt;br /&gt;
* Netzgerät oder Akku (ideal 9 bis 12V, notfalls auch 7,2 bis 20V)&lt;br /&gt;
* [[Bascom]]-Compiler-Vollversion ist nur nötig, wenn man gleich größere Sachen anstrebt, ansonsten reicht das Demo, genauso wie ein [[Avr-gcc]]-Compiler. Bei RN-Boards sind diese Programme beim Board- oder Platinenkauf sowieso dabei, ansonsten kann man diese im Internet downloaden.&lt;br /&gt;
* Ein gutes Buch ist immer gut, siehe [[Buchvorstellungen]]&lt;br /&gt;
&lt;br /&gt;
==Autor==&lt;br /&gt;
*[[Benutzer:Frank|Frank]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Quellen===&lt;br /&gt;
* [[Abblockkondensator]] Artikel von Uwegw&lt;br /&gt;
* RN-Board Dokumentationen aus [[:Kategorie:Projekte]]&lt;br /&gt;
* diverse Datenblätter&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
*[[AVR-ISP Programmierkabel]]&lt;br /&gt;
*[[Mit welchem Controllerboard fang ich an]]&lt;br /&gt;
*[[Abblockkondensator]]&lt;br /&gt;
*[[Bascom]]&lt;br /&gt;
*[[Bascom - Erstes Programm in den AVR_Controller übertragen]]&lt;br /&gt;
*[[Avr]]&lt;br /&gt;
*[[Atmel Controller Mega16 und Mega32]]&lt;br /&gt;
*[[Spannungsregler]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Projekte]]&lt;/div&gt;</summary>
		<author><name>Ratzfatz</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=AVR-Einstieg_leicht_gemacht&amp;diff=14980</id>
		<title>AVR-Einstieg leicht gemacht</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=AVR-Einstieg_leicht_gemacht&amp;diff=14980"/>
				<updated>2009-06-11T12:47:45Z</updated>
		
		<summary type="html">&lt;p&gt;Ratzfatz: /* Wie bekommt man das Programm in den Controller? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:avr8.jpg|thumb|300px|Einen Controller zum Leben zu erwecken ist nicht schwer, manchmal reichen ein paar Teile! Beispiel mit Mega8]]&lt;br /&gt;
==Wir starten mit einem ATMega32== &lt;br /&gt;
Immer wieder gibt es in Foren, wie dem Roboternetz, Einsteiger, die das erstemal mit einem [[Microcontroller]] in Berührung kommen. Trotz zahlreicher Einstiegsbeiträge im Forum wiederholen sich doch bestimmte Anfängerfragen immer wieder, daher soll dieser Artikel noch einmal aufzeigen, wie man den ersten Schritt tut und einen Controller zum Leben erweckt. Es werden verschiedene Grundschaltungen aufgezeigt und erläutert, welche Bauteile welche Funktion besitzen.&lt;br /&gt;
Als Controller verwenden wir einen [[AVR]] [[ATMega32]], der derzeit größte [[AVR]]-Controller, welcher noch im bastlerfreundlichen DIP-Gehäuse verfügbar ist.  Für kleine bis mittlere Projekte ein sehr empfehlenswerter Controller, zumal er preislich mit ca. 6-7 Euro noch sehr günstig ist und zudem mit seinem 40-Pin-Gehäuse reichlich Anschlussmöglichkeiten besitzt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mega1632.gif|center]]&lt;br /&gt;
&lt;br /&gt;
Wie auf dem Bild zu sehen, verfügt auch der etwas günstigere ATMega16 über die gleiche Pinbelegung, daher könnten wir in diesem Tutorial auch diesen Typ verwenden. Der ATMega32 hat aber doppelt soviel Speicherplatz für Programmdaten (Flash), daher hat man für eine geringe Preisdifferenz doch mehr Möglichkeiten.&lt;br /&gt;
Wer noch 3 bis 4 Euro sparen will, dem sei der [[ATMega8]] oder [[ATMega168]] empfohlen, diese Typen sind sehr ähnlich, so dass das Tutorial weitgehend auch auf diese Typen bezogen werden kann. Allerdings haben diese Typen deutlich weniger Anschlussmöglichkeiten (28 Pin DIP Gehäuse). &lt;br /&gt;
&lt;br /&gt;
Die Frage, ob man mit einem fertigen Controllerboard, einer Experimentierplatine oder einem Steckbrett beginnen sollte, wurde ja in dem RN-Wissen Wiki Beitrag &amp;quot;[[Mit welchem Controllerboard fang ich an]]&amp;quot; angesprochen. In den meisten Fällen favorisiert der Autor dieses Artikels ein fertiges Controllerboard. Warum das so ist, dazu am Ende noch ein paar Anmerkungen. Dennoch soll diese Einführung schrittweise anhand eines Steckbrettes erläutert werden.&lt;br /&gt;
&lt;br /&gt;
==Start mit handelsüblichem Steckbrett==&lt;br /&gt;
Ein Steckbrett hat den Vorteil, dass man theoretisch ohne Löten alle Bauteile relativ zügig zusammenstecken kann. Bestimmte Steckkontakte innerhalb einer Reihe sind im Steckbrett miteinander verbunden, so dass man nachher pro Bauteilbeinchen noch einige Steckkontakte zum Verdrahten mit Schaltdraht oder speziell konfektionierter Litze verwenden kann.&lt;br /&gt;
&lt;br /&gt;
'''Die Vorteile eines Steckbretts:'''&lt;br /&gt;
&lt;br /&gt;
*Bauteile können ohne Löten eingesetzt und verdrahtet werden&lt;br /&gt;
*recht zügiger Schaltungsaufbau&lt;br /&gt;
*eine Schaltung kann leicht geändert oder korrigiert werden, defekte Teile sind leicht tauschbar&lt;br /&gt;
*ein Steckbrett kann auch für ganz andere Schaltungen verwendet werden&lt;br /&gt;
'''Die Nachteile eines Steckbretts gegenüber gedruckten Schaltungen und Experimentierplatinen sind:'''&lt;br /&gt;
&lt;br /&gt;
*nicht alle Bauteile passen, so dass wir doch noch etwas löten müssen&lt;br /&gt;
*nur geringer Schaltungsumfang möglich, da es schnell unübersichtlich wird&lt;br /&gt;
*sehr störanfällig wegen grosser Kabellängen, dadurch oft Funktionsstörungen&lt;br /&gt;
*Bauteile müssen zum Teil verbogen werden, damit sie passen&lt;br /&gt;
&lt;br /&gt;
Man beginnt, indem man den Controller AVR [[ATMega32]] auf das Board aufsetzt:&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrettmega32.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
==Die Grundschaltung==&lt;br /&gt;
Damit ein Controller erst mal zum Laufen kommt, benötigt man zumindest einen 10-k-Widerstand, einen 100-nF-Kondensator und eine 5V-Spannungsquelle. Das Ganze muss entsprechend dem unteren Schaltplan verschaltet werden, man spricht von einer sogenannten Grundschaltung. In dem Schaltplan wurde der Controller im Übrigen pinkompatibel als Schaltzeichen verwendet, die Pinreihenfolge ist also im Schaltplan identisch mit der echten Bauteilpin-Reihenfolge. Diese Darstellung erleichtert den Nachbau der Schaltung auf einem Steckbrett aber auch einer Experimentierplatine ungemein. Gewöhnlich verwendet man in Schaltplänen eine etwas andere Darstellung, bei der die Pins nach Funktionsgruppen geordnet sind. Bei solchen Schaltplänen muss man sich dann anhand der Pin-Nummern orientieren, man wird dies am Ende des Artikels noch bei dem IC MAX232 sehen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mega32.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn man schon einige Grundschaltungen in anderen Tutorials gesehen hat, dann wird man bemerken, dass unsere doch noch etwas einfacher ist und weniger Bauteile benötigt.  Hier wird beispielsweise kein Quarz verwendet, da der ATMega32 auch intern einen Takt generieren kann. Wer mit dem ADC genau messen will, sollte statt der Beschaltung im Bild, zwischen Vcc und AVcc eine Spule von 10uH und einen Kondensator von 100nF zwischen AVcc und GND schalten. Will man AVcc als Referenzspannung verwenden, muss noch ein 100nF Kondensator von ARef nach GND.&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht die obere Schaltung wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett1.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um den Controller in Betrieb zu nehmen, benötigt man bei dieser Schaltung ein Netzteil, das eine stabilisierte Spannung von 4 bis 5V liefert. Wir gehen erst einmal davon aus, dass man über dieses verfügt. &lt;br /&gt;
Erwähnenswert ist noch, dass der Kondensator als [[Abblockkondensator]] zur Unterdrückung von Störungen dient. Er muss so nah wie möglich an die Spannungszuführung am Controller selbst gesetzt werden. Ohne Kondensator enstehen erhebliche Störungen in der Versorgungsspannung, das Bild verdeutlicht es:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Abblockkondensator OhneC amAVR.jpg|center]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Der Widerstand in der Grundschaltung dient dazu, die Reset-Leitung konstant auf definiertem High-Pegel zu halten. Verbindet man diesen RESET-Pin später kurz mit GND (Masse), dann wird das Programm im Controller neu gestartet.&lt;br /&gt;
&lt;br /&gt;
==Woran merkt man, dass der Controller funktioniert?==&lt;br /&gt;
Gute Frage! Man merkt es garnicht. Genau genommen funktioniert ja auch trotz korrekter Schaltung noch immer nix, denn es muss zuerst ein Programm in den Controller geladen werden, damit er überhaupt weiss, was zu tun ist. Ohne Programm ist der Controller quasi tot.&lt;br /&gt;
&lt;br /&gt;
==Wie bekommt man das Programm in den Controller?==&lt;br /&gt;
Der Controller verfügt über eine sogenannte [[ISP]]-Schnittstelle. Das bedeutet, über bestimmte Pins ([[SPI]]) kann der Controller mit einer geeigneten PC-Software (zum Beispiel Bascom) programmiert werden. Zum Anschluss an den PC benötigt man jedoch einen sogenannten ISP-Dongle, auch Programmieradapter genannt. Hier gibt es verschiedene Lösungen, serielle und parallele Adapter. Original von Atmel oder kompatible Lösungen. Der am meisten verwendete ISP-Dongle wird am Druckerport betrieben. Diese gibt es inzwischen recht preiswert, sodass sich das Selbstbauen eigentlich nicht lohnt. Da man auch gern auf ein paar Fehlerquellen verzichten sollte, würde ich eine Fertiglösung empfehlen. Wer ihn selbst bauen möchte, findet ([[AVR-ISP_Programmierkabel|hier]] eine ISP-Dongle-Bauanleitung und sogar eine fertige Platine dafür  ([[AVR-ISP_Programmierkabel]]).&lt;br /&gt;
&lt;br /&gt;
Sowas sieht dann so aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Avrtutorial_ispkabel.jpeg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan eines solchen Programmierkabels:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:ispschaltplan.gif|center|thumb|400px|Schaltplan des ISP-Dongels nach unserem Wiki-Bauplan, mit SUB-D Buchse. Bitte beachten, dass das IC1 hier im Plan als verschiedene Blöcke (IC1A/IC1B) dargestellt wird. Dies dient nur zur Übersicht, es handelt sich nur um ein IC, einfach auf die Pinnummern achten. Zum vergrößern anklicken.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Problem ist nun, wie schließe ich einen handelsüblichen ISP-Programmieradapter an den Controller auf dem Steckbrett an. Der normale 10-polige Wannenstecker (nach [[RN-Definitionen]]) passt nicht in ein Steckbrett. Das ist wieder so ein typischer Nachteil bei Steckbrettern! In unserem Beispiel haben wir dazu auf einem kleinen Stück Experimentierplatine einen steckbaren Adapter für das Steckboard gelötet.&lt;br /&gt;
Somit kann man die Schaltung um einen üblichen 10-poligen ISP-Programmieranschluss ergänzen:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mitisp.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
Ein noch einfacheres Programmierkabel ist auf der Seite http://thomaspfeifer.net/ beschrieben.&lt;br /&gt;
Dort gibts es unter &amp;quot;AVR-Projekte&amp;quot; den Artikel &amp;quot;Ein einfaches Programmierkabel für Atmel-AVR Mikrocontroller&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Im Bascom stellt man, um mit diesen einfachen Programmierkabeln zu arbeiten folgendes ein:&lt;br /&gt;
Unter &amp;quot;Options/Programmer&amp;quot; wird &amp;quot;Sample Electronics Programmer&amp;quot; eingestellt, wenn es nicht schon so da steht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht das gleiche so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_mitisp.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jetzt endlich ist es soweit, jetzt kann man den Controller über einen ISP-Programmieradapter mit dem PC verbinden. Aber unbedingt darauf achten, dass auch alles korrekt nach Schaltplan gesteckt wurde und dass die Betriebsspannung 5V nicht übersteigt. Ansonsten könnte man sich Dongle oder sogar die PC-Schnittstelle beschädigen.&lt;br /&gt;
Als Entwicklungsumgebung nutzen wir hier im Tutorial [[Bascom]]. [[Bascom]] ist ein sehr beliebter Basic-[[Compiler]], der zahlreiche [[AVR]] Controllertypen programmieren kann. Da auch ein [[Terminalprogramm]] und ein Programmer integriert ist, enthält diese PC-Software alles, was man braucht, das erleichtert den Einstieg zusätzlich. Die Software gibts kostenlos als Demo bis 4K Code, für unsere Beispiele und den Einstieg reicht das allemal, siehe dazu Artikel Bascom.&lt;br /&gt;
Wie man ein Programm schreibt, kompiliert und überträgt, wurde schon in diesem Beitrag [[Bascom - Erstes Programm in den AVR Controller übertragen]] ausführlich behandelt, wir ersparen uns deshalb diese Details. &lt;br /&gt;
&lt;br /&gt;
Als erstes kompilieren und übertragen wir folgendes Programm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step1.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Programm macht eigentlich nichts, außer dass es eine Endlosschleife ausführt. Aber da wir noch überhaupt nix am Controller angeschlossen haben, können wir eh noch nicht sehen, ob ein Programm nun richtig ausgeführt wird oder nicht.&lt;br /&gt;
Allerdings können wir schonmal üben, das Programm mit Bascom zu übertragen. Wenn wir alles richtig aufgebaut haben und Spannung anliegt, dann sollte automatisch der Controller in Bascom erkannt werden. Die Übertragung sollte dann ohne Fehlermeldung erfolgen können. Wenn wir das geschafft haben, geht’s weiter.&lt;br /&gt;
&lt;br /&gt;
==Läuft die Schaltung und das Programm?==&lt;br /&gt;
Damit wir nun endlich sehen, ob sich bei unserer Schaltung auch was tut, schließen wir eine LED über einen 1K-Vorwiderstand an einen Port an. Da wir die Kathode an den Controllerpin und die Anode an Plus legen, leuchtet die LED immer dann, wenn dieser Pin auf Low geschaltet wird.&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mitled.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht's nun so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_mitled.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Damit man nun auch wirklich sieht, ob das Programm läuft, schreiben wir ein kleines Basic-Programm, welches eine LED abwechselnd ein– und ausschaltet. Wir kompilieren und übertragen also folgendes Programm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step2.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
&lt;br /&gt;
Config Portc.0 = Output       'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C)&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
  Portc.0 = 1                 'Pin wird auf High, also 5V geschaltet&lt;br /&gt;
  Waitms 100&lt;br /&gt;
  Portc.0 = 0                 'Pin wird auf Low, also 0V geschaltet&lt;br /&gt;
  Waitms 100&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn die LED nun schnell blinkt, dann funktioniert die aufgebaute Schaltung perfekt. Wir haben gleichzeitig gelernt, wie man einen Ausgangsport, also Controllerpin, ein- und ausschalten kann. Nahezu alle Pins beim ATMega32 können auf diese Weise als Ausgangsport betrieben werden. Somit lassen sich nicht nur viele Leds, sondern unter Zuhilfenahme eines Treibers (z.B. Transistors) auch Relais und andere Aktoren schalten.&lt;br /&gt;
&lt;br /&gt;
==Eingangsport fragt Taster ab==&lt;br /&gt;
Nun erweitern wir die Schaltung noch um einen Taster. Nahezu jedes Port kann bei einem ATMega32 auch per Software als Eingangsport konfiguriert werden. Wir schließen z.B. einen Taster an Port-Pin PA7 an. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mittaster.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Port wird in der Software so konfiguriert, dass es als Eingang arbeitet und intern über einen hohen Widerstand  (Pullup-Widerstand) ständig auf High-Pegel gelegt wird. Wird nun eine Taste gedrückt, so wird der Pegel auf Low gezogen.&lt;br /&gt;
Das Beispielprogramm ist nun so gestaltet, dass bei gedrückter Taste die LED leuchtet und beim Loslassen wieder ausgeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step3.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
&lt;br /&gt;
Config Portc.0 = Output        'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C)&lt;br /&gt;
&lt;br /&gt;
Config Pina.7 = Input          'Ein Pin (PA0) wird als Eingang definiert&lt;br /&gt;
Porta.7 = 1                    'Interner Pullup Widerstand ein&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
  If Pina.7 = 1 Then&lt;br /&gt;
    Portc.0 = 1                'Pin wird auf High, also 5V geschaltet&lt;br /&gt;
  Else&lt;br /&gt;
    Portc.0 = 0                'Pin wird auf Low, also 0V geschaltet&lt;br /&gt;
  End If&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Grundschaltung mit Quarz==&lt;br /&gt;
Obwohl wir ab der letzten Schaltung schon einiges mit dem Controller anfangen können, so fehlt doch noch etwas Wichtiges. Oft ist es nämlich notwendig, dass ein Controller sehr genaue Frequenzen mißt oder ganz genaue Taktraten ausgeben kann. Leider ist der interne Taktgenerator nicht 100% exakt, was bei manchen Anwendungen störend ist. Zum Beispiel können über die RS232-Schnittstelle Daten nicht immer ganz fehlerfrei übertragen werden, wenn die Taktfrequenz nicht genau stimmt. Daher wird in den meisten Anwendungsfällen ein Quarz zur Takterzeugung genutzt, Sie kennen das sicher aus anderen Grundschaltungen. Also erweitern wir unsere Schaltung gleich noch um einen Quarz mit den zugehörigen 22pF-Kondensatoren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mitquarz.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf unserem Steckbrett wird's langsam voller, hier sieht's also inzwischen so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_mitquarz.jpg|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Normalerweise sollte der Quarz genauso wie die beiden 22pF-Kondensatoren, die zum Anschwingen des Quarzes dienen, möglichst nahe am Controller platziert werden. Auf dem Steckbrett ist das manchmal gar nicht so einfach, insbesondere wenn man wie in diesem Fall den Quarz erst später hinzufügt. Wichtig ist nämlich, dass die Leitungen vom Quarz zum Controller möglichst kurz sind, bei gedruckten Schaltungen oft nur 1 bis 2 cm! Auch die einzelnen Bauteilbeinchen, z.B. der Kondensatoren, sollten normalerweise so kurz wie möglich sein.&lt;br /&gt;
Ist dies nicht der Fall, wie auch in unserem Bild, dann fungieren diese Leitungen fast wie eine Funkantenne. Dies führt in der Regel zu starken Hochfrequenzsignalen, die nicht nur unsere Schaltung, sondern auch andere Schaltungen in der Nähe stören könnten. Man merkt dies auch oft daran, dass sich ein Board bei höherer Quarzfrequenz immer seltener fehlerfrei ohne Übertragungsfehler programmieren läßt.&lt;br /&gt;
Grundsätzlich sind daher Schaltungen mit Quarz auf einem Steckbrett nicht sonderlich zu empfehlen, die Betriebssicherheit ist nicht immer gegeben. &lt;br /&gt;
&lt;br /&gt;
Auch wenn nun ein Quarz angeschlossen ist, so wird er noch immer nicht genutzt. Noch immer arbeitet der [[ATMega32]] mit seiner intern voreingestellten 1 Mhz Taktfrequenz. Um dies umzustellen, muss man ein sogenanntes [[Fusebits|Fusebit]] im Controller umprogrammieren. Auch dies wurde schon im Beitrag [[Bascom - Erstes Programm in den AVR_Controller übertragen]] näher beschrieben. Hier sei daher nur nochmals gesagt, dass dies auch sehr bequem in [[Bascom]] erfolgt:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_bascomfusebitquarz.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sobald wir das umgestellt haben, müssen wir auch in dem Programm die Anweisung &lt;br /&gt;
&lt;br /&gt;
 $crystal = 1000000 &lt;br /&gt;
&lt;br /&gt;
durch &lt;br /&gt;
&lt;br /&gt;
 $crystal = 16000000 &lt;br /&gt;
&lt;br /&gt;
ersetzen, denn unser Quarz taktet nun mit 16 MHz.&lt;br /&gt;
&lt;br /&gt;
==Spannung stabilisieren==&lt;br /&gt;
Auch wenn unsere Basis-Schaltung für Experimente inzwischen schon ganz nett ist, so ist es doch etwas ungünstig, dass wir stets 5V zur Verfügung haben müssen. Nicht immer steht ein geeignetes Netzteil zur Verfügung, zudem soll ein Controller auch oft mit Batterien versorgt werden. Aus diesem Grund verfügen fast alle Entwicklungsboards wie ([[RN-Control]], STK500 etc.) über einen [[Spannungsregler]].&lt;br /&gt;
[[Bild:78s05.jpg|thumb|Spannungsregler 78S05]] Dieser wandelt eine höhere Eingangsspannung (ca. 7 bis 20 V) immer genau in  5V  um. Sowas erhöht die Betriebssicherheit einer Schaltung nochmals immens. Als [[Spannungsregler]] (IC2) wird oft der 7805 genutzt, empfehlenswert ist der Typ 78S05, welcher 2A verträgt sowie über einen Kurzschluss- und Überlastungsschutz verfügt. &lt;br /&gt;
Die beiden 100nF-Kondensatoren sind wichtig, sie sollen HF-Störungen und Schwingungen vermeiden. Der Elko vor dem Spannungsregler ist vor allem dann wichtig, wenn die Spannung von einem Netzgerät kommt und noch etwas geglättet werden muss. Je höher der Strombedarf der Schaltung, desto größer kann man die Kapazität wählen. Es schadet nicht, wenn man den Elko einige Nummern größer wählt, man ist dann quasi für alle Fälle gerüstet. So sind Werte zwischen 100 uF und 2200 uF durchaus denkbar. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wir erweitern unsere Schaltung somit wie folgt:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_spannung.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht's wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_spannung.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
==Daten und Texte zum PC übertragen==&lt;br /&gt;
In vielen Programmen müssen Daten oder Texte vom Controller an den PC oder umgekehrt gesendet werden. Insbesondere bei komplexen Programmen kann man auf diese Weise Variableninhalte ausgeben und somit auch Fehler im Programmcode schneller finden und korrigieren. In der Regel ist das ganz einfach, denn der [[Microcontroller]] [[ATMega32]] verfügt über einen internen [[UART]], also ein Modul, das Daten über die [[RS232]]-Schnittstelle zum PC senden bzw. auch von ihm empfangen kann. Leider arbeitet jedoch die Controllerschnittstelle mit 5V und die PC-Schnittstelle der Norm entsprechend mit +-12V. Daher muss unbedingt ein Schaltkreis dazwischen, welcher die Pegel anpasst. Gewöhnlich nimmt man hier das IC MAX232(CPE), welches inzwischen sehr preiswert erhältlich ist.&lt;br /&gt;
&lt;br /&gt;
Wir müssen also die Schaltung nochmals erweitern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_max232.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das IC Max232 ist im Schaltplan in der üblichen funktionsorientierten Darstellung gezeichnet. Zur besseren Übersichtlichkeit wurden die immer benötigten Anschlüsse für VCC (Pin 16) und GND (Pin 15) getrennt oben rechts im Schaltplan dargestellt. Also nicht vergessen !!&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht's so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_max232.jpg|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Über eine dreipolige Stiftleiste ([[RN-Definitionen]]) wird nun das Steckboard mit der [[RS232]]-Schnittstelle des PC verbunden. Es ist nun ein Leichtes, mit einem Programm Daten zum PC zu senden. Das nachfolgende Programm gibt Hinweise mit der Anweisung '''PRINT''' aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step5.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 16000000&lt;br /&gt;
$baud = 9600&lt;br /&gt;
&lt;br /&gt;
Config Portc.0 = Output              'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C)&lt;br /&gt;
&lt;br /&gt;
Config Pina.7 = Input                'Ein Pin (PA0) wird als Eingang definiert&lt;br /&gt;
Porta.7 = 1                          'Interner Pullup Widerstand ein&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
  If Pina.7 = 1 Then&lt;br /&gt;
    Portc.0 = 1                      'Pin wird auf High, also 5V geschaltet&lt;br /&gt;
    Print &amp;quot;Schalter nicht gedrückt&amp;quot;&lt;br /&gt;
  Else&lt;br /&gt;
    Portc.0 = 0                      'Pin wird auf Low, also 0V geschaltet&lt;br /&gt;
    Print &amp;quot;Schalter gedrückt&amp;quot;&lt;br /&gt;
  End If&lt;br /&gt;
  Wait 1&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Möglichkeiten des Steckbrettes erreicht==&lt;br /&gt;
Inzwischen füllt der Schaltplan fast ein DIN-A4-Blatt und auf dem Steckbrett sieht's auch schon recht wirr aus, dabei haben wir nur die wichtigsten Grundelemente auf dem Steckbrett. Für eine Roboter-Steuerung oder andere Anwendung fehlt doch noch einiges. Zum Beispiel weitere Taster, weitere LEDs, Motortreiber, damit der Controller auch Motoren ansteuern kann und ein [[I2C]]-Bus-Anschluss.&lt;br /&gt;
Dies alles noch auf einem Steckbrett zu realisieren macht wenig Sinn, zumal bereits jetzt schon durch die doch recht langen Leitungen/Verkabelungen erhebliche Störungen auftreten. In der letzten Phase ist es immer öfters zu Übertragungsfehlern beim Programmieren gekommen, oft musste dies 20mal wiederholt werden. Dies zeigt, dass ein Steckbrett bestenfalls für ganz kleine Controller-Experimente herhalten kann. Für größere Dinge sollte man dann doch zu einer Lösung auf einer gedruckten Platine greifen. Spezielle Experimentierboards  bieten mehr Sicherheit und haben neben den Grundelementen, die hier beschrieben wurden, noch eine ganze Menge mehr drauf. Bei [[RN-Control]] zum Beispiel 5 Tasten, 8 Leds, Motortreiber, Lautsprecher, diverse Anschlüsse etc. &lt;br /&gt;
Der Größenunterschied wird im Bild deutlich:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_rncontrol.jpg|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auch wenn das Steckbrett also kein Controllerboard ersetzen kann, so hat das kleine Tutorial doch gezeigt, wie eine [[Avr]]-Schaltung aufzubauen ist. Dieses Wissen sollte man auch besitzen, wenn man ein Controllerboard nutzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Was braucht man, wenn man mit einem Controllerboard den Einstieg startet?==&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_ispkabel.jpg|thumb|ISP-Programmierkabel]]Neben dem eigentlichen Board braucht man, wie schon zuvor angesprochen, ein [[AVR-ISP Programmierkabel]]. Da das Selbstbauen kaum billiger ist, ist zu empfehlen, ein solches fertig mitzubestellen. Am preiswertesten und zugleich vielseitigsten sind die ISP-Adapter, die man an das Druckerport anschließt (siehe Bild). Es gibt aber auch USB-Lösungen, wobei diese jedoch oft teuer sind und auch oft weniger Controller programmieren können. Hat man jedoch einen PC oder Notebook ohne parellelen Druckeranschluss, so muss man wohl oder übel in den meisten Fällen zu einem seriellen oder USB-Programmieradapter greifen. Neben den erwähnten Nachteilen hat der USB Dongle aber oft auch den Vorteil, dass er etwas schneller ist. Dieser Unterschied macht sich aber nur bei sehr großen Programmen und Controllern wirklich bemerkbar.&lt;br /&gt;
&lt;br /&gt;
Als zweites braucht man natürlich eine Stromversorgung. Ideal sind Gleichspannungsnetzgeräte, die zwischen 9 und 12V liefern, vorausgesetzt, das Board hat einen Spannungsregler wie in der Regel die RN-Boards. Man kann hier ein normales Steckernetzteil oder ein komfortables Labornetzteil nehmen. Um etwas Reserve zu haben, wäre es gut, wenn das Netzteil mindestens 1 A liefern kann. Alternativ kann man auch Akkupacks oder Batterien nutzen, allerdings mindestens 7,2V sollten die schon liefern können, sicherer sind 8,4-, 9,6- oder 12V-Akkus.&lt;br /&gt;
Das wäre eigentlich schon das Wichtigste, um ein Board in Betrieb zu nehmen und Experimente zu machen. &lt;br /&gt;
&lt;br /&gt;
Allerdings, ein RS232-Kabel ist ebenfalls noch sehr empfehlenswert. Dieses erlaubt die Ausgabe von Texten und Variablen auf den PC, wir haben es ja oben im Steckbrettbeispiel schon gesehen. Dazu wird auf dem PC ein [[Terminalprogramm]] gestartet und über die [[RS232]] Schnittstelle mit dem PC verbunden. Bei manchen Boards ist sowieso ein RS232 Kabel unerläßlich, wie z.B. RN-Motor, RN-Speak etc. Nützlich ist es aber überall. Man kann ein solches Kabel selbst bauen oder gleich beim Kauf eines Boardes mitbestellen.&lt;br /&gt;
&lt;br /&gt;
Also nochmal die Zusammenfassung für den Einstieg:&lt;br /&gt;
&lt;br /&gt;
* Controllerboard&lt;br /&gt;
* [[AVR-ISP Programmierkabel]] mit 10-poligem Wannenstecker&lt;br /&gt;
* RS-232-Kabel (mit 3-poligem Adapter, wenn Board [[RN-Definitionen]] erfüllt)&lt;br /&gt;
* Netzgerät oder Akku (ideal 9 bis 12V, notfalls auch 7,2 bis 20V)&lt;br /&gt;
* [[Bascom]]-Compiler-Vollversion ist nur nötig, wenn man gleich größere Sachen anstrebt, ansonsten reicht das Demo, genauso wie ein [[Avr-gcc]]-Compiler. Bei RN-Boards sind diese Programme beim Board- oder Platinenkauf sowieso dabei, ansonsten kann man diese im Internet downloaden.&lt;br /&gt;
* Ein gutes Buch ist immer gut, siehe [[Buchvorstellungen]]&lt;br /&gt;
&lt;br /&gt;
==Autor==&lt;br /&gt;
*[[Benutzer:Frank|Frank]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Quellen===&lt;br /&gt;
* [[Abblockkondensator]] Artikel von Uwegw&lt;br /&gt;
* RN-Board Dokumentationen aus [[:Kategorie:Projekte]]&lt;br /&gt;
* diverse Datenblätter&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
*[[AVR-ISP Programmierkabel]]&lt;br /&gt;
*[[Mit welchem Controllerboard fang ich an]]&lt;br /&gt;
*[[Abblockkondensator]]&lt;br /&gt;
*[[Bascom]]&lt;br /&gt;
*[[Bascom - Erstes Programm in den AVR_Controller übertragen]]&lt;br /&gt;
*[[Avr]]&lt;br /&gt;
*[[Atmel Controller Mega16 und Mega32]]&lt;br /&gt;
*[[Spannungsregler]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Projekte]]&lt;/div&gt;</summary>
		<author><name>Ratzfatz</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=AVR-Einstieg_leicht_gemacht&amp;diff=14979</id>
		<title>AVR-Einstieg leicht gemacht</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=AVR-Einstieg_leicht_gemacht&amp;diff=14979"/>
				<updated>2009-06-11T12:45:30Z</updated>
		
		<summary type="html">&lt;p&gt;Ratzfatz: /* Wie bekommt man das Programm in den Controller? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:avr8.jpg|thumb|300px|Einen Controller zum Leben zu erwecken ist nicht schwer, manchmal reichen ein paar Teile! Beispiel mit Mega8]]&lt;br /&gt;
==Wir starten mit einem ATMega32== &lt;br /&gt;
Immer wieder gibt es in Foren, wie dem Roboternetz, Einsteiger, die das erstemal mit einem [[Microcontroller]] in Berührung kommen. Trotz zahlreicher Einstiegsbeiträge im Forum wiederholen sich doch bestimmte Anfängerfragen immer wieder, daher soll dieser Artikel noch einmal aufzeigen, wie man den ersten Schritt tut und einen Controller zum Leben erweckt. Es werden verschiedene Grundschaltungen aufgezeigt und erläutert, welche Bauteile welche Funktion besitzen.&lt;br /&gt;
Als Controller verwenden wir einen [[AVR]] [[ATMega32]], der derzeit größte [[AVR]]-Controller, welcher noch im bastlerfreundlichen DIP-Gehäuse verfügbar ist.  Für kleine bis mittlere Projekte ein sehr empfehlenswerter Controller, zumal er preislich mit ca. 6-7 Euro noch sehr günstig ist und zudem mit seinem 40-Pin-Gehäuse reichlich Anschlussmöglichkeiten besitzt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Mega1632.gif|center]]&lt;br /&gt;
&lt;br /&gt;
Wie auf dem Bild zu sehen, verfügt auch der etwas günstigere ATMega16 über die gleiche Pinbelegung, daher könnten wir in diesem Tutorial auch diesen Typ verwenden. Der ATMega32 hat aber doppelt soviel Speicherplatz für Programmdaten (Flash), daher hat man für eine geringe Preisdifferenz doch mehr Möglichkeiten.&lt;br /&gt;
Wer noch 3 bis 4 Euro sparen will, dem sei der [[ATMega8]] oder [[ATMega168]] empfohlen, diese Typen sind sehr ähnlich, so dass das Tutorial weitgehend auch auf diese Typen bezogen werden kann. Allerdings haben diese Typen deutlich weniger Anschlussmöglichkeiten (28 Pin DIP Gehäuse). &lt;br /&gt;
&lt;br /&gt;
Die Frage, ob man mit einem fertigen Controllerboard, einer Experimentierplatine oder einem Steckbrett beginnen sollte, wurde ja in dem RN-Wissen Wiki Beitrag &amp;quot;[[Mit welchem Controllerboard fang ich an]]&amp;quot; angesprochen. In den meisten Fällen favorisiert der Autor dieses Artikels ein fertiges Controllerboard. Warum das so ist, dazu am Ende noch ein paar Anmerkungen. Dennoch soll diese Einführung schrittweise anhand eines Steckbrettes erläutert werden.&lt;br /&gt;
&lt;br /&gt;
==Start mit handelsüblichem Steckbrett==&lt;br /&gt;
Ein Steckbrett hat den Vorteil, dass man theoretisch ohne Löten alle Bauteile relativ zügig zusammenstecken kann. Bestimmte Steckkontakte innerhalb einer Reihe sind im Steckbrett miteinander verbunden, so dass man nachher pro Bauteilbeinchen noch einige Steckkontakte zum Verdrahten mit Schaltdraht oder speziell konfektionierter Litze verwenden kann.&lt;br /&gt;
&lt;br /&gt;
'''Die Vorteile eines Steckbretts:'''&lt;br /&gt;
&lt;br /&gt;
*Bauteile können ohne Löten eingesetzt und verdrahtet werden&lt;br /&gt;
*recht zügiger Schaltungsaufbau&lt;br /&gt;
*eine Schaltung kann leicht geändert oder korrigiert werden, defekte Teile sind leicht tauschbar&lt;br /&gt;
*ein Steckbrett kann auch für ganz andere Schaltungen verwendet werden&lt;br /&gt;
'''Die Nachteile eines Steckbretts gegenüber gedruckten Schaltungen und Experimentierplatinen sind:'''&lt;br /&gt;
&lt;br /&gt;
*nicht alle Bauteile passen, so dass wir doch noch etwas löten müssen&lt;br /&gt;
*nur geringer Schaltungsumfang möglich, da es schnell unübersichtlich wird&lt;br /&gt;
*sehr störanfällig wegen grosser Kabellängen, dadurch oft Funktionsstörungen&lt;br /&gt;
*Bauteile müssen zum Teil verbogen werden, damit sie passen&lt;br /&gt;
&lt;br /&gt;
Man beginnt, indem man den Controller AVR [[ATMega32]] auf das Board aufsetzt:&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrettmega32.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
==Die Grundschaltung==&lt;br /&gt;
Damit ein Controller erst mal zum Laufen kommt, benötigt man zumindest einen 10-k-Widerstand, einen 100-nF-Kondensator und eine 5V-Spannungsquelle. Das Ganze muss entsprechend dem unteren Schaltplan verschaltet werden, man spricht von einer sogenannten Grundschaltung. In dem Schaltplan wurde der Controller im Übrigen pinkompatibel als Schaltzeichen verwendet, die Pinreihenfolge ist also im Schaltplan identisch mit der echten Bauteilpin-Reihenfolge. Diese Darstellung erleichtert den Nachbau der Schaltung auf einem Steckbrett aber auch einer Experimentierplatine ungemein. Gewöhnlich verwendet man in Schaltplänen eine etwas andere Darstellung, bei der die Pins nach Funktionsgruppen geordnet sind. Bei solchen Schaltplänen muss man sich dann anhand der Pin-Nummern orientieren, man wird dies am Ende des Artikels noch bei dem IC MAX232 sehen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mega32.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn man schon einige Grundschaltungen in anderen Tutorials gesehen hat, dann wird man bemerken, dass unsere doch noch etwas einfacher ist und weniger Bauteile benötigt.  Hier wird beispielsweise kein Quarz verwendet, da der ATMega32 auch intern einen Takt generieren kann. Wer mit dem ADC genau messen will, sollte statt der Beschaltung im Bild, zwischen Vcc und AVcc eine Spule von 10uH und einen Kondensator von 100nF zwischen AVcc und GND schalten. Will man AVcc als Referenzspannung verwenden, muss noch ein 100nF Kondensator von ARef nach GND.&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht die obere Schaltung wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett1.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um den Controller in Betrieb zu nehmen, benötigt man bei dieser Schaltung ein Netzteil, das eine stabilisierte Spannung von 4 bis 5V liefert. Wir gehen erst einmal davon aus, dass man über dieses verfügt. &lt;br /&gt;
Erwähnenswert ist noch, dass der Kondensator als [[Abblockkondensator]] zur Unterdrückung von Störungen dient. Er muss so nah wie möglich an die Spannungszuführung am Controller selbst gesetzt werden. Ohne Kondensator enstehen erhebliche Störungen in der Versorgungsspannung, das Bild verdeutlicht es:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Abblockkondensator OhneC amAVR.jpg|center]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Der Widerstand in der Grundschaltung dient dazu, die Reset-Leitung konstant auf definiertem High-Pegel zu halten. Verbindet man diesen RESET-Pin später kurz mit GND (Masse), dann wird das Programm im Controller neu gestartet.&lt;br /&gt;
&lt;br /&gt;
==Woran merkt man, dass der Controller funktioniert?==&lt;br /&gt;
Gute Frage! Man merkt es garnicht. Genau genommen funktioniert ja auch trotz korrekter Schaltung noch immer nix, denn es muss zuerst ein Programm in den Controller geladen werden, damit er überhaupt weiss, was zu tun ist. Ohne Programm ist der Controller quasi tot.&lt;br /&gt;
&lt;br /&gt;
==Wie bekommt man das Programm in den Controller?==&lt;br /&gt;
Der Controller verfügt über eine sogenannte [[ISP]]-Schnittstelle. Das bedeutet, über bestimmte Pins ([[SPI]]) kann der Controller mit einer geeigneten PC-Software (zum Beispiel Bascom) programmiert werden. Zum Anschluss an den PC benötigt man jedoch einen sogenannten ISP-Dongle, auch Programmieradapter genannt. Hier gibt es verschiedene Lösungen, serielle und parallele Adapter. Original von Atmel oder kompatible Lösungen. Der am meisten verwendete ISP-Dongle wird am Druckerport betrieben. Diese gibt es inzwischen recht preiswert, sodass sich das Selbstbauen eigentlich nicht lohnt. Da man auch gern auf ein paar Fehlerquellen verzichten sollte, würde ich eine Fertiglösung empfehlen. Wer ihn selbst bauen möchte, findet ([[AVR-ISP_Programmierkabel|hier]] eine ISP-Dongle-Bauanleitung und sogar eine fertige Platine dafür  ([[AVR-ISP_Programmierkabel]]).&lt;br /&gt;
&lt;br /&gt;
Sowas sieht dann so aus:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Avrtutorial_ispkabel.jpeg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Schaltplan eines solchen Programmierkabels:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:ispschaltplan.gif|center|thumb|400px|Schaltplan des ISP-Dongels nach unserem Wiki-Bauplan, mit SUB-D Buchse. Bitte beachten, dass das IC1 hier im Plan als verschiedene Blöcke (IC1A/IC1B) dargestellt wird. Dies dient nur zur Übersicht, es handelt sich nur um ein IC, einfach auf die Pinnummern achten. Zum vergrößern anklicken.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Problem ist nun, wie schließe ich einen handelsüblichen ISP-Programmieradapter an den Controller auf dem Steckbrett an. Der normale 10-polige Wannenstecker (nach [[RN-Definitionen]]) passt nicht in ein Steckbrett. Das ist wieder so ein typischer Nachteil bei Steckbrettern! In unserem Beispiel haben wir dazu auf einem kleinen Stück Experimentierplatine einen steckbaren Adapter für das Steckboard gelötet.&lt;br /&gt;
Somit kann man die Schaltung um einen üblichen 10-poligen ISP-Programmieranschluss ergänzen:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mitisp.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
Ein noch einfacheres Programmierkabel ist auf der Seite http://thomaspfeifer.net/ beschrieben.&lt;br /&gt;
&lt;br /&gt;
Im Bascom stellt man, um mit diesen einfachen Programmierkabeln zu arbeiten folgendes ein:&lt;br /&gt;
Unter &amp;quot;Options/Programmer&amp;quot; wird &amp;quot;Sample Electronics Programmer&amp;quot; eingestellt, wenn es nicht schon so da steht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht das gleiche so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_mitisp.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jetzt endlich ist es soweit, jetzt kann man den Controller über einen ISP-Programmieradapter mit dem PC verbinden. Aber unbedingt darauf achten, dass auch alles korrekt nach Schaltplan gesteckt wurde und dass die Betriebsspannung 5V nicht übersteigt. Ansonsten könnte man sich Dongle oder sogar die PC-Schnittstelle beschädigen.&lt;br /&gt;
Als Entwicklungsumgebung nutzen wir hier im Tutorial [[Bascom]]. [[Bascom]] ist ein sehr beliebter Basic-[[Compiler]], der zahlreiche [[AVR]] Controllertypen programmieren kann. Da auch ein [[Terminalprogramm]] und ein Programmer integriert ist, enthält diese PC-Software alles, was man braucht, das erleichtert den Einstieg zusätzlich. Die Software gibts kostenlos als Demo bis 4K Code, für unsere Beispiele und den Einstieg reicht das allemal, siehe dazu Artikel Bascom.&lt;br /&gt;
Wie man ein Programm schreibt, kompiliert und überträgt, wurde schon in diesem Beitrag [[Bascom - Erstes Programm in den AVR Controller übertragen]] ausführlich behandelt, wir ersparen uns deshalb diese Details. &lt;br /&gt;
&lt;br /&gt;
Als erstes kompilieren und übertragen wir folgendes Programm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step1.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Programm macht eigentlich nichts, außer dass es eine Endlosschleife ausführt. Aber da wir noch überhaupt nix am Controller angeschlossen haben, können wir eh noch nicht sehen, ob ein Programm nun richtig ausgeführt wird oder nicht.&lt;br /&gt;
Allerdings können wir schonmal üben, das Programm mit Bascom zu übertragen. Wenn wir alles richtig aufgebaut haben und Spannung anliegt, dann sollte automatisch der Controller in Bascom erkannt werden. Die Übertragung sollte dann ohne Fehlermeldung erfolgen können. Wenn wir das geschafft haben, geht’s weiter.&lt;br /&gt;
&lt;br /&gt;
==Läuft die Schaltung und das Programm?==&lt;br /&gt;
Damit wir nun endlich sehen, ob sich bei unserer Schaltung auch was tut, schließen wir eine LED über einen 1K-Vorwiderstand an einen Port an. Da wir die Kathode an den Controllerpin und die Anode an Plus legen, leuchtet die LED immer dann, wenn dieser Pin auf Low geschaltet wird.&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mitled.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht's nun so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_mitled.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Damit man nun auch wirklich sieht, ob das Programm läuft, schreiben wir ein kleines Basic-Programm, welches eine LED abwechselnd ein– und ausschaltet. Wir kompilieren und übertragen also folgendes Programm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step2.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
&lt;br /&gt;
Config Portc.0 = Output       'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C)&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
  Portc.0 = 1                 'Pin wird auf High, also 5V geschaltet&lt;br /&gt;
  Waitms 100&lt;br /&gt;
  Portc.0 = 0                 'Pin wird auf Low, also 0V geschaltet&lt;br /&gt;
  Waitms 100&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn die LED nun schnell blinkt, dann funktioniert die aufgebaute Schaltung perfekt. Wir haben gleichzeitig gelernt, wie man einen Ausgangsport, also Controllerpin, ein- und ausschalten kann. Nahezu alle Pins beim ATMega32 können auf diese Weise als Ausgangsport betrieben werden. Somit lassen sich nicht nur viele Leds, sondern unter Zuhilfenahme eines Treibers (z.B. Transistors) auch Relais und andere Aktoren schalten.&lt;br /&gt;
&lt;br /&gt;
==Eingangsport fragt Taster ab==&lt;br /&gt;
Nun erweitern wir die Schaltung noch um einen Taster. Nahezu jedes Port kann bei einem ATMega32 auch per Software als Eingangsport konfiguriert werden. Wir schließen z.B. einen Taster an Port-Pin PA7 an. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mittaster.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Port wird in der Software so konfiguriert, dass es als Eingang arbeitet und intern über einen hohen Widerstand  (Pullup-Widerstand) ständig auf High-Pegel gelegt wird. Wird nun eine Taste gedrückt, so wird der Pegel auf Low gezogen.&lt;br /&gt;
Das Beispielprogramm ist nun so gestaltet, dass bei gedrückter Taste die LED leuchtet und beim Loslassen wieder ausgeht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step3.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 1000000&lt;br /&gt;
&lt;br /&gt;
Config Portc.0 = Output        'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C)&lt;br /&gt;
&lt;br /&gt;
Config Pina.7 = Input          'Ein Pin (PA0) wird als Eingang definiert&lt;br /&gt;
Porta.7 = 1                    'Interner Pullup Widerstand ein&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
  If Pina.7 = 1 Then&lt;br /&gt;
    Portc.0 = 1                'Pin wird auf High, also 5V geschaltet&lt;br /&gt;
  Else&lt;br /&gt;
    Portc.0 = 0                'Pin wird auf Low, also 0V geschaltet&lt;br /&gt;
  End If&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Grundschaltung mit Quarz==&lt;br /&gt;
Obwohl wir ab der letzten Schaltung schon einiges mit dem Controller anfangen können, so fehlt doch noch etwas Wichtiges. Oft ist es nämlich notwendig, dass ein Controller sehr genaue Frequenzen mißt oder ganz genaue Taktraten ausgeben kann. Leider ist der interne Taktgenerator nicht 100% exakt, was bei manchen Anwendungen störend ist. Zum Beispiel können über die RS232-Schnittstelle Daten nicht immer ganz fehlerfrei übertragen werden, wenn die Taktfrequenz nicht genau stimmt. Daher wird in den meisten Anwendungsfällen ein Quarz zur Takterzeugung genutzt, Sie kennen das sicher aus anderen Grundschaltungen. Also erweitern wir unsere Schaltung gleich noch um einen Quarz mit den zugehörigen 22pF-Kondensatoren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_mitquarz.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf unserem Steckbrett wird's langsam voller, hier sieht's also inzwischen so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_mitquarz.jpg|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Normalerweise sollte der Quarz genauso wie die beiden 22pF-Kondensatoren, die zum Anschwingen des Quarzes dienen, möglichst nahe am Controller platziert werden. Auf dem Steckbrett ist das manchmal gar nicht so einfach, insbesondere wenn man wie in diesem Fall den Quarz erst später hinzufügt. Wichtig ist nämlich, dass die Leitungen vom Quarz zum Controller möglichst kurz sind, bei gedruckten Schaltungen oft nur 1 bis 2 cm! Auch die einzelnen Bauteilbeinchen, z.B. der Kondensatoren, sollten normalerweise so kurz wie möglich sein.&lt;br /&gt;
Ist dies nicht der Fall, wie auch in unserem Bild, dann fungieren diese Leitungen fast wie eine Funkantenne. Dies führt in der Regel zu starken Hochfrequenzsignalen, die nicht nur unsere Schaltung, sondern auch andere Schaltungen in der Nähe stören könnten. Man merkt dies auch oft daran, dass sich ein Board bei höherer Quarzfrequenz immer seltener fehlerfrei ohne Übertragungsfehler programmieren läßt.&lt;br /&gt;
Grundsätzlich sind daher Schaltungen mit Quarz auf einem Steckbrett nicht sonderlich zu empfehlen, die Betriebssicherheit ist nicht immer gegeben. &lt;br /&gt;
&lt;br /&gt;
Auch wenn nun ein Quarz angeschlossen ist, so wird er noch immer nicht genutzt. Noch immer arbeitet der [[ATMega32]] mit seiner intern voreingestellten 1 Mhz Taktfrequenz. Um dies umzustellen, muss man ein sogenanntes [[Fusebits|Fusebit]] im Controller umprogrammieren. Auch dies wurde schon im Beitrag [[Bascom - Erstes Programm in den AVR_Controller übertragen]] näher beschrieben. Hier sei daher nur nochmals gesagt, dass dies auch sehr bequem in [[Bascom]] erfolgt:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_bascomfusebitquarz.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sobald wir das umgestellt haben, müssen wir auch in dem Programm die Anweisung &lt;br /&gt;
&lt;br /&gt;
 $crystal = 1000000 &lt;br /&gt;
&lt;br /&gt;
durch &lt;br /&gt;
&lt;br /&gt;
 $crystal = 16000000 &lt;br /&gt;
&lt;br /&gt;
ersetzen, denn unser Quarz taktet nun mit 16 MHz.&lt;br /&gt;
&lt;br /&gt;
==Spannung stabilisieren==&lt;br /&gt;
Auch wenn unsere Basis-Schaltung für Experimente inzwischen schon ganz nett ist, so ist es doch etwas ungünstig, dass wir stets 5V zur Verfügung haben müssen. Nicht immer steht ein geeignetes Netzteil zur Verfügung, zudem soll ein Controller auch oft mit Batterien versorgt werden. Aus diesem Grund verfügen fast alle Entwicklungsboards wie ([[RN-Control]], STK500 etc.) über einen [[Spannungsregler]].&lt;br /&gt;
[[Bild:78s05.jpg|thumb|Spannungsregler 78S05]] Dieser wandelt eine höhere Eingangsspannung (ca. 7 bis 20 V) immer genau in  5V  um. Sowas erhöht die Betriebssicherheit einer Schaltung nochmals immens. Als [[Spannungsregler]] (IC2) wird oft der 7805 genutzt, empfehlenswert ist der Typ 78S05, welcher 2A verträgt sowie über einen Kurzschluss- und Überlastungsschutz verfügt. &lt;br /&gt;
Die beiden 100nF-Kondensatoren sind wichtig, sie sollen HF-Störungen und Schwingungen vermeiden. Der Elko vor dem Spannungsregler ist vor allem dann wichtig, wenn die Spannung von einem Netzgerät kommt und noch etwas geglättet werden muss. Je höher der Strombedarf der Schaltung, desto größer kann man die Kapazität wählen. Es schadet nicht, wenn man den Elko einige Nummern größer wählt, man ist dann quasi für alle Fälle gerüstet. So sind Werte zwischen 100 uF und 2200 uF durchaus denkbar. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wir erweitern unsere Schaltung somit wie folgt:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_spannung.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht's wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_spannung.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
==Daten und Texte zum PC übertragen==&lt;br /&gt;
In vielen Programmen müssen Daten oder Texte vom Controller an den PC oder umgekehrt gesendet werden. Insbesondere bei komplexen Programmen kann man auf diese Weise Variableninhalte ausgeben und somit auch Fehler im Programmcode schneller finden und korrigieren. In der Regel ist das ganz einfach, denn der [[Microcontroller]] [[ATMega32]] verfügt über einen internen [[UART]], also ein Modul, das Daten über die [[RS232]]-Schnittstelle zum PC senden bzw. auch von ihm empfangen kann. Leider arbeitet jedoch die Controllerschnittstelle mit 5V und die PC-Schnittstelle der Norm entsprechend mit +-12V. Daher muss unbedingt ein Schaltkreis dazwischen, welcher die Pegel anpasst. Gewöhnlich nimmt man hier das IC MAX232(CPE), welches inzwischen sehr preiswert erhältlich ist.&lt;br /&gt;
&lt;br /&gt;
Wir müssen also die Schaltung nochmals erweitern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_grundschaltung_max232.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das IC Max232 ist im Schaltplan in der üblichen funktionsorientierten Darstellung gezeichnet. Zur besseren Übersichtlichkeit wurden die immer benötigten Anschlüsse für VCC (Pin 16) und GND (Pin 15) getrennt oben rechts im Schaltplan dargestellt. Also nicht vergessen !!&lt;br /&gt;
&lt;br /&gt;
Auf dem Steckbrett sieht's so aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_max232.jpg|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Über eine dreipolige Stiftleiste ([[RN-Definitionen]]) wird nun das Steckboard mit der [[RS232]]-Schnittstelle des PC verbunden. Es ist nun ein Leichtes, mit einem Programm Daten zum PC zu senden. Das nachfolgende Programm gibt Hinweise mit der Anweisung '''PRINT''' aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'step5.bas.BAS&lt;br /&gt;
'für&lt;br /&gt;
'RoboterNetz.de AVR Tutorial in RN-Wissen&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank Brall&lt;br /&gt;
'Weitere Beispiele und Beschreibung der Hardware&lt;br /&gt;
'unter&lt;br /&gt;
'  http://www.Roboternetz.de oder&lt;br /&gt;
'  http://www.Roboternetz.de/wissen&lt;br /&gt;
'#######################################################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$crystal = 16000000&lt;br /&gt;
$baud = 9600&lt;br /&gt;
&lt;br /&gt;
Config Portc.0 = Output              'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C)&lt;br /&gt;
&lt;br /&gt;
Config Pina.7 = Input                'Ein Pin (PA0) wird als Eingang definiert&lt;br /&gt;
Porta.7 = 1                          'Interner Pullup Widerstand ein&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
  If Pina.7 = 1 Then&lt;br /&gt;
    Portc.0 = 1                      'Pin wird auf High, also 5V geschaltet&lt;br /&gt;
    Print &amp;quot;Schalter nicht gedrückt&amp;quot;&lt;br /&gt;
  Else&lt;br /&gt;
    Portc.0 = 0                      'Pin wird auf Low, also 0V geschaltet&lt;br /&gt;
    Print &amp;quot;Schalter gedrückt&amp;quot;&lt;br /&gt;
  End If&lt;br /&gt;
  Wait 1&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Möglichkeiten des Steckbrettes erreicht==&lt;br /&gt;
Inzwischen füllt der Schaltplan fast ein DIN-A4-Blatt und auf dem Steckbrett sieht's auch schon recht wirr aus, dabei haben wir nur die wichtigsten Grundelemente auf dem Steckbrett. Für eine Roboter-Steuerung oder andere Anwendung fehlt doch noch einiges. Zum Beispiel weitere Taster, weitere LEDs, Motortreiber, damit der Controller auch Motoren ansteuern kann und ein [[I2C]]-Bus-Anschluss.&lt;br /&gt;
Dies alles noch auf einem Steckbrett zu realisieren macht wenig Sinn, zumal bereits jetzt schon durch die doch recht langen Leitungen/Verkabelungen erhebliche Störungen auftreten. In der letzten Phase ist es immer öfters zu Übertragungsfehlern beim Programmieren gekommen, oft musste dies 20mal wiederholt werden. Dies zeigt, dass ein Steckbrett bestenfalls für ganz kleine Controller-Experimente herhalten kann. Für größere Dinge sollte man dann doch zu einer Lösung auf einer gedruckten Platine greifen. Spezielle Experimentierboards  bieten mehr Sicherheit und haben neben den Grundelementen, die hier beschrieben wurden, noch eine ganze Menge mehr drauf. Bei [[RN-Control]] zum Beispiel 5 Tasten, 8 Leds, Motortreiber, Lautsprecher, diverse Anschlüsse etc. &lt;br /&gt;
Der Größenunterschied wird im Bild deutlich:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_steckbrett_rncontrol.jpg|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auch wenn das Steckbrett also kein Controllerboard ersetzen kann, so hat das kleine Tutorial doch gezeigt, wie eine [[Avr]]-Schaltung aufzubauen ist. Dieses Wissen sollte man auch besitzen, wenn man ein Controllerboard nutzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Was braucht man, wenn man mit einem Controllerboard den Einstieg startet?==&lt;br /&gt;
&lt;br /&gt;
[[Bild:avrtutorial_ispkabel.jpg|thumb|ISP-Programmierkabel]]Neben dem eigentlichen Board braucht man, wie schon zuvor angesprochen, ein [[AVR-ISP Programmierkabel]]. Da das Selbstbauen kaum billiger ist, ist zu empfehlen, ein solches fertig mitzubestellen. Am preiswertesten und zugleich vielseitigsten sind die ISP-Adapter, die man an das Druckerport anschließt (siehe Bild). Es gibt aber auch USB-Lösungen, wobei diese jedoch oft teuer sind und auch oft weniger Controller programmieren können. Hat man jedoch einen PC oder Notebook ohne parellelen Druckeranschluss, so muss man wohl oder übel in den meisten Fällen zu einem seriellen oder USB-Programmieradapter greifen. Neben den erwähnten Nachteilen hat der USB Dongle aber oft auch den Vorteil, dass er etwas schneller ist. Dieser Unterschied macht sich aber nur bei sehr großen Programmen und Controllern wirklich bemerkbar.&lt;br /&gt;
&lt;br /&gt;
Als zweites braucht man natürlich eine Stromversorgung. Ideal sind Gleichspannungsnetzgeräte, die zwischen 9 und 12V liefern, vorausgesetzt, das Board hat einen Spannungsregler wie in der Regel die RN-Boards. Man kann hier ein normales Steckernetzteil oder ein komfortables Labornetzteil nehmen. Um etwas Reserve zu haben, wäre es gut, wenn das Netzteil mindestens 1 A liefern kann. Alternativ kann man auch Akkupacks oder Batterien nutzen, allerdings mindestens 7,2V sollten die schon liefern können, sicherer sind 8,4-, 9,6- oder 12V-Akkus.&lt;br /&gt;
Das wäre eigentlich schon das Wichtigste, um ein Board in Betrieb zu nehmen und Experimente zu machen. &lt;br /&gt;
&lt;br /&gt;
Allerdings, ein RS232-Kabel ist ebenfalls noch sehr empfehlenswert. Dieses erlaubt die Ausgabe von Texten und Variablen auf den PC, wir haben es ja oben im Steckbrettbeispiel schon gesehen. Dazu wird auf dem PC ein [[Terminalprogramm]] gestartet und über die [[RS232]] Schnittstelle mit dem PC verbunden. Bei manchen Boards ist sowieso ein RS232 Kabel unerläßlich, wie z.B. RN-Motor, RN-Speak etc. Nützlich ist es aber überall. Man kann ein solches Kabel selbst bauen oder gleich beim Kauf eines Boardes mitbestellen.&lt;br /&gt;
&lt;br /&gt;
Also nochmal die Zusammenfassung für den Einstieg:&lt;br /&gt;
&lt;br /&gt;
* Controllerboard&lt;br /&gt;
* [[AVR-ISP Programmierkabel]] mit 10-poligem Wannenstecker&lt;br /&gt;
* RS-232-Kabel (mit 3-poligem Adapter, wenn Board [[RN-Definitionen]] erfüllt)&lt;br /&gt;
* Netzgerät oder Akku (ideal 9 bis 12V, notfalls auch 7,2 bis 20V)&lt;br /&gt;
* [[Bascom]]-Compiler-Vollversion ist nur nötig, wenn man gleich größere Sachen anstrebt, ansonsten reicht das Demo, genauso wie ein [[Avr-gcc]]-Compiler. Bei RN-Boards sind diese Programme beim Board- oder Platinenkauf sowieso dabei, ansonsten kann man diese im Internet downloaden.&lt;br /&gt;
* Ein gutes Buch ist immer gut, siehe [[Buchvorstellungen]]&lt;br /&gt;
&lt;br /&gt;
==Autor==&lt;br /&gt;
*[[Benutzer:Frank|Frank]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Quellen===&lt;br /&gt;
* [[Abblockkondensator]] Artikel von Uwegw&lt;br /&gt;
* RN-Board Dokumentationen aus [[:Kategorie:Projekte]]&lt;br /&gt;
* diverse Datenblätter&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
*[[AVR-ISP Programmierkabel]]&lt;br /&gt;
*[[Mit welchem Controllerboard fang ich an]]&lt;br /&gt;
*[[Abblockkondensator]]&lt;br /&gt;
*[[Bascom]]&lt;br /&gt;
*[[Bascom - Erstes Programm in den AVR_Controller übertragen]]&lt;br /&gt;
*[[Avr]]&lt;br /&gt;
*[[Atmel Controller Mega16 und Mega32]]&lt;br /&gt;
*[[Spannungsregler]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Projekte]]&lt;/div&gt;</summary>
		<author><name>Ratzfatz</name></author>	</entry>

	</feed>