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

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RN-KeyLCD&amp;diff=8538</id>
		<title>RN-KeyLCD</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RN-KeyLCD&amp;diff=8538"/>
				<updated>2006-08-20T18:28:59Z</updated>
		
		<summary type="html">&lt;p&gt;Darth Ding: /* Was ist RN-KeyLCD? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Was ist RN-KeyLCD?==&lt;br /&gt;
&lt;br /&gt;
[[Bild:knkeylcdfoto1.jpg|right|350px]]&lt;br /&gt;
Ein LCD und eine Tastatur ist fast bei allen [[Microcontroller]]-Anwendungen und Robotik-Basteleien von großem Vorteil.  Nicht nur bei der späteren Bedienung der Schaltung sondern auch beim Debuggen eigener Controlleranwendungen. &lt;br /&gt;
Der Nachteil war immer das  ein Standard-LCD als auch eine Matrixtastatur viele Portleitungen belegt. Damit macht dieses Board nun Schluß! &lt;br /&gt;
Das Board belegt keinerlei zusätzlichen Port, es kann sowohl über eine RS232 Schnittstelle (PC V24 Norm oder TTL Pegel) als auch [[I2C]]-Bus oder sogar [[RS485]] angesteuert werden. Der Anschluß und die Ansteuerung wird dadurch sehr einfach, nicht nur bei allen RN-Board´s. &lt;br /&gt;
Baudraten, [[I2C]]-Slave-Adresse und Betriebsmodus können über das Tastenfeld einfach umgeschaltet werden. Der Modus bleibt auch bei Spannungsausfall erhalten! &lt;br /&gt;
&lt;br /&gt;
Besonders Vorteilhaft ist, dass für Tastatur, die serielle Verbindung und den I2C-Bus intern ein Ringbuffer (Zwischenspeicher) vorgesehen ist. So wird das angeschlossene Hauptboard  (z.B. [[RN-Control]] oder  anderes Board aber auch PC) bei Ausgaben nicht so stark wie bei herkömmlichen LCD´s gebremst. Auch Tastatureingaben gehen nicht verloren wenn das Hauptboard mal gerade wegen einer Operation nicht genügend Zeit hat um die Tasten schnell genug abzufragen. LCD und Tastatur sind dabei völlig unabhängig über das gleiche Kabel ansteuerbar. Für die Verbindung zum PC oder anderem Mikrocontrollerboard ist nur das übliche 3 poliges RS232 Kabel oder 10 polige I2C Kabel notwendig (siehe unter [[RN-Definitionen]]).&lt;br /&gt;
&lt;br /&gt;
===Leistungsmerkmale und Eigenschaften===&lt;br /&gt;
&lt;br /&gt;
*sehr einfach über verschiedene Anschlüsse ansteuerbar.&lt;br /&gt;
*per RS232 Schnittstelle (V24 PC-Pegel) ansteuerbar (also nahezu sowohl über PC als auch alle Boards Max232 etc. z.B. rn-Board Serie) &lt;br /&gt;
*per RS232 TTL Pegel ansteuerbar (falls Board kein Max besitzt)&lt;br /&gt;
*per I2C-Bus ansteuerbar (Slave ID kann per Tasten gewählt werden)&lt;br /&gt;
*per RS485 ansteuerbar (in der derzeitigen Firmware wird jedoch noch kein Netzwerk oder spezielles Protokoll unterstützt). Endwiderstände sind über Jumper aktivierbar. &lt;br /&gt;
*Spezieller RS232 RING Modus. In dieser Betriebsart kann das Board quasi in Reihe mit anderen RS232 Boards geschaltet werden. Dazu verfügt RN-KeyLCD sowohl über eine 3 polige RS232 Ein- und eine dreipolige Ausgangsstiftleiste. Auf diese Weise werden kann das Board also zwischen andere Board´s geschaltet werden. Die Daten werden von RN-KeyLCD automatisch weitergeleitet als auch auf dem Display angezeigt. Dies kann nützlich sein wenn man den Datenaustausch anderer Boards beobachten möchte.&lt;br /&gt;
*Hex-Mode – alle eingehenden Bytes werden in diesem Mode Hexadezimal angezeigt. Ein sehr hilfreicher Mode wenn man Schnittstellen/Protokolle prüfen will&lt;br /&gt;
*LCD-Menü um Einstellungen wie SlaveID, Baudrate, Mode einzustellen&lt;br /&gt;
*Wahlweise bei Tastendruck Interrupt am I2C-Bus auslösbar&lt;br /&gt;
*RN-KeyLCD kann wahlweise über den [[I2C]]Bus mit Spannung versorgt werden, dadurch ist keine weitere Kabelverbindung notwendig&lt;br /&gt;
*Durch eine vorhandene Spannungsstabilisierung kann das Board auch mit Spannungen zwischen 6V und ca. 18V betrieben werden. &lt;br /&gt;
*Beleuchtetes Display einfach steckbar (kann jederzeit wieder entnommen werden). Es werden sowohl blaue als auch grün/gelbe Displays unterstützt.&lt;br /&gt;
*Display Kontrast regelbar&lt;br /&gt;
*Beleuchtung per Software ein- und ausschaltbar um Batteriekapazität zu sparen&lt;br /&gt;
*Andere Display können über eine Standard Wannenstecker extern angeschlossen werden  (derzeit werden nur 4x20 Zeichen Displays mit KS0073 Controller in der Firmware berücksichtigt)&lt;br /&gt;
*Umlaute werden automatisch umgesetzt, so das Ausgaben wie Print &amp;quot;schön&amp;quot; auch richtig auf dem LCD erscheinen. &lt;br /&gt;
*Automatisches Scrolling (Text verschiebt sich wenn letzte Zeile und Zeichen erreicht ist)&lt;br /&gt;
*Matrix Tastatur nur gesteckt und angeschraubt – jederzeit abnehmbar&lt;br /&gt;
*Tastatureingaben werden in Ringbuffern zwischengespeichert. Der Abruf erfolgt als ASCII oder Scancode (gleichzeitig gedrückte Tasten können so ermittelt werden)&lt;br /&gt;
*Eingebauter Lautsprecher für Tastenbestätigung &lt;br /&gt;
*Wahlweise können Tastenbetätigungen auch automatisch nach jeder Betätigung per RS232 als ASCII-Zeichen versendet werden&lt;br /&gt;
*Alle IC´s gesockelt&lt;br /&gt;
*Profis können bei Bedarf auch eigene Firmware entwickeln / ISP-Programmierstecker ist vorhanden / Schaltplan  ist offengelegt&lt;br /&gt;
*Roboternetz kompatible Platine (halbes Euroformat) und Stecker ([[RN-Definitionen]])&lt;br /&gt;
*Deutsche Doku mit Beispielen&lt;br /&gt;
&lt;br /&gt;
Alles in allem ein Board das sicher etwas teuerer ist als ein reines LCD-Display, aber die vielfältigen Einsatzmöglichkeiten sorgen dafür das dieses sicher nicht so schnell in einer Ablage verschwindet. Insbesondere die schnelle Anschlussmöglichkeit per RS232 wird ein PC mit [[Terminalprogramm]] oft überflüssig machen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===RN-KeyLCD - Befehlsübersicht===&lt;br /&gt;
Die Ansteuerung von RN-KeyLCD ist recht einfach, jedes Zeichen (Byte) welches per RS232, RS485 oder I2C empfangen wird, erscheint als ASCII-Zeichen auf dem LCD, die Cursorposition wird dabei automatisch eine Stelle weiter gerückt. Ist das Zeilenende erreicht wird die nächste Zeile beschrieben. Wird das letzte Zeichen der letzten Zeile beschrieben, so verschiebt sich automatisch der Bildschirminhalt um eine Zeile nach oben (Autoscolling). Auf diese Weise werden also stets die letzten 4 Zeilen angezeigt.&lt;br /&gt;
&lt;br /&gt;
Natürlich existieren auch einige Befehle um den Cursor an eine gewünschte Position zu setzen, die Anzeige zu löschen oder aber Spezialbefehle um die LED-Beleuchtung ein oder auszuschalten usw.  Diese Befehle bestehen aus einer bestimmten Bytefolge oder einem Sondercode. Auch hier ist es egal ob diese Codes per I2C-Bus, RS232 oder RS485 gesendet werden. &lt;br /&gt;
Hier ist eine Übersicht der Funktionen in dem aktuellen RN-KeyLCD Betriebsystem V 1.2  (man spricht von &amp;quot;Firmware&amp;quot;). Die Firmware kann jederzeit mit einem ISP-Programmierkabel gegen eine andere ersetzt werden, falls es zum Beispiel ein Update gibt. AVR-Profis können sich sogar eine eigene Firmware erstellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Display löschen:&lt;br /&gt;
:Bytefolge (dezimal): 12 &lt;br /&gt;
:Basic-Beispiel (RS232): &lt;br /&gt;
::Print Chr(12)&lt;br /&gt;
&lt;br /&gt;
;Carriage Return CR - Cursor  nach links auf Spalte 1 setzen&lt;br /&gt;
:Bytefolge (dezimal):  13 &lt;br /&gt;
:Basic-Beispiel (RS232): &lt;br /&gt;
::Print Chr(13)&lt;br /&gt;
&lt;br /&gt;
;Linefeed  LF 10 - Cursor  eine Zeile tiefer&lt;br /&gt;
:Bytefolge (dezimal):  10 &lt;br /&gt;
:Basic-Beispiel (RS232): &lt;br /&gt;
::Print Chr(10)&lt;br /&gt;
&lt;br /&gt;
;Cursor positionieren um an bestimmte Stelle auf dem LCD-Display zu schreiben &lt;br /&gt;
:Bytefolge (dezimal): 27 79 x y&lt;br /&gt;
:x  gibt hier die Spalte 1 bis 20 an&lt;br /&gt;
:y  gibt die Zeile 1 bis 4 an&lt;br /&gt;
:Basic-Beispiel (RS232): &lt;br /&gt;
::Print Chr(27);Chr(79);Chr(x);Chr(y)&lt;br /&gt;
&lt;br /&gt;
;Cursor sichtbar/unsichtbar (Standard ist ausgeschalteter Cursor)&lt;br /&gt;
:Bytefolge (dezimal):  27 67 x &lt;br /&gt;
:x =1 bedeutet Cursor einschalten&lt;br /&gt;
:x =0 bedeutet Cursor ausschalten&lt;br /&gt;
:Basic-Beispiel (RS232):&lt;br /&gt;
::Print Chr(27);Chr(67);Chr(0)  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;LCD Beleuchtung ein- und aussschalten&lt;br /&gt;
:Bytefolge (dezimal):  27 76 x &lt;br /&gt;
:x =1 bedeutet Licht einschalten&lt;br /&gt;
:x =0 bedeutet Licht ausschalten&lt;br /&gt;
:Basic-Beispiel (RS232):&lt;br /&gt;
::Print Chr(27);Chr(76);Chr(0)  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Ein Zeichen aus Tastaturbuffer als Scancode senden &lt;br /&gt;
:Durch senden dieses Befehles wird eine Taste die zwischenzeitlich im Tastaturbuffer gespeichert ist,  als Scancode (2 Byte) per RS232 zurückgesendet. Der Scancode hat den Vorteil das auch gleichzeitig gedrückte Tasten vom Steuerboard ermittelt werden können. &lt;br /&gt;
:Bytefolge (dezimal):  27 120&lt;br /&gt;
:Basic-Beispiel (RS232):&lt;br /&gt;
::Print Chr(27);Chr(120)  &lt;br /&gt;
&lt;br /&gt;
:Nach dem Befehl sendet RN-KeyLCD zuerst das Low und dann das High Byte des Scancodes. Die Bedeutung des Scancodes ist weiter unten erläutert.&lt;br /&gt;
&lt;br /&gt;
;Ein Zeichen aus Tastaturbuffer als ASCII Zeichen senden &lt;br /&gt;
Durch senden dieses Befehles wird eine Taste die zwischenzeitlich im Tastaturbuffer gespeichert ist,  als Ascii-Zeichen (1 Byte) per RS232 zurückgesendet. Der ASCII-Code hat den Vorteil das nur 1 Byte erforderlich ist und sehr einfach ivom Steuerboard weiterverarbeitet werden kann. Der Nachteil gegenüber dem Scancode besteht darin, das das gleichzeitige drücken von Tasten kein gültiges Zeichen ergeben.&lt;br /&gt;
:Bytefolge (dezimal):  27 121&lt;br /&gt;
:Basic-Beispiel (RS232):&lt;br /&gt;
::Print Chr(27);Chr(121)  &lt;br /&gt;
:Als Rückgabe wird das ASCII-Zeichen geliefert, das auch auf der Matrixtastatur abgebildet ist. Bei gleichzeitigem Betätigen von mehreren Tasten wird ein &amp;quot;?&amp;quot; gesendet. &lt;br /&gt;
&lt;br /&gt;
;AUTOSEND-Modus - Gedrückte Tasten automatisch nach Tastenbetätigung senden&lt;br /&gt;
:Durch diesen Befehl wird ein Modus aktiviert, welcher eine gedrückte Tasten sofort nach der Eingabe per RS232 gesendet. Je nach gewählten Modus (siehe nächsten Befehl TASTENCODE-Modus) wird das Tastaturereignis als 1 Byte ASCII-Code oder als 2 Byte Scancode gesendet. &lt;br /&gt;
Die zuvor beschriebenen &amp;quot;Abholbefehle&amp;quot; sind in diesem Fall nicht notwendig bzw. möglich. Dieser Mode bleibt solange aktiviert bis er abgeschaltet wird . Nach einem Reset bzw. Neustart wird er automatisch aktiviert. Im I2C-Modus ist diese Betriebsart nicht möglich, dort wird dieser Mode automatisch ignoriert.&lt;br /&gt;
Bytefolge (dezimal):  27 122 x &lt;br /&gt;
:x =1 bedeutet Automode aktiv &lt;br /&gt;
:x =0 bedeutet Automode ausgeschaltet&lt;br /&gt;
:Basic-Beispiel (RS232):&lt;br /&gt;
::Print Chr(27);Chr(122);Chr(0) &lt;br /&gt;
&lt;br /&gt;
;TASTENCODE-Modus - Scancode und ASCII-Mode für Autosend und I2C-Abruf umschalten&lt;br /&gt;
:Durch diesen Befehl kann man wählen ob die Tastatureingaben im Autosend-Modus (siehe Befehl zuvor) per Ascii-Zeichen oder als 2 Byte Scancode gesendet werden sollen.&lt;br /&gt;
Nach dem Einschalten ist generell der ASCII-Modus aktiviert.&lt;br /&gt;
Mit diesem Befehl wird gleichzeitig im I2C-Mode die Art des Tastaturzeichenabrufes bestimmt. Per I2C müssen immer zwei Byte abgerufen werden. Im Ascii-Modus befindet sich dann im ertsen Byte das entsprechende ASCII-Zeichen des Tastaturfeldes. Im zweiten Byte steht immer 128!&lt;br /&gt;
Im Scancode-Modus steht jedes Bit der beiden Bytes für eine Taste!&lt;br /&gt;
:Bytefolge (dezimal):  27 119 x &lt;br /&gt;
:x =1 bedeutet Scancode-Modus aktiv &lt;br /&gt;
:x =0 bedeutet ASCII Mode aktiv&lt;br /&gt;
:Basic-Beispiel (RS232):&lt;br /&gt;
::Print Chr(27);Chr(119);Chr(1) &lt;br /&gt;
&lt;br /&gt;
;Tastaturspeicher löschen (alle bisher gedrückten Tasten löschen)&lt;br /&gt;
:Bytefolge (dezimal): 27 123 &lt;br /&gt;
:Basic-Beispiel (RS232):&lt;br /&gt;
::Print Chr(27);Chr(123) &lt;br /&gt;
&lt;br /&gt;
;Zeige Copyright und Firmware Version über RS232&lt;br /&gt;
:Bytefolge (dezimal):  27 200 &lt;br /&gt;
:Basic-Beispiel (RS232):&lt;br /&gt;
::Print Chr(27);Chr(200)  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Hinweise zum I2C-Modus===&lt;br /&gt;
Die Ansteuerung im I2C-Mode ist völlig identisch mit dem RS232-Mode. Wird ein Byte über I2C gesendet, so wird dieses ebenfalls auf dem LCD-Display ausgegeben. Sondercodes werden genau wie oben beschrieben behandelt.&lt;br /&gt;
Tastatureingaben werden per I2C allerdings stets über einen Lesebefehl (SlaveID + 1) angefordert, da der I2C-Bus das automatische senden von I2C-Slave Board´s nicht erlaubt.&lt;br /&gt;
&lt;br /&gt;
Gelesen werden aus RN-KeyLcd stets 2 Byte. Je nach Tastencode-Modus (siehe oben) müssen die Bytes unterschiedlich interpretiert werden.&lt;br /&gt;
Im ASCII-Modi enthält das erste Byte das aufgedruckte Tastenfeld-Zeichen als ASCII-Code. Das zweite Byte enthält immer  den Wert 128 und braucht in diesem Mode nicht weiter beachtet zu werden. Es kann jedoch zur Erkennung des Modus genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Im Scancode-Modus steht jedes Bit der beiden Bytes für eine Taste.&lt;br /&gt;
&lt;br /&gt;
Erläuterung des Scancode:&lt;br /&gt;
&lt;br /&gt;
;Low Byte (erste abgerufene Byte):&lt;br /&gt;
&lt;br /&gt;
{{Registertabelle8Bit|Taste8|Taste7|Taste6|Taste5|Taste4|Taste3|Taste2|Taste1}}&lt;br /&gt;
&lt;br /&gt;
;High Byte (zweite abgerufene Byte)&lt;br /&gt;
&lt;br /&gt;
{{Registertabelle8Bit|ASCII-Mode|-|-|-|-|Taste11|Taste10|Taste9}}&lt;br /&gt;
&lt;br /&gt;
Bit 3 bis 6 = derzeit in der Firmware nicht genutzt / Bit 7 = Steht auf 1, wenn ASCII-Mode aktiviert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die hier beschriebenen Befehle werden alle außer Kraft gesetzt, wenn RN-KeyLCD per Tasten in den Hex-Mode (siehe nächste Seiten) geschaltet wird.&lt;br /&gt;
&lt;br /&gt;
Erwähnenswert ist noch, dass wegen der verwendeten Matrixtastatur die genauen Tastenkombinationen nur dann ermittelt werden können, wenn einzelne oder ein bzw. zwei Tasten gleichzeitig gedrückt werden. Werden noch mehr Tasten gleichzeitig gedrückt, so gibt es einige Sonderfälle bei bestimmten Tastenkombinationen  wo weitere Scancode-Bits gesetzt werden. Dies sollte dann bei der Abfrage berücksichtigt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===RN-KeyLCD Einstellungen===&lt;br /&gt;
&lt;br /&gt;
Einige wichtige Einstellungen sind bei RN-KeyLCD direkt über die vorhandene Matrixtastatur möglich, dazu muss kein Steuerboard oder PC angeschlossen sein. &lt;br /&gt;
&lt;br /&gt;
Direkt nach dem das Board durch einschalten der Betriebsspannung aktiviert wurde, meldet sich dieses mit folgender Einschaltmeldung&lt;br /&gt;
&lt;br /&gt;
[[Bild:rnkeylcdeinstellungen1.gif|center|300px]]&lt;br /&gt;
&lt;br /&gt;
Dies ist im übrigen gleich ein guter Test, falls man das Board selbst aufgebaut hat (Bausatz). Erscheint keine Meldung, dann sollte man Jumper und Spannungsversorgung prüfen.&lt;br /&gt;
&lt;br /&gt;
'''Folgende Funktionen stehen zur Verfügung:'''&lt;br /&gt;
&lt;br /&gt;
====Hardware-RESET mit Grundstellung====&lt;br /&gt;
Werden die Tasten 1,4 und 7 gleichzeitig gedrückt, so werden Betriebsmode, I2C-Slave ID, Autosend, Baudrate wieder  in die ursprüngliche Grundstellung gebracht und ein RESET ausgelöst.&lt;br /&gt;
Das bedeutet das Board befindet sich dann im RS232-Mode mit 9600 Baud, Autosend aktiviert und SlaveID Hex 40 wird vorgegeben.  Ein eventueller Hexmode wird auch deaktiviert.&lt;br /&gt;
Diese Tastenkombination ist eigentlich nur sehr selten notwendig.&lt;br /&gt;
&lt;br /&gt;
====HEX-Mode Ein- und Ausschalten====&lt;br /&gt;
Werden die Tasten 1 und # gleichzeitig gedückt, so schalte man den Hexmode ein. Ist de rHexmode bereits eingeschaltet so führt ein erneutes drücken zur Abschaltung des HEX-Mode.&lt;br /&gt;
Im sogenannten Hex-Mode werden alle eingehenden Zeichen (egal in welchem Schnittstellenmodus RS232, RS232RING, I2C, RS485) als Hexadezimalzahl dargestellt. Dies kann sehr hilfreich sein wenn man bestimmte Schnittstellen oder Protokolle überprüfen will. &lt;br /&gt;
Im Hexmode werden keine Sonderbefehle ausgeführt damit alle Bytes von 0 bis 255 auch wirklich unverändert dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
====Display löschen====&lt;br /&gt;
Durch gleichzeitig drücken der Tasten # und 3 wird das LCD-Display gelöscht, Tastaturbuffer und I2C-Befehlsspeicher gelöscht. Der Cursor wird auf Home-Position gebracht. Dies ist sinnvoll wenn man bestimmte Bytefolgen verfolgen will und etwas Platz und Übersicht braucht, insbesondere im Hex-Mode. Einstellungen werden nicht verändert, auch Autosend-, Scan- oder Hexmode! werden nicht geändert.&lt;br /&gt;
&lt;br /&gt;
====Grundeinstellungen per LCD-Menü====&lt;br /&gt;
Durch gleichzeitiges drücken der Tasten 1 und 2 kommt man in ein Menü wo verschiedene Einstellungen gewählt werden können.  Siehe nächstes Kapitel.&lt;br /&gt;
&lt;br /&gt;
===LCD-Einstellungsmenü===&lt;br /&gt;
Durch gleichzeitiges drücken der Tasten 1 und 2 kommt man in ein Menü wo verschiedene Einstellungen gewählt werden können. &lt;br /&gt;
&lt;br /&gt;
Nach dem drücken der Tasten sieht das Menü in etwa so aus (Slave ID auf Bild stimmt nicht):&lt;br /&gt;
&lt;br /&gt;
[[Bild:rnkeylcdeinstellungen2.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
Mit folgenden Tasten können nun folgende Eigenschaften umgeschaltet werden:&lt;br /&gt;
&lt;br /&gt;
;Taste&lt;br /&gt;
Betriebsmodus, also die Schnittstelle die genutzt werden soll&lt;br /&gt;
Wählbar ist: RS232 , I2C , RS232 RING , RS485&lt;br /&gt;
&lt;br /&gt;
====Erläuterung der Modi====&lt;br /&gt;
&lt;br /&gt;
;RS232: In diesem Modus werden alles Eingaben und Steuerbefehle über die dreipolige Stiftleiste RS232 erwartet. Wird das IC1 und IC3 aus der Fassung entfernt, so kann das Board auch über die 4 polige Stiftleiste RS232TTL  im TTL-Pegel angesteuert werden. &lt;br /&gt;
[[Bild:rnkeylcdmoders232.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;RS232RING: Dies ist eine besondere Betriebsart, hier wird das Board zwar auch über die 3 polige RS232 Schnittstelle angesteuert, jedoch wird ein zweites beliebiges Board ebenfalls per RS232 mit einer zweiten dreipoligen Stiftleiste NEXTRS verbunden. Zudem muss der Jumper JP6 entfernt werden. Alle eingehenden Daten werden wie üblich auf dem Display dargestellt, jedoch zugleich an das zweite angeschlossene RS232 Board weitergegeben. Die Rückgaben des zweiten Boardes werden dann als Rückgabe von RN-KeyLCD ebenfalls zurückgegeben. Dieser Betriebsart erlaubt also die Zwischenschaltung von RN-KeyLCD  in bestehende RS232 Verbindungen. Dies kann nützlich sein, wenn man die gesendeten Daten sichtbar verfolgen will. &lt;br /&gt;
[[Bild:rnkeylcdmoders232ring.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;I2C: In diesem Modus erfolgt die Steuerung von RN-KeyLCD komplett über den I2C-Bus. Alle Bytes die über den I2C Bus gesendet werden, werden identisch wie die RS232 Bytes behandelt. Die Standard I2C-Slave ID Vorgabe ist Hex 40 (anders als im Bild gezeigt)&lt;br /&gt;
[[Bild:rnkeylcdmodersi2c.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;RS485: In diesem Modus werden die Daten über eine RS485 Verbindung empfangen und gesendet. Gewöhnlich steht das Board immer im Empfangsmodus- Lediglich bei Abruf von Tastaturereignissen sowie im AUTOSEND-Mode schaltet das Board automatisch ganz kurz auf senden um. Wenn dieser Modus genutzt wird, muss IC1 aus der Fassung entfernt werden und IC3 vorhanden sein.&lt;br /&gt;
Ein spezielles RS485 Protokoll wird derzeit nicht unterstützt, daher eignet sich dieser Modus vorwiegend auch zur Kontrolle von RS485 Verbindungen. &lt;br /&gt;
[[Bild:rnkeylcdmoders485.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Taste 5&lt;br /&gt;
Baudrate, also die Übertragunsgeschwindigkeit der RS232 Schnittstelle&lt;br /&gt;
Wählbar ist: 300, 2400, 9600, 19200, 38400 Baud&lt;br /&gt;
&lt;br /&gt;
;Taste 6&lt;br /&gt;
I2C-Slave ID, also die Slave-Adresse über die RN-KeyLCD angesteuert werden soll. Es kann eine beliebige I2C-Slave ID gewählt werden. Somit kann man auch sehr viele RN-KeyLCD Board´s an einem Bus (I2C Kabel) nutzen und getrennt ansprechen. Zudem ist eine wählbare ID sehr günstig wenn man beispielsweise im Hex-Mode die Sendung an ein anderes I2C-Board kontrollieren will.&lt;br /&gt;
Durch die Taste 6 wird die ID immer um 2 erhöht und beginnt dann schließlich wieder bei 2 von vorn. Über die Taste 7 kann man in größeren Schritten umschalten. &lt;br /&gt;
&lt;br /&gt;
;Taste #&lt;br /&gt;
Durch drücken dieser Taste werden die Einstellungen fest gespeichert und das Menü verlassen. Die Einstellungen bleiben auch erhalten wenn das Board von der Spannung getrennt wird!&lt;br /&gt;
Wurde die SLAVE ID geändert, so wird nach dem Speichern automatisch ein RESET durchgeführt.&lt;br /&gt;
&lt;br /&gt;
===Beispiele wie man RNKeyLCD nutzen kann===&lt;br /&gt;
&lt;br /&gt;
Die Ansteuerung von RN-KeyLCD ist über alle Schnittstellen denkbar einfach. Um das übersichtlich zu demonstrieren hier ein paar kleine Bascom Basic-Programme. Verwendet wurde hier das recht beliebte Board RN-Control, natürlich läßt es sich ähnlich auch mit anderen Board´s oder Programmiersprachen ansteuern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====So einfach geht’s per RS232====&lt;br /&gt;
Bei diesem einfachen RN-Control Beispiel werden die rs232 Anschlüsse von rn-Control und rn-KeyLCD über eine 3 polige Leitung verbunden. Das Board RN-KeyLCD versorgt man daher am besten mit einer externen Spannungsquelle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'rnkeylcd_rs232.bas&lt;br /&gt;
'Beispiel: zu RN-KeyLCD&lt;br /&gt;
'Das Minimalbeispiel demonstriert wie einfach Texte mit Print&lt;br /&gt;
'ausgegeben werden&lt;br /&gt;
'&lt;br /&gt;
'Autor: Frank&lt;br /&gt;
'Anleitung findet man unter http://www.Roboternetz.de im Download Bereich&lt;br /&gt;
'oder www.robotikhardware.de&lt;br /&gt;
'Weitere Beispiele sind im Roboternetz gerne willkommen!&lt;br /&gt;
'##############################################################&lt;br /&gt;
&lt;br /&gt;
' ------------- Hier die üblichen RN-Control Anweisungen --------------&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$crystal = 16000000                                         'Quarzfrequenz&lt;br /&gt;
$baud = 9600&lt;br /&gt;
' ------------- Ende der üblichen RN-Control Anweisungen --------------&lt;br /&gt;
&lt;br /&gt;
Wait 1        'Warte bis LCD bereit, falls gleicheitig Spannung eingeschaltet wird&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Das Hauptprogramm zum Ansteuern von RN-KeyLCD&lt;br /&gt;
&lt;br /&gt;
Print Chr(12);                                              'Display löschen&lt;br /&gt;
Print &amp;quot;Hallo Bastler!&amp;quot;&lt;br /&gt;
Print &amp;quot;Wenn dieser Text&amp;quot;&lt;br /&gt;
Print &amp;quot;erscheint, dann&amp;quot;                                     '&lt;br /&gt;
Print &amp;quot;klappt RS232 Modi&amp;quot; ;&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie zu erkennen ist benötigt das Hauptprogramm eigentlich nur 5 Print Befehle um alle 4 LCD-Zeilen zu beschreiben. Ein Treiber ist nicht notwendig. Aus diesem Grund kann das LCD auch an Board´s genutzt werden, die eigentlich  für ein Terminalprogramm ausgelegt sind. &lt;br /&gt;
Die erste Printzeile sendet das Byte 12. Dieser Sondercode löscht das LCD-Display, siehe Befehlstabelle in der Anleitung weiter vorne.&lt;br /&gt;
Zu beachten ist das bei der letzten Zeile ein Semikolon genutzt wird, da ansonsten der Print Befehl noch einen Zeilenvorschub senden würde, was den Display Inhalt um eine Zeile nach oben schieben würde.&lt;br /&gt;
&lt;br /&gt;
Man kann nahezu das gleiche Ergebnis erreichen, wenn man das Hauptprogramm zu einem Befehl zusammenfasst:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'Das Hauptprogramm zum Ansteuern von RN-KeyLCD&lt;br /&gt;
Print Chr(12) ; &amp;quot;Hallo Bastler! Wenn dieser Text erscheint, dann klappt RS232 Modi&amp;quot; ;&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Test wird in dem Beispiel fortlaufend ausgegeben, das heißt der Zeilenwechsel erfolgt immer wenn 20 Zeichen erreicht sind. Möchte man jedoch wieder an einer bestimmten Stelle den Zeilenvorschub, so kann man es auch so schreiben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'Das Hauptprogramm zum Ansteuern von RN-KeyLCD&lt;br /&gt;
&lt;br /&gt;
Print Chr(12) ; &amp;quot;Hallo Bastler!&amp;quot; ; Chr(13) ; Chr(10) ; &amp;quot;Wenn dieser Text&amp;quot; ; Chr(13) ; Chr(10) ;&lt;br /&gt;
      &amp;quot;erscheint, dann&amp;quot; ; Chr(13) ; Chr(10) ; &amp;quot;klappt Rs232 Modi&amp;quot; ;&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die erste Form ist diesbezüglich sicher übersichtlicher, es sollte nur zum Verständnis gezeigt werden.&lt;br /&gt;
 &lt;br /&gt;
Müssen Daten gezielt  an eine bestimmte Stelle auf dem LCD-Display geschrieben werden, so kann man vor den Ausgabecursor (der normalerweise unsichtbar ist) an eine bestimmte Position setzen.&lt;br /&gt;
Das nachfolgende Beispiel demonstreirt wie man zum Beispiel zwei Textausgaben an genau definierter Stelle ausgibt: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'Das Hauptprogramm zum Ansteuern von RN-KeyLCD&lt;br /&gt;
Print Chr(12) ;                                             ' LCD löschen&lt;br /&gt;
Print Chr(27) ; Chr(79) ; Chr(5) ; Chr(2);                  'Cursor in Zeile 2 Spalte 5&lt;br /&gt;
Print &amp;quot;Zeile2 Spalte 5&amp;quot; ;&lt;br /&gt;
Print Chr(27) ; Chr(79) ; Chr(10) ; Chr(4);                 'Cursor in Zeile 4 Spalte 10&lt;br /&gt;
Print &amp;quot;Zeile4/S10&amp;quot; ;&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie zu erkennen ist, wird der Cursor über Print-Anweisung an eine beliebige Stelle gesetzt. Der anschließende Print Befehl gibt dann genau dort die nächsten Zeichen aus.&lt;br /&gt;
&lt;br /&gt;
Wenn man die Chr()-Codes nicht so sehr mag, dann kann man sich in der jeweiligen Programmiersprache auch sehr einfach ein paar übersichtliche Befehle definieren. Im nächsten Beispiel wurde beispielsweise ein Befehl zur Cursor-Positionierung und zur Bildschirmlöschung definiert. Das Hauptprogramm ist dadurch viel übersichtlicher und zugleich kürzer:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'&lt;br /&gt;
'###################################################&lt;br /&gt;
'rnkeylcd_rs232_test5.bas&lt;br /&gt;
'##############################################################&lt;br /&gt;
&lt;br /&gt;
Declare Sub Rnlcd_cursor(byval Spalte As Byte , Byval Zeile As Byte)&lt;br /&gt;
Declare Sub Rnlcd_clr()&lt;br /&gt;
&lt;br /&gt;
' ------------- Hier die üblichen RN-Control Anweisungen --------------&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$crystal = 16000000                                         'Quarzfrequenz&lt;br /&gt;
$baud = 9600&lt;br /&gt;
' ------------- Ende der üblichen RN-Control Anweisungen --------------&lt;br /&gt;
&lt;br /&gt;
Wait 1        'Warte bis LCD bereit, falls gleicheitig Spannung eingeschaltet wird&lt;br /&gt;
&lt;br /&gt;
'Das Hauptprogramm zum Ansteuern von RN-KeyLCD&lt;br /&gt;
&lt;br /&gt;
Rnlcd_clr&lt;br /&gt;
Rnlcd_cursor 5 , 2&lt;br /&gt;
Print &amp;quot;Zeile2 Spalte 5&amp;quot; ;&lt;br /&gt;
Rnlcd_cursor 10 , 4&lt;br /&gt;
Print &amp;quot;Zeile4/S10&amp;quot; ;&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Die speziellen Befehle für das Board RN.KeyLCD:&lt;br /&gt;
&lt;br /&gt;
Sub Rnlcd_cursor(byval Spalte As Byte , Byval Zeile As Byte)&lt;br /&gt;
  Print Chr(27) ; Chr(79) ; Chr(spalte) ; Chr(zeile);&lt;br /&gt;
End Sub&lt;br /&gt;
&lt;br /&gt;
Sub Rnlcd_clr()&lt;br /&gt;
  Print Chr(12);&lt;br /&gt;
End Sub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die oberen Stack-Anweisungen sind in dem Beispiel eigentlich nicht notwendig, allerdings sollte man sich angewöhnen diese einzufügen sobald man mit Funktionen hantiert. Ansonsten kann es schnell vorkommen das ein zu klein definierter Stack zu Programmfehlern führt.&lt;br /&gt;
In dem Beispiel wurden nur 2 LCD-Befehle definiert, man kann natürlich noch eine ganze Reihe eigener Befehle hinzufügen, allerdings reichen diese beiden schon für fast alle Ausgaben aus.&lt;br /&gt;
&lt;br /&gt;
Das nachfolgende Beispiel zeigt wie man zum Beispiel in der Mitte des Display langsam eine hochzählende Zahl sieht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'Das Hauptprogramm zum Ansteuern von RN-KeyLCD&lt;br /&gt;
Dim I As Word&lt;br /&gt;
&lt;br /&gt;
Rnlcd_clr&lt;br /&gt;
Rnlcd_cursor 5 , 2&lt;br /&gt;
Print &amp;quot;Zähler:&amp;quot;&lt;br /&gt;
Do&lt;br /&gt;
  Rnlcd_cursor 14 , 2&lt;br /&gt;
  Print I&lt;br /&gt;
  I = I + 1&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;
Und noch ein letztes Ausgabebeispiel  welches das Scrolling zeigt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'Das Hauptprogramm zum Ansteuern von RN-KeyLCD&lt;br /&gt;
Dim I As Word&lt;br /&gt;
&lt;br /&gt;
Rnlcd_clr&lt;br /&gt;
Do&lt;br /&gt;
  Print&lt;br /&gt;
  Print &amp;quot;Das ist Zeile : &amp;quot; ; I;&lt;br /&gt;
  I = I + 1&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;
Damit dürfte klar sein wie die Ausgabe funktioniert. Wie man andere Befehle zum Ein- und Ausschalten des Cursors, zum deaktivieren der Beleuchtung usw. sendet, dürfte jetzt auch kein Problem mehr sein.&lt;br /&gt;
&lt;br /&gt;
====Die Tastenabfrage im RS232Modus====&lt;br /&gt;
&lt;br /&gt;
Die Tastenabfrage ist im RS232-Modus ebenfalls sehr einfach. Wie schon aus der Befehlsübersicht zu ersehen ist, gibt es eine ganze Reihe von Möglichkeiten die Tasten abzufragen. Das erste Beispiel demonstriert den AUTOSEND-Mode im ASCII-Format. Dies ist der Modus, der in der Grundeinstellung festgelegt ist. Jedesmal wenn eine Taste gedrückt wird, wird diese per RS232 an das Steuerboard gesendet.&lt;br /&gt;
In dem unteren Beispiel werden diese tastenbytes Empfangen und gleich zur Kontrolle auch auf dem LCD ausgegeben. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'Das Hauptprogramm zum Ansteuern von RN-KeyLCD&lt;br /&gt;
Dim Taste As Byte&lt;br /&gt;
&lt;br /&gt;
Rnlcd_clr&lt;br /&gt;
Do&lt;br /&gt;
  If Ischarwaiting() = 1 Then&lt;br /&gt;
    Taste = Inkey()&lt;br /&gt;
    Print &amp;quot;Taste: &amp;quot; ; Chr(taste)&lt;br /&gt;
  End If&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;
Drücken Sie nach dem Starten mal beliebige Tasten. Das ganze funktioniert also äußerst einfach. Über eine IF-Anweisung oder Select-Case  Befehl könnte man nun den Tasten verschiedene Aufgaben zuweisen, z.B. Roboter vorfahren, rückwärts fahren, staubsaugen oder halt ganz andere Dinge.&lt;br /&gt;
Lediglich gleichzeitig gedrückte Tasten  sind in diesem Mode nicht möglich, dafür werden automatisch Fragezeichen gesendet.&lt;br /&gt;
&lt;br /&gt;
Der Scanmodus  erlaubt aber auch das Betätigen mehrerer gleichzeitiger Tasten denn hier werden immer 2 Byte empfangen, wobei jedes Bit für eine Taste steht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'Das Hauptprogramm zum Ansteuern von RN-KeyLCD&lt;br /&gt;
Dim Tlow As Byte&lt;br /&gt;
Dim Thigh As Byte&lt;br /&gt;
&lt;br /&gt;
Print Chr(27) ; Chr(119) ; Chr(1)                           'Tasten Scanmodus aktivieren&lt;br /&gt;
Rnlcd_clr&lt;br /&gt;
Do&lt;br /&gt;
  Tlow = Waitkey()&lt;br /&gt;
  Thigh = Waitkey()&lt;br /&gt;
  Print &amp;quot;Low: &amp;quot; ; Tlow ; &amp;quot; High:&amp;quot; ; Thigh&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 obere Byte schaltet durch einen Print Befehl den Scancode-Modus ein. Anschließend empfängt es den Scancode und gibt beide Bytes auf dem LCD aus. Dies ist recht hilfreich zum Verständnis. Geben Sie das Beispiel mal ein und klicken Sie auch mehrere Tasten gleichzeitig. Die Tastenwerte werden dadurch addiert. &lt;br /&gt;
&lt;br /&gt;
Das nachfolgende Beispiel demonstriert wie man in Bascom Basic die einzelnen Bits abfragt und somit den Tasten bestimmte Aufgaben zuweist. In dem Beispiel wird für jede Taste nur das Wort  &amp;quot;Aufgabe x&amp;quot;  ausgegeben, jedoch hätte man statt diesem Print-Befehl natürlich auch ein Funktionsaufruf oder ein Gosub Befehl einfügen können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'Das Hauptprogramm zum Ansteuern von RN-KeyLCD&lt;br /&gt;
Dim Tlow As Byte&lt;br /&gt;
Dim Thigh As Byte&lt;br /&gt;
&lt;br /&gt;
Print Chr(27) ; Chr(119) ; Chr(1)                           'Tasten Scanmodus aktivieren&lt;br /&gt;
Rnlcd_clr&lt;br /&gt;
Do&lt;br /&gt;
  Tlow = Waitkey()&lt;br /&gt;
  Thigh = Waitkey()&lt;br /&gt;
&lt;br /&gt;
  If Tlow.0 = 1 Then Print &amp;quot;Aufgabe 1&amp;quot;&lt;br /&gt;
  If Tlow.1 = 1 Then Print &amp;quot;Aufgabe 2&amp;quot;&lt;br /&gt;
  If Tlow.2 = 1 Then Print &amp;quot;Aufgabe 3&amp;quot;&lt;br /&gt;
  If Tlow.3 = 1 Then Print &amp;quot;Aufgabe 4&amp;quot;&lt;br /&gt;
  If Tlow.4 = 1 Then Print &amp;quot;Aufgabe 5&amp;quot;&lt;br /&gt;
  If Tlow.5 = 1 Then Print &amp;quot;Aufgabe 6&amp;quot;&lt;br /&gt;
  If Tlow.6 = 1 Then Print &amp;quot;Aufgabe 7&amp;quot;&lt;br /&gt;
  If Tlow.7 = 1 Then Print &amp;quot;Aufgabe 8&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  If Thigh.0 = 1 Then Print &amp;quot;Aufgabe 9&amp;quot;&lt;br /&gt;
  If Thigh.1 = 1 Then Print &amp;quot;Aufgabe 10&amp;quot;&lt;br /&gt;
  If Thigh.2 = 1 Then Print &amp;quot;Aufgabe 11&amp;quot;&lt;br /&gt;
  If Thigh.3 = 1 Then Print &amp;quot;Aufgabe 12&amp;quot;&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 besondere bei dieser Abfrage ist, das durch gleichzeitiges betätigen von Tasten auch quasi gleichzeitig mehrere Aufgaben ausgeführt werden. &lt;br /&gt;
&lt;br /&gt;
Bislang haben wir nur gesehen wie Tasten im AUTOSEND-Modus abgefragt werden. Wie schon erläutert sendet RN-KeyLCD iin diesem Modi automatisch die Tasten direkt nach der Eingabe. Es gibt aber Aufgaben bei denen das Hauptboard nicht genügend Zeit hat um ständig die Tasten abzufragen, somit gingen in dieser Betriebsart eventuell Tasten verloren. Für diesen Zweck gibt es  auch eine Möglichkeit bei der Tasten in RN-KeyLCD zwischengespeichert  werden. Die Tasten können dann nacheinander vom Hauptboard abgerufen werden, sobald dafür Zeit ist.  Für diesen Zweck haben wir im nachfolgenden Beispiel gleich eine spezielle Funktion definiert welche die beiden Scancode-Bytes abruft und zu einer WORD Variable zusammenfügt. Diese Methode  erleichtert die Weiterverabeitung des Scancodes, denn für jede Taste ist ein Bit der WORD Variablen zuständig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'rnkeylcd_rs232_test11.bas&lt;br /&gt;
'##############################################################&lt;br /&gt;
&lt;br /&gt;
Declare Sub Rnlcd_cursor(byval Spalte As Byte , Byval Zeile As Byte)&lt;br /&gt;
Declare Sub Rnlcd_clr()&lt;br /&gt;
Declare Function Rnlcd_getscan() As Word&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
' ------------- Hier die üblichen RN-Control Anweisungen --------------&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$crystal = 16000000                                         'Quarzfrequenz&lt;br /&gt;
$baud = 9600&lt;br /&gt;
' ------------- Ende der üblichen RN-Control Anweisungen --------------&lt;br /&gt;
&lt;br /&gt;
Wait 1        'Warte bis LCD bereit, falls gleicheitig Spannung eingeschaltet wird&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Das Hauptprogramm zum Ansteuern von RN-KeyLCD&lt;br /&gt;
Dim Taste As Word&lt;br /&gt;
Print Chr(27) ; Chr(122) ; Chr(0);                          'Autosend deaktivieren&lt;br /&gt;
Print Chr(27) ; Chr(119) ; Chr(1);                          'Tasten Scanmodus aktivieren&lt;br /&gt;
Rnlcd_clr&lt;br /&gt;
Do&lt;br /&gt;
  Taste = Rnlcd_getscan()&lt;br /&gt;
  If Taste &amp;lt;&amp;gt; 0 Then&lt;br /&gt;
     Print &amp;quot;Taste: &amp;quot; ; Taste&lt;br /&gt;
  End If&lt;br /&gt;
  Wait 3                                                    ' 3 Sekunden Pause um Zwischenspeicher zu demonstrieren&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Die speziellen Befehle für das Board RN.KeyLCD:&lt;br /&gt;
&lt;br /&gt;
Sub Rnlcd_cursor(byval Spalte As Byte , Byval Zeile As Byte)&lt;br /&gt;
  Print Chr(27) ; Chr(79) ; Chr(spalte) ; Chr(zeile);&lt;br /&gt;
End Sub&lt;br /&gt;
&lt;br /&gt;
Sub Rnlcd_clr()&lt;br /&gt;
  Print Chr(12);&lt;br /&gt;
End Sub&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Scancode als Word abfragen&lt;br /&gt;
Function Rnlcd_getscan() As Word&lt;br /&gt;
Local Tlow As Byte&lt;br /&gt;
Local Thigh As Byte&lt;br /&gt;
Local Temp As Byte&lt;br /&gt;
&lt;br /&gt;
 'Diese erste Schleife löscht nur RS232 Buffer&lt;br /&gt;
  Do&lt;br /&gt;
    Temp = Inkey()&lt;br /&gt;
  Loop Until Ischarwaiting() = 0&lt;br /&gt;
&lt;br /&gt;
  Print Chr(27) ; Chr(120);     'Befehl damit RN-KeyLCD Taste auf Speicher sendet&lt;br /&gt;
  Tlow = Waitkey()&lt;br /&gt;
  Thigh = Waitkey()&lt;br /&gt;
  Rnlcd_getscan = Thigh * 256&lt;br /&gt;
  Rnlcd_getscan = Rnlcd_getscan + Tlow&lt;br /&gt;
End Function&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Hauptprogramm wurde im oberen Beispiel extra ein 3 Sekunden Wait-Befehl eingefügt bevor die nächste Taste abgerufen wird. Wenn Sie nun schnell hintereinander Tasten auf dem Tastenfaed drücken, werden diese Tasten automatisch zwischengespeichert und nacheinander vom Hauptboard abgerufen. Es geht also nix verloren, alle Tastenwerte werden nacheinander auf dem LCD ausgegeben&lt;br /&gt;
&lt;br /&gt;
Es gibt noch eine andere Funktion bei der man statt dem Scancode auch den ASCII-Code gezielt abrufen kann. Auch dort werden alle Tasten in einem Zwischenspeicher (Ringbuffer) abgelegt, die vorgehensweise ist sehr ähnlich, ein Beispiel dazu erübrigt sich daher sicherlich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Anmerkung====&lt;br /&gt;
Die Betriebsmodi RS485 und RS232Ring funktionieren auf die gleiche Weise wie der zuvor beschriebene RS232 Mode, die Beispiele können somit übernommen werden. Allerdings werden im RS232Ring-Mode die Tasten an das eingeschleifte Board weitergesendet und können nicht vom Hauptboard empfangen werden.  Der RS232RING-Mode ist also vorwiegend zur Überwachung gedacht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Die Ansteuerung per I2C-Bus===&lt;br /&gt;
&lt;br /&gt;
Obwohl die Ansteuerung von den Befehlen her betrachtet, per I2C-Bus kaum anders ist, gestaltet sich die Text-Ausgabe doch etwas anders weil halt für den I2C-Bus kein &amp;quot;print&amp;quot; Befehl exestiert.  Man muss also die Bytes und Strings entweder mit den herkömmlichen  I2C-Befehlen an das Board senden, oder bastelt sich ein paar kleine Hilfsroutinen. Die Hilfsroutinen könnte man dann später sehr einfach mit einem include-Befehl in eigene Programme integrieren. Der besseren Übersicht wegen verwenden wir in den hier gezeigten Beispielen keinen Include-Befehl.&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel mit den herkömmlichen I2C-Befehlen in Bascom-Basic:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'rnkeylcd_i2c_test1.bas&lt;br /&gt;
'Beispiel: zu RN-KeyLCD&lt;br /&gt;
'LCD und Matrixtastaturboard RN-KeyLCD wird per I2C angesteuert&lt;br /&gt;
'&lt;br /&gt;
' Achtung:&lt;br /&gt;
' Diese Demo ist mit Bascom Compiler 1.11.7.7 getestet&lt;br /&gt;
' Nur ältere Bascom Versionen benötigen eine neue Libary&lt;br /&gt;
' http://www.roboternetz.de/phpBB2/viewtopic.php?t=694&amp;amp;start=22&lt;br /&gt;
'###################################################&lt;br /&gt;
'&lt;br /&gt;
&lt;br /&gt;
' ------------- Hier die üblichen RN-Control Anweisungen --------------&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
&lt;br /&gt;
$crystal = 16000000                                         'Quarzfrequenz&lt;br /&gt;
$baud = 9600&lt;br /&gt;
Config Scl = Portc.0                                        'Ports fuer IIC-Bus&lt;br /&gt;
Config Sda = Portc.1&lt;br /&gt;
' ------------- Ende der üblichen RN-Control Anweisungen --------------&lt;br /&gt;
&lt;br /&gt;
'Hauptprogramm&lt;br /&gt;
&lt;br /&gt;
Const Rnkeylcd_slaveid_write = &amp;amp;H40                         'I2C SlaveAdresse&lt;br /&gt;
Const Rnkeylcd_slaveid_read = &amp;amp;H41&lt;br /&gt;
&lt;br /&gt;
Dim Stemp As String * 100&lt;br /&gt;
&lt;br /&gt;
Wait 1        'Warte bis LCD bereit, falls gleicheitig Spannung eingeschaltet wird&lt;br /&gt;
I2cinit&lt;br /&gt;
&lt;br /&gt;
Stemp = Chr(12)  'Löscht LCD&lt;br /&gt;
I2csend Rnkeylcd_slaveid_write , Stemp , 1&lt;br /&gt;
&lt;br /&gt;
Stemp = &amp;quot;RN-KeyLCD per I2C&amp;quot;&lt;br /&gt;
I2csend Rnkeylcd_slaveid_write , Stemp , 17&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier wird einfach eine String-Variable mit dem auszugebenden String oder auch der Befehlssequenz belegt. Der String kann dann bequem mit der Bascom Anweisung I2csend verschickt werden, es muss lediglich die SlaveID und die Länge des Strings mit angegeben werden.&lt;br /&gt;
&lt;br /&gt;
Das das ganze mit ein paar kleinen Funktionen viel bequemer geht, sieht man im nachfolgenden Beispiel. Das Hauptprogramm ist nun viel übersichtlicher. Neben zwei Strings wird nun gleich gezeigt wie man auch eine Variable an einer bestimmten Position ausgibt. Ein Zähler wird im Sekundentakt in der vierten Zeile hochgezählt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'rnkeylcd_i2c_test2.bas&lt;br /&gt;
'Beispiel: zu RN-KeyLCD&lt;br /&gt;
'LCD und Matrixtastaturboard RN-KeyLCD wird per I2C angesteuert&lt;br /&gt;
'&lt;br /&gt;
' Achtung:&lt;br /&gt;
' Diese Demo ist mit Bascom Compiler 1.11.7.7 getestet&lt;br /&gt;
' Nur ältere Bascom Versionen benötigen eine neue Libary&lt;br /&gt;
' http://www.roboternetz.de/phpBB2/viewtopic.php?t=694&amp;amp;start=22&lt;br /&gt;
'###################################################&lt;br /&gt;
'&lt;br /&gt;
&lt;br /&gt;
' ------------- Hier die üblichen RN-Control Anweisungen --------------&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
&lt;br /&gt;
$crystal = 16000000                                         'Quarzfrequenz&lt;br /&gt;
$baud = 9600&lt;br /&gt;
Config Scl = Portc.0                                        'Ports fuer IIC-Bus&lt;br /&gt;
Config Sda = Portc.1&lt;br /&gt;
' ------------- Ende der üblichen RN-Control Anweisungen --------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Declare Sub Rnlcd_cursor(byval Spalte As Byte , Byval Zeile As Byte)&lt;br /&gt;
Declare Sub Rnlcd_clr()&lt;br /&gt;
Declare Sub Rnlcd(byval Text As String)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Const Rnkeylcd_slaveid_write = &amp;amp;H40                        'I2C SlaveAdresse&lt;br /&gt;
Const Rnkeylcd_slaveid_read = &amp;amp;H41&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Hauptprogramm&lt;br /&gt;
Dim Stemp As String * 100&lt;br /&gt;
Dim I As Word&lt;br /&gt;
Wait 1        'Warte bis LCD bereit, falls gleicheitig Spannung eingeschaltet wird&lt;br /&gt;
I2cinit&lt;br /&gt;
&lt;br /&gt;
Rnlcd_clr&lt;br /&gt;
&lt;br /&gt;
Rnlcd_cursor 4 , 2&lt;br /&gt;
Rnlcd &amp;quot;Willkommen im&amp;quot;&lt;br /&gt;
Rnlcd_cursor 4 , 3&lt;br /&gt;
Rnlcd &amp;quot;Roboternetz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
 Rnlcd_cursor 4 , 4&lt;br /&gt;
 Stemp = &amp;quot;Zähler: &amp;quot; + Str(i)&lt;br /&gt;
 Rnlcd Stemp&lt;br /&gt;
 I = I + 1&lt;br /&gt;
 Wait 1&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'--------------------------------------------------------------&lt;br /&gt;
'Die speziellen I2C Befehle für das Board RN.KeyLCD:&lt;br /&gt;
&lt;br /&gt;
Sub Rnlcd_cursor(byval Spalte As Byte , Byval Zeile As Byte)&lt;br /&gt;
Local Befehle As String * 4&lt;br /&gt;
&lt;br /&gt;
  Befehle = Chr(27) + Chr(79) + Chr(spalte) + Chr(zeile)&lt;br /&gt;
  I2csend Rnkeylcd_slaveid_write , Befehle , 4&lt;br /&gt;
End Sub&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sub Rnlcd_clr()&lt;br /&gt;
Local Befehle As String * 2&lt;br /&gt;
&lt;br /&gt;
  Befehle = Chr(12)&lt;br /&gt;
  I2csend Rnkeylcd_slaveid_write , Befehle , 1&lt;br /&gt;
End Sub&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sub Rnlcd(byval Text As String)                             'Eine Art Print Befehl&lt;br /&gt;
Local Le As Word&lt;br /&gt;
  Le = Len(text)&lt;br /&gt;
  I2csend Rnkeylcd_slaveid_write , Text , Le&lt;br /&gt;
End Sub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wie man das LCD nun über I2C-Ansteuert dürfte somit klar sein. Es ist zu empfehlen die unteren LCD-Befehle in eigene Programme zu übernehmen, das erleichtert die Ansteuerung doch erheblich. Man könnte in Bascom auch eine Libary erstellen und dann die Bascom-LCD Befehle nutzen. Allerdings bringt das keine echten Vorteile und würde vermutlich etwas mehr Speicher belegen da dort unnötiger Code enthalten ist. &lt;br /&gt;
&lt;br /&gt;
Der I2C-Bus ist bei RN-KeyLCD  mit 100kBit ausgelegt. Ein Ringbuffer sorgt dafür das der I2C-Bus sehr schnell wieder freigegeben wird, somit wird der Bus vom Board kaum belastet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Tastaturabfrage per I2C-Bus====&lt;br /&gt;
&lt;br /&gt;
Die Tastaturabfrage per I2C funktioniert ähnlich wie bei der RS232-Schnittstelle mit Abrufbefehl. Per I2C-Bus gibt es keinen AUTOSEND-Befehl, das bedeutet Tasten können nicht automatisch an das Hauptboard gesendet werden, sowas ist generell über I2C nicht möglich.&lt;br /&gt;
&lt;br /&gt;
Daher muss das Hauptboard ab und zu die Tasten durch einen Lesebefehl abfragen.  Ein vorhandener  Ringspeicher sorgt dafür das keine Tasten verloren gehen, selbst wenn das Hauptboard mal nicht genug Zeit für den Abruf findet. &lt;br /&gt;
Es werden immer 2 Bytes abgerufen, egal ob sich das Board im ASCII-Modus oder im Scancode-Modus befindet. Die Bytes müssen nur unterschiedlich interpretiert werden, siehe Befehlsbeschreibung.&lt;br /&gt;
&lt;br /&gt;
In dem nachfolgenden Beispiel haben wir gleich eine Unterfunktion definiert die sowohl im Scan- als auch ASCII-Modus funktioniert. Im ASCII-Modus liefert die Funktion das ASCII-Zeichen und im ScanCode-Modus den Scancode als WORD zurück.&lt;br /&gt;
Mit Hilfe der Funktion ist die Tastenabfrage sehr einfach:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'rnkeylcd_i2c_test3.bas&lt;br /&gt;
'Beispiel: zu RN-KeyLCD&lt;br /&gt;
'LCD und Matrixtastaturboard RN-KeyLCD wird per I2C angesteuert&lt;br /&gt;
'&lt;br /&gt;
' Achtung:&lt;br /&gt;
' Diese Demo ist mit Bascom Compiler 1.11.7.7 getestet&lt;br /&gt;
' Nur ältere Bascom Versionen benötigen eine neue Libary&lt;br /&gt;
' http://www.roboternetz.de/phpBB2/viewtopic.php?t=694&amp;amp;start=22&lt;br /&gt;
'###################################################&lt;br /&gt;
'&lt;br /&gt;
&lt;br /&gt;
' ------------- Hier die üblichen RN-Control Anweisungen --------------&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$hwstack = 32&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
&lt;br /&gt;
$crystal = 16000000                                         'Quarzfrequenz&lt;br /&gt;
$baud = 9600&lt;br /&gt;
Config Scl = Portc.0                                        'Ports fuer IIC-Bus&lt;br /&gt;
Config Sda = Portc.1&lt;br /&gt;
' ------------- Ende der üblichen RN-Control Anweisungen --------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Declare Sub Rnlcd_cursor(byval Spalte As Byte , Byval Zeile As Byte)&lt;br /&gt;
Declare Sub Rnlcd_clr()&lt;br /&gt;
Declare Sub Rnlcd(byval Text As String)&lt;br /&gt;
Declare Sub Rnlcd_cr()&lt;br /&gt;
Declare Function Rnlcd_getscan() As Word&lt;br /&gt;
Declare Sub Rnlcd_scanmodus(byval Ein As Byte)        'Tastenscanmodus ein und ausschalten&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Const Rnkeylcd_slaveid_write = &amp;amp;H40                         'I2C SlaveAdresse&lt;br /&gt;
Const Rnkeylcd_slaveid_read = &amp;amp;H41&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'Hauptprogramm&lt;br /&gt;
Dim Stemp As String * 100&lt;br /&gt;
Dim Taste As Word&lt;br /&gt;
&lt;br /&gt;
I2cinit&lt;br /&gt;
&lt;br /&gt;
Rnlcd_clr&lt;br /&gt;
&lt;br /&gt;
Rnlcd_scanmodus 1                                           'Scanmodus ein&lt;br /&gt;
Do&lt;br /&gt;
 Taste = Rnlcd_getscan()&lt;br /&gt;
 If Taste &amp;lt;&amp;gt; 0 Then&lt;br /&gt;
   Stemp = &amp;quot;Taste: &amp;quot; + Str(taste)&lt;br /&gt;
   Rnlcd Stemp&lt;br /&gt;
   Rnlcd_cr&lt;br /&gt;
 End If&lt;br /&gt;
 Waitms 500&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'--------------------------------------------------------------&lt;br /&gt;
'Die speziellen I2C Befehle für das Board RN.KeyLCD:&lt;br /&gt;
&lt;br /&gt;
Sub Rnlcd_cursor(byval Spalte As Byte , Byval Zeile As Byte)       'Cursor setzen&lt;br /&gt;
Local Befehle As String * 4&lt;br /&gt;
  Befehle = Chr(27) + Chr(79) + Chr(spalte) + Chr(zeile)&lt;br /&gt;
  I2csend Rnkeylcd_slaveid_write , Befehle , 4&lt;br /&gt;
End Sub&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sub Rnlcd_clr()                                             'LCD löschen&lt;br /&gt;
Local Befehle As String * 2&lt;br /&gt;
  Befehle = Chr(12)&lt;br /&gt;
  I2csend Rnkeylcd_slaveid_write , Befehle , 1&lt;br /&gt;
End Sub&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sub Rnlcd_cr()                                              'LCD Zeilenvorschub&lt;br /&gt;
Local Befehle As String * 2&lt;br /&gt;
  Befehle = Chr(13) + Chr(10)&lt;br /&gt;
  I2csend Rnkeylcd_slaveid_write , Befehle , 2&lt;br /&gt;
End Sub&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sub Rnlcd(byval Text As String)                             'Eine Art Print Befehl&lt;br /&gt;
Local Le As Word&lt;br /&gt;
  Le = Len(text)&lt;br /&gt;
  I2csend Rnkeylcd_slaveid_write , Text , Le&lt;br /&gt;
End Sub&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Function Rnlcd_getscan() As Word                            'Scancode als Word abfragen&lt;br /&gt;
Local Lscan As Byte&lt;br /&gt;
Local Hscan As Byte&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  I2cstart&lt;br /&gt;
  I2cwbyte Rnkeylcd_slaveid_read&lt;br /&gt;
  I2crbyte Lscan , Ack&lt;br /&gt;
  I2crbyte Hscan , Nack&lt;br /&gt;
  I2cstop&lt;br /&gt;
&lt;br /&gt;
  If Hscan.7 = 1 Then                                       'AScii Modus&lt;br /&gt;
     Rnlcd_getscan= Lscan&lt;br /&gt;
  Else&lt;br /&gt;
     Rnlcd_getscan = Hscan * 256&lt;br /&gt;
     Rnlcd_getscan = Rnlcd_getscan + Lscan&lt;br /&gt;
  End If&lt;br /&gt;
&lt;br /&gt;
End Function&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sub Rnlcd_scanmodus(byval Ein As Byte)                      'Tastenscanmodus ein und ausschalten&lt;br /&gt;
Local Befehle As String * 3&lt;br /&gt;
  Befehle = Chr(27) + Chr(119) + Chr(ein)&lt;br /&gt;
  I2csend Rnkeylcd_slaveid_write , Befehle , 3&lt;br /&gt;
End Sub&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====I2C Bus Interrupt nutzen um Tastatur abzufragen=====&lt;br /&gt;
Nach den Roboternetz-Spezifikationen ist   Pin 10 des i2C-Steckers für eine Art-Interrupt Leitung reserviert. Diese Leitung wird von angeschlossenen I2C-Bus Teilnehmern genutzt um ein Ereignis zu melden. Die Spezifikation sagt, das diese Leitung auf Low gezogen wird, wenn ein Slave Daten für den Master bereithält. &lt;br /&gt;
&lt;br /&gt;
In dem nachfolgenden Beispiel nutzen wir diese Leitung bei RN-Control aus. Dafür muss lediglich der Jumper INT-Jumper bei RN-Control (siehe JP6 der RN-Control Anleitung) gesteckt werden. Bei RN-KeyLCD muss die bereits vorgesehene Lötbrücke INTMODE durch einen Lötpunkt geschlossen werden. Das war´s, nun kann im RN-Control der Interrupt ausgenutzt werden um auf Tastaturereignisse zu reagieren. Das Beispiel demonstriert es:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'###################################################&lt;br /&gt;
'rnkeylcd_i2c_test4.bas&lt;br /&gt;
'Beispiel: zu RN-KeyLCD&lt;br /&gt;
'LCD und Matrixtastaturboard RN-KeyLCD wird per I2C angesteuert&lt;br /&gt;
'&lt;br /&gt;
' Achtung:&lt;br /&gt;
' Diese Demo ist mit Bascom Compiler 1.11.7.7 getestet&lt;br /&gt;
' Nur ältere Bascom Versionen benötigen eine neue Libary&lt;br /&gt;
' http://www.roboternetz.de/phpBB2/viewtopic.php?t=694&amp;amp;start=22&lt;br /&gt;
'###################################################&lt;br /&gt;
&lt;br /&gt;
' ------------- Hier die üblichen RN-Control Anweisungen --------------&lt;br /&gt;
$regfile = &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$hwstack = 62&lt;br /&gt;
$framesize = 62&lt;br /&gt;
$swstack = 62&lt;br /&gt;
&lt;br /&gt;
$crystal = 16000000                                         'Quarzfrequenz&lt;br /&gt;
$baud = 9600&lt;br /&gt;
Config Scl = Portc.0                                        'Ports fuer IIC-Bus&lt;br /&gt;
Config Sda = Portc.1&lt;br /&gt;
' ------------- Ende der üblichen RN-Control Anweisungen --------------&lt;br /&gt;
&lt;br /&gt;
Declare Sub Rnlcd_cursor(byval Spalte As Byte , Byval Zeile As Byte)&lt;br /&gt;
Declare Sub Rnlcd_clr()&lt;br /&gt;
Declare Sub Rnlcd(byval Text As String)&lt;br /&gt;
Declare Sub Rnlcd_cr()&lt;br /&gt;
Declare Function Rnlcd_getscan() As Word&lt;br /&gt;
Declare Sub Rnlcd_scanmodus(byval Ein As Byte)      'Tastenscanmodus ein und ausschalten&lt;br /&gt;
Declare Sub Rnlcd_clearkeybuffer()                  'Löscht Tastaturbuffer&lt;br /&gt;
&lt;br /&gt;
Const Rnkeylcd_slaveid_write = &amp;amp;H40                  'I2C SlaveAdresse&lt;br /&gt;
Const Rnkeylcd_slaveid_read = &amp;amp;H41&lt;br /&gt;
&lt;br /&gt;
'Hauptprogramm&lt;br /&gt;
Config Pinb.2 = Input&lt;br /&gt;
Portb.2 = 1                         'Pullup ein&lt;br /&gt;
Config Int2 = Falling&lt;br /&gt;
&lt;br /&gt;
Dim Stemp As String * 100&lt;br /&gt;
Dim Taste As Word&lt;br /&gt;
&lt;br /&gt;
Wait 1                               'Warte bis LCD bereit&lt;br /&gt;
I2cinit&lt;br /&gt;
&lt;br /&gt;
On Int2 Tasten_interrupt&lt;br /&gt;
Enable Int2&lt;br /&gt;
Enable Interrupts&lt;br /&gt;
&lt;br /&gt;
Rnlcd_clr&lt;br /&gt;
Rnlcd_scanmodus 1                    'Scanmodus ein&lt;br /&gt;
Rnlcd_clearkeybuffer                 'Tastatubuffer löschen, falls noch Tasten drin stecken&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
  'Hier könnte beliebiges Hauptprogramm stehen&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Tasten_interrupt:&lt;br /&gt;
   Taste = Rnlcd_getscan()&lt;br /&gt;
   If Taste &amp;lt;&amp;gt; 0 Then                                       'Wurde Taste gedrückt&lt;br /&gt;
     Stemp = &amp;quot;Taste: &amp;quot; + Str(taste)&lt;br /&gt;
     Rnlcd Stemp&lt;br /&gt;
     Rnlcd_cr&lt;br /&gt;
   End If&lt;br /&gt;
   Return&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'--------------------------------------------------------------&lt;br /&gt;
'Einige spezielle I2C.Befehle für RN-KeyLCD als Funktion definiert:&lt;br /&gt;
&lt;br /&gt;
Sub Rnlcd_cursor(byval Spalte As Byte , Byval Zeile As Byte)       'Cursor setzen&lt;br /&gt;
Local Befehle As String * 4&lt;br /&gt;
  Befehle = Chr(27) + Chr(79) + Chr(spalte) + Chr(zeile)&lt;br /&gt;
  I2csend Rnkeylcd_slaveid_write , Befehle , 4&lt;br /&gt;
End Sub&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sub Rnlcd_clr()                                             'LCD löschen&lt;br /&gt;
Local Befehle As String * 2&lt;br /&gt;
  Befehle = Chr(12)&lt;br /&gt;
  I2csend Rnkeylcd_slaveid_write , Befehle , 1&lt;br /&gt;
End Sub&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sub Rnlcd_cr()                                              'LCD Zeilenvorschub&lt;br /&gt;
Local Befehle As String * 2&lt;br /&gt;
  Befehle = Chr(13) + Chr(10)&lt;br /&gt;
  I2csend Rnkeylcd_slaveid_write , Befehle , 2&lt;br /&gt;
End Sub&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sub Rnlcd(byval Text As String)                             'Eine Art Print Befehl zum Ausgeben von Text&lt;br /&gt;
Local Le As Word&lt;br /&gt;
  Le = Len(text)&lt;br /&gt;
  I2csend Rnkeylcd_slaveid_write , Text , Le&lt;br /&gt;
End Sub&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Function Rnlcd_getscan() As Word                            'Scancode als Word abfragen&lt;br /&gt;
Local Lscan As Byte&lt;br /&gt;
Local Hscan As Byte&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  I2cstart&lt;br /&gt;
  I2cwbyte Rnkeylcd_slaveid_read&lt;br /&gt;
  I2crbyte Lscan , Ack&lt;br /&gt;
  I2crbyte Hscan , Nack&lt;br /&gt;
  I2cstop&lt;br /&gt;
&lt;br /&gt;
  If Hscan.7 = 1 Then                                       'AScii Modus&lt;br /&gt;
     Rnlcd_getscan = Lscan&lt;br /&gt;
  Else&lt;br /&gt;
     Rnlcd_getscan = Hscan * 256&lt;br /&gt;
     Rnlcd_getscan = Rnlcd_getscan + Lscan&lt;br /&gt;
  End If&lt;br /&gt;
&lt;br /&gt;
End Function&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sub Rnlcd_scanmodus(byval Ein As Byte)                      'Tastenscanmodus ein und ausschalten&lt;br /&gt;
Local Befehle As String * 3&lt;br /&gt;
  Befehle = Chr(27) + Chr(119) + Chr(ein)&lt;br /&gt;
  I2csend Rnkeylcd_slaveid_write , Befehle , 3&lt;br /&gt;
End Sub&lt;br /&gt;
&lt;br /&gt;
Sub Rnlcd_clearkeybuffer()                                  'Löscht Tastaturbuffer&lt;br /&gt;
Local Befehle As String * 2&lt;br /&gt;
  Befehle = Chr(27) + Chr(123)&lt;br /&gt;
  I2csend Rnkeylcd_slaveid_write , Befehle , 2&lt;br /&gt;
End Sub&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nicht erschrecken wenn das Beispiel auf den ersten Blick etwas lang aussieht. Der Vollständigkeithalber haben wir das ganze Listing mit allen Befehlsdefinitionen abgedruckt. Der eigentliche Hautteil ist ja sehr kurz. &lt;br /&gt;
Der Vorteil dieser Abfrage ist, das man im Hauptprogramm quasi garnicht auf die Tastatur achten muss, somit werden auch keinerlei Bytes über den I2C-Bus versendet. Erst wenn eine Taste bei RN-KeyLCD gedrückt wird, wird bei dem Hauptboard (hier rn-control) ein Interrupt ausgelöst. Das Hauptprogramm wird dann kurz   unterbrochen um  die Taste per I2C-Bus abzuholen, danach wird es wieder weiter ausgeführt. Das ganze geht so schnell das es quasi wirkt als geschehe alles gleichzeitig. &lt;br /&gt;
Achten Sie bei dem Beispiel auch darauf das noch etwas höhere Stackwerte notwendig sind, siehe Quellcode! &lt;br /&gt;
&lt;br /&gt;
Verschweigen möchte ich nicht, das dieses Irq-Beispiel so nur wie gewünscht funktioniert wenn nur ein einziges Board am I2C-Bus diese Interrupt Leitung nutzt. Die Interrupt-Leitung kann jedoch auch von mehreren Board´s genutzt werden, in dem Fall muss im Hauptprogramm ab und zu geprüft werden ob noch die Interrupt Leitung auf Low liegt, denn dann könnten schon wieder Tasten vorhanden sein. Ein Interrupt kann dann nämlich aus bleiben wenn mehrere Boards gleichzeitig die Leitung auf Masse ziehen. Aber auch das ist nicht sonderlich schwierig in einem Programm zu berücksichtigen.&lt;br /&gt;
Da dieser Fall derzeit kaum auftreten wird, mangels Board´s die diese I2C-Interrupt Leitung nutzen, erspare ich mir  ein Beispiel.&lt;br /&gt;
&lt;br /&gt;
=== Aufbau und Anwendung===&lt;br /&gt;
&lt;br /&gt;
Der Aufbau der Schaltung ist durch die vorgefertigte Platine bzw. den Bausatz (über robotikhardware.de, siehe Weblinks beziehbar) eigentlich problemlos auch von Elektronik-Einsteigern zu bewerkstelligen. Durch den Bestückungsdruck und die Bestückungsliste, etwas weiter hinten in dieser Dokumentation, ist der Aufbau unkritisch.  Der speziell dafür programmierte Controller ist im Bausatz bereits enthalten!  Die Schaltung benötigt in der Regel eine Aufbauzeit von ca. 30 – 45 Minuten.&lt;br /&gt;
&lt;br /&gt;
Dennoch einige Anmerkungen zu eventuellen Hürden:&lt;br /&gt;
&lt;br /&gt;
# Nicht vergessen das in die Fassung wo MEGA8 steht, der oben erwähnte programmierte Spezialchip eingesetzt werden muß. Diesen gibt es fix und fertig programmiert bei robotikhardware.de. Versierte Programmierer/Experten, können natürlich auch ein eigenes Betriebsystem für das Board entwickeln.&lt;br /&gt;
# Vor dem Anlegen der Spannung die genaue Bedeutung des Jumpers JP1 beachten. Wenn das Board über den I2C Bus mit Strom versorgt wird, muss Jumper JP1 eingesteckt werden. In diesem fall darf aber keine weitere Spannung an den Schraubklemmen angelegt werden. Bevorzugt man eine Versorgung über die Schraubklemmen, so muß JP1 entfernt werden (außer man will den I2C-Bus mit Strom versorgen)&lt;br /&gt;
# Vor dem einstecken des Display´s darauf achten das JP2 nur bei dem grün/gelben Display gesteckt sein darf. Bei dem blauen Display muß dieser Jumper entfernt werden da sonst die Beleuchtung überlastet würde. Beim einstecken des Display darauf achten das dieses in die richtigen Kontakte gesteckt wird. Auf der Platine sitzen 10 polige Buchsenleisten da 9 polige im Fachhandel nicht zu bekommen sind. Da das Display nur 9 Kontakte hat, darf man dieses nicht falsch einsetzen. Anhand der Beschriftung auf der Platine und der Beschriftung der Kontakte kann man die genauen Pinnummern vergleichen. &amp;lt;br&amp;gt;[[Bild:rnkeylcddisplayeinstecken.jpg|right]]&lt;br /&gt;
# Auch beim Einstecken des Tastenfeldes drauf achten das dieses in den richtigen Kontakten stecken. Dies ist auf der Platine und im Bestückungsplan gut erkennbar,  Die Stifte müssen ganz links in der Buchse stecken.  Die unteren beiden Befestigungslöcher des Tastenfeldes sollten mit einem 3 mm Bohrer leicht  von 2,5 auf 3mm erweitert werden damit dieses mit 3mm Schrauben und den mitgelieferten Abstandsbolzen verschraubt werden kann. &lt;br /&gt;
# Sollte Sie nach dem Einschalten einen kurzen Ton hören aber keine Meldung sehen, dann ist vermutlich der Kontrastregler nicht richtig eingestellt. Drehen sie also solange an dem Poti KONTRAST bis der Text gut lesbar ist.&lt;br /&gt;
# Setzen Sie niemals das IC3 und IC1 gleichzeitig ein. Gewöhnlich wird nur IC1 ein MAX232 eingesetzt. Nur wenn der RS485 Modus gebraucht wird, wird IC1 entfernt und in IC-Fassung 3  das IC Max485 eingesetzt. Soll der TTL-Pegel der RS232 genutzt werden, was wohl seltener der Fall sein wird, dann müssen beide IC´s entfernt werden. (Der Max485 gehört eventuell nicht immer zum Lieferumfang eines Bausatzes, da der RS485 Mode relativ selten genutzt wird, gegebenenfalls mitbestellen)&lt;br /&gt;
# Es muss in jedem Fall der mitgelieferte 16 Mhz Quarze bestückt werden. Andere Taktraten sind nicht möglich.&lt;br /&gt;
&lt;br /&gt;
Das waren eigentlich schon die besonderen Punkte die zu beachten sind. Ansonsten natürlich sauber mit einem 15 – 25 W Lötkolben alles auf der Unterseite verlöten. Grundkenntnisse beim Löten werden empfohlen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
nach dem Aufbau sollten Sie nochmals alle Lötpunkte kontrollieren. Wenn sich das Board über das LCD meldet als auch einen Pieps beim anlegen der Spannung zu hören ist, dann deutet das darauf hin das alles gut geklappt hat.&lt;br /&gt;
In dem Fall können Sie sich dann anhand der vorhergehenden Beispiele mit der Ansteuerung beschäftigen. Sie können das Board auch mit der RS232 des PC´s verbinden, passende Kabel gibt’s zum Beispiel über Robotikhardware.de. Über ein Terminalprogramm (zum Beispiel das eingebaute in Bascom) können Sie dann per PC-Tastatur auf dem LCD schreiben.&lt;br /&gt;
&lt;br /&gt;
[[Bild:rnkeylcdohnetastenfeld.jpg|center|framed|Auf dem oberen Bild ist zu erkennen das  IC3 und ganz oben 2 Jumper und eine 5 polige Stiftleiste nicht bestückt ist. Diese Teile sind nur in dem selten benötigten RS485 Modus notwendig und können ansonsten weggelassen werden. Der Widerstand R7 (im Bild bestückt) sollte ebenfalls nicht bestückt werden, er ist eventuell für eine andere Firmware-Version vorgesehen.]]&lt;br /&gt;
&lt;br /&gt;
;Nochmal ganz wichtig: Niemals den I2C-Bus Stecker versehendlich in die daneben liegende ISP-Buchse stecken. Dadurch wird fast immer Ihr Board oder ihr ISP-Dongel beschädigt. Immer genau darauf achten das der I2C-Stecker auch in die I2C-Bus Buchse gesteckt wird. Die Buchsen sind entsprechend beschriftet!&lt;br /&gt;
&lt;br /&gt;
===Erläuterung der Anschlüsse, Kurzschlussbrücken, Jumper===&lt;br /&gt;
&lt;br /&gt;
====Erläuterungen der Jumper und Lötbrücken====&lt;br /&gt;
&lt;br /&gt;
=====JP1=====&lt;br /&gt;
Dieser Jumper verbindet die 5V Leitung auf dem I2C-Bus mit der 5V Logik-Spannung. Wenn Sie den Jumper einstecken, dann können Sie das Board komplett über den I2C-Bus mit Strom versorgen. Eine zusätzliche Spannung bzw. zusätzliches Kabel ist dann nicht mehr notwendig.&lt;br /&gt;
Versorgen Sie das Board jedoch über die Schraublemmen mit einer Spannung zwischen 6 und 18V, so darf dieser Jumper nicht gesteckt werden, außer sie wollen den I2C-Bus mit 5V Spannung versorgen. &lt;br /&gt;
&lt;br /&gt;
=====JP2=====&lt;br /&gt;
Dieser Jumper ändert beim Einstecken den LCD-Vorwiderstand für die Beleuchtung von ca. 28 Ohm auf 8 Ohm. In der Regel wird das grün/gelbe Display von Robotikhardware.de eingesteckt werden, in diesem Fall muss der Jumper gesteckt werden. Wird alternativ ein blaues Display eingesteckt, so muss dieser Jumper unbedingt entfernt werden da ansosnsten die LCD_Beleuchtung dieses Display Schaden nimmt. &lt;br /&gt;
&lt;br /&gt;
=====JP3 und JP4=====&lt;br /&gt;
Wenn der RS485 Modus genutzt wird und das Board das letzte Board in einem Netzwerk ist, so kann durch einstecken dieser beiden Jumper ein Endwiderstand aktiviert werden. Dies entspricht der RS485 Norm. &lt;br /&gt;
&lt;br /&gt;
=====JP6=====&lt;br /&gt;
Das Board besitzt einen Ringmodus bei dem es praktisch zwischen zwei andere Boards in Reihe geschaltet werden kann. Wenn dieser Ringmodus genutzt werden soll, darf dieser Jumper nicht gesteckt sein und ein zweites Board muss  an der Stiftleiste NEXTRS angeschlossen sein.&lt;br /&gt;
In allen anderen Fällen muss dieser Jumper gesteckt sein!&lt;br /&gt;
&lt;br /&gt;
=====Lötbrücke I2CBATT=====&lt;br /&gt;
Hier handelt es sich um eine Lötbrücke die bei Bedarf mit einem Tropfen Lötzin verbunden werden kann. Durch die Verbindung wird die unstabilisierte Batteriespannung vom I2C-Bus mit der unstabilisierten Eingangsspannung dieses Board´s verbunden. Dadurch kann wahlweise der I2C-Bus zur Stromversorgung des Boards oder das Board zur Stromversorgung des I2C-Busses genutzt werden. Gewöhnlich ist dies nicht notwendig so das diese Lötbücke immer offen bleibt.&lt;br /&gt;
&lt;br /&gt;
=====Lötbücke INTMODE=====&lt;br /&gt;
Wenn diese Lötbrücke mit einem Tropfen Lötzinn geschlossen wird, dann kann das Board über den I2C-Bus einen Interrupt auslösen wenn ein Zeichen im Tastaturbuffer landet. Die Leitung wird auf Low gezogen bis alle Zeichen aus dem Tastaturbuffer abgeholt wurden. &lt;br /&gt;
Wenn dieser Mode aktiviert wird, ist allerdings der RS485 Modus nicht mehr möglich, dahe rist diese Lötbrücke gewöhnlich offen.&lt;br /&gt;
&lt;br /&gt;
=====Lötbücke INTMODE=====&lt;br /&gt;
Wenn diese Lötbrücke mit einem Tropfen Lötzinn geschlossen wird, dann kann man den RS485 – Bus (5 polige Stiftleiste) mit einer unstabilisierten Eingangsspannung verbinden. Gewöhnlich ist das nicht notwendig so das diese Brücke offen bleibt.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
====Erläuterungen der Anschlüsse====&lt;br /&gt;
&lt;br /&gt;
=====I2C-Bus===== &lt;br /&gt;
Übe diesen I2C-Bus kann das komplette Board angesteuert als auch mit Spannung versorgt werden. Der I2C-Bus hat den Vorteil das mehrere Board´s an dem gleichen Kabel angeschlossen werden. Es können mehrere RN-KeyLCD-Board´s abe rauch ganz verschiedene I2C-Boards sein. Wichtig ist nur das jedes Board eine unterschiedlich Adresse (I2C-Slave ID) besitzt. Die Standard I2C-Slave-ID bei RN-KeyLCD ist Hex 40, diese kann aber per Tastenfeld beliebig verändert werden.&lt;br /&gt;
Entsprechend der Roboternetz-Norm wird hier ein 2x5 poliger Stecker angeschlossen. Die Belegung entspricht exakt der von allen Roboternetz-Boards: &lt;br /&gt;
&lt;br /&gt;
 Pin 1 SCL (Taktleitung)&lt;br /&gt;
 Pin 3 SDA (Datenleitung)&lt;br /&gt;
 Pin 5 +5V  (Kann über Jumper I2C5V getrennt werden)&lt;br /&gt;
 Pin 7 +5V  (Kann über Jumper I2C5V getrennt werden)&lt;br /&gt;
 Pin 9  Batteriespannung Diese Leitung wird jedoch bei RN-Motor nicht benutzt &lt;br /&gt;
 Pin 2,4,6,8 GND&lt;br /&gt;
 Pin 10  INT  Diese Leitung kann bei Tastaturereignissen einen Interrupt auslösen&lt;br /&gt;
&lt;br /&gt;
=====ISP – IN SYSTEM PROGRAMMING=====&lt;br /&gt;
Über diesen Anschluß kann der  Controller auf dem Board mit einem Standard ISP-Kabel direkt an einen Parallelport des PC´s angeschlossen und umprogrammiert werden.&lt;br /&gt;
Achtung: Dies ist in der Regel nicht notwendig, da ja der Controller bereits programmiert ist. Dieser Anschluß sollte deshalb nur von sehr erfahreneren AVR-Programmierern benutzt werden.&lt;br /&gt;
Der Anschluss kann abe rauch genutzt werden um Firmware-Updates einzuspielen, aber natürlich ist dazu auch ein ISP-Adapter notwendig.&lt;br /&gt;
Die Belegung des ISP-Anschlusses ist zu dem weit verbreitetet STK200 Programmier Dongle kompatibel. Ein entsprechender Dongle kann man sich entweder selber basteln (siehe Beitrag [[AVR-ISP Programmierkabel]]) oder fertig bestellen (z.B.robotikhardware.de siehe Weblinks). &lt;br /&gt;
 &lt;br /&gt;
 Pin 1 MOSI&lt;br /&gt;
 Pin 2 VCC&lt;br /&gt;
 Pin 3 Nicht belegt&lt;br /&gt;
 Pin 4 GND&lt;br /&gt;
 Pin 5 RESET&lt;br /&gt;
 Pin 6 GND&lt;br /&gt;
 Pin 7 SCK&lt;br /&gt;
 Pin 8 GND&lt;br /&gt;
 Pin 9 MISO&lt;br /&gt;
 Pin 10 GND&lt;br /&gt;
&lt;br /&gt;
=====LCD2=====&lt;br /&gt;
Gewöhnlich nutzt man bei RN-KeyLCD das LCD das direkt auf das Board aufgesteckt wird. In diesem Fall ist dieser Anschluss immer unbelegt. Entfernt man jedoch das LCD aus dem Sockel, so kann hier ein Standard LCD mit 20 Zeichen x 4 Zeilen angeschlossen werden. &lt;br /&gt;
Zu beachten ist das die eingebaute Firmware nicht immer alle Display unterstützt, jedoch sollten KS0073 kompatible Displays gewöhnlich kein Problem machen. Beim Anschluss des Display´s darauf achten das man den Beleuchtungsvorwiderstand R6 nach Bedarf anpaßt.&lt;br /&gt;
&lt;br /&gt;
 Die Belegung entspricht der 16 poligen Roboternetz-Norm:&lt;br /&gt;
 Pin 1    GND&lt;br /&gt;
 Pin 2    5V&lt;br /&gt;
 Pin 3    Vee Kontrastspannung (0-5V)&lt;br /&gt;
 Pin 4    RS (CS)&lt;br /&gt;
 Pin 5    R/W  (SID)&lt;br /&gt;
 Pin 6    Enable (1)  (SCLK)&lt;br /&gt;
 Pin 7    DB0 (SOD)&lt;br /&gt;
 Pin 8    DB1&lt;br /&gt;
 Pin 9    DB2&lt;br /&gt;
 Pin 10   DB3&lt;br /&gt;
 Pin 11   DB4&lt;br /&gt;
 Pin 12   DB5&lt;br /&gt;
 Pin 13   DB6&lt;br /&gt;
 Pin 14   DB7,MSB&lt;br /&gt;
 Pin 15   LED – Beleuchtung +&lt;br /&gt;
 Pin 16   LED – Beleuchtung -&lt;br /&gt;
&lt;br /&gt;
=====POWER=====&lt;br /&gt;
Über diese Schraublemme kann das Board mit einer unstabilisierten Gleichspannung von ca. 6 bis 18V versorgen. Bitte unbedingt auf die Polung achten da ansonsten das Board beschädigt werden kann. Plus und Minus ist jedoch auf der Platine deutlich beschriftet.&lt;br /&gt;
Beachten Sie auch das das Baord alternativ auch über den I2C-Bus versorgt werden kann, siehe Jumper JP1. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====RS232 - PC kompatible RS232 Schnittstelle=====&lt;br /&gt;
Über ein Adapterkabel kann die serielle Schnittstelle des PC oder eines anderen Board´s (z.B. RN-Control, RN-Mega8, Rnbfra usw.) direkt mit dem Board verbunden werden. &lt;br /&gt;
Im RS232 Mode können sehr einfach alle Ausgaben mit Print auf dem LCD ausgegeben werden. Die Baudrate kann über das LCD-Menü eingestellt werden.&lt;br /&gt;
Die Belegung entspricht der Roboternetz-Norm und ist kompatibel zum Conrad Roboter CCRP5:&lt;br /&gt;
&lt;br /&gt;
 Pin 1 RX&lt;br /&gt;
 Pin 2 GND&lt;br /&gt;
 Pin 3 TX&lt;br /&gt;
&lt;br /&gt;
Ein geeignetes Anschlußkabel kann schnell selbst angefertigt werden oder gibt  es bei  robotikhardware.de bereits fertig&lt;br /&gt;
&lt;br /&gt;
=====NEXTRS=====&lt;br /&gt;
Dieser Anschluss hat die gleiche Belegung wie der zuvor beschriebene RS232 Anschluss. Er ist allerdings in Reihe geschaltet. Das bedeutet das alle Daten die über die RS232 Klemme eingehen zunächst vom LCD-Display dargestellt und verarbeitet werden aber zeitgleich auch an das Board weitergeschickt werden das an diesem NXTRS Anschluss hängt. Alle Ausgaben des hier angeschlossenen Board´s werden dann wieder von dem normalen RS232 Anschluss ausgegeben.&lt;br /&gt;
Hört sich kompliziert an,ist aber recht einfach, Das LCD-Board wird somit quasi unsichtbar zwischen zei andere Board´s in eine RS232 Leitung gehängt. Dies hat den Vorteil das man die gesendeten Daten überwachen kann, was insbesondere beim Debuggen von Schaltungen hilfreich sein kann.&lt;br /&gt;
Dazu muss jedoch noch der RINGMODUS über das Menü aktiviert und der Jumper JP6 entfernt werden. Interessant ist in diesem bezug auch der HEX-Mode von RNKeyLCD (siehe weiter vorne).&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=====RS232TTL - RS232 Schnittstelle mit TTL Pegel=====&lt;br /&gt;
Dies ist die RS232 Schnittstelle mit TTL-Pegel, also max. 5V Pegel. Hier lassen sich Controllerboards, die keinen Treiberbaustein wie Max232 besitzen, direkt anschließen&lt;br /&gt;
Die TTL- Stiftleiste wird nach Roboternetz-Definition immer 4 polig ausgestattet um Verwechslungen mit der Standard RS232 Stiftleiste  zu vermeiden. Verbinden Sie niemals eine  4 polige TTL-Stiftleiste mit einer 3 poligen, dies würde den Controller oder PC beschädigen.&lt;br /&gt;
&lt;br /&gt;
Die Belegung entspricht der [[RN-Definitionen]]:&lt;br /&gt;
&lt;br /&gt;
 Pin 1 RX&lt;br /&gt;
 Pin 2 TX&lt;br /&gt;
 Pin 3 GND&lt;br /&gt;
 Pin 4 +5V&lt;br /&gt;
&lt;br /&gt;
Ein geeignetes Anschlußkabel kann schnell selbst angefertigt werden. &lt;br /&gt;
Wichtig: Wenn die TTL-Buchse benutzt wird, dann müssen  Sie sowohl IC1 und IC3 aus der Fassung entfernen&lt;br /&gt;
&lt;br /&gt;
=====RS485=====&lt;br /&gt;
Über diese Schnittstelle kann RN-KeyLCD auch über eine [[RS485]] Verbindung angesteuert werden. Dazu muss allerdings der Max485 in IC-Fassung IC3 eingesetzt und der MAX232 aus IC-Fassung IC1 entfernt werden. Zudem muss der [[RS485]] Modus über das Menü aktiviert werden.&lt;br /&gt;
Das Board steht immer auf Empfang und schaltet automatisch kurz auf Senden sobalt eine taste im AUTOSEND-Mode gesendet oder per Befehl abgeholt wird. Die Ansteuerung ist somit mit der RS232 Ansteuerung identisch. Ein spezielles Protokoll wird derzeit nicht in der Firmware unterstützt.&lt;br /&gt;
&lt;br /&gt;
Pinbelegung entsprechend der [[RN-Definitionen]]:&lt;br /&gt;
&lt;br /&gt;
 Pin 1  Volle Batteriespannung&lt;br /&gt;
 Pin 2   GND&lt;br /&gt;
 Pin 3   5V&lt;br /&gt;
 Pin 4  RS 485 A  (kein TTL Pegel)&lt;br /&gt;
 Pin 5  RS 485 B  (kein TTL Pegel)&lt;br /&gt;
&lt;br /&gt;
===Schaltplan===&lt;br /&gt;
&lt;br /&gt;
[[Bild:rnkeylcdschaltplan.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:rnkeylcdschaltplan2.gif|center|500px]]&lt;br /&gt;
&lt;br /&gt;
===Bestückungsplan===&lt;br /&gt;
&lt;br /&gt;
Achtung, dieser Bestückungsplan gilt für die Version 1.2 der Platine. Rot markiert ist der Jumper, der bei der üblichen Konfiguration gesetzt sein sollte. Nur im RS232RING Modus muß dieser Jumper entfernt werden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:rnkeylcdbestückungsplan.gif|center|400px]]&lt;br /&gt;
&lt;br /&gt;
===Stückliste===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Bauteil Wert       Beschreibung                         &lt;br /&gt;
C1       100n      Keramik Kondensator                  &lt;br /&gt;
C2       22p       22pF Kondensator       &lt;br /&gt;
C3       22p       22pF Kondensator                      &lt;br /&gt;
C4       100n      Keramik Kondensator                      &lt;br /&gt;
C5       4,7uF     Elko                                   &lt;br /&gt;
C6       4,7uF     Elko                                   &lt;br /&gt;
C7       4,7uF     Elko                                &lt;br /&gt;
C8       4,7uF     Elko                               &lt;br /&gt;
C9       100n      Keramik Kondensator                      &lt;br /&gt;
C10      100n      Keramik Kondensator                  &lt;br /&gt;
C11      220uF     Elko                                   &lt;br /&gt;
C12      10uF      Elko                                                &lt;br /&gt;
C13      100n      Keramik Kondensator                   &lt;br /&gt;
C14      100n      Keramik Kondensator               &lt;br /&gt;
I2C                Wannenbuchse 10 pol Winkel               &lt;br /&gt;
IC1                IC-Fassung 16 polig                &lt;br /&gt;
IC1      MAX232    RS232 Treiber                           &lt;br /&gt;
IC2      7805T     Spannungsregler 7805 oder LM2940 CT5 &lt;br /&gt;
IC3                IC-Fassung 8 polig                &lt;br /&gt;
IC3      MAX485CPA Treiber Max485                       &lt;br /&gt;
                   Der Max485 ist nur notwendig wenn auch der RS485&lt;br /&gt;
                   Modus vom Rn-KeyLCD gebraucht wird. Wenn er eingesteckt wird&lt;br /&gt;
                   muss IC1 Max232 entfernt werden und umgekehrt.                   &lt;br /&gt;
ISP                Wannenbuchse 10 pol Winkel                &lt;br /&gt;
JP1                Stiftleiste 2polig                        &lt;br /&gt;
JP2                Stiftleiste 2polig                       &lt;br /&gt;
JP3                Stiftleiste 2polig                      &lt;br /&gt;
JP4                Stiftleiste 2polig                      &lt;br /&gt;
JP6                Stiftleiste 2polig                    &lt;br /&gt;
KEY                Matrixtastatur                     &lt;br /&gt;
                   Tastatur wird in die nachfolgende Buchsenleiste gesteckt&lt;br /&gt;
KEY                10 polige Buchsenleiste 2,54 Raster&lt;br /&gt;
LCD                20x4 Zeichen LCD Typ EA-DIP204      &lt;br /&gt;
                   LCD wird in die nachfolgenden beiden Buchsenleisten gesteckt&lt;br /&gt;
LCD                10 polige Buchsenleiste 2,0 &lt;br /&gt;
LCD                10 polige Buchsenleiste 2,0 &lt;br /&gt;
LCD2               Wannenbuchse 16pol Winkel                   &lt;br /&gt;
MEGA8              Programmierter Controller RNLK12 nur über robotikhardware erhältlich&lt;br /&gt;
NEXTRS             Stiftleiste 3 polig                      &lt;br /&gt;
POWER              Schraubklemme 2 polig                    &lt;br /&gt;
Q1       16 Mhz    Quarz 16 Mhz                           &lt;br /&gt;
R1       10k       Metallschichtwiderstand 10k           &lt;br /&gt;
R2       10k       Poti 10k                           &lt;br /&gt;
R3       8         Metallschichtwiderstand 8 Ohm          &lt;br /&gt;
R4       27        Metallschichtwiderstand 27 Ohm       &lt;br /&gt;
R5       330       Metallschichtwiderstand 330 Ohm       &lt;br /&gt;
R6                 Widerstand &lt;br /&gt;
                   Dieser Widerstand ist nur notwendig wenn extern ein LCD&lt;br /&gt;
                   mit Beleuchtung angeschlossen wird (der Wert richtet sich&lt;br /&gt;
                   Displaytyp (gewöhnlich um die 10 Ohm)&lt;br /&gt;
R7                 Diesen Wiederstand nicht einsetzen, er war für andere &lt;br /&gt;
                   Firmware gedacht und wird nicht mehr benötigt &lt;br /&gt;
R8       100k      Metallschichtwiderstand 100k            &lt;br /&gt;
R9       1k        Widerstand 1K                            &lt;br /&gt;
R10      100k      Metallschichtwiderstand 100k           &lt;br /&gt;
RS232              Stiftleiste 3 polig                    &lt;br /&gt;
RS232TTL           Stiftleiste 4 polig                    &lt;br /&gt;
RS485              Stiftleiste 5 polig Winkel        &lt;br /&gt;
SPEAKER  F/CM12P   Mini Piezo Lautsprecher          &lt;br /&gt;
T1       BC338     NPN Transistor BC338-40               &lt;br /&gt;
&lt;br /&gt;
2 Stück            Abstandsbolzen innen/außen Gewinde 1cm Länge&lt;br /&gt;
3 Stück            Abstandsbolzen innen/außen Platinenbefestigung&lt;br /&gt;
5 Stück            Jumper&lt;br /&gt;
1 Stück            Bedruckte passende Platine &lt;br /&gt;
&lt;br /&gt;
Die Bauteile/LCD/Platine sind auch komplett über robotikhardware.de zu beziehen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
*[[Bascom]]&lt;br /&gt;
*[[RN-Definitionen]]&lt;br /&gt;
*[[RN-Control]]&lt;br /&gt;
*[[RN-Board FAQ-Seite]]&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
*[http://www.roboternetz.de/phpBB2/dload.php?action=file&amp;amp;file_id=222 Ausführlichere Anleitung mit Bestückungsplan / Bauplan und weiteren Hinweisen als PDF-Datei]&lt;br /&gt;
&lt;br /&gt;
{{Platinenservice|http://www.robotikhardware.de}}&lt;br /&gt;
{{Bausatzservice|http://www.robotikhardware.de}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Robotikeinstieg]]&lt;br /&gt;
[[Category:Praxis]]&lt;br /&gt;
[[Category:Elektronik]]&lt;br /&gt;
[[Category:Projekte]]&lt;br /&gt;
[[Category:Microcontroller]]&lt;/div&gt;</summary>
		<author><name>Darth Ding</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Bascom_und_PWM&amp;diff=7357</id>
		<title>Bascom und PWM</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Bascom_und_PWM&amp;diff=7357"/>
				<updated>2006-05-15T15:14:43Z</updated>
		
		<summary type="html">&lt;p&gt;Darth Ding: /* Genauere Erklärung: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Mit Bascom, PWM-Signale erzeugen ==&lt;br /&gt;
(Bezogen auf den Mega8. Aber es gilt in etwa, auch für andere AVR's)&lt;br /&gt;
&lt;br /&gt;
===Grundbegriffe===&lt;br /&gt;
'''Puls Weiten  Modulation (PWM)'''&lt;br /&gt;
&lt;br /&gt;
Bei der Puls-Weiten-Modulation (PWM) wird ein digitales Ausgangssignal erzeugt, dessen Tastverhältnis moduliert wird.&lt;br /&gt;
&lt;br /&gt;
Das Tastverhältnis gibt das Verhältnis der Länge des eingeschalteten Zustands zur Periodendauer an. Dabei bleiben die Frequenz und der Pegel des Signals immer&lt;br /&gt;
gleich! &lt;br /&gt;
Es ändert sich nur die Länge von High zu Low.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dieses Bild zeigt ein Tastverhältnis von 10% und 50 % &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tastverhältnis.png|center]]&lt;br /&gt;
&lt;br /&gt;
Man könnte das in etwa mit einem Wasserhahn vergleichen, den man z.B. alle Minuten betätigt.&lt;br /&gt;
Wenn man ihn in jeder Minute nur kurz aufdreht und dann gleich wieder zumacht, &lt;br /&gt;
kommt in Summe nur wenig Wasser raus. &lt;br /&gt;
Wenn man ihn aber in jeder dieser Minuten länger offen lässt,  &lt;br /&gt;
kommt mehr Wasser raus.&lt;br /&gt;
&lt;br /&gt;
Der Rhythmus bleibt immer gleich, aber es ändert sich in Summe die Wassermenge,&lt;br /&gt;
die raus kommt.&lt;br /&gt;
&lt;br /&gt;
Mit dem PWM Signal kann man nun tolle Sachen machen. &lt;br /&gt;
Zum Beispiel eine LED (oder über einen Transistor auch eine Lampe) an den PWM Ausgang   anschliessen und mit der Länge des PWM-Signal’s die Helligkeit der LED verändern.&lt;br /&gt;
 &lt;br /&gt;
Oder auch einen  Motor in der Geschwindigkeit regeln. &lt;br /&gt;
&lt;br /&gt;
Man kann aber auch dem PWM-Signal einen RC-Filter nachschalten, welches das  &lt;br /&gt;
PWM-Signal glättet. Dann hat man eine regelbare Gleichspannung, in der das Minimum   &lt;br /&gt;
dann 0V und das Maximum 5V ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt grundsätzlich zwei Gruppen von PWM-Arten &lt;br /&gt;
&lt;br /&gt;
'''Software PWM und Hardware PWM '''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;'''Software PWM'''&lt;br /&gt;
:Vorteile: Man kann diese PWM auf jeden Ausgabe-Pin des AVR anwenden.&lt;br /&gt;
:Nachteil: Da die PWM per Software gemacht wird, ist sie eher langsam.&lt;br /&gt;
&lt;br /&gt;
;'''Hardware PWM'''&lt;br /&gt;
:Vorteile: Sehr schnell (Maximal die Quarzfrequenz / Periode)&lt;br /&gt;
:Nachteile: Man kann nur bestimmte Ausgänge dafür verwenden&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Mega8 hat nun drei Hardware PWM Ausgänge.&lt;br /&gt;
Diese laufen nach Definition der Register/Werte selbstständig ab.&lt;br /&gt;
(Darum ist Hardware-PWM auch sehr schnell und belastet die Abarbeitung des Programms nicht.) &lt;br /&gt;
Leider sind die Ausgänge aber bestimmten Ausgangs Pin’s fix zugeordnet. &lt;br /&gt;
Man kann diese also nicht auf andere Pins legen und muss sich deshalb vorher &lt;br /&gt;
Gedanken machen, wie man den Mega8 beschaltet.&lt;br /&gt;
&lt;br /&gt;
Ganz anders beim  Software-PWM, das ja rein Softwaremäßig erzeugt wird &lt;br /&gt;
und wo man dann das PWM-Signal fast an jeden Pin ausgeben kann. &lt;br /&gt;
&lt;br /&gt;
Für die Hardware-PWM Erzeugung kann man beim Mega8 &lt;br /&gt;
den Timer1 und den Timer2 verwänden.&lt;br /&gt;
&lt;br /&gt;
Timer1 hat zwei Compare Register und kann dadurch zwei PWM Signale erzeugen.&lt;br /&gt;
(Compare A = Pin 15 und Compare B= Pin 16)&lt;br /&gt;
Weiters kann man beim Timer1 eine Auflösung von 8, 9 und 10 Bit einstellen.&lt;br /&gt;
&lt;br /&gt;
Timer2 hat nur ein Compare Register (Ausgang am Pin 17), nur 8 Bit   &lt;br /&gt;
Auflösung und kann auch nur ein PWM erzeugen.&lt;br /&gt;
&lt;br /&gt;
=== PWM-Ablauf: ===&lt;br /&gt;
&lt;br /&gt;
Unteres Bild zeigt den Ablauf für das PWM  beim Timer1.&lt;br /&gt;
Es kommt zuerst die  Frequenz vom Takterzeuger (Quarz), geht über den Prescaler zum Timer. &lt;br /&gt;
Beim Timer schaltet das Compare Register je nach seinem eingestellten Wert &lt;br /&gt;
&amp;lt;br/&amp;gt; und erzeugt somit das PWM-Signal am Ausgangs-Pin&lt;br /&gt;
&lt;br /&gt;
[[Bild:PWM.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Genauere Erklärung:===&lt;br /&gt;
&lt;br /&gt;
Der Prescaler teilt die Frequenz die vom Quarz kommt!&lt;br /&gt;
Bei Teilung 1 geht die vollständige Frequenz zum Timer.&lt;br /&gt;
Bei Teilung 8 nur ein Achtel der Quarzfrequenz.&lt;br /&gt;
(Also bei 8 MHz Quarz kommen zum Timer dann nur 1 MHz )&lt;br /&gt;
Bei Teilung 1024  sind es dann z.B. 8 MHz/1024 = 7,8125kHz &lt;br /&gt;
&lt;br /&gt;
Der Timer ist hier der Zähler für die PWM.&lt;br /&gt;
Er zählt mit der Frequenz, die vom Prescaler kommt, einmal von 0 bis&lt;br /&gt;
zu der eingestellten Timerauflösung rauf, dann wieder auf  0 zurück.&lt;br /&gt;
(dann wieder von 0 auf Timerauflösung u.s.w.)&lt;br /&gt;
Einmal rauf und runterzählen, ergibt ein Periode.&lt;br /&gt;
Die Periode ist gleich die Ausgangsfrequenz von dem PWM-Signal.&lt;br /&gt;
Ausgangsfrequenz = (Quarzfrequenz/Prescale ) /(Timerauflösung*2)&lt;br /&gt;
&lt;br /&gt;
z.B.: Quarz = 8 MHz ;  Prescaler = 1 ; Timer = 8 Bit&lt;br /&gt;
ergibt:  (8000000Hz/1) / (256*2)  = 15,625 kHz&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder: Quarz = 8 MHz ;  Prescaler = 8 ; Timer = 10 Bit&lt;br /&gt;
ergibt:  (8000000Hz/8) / (2048*2)  = 244,14 Hz&lt;br /&gt;
&lt;br /&gt;
Mit dem Compare Register definiert man nun  das Tastverhältnis!&lt;br /&gt;
Überall, wo nun der Timer diese Compare Linie schneidet, schaltet der Ausgang!&lt;br /&gt;
Beim raufzählen des Timers auf EIN, beim runterzählen auf AUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als Beispiel ein Tastverhältnis von 20%&lt;br /&gt;
[[Bild:Compare205.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als Beispiel ein Tastverhältnis von 80%&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Bild:Compare51.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hier sieht man, wie die Signale dann auf einem Oszilloskop  ausschauen.&lt;br /&gt;
Oben das Signal von Pin15 (Compare A), unten das von Pin 16 (Compare B)&lt;br /&gt;
[[Bild:Osci-PWM-kleiner3.GIF|center]]&lt;br /&gt;
&lt;br /&gt;
=== Grundprogramm ===&lt;br /&gt;
&lt;br /&gt;
Hier nun ein Grundprogramm für die Ausgabe von zwei PWM Signalen mit dem Timer1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
' Hardware PWM mit Timer1&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m8def.dat&amp;quot;&lt;br /&gt;
$crystal = 4000000&lt;br /&gt;
&lt;br /&gt;
Config Pinb.1 = Output&lt;br /&gt;
Config Pinb.2 = Output&lt;br /&gt;
&lt;br /&gt;
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
 Compare1a = 205&lt;br /&gt;
 Compare1b = 51&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;
''' Erklärung:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$regfile = &amp;quot;m8def.dat&amp;quot;&lt;br /&gt;
$crystal = 8000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Definiert den Mega8 und den 8MHz Quarz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Config Pinb.1 = Output&lt;br /&gt;
Config Pinb.2 = Output&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Definiert die zwei Ausgänge von Timer1 auf Ausgabe.&amp;lt;br/&amp;gt;&lt;br /&gt;
Pinb.1 = für Compare1a (= Compare A) = Pin 15&amp;lt;br/&amp;gt;&lt;br /&gt;
Pinb.2 = für Compare1b (= Compare B) = Pin 16&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
;Config Timer1 = Pwm&lt;br /&gt;
: Timer1 auf  PWM  einstellen&lt;br /&gt;
&lt;br /&gt;
;Pwm = 8 &lt;br /&gt;
:Timer Auflösung = 8 Bit einstellen&lt;br /&gt;
&lt;br /&gt;
;Compare A Pwm = Clear Up:Definiert, wie der Compare A schalten soll. Bei  „Clear Up“ schaltet der Ausgang beim erreichen  &lt;br /&gt;
:des Compare-Wertes zuerst auf  High und dann auf Low. Bei „Clear Down“, umgekehrt. &lt;br /&gt;
&lt;br /&gt;
;Compare B Pwm = Clear Up&lt;br /&gt;
:Das gleiche noch mal mit Compare B                                          &lt;br /&gt;
&lt;br /&gt;
;Prescale = 1&lt;br /&gt;
:Hier wird der Prescaler auf  1 eingestellt.&lt;br /&gt;
:(Wert 1 heißt, direkte Frequenz vom Quarz zum Timer.)&lt;br /&gt;
:Weitere Teilungen, wie z.B.: 8, 64, 256 und 1024  sind möglich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Compare1a = 205&lt;br /&gt;
Compare1b = 51&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Hier kann man nun die Werte für das Tastverhältnis, in das Register Compare1a&lt;br /&gt;
und Compare1b schreiben. Oder man kann auch, satt Compare1a und 1b , die Bezeichnungen &lt;br /&gt;
Pwm1a und Pwm1b verwenden. Bascom nimmt beides.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit diesem kurzen Programm, hat man nun zwei PWM Signale erzeigt, wo das eine ein Tastverhältnis&lt;br /&gt;
von 20% (Compare1a) und das andere von 80 % hat. :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Autor==&lt;br /&gt;
*  [[Benutzer:Roberto|Roberto]]&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Avr]]&lt;br /&gt;
* [[Bascom]]&lt;br /&gt;
* [[Pwm]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Quellcode Bascom]]&lt;/div&gt;</summary>
		<author><name>Darth Ding</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Bascom_und_PWM&amp;diff=7356</id>
		<title>Bascom und PWM</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Bascom_und_PWM&amp;diff=7356"/>
				<updated>2006-05-15T15:12:04Z</updated>
		
		<summary type="html">&lt;p&gt;Darth Ding: /* Grundbegriffe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Mit Bascom, PWM-Signale erzeugen ==&lt;br /&gt;
(Bezogen auf den Mega8. Aber es gilt in etwa, auch für andere AVR's)&lt;br /&gt;
&lt;br /&gt;
===Grundbegriffe===&lt;br /&gt;
'''Puls Weiten  Modulation (PWM)'''&lt;br /&gt;
&lt;br /&gt;
Bei der Puls-Weiten-Modulation (PWM) wird ein digitales Ausgangssignal erzeugt, dessen Tastverhältnis moduliert wird.&lt;br /&gt;
&lt;br /&gt;
Das Tastverhältnis gibt das Verhältnis der Länge des eingeschalteten Zustands zur Periodendauer an. Dabei bleiben die Frequenz und der Pegel des Signals immer&lt;br /&gt;
gleich! &lt;br /&gt;
Es ändert sich nur die Länge von High zu Low.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dieses Bild zeigt ein Tastverhältnis von 10% und 50 % &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tastverhältnis.png|center]]&lt;br /&gt;
&lt;br /&gt;
Man könnte das in etwa mit einem Wasserhahn vergleichen, den man z.B. alle Minuten betätigt.&lt;br /&gt;
Wenn man ihn in jeder Minute nur kurz aufdreht und dann gleich wieder zumacht, &lt;br /&gt;
kommt in Summe nur wenig Wasser raus. &lt;br /&gt;
Wenn man ihn aber in jeder dieser Minuten länger offen lässt,  &lt;br /&gt;
kommt mehr Wasser raus.&lt;br /&gt;
&lt;br /&gt;
Der Rhythmus bleibt immer gleich, aber es ändert sich in Summe die Wassermenge,&lt;br /&gt;
die raus kommt.&lt;br /&gt;
&lt;br /&gt;
Mit dem PWM Signal kann man nun tolle Sachen machen. &lt;br /&gt;
Zum Beispiel eine LED (oder über einen Transistor auch eine Lampe) an den PWM Ausgang   anschliessen und mit der Länge des PWM-Signal’s die Helligkeit der LED verändern.&lt;br /&gt;
 &lt;br /&gt;
Oder auch einen  Motor in der Geschwindigkeit regeln. &lt;br /&gt;
&lt;br /&gt;
Man kann aber auch dem PWM-Signal einen RC-Filter nachschalten, welches das  &lt;br /&gt;
PWM-Signal glättet. Dann hat man eine regelbare Gleichspannung, in der das Minimum   &lt;br /&gt;
dann 0V und das Maximum 5V ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt grundsätzlich zwei Gruppen von PWM-Arten &lt;br /&gt;
&lt;br /&gt;
'''Software PWM und Hardware PWM '''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;'''Software PWM'''&lt;br /&gt;
:Vorteile: Man kann diese PWM auf jeden Ausgabe-Pin des AVR anwenden.&lt;br /&gt;
:Nachteil: Da die PWM per Software gemacht wird, ist sie eher langsam.&lt;br /&gt;
&lt;br /&gt;
;'''Hardware PWM'''&lt;br /&gt;
:Vorteile: Sehr schnell (Maximal die Quarzfrequenz / Periode)&lt;br /&gt;
:Nachteile: Man kann nur bestimmte Ausgänge dafür verwenden&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Mega8 hat nun drei Hardware PWM Ausgänge.&lt;br /&gt;
Diese laufen nach Definition der Register/Werte selbstständig ab.&lt;br /&gt;
(Darum ist Hardware-PWM auch sehr schnell und belastet die Abarbeitung des Programms nicht.) &lt;br /&gt;
Leider sind die Ausgänge aber bestimmten Ausgangs Pin’s fix zugeordnet. &lt;br /&gt;
Man kann diese also nicht auf andere Pins legen und muss sich deshalb vorher &lt;br /&gt;
Gedanken machen, wie man den Mega8 beschaltet.&lt;br /&gt;
&lt;br /&gt;
Ganz anders beim  Software-PWM, das ja rein Softwaremäßig erzeugt wird &lt;br /&gt;
und wo man dann das PWM-Signal fast an jeden Pin ausgeben kann. &lt;br /&gt;
&lt;br /&gt;
Für die Hardware-PWM Erzeugung kann man beim Mega8 &lt;br /&gt;
den Timer1 und den Timer2 verwänden.&lt;br /&gt;
&lt;br /&gt;
Timer1 hat zwei Compare Register und kann dadurch zwei PWM Signale erzeugen.&lt;br /&gt;
(Compare A = Pin 15 und Compare B= Pin 16)&lt;br /&gt;
Weiters kann man beim Timer1 eine Auflösung von 8, 9 und 10 Bit einstellen.&lt;br /&gt;
&lt;br /&gt;
Timer2 hat nur ein Compare Register (Ausgang am Pin 17), nur 8 Bit   &lt;br /&gt;
Auflösung und kann auch nur ein PWM erzeugen.&lt;br /&gt;
&lt;br /&gt;
=== PWM-Ablauf: ===&lt;br /&gt;
&lt;br /&gt;
Unteres Bild zeigt den Ablauf für das PWM  beim Timer1.&lt;br /&gt;
Es kommt zuerst die  Frequenz vom Takterzeuger (Quarz), geht über den Prescaler zum Timer. &lt;br /&gt;
Beim Timer schaltet das Compare Register je nach seinem eingestellten Wert &lt;br /&gt;
&amp;lt;br/&amp;gt; und erzeugt somit das PWM-Signal am Ausgangs-Pin&lt;br /&gt;
&lt;br /&gt;
[[Bild:PWM.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Genauere Erklärung:===&lt;br /&gt;
&lt;br /&gt;
Der Prescaler, teilt die Frequenz die vom Quarz kommt!&lt;br /&gt;
Bei Teilung 1, geht die vollständige Frequenz zum Timer.&lt;br /&gt;
Bei Teilung 8, nur ein Achtel der Quarzfrequenz.&lt;br /&gt;
(Also bei 8 MHz Quarz kommen zum Timer dann nur 1 MHz )&lt;br /&gt;
Bei Teilung 1024  sind es dann z.B. 8 MHz/1024 = 7,8125kHz &lt;br /&gt;
&lt;br /&gt;
Der Timer ist hier der Zähler für das PWM.&lt;br /&gt;
Er zählt mit der Frequenz, die vom Prescaler kommt, einmal von 0 bis&lt;br /&gt;
zu der eingestellten Timerauflösung rauf, dann wieder auf  0 zurück.&lt;br /&gt;
(dann wieder von 0 auf Timerauflösung u.s.w.)&lt;br /&gt;
Einmal rauf und runterzählen, ergibt ein Periode.&lt;br /&gt;
Die Periode ist gleich die Ausgangsfrequenz von dem PWM-Signal.&lt;br /&gt;
Ausgangsfrequenz = (Quarzfrequenz/Prescale ) /(Timerauflösung*2)&lt;br /&gt;
&lt;br /&gt;
z.B.: Quarz = 8 MHz ;  Prescaler = 1 ; Timer = 8 Bit&lt;br /&gt;
ergibt:  (8000000Hz/1) / (256*2)  = 15,625 kHz&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder: Quarz = 8 MHz ;  Prescaler = 8 ; Timer = 10 Bit&lt;br /&gt;
ergibt:  (8000000Hz/8) / (2048*2)  = 244,14 Hz&lt;br /&gt;
&lt;br /&gt;
Mit dem Compare Register definiert man nun  das Tastverhältnis!&lt;br /&gt;
Überall, wo nun der Timer diese Compare Linie schneidet, schaltet der Ausgang!&lt;br /&gt;
Beim raufzählen des Timers auf EIN, beim runterzählen auf AUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als Beispiel ein Tastverhältnis von 20%&lt;br /&gt;
[[Bild:Compare205.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als Beispiel ein Tastverhältnis von 80%&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Bild:Compare51.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hier sieht man, wie die Signale dann auf einem Osciloskop  ausschauen.&lt;br /&gt;
Oben das Signal von Pin15 (Compare A) , unten das von Pin 16 (Compare B)&lt;br /&gt;
[[Bild:Osci-PWM-kleiner3.GIF|center]]&lt;br /&gt;
&lt;br /&gt;
=== Grundprogramm ===&lt;br /&gt;
&lt;br /&gt;
Hier nun ein Grundprogramm für die Ausgabe von zwei PWM Signalen mit dem Timer1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
' Hardware PWM mit Timer1&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m8def.dat&amp;quot;&lt;br /&gt;
$crystal = 4000000&lt;br /&gt;
&lt;br /&gt;
Config Pinb.1 = Output&lt;br /&gt;
Config Pinb.2 = Output&lt;br /&gt;
&lt;br /&gt;
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
 Compare1a = 205&lt;br /&gt;
 Compare1b = 51&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;
''' Erklärung:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$regfile = &amp;quot;m8def.dat&amp;quot;&lt;br /&gt;
$crystal = 8000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Definiert den Mega8 und den 8MHz Quarz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Config Pinb.1 = Output&lt;br /&gt;
Config Pinb.2 = Output&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Definiert die zwei Ausgänge von Timer1 auf Ausgabe.&amp;lt;br/&amp;gt;&lt;br /&gt;
Pinb.1 = für Compare1a (= Compare A) = Pin 15&amp;lt;br/&amp;gt;&lt;br /&gt;
Pinb.2 = für Compare1b (= Compare B) = Pin 16&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
;Config Timer1 = Pwm&lt;br /&gt;
: Timer1 auf  PWM  einstellen&lt;br /&gt;
&lt;br /&gt;
;Pwm = 8 &lt;br /&gt;
:Timer Auflösung = 8 Bit einstellen&lt;br /&gt;
&lt;br /&gt;
;Compare A Pwm = Clear Up:Definiert, wie der Compare A schalten soll. Bei  „Clear Up“ schaltet der Ausgang beim erreichen  &lt;br /&gt;
:des Compare-Wertes zuerst auf  High und dann auf Low. Bei „Clear Down“, umgekehrt. &lt;br /&gt;
&lt;br /&gt;
;Compare B Pwm = Clear Up&lt;br /&gt;
:Das gleiche noch mal mit Compare B                                          &lt;br /&gt;
&lt;br /&gt;
;Prescale = 1&lt;br /&gt;
:Hier wird der Prescaler auf  1 eingestellt.&lt;br /&gt;
:(Wert 1 heißt, direkte Frequenz vom Quarz zum Timer.)&lt;br /&gt;
:Weitere Teilungen, wie z.B.: 8, 64, 256 und 1024  sind möglich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Compare1a = 205&lt;br /&gt;
Compare1b = 51&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Hier kann man nun die Werte für das Tastverhältnis, in das Register Compare1a&lt;br /&gt;
und Compare1b schreiben. Oder man kann auch, satt Compare1a und 1b , die Bezeichnungen &lt;br /&gt;
Pwm1a und Pwm1b verwenden. Bascom nimmt beides.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit diesem kurzen Programm, hat man nun zwei PWM Signale erzeigt, wo das eine ein Tastverhältnis&lt;br /&gt;
von 20% (Compare1a) und das andere von 80 % hat. :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Autor==&lt;br /&gt;
*  [[Benutzer:Roberto|Roberto]]&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Avr]]&lt;br /&gt;
* [[Bascom]]&lt;br /&gt;
* [[Pwm]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Quellcode Bascom]]&lt;/div&gt;</summary>
		<author><name>Darth Ding</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Bascom_und_Timer&amp;diff=6596</id>
		<title>Bascom und Timer</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Bascom_und_Timer&amp;diff=6596"/>
				<updated>2006-03-22T21:21:02Z</updated>
		
		<summary type="html">&lt;p&gt;Darth Ding: /* Timer im 1 Sekunden Takt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bascom Timer (Mega8 und andere) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Zweck ===&lt;br /&gt;
[[Timer]] sind selbständige Zähler im Prozessor. Man braucht sie dort, wo zeitkritische und genaue Aufgaben gefordert sind.&lt;br /&gt;
&lt;br /&gt;
=== Struktur: ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 Config TimerXXX = Timer, Prescale= XX    ‘Konfiguriere TimerXXX&lt;br /&gt;
 Enable TimerXXX		          ‘schalte den TimerXXX ein&lt;br /&gt;
 On  TimerXXX   SprungXXX	          ‘verzweige bei TimerXXX überlauf zu SprungXXX&lt;br /&gt;
 Enable Interrupts		          ‘generell Interrupts zulassen&lt;br /&gt;
 &lt;br /&gt;
 Do&lt;br /&gt;
 ....Hauptprogramm		‘Hauptprogramm&lt;br /&gt;
 Loop&lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
 SprungXXX:			‘Unterprogramm von TimerXXX&lt;br /&gt;
 ....Ausführung			‘arbeitet hier etwas ab und springt mit Return &lt;br /&gt;
 Return				‚ wieder zurück, zum Hauptprogramm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zuerst muss man den zu verwendeten Timer mit „Config“, konfigurieren. &lt;br /&gt;
Dazu definiert man ihn als Timer (mann könnte auch einen Counter daraus machen).&lt;br /&gt;
Dazu muss man noch den Prescaler definieren. &amp;gt;Der Prescaler ist der Teiler, der die Quarzfequenz für den Timer reduziert .&lt;br /&gt;
(Sonst würde der Timer immer mit der vollen Frequenz vom Quarz zählen und das würde meistens zu schnell sein.)&lt;br /&gt;
 &lt;br /&gt;
Dann mit „Enable“ den bestimmten Timer einschalten. &lt;br /&gt;
Mit „On“ das Unterprogramm (ISR) definieren, an die der Timer springen soll,  &lt;br /&gt;
wenn dieser überläuft(ISR= Interrupt Service Routine). Dann das generelle Einschalten von Interrupts.&lt;br /&gt;
&lt;br /&gt;
Jeder Zähler hat eine bestimmte, maximale Zählweite. Zählt er über diese, fängt er wieder bei Null an zu zählen (Überlauf).&lt;br /&gt;
Wie weit ein Zähler zählen kann, ergibt sich aus seiner Struktur. Es gibt da 8-Bit Timer (Timer0 und Timer2, beim Mega8)und 16-Bit Timer (Timer1 beim Mega8).&lt;br /&gt;
8-Bit Timer zählen von 0 bis 255, 16-Bit Timer von 0 bis 65535.&lt;br /&gt;
&lt;br /&gt;
Bei einem Überlauf, unterbricht der Timer das Hauptprogramm und springt in die ISR. Die ISR wird abgearbeitet und mit Return wird wieder an &lt;br /&gt;
die Stelle zurückgesprungen, wo vorher das Hauptprogramm unterbrochen wurde. &lt;br /&gt;
&lt;br /&gt;
Man soll darauf achten, dass in der ISR immer nur kurze Anweisungen abgearbeitet &lt;br /&gt;
werden und der Hauptteil dann im Hauptprogramm bearbeitet wird. &lt;br /&gt;
Sonst kann es sein, dass man den Prozessor damit blockiert.&lt;br /&gt;
&lt;br /&gt;
=== Timer Beispiel: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 Config Timer0 = Timer, Prescale= 8     ‘Konfiguriere Timer0&lt;br /&gt;
 Enable Timer0            	        ‘schalte den Timer0 ein&lt;br /&gt;
 On  Timer0  Isr_von_Timer0	        ‘verzweige bei Timer0 überlauf zu Isr_von_Timer0&lt;br /&gt;
 Enable Interrupts	  &lt;br /&gt;
 &lt;br /&gt;
 Do&lt;br /&gt;
 ....Hauptprogramm&lt;br /&gt;
 Loop&lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
 Isr_von_Timer0:			‘ISR von Timer0&lt;br /&gt;
 .....Programm-Code&lt;br /&gt;
 Return&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Timer0 ist nun so eingestellt, dass die Frequenz vom Quarz, durch den Prescaler,  durch 8 geteilt wird.&amp;lt;br&amp;gt;&lt;br /&gt;
(Beim Prescaler kann man Teilungen von 1 , 8 , 64, 256, oder 1024 einstellen).&amp;lt;br&amp;gt; Diese Frequenz kommt nun zum Timer0 und der zählt nun mit dieser Frequenz bis 255.&lt;br /&gt;
Ab 255 läuft der Timer über, fängt wieder bei Null an zu zählen, und verzweigt dabei in die ISR.&lt;br /&gt;
Mit Return springt die ISR dann wieder zum Hauptprogramm zurück.&lt;br /&gt;
In der ISR könnte man z.B. eine Variable hochzählen. Diese würde dann bei einem 8Mhz Quarz, ca. 3906mal in der Sekunde um 1 hochgezählt. ( (8000000Hz/8) /256=3906.26Hz)&lt;br /&gt;
&lt;br /&gt;
=== Timer im 1 Sekunden Takt ===&lt;br /&gt;
&lt;br /&gt;
Wenn man jetzt z.B. will, dass eine Variable nur alle Sekunden um 1 hochgezählt wird, muss man den Prescaler anpassen und auch noch die Zählweite vom Timer anpassen.&lt;br /&gt;
Die Zählweite vom Timer kann man nur insovern verändern, dass man ihn nicht von Null weg zählen lässt, sondern von einem höheren Wert.(der Überlauf ist immer der maximale Wert vom Timer)&lt;br /&gt;
&lt;br /&gt;
Da der Timer0 aber mit 8-Bit jetzt zu kurz zählt (0-255) und wir mit einem grossen Prescaler auch nicht auf 1 Sekunde kommen, nehmen wir dazu den Timer1.&lt;br /&gt;
&lt;br /&gt;
Der Timer1 ist ein 16-Bit Timer und kann  von 0-65535 zählen.&lt;br /&gt;
&lt;br /&gt;
Wenn ich jetzt einen Prescaler von 256 verwende, bekomme ich bei einem 8Mhz Quarz, eine Taktrate von 31250Hz. Das heist, dass der Zähler in einer Sekunde  von 0 bis 31250 zählt. Wenn ich jetzt will, dass der Timer nach 31250 Zählungen überläuft (weil nur beim Überlaufen springt er in die ISR und zählt somit meine Variable um 1 hoch), darf ich den Timer nicht von Null wegzählen lassen sondern von einem höheren Wert.&lt;br /&gt;
&lt;br /&gt;
Dazu muss ich die maximale mögliche Zählweite (16-Bit = 65535) von meiner gewünschten Zählweite, abziehen. Also 65535-31250 = 34285 .Der Timer muss also schon bei 34285 zu zählen anfangen und macht dann nach 1 Sekunde einen Überlauf. 34285+31250= 65535 = Überlauf&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel mit dem Timer 1.&lt;br /&gt;
Zur Kontrolle wird eine Led im Sekundentakt aus und ein geschalten.&lt;br /&gt;
Man kann in der ISR auch eine Variable hochzählen lassen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$regfile = &amp;quot;m8def.dat&amp;quot;                    'für Mega8 &lt;br /&gt;
$crystal = 8000000                        'für 8MHz Quarz&lt;br /&gt;
&lt;br /&gt;
Config Portd = Output                     'definiert Portd als Output&lt;br /&gt;
&lt;br /&gt;
Config Timer1 = Timer , Prescale = 256    'Konfiguriere Timer1&lt;br /&gt;
Enable Timer1                             'schalte den Timer1 ein&lt;br /&gt;
On Timer1 Isr_von_timer1                  'verzweige bei Timer1 überlauf zu   Isr_von_Timer1&lt;br /&gt;
Enable Interrupts&lt;br /&gt;
Timer1 = 34285                            'Timer1 soll schon von 34285 wegzählen&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
 '....Hauptprogramm&lt;br /&gt;
Loop&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Isr_von_timer1:                            'ISR von Timer1&lt;br /&gt;
Timer1 = 34285                             'Timer1 soll wieder von 34285 wegzählen&lt;br /&gt;
Toggle Portd.0                             'schaltet Portd.0 im Sekundentakt&lt;br /&gt;
                                           'EIN und AUS&lt;br /&gt;
'....oder z.B. incr Variable   &lt;br /&gt;
&lt;br /&gt;
Return&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Vorgabe (Timer1=34285) soll man vor dem Hauptprogramm reinsetzen und bei der ISR.&lt;br /&gt;
Wenn man die Vorgabe nicht bei der ISR reinsetzen würde (ISR = Überlauf), würde er ja wieder bei 0 statt bei 34285 anfangen zu zählen.&lt;br /&gt;
&lt;br /&gt;
Um sich das Rechnen zu ersparen könnte man statt der Anweisung: Timer1 = 34286 , auch den Befehl &amp;quot;Load&amp;quot; verwenden. &lt;br /&gt;
&lt;br /&gt;
Man gibt dann ein:  Load Timer1 , 31250 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit Load rechnet sich der Compiler selber die Werte aus ( 65536-31250 ).Man gibt einfach nach dem Komma, die beabsichtigte Zählweite ein.&lt;br /&gt;
&lt;br /&gt;
Damit hat man nun einen Timer der alle Sekunden eine Variable hochzählt.&lt;br /&gt;
&lt;br /&gt;
Um das Zählen der Sekunden noch genauer zu machen, müsste man noch die Zeiten für Sprung in die ISR u.s.w. mit einberechen. Aber für die meisten Anwendungen reicht diese Genauigkeit vollkommen aus !  :-)&lt;br /&gt;
&lt;br /&gt;
==Autor==&lt;br /&gt;
*  [[Benutzer:Roberto|Roberto]]&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Avr]]&lt;br /&gt;
* [[Timer]]&lt;br /&gt;
* [[Bascom]]&lt;br /&gt;
* [[Interrupt]]&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/dload.php?action=file&amp;amp;file_id=169 AvrTimer Windows Berechnungstool / Bascom Codegenerator]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Quellcode Bascom]]&lt;/div&gt;</summary>
		<author><name>Darth Ding</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Bascom_und_Timer&amp;diff=6595</id>
		<title>Bascom und Timer</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Bascom_und_Timer&amp;diff=6595"/>
				<updated>2006-03-22T21:20:36Z</updated>
		
		<summary type="html">&lt;p&gt;Darth Ding: /* Timer im 1 Sekunden Takt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bascom Timer (Mega8 und andere) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Zweck ===&lt;br /&gt;
[[Timer]] sind selbständige Zähler im Prozessor. Man braucht sie dort, wo zeitkritische und genaue Aufgaben gefordert sind.&lt;br /&gt;
&lt;br /&gt;
=== Struktur: ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 Config TimerXXX = Timer, Prescale= XX    ‘Konfiguriere TimerXXX&lt;br /&gt;
 Enable TimerXXX		          ‘schalte den TimerXXX ein&lt;br /&gt;
 On  TimerXXX   SprungXXX	          ‘verzweige bei TimerXXX überlauf zu SprungXXX&lt;br /&gt;
 Enable Interrupts		          ‘generell Interrupts zulassen&lt;br /&gt;
 &lt;br /&gt;
 Do&lt;br /&gt;
 ....Hauptprogramm		‘Hauptprogramm&lt;br /&gt;
 Loop&lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
 SprungXXX:			‘Unterprogramm von TimerXXX&lt;br /&gt;
 ....Ausführung			‘arbeitet hier etwas ab und springt mit Return &lt;br /&gt;
 Return				‚ wieder zurück, zum Hauptprogramm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zuerst muss man den zu verwendeten Timer mit „Config“, konfigurieren. &lt;br /&gt;
Dazu definiert man ihn als Timer (mann könnte auch einen Counter daraus machen).&lt;br /&gt;
Dazu muss man noch den Prescaler definieren. &amp;gt;Der Prescaler ist der Teiler, der die Quarzfequenz für den Timer reduziert .&lt;br /&gt;
(Sonst würde der Timer immer mit der vollen Frequenz vom Quarz zählen und das würde meistens zu schnell sein.)&lt;br /&gt;
 &lt;br /&gt;
Dann mit „Enable“ den bestimmten Timer einschalten. &lt;br /&gt;
Mit „On“ das Unterprogramm (ISR) definieren, an die der Timer springen soll,  &lt;br /&gt;
wenn dieser überläuft(ISR= Interrupt Service Routine). Dann das generelle Einschalten von Interrupts.&lt;br /&gt;
&lt;br /&gt;
Jeder Zähler hat eine bestimmte, maximale Zählweite. Zählt er über diese, fängt er wieder bei Null an zu zählen (Überlauf).&lt;br /&gt;
Wie weit ein Zähler zählen kann, ergibt sich aus seiner Struktur. Es gibt da 8-Bit Timer (Timer0 und Timer2, beim Mega8)und 16-Bit Timer (Timer1 beim Mega8).&lt;br /&gt;
8-Bit Timer zählen von 0 bis 255, 16-Bit Timer von 0 bis 65535.&lt;br /&gt;
&lt;br /&gt;
Bei einem Überlauf, unterbricht der Timer das Hauptprogramm und springt in die ISR. Die ISR wird abgearbeitet und mit Return wird wieder an &lt;br /&gt;
die Stelle zurückgesprungen, wo vorher das Hauptprogramm unterbrochen wurde. &lt;br /&gt;
&lt;br /&gt;
Man soll darauf achten, dass in der ISR immer nur kurze Anweisungen abgearbeitet &lt;br /&gt;
werden und der Hauptteil dann im Hauptprogramm bearbeitet wird. &lt;br /&gt;
Sonst kann es sein, dass man den Prozessor damit blockiert.&lt;br /&gt;
&lt;br /&gt;
=== Timer Beispiel: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 Config Timer0 = Timer, Prescale= 8     ‘Konfiguriere Timer0&lt;br /&gt;
 Enable Timer0            	        ‘schalte den Timer0 ein&lt;br /&gt;
 On  Timer0  Isr_von_Timer0	        ‘verzweige bei Timer0 überlauf zu Isr_von_Timer0&lt;br /&gt;
 Enable Interrupts	  &lt;br /&gt;
 &lt;br /&gt;
 Do&lt;br /&gt;
 ....Hauptprogramm&lt;br /&gt;
 Loop&lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
 Isr_von_Timer0:			‘ISR von Timer0&lt;br /&gt;
 .....Programm-Code&lt;br /&gt;
 Return&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Timer0 ist nun so eingestellt, dass die Frequenz vom Quarz, durch den Prescaler,  durch 8 geteilt wird.&amp;lt;br&amp;gt;&lt;br /&gt;
(Beim Prescaler kann man Teilungen von 1 , 8 , 64, 256, oder 1024 einstellen).&amp;lt;br&amp;gt; Diese Frequenz kommt nun zum Timer0 und der zählt nun mit dieser Frequenz bis 255.&lt;br /&gt;
Ab 255 läuft der Timer über, fängt wieder bei Null an zu zählen, und verzweigt dabei in die ISR.&lt;br /&gt;
Mit Return springt die ISR dann wieder zum Hauptprogramm zurück.&lt;br /&gt;
In der ISR könnte man z.B. eine Variable hochzählen. Diese würde dann bei einem 8Mhz Quarz, ca. 3906mal in der Sekunde um 1 hochgezählt. ( (8000000Hz/8) /256=3906.26Hz)&lt;br /&gt;
&lt;br /&gt;
=== Timer im 1 Sekunden Takt ===&lt;br /&gt;
&lt;br /&gt;
Wenn man jetzt z.B. will, dass eine Variable nur alle Sekunden um 1 hochgezählt wird, muss man den Prescaler anpassen und auch noch die Zählweite vom Timer anpassen.&lt;br /&gt;
Die Zählweite vom Timer kann man nur insovern verändern, dass man ihn nicht von Null weg zählen lässt, sondern von einem höheren Wert.(der Überlauf ist immer der maximale Wert vom Timer)&lt;br /&gt;
&lt;br /&gt;
Da der Timer0 aber mit 8-Bit jetzt zu kurz zählt (0-255) und wir mit einem grossen Prescaler auch nicht auf 1 Sekunde kommen, nehmen wir dazu den Timer1.&lt;br /&gt;
&lt;br /&gt;
Der Timer1 ist ein 16-Bit Timer und kann  von 0-65536 zählen.&lt;br /&gt;
&lt;br /&gt;
Wenn ich jetzt einen Prescaler von 256 verwende, bekomme ich bei einem 8Mhz Quarz, eine Taktrate von 31250Hz. Das heist, dass der Zähler in einer Sekunde  von 0 bis 31250 zählt. Wenn ich jetzt will, dass der Timer nach 31250 Zählungen überläuft (weil nur beim Überlaufen springt er in die ISR und zählt somit meine Variable um 1 hoch), darf ich den Timer nicht von Null wegzählen lassen sondern von einem höheren Wert.&lt;br /&gt;
&lt;br /&gt;
Dazu muss ich die maximale mögliche Zählweite (16-Bit = 65535) von meiner gewünschten Zählweite, abziehen. Also 65535-31250 = 34285 .Der Timer muss also schon bei 34285 zu zählen anfangen und macht dann nach 1 Sekunde einen Überlauf. 34285+31250= 65535 = Überlauf&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel mit dem Timer 1.&lt;br /&gt;
Zur Kontrolle wird eine Led im Sekundentakt aus und ein geschalten.&lt;br /&gt;
Man kann in der ISR auch eine Variable hochzählen lassen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$regfile = &amp;quot;m8def.dat&amp;quot;                    'für Mega8 &lt;br /&gt;
$crystal = 8000000                        'für 8MHz Quarz&lt;br /&gt;
&lt;br /&gt;
Config Portd = Output                     'definiert Portd als Output&lt;br /&gt;
&lt;br /&gt;
Config Timer1 = Timer , Prescale = 256    'Konfiguriere Timer1&lt;br /&gt;
Enable Timer1                             'schalte den Timer1 ein&lt;br /&gt;
On Timer1 Isr_von_timer1                  'verzweige bei Timer1 überlauf zu   Isr_von_Timer1&lt;br /&gt;
Enable Interrupts&lt;br /&gt;
Timer1 = 34285                            'Timer1 soll schon von 34285 wegzählen&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
 '....Hauptprogramm&lt;br /&gt;
Loop&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Isr_von_timer1:                            'ISR von Timer1&lt;br /&gt;
Timer1 = 34285                             'Timer1 soll wieder von 34285 wegzählen&lt;br /&gt;
Toggle Portd.0                             'schaltet Portd.0 im Sekundentakt&lt;br /&gt;
                                           'EIN und AUS&lt;br /&gt;
'....oder z.B. incr Variable   &lt;br /&gt;
&lt;br /&gt;
Return&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Vorgabe (Timer1=34285) soll man vor dem Hauptprogramm reinsetzen und bei der ISR.&lt;br /&gt;
Wenn man die Vorgabe nicht bei der ISR reinsetzen würde (ISR = Überlauf), würde er ja wieder bei 0 statt bei 34285 anfangen zu zählen.&lt;br /&gt;
&lt;br /&gt;
Um sich das Rechnen zu ersparen könnte man statt der Anweisung: Timer1 = 34286 , auch den Befehl &amp;quot;Load&amp;quot; verwenden. &lt;br /&gt;
&lt;br /&gt;
Man gibt dann ein:  Load Timer1 , 31250 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit Load rechnet sich der Compiler selber die Werte aus ( 65536-31250 ).Man gibt einfach nach dem Komma, die beabsichtigte Zählweite ein.&lt;br /&gt;
&lt;br /&gt;
Damit hat man nun einen Timer der alle Sekunden eine Variable hochzählt.&lt;br /&gt;
&lt;br /&gt;
Um das Zählen der Sekunden noch genauer zu machen, müsste man noch die Zeiten für Sprung in die ISR u.s.w. mit einberechen. Aber für die meisten Anwendungen reicht diese Genauigkeit vollkommen aus !  :-)&lt;br /&gt;
&lt;br /&gt;
==Autor==&lt;br /&gt;
*  [[Benutzer:Roberto|Roberto]]&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Avr]]&lt;br /&gt;
* [[Timer]]&lt;br /&gt;
* [[Bascom]]&lt;br /&gt;
* [[Interrupt]]&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/dload.php?action=file&amp;amp;file_id=169 AvrTimer Windows Berechnungstool / Bascom Codegenerator]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Quellcode Bascom]]&lt;/div&gt;</summary>
		<author><name>Darth Ding</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Bascom_und_Timer&amp;diff=6594</id>
		<title>Bascom und Timer</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Bascom_und_Timer&amp;diff=6594"/>
				<updated>2006-03-22T21:18:45Z</updated>
		
		<summary type="html">&lt;p&gt;Darth Ding: /* Timer im 1 Sekunden Takt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bascom Timer (Mega8 und andere) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Zweck ===&lt;br /&gt;
[[Timer]] sind selbständige Zähler im Prozessor. Man braucht sie dort, wo zeitkritische und genaue Aufgaben gefordert sind.&lt;br /&gt;
&lt;br /&gt;
=== Struktur: ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 Config TimerXXX = Timer, Prescale= XX    ‘Konfiguriere TimerXXX&lt;br /&gt;
 Enable TimerXXX		          ‘schalte den TimerXXX ein&lt;br /&gt;
 On  TimerXXX   SprungXXX	          ‘verzweige bei TimerXXX überlauf zu SprungXXX&lt;br /&gt;
 Enable Interrupts		          ‘generell Interrupts zulassen&lt;br /&gt;
 &lt;br /&gt;
 Do&lt;br /&gt;
 ....Hauptprogramm		‘Hauptprogramm&lt;br /&gt;
 Loop&lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
 SprungXXX:			‘Unterprogramm von TimerXXX&lt;br /&gt;
 ....Ausführung			‘arbeitet hier etwas ab und springt mit Return &lt;br /&gt;
 Return				‚ wieder zurück, zum Hauptprogramm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zuerst muss man den zu verwendeten Timer mit „Config“, konfigurieren. &lt;br /&gt;
Dazu definiert man ihn als Timer (mann könnte auch einen Counter daraus machen).&lt;br /&gt;
Dazu muss man noch den Prescaler definieren. &amp;gt;Der Prescaler ist der Teiler, der die Quarzfequenz für den Timer reduziert .&lt;br /&gt;
(Sonst würde der Timer immer mit der vollen Frequenz vom Quarz zählen und das würde meistens zu schnell sein.)&lt;br /&gt;
 &lt;br /&gt;
Dann mit „Enable“ den bestimmten Timer einschalten. &lt;br /&gt;
Mit „On“ das Unterprogramm (ISR) definieren, an die der Timer springen soll,  &lt;br /&gt;
wenn dieser überläuft(ISR= Interrupt Service Routine). Dann das generelle Einschalten von Interrupts.&lt;br /&gt;
&lt;br /&gt;
Jeder Zähler hat eine bestimmte, maximale Zählweite. Zählt er über diese, fängt er wieder bei Null an zu zählen (Überlauf).&lt;br /&gt;
Wie weit ein Zähler zählen kann, ergibt sich aus seiner Struktur. Es gibt da 8-Bit Timer (Timer0 und Timer2, beim Mega8)und 16-Bit Timer (Timer1 beim Mega8).&lt;br /&gt;
8-Bit Timer zählen von 0 bis 255, 16-Bit Timer von 0 bis 65535.&lt;br /&gt;
&lt;br /&gt;
Bei einem Überlauf, unterbricht der Timer das Hauptprogramm und springt in die ISR. Die ISR wird abgearbeitet und mit Return wird wieder an &lt;br /&gt;
die Stelle zurückgesprungen, wo vorher das Hauptprogramm unterbrochen wurde. &lt;br /&gt;
&lt;br /&gt;
Man soll darauf achten, dass in der ISR immer nur kurze Anweisungen abgearbeitet &lt;br /&gt;
werden und der Hauptteil dann im Hauptprogramm bearbeitet wird. &lt;br /&gt;
Sonst kann es sein, dass man den Prozessor damit blockiert.&lt;br /&gt;
&lt;br /&gt;
=== Timer Beispiel: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 Config Timer0 = Timer, Prescale= 8     ‘Konfiguriere Timer0&lt;br /&gt;
 Enable Timer0            	        ‘schalte den Timer0 ein&lt;br /&gt;
 On  Timer0  Isr_von_Timer0	        ‘verzweige bei Timer0 überlauf zu Isr_von_Timer0&lt;br /&gt;
 Enable Interrupts	  &lt;br /&gt;
 &lt;br /&gt;
 Do&lt;br /&gt;
 ....Hauptprogramm&lt;br /&gt;
 Loop&lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
 Isr_von_Timer0:			‘ISR von Timer0&lt;br /&gt;
 .....Programm-Code&lt;br /&gt;
 Return&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Timer0 ist nun so eingestellt, dass die Frequenz vom Quarz, durch den Prescaler,  durch 8 geteilt wird.&amp;lt;br&amp;gt;&lt;br /&gt;
(Beim Prescaler kann man Teilungen von 1 , 8 , 64, 256, oder 1024 einstellen).&amp;lt;br&amp;gt; Diese Frequenz kommt nun zum Timer0 und der zählt nun mit dieser Frequenz bis 255.&lt;br /&gt;
Ab 255 läuft der Timer über, fängt wieder bei Null an zu zählen, und verzweigt dabei in die ISR.&lt;br /&gt;
Mit Return springt die ISR dann wieder zum Hauptprogramm zurück.&lt;br /&gt;
In der ISR könnte man z.B. eine Variable hochzählen. Diese würde dann bei einem 8Mhz Quarz, ca. 3906mal in der Sekunde um 1 hochgezählt. ( (8000000Hz/8) /256=3906.26Hz)&lt;br /&gt;
&lt;br /&gt;
=== Timer im 1 Sekunden Takt ===&lt;br /&gt;
&lt;br /&gt;
Wenn man jetzt z.B. will, dass eine Variable nur alle Sekunden um 1 hochgezählt wird, muss man den Prescaler anpassen und auch noch die Zählweite vom Timer anpassen.&lt;br /&gt;
Die Zählweite vom Timer kann man nur insovern verändern, dass man ihn nicht von Null weg zählen lässt, sondern von einem höheren Wert.(der Überlauf ist immer der maximale Wert vom Timer)&lt;br /&gt;
&lt;br /&gt;
Da der Timer0 aber mit 8-Bit jetzt zu kurz zählt (0-255) und wir mit einem grossen Prescaler auch nicht auf 1 Sekunde kommen, nehmen wir dazu den Timer1.&lt;br /&gt;
&lt;br /&gt;
Der Timer1 ist ein 16-Bit Timer und kann  von 0-65536 zählen.&lt;br /&gt;
&lt;br /&gt;
Wenn ich jetzt einen Prescaler von 256 verwende, bekomme ich bei einem 8Mhz Quarz, eine Taktrate von 31250Hz. Das heist, dass der Zähler in einer Sekunde  von 0 bis 31250 zählt. Wenn ich jetzt will, dass der Timer nach 31250 Zählungen überläuft (weil nur beim Überlaufen springt er in die ISR und zählt somit meine Variable um 1 hoch), darf ich den Timer nicht von Null wegzählen lassen sondern von einem höheren Wert.&lt;br /&gt;
&lt;br /&gt;
Dazu muss ich die maximale mögliche Zählweite (16-Bit = 65536) von meiner gewünschten Zählweite, abziehen. Also 65536-31250 = 34286 .Der Timer muss also schon bei 34286 zu zählen anfangen und macht dann nach 1 Sekunde einen Überlauf. 34286+31250= 65536 = Überlauf&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel mit dem Timer 1.&lt;br /&gt;
Zur Kontrolle wird eine Led im Sekundentakt aus und ein geschalten.&lt;br /&gt;
Man kann in der ISR auch eine Variable hochzählen lassen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$regfile = &amp;quot;m8def.dat&amp;quot;                    'für Mega8 &lt;br /&gt;
$crystal = 8000000                        'für 8MHz Quarz&lt;br /&gt;
&lt;br /&gt;
Config Portd = Output                     'definiert Portd als Output&lt;br /&gt;
&lt;br /&gt;
Config Timer1 = Timer , Prescale = 256    'Konfiguriere Timer1&lt;br /&gt;
Enable Timer1                             'schalte den Timer1 ein&lt;br /&gt;
On Timer1 Isr_von_timer1                  'verzweige bei Timer1 überlauf zu   Isr_von_Timer1&lt;br /&gt;
Enable Interrupts&lt;br /&gt;
Timer1 = 34286                            'Timer1 soll schon von 34286 wegzählen&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
 '....Hauptprogramm&lt;br /&gt;
Loop&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Isr_von_timer1:                            'ISR von Timer1&lt;br /&gt;
Timer1 = 34286                             'Timer1 soll wieder von 34286 wegzählen&lt;br /&gt;
Toggle Portd.0                             'schaltet Portd.0 im Sekundentakt&lt;br /&gt;
                                           'EIN und AUS&lt;br /&gt;
'....oder z.B. incr Variable   &lt;br /&gt;
&lt;br /&gt;
Return&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Vorgabe (Timer1=34286) soll man vor dem Hauptprogramm reinsetzen und bei der ISR.&lt;br /&gt;
Wenn man die Vorgabe nicht bei der ISR reinsetzen würde (ISR = Überlauf), würde er ja wieder bei 0 statt bei 34286 anfangen zu zählen.&lt;br /&gt;
&lt;br /&gt;
Um sich das Rechnen zu ersparen könnte man statt der Anweisung: Timer1 = 34286 , auch den Befehl &amp;quot;Load&amp;quot; verwenden. &lt;br /&gt;
&lt;br /&gt;
Man gibt dann ein:  Load Timer1 , 31250 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit Load rechnet sich der Compiler selber die Werte aus ( 65536-31250 ).Man gibt einfach nach dem Komma, die beabsichtigte Zählweite ein.&lt;br /&gt;
&lt;br /&gt;
Damit hat man nun einen Timer der alle Sekunden eine Variable hochzählt.&lt;br /&gt;
&lt;br /&gt;
Um das Zählen der Sekunden noch genauer zu machen, müsste man noch die Zeiten für Sprung in die ISR u.s.w. mit einberechen. Aber für die meisten Anwendungen reicht diese Genauigkeit vollkommen aus !  :-)&lt;br /&gt;
&lt;br /&gt;
==Autor==&lt;br /&gt;
*  [[Benutzer:Roberto|Roberto]]&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Avr]]&lt;br /&gt;
* [[Timer]]&lt;br /&gt;
* [[Bascom]]&lt;br /&gt;
* [[Interrupt]]&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/dload.php?action=file&amp;amp;file_id=169 AvrTimer Windows Berechnungstool / Bascom Codegenerator]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Quellcode Bascom]]&lt;/div&gt;</summary>
		<author><name>Darth Ding</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Bascom_und_Timer&amp;diff=6593</id>
		<title>Bascom und Timer</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Bascom_und_Timer&amp;diff=6593"/>
				<updated>2006-03-22T21:18:18Z</updated>
		
		<summary type="html">&lt;p&gt;Darth Ding: /* Timer Beispiel: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bascom Timer (Mega8 und andere) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Zweck ===&lt;br /&gt;
[[Timer]] sind selbständige Zähler im Prozessor. Man braucht sie dort, wo zeitkritische und genaue Aufgaben gefordert sind.&lt;br /&gt;
&lt;br /&gt;
=== Struktur: ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 Config TimerXXX = Timer, Prescale= XX    ‘Konfiguriere TimerXXX&lt;br /&gt;
 Enable TimerXXX		          ‘schalte den TimerXXX ein&lt;br /&gt;
 On  TimerXXX   SprungXXX	          ‘verzweige bei TimerXXX überlauf zu SprungXXX&lt;br /&gt;
 Enable Interrupts		          ‘generell Interrupts zulassen&lt;br /&gt;
 &lt;br /&gt;
 Do&lt;br /&gt;
 ....Hauptprogramm		‘Hauptprogramm&lt;br /&gt;
 Loop&lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
 SprungXXX:			‘Unterprogramm von TimerXXX&lt;br /&gt;
 ....Ausführung			‘arbeitet hier etwas ab und springt mit Return &lt;br /&gt;
 Return				‚ wieder zurück, zum Hauptprogramm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zuerst muss man den zu verwendeten Timer mit „Config“, konfigurieren. &lt;br /&gt;
Dazu definiert man ihn als Timer (mann könnte auch einen Counter daraus machen).&lt;br /&gt;
Dazu muss man noch den Prescaler definieren. &amp;gt;Der Prescaler ist der Teiler, der die Quarzfequenz für den Timer reduziert .&lt;br /&gt;
(Sonst würde der Timer immer mit der vollen Frequenz vom Quarz zählen und das würde meistens zu schnell sein.)&lt;br /&gt;
 &lt;br /&gt;
Dann mit „Enable“ den bestimmten Timer einschalten. &lt;br /&gt;
Mit „On“ das Unterprogramm (ISR) definieren, an die der Timer springen soll,  &lt;br /&gt;
wenn dieser überläuft(ISR= Interrupt Service Routine). Dann das generelle Einschalten von Interrupts.&lt;br /&gt;
&lt;br /&gt;
Jeder Zähler hat eine bestimmte, maximale Zählweite. Zählt er über diese, fängt er wieder bei Null an zu zählen (Überlauf).&lt;br /&gt;
Wie weit ein Zähler zählen kann, ergibt sich aus seiner Struktur. Es gibt da 8-Bit Timer (Timer0 und Timer2, beim Mega8)und 16-Bit Timer (Timer1 beim Mega8).&lt;br /&gt;
8-Bit Timer zählen von 0 bis 255, 16-Bit Timer von 0 bis 65535.&lt;br /&gt;
&lt;br /&gt;
Bei einem Überlauf, unterbricht der Timer das Hauptprogramm und springt in die ISR. Die ISR wird abgearbeitet und mit Return wird wieder an &lt;br /&gt;
die Stelle zurückgesprungen, wo vorher das Hauptprogramm unterbrochen wurde. &lt;br /&gt;
&lt;br /&gt;
Man soll darauf achten, dass in der ISR immer nur kurze Anweisungen abgearbeitet &lt;br /&gt;
werden und der Hauptteil dann im Hauptprogramm bearbeitet wird. &lt;br /&gt;
Sonst kann es sein, dass man den Prozessor damit blockiert.&lt;br /&gt;
&lt;br /&gt;
=== Timer Beispiel: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 Config Timer0 = Timer, Prescale= 8     ‘Konfiguriere Timer0&lt;br /&gt;
 Enable Timer0            	        ‘schalte den Timer0 ein&lt;br /&gt;
 On  Timer0  Isr_von_Timer0	        ‘verzweige bei Timer0 überlauf zu Isr_von_Timer0&lt;br /&gt;
 Enable Interrupts	  &lt;br /&gt;
 &lt;br /&gt;
 Do&lt;br /&gt;
 ....Hauptprogramm&lt;br /&gt;
 Loop&lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
 Isr_von_Timer0:			‘ISR von Timer0&lt;br /&gt;
 .....Programm-Code&lt;br /&gt;
 Return&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Timer0 ist nun so eingestellt, dass die Frequenz vom Quarz, durch den Prescaler,  durch 8 geteilt wird.&amp;lt;br&amp;gt;&lt;br /&gt;
(Beim Prescaler kann man Teilungen von 1 , 8 , 64, 256, oder 1024 einstellen).&amp;lt;br&amp;gt; Diese Frequenz kommt nun zum Timer0 und der zählt nun mit dieser Frequenz bis 255.&lt;br /&gt;
Ab 255 läuft der Timer über, fängt wieder bei Null an zu zählen, und verzweigt dabei in die ISR.&lt;br /&gt;
Mit Return springt die ISR dann wieder zum Hauptprogramm zurück.&lt;br /&gt;
In der ISR könnte man z.B. eine Variable hochzählen. Diese würde dann bei einem 8Mhz Quarz, ca. 3906mal in der Sekunde um 1 hochgezählt. ( (8000000Hz/8) /256=3906.26Hz)&lt;br /&gt;
&lt;br /&gt;
=== Timer im 1 Sekunden Takt ===&lt;br /&gt;
&lt;br /&gt;
Wenn man jetzt z.B. will, dass eine Variable nur alle Sekunden um 1 hochgezählt wird, muss man den Prescaler anpassen und auch noch die Zählweite vom Timer anpassen.&lt;br /&gt;
Die Zählweite vom Timer kann man nur insovern verändern, dass man ihn nicht von Null weg zählen lässt, sondern von einem höheren Wert.(der Überlauf ist immer der maximale Wert vom Timer)&lt;br /&gt;
&lt;br /&gt;
Da der Timer0 aber mit 8-Bit jetzt zu kurz zählt (0-256) und wir mit einem grossen Prescaler auch nicht auf 1 Sekunde kommen, nehmen wir dazu den Timer1.&lt;br /&gt;
&lt;br /&gt;
Der Timer1 ist ein 16-Bit Timer und kann  von 0-65536 zählen.&lt;br /&gt;
&lt;br /&gt;
Wenn ich jetzt einen Prescaler von 256 verwende, bekomme ich bei einem 8Mhz Quarz, eine Taktrate von 31250Hz. Das heist, dass der Zähler in einer Sekunde  von 0 bis 31250 zählt. Wenn ich jetzt will, dass der Timer nach 31250 Zählungen überläuft (weil nur beim Überlaufen springt er in die ISR und zählt somit meine Variable um 1 hoch), darf ich den Timer nicht von Null wegzählen lassen sondern von einem höheren Wert.&lt;br /&gt;
&lt;br /&gt;
Dazu muss ich die maximale mögliche Zählweite (16-Bit = 65536) von meiner gewünschten Zählweite, abziehen. Also 65536-31250 = 34286 .Der Timer muss also schon bei 34286 zu zählen anfangen und macht dann nach 1 Sekunde einen Überlauf. 34286+31250= 65536 = Überlauf&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel mit dem Timer 1.&lt;br /&gt;
Zur Kontrolle wird eine Led im Sekundentakt aus und ein geschalten.&lt;br /&gt;
Man kann in der ISR auch eine Variable hochzählen lassen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$regfile = &amp;quot;m8def.dat&amp;quot;                    'für Mega8 &lt;br /&gt;
$crystal = 8000000                        'für 8MHz Quarz&lt;br /&gt;
&lt;br /&gt;
Config Portd = Output                     'definiert Portd als Output&lt;br /&gt;
&lt;br /&gt;
Config Timer1 = Timer , Prescale = 256    'Konfiguriere Timer1&lt;br /&gt;
Enable Timer1                             'schalte den Timer1 ein&lt;br /&gt;
On Timer1 Isr_von_timer1                  'verzweige bei Timer1 überlauf zu   Isr_von_Timer1&lt;br /&gt;
Enable Interrupts&lt;br /&gt;
Timer1 = 34286                            'Timer1 soll schon von 34286 wegzählen&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
 '....Hauptprogramm&lt;br /&gt;
Loop&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Isr_von_timer1:                            'ISR von Timer1&lt;br /&gt;
Timer1 = 34286                             'Timer1 soll wieder von 34286 wegzählen&lt;br /&gt;
Toggle Portd.0                             'schaltet Portd.0 im Sekundentakt&lt;br /&gt;
                                           'EIN und AUS&lt;br /&gt;
'....oder z.B. incr Variable   &lt;br /&gt;
&lt;br /&gt;
Return&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Vorgabe (Timer1=34286) soll man vor dem Hauptprogramm reinsetzen und bei der ISR.&lt;br /&gt;
Wenn man die Vorgabe nicht bei der ISR reinsetzen würde (ISR = Überlauf), würde er ja wieder bei 0 statt bei 34286 anfangen zu zählen.&lt;br /&gt;
&lt;br /&gt;
Um sich das Rechnen zu ersparen könnte man statt der Anweisung: Timer1 = 34286 , auch den Befehl &amp;quot;Load&amp;quot; verwenden. &lt;br /&gt;
&lt;br /&gt;
Man gibt dann ein:  Load Timer1 , 31250 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit Load rechnet sich der Compiler selber die Werte aus ( 65536-31250 ).Man gibt einfach nach dem Komma, die beabsichtigte Zählweite ein.&lt;br /&gt;
&lt;br /&gt;
Damit hat man nun einen Timer der alle Sekunden eine Variable hochzählt.&lt;br /&gt;
&lt;br /&gt;
Um das Zählen der Sekunden noch genauer zu machen, müsste man noch die Zeiten für Sprung in die ISR u.s.w. mit einberechen. Aber für die meisten Anwendungen reicht diese Genauigkeit vollkommen aus !  :-)&lt;br /&gt;
&lt;br /&gt;
==Autor==&lt;br /&gt;
*  [[Benutzer:Roberto|Roberto]]&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Avr]]&lt;br /&gt;
* [[Timer]]&lt;br /&gt;
* [[Bascom]]&lt;br /&gt;
* [[Interrupt]]&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/dload.php?action=file&amp;amp;file_id=169 AvrTimer Windows Berechnungstool / Bascom Codegenerator]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Quellcode Bascom]]&lt;/div&gt;</summary>
		<author><name>Darth Ding</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Bascom_und_Timer&amp;diff=6592</id>
		<title>Bascom und Timer</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Bascom_und_Timer&amp;diff=6592"/>
				<updated>2006-03-22T21:17:49Z</updated>
		
		<summary type="html">&lt;p&gt;Darth Ding: /* Struktur: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bascom Timer (Mega8 und andere) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Zweck ===&lt;br /&gt;
[[Timer]] sind selbständige Zähler im Prozessor. Man braucht sie dort, wo zeitkritische und genaue Aufgaben gefordert sind.&lt;br /&gt;
&lt;br /&gt;
=== Struktur: ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 Config TimerXXX = Timer, Prescale= XX    ‘Konfiguriere TimerXXX&lt;br /&gt;
 Enable TimerXXX		          ‘schalte den TimerXXX ein&lt;br /&gt;
 On  TimerXXX   SprungXXX	          ‘verzweige bei TimerXXX überlauf zu SprungXXX&lt;br /&gt;
 Enable Interrupts		          ‘generell Interrupts zulassen&lt;br /&gt;
 &lt;br /&gt;
 Do&lt;br /&gt;
 ....Hauptprogramm		‘Hauptprogramm&lt;br /&gt;
 Loop&lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
 SprungXXX:			‘Unterprogramm von TimerXXX&lt;br /&gt;
 ....Ausführung			‘arbeitet hier etwas ab und springt mit Return &lt;br /&gt;
 Return				‚ wieder zurück, zum Hauptprogramm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zuerst muss man den zu verwendeten Timer mit „Config“, konfigurieren. &lt;br /&gt;
Dazu definiert man ihn als Timer (mann könnte auch einen Counter daraus machen).&lt;br /&gt;
Dazu muss man noch den Prescaler definieren. &amp;gt;Der Prescaler ist der Teiler, der die Quarzfequenz für den Timer reduziert .&lt;br /&gt;
(Sonst würde der Timer immer mit der vollen Frequenz vom Quarz zählen und das würde meistens zu schnell sein.)&lt;br /&gt;
 &lt;br /&gt;
Dann mit „Enable“ den bestimmten Timer einschalten. &lt;br /&gt;
Mit „On“ das Unterprogramm (ISR) definieren, an die der Timer springen soll,  &lt;br /&gt;
wenn dieser überläuft(ISR= Interrupt Service Routine). Dann das generelle Einschalten von Interrupts.&lt;br /&gt;
&lt;br /&gt;
Jeder Zähler hat eine bestimmte, maximale Zählweite. Zählt er über diese, fängt er wieder bei Null an zu zählen (Überlauf).&lt;br /&gt;
Wie weit ein Zähler zählen kann, ergibt sich aus seiner Struktur. Es gibt da 8-Bit Timer (Timer0 und Timer2, beim Mega8)und 16-Bit Timer (Timer1 beim Mega8).&lt;br /&gt;
8-Bit Timer zählen von 0 bis 255, 16-Bit Timer von 0 bis 65535.&lt;br /&gt;
&lt;br /&gt;
Bei einem Überlauf, unterbricht der Timer das Hauptprogramm und springt in die ISR. Die ISR wird abgearbeitet und mit Return wird wieder an &lt;br /&gt;
die Stelle zurückgesprungen, wo vorher das Hauptprogramm unterbrochen wurde. &lt;br /&gt;
&lt;br /&gt;
Man soll darauf achten, dass in der ISR immer nur kurze Anweisungen abgearbeitet &lt;br /&gt;
werden und der Hauptteil dann im Hauptprogramm bearbeitet wird. &lt;br /&gt;
Sonst kann es sein, dass man den Prozessor damit blockiert.&lt;br /&gt;
&lt;br /&gt;
=== Timer Beispiel: ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 Config Timer0 = Timer, Prescale= 8     ‘Konfiguriere Timer0&lt;br /&gt;
 Enable Timer0            	        ‘schalte den Timer0 ein&lt;br /&gt;
 On  Timer0  Isr_von_Timer0	        ‘verzweige bei Timer0 überlauf zu Isr_von_Timer0&lt;br /&gt;
 Enable Interrupts	  &lt;br /&gt;
 &lt;br /&gt;
 Do&lt;br /&gt;
 ....Hauptprogramm&lt;br /&gt;
 Loop&lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
 Isr_von_Timer0:			‘ISR von Timer0&lt;br /&gt;
 .....Programm-Code&lt;br /&gt;
 Return&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Timer0 ist nun so eingestellt, dass die Frequenz vom Quarz, durch den Prescaler,  durch 8 geteilt wird.&amp;lt;br&amp;gt;&lt;br /&gt;
(Beim Prescaler kann man Teilungen von 1 , 8 , 64, 256, oder 1024 einstellen).&amp;lt;br&amp;gt; Diese Frequenz kommt nun zum Timer0 und der zählt nun mit dieser Frequenz bis 256.&lt;br /&gt;
Ab 256 läuft der Timer über, fängt wieder bei Null an zu zählen, und verzweigt dabei in die ISR.&lt;br /&gt;
Mit Return springt die ISR dann wieder zum Hauptprogramm zurück.&lt;br /&gt;
In der ISR könnte man z.B. eine Variable hochzählen. Diese würde dann bei einem 8Mhz Quarz, ca. 3906mal in der Sekunde um 1 hochgezählt. ( (8000000Hz/8) /256=3906.26Hz)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Timer im 1 Sekunden Takt ===&lt;br /&gt;
&lt;br /&gt;
Wenn man jetzt z.B. will, dass eine Variable nur alle Sekunden um 1 hochgezählt wird, muss man den Prescaler anpassen und auch noch die Zählweite vom Timer anpassen.&lt;br /&gt;
Die Zählweite vom Timer kann man nur insovern verändern, dass man ihn nicht von Null weg zählen lässt, sondern von einem höheren Wert.(der Überlauf ist immer der maximale Wert vom Timer)&lt;br /&gt;
&lt;br /&gt;
Da der Timer0 aber mit 8-Bit jetzt zu kurz zählt (0-256) und wir mit einem grossen Prescaler auch nicht auf 1 Sekunde kommen, nehmen wir dazu den Timer1.&lt;br /&gt;
&lt;br /&gt;
Der Timer1 ist ein 16-Bit Timer und kann  von 0-65536 zählen.&lt;br /&gt;
&lt;br /&gt;
Wenn ich jetzt einen Prescaler von 256 verwende, bekomme ich bei einem 8Mhz Quarz, eine Taktrate von 31250Hz. Das heist, dass der Zähler in einer Sekunde  von 0 bis 31250 zählt. Wenn ich jetzt will, dass der Timer nach 31250 Zählungen überläuft (weil nur beim Überlaufen springt er in die ISR und zählt somit meine Variable um 1 hoch), darf ich den Timer nicht von Null wegzählen lassen sondern von einem höheren Wert.&lt;br /&gt;
&lt;br /&gt;
Dazu muss ich die maximale mögliche Zählweite (16-Bit = 65536) von meiner gewünschten Zählweite, abziehen. Also 65536-31250 = 34286 .Der Timer muss also schon bei 34286 zu zählen anfangen und macht dann nach 1 Sekunde einen Überlauf. 34286+31250= 65536 = Überlauf&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel mit dem Timer 1.&lt;br /&gt;
Zur Kontrolle wird eine Led im Sekundentakt aus und ein geschalten.&lt;br /&gt;
Man kann in der ISR auch eine Variable hochzählen lassen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$regfile = &amp;quot;m8def.dat&amp;quot;                    'für Mega8 &lt;br /&gt;
$crystal = 8000000                        'für 8MHz Quarz&lt;br /&gt;
&lt;br /&gt;
Config Portd = Output                     'definiert Portd als Output&lt;br /&gt;
&lt;br /&gt;
Config Timer1 = Timer , Prescale = 256    'Konfiguriere Timer1&lt;br /&gt;
Enable Timer1                             'schalte den Timer1 ein&lt;br /&gt;
On Timer1 Isr_von_timer1                  'verzweige bei Timer1 überlauf zu   Isr_von_Timer1&lt;br /&gt;
Enable Interrupts&lt;br /&gt;
Timer1 = 34286                            'Timer1 soll schon von 34286 wegzählen&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
 '....Hauptprogramm&lt;br /&gt;
Loop&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Isr_von_timer1:                            'ISR von Timer1&lt;br /&gt;
Timer1 = 34286                             'Timer1 soll wieder von 34286 wegzählen&lt;br /&gt;
Toggle Portd.0                             'schaltet Portd.0 im Sekundentakt&lt;br /&gt;
                                           'EIN und AUS&lt;br /&gt;
'....oder z.B. incr Variable   &lt;br /&gt;
&lt;br /&gt;
Return&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Vorgabe (Timer1=34286) soll man vor dem Hauptprogramm reinsetzen und bei der ISR.&lt;br /&gt;
Wenn man die Vorgabe nicht bei der ISR reinsetzen würde (ISR = Überlauf), würde er ja wieder bei 0 statt bei 34286 anfangen zu zählen.&lt;br /&gt;
&lt;br /&gt;
Um sich das Rechnen zu ersparen könnte man statt der Anweisung: Timer1 = 34286 , auch den Befehl &amp;quot;Load&amp;quot; verwenden. &lt;br /&gt;
&lt;br /&gt;
Man gibt dann ein:  Load Timer1 , 31250 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit Load rechnet sich der Compiler selber die Werte aus ( 65536-31250 ).Man gibt einfach nach dem Komma, die beabsichtigte Zählweite ein.&lt;br /&gt;
&lt;br /&gt;
Damit hat man nun einen Timer der alle Sekunden eine Variable hochzählt.&lt;br /&gt;
&lt;br /&gt;
Um das Zählen der Sekunden noch genauer zu machen, müsste man noch die Zeiten für Sprung in die ISR u.s.w. mit einberechen. Aber für die meisten Anwendungen reicht diese Genauigkeit vollkommen aus !  :-)&lt;br /&gt;
&lt;br /&gt;
==Autor==&lt;br /&gt;
*  [[Benutzer:Roberto|Roberto]]&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Avr]]&lt;br /&gt;
* [[Timer]]&lt;br /&gt;
* [[Bascom]]&lt;br /&gt;
* [[Interrupt]]&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/dload.php?action=file&amp;amp;file_id=169 AvrTimer Windows Berechnungstool / Bascom Codegenerator]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Quellcode Bascom]]&lt;/div&gt;</summary>
		<author><name>Darth Ding</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Bascom_und_I2C_EEprom&amp;diff=6554</id>
		<title>Bascom und I2C EEprom</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Bascom_und_I2C_EEprom&amp;diff=6554"/>
				<updated>2006-03-19T20:26:01Z</updated>
		
		<summary type="html">&lt;p&gt;Darth Ding: /* Ansteuern vom I2C EEprom's mit Bascom */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Ansteuern vom I2C EEproms mit Bascom ==&lt;br /&gt;
&lt;br /&gt;
Der Artikel demonstriert wie man EEPROM Speicherbausteine unter Bascom über den [[I2C]]-Bus anspricht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Struktur: ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'---- schreiben ins EEprom ----------------------------------------&lt;br /&gt;
I2cstart                                   'Start I2C&lt;br /&gt;
I2cwbyte Slave Adresse&lt;br /&gt;
I2cwbyte Speicheradresse&lt;br /&gt;
I2cwbyte Wert&lt;br /&gt;
I2cstop                                    'Stop I2C&lt;br /&gt;
Waitms 10                                  'warte 10ms&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'--- lesen vom EEprom --------------------------------------------&lt;br /&gt;
I2cstart                                    'Start I2C&lt;br /&gt;
I2cwbyte Slave Adresse  &lt;br /&gt;
I2cwbyte Speicheradresse&lt;br /&gt;
&lt;br /&gt;
I2cstart                                    'Start I2C&lt;br /&gt;
I2cwbyte Slave Adresse +1 für schreiben&lt;br /&gt;
I2crbyte lese Wert&lt;br /&gt;
I2cstop                                     'Stop I2C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für EEprom 24C16 ===&lt;br /&gt;
Zum besseren Verständnis werden hier die I2C Befehle untereinander geschrieben.&lt;br /&gt;
In einem grösserem Programm empfiehlt es sich aber eine Sub-Routine zu deklarieren, die dann den Schreib/Lesevorgang abwickelt.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel :'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'============I2C EEprom schreiben/lesen ==================================&lt;br /&gt;
&lt;br /&gt;
 ' =========== Für 24C16 EEprom =====================&lt;br /&gt;
 ' 8MHz Quarz&lt;br /&gt;
 ' LCD auf Port B ,&lt;br /&gt;
 '&lt;br /&gt;
$regfile = &amp;quot;m8def.dat&amp;quot;&lt;br /&gt;
$crystal = 8000000&lt;br /&gt;
&lt;br /&gt;
'---Config für LCD -----------------&lt;br /&gt;
Config Lcd = 40 * 2&lt;br /&gt;
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , Rs = Portb.4 , E = Portb.5&lt;br /&gt;
Config Lcdbus = 4&lt;br /&gt;
Config Lcdmode = Port&lt;br /&gt;
Cursor On&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'SDA und SCL definieren&lt;br /&gt;
Config Sda = Portd.5                                         &lt;br /&gt;
Config Scl = Portd.7                                        &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dim X As Byte&lt;br /&gt;
Dim A As Byte&lt;br /&gt;
Dim B As Byte&lt;br /&gt;
Dim Lesen As Byte&lt;br /&gt;
&lt;br /&gt;
CLS&lt;br /&gt;
Do&lt;br /&gt;
'---- schreibe in EEprom ----&lt;br /&gt;
For A = 1 To 10&lt;br /&gt;
Incr X                                    '1 bis Überlauf zählen&lt;br /&gt;
&lt;br /&gt;
I2cstart                                  'Start I2C&lt;br /&gt;
I2cwbyte &amp;amp;HA0                             'Sende Slave Adresse&lt;br /&gt;
I2cwbyte A                                'Sende Speicheradresse&lt;br /&gt;
I2cwbyte X                                'Sende Wert&lt;br /&gt;
I2cstop                                   'Stop I2C&lt;br /&gt;
Waitms 10                                 'warte 10ms&lt;br /&gt;
&lt;br /&gt;
Locate 1 , 1&lt;br /&gt;
Lcd &amp;quot;ins EEprom = &amp;quot; ; X ; &amp;quot;  &amp;quot;  ' Ausgabe der geschriebenen Werte am LCD&lt;br /&gt;
Waitms 500&lt;br /&gt;
Next A&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'--- lesen vom EEprom ----&lt;br /&gt;
For B = 1 To 10&lt;br /&gt;
&lt;br /&gt;
I2cstart                                    'Start I2C&lt;br /&gt;
I2cwbyte &amp;amp;HA0                               'sende Slave Adresse  &lt;br /&gt;
I2cwbyte B                                  'sende Speicheradresse&lt;br /&gt;
&lt;br /&gt;
I2cstart                                    'Start I2C&lt;br /&gt;
I2cwbyte &amp;amp;HA1                               'sende Slave Adresse +1 für schreiben&lt;br /&gt;
I2crbyte Lesen , Nack                       'lese Adresse vom EEprom&lt;br /&gt;
I2cstop                                     'Stop I2C&lt;br /&gt;
&lt;br /&gt;
Locate 2 , 1&lt;br /&gt;
Lcd &amp;quot;Lese  EEprom= &amp;quot; ; Lesen ; &amp;quot;  &amp;quot;                         'Ausgabe der EEprom Werte&lt;br /&gt;
Waitms 500&lt;br /&gt;
Next B&lt;br /&gt;
&lt;br /&gt;
Loop&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schleife A schreibt den Wert 1-10 in die Speicherstelle 1-10 &amp;lt;br&amp;gt;&lt;br /&gt;
Schleife B liest Speicherstelle 1-10 wieder aus und zeigt dies auch am LCD an.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für EEprom 24C256 ===&lt;br /&gt;
&lt;br /&gt;
EEprom  24C128, 24C256 haben im Gegensatz zu den 24C16'er einen Adressraum von zwei Byte. (Weil grösserer Speicherbereich im EEprom vorhanden ist)&lt;br /&gt;
Darum muss man den Adressberreich in High und Low Adressbereich trennen.&lt;br /&gt;
(Zuerst High-Adressberreich schreiben und dann Low-Adressbereich) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beispiel: ''' &amp;lt;br&amp;gt;&lt;br /&gt;
Wie Beispiel oben, nur mit erweiterten Adressbereich.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'============I2C EEprom schreiben/lesen ==================================&lt;br /&gt;
&lt;br /&gt;
 ' =========== Für 24C256 EEprom =====================&lt;br /&gt;
 ' 8MHz Quarz&lt;br /&gt;
 ' LCD auf Port B ,&lt;br /&gt;
 '&lt;br /&gt;
$regfile = &amp;quot;m8def.dat&amp;quot;&lt;br /&gt;
$crystal = 8000000&lt;br /&gt;
&lt;br /&gt;
'---Config für LCD -----------------&lt;br /&gt;
Config Lcd = 40 * 2&lt;br /&gt;
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , Rs = Portb.4 , E = Portb.5&lt;br /&gt;
Config Lcdbus = 4&lt;br /&gt;
Config Lcdmode = Port&lt;br /&gt;
Cursor On&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'SDA und SCL definieren&lt;br /&gt;
Config Sda = Portd.5                                         &lt;br /&gt;
Config Scl = Portd.7                                        &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dim X As Byte&lt;br /&gt;
Dim A As Byte&lt;br /&gt;
Dim B As Byte&lt;br /&gt;
Dim Lesen As Byte&lt;br /&gt;
CLS&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
'---- schreibe in EEprom ----&lt;br /&gt;
For A = 1 To 10&lt;br /&gt;
Incr X                                    '1 bis Überlauf zählen&lt;br /&gt;
&lt;br /&gt;
I2cstart                                  'Start I2C&lt;br /&gt;
I2cwbyte &amp;amp;HA0                             'Sende Slave Adresse&lt;br /&gt;
I2cwbyte 1                                'Sende Speicheradresse High&lt;br /&gt;
I2cwbyte A                                'Sende Speicheradresse LOw&lt;br /&gt;
I2cwbyte X                                'Sende Wert&lt;br /&gt;
I2cstop                                   'Stop I2C&lt;br /&gt;
Waitms 10                                 'warte 10ms&lt;br /&gt;
&lt;br /&gt;
Locate 1 , 1&lt;br /&gt;
Lcd &amp;quot;ins EEprom = &amp;quot; ; X ; &amp;quot;  &amp;quot;  ' Ausgabe der geschriebenen Werte am LCD&lt;br /&gt;
Waitms 500&lt;br /&gt;
Next A&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'--- lesen vom EEprom ----&lt;br /&gt;
For B = 1 To 10&lt;br /&gt;
&lt;br /&gt;
I2cstart                                    'Start I2C&lt;br /&gt;
I2cwbyte &amp;amp;HA0                               'sende Slave Adresse  &lt;br /&gt;
I2cwbyte 1                                  'sende Speicheradresse High&lt;br /&gt;
I2cwbyte B                                  'sende Speicheradresse Low&lt;br /&gt;
&lt;br /&gt;
I2cstart                                    'Start I2C&lt;br /&gt;
I2cwbyte &amp;amp;HA1                               'sende Slave Adresse +1 für schreiben&lt;br /&gt;
I2crbyte Lesen , Nack                       'lese Adresse vom EEprom&lt;br /&gt;
I2cstop                                     'Stop I2C&lt;br /&gt;
&lt;br /&gt;
Locate 2 , 1&lt;br /&gt;
Lcd &amp;quot;Lese  EEprom= &amp;quot; ; Lesen ; &amp;quot;  &amp;quot;                         'Ausgabe der EEprom Werte&lt;br /&gt;
Waitms 500&lt;br /&gt;
Next B&lt;br /&gt;
&lt;br /&gt;
Loop&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== High/Low Adressbereich mit Overlay leicht ansprechen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'============I2C EEprom lesen/schreiben ==================================&lt;br /&gt;
&lt;br /&gt;
 '===========Für 24C256 EEprom=====================&lt;br /&gt;
 ' 8MHz Quarz&lt;br /&gt;
 ' LCD auf Port B ,&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m8def.dat&amp;quot;&lt;br /&gt;
$crystal = 8000000&lt;br /&gt;
&lt;br /&gt;
'---Config für LCD -----------------&lt;br /&gt;
Config Lcd = 40 * 2&lt;br /&gt;
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , Rs = Portb.4 , E = Portb.5&lt;br /&gt;
Config Lcdbus = 4&lt;br /&gt;
Config Lcdmode = Port&lt;br /&gt;
Cursor On&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Config Sda = Portd.5                                        ' I2C-Port festlegen&lt;br /&gt;
Config Scl = Portd.7                                        ' I2C-Port festlegen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dim X As Byte&lt;br /&gt;
Dim A As Word&lt;br /&gt;
Dim B As Word&lt;br /&gt;
Dim Schreiben As Byte&lt;br /&gt;
Dim Lesen As Byte&lt;br /&gt;
&lt;br /&gt;
Dim Adresse As Word At $160                      'Die Adresse als Word-Variable&lt;br /&gt;
Dim Low_adresse As Byte At $160 Overlay          'Zeiger auf das erste Byte&lt;br /&gt;
Dim High_adresse As Byte At $161 Overlay         'Zeiger auf das zweite Byte&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'===================Hauptprogramm===============================================&lt;br /&gt;
Do&lt;br /&gt;
&lt;br /&gt;
'----schreiben----&lt;br /&gt;
For Adresse = 250 To 260                          'Adresse geht über die Byte-Grenze&lt;br /&gt;
Incr X                                            '1 bis Überlauf&lt;br /&gt;
&lt;br /&gt;
I2cstart                                          'Start&lt;br /&gt;
I2cwbyte &amp;amp;HA0                                     'Sende Slavadresse&lt;br /&gt;
I2cwbyte High_adresse                             'Sende Speicheradresse High&lt;br /&gt;
I2cwbyte Low_adresse                              'Sende Speicheradresse  LOW&lt;br /&gt;
I2cwbyte X                                        'Sende Wert&lt;br /&gt;
I2cstop                                           'stop&lt;br /&gt;
Waitms 10&lt;br /&gt;
&lt;br /&gt;
Locate 1 , 1&lt;br /&gt;
Lcd &amp;quot;-&amp;gt;Adres.=&amp;quot; ; Adresse ; &amp;quot;Wert=&amp;quot; ; X ; &amp;quot;  &amp;quot;    'Anzeige vom schreiben&lt;br /&gt;
Waitms 500&lt;br /&gt;
Next Adresse&lt;br /&gt;
&lt;br /&gt;
'---lesen----&lt;br /&gt;
For Adresse = 250 To 260&lt;br /&gt;
I2cstart                                      'Start&lt;br /&gt;
I2cwbyte &amp;amp;HA0                                 'Sende Slavadresse +1 für Schreiben&lt;br /&gt;
I2cwbyte High_adresse                         'Sende Speicheradresse High&lt;br /&gt;
I2cwbyte Low_adresse                          'Sende Speicheradresse Low&lt;br /&gt;
&lt;br /&gt;
I2cstart                                      'Start&lt;br /&gt;
I2cwbyte &amp;amp;HA1                                 'Sende Slavadresse +1 für Schreiben&lt;br /&gt;
I2crbyte Lesen , Nack                         'Lese Adresse vom EEprom&lt;br /&gt;
I2cstop                                       'Stop&lt;br /&gt;
&lt;br /&gt;
Locate 2 , 1&lt;br /&gt;
Lcd &amp;quot;&amp;lt;-Adres.=&amp;quot; ; Adresse ; &amp;quot;Wert=&amp;quot; ; Lesen ; &amp;quot;  &amp;quot;    'Anzeige vom lesen&lt;br /&gt;
Waitms 500&lt;br /&gt;
Next Adresse&lt;br /&gt;
&lt;br /&gt;
Loop&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Die Sache mit dem Overlay : ===&lt;br /&gt;
&lt;br /&gt;
 Dim Adresse As Word At $160      &lt;br /&gt;
&lt;br /&gt;
Hier definiere ich die Variable für die Adresse vom I2C-EEprom als Word-Variable. Die Variable soll ab Adresse $160 im Ram vom AVR abgelegt werden. Die Word-Variable hat einen Berreich von zwei Byte und braucht daher den Berreich von $160 - $161&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit:                &lt;br /&gt;
 Dim Low_adresse As Byte At $160 Overlay          &lt;br /&gt;
 Dim High_adresse As Byte At $161 Overlay &lt;br /&gt;
weise ich der neuen (Pseudo) Variablen &amp;quot;Low_adresse&amp;quot; einen Zeiger auf die Speicherstelle $160 und &amp;quot;High_adresse&amp;quot;  einen Zeiger auf $161 zu.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Low_adresse&amp;quot; und &amp;quot;High_Adresse&amp;quot; sind also keine Variablen, sondern nur jeweils ein &amp;quot;Zeiger&amp;quot; auf diesen Speicherberreich der Variable: &amp;quot;Adresse&amp;quot; !&lt;br /&gt;
&lt;br /&gt;
Mit diesen zwei Zeigern habe ich automatisch jetzt meine Low und High Adressen für das I2C-EEprom.&lt;br /&gt;
&lt;br /&gt;
Ich kann diese zwei Zeiger jetzt ganz normal, wie Variablen, im Programm verwenden. :-)&lt;br /&gt;
&lt;br /&gt;
==Autor==&lt;br /&gt;
*  [[Benutzer:Roberto|Roberto]]&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Avr]]&lt;br /&gt;
* [[Bascom]]&lt;br /&gt;
* [[EEPROM]]&lt;br /&gt;
* [[I2C]]&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=12086&amp;amp;highlight=eeprom Roboternetz-Thread]&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=15433&amp;amp;highlight=eeprom Roboternetz-Thread]&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=10945&amp;amp;highlight=eeprom Roboternetz-Thread]&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/viewtopic.php?t=15661 Roboternetz-Thread]&lt;br /&gt;
* http://www.eseo.de/i2c.htm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Quellcode Bascom]]&lt;/div&gt;</summary>
		<author><name>Darth Ding</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Bezugsquellen&amp;diff=5843</id>
		<title>Bezugsquellen</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Bezugsquellen&amp;diff=5843"/>
				<updated>2006-02-06T16:47:44Z</updated>
		
		<summary type="html">&lt;p&gt;Darth Ding: /* Sensoren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| {{Blaueschmaltabelle}}&lt;br /&gt;
|Hier können Bezugsquellen eingetragen werden! Bitte aber pro Eintrag nicht mehr als '''2 bis 3 Zeilen''', ansonsten muss es ein Moderator kürzen! Dieser Artikel soll nicht als Werbeplattform mißbraucht werden, für Werbung gibts andere [[RN-Wissen:Site_support|Möglichkeiten]]. Er soll eine Hilfe für Bastler sein! &lt;br /&gt;
Bitte auch keine Bewertungen der Lieferanten vornehmen, das ist Sache der Leser &amp;amp; Bastler indem Sie vergleichen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elektronikbauteile==&lt;br /&gt;
&lt;br /&gt;
;Conrad - http://www.conrad.de: Fast das gesamte Elektronikprogramm&lt;br /&gt;
&lt;br /&gt;
;CSD-Electronic - http://www.csd-electronics.de/: Elektronik&lt;br /&gt;
&lt;br /&gt;
;Distrelec Gruppe - http://www.distrelec.com: Diverse Bauelemente (aktiv, passiv, Microcontroller), Literatur, PC-Komponenten, usw.&lt;br /&gt;
&lt;br /&gt;
;Farnell In One - http://de.farnell.com/: elektronische Bauelemente (aktiv, passiv, Microcontroller), Sensoren, Literatur, Entwicklungskits, Kabel, Steckverbinder, Werkstattbedarf. Auch für privat. Sehr schnell.&lt;br /&gt;
&lt;br /&gt;
;Reichelt - http://www.reichelt.de: Diverse Bauelemente (aktiv, passiv, Microcontroller), Literatur, PC-Komponenten, Lichttechnik, Messtechnik, Software,  Kabel, Steckverbinder, Werkstattbedarf, Werkzeug,  Mindestbestellwert: 10 Euro&lt;br /&gt;
&lt;br /&gt;
;RS-Components - http://www.rsonline.de: Bauelemente: (aktiv, passiv, Microcontroller), Literatur, PC-Komponenten, Lichttechnik, Messtechnik, Software, Kabel, Steckverbinder, Werkzeug&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Sensoren==&lt;br /&gt;
&lt;br /&gt;
;Robotikhardware - http://www.robotikhardware.de: Drehgeber, Sharp-Entfernungssensoren, Neigungssensoren, Temperatursendoren usw. speziell für Robotik-Bastler&lt;br /&gt;
&lt;br /&gt;
;Micromaus - http://www.micromaus.de: Sharp-Entfernungssensoren, Farbsensoren, Feuchtesensoren, Flexsensoren, Beschleunigungssensoren, Drucksensoren usw.&lt;br /&gt;
&lt;br /&gt;
;Roboter-Teile - http://www.roboter-teile.de/ : Lynxmotion Hexapot, Sensoren, CMU-Cam, AVR, PIC u.v.a.&lt;br /&gt;
&lt;br /&gt;
==Motoren== &lt;br /&gt;
&lt;br /&gt;
;mir-elektronik - http://www.mir-elektronik.de: Schrittmotoren, Endstufen, Bauteile, Literatur und Sonderposten&lt;br /&gt;
;Lemo-Solar - http://lemo-solar.de/: Motoren, Getriebe, Elektronik-Bausätze, Sonderposten u.v.a.&lt;br /&gt;
&lt;br /&gt;
==Platinen==&lt;br /&gt;
&lt;br /&gt;
;Multipcb - http://www.multipcb.de: Platinenservice für gewerbliche Kunden&lt;br /&gt;
&lt;br /&gt;
;PCB-Pool - http://pcb-pool.com: Platinenservice für private und gewerbliche Kunden&lt;br /&gt;
&lt;br /&gt;
==Materialien==&lt;br /&gt;
&lt;br /&gt;
;Metall Store - http://www.metallstore.de/: Schrittmotoren, (Kugel-)Lager, diverse Bauelemente aus Alu, VA, Messing, Bronze, Kupfer, Werkzeuge, Spezialschrauben&lt;br /&gt;
&lt;br /&gt;
;Modulor - http://www.modulor.de/: Diverse Materialien Kunststoff, Gummi, Papier, Pappe, Holz, Metall, Textilien, Plexiglas ...&lt;br /&gt;
&lt;br /&gt;
;Igus - http://www.igus.de/: Gleitlager, Lineargleitlager, Kabelschleppen, Gelenklager, Polymergleitlager, Wellen ...&lt;br /&gt;
&lt;br /&gt;
==Roboterboards==&lt;br /&gt;
;Robotikhardware - http://www.robotikhardware.de: Spezielle Roboterboards, universelle Microcontrollerboards, Sprachboards, Bausätze, Platinen, Schrittmotoren etc. Berückichtigt [[RN-Definitionen]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Praxis|!]]&lt;/div&gt;</summary>
		<author><name>Darth Ding</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Bezugsquellen&amp;diff=5842</id>
		<title>Bezugsquellen</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Bezugsquellen&amp;diff=5842"/>
				<updated>2006-02-06T16:47:30Z</updated>
		
		<summary type="html">&lt;p&gt;Darth Ding: /* Motoren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| {{Blaueschmaltabelle}}&lt;br /&gt;
|Hier können Bezugsquellen eingetragen werden! Bitte aber pro Eintrag nicht mehr als '''2 bis 3 Zeilen''', ansonsten muss es ein Moderator kürzen! Dieser Artikel soll nicht als Werbeplattform mißbraucht werden, für Werbung gibts andere [[RN-Wissen:Site_support|Möglichkeiten]]. Er soll eine Hilfe für Bastler sein! &lt;br /&gt;
Bitte auch keine Bewertungen der Lieferanten vornehmen, das ist Sache der Leser &amp;amp; Bastler indem Sie vergleichen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elektronikbauteile==&lt;br /&gt;
&lt;br /&gt;
;Conrad - http://www.conrad.de: Fast das gesamte Elektronikprogramm&lt;br /&gt;
&lt;br /&gt;
;CSD-Electronic - http://www.csd-electronics.de/: Elektronik&lt;br /&gt;
&lt;br /&gt;
;Distrelec Gruppe - http://www.distrelec.com: Diverse Bauelemente (aktiv, passiv, Microcontroller), Literatur, PC-Komponenten, usw.&lt;br /&gt;
&lt;br /&gt;
;Farnell In One - http://de.farnell.com/: elektronische Bauelemente (aktiv, passiv, Microcontroller), Sensoren, Literatur, Entwicklungskits, Kabel, Steckverbinder, Werkstattbedarf. Auch für privat. Sehr schnell.&lt;br /&gt;
&lt;br /&gt;
;Reichelt - http://www.reichelt.de: Diverse Bauelemente (aktiv, passiv, Microcontroller), Literatur, PC-Komponenten, Lichttechnik, Messtechnik, Software,  Kabel, Steckverbinder, Werkstattbedarf, Werkzeug,  Mindestbestellwert: 10 Euro&lt;br /&gt;
&lt;br /&gt;
;RS-Components - http://www.rsonline.de: Bauelemente: (aktiv, passiv, Microcontroller), Literatur, PC-Komponenten, Lichttechnik, Messtechnik, Software, Kabel, Steckverbinder, Werkzeug&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Sensoren==&lt;br /&gt;
&lt;br /&gt;
;Robotikhardware - http://www.robotikhardware.de: Drehgeber, Sharp-Entfernungssensoren, Neigungssensoren, Temperatursendoren usw. speziell für Robotik-Bastler&lt;br /&gt;
&lt;br /&gt;
;Micromaus - http://www.micromaus.de: Sharp-Entfernungssensoren, Farbsensoren, Feuchtesensoren, Flexsensoren, Beschleunigungssensoren, Drucksensoren usw.&lt;br /&gt;
&lt;br /&gt;
==Motoren== &lt;br /&gt;
&lt;br /&gt;
;mir-elektronik - http://www.mir-elektronik.de: Schrittmotoren, Endstufen, Bauteile, Literatur und Sonderposten&lt;br /&gt;
;Lemo-Solar - http://lemo-solar.de/: Motoren, Getriebe, Elektronik-Bausätze, Sonderposten u.v.a.&lt;br /&gt;
&lt;br /&gt;
==Platinen==&lt;br /&gt;
&lt;br /&gt;
;Multipcb - http://www.multipcb.de: Platinenservice für gewerbliche Kunden&lt;br /&gt;
&lt;br /&gt;
;PCB-Pool - http://pcb-pool.com: Platinenservice für private und gewerbliche Kunden&lt;br /&gt;
&lt;br /&gt;
==Materialien==&lt;br /&gt;
&lt;br /&gt;
;Metall Store - http://www.metallstore.de/: Schrittmotoren, (Kugel-)Lager, diverse Bauelemente aus Alu, VA, Messing, Bronze, Kupfer, Werkzeuge, Spezialschrauben&lt;br /&gt;
&lt;br /&gt;
;Modulor - http://www.modulor.de/: Diverse Materialien Kunststoff, Gummi, Papier, Pappe, Holz, Metall, Textilien, Plexiglas ...&lt;br /&gt;
&lt;br /&gt;
;Igus - http://www.igus.de/: Gleitlager, Lineargleitlager, Kabelschleppen, Gelenklager, Polymergleitlager, Wellen ...&lt;br /&gt;
&lt;br /&gt;
==Roboterboards==&lt;br /&gt;
;Robotikhardware - http://www.robotikhardware.de: Spezielle Roboterboards, universelle Microcontrollerboards, Sprachboards, Bausätze, Platinen, Schrittmotoren etc. Berückichtigt [[RN-Definitionen]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Praxis|!]]&lt;/div&gt;</summary>
		<author><name>Darth Ding</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Bezugsquellen&amp;diff=5841</id>
		<title>Bezugsquellen</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Bezugsquellen&amp;diff=5841"/>
				<updated>2006-02-06T16:47:01Z</updated>
		
		<summary type="html">&lt;p&gt;Darth Ding: /* Motoren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| {{Blaueschmaltabelle}}&lt;br /&gt;
|Hier können Bezugsquellen eingetragen werden! Bitte aber pro Eintrag nicht mehr als '''2 bis 3 Zeilen''', ansonsten muss es ein Moderator kürzen! Dieser Artikel soll nicht als Werbeplattform mißbraucht werden, für Werbung gibts andere [[RN-Wissen:Site_support|Möglichkeiten]]. Er soll eine Hilfe für Bastler sein! &lt;br /&gt;
Bitte auch keine Bewertungen der Lieferanten vornehmen, das ist Sache der Leser &amp;amp; Bastler indem Sie vergleichen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elektronikbauteile==&lt;br /&gt;
&lt;br /&gt;
;Conrad - http://www.conrad.de: Fast das gesamte Elektronikprogramm&lt;br /&gt;
&lt;br /&gt;
;CSD-Electronic - http://www.csd-electronics.de/: Elektronik&lt;br /&gt;
&lt;br /&gt;
;Distrelec Gruppe - http://www.distrelec.com: Diverse Bauelemente (aktiv, passiv, Microcontroller), Literatur, PC-Komponenten, usw.&lt;br /&gt;
&lt;br /&gt;
;Farnell In One - http://de.farnell.com/: elektronische Bauelemente (aktiv, passiv, Microcontroller), Sensoren, Literatur, Entwicklungskits, Kabel, Steckverbinder, Werkstattbedarf. Auch für privat. Sehr schnell.&lt;br /&gt;
&lt;br /&gt;
;Reichelt - http://www.reichelt.de: Diverse Bauelemente (aktiv, passiv, Microcontroller), Literatur, PC-Komponenten, Lichttechnik, Messtechnik, Software,  Kabel, Steckverbinder, Werkstattbedarf, Werkzeug,  Mindestbestellwert: 10 Euro&lt;br /&gt;
&lt;br /&gt;
;RS-Components - http://www.rsonline.de: Bauelemente: (aktiv, passiv, Microcontroller), Literatur, PC-Komponenten, Lichttechnik, Messtechnik, Software, Kabel, Steckverbinder, Werkzeug&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Sensoren==&lt;br /&gt;
&lt;br /&gt;
;Robotikhardware - http://www.robotikhardware.de: Drehgeber, Sharp-Entfernungssensoren, Neigungssensoren, Temperatursendoren usw. speziell für Robotik-Bastler&lt;br /&gt;
&lt;br /&gt;
;Micromaus - http://www.micromaus.de: Sharp-Entfernungssensoren, Farbsensoren, Feuchtesensoren, Flexsensoren, Beschleunigungssensoren, Drucksensoren usw.&lt;br /&gt;
&lt;br /&gt;
==Motoren== &lt;br /&gt;
&lt;br /&gt;
;mir-elektronik - http://www.mir-elektronik.de: Schrittmotoren, Endstufen, Bauteile, Literatur und Sonderposten&lt;br /&gt;
;Lemo-Solar - http://lemo-solar.de/: Motoren, Getriebe, Elektronik-Bausätze, Sonderposten u.v.a.&lt;br /&gt;
;Roboter-Teile - http://www.roboter-teile.de/ : Lynxmotion Hexapot, Sensoren, CMU-Cam, AVR, PIC u.v.a.&lt;br /&gt;
&lt;br /&gt;
==Platinen==&lt;br /&gt;
&lt;br /&gt;
;Multipcb - http://www.multipcb.de: Platinenservice für gewerbliche Kunden&lt;br /&gt;
&lt;br /&gt;
;PCB-Pool - http://pcb-pool.com: Platinenservice für private und gewerbliche Kunden&lt;br /&gt;
&lt;br /&gt;
==Materialien==&lt;br /&gt;
&lt;br /&gt;
;Metall Store - http://www.metallstore.de/: Schrittmotoren, (Kugel-)Lager, diverse Bauelemente aus Alu, VA, Messing, Bronze, Kupfer, Werkzeuge, Spezialschrauben&lt;br /&gt;
&lt;br /&gt;
;Modulor - http://www.modulor.de/: Diverse Materialien Kunststoff, Gummi, Papier, Pappe, Holz, Metall, Textilien, Plexiglas ...&lt;br /&gt;
&lt;br /&gt;
;Igus - http://www.igus.de/: Gleitlager, Lineargleitlager, Kabelschleppen, Gelenklager, Polymergleitlager, Wellen ...&lt;br /&gt;
&lt;br /&gt;
==Roboterboards==&lt;br /&gt;
;Robotikhardware - http://www.robotikhardware.de: Spezielle Roboterboards, universelle Microcontrollerboards, Sprachboards, Bausätze, Platinen, Schrittmotoren etc. Berückichtigt [[RN-Definitionen]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Praxis|!]]&lt;/div&gt;</summary>
		<author><name>Darth Ding</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Bascom_und_PWM&amp;diff=5562</id>
		<title>Bascom und PWM</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Bascom_und_PWM&amp;diff=5562"/>
				<updated>2006-01-24T19:27:14Z</updated>
		
		<summary type="html">&lt;p&gt;Darth Ding: /* Grundbegriffe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Mit Bascom, PWM-Signale erzeugen ==&lt;br /&gt;
(Bezogen auf den Mega8. Aber es gilt in etwa, auch für andere AVR's)&lt;br /&gt;
&lt;br /&gt;
===Grundbegriffe===&lt;br /&gt;
'''Puls Weiten  Modulation (PWM)'''&lt;br /&gt;
&lt;br /&gt;
Bei der Puls-Weiten-Modulation (PWM), wird ein digitales Ausgangssignal erzeugt, dessen Tastverhältnis moduliert wird.&lt;br /&gt;
&lt;br /&gt;
Das Tastverhältnis gibt das Verhältnis der Länge des eingeschalteten Zustands zur Periodendauer an. Dabei bleiben die Frequenz und der Pegel des Signals immer&lt;br /&gt;
gleich! &lt;br /&gt;
Es ändert sich nur die Länge von High zu Low.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dieses Bild zeigt ein Tastverhältnis von 10% und 50 % &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tastverhältnis.png|center]]&lt;br /&gt;
&lt;br /&gt;
Man könnte das in etwa mit einem Wasserhahn vergleichen, den man z.B. alle Minuten betätigt.&lt;br /&gt;
Wenn man ihn in jeder Minute nur kurz aufdreht, und dann gleich wieder zumacht, &lt;br /&gt;
kommt in Summe nur wenig Wasser raus. &lt;br /&gt;
Wenn man ihn aber in jeder dieser Minuten länger offen lässt,  &lt;br /&gt;
kommt mehr Wasser raus.&lt;br /&gt;
&lt;br /&gt;
Der Rhythmus bleibt immer gleich, aber es ändert sich in Summe die Wassermenge,&lt;br /&gt;
die raus kommt.&lt;br /&gt;
&lt;br /&gt;
Mit dem PWM Signal kann man nun tolle Sachen machen. &lt;br /&gt;
Zum Beispiel eine LED (oder über einen Transistor auch eine Lampe) an den PWM Ausgang   anschliessen und mit der Länge des PWM-Signal’s die Helligkeit der LED verändern.&lt;br /&gt;
 &lt;br /&gt;
Oder auch einen  Motor in der Geschwindigkeit regeln. &lt;br /&gt;
&lt;br /&gt;
Man kann aber auch dem PWM-Signal einen RC-Filter nachschalten, das das  &lt;br /&gt;
PWM-Signal glättet. Dann hat man eine regelbare Gleichspannung, in der das Minimum   &lt;br /&gt;
dann 0V und das Maximum 5V ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es gibt grundsätzlich zwei Gruppen von PWM-Arten &lt;br /&gt;
&lt;br /&gt;
'''Software PWM und Hardware PWM '''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;'''Software PWM'''&lt;br /&gt;
:Vorteile: Man kann dieses PWM auf jeden Ausgabe-Pin des AVR anwenden.&lt;br /&gt;
:Nachteil: Da das PWM per Software gemacht wird, ist er eher langsam.&lt;br /&gt;
&lt;br /&gt;
;'''Hardware PWM'''&lt;br /&gt;
:Vorteile: Sehr schnell (Maximal die Quarzfrequenz / Periode)&lt;br /&gt;
:Nachteile: Man kann nur bestimmte Ausgänge dafür verwenden&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Mega8 hat nun drei Hardware PWM Ausgänge.&lt;br /&gt;
Diese laufen nach Definition der Register/Werte selbstständig ab.&lt;br /&gt;
(Darum ist Hardware-PWM auch sehr schnell und belastet die Abarbeitung des Programms nicht.) &lt;br /&gt;
Leider sind die Ausgänge aber bestimmten Ausgangs Pin’s fix zugeordnet. &lt;br /&gt;
Man kann diese also nicht auf andere Pins legen und muss sich deshalb vorher &lt;br /&gt;
Gedanken machen, wie man den Mega8 beschaltet.&lt;br /&gt;
&lt;br /&gt;
Ganz anders beim  Software-PWM, dass ja rein Software mäßig erzeugt wird &lt;br /&gt;
und wo man dann das PWM-Signal fast an jeden Pin ausgeben kann. &lt;br /&gt;
&lt;br /&gt;
Für die Hardware-PWM Erzeugung kann man beim Mega8 &lt;br /&gt;
den Timer1 und den Timer2 verwänden.&lt;br /&gt;
&lt;br /&gt;
Timer1 hat zwei Compare Register und kann dadurch zwei PWM Signale erzeugen.&lt;br /&gt;
(Compare A = Pin 15 und Compare B= Pin 16)&lt;br /&gt;
Weiters kann man beim Timer1 eine Auflösung von 8, 9 und 10 Bit einstellen.&lt;br /&gt;
&lt;br /&gt;
Timer2 hat nur ein Compare Register (Ausgang am Pin 17), nur 8 Bit   &lt;br /&gt;
Auflösung und kann auch nur ein PWM erzeugen.&lt;br /&gt;
&lt;br /&gt;
=== PWM-Ablauf: ===&lt;br /&gt;
&lt;br /&gt;
Unteres Bild zeigt den Ablauf für das PWM  beim Timer1.&lt;br /&gt;
Es kommt zuerst die  Frequenz vom Takterzeuger (Quarz), geht über den Prescaler zum Timer. &lt;br /&gt;
Beim Timer schaltet das Compare Register je nach seinem eingestellten Wert &lt;br /&gt;
&amp;lt;br/&amp;gt; und erzeugt somit das PWM-Signal am Ausgangs-Pin&lt;br /&gt;
&lt;br /&gt;
[[Bild:PWM.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Genauere Erklärung:===&lt;br /&gt;
&lt;br /&gt;
Der Prescaler, teilt die Frequenz die vom Quarz kommt!&lt;br /&gt;
Bei Teilung 1, geht die vollständige Frequenz zum Timer.&lt;br /&gt;
Bei Teilung 8, nur ein Achtel der Quarzfrequenz.&lt;br /&gt;
(Also bei 8 MHz Quarz kommen zum Timer dann nur 1 MHz )&lt;br /&gt;
Bei Teilung 1024  sind es dann z.B. 8 MHz/1024 = 7,8125kHz &lt;br /&gt;
&lt;br /&gt;
Der Timer ist hier der Zähler für das PWM.&lt;br /&gt;
Er zählt mit der Frequenz, die vom Prescaler kommt, einmal von 0 bis&lt;br /&gt;
zu der eingestellten Timerauflösung rauf, dann wieder auf  0 zurück.&lt;br /&gt;
(dann wieder von 0 auf Timerauflösung u.s.w.)&lt;br /&gt;
Einmal rauf und runterzählen, ergibt ein Periode.&lt;br /&gt;
Die Periode ist gleich die Ausgangsfrequenz von dem PWM-Signal.&lt;br /&gt;
Ausgangsfrequenz = (Quarzfrequenz/Prescale ) /(Timerauflösung*2)&lt;br /&gt;
&lt;br /&gt;
z.B.: Quarz = 8 MHz ;  Prescaler = 1 ; Timer = 8 Bit&lt;br /&gt;
ergibt:  (8000000Hz/1) / (256*2)  = 15,625 kHz&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder: Quarz = 8 MHz ;  Prescaler = 8 ; Timer = 10 Bit&lt;br /&gt;
ergibt:  (8000000Hz/8) / (2048*2)  = 244,14 Hz&lt;br /&gt;
&lt;br /&gt;
Mit dem Compare Register definiert man nun  das Tastverhältnis!&lt;br /&gt;
Überall, wo nun der Timer diese Compare Linie schneidet, schaltet der Ausgang!&lt;br /&gt;
Beim raufzählen des Timers auf EIN, beim runterzählen auf AUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als Beispiel ein Tastverhältnis von 20%&lt;br /&gt;
[[Bild:Compare205.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Als Beispiel ein Tastverhältnis von 80%&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Bild:Compare51.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hier sieht man, wie die Signale dann auf einem Osciloskop  ausschauen.&lt;br /&gt;
Oben das Signal von Pin15 (Compare A) , unten das von Pin 16 (Compare B)&lt;br /&gt;
[[Bild:Osci-PWM-kleiner3.GIF|center]]&lt;br /&gt;
&lt;br /&gt;
=== Grundprogramm ===&lt;br /&gt;
&lt;br /&gt;
Hier nun ein Grundprogramm für die Ausgabe von zwei PWM Signalen mit dem Timer1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
' Hardware PWM mit Timer1&lt;br /&gt;
&lt;br /&gt;
$regfile = &amp;quot;m8def.dat&amp;quot;&lt;br /&gt;
$crystal = 4000000&lt;br /&gt;
&lt;br /&gt;
Config Pinb.1 = Output&lt;br /&gt;
Config Pinb.2 = Output&lt;br /&gt;
&lt;br /&gt;
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
 Compare1a = 205&lt;br /&gt;
 Compare1b = 51&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;
''' Erklärung:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$regfile = &amp;quot;m8def.dat&amp;quot;&lt;br /&gt;
$crystal = 8000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Definiert den Mega8 und den 8MHz Quarz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Config Pinb.1 = Output&lt;br /&gt;
Config Pinb.2 = Output&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Definiert die zwei Ausgänge von Timer1 auf Ausgabe.&amp;lt;br/&amp;gt;&lt;br /&gt;
Pinb.1 = für Compare1a (= Compare A) = Pin 15&amp;lt;br/&amp;gt;&lt;br /&gt;
Pinb.2 = für Compare1b (= Compare B) = Pin 16&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
;Config Timer1 = Pwm&lt;br /&gt;
: Timer1 auf  PWM  einstellen&lt;br /&gt;
&lt;br /&gt;
;Pwm = 8 &lt;br /&gt;
:Timer Auflösung = 8 Bit einstellen&lt;br /&gt;
&lt;br /&gt;
;Compare A Pwm = Clear Up:Definiert, wie der Compare A schalten soll. Bei  „Clear Up“ schaltet der Ausgang beim erreichen  &lt;br /&gt;
:des Compare-Wertes zuerst auf  High und dann auf Low. Bei „Clear Down“, umgekehrt. &lt;br /&gt;
&lt;br /&gt;
;Compare B Pwm = Clear Up&lt;br /&gt;
:Das gleiche noch mal mit Compare B                                          &lt;br /&gt;
&lt;br /&gt;
;Prescale = 1&lt;br /&gt;
:Hier wird der Prescaler auf  1 eingestellt.&lt;br /&gt;
:(Wert 1 heißt, direkte Frequenz vom Quarz zum Timer.)&lt;br /&gt;
:Weitere Teilungen, wie z.B.: 8, 64, 256 und 1024  sind möglich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Compare1a = 205&lt;br /&gt;
Compare1b = 51&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Hier kann man nun die Werte für das Tastverhältnis, in das Register Compare1a&lt;br /&gt;
und Compare1b schreiben. Oder man kann auch, satt Compare1a und 1b , die Bezeichnungen &lt;br /&gt;
Pwm1a und Pwm1b verwenden. Bascom nimmt beides.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit diesem kurzen Programm, hat man nun zwei PWM Signale erzeigt, wo das eine ein Tastverhältnis&lt;br /&gt;
von 20% (Compare1a) und das andere von 80 % hat. :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Autor==&lt;br /&gt;
*  [[Benutzer:Roberto|Roberto]]&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Avr]]&lt;br /&gt;
* [[Bascom]]&lt;br /&gt;
* [[Pwm]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Quellcode Bascom]]&lt;/div&gt;</summary>
		<author><name>Darth Ding</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Bascom_und_LCD%27s&amp;diff=5558</id>
		<title>Bascom und LCD's</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Bascom_und_LCD%27s&amp;diff=5558"/>
				<updated>2006-01-24T13:19:56Z</updated>
		
		<summary type="html">&lt;p&gt;Darth Ding: /* Anschlussmöglichkeiten des Dispaly */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Mit Bascom, LCD-Displays ansteuern ==&lt;br /&gt;
&lt;br /&gt;
===LCD Display===&lt;br /&gt;
&lt;br /&gt;
Ein LCD-Display kann man mit wenig Aufwand an einen AVR anschließen. Ein paar Leitungen, ein kleines Programm und schon hat man eine Anzeige für den AVR.&lt;br /&gt;
&lt;br /&gt;
Es gibt unter den Displays zwei große Gruppen. &lt;br /&gt;
&lt;br /&gt;
Die einen sind die Text-Displays (können nur Text und deren Sonderzeichen darstellen), die anderen sind die Grafik-Displays.&lt;br /&gt;
&lt;br /&gt;
Hier geht es um Text- Displays.&lt;br /&gt;
&lt;br /&gt;
====Anschlüsse:====&lt;br /&gt;
&lt;br /&gt;
Die meisten Text-LCD’s haben einen 14 Poligen bzw. einen 16 Poligen Anschluss. &lt;br /&gt;
14 Polig ist meist ein LCD ohne Hintergrundbeleuchtung und beim 16 Poligen ist meist der Pin 15 und 16 die Beleuchtung.&lt;br /&gt;
&lt;br /&gt;
Die Anschlüsse vom LCD-Display:&lt;br /&gt;
&lt;br /&gt;
{|{{Blauetabelle}} &lt;br /&gt;
|1 	&lt;br /&gt;
|Vss	&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Vcc&lt;br /&gt;
|5V&lt;br /&gt;
|-&lt;br /&gt;
|3	&lt;br /&gt;
|Vee	&lt;br /&gt;
|Kontrastspannung (0V bis 5V)&lt;br /&gt;
|-&lt;br /&gt;
|4	&lt;br /&gt;
|RS	&lt;br /&gt;
|Register Select (Befehle/Daten)&lt;br /&gt;
|-&lt;br /&gt;
|5	&lt;br /&gt;
|RW	&lt;br /&gt;
|Read/Write&lt;br /&gt;
|-&lt;br /&gt;
|6	&lt;br /&gt;
|E	&lt;br /&gt;
|Enable&lt;br /&gt;
|-&lt;br /&gt;
|7	&lt;br /&gt;
|DB0	&lt;br /&gt;
|Datenbit 0&lt;br /&gt;
|-&lt;br /&gt;
|8	&lt;br /&gt;
|DB1	&lt;br /&gt;
|Datenbit 1&lt;br /&gt;
|-&lt;br /&gt;
|9	&lt;br /&gt;
|DB2	&lt;br /&gt;
|Datenbit 2&lt;br /&gt;
|-&lt;br /&gt;
|10	&lt;br /&gt;
|DB3	&lt;br /&gt;
|Datenbit 3&lt;br /&gt;
|-&lt;br /&gt;
|11&lt;br /&gt;
|DB4&lt;br /&gt;
|Datenbit 4&lt;br /&gt;
|-&lt;br /&gt;
|12&lt;br /&gt;
|DB5&lt;br /&gt;
|Datenbit 5&lt;br /&gt;
|-&lt;br /&gt;
|13	&lt;br /&gt;
|DB6	&lt;br /&gt;
|Datenbit 6&lt;br /&gt;
|-&lt;br /&gt;
|14	&lt;br /&gt;
|DB7	&lt;br /&gt;
|Datenbit 7&lt;br /&gt;
|-&lt;br /&gt;
|15	&lt;br /&gt;
|Beleuchtung	&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|16	&lt;br /&gt;
|Beleuchtung	&lt;br /&gt;
|5V über mindestens einen  5 Ohm Widerstand anschließen)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In den meisten Displays wird der Controllerchip HD44780 von Hitachi eingesetzt, oder auch der kompatible Bruder SED1278 von Epson. Auch in Verbindung mit dem Chip HD44100. (Auf der Rückseite vom Display nachschauen) Für alle diese trifft das obige Anschlussbild zu.&lt;br /&gt;
&lt;br /&gt;
Hier ein LCD  mit 16 Zeichen mal 2 Zeilen (16*2)&lt;br /&gt;
[[Bild:LCD 16 2 Vorderseite.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Und davon die Rückseite, mit Chip HD44100 und HD44780&lt;br /&gt;
[[Bild:LCD_16_2_Rückseite_kleiner.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hier ein LCD mit 24 Zeichen in je 2 Zeilen&lt;br /&gt;
[[Bild:LCD_24_2_Vorderseite_kleiner.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
Und die Rückseite&lt;br /&gt;
[[Bild:LCD_24_2_Rückseite_kleiner.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
==== Anschluss ====&lt;br /&gt;
Die Stromversorgung eines LCD sieht so aus:&lt;br /&gt;
[[Bild:Stromversorgung.jpg|center]]&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit dieser Beschaltung kann man schon mal probieren, ob man durch verdrehen des Kontrast-Potie, dunkle Vierecke zu sehen bekommt. Wenn ja, ist bis hier her schon mal alles ok .&lt;br /&gt;
Den Kontrast jetzt so einstellen, dass man gerade, diese dunklen Vierecke nicht mehr sieht.&lt;br /&gt;
&lt;br /&gt;
==== Anschlussmöglichkeiten des Dispaly ====&lt;br /&gt;
&lt;br /&gt;
Das Display besitzt neben der Stromversorgung noch die Anschlüsse: RW, RS , E und 8 Datenleitungen.&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Möglichkeiten, wie man die  8 Datenleitungen des Displays an den AVR anschließen kann.&amp;lt;br&amp;gt;&lt;br /&gt;
Einmal den 8-Bit Modus und einmal den 4-Bit Modus.&lt;br /&gt;
Beim 8 Bit Modus schließt man alle 8 Datenleitungen an den AVR und kann in einem Schritt ein Zeichen (=1 Byte )in das Display übertragen.&lt;br /&gt;
Oder man macht  es im 4 Bit Modus mit nur 4 Datenleitungen und muss dafür 2*4 Bit für ein Zeichen übertragen (4 Bit = ein Nibble)&lt;br /&gt;
&lt;br /&gt;
Der Vorteil: &amp;lt;br&amp;gt;&lt;br /&gt;
Ich erspare mir somit 4 Leitungen des AVR’s und kann sie anderweitig nutzen.&lt;br /&gt;
&lt;br /&gt;
Der Nachteil:&amp;lt;br&amp;gt;&lt;br /&gt;
Ich muss für ein Zeichen nun 2*4 Bit übertragen (= langsamer)&lt;br /&gt;
&lt;br /&gt;
Aber da in diesem Fall die Geschwindigkeit nicht so eine große Rolle spielt und wir lieber 4 Leitungen mehr am AVR haben möchten, schließen wird das Display im 4Bit Modus an.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anschlussbelegung für das Display im 4-Bit Modus: (Als Beispiel am Port D)&lt;br /&gt;
 &lt;br /&gt;
{|{{Blauetabelle}}&lt;br /&gt;
|&lt;br /&gt;
|Display	&lt;br /&gt;
|Am AVR&lt;br /&gt;
|-&lt;br /&gt;
|1	&lt;br /&gt;
|Vss	&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|2	&lt;br /&gt;
|Vcc	&lt;br /&gt;
|5V&lt;br /&gt;
|-&lt;br /&gt;
|3	&lt;br /&gt;
|Vee	&lt;br /&gt;
|Poti (siehe oben)&lt;br /&gt;
|-&lt;br /&gt;
|4	&lt;br /&gt;
|RS	&lt;br /&gt;
|PD4 am AVR&lt;br /&gt;
|-&lt;br /&gt;
|5	&lt;br /&gt;
|RW	&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|6	&lt;br /&gt;
|E	&lt;br /&gt;
|PD5 am AVR&lt;br /&gt;
|-&lt;br /&gt;
|7	&lt;br /&gt;
|DB0	&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|8	&lt;br /&gt;
|DB1	&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|9	&lt;br /&gt;
|DB2	&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|10	&lt;br /&gt;
|DB3	&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|11	&lt;br /&gt;
|DB4	&lt;br /&gt;
|PD0 am AVR&lt;br /&gt;
|-&lt;br /&gt;
|12	&lt;br /&gt;
|DB5	&lt;br /&gt;
|PD1 am AVR&lt;br /&gt;
|-&lt;br /&gt;
|13	&lt;br /&gt;
|DB6	&lt;br /&gt;
|PD2 am AVR&lt;br /&gt;
|-&lt;br /&gt;
|14	&lt;br /&gt;
|DB7	&lt;br /&gt;
|PD3 am AVR&lt;br /&gt;
|-&lt;br /&gt;
|15	&lt;br /&gt;
|Beleu.	&lt;br /&gt;
|frei&lt;br /&gt;
|-&lt;br /&gt;
|16	&lt;br /&gt;
|Beleu.	&lt;br /&gt;
|frei&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die vier Datenleitungen vom Display, die wir nicht brauchen, legen wir auf Masse. Zu den vier Datenleitungen brauchen wir noch die Leitungen  RS und E. Den Anschluss RW brauchen wir nicht und legen ihn deshalb auch auf Masse.&lt;br /&gt;
&lt;br /&gt;
Wir kommen somit für das Display mit 6 Datenleitungen aus, die wir alle an das Port D (vom Mega 8) anschließen.&lt;br /&gt;
&lt;br /&gt;
=== Das Programm für das LCD ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $regfile = &amp;quot;m8def.dat&amp;quot;&lt;br /&gt;
 $crystal = 4000000&lt;br /&gt;
&lt;br /&gt;
 Config Lcd = 16 * 2&lt;br /&gt;
 Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4&lt;br /&gt;
 Config Lcdbus = 4&lt;br /&gt;
 &lt;br /&gt;
 Cls&lt;br /&gt;
 Locate 1 , 1&lt;br /&gt;
 Lcd &amp;quot;Hallo Welt&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dieses Programm gibt den Text „Hallo Welt“ auf dem Display aus.&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $regfile = &amp;quot;m8def.dat&amp;quot;&lt;br /&gt;
 $crystal = 4000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Definiert den Mega8 als Prozessor und einen 4 Mhz Quarz.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Config Lcd = 16 * 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Definiert das LCD-Display als 16*2 Anzeige.&lt;br /&gt;
Sind somit zwei Zeilen mit jeweils 16 Zeichen.&amp;lt;br&amp;gt; &lt;br /&gt;
Folgende weitere Typen von LCD’s könnte man angeben:&lt;br /&gt;
16*1 , 16*2 , 16*4 , 20*2 , 20*4 , 40*4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Definiert, wo das Display an den AVR angeschlossen wird. Db4, Db5, Db6....., E , RS sind die Pins vom LCD (siehe Tabelle)&amp;lt;br&amp;gt;&lt;br /&gt;
Portd.0, Portd.1 u.s.w., sind die Port’s vom Mega8 (Port D)&amp;lt;br&amp;gt;&lt;br /&gt;
Heißt also: Die Leitung Db4 vom LCD wird an den Port  PD0&lt;br /&gt;
angeschlossen (Pin 2 am Mega8)&amp;lt;br&amp;gt;&lt;br /&gt;
Mit diesem Befehl, kann man das LCD auch an andere Pins vom AVR anschließen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Config Lcdbus = 4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Definiert den 4-Bit Modus für das LCD.&lt;br /&gt;
Beim 8-Bit Modus, müsste man statt der 4 eine 8 schreiben.&lt;br /&gt;
Der AVR weis dann, wie viele Datenleitungen angeschlossen wurden und wie er den Datentransfer zu dem LCD durchführen muss.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Cls&lt;br /&gt;
Locate 1 , 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cls löscht das LCD-Display und Locate 1,1 definiert die nächste Ausgabe mit 1.) Zeile, 1.)Position&amp;lt;br&amp;gt;&lt;br /&gt;
(Locate 2,10 wäre dann ausgabe in Zeile 2 und an zehnter Position )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lcd &amp;quot;Hallo Welt&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Mit LCD kann man nun den Text ausgeben. :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Autor==&lt;br /&gt;
*  [[Benutzer:Roberto|Roberto]]&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
* [http://www.sprut.de/electronic/lcd/index.htm#einleitung Sprut]&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Avr]]&lt;br /&gt;
* [[Bascom]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Quellcode Bascom]]&lt;/div&gt;</summary>
		<author><name>Darth Ding</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Bascom_und_LCD%27s&amp;diff=5557</id>
		<title>Bascom und LCD's</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Bascom_und_LCD%27s&amp;diff=5557"/>
				<updated>2006-01-24T13:18:28Z</updated>
		
		<summary type="html">&lt;p&gt;Darth Ding: /* LCD Display */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Mit Bascom, LCD-Displays ansteuern ==&lt;br /&gt;
&lt;br /&gt;
===LCD Display===&lt;br /&gt;
&lt;br /&gt;
Ein LCD-Display kann man mit wenig Aufwand an einen AVR anschließen. Ein paar Leitungen, ein kleines Programm und schon hat man eine Anzeige für den AVR.&lt;br /&gt;
&lt;br /&gt;
Es gibt unter den Displays zwei große Gruppen. &lt;br /&gt;
&lt;br /&gt;
Die einen sind die Text-Displays (können nur Text und deren Sonderzeichen darstellen), die anderen sind die Grafik-Displays.&lt;br /&gt;
&lt;br /&gt;
Hier geht es um Text- Displays.&lt;br /&gt;
&lt;br /&gt;
====Anschlüsse:====&lt;br /&gt;
&lt;br /&gt;
Die meisten Text-LCD’s haben einen 14 Poligen bzw. einen 16 Poligen Anschluss. &lt;br /&gt;
14 Polig ist meist ein LCD ohne Hintergrundbeleuchtung und beim 16 Poligen ist meist der Pin 15 und 16 die Beleuchtung.&lt;br /&gt;
&lt;br /&gt;
Die Anschlüsse vom LCD-Display:&lt;br /&gt;
&lt;br /&gt;
{|{{Blauetabelle}} &lt;br /&gt;
|1 	&lt;br /&gt;
|Vss	&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Vcc&lt;br /&gt;
|5V&lt;br /&gt;
|-&lt;br /&gt;
|3	&lt;br /&gt;
|Vee	&lt;br /&gt;
|Kontrastspannung (0V bis 5V)&lt;br /&gt;
|-&lt;br /&gt;
|4	&lt;br /&gt;
|RS	&lt;br /&gt;
|Register Select (Befehle/Daten)&lt;br /&gt;
|-&lt;br /&gt;
|5	&lt;br /&gt;
|RW	&lt;br /&gt;
|Read/Write&lt;br /&gt;
|-&lt;br /&gt;
|6	&lt;br /&gt;
|E	&lt;br /&gt;
|Enable&lt;br /&gt;
|-&lt;br /&gt;
|7	&lt;br /&gt;
|DB0	&lt;br /&gt;
|Datenbit 0&lt;br /&gt;
|-&lt;br /&gt;
|8	&lt;br /&gt;
|DB1	&lt;br /&gt;
|Datenbit 1&lt;br /&gt;
|-&lt;br /&gt;
|9	&lt;br /&gt;
|DB2	&lt;br /&gt;
|Datenbit 2&lt;br /&gt;
|-&lt;br /&gt;
|10	&lt;br /&gt;
|DB3	&lt;br /&gt;
|Datenbit 3&lt;br /&gt;
|-&lt;br /&gt;
|11&lt;br /&gt;
|DB4&lt;br /&gt;
|Datenbit 4&lt;br /&gt;
|-&lt;br /&gt;
|12&lt;br /&gt;
|DB5&lt;br /&gt;
|Datenbit 5&lt;br /&gt;
|-&lt;br /&gt;
|13	&lt;br /&gt;
|DB6	&lt;br /&gt;
|Datenbit 6&lt;br /&gt;
|-&lt;br /&gt;
|14	&lt;br /&gt;
|DB7	&lt;br /&gt;
|Datenbit 7&lt;br /&gt;
|-&lt;br /&gt;
|15	&lt;br /&gt;
|Beleuchtung	&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|16	&lt;br /&gt;
|Beleuchtung	&lt;br /&gt;
|5V über mindestens einen  5 Ohm Widerstand anschließen)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In den meisten Displays wird der Controllerchip HD44780 von Hitachi eingesetzt, oder auch der kompatible Bruder SED1278 von Epson. Auch in Verbindung mit dem Chip HD44100. (Auf der Rückseite vom Display nachschauen) Für alle diese trifft das obige Anschlussbild zu.&lt;br /&gt;
&lt;br /&gt;
Hier ein LCD  mit 16 Zeichen mal 2 Zeilen (16*2)&lt;br /&gt;
[[Bild:LCD 16 2 Vorderseite.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Und davon die Rückseite, mit Chip HD44100 und HD44780&lt;br /&gt;
[[Bild:LCD_16_2_Rückseite_kleiner.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hier ein LCD mit 24 Zeichen in je 2 Zeilen&lt;br /&gt;
[[Bild:LCD_24_2_Vorderseite_kleiner.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
Und die Rückseite&lt;br /&gt;
[[Bild:LCD_24_2_Rückseite_kleiner.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
==== Anschluss ====&lt;br /&gt;
Die Stromversorgung eines LCD sieht so aus:&lt;br /&gt;
[[Bild:Stromversorgung.jpg|center]]&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit dieser Beschaltung kann man schon mal probieren, ob man durch verdrehen des Kontrast-Potie, dunkle Vierecke zu sehen bekommt. Wenn ja, ist bis hier her schon mal alles ok .&lt;br /&gt;
Den Kontrast jetzt so einstellen, dass man gerade, diese dunklen Vierecke nicht mehr sieht.&lt;br /&gt;
&lt;br /&gt;
==== Anschlussmöglichkeiten des Dispaly ====&lt;br /&gt;
&lt;br /&gt;
Das Display besitzt neben der Stromversorgung noch die Anschlüsse: RW, RS , E und 8 Datenleitungen.&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Möglichkeiten, wie man die  8 Datenleitungen des Displays an den AVR anschließen kann.&amp;lt;br&amp;gt;&lt;br /&gt;
Einmal den 8-Bit Modus und einmal den 4-Bit Modus.&lt;br /&gt;
Beim 8 Bit Modus, schließt man alle 8 Datenleitungen an den AVR und kann in einem Schritt, ein Zeichen (=1 Byte )in das Display übertragen.&lt;br /&gt;
Oder man macht  es im 4 Bit Modus, mit nur 4 Datenleitungen und muss dafür 2*4 Bit für ein Zeichen übertragen (4 Bit = ein Nibble)&lt;br /&gt;
&lt;br /&gt;
Der Vorteil: &amp;lt;br&amp;gt;&lt;br /&gt;
Ich erspare mir somit 4 Leitungen des AVR’s und kann sie anderweitig nutzen.&lt;br /&gt;
&lt;br /&gt;
Der Nachteil:&amp;lt;br&amp;gt;&lt;br /&gt;
Ich muss für ein Zeichen nun 2*4 Bit übertragen (= langsamer)&lt;br /&gt;
&lt;br /&gt;
Aber, da in diesem Fall die Geschwindigkeit nicht so eine große Rolle spielt und wir lieber 4 Leitungen mehr am AVR haben möchten, schließen wird das Display im 4Bit Modus an.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anschlussbelegung für das Display im 4-Bit Modus: (Als Beispiel am Port D)&lt;br /&gt;
 &lt;br /&gt;
{|{{Blauetabelle}}&lt;br /&gt;
|&lt;br /&gt;
|Display	&lt;br /&gt;
|Am AVR&lt;br /&gt;
|-&lt;br /&gt;
|1	&lt;br /&gt;
|Vss	&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|2	&lt;br /&gt;
|Vcc	&lt;br /&gt;
|5V&lt;br /&gt;
|-&lt;br /&gt;
|3	&lt;br /&gt;
|Vee	&lt;br /&gt;
|Poti (siehe oben)&lt;br /&gt;
|-&lt;br /&gt;
|4	&lt;br /&gt;
|RS	&lt;br /&gt;
|PD4 am AVR&lt;br /&gt;
|-&lt;br /&gt;
|5	&lt;br /&gt;
|RW	&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|6	&lt;br /&gt;
|E	&lt;br /&gt;
|PD5 am AVR&lt;br /&gt;
|-&lt;br /&gt;
|7	&lt;br /&gt;
|DB0	&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|8	&lt;br /&gt;
|DB1	&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|9	&lt;br /&gt;
|DB2	&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|10	&lt;br /&gt;
|DB3	&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|11	&lt;br /&gt;
|DB4	&lt;br /&gt;
|PD0 am AVR&lt;br /&gt;
|-&lt;br /&gt;
|12	&lt;br /&gt;
|DB5	&lt;br /&gt;
|PD1 am AVR&lt;br /&gt;
|-&lt;br /&gt;
|13	&lt;br /&gt;
|DB6	&lt;br /&gt;
|PD2 am AVR&lt;br /&gt;
|-&lt;br /&gt;
|14	&lt;br /&gt;
|DB7	&lt;br /&gt;
|PD3 am AVR&lt;br /&gt;
|-&lt;br /&gt;
|15	&lt;br /&gt;
|Beleu.	&lt;br /&gt;
|frei&lt;br /&gt;
|-&lt;br /&gt;
|16	&lt;br /&gt;
|Beleu.	&lt;br /&gt;
|frei&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die vier Datenleitungen vom Display, die wir nicht brauchen, legen wir auf Masse. Zu den vier Datenleitungen brauchen wir noch die Leitungen  RS und E. Den Anschluss RW brauchen wir nicht und legen ihn deshalb auch auf Masse.&lt;br /&gt;
&lt;br /&gt;
Wir kommen somit für das Display mit 6 Datenleitungen aus, die wir alle an das Port D (vom Mega 8) anschließen.&lt;br /&gt;
&lt;br /&gt;
=== Das Programm für das LCD ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $regfile = &amp;quot;m8def.dat&amp;quot;&lt;br /&gt;
 $crystal = 4000000&lt;br /&gt;
&lt;br /&gt;
 Config Lcd = 16 * 2&lt;br /&gt;
 Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4&lt;br /&gt;
 Config Lcdbus = 4&lt;br /&gt;
 &lt;br /&gt;
 Cls&lt;br /&gt;
 Locate 1 , 1&lt;br /&gt;
 Lcd &amp;quot;Hallo Welt&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dieses Programm gibt den Text „Hallo Welt“ auf dem Display aus.&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $regfile = &amp;quot;m8def.dat&amp;quot;&lt;br /&gt;
 $crystal = 4000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Definiert den Mega8 als Prozessor und einen 4 Mhz Quarz.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Config Lcd = 16 * 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Definiert das LCD-Display als 16*2 Anzeige.&lt;br /&gt;
Sind somit zwei Zeilen mit jeweils 16 Zeichen.&amp;lt;br&amp;gt; &lt;br /&gt;
Folgende weitere Typen von LCD’s könnte man angeben:&lt;br /&gt;
16*1 , 16*2 , 16*4 , 20*2 , 20*4 , 40*4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Definiert, wo das Display an den AVR angeschlossen wird. Db4, Db5, Db6....., E , RS sind die Pins vom LCD (siehe Tabelle)&amp;lt;br&amp;gt;&lt;br /&gt;
Portd.0, Portd.1 u.s.w., sind die Port’s vom Mega8 (Port D)&amp;lt;br&amp;gt;&lt;br /&gt;
Heißt also: Die Leitung Db4 vom LCD wird an den Port  PD0&lt;br /&gt;
angeschlossen (Pin 2 am Mega8)&amp;lt;br&amp;gt;&lt;br /&gt;
Mit diesem Befehl, kann man das LCD auch an andere Pins vom AVR anschließen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Config Lcdbus = 4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Definiert den 4-Bit Modus für das LCD.&lt;br /&gt;
Beim 8-Bit Modus, müsste man statt der 4 eine 8 schreiben.&lt;br /&gt;
Der AVR weis dann, wie viele Datenleitungen angeschlossen wurden und wie er den Datentransfer zu dem LCD durchführen muss.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Cls&lt;br /&gt;
Locate 1 , 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cls löscht das LCD-Display und Locate 1,1 definiert die nächste Ausgabe mit 1.) Zeile, 1.)Position&amp;lt;br&amp;gt;&lt;br /&gt;
(Locate 2,10 wäre dann ausgabe in Zeile 2 und an zehnter Position )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lcd &amp;quot;Hallo Welt&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Mit LCD kann man nun den Text ausgeben. :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Autor==&lt;br /&gt;
*  [[Benutzer:Roberto|Roberto]]&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
* [http://www.sprut.de/electronic/lcd/index.htm#einleitung Sprut]&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Avr]]&lt;br /&gt;
* [[Bascom]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Quellcode Bascom]]&lt;/div&gt;</summary>
		<author><name>Darth Ding</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Bascom_und_LCD%27s&amp;diff=5556</id>
		<title>Bascom und LCD's</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Bascom_und_LCD%27s&amp;diff=5556"/>
				<updated>2006-01-24T13:17:04Z</updated>
		
		<summary type="html">&lt;p&gt;Darth Ding: /* Anschlüsse: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Mit Bascom, LCD-Displays ansteuern ==&lt;br /&gt;
&lt;br /&gt;
===LCD Display===&lt;br /&gt;
&lt;br /&gt;
Ein LCD-Display, kann man mit wenig Aufwand an einen AVR anschließen. Ein paar Leitungen, ein kleines Programm und schon hat man eine Anzeige für den AVR.&lt;br /&gt;
&lt;br /&gt;
Es gibt unter den Displays zwei große Gruppen. &lt;br /&gt;
&lt;br /&gt;
Das eine sind die Text-Displays (können nur Text und deren Sonderzeichen darstellen), das andere sind die Grafik-Displays.&lt;br /&gt;
&lt;br /&gt;
Hier geht es um Text- Displays.&lt;br /&gt;
&lt;br /&gt;
====Anschlüsse:====&lt;br /&gt;
&lt;br /&gt;
Die meisten Text-LCD’s haben einen 14 Poligen bzw. einen 16 Poligen Anschluss. &lt;br /&gt;
14 Polig ist meist ein LCD ohne Hintergrundbeleuchtung und beim 16 Poligen ist meist der Pin 15 und 16 die Beleuchtung.&lt;br /&gt;
&lt;br /&gt;
Die Anschlüsse vom LCD-Display:&lt;br /&gt;
&lt;br /&gt;
{|{{Blauetabelle}} &lt;br /&gt;
|1 	&lt;br /&gt;
|Vss	&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Vcc&lt;br /&gt;
|5V&lt;br /&gt;
|-&lt;br /&gt;
|3	&lt;br /&gt;
|Vee	&lt;br /&gt;
|Kontrastspannung (0V bis 5V)&lt;br /&gt;
|-&lt;br /&gt;
|4	&lt;br /&gt;
|RS	&lt;br /&gt;
|Register Select (Befehle/Daten)&lt;br /&gt;
|-&lt;br /&gt;
|5	&lt;br /&gt;
|RW	&lt;br /&gt;
|Read/Write&lt;br /&gt;
|-&lt;br /&gt;
|6	&lt;br /&gt;
|E	&lt;br /&gt;
|Enable&lt;br /&gt;
|-&lt;br /&gt;
|7	&lt;br /&gt;
|DB0	&lt;br /&gt;
|Datenbit 0&lt;br /&gt;
|-&lt;br /&gt;
|8	&lt;br /&gt;
|DB1	&lt;br /&gt;
|Datenbit 1&lt;br /&gt;
|-&lt;br /&gt;
|9	&lt;br /&gt;
|DB2	&lt;br /&gt;
|Datenbit 2&lt;br /&gt;
|-&lt;br /&gt;
|10	&lt;br /&gt;
|DB3	&lt;br /&gt;
|Datenbit 3&lt;br /&gt;
|-&lt;br /&gt;
|11&lt;br /&gt;
|DB4&lt;br /&gt;
|Datenbit 4&lt;br /&gt;
|-&lt;br /&gt;
|12&lt;br /&gt;
|DB5&lt;br /&gt;
|Datenbit 5&lt;br /&gt;
|-&lt;br /&gt;
|13	&lt;br /&gt;
|DB6	&lt;br /&gt;
|Datenbit 6&lt;br /&gt;
|-&lt;br /&gt;
|14	&lt;br /&gt;
|DB7	&lt;br /&gt;
|Datenbit 7&lt;br /&gt;
|-&lt;br /&gt;
|15	&lt;br /&gt;
|Beleuchtung	&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|16	&lt;br /&gt;
|Beleuchtung	&lt;br /&gt;
|5V über mindestens einen  5 Ohm Widerstand anschließen)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In den meisten Displays wird der Controllerchip HD44780 von Hitachi eingesetzt, oder auch der kompatible Bruder SED1278 von Epson. Auch in Verbindung mit dem Chip HD44100. (Auf der Rückseite vom Display nachschauen) Für alle diese trifft das obige Anschlussbild zu.&lt;br /&gt;
&lt;br /&gt;
Hier ein LCD  mit 16 Zeichen mal 2 Zeilen (16*2)&lt;br /&gt;
[[Bild:LCD 16 2 Vorderseite.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Und davon die Rückseite, mit Chip HD44100 und HD44780&lt;br /&gt;
[[Bild:LCD_16_2_Rückseite_kleiner.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hier ein LCD mit 24 Zeichen in je 2 Zeilen&lt;br /&gt;
[[Bild:LCD_24_2_Vorderseite_kleiner.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
Und die Rückseite&lt;br /&gt;
[[Bild:LCD_24_2_Rückseite_kleiner.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
==== Anschluss ====&lt;br /&gt;
Die Stromversorgung eines LCD sieht so aus:&lt;br /&gt;
[[Bild:Stromversorgung.jpg|center]]&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit dieser Beschaltung kann man schon mal probieren, ob man durch verdrehen des Kontrast-Potie, dunkle Vierecke zu sehen bekommt. Wenn ja, ist bis hier her schon mal alles ok .&lt;br /&gt;
Den Kontrast jetzt so einstellen, dass man gerade, diese dunklen Vierecke nicht mehr sieht.&lt;br /&gt;
&lt;br /&gt;
==== Anschlussmöglichkeiten des Dispaly ====&lt;br /&gt;
&lt;br /&gt;
Das Display besitzt neben der Stromversorgung noch die Anschlüsse: RW, RS , E und 8 Datenleitungen.&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Möglichkeiten, wie man die  8 Datenleitungen des Displays an den AVR anschließen kann.&amp;lt;br&amp;gt;&lt;br /&gt;
Einmal den 8-Bit Modus und einmal den 4-Bit Modus.&lt;br /&gt;
Beim 8 Bit Modus, schließt man alle 8 Datenleitungen an den AVR und kann in einem Schritt, ein Zeichen (=1 Byte )in das Display übertragen.&lt;br /&gt;
Oder man macht  es im 4 Bit Modus, mit nur 4 Datenleitungen und muss dafür 2*4 Bit für ein Zeichen übertragen (4 Bit = ein Nibble)&lt;br /&gt;
&lt;br /&gt;
Der Vorteil: &amp;lt;br&amp;gt;&lt;br /&gt;
Ich erspare mir somit 4 Leitungen des AVR’s und kann sie anderweitig nutzen.&lt;br /&gt;
&lt;br /&gt;
Der Nachteil:&amp;lt;br&amp;gt;&lt;br /&gt;
Ich muss für ein Zeichen nun 2*4 Bit übertragen (= langsamer)&lt;br /&gt;
&lt;br /&gt;
Aber, da in diesem Fall die Geschwindigkeit nicht so eine große Rolle spielt und wir lieber 4 Leitungen mehr am AVR haben möchten, schließen wird das Display im 4Bit Modus an.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anschlussbelegung für das Display im 4-Bit Modus: (Als Beispiel am Port D)&lt;br /&gt;
 &lt;br /&gt;
{|{{Blauetabelle}}&lt;br /&gt;
|&lt;br /&gt;
|Display	&lt;br /&gt;
|Am AVR&lt;br /&gt;
|-&lt;br /&gt;
|1	&lt;br /&gt;
|Vss	&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|2	&lt;br /&gt;
|Vcc	&lt;br /&gt;
|5V&lt;br /&gt;
|-&lt;br /&gt;
|3	&lt;br /&gt;
|Vee	&lt;br /&gt;
|Poti (siehe oben)&lt;br /&gt;
|-&lt;br /&gt;
|4	&lt;br /&gt;
|RS	&lt;br /&gt;
|PD4 am AVR&lt;br /&gt;
|-&lt;br /&gt;
|5	&lt;br /&gt;
|RW	&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|6	&lt;br /&gt;
|E	&lt;br /&gt;
|PD5 am AVR&lt;br /&gt;
|-&lt;br /&gt;
|7	&lt;br /&gt;
|DB0	&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|8	&lt;br /&gt;
|DB1	&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|9	&lt;br /&gt;
|DB2	&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|10	&lt;br /&gt;
|DB3	&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|11	&lt;br /&gt;
|DB4	&lt;br /&gt;
|PD0 am AVR&lt;br /&gt;
|-&lt;br /&gt;
|12	&lt;br /&gt;
|DB5	&lt;br /&gt;
|PD1 am AVR&lt;br /&gt;
|-&lt;br /&gt;
|13	&lt;br /&gt;
|DB6	&lt;br /&gt;
|PD2 am AVR&lt;br /&gt;
|-&lt;br /&gt;
|14	&lt;br /&gt;
|DB7	&lt;br /&gt;
|PD3 am AVR&lt;br /&gt;
|-&lt;br /&gt;
|15	&lt;br /&gt;
|Beleu.	&lt;br /&gt;
|frei&lt;br /&gt;
|-&lt;br /&gt;
|16	&lt;br /&gt;
|Beleu.	&lt;br /&gt;
|frei&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die vier Datenleitungen vom Display, die wir nicht brauchen, legen wir auf Masse. Zu den vier Datenleitungen brauchen wir noch die Leitungen  RS und E. Den Anschluss RW brauchen wir nicht und legen ihn deshalb auch auf Masse.&lt;br /&gt;
&lt;br /&gt;
Wir kommen somit für das Display, mit 6 Datenleitungen aus, die wir alle an das Port D (vom Mega 8) anschließen.&lt;br /&gt;
&lt;br /&gt;
=== Das Programm für das LCD ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $regfile = &amp;quot;m8def.dat&amp;quot;&lt;br /&gt;
 $crystal = 4000000&lt;br /&gt;
&lt;br /&gt;
 Config Lcd = 16 * 2&lt;br /&gt;
 Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4&lt;br /&gt;
 Config Lcdbus = 4&lt;br /&gt;
 &lt;br /&gt;
 Cls&lt;br /&gt;
 Locate 1 , 1&lt;br /&gt;
 Lcd &amp;quot;Hallo Welt&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dieses Programm gibt den Text „Hallo Welt“ auf dem Display aus.&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $regfile = &amp;quot;m8def.dat&amp;quot;&lt;br /&gt;
 $crystal = 4000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Definiert den Mega8 als Prozessor und einen 4 Mhz Quarz.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Config Lcd = 16 * 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Definiert das LCD-Display als 16*2 Anzeige.&lt;br /&gt;
Sind somit zwei Zeilen mit jeweils 16 Zeichen.&amp;lt;br&amp;gt; &lt;br /&gt;
Folgende weitere Typen von LCD’s könnte man angeben:&lt;br /&gt;
16*1 , 16*2 , 16*4 , 20*2 , 20*4 , 40*4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Definiert, wo das Display an den AVR angeschlossen wird. Db4, Db5, Db6....., E , RS sind die Pins vom LCD (siehe Tabelle)&amp;lt;br&amp;gt;&lt;br /&gt;
Portd.0, Portd.1 u.s.w., sind die Port’s vom Mega8 (Port D)&amp;lt;br&amp;gt;&lt;br /&gt;
Heißt also: Die Leitung Db4 vom LCD wird an den Port  PD0&lt;br /&gt;
angeschlossen (Pin 2 am Mega8)&amp;lt;br&amp;gt;&lt;br /&gt;
Mit diesem Befehl, kann man das LCD auch an andere Pins vom AVR anschließen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Config Lcdbus = 4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Definiert den 4-Bit Modus für das LCD.&lt;br /&gt;
Beim 8-Bit Modus, müsste man statt der 4 eine 8 schreiben.&lt;br /&gt;
Der AVR weis dann, wie viele Datenleitungen angeschlossen wurden und wie er den Datentransfer zu dem LCD durchführen muss.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Cls&lt;br /&gt;
Locate 1 , 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cls löscht das LCD-Display und Locate 1,1 definiert die nächste Ausgabe mit 1.) Zeile, 1.)Position&amp;lt;br&amp;gt;&lt;br /&gt;
(Locate 2,10 wäre dann ausgabe in Zeile 2 und an zehnter Position )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lcd &amp;quot;Hallo Welt&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Mit LCD kann man nun den Text ausgeben. :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Autor==&lt;br /&gt;
*  [[Benutzer:Roberto|Roberto]]&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
* [http://www.sprut.de/electronic/lcd/index.htm#einleitung Sprut]&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Avr]]&lt;br /&gt;
* [[Bascom]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Quellcode Bascom]]&lt;/div&gt;</summary>
		<author><name>Darth Ding</name></author>	</entry>

	</feed>