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

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6v2_USB-RS232-Adapter&amp;diff=21158</id>
		<title>RP6v2 USB-RS232-Adapter</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6v2_USB-RS232-Adapter&amp;diff=21158"/>
				<updated>2012-09-27T16:23:29Z</updated>
		
		<summary type="html">&lt;p&gt;Filou89: /* Software und USB-Treiber */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=RP6v2 USB-RS232-Adapter: Hardware=&lt;br /&gt;
&lt;br /&gt;
In diesem Projekt soll eine &amp;quot;Exp&amp;quot; ([[RP6#Experimentierplatine]], CONRAD [http://www.conrad.de/ce/de/product/191537/RP6-EXPERIMENTIERPLATINE 191537]) für den [[RP6v2]] (natürlich auch für den [[RP6]]) &amp;quot;gebaut&amp;quot; werden, mit der ein (bei mir) ständig auftretendes &amp;quot;Problem&amp;quot; behoben wird:&lt;br /&gt;
&lt;br /&gt;
Ich brauche eine Verbindung vom Microcontroller (µC) zu einer RS232-Schnittstelle oder zum USB-Port eines PCs. Natürlich gibt es schon das mitgelieferte USB Interface des RP6v2 und neuerdings auch das [http://www.conrad.de/ce/de/product/191638/Arexx-RP6-USB-Interface-RP6V2-TRANS RP6V2-TRANS] bei CONRAD, das anstelle des mitgelieferten Exemplars verwendet werden kann. Die [[RP6v2#RP6v2_M256_WiFi_Platine]] hat aber z.B. noch zwei freie USARTs, die ich gern eigenständig und unabhängig von der seriellen Verbindung zum RobotLoader verwenden will.&lt;br /&gt;
&lt;br /&gt;
Da hilft nur ein eigener USB-UART-Umsetzer. Ich habe mich für dieses Projekt entschieden für den [http://www.elv.de/mini-usb-modul-um2102-komplettbausatz.html UM2102] von ELV. Die Platine ist preisgünstig, super-kompakt und nutzt den CP2102, der kaum Außenbeschaltung braucht. Treiber gibt es für Windows, Mac, WinCE, Linux und für den Direktzugriff auf den CP2102.&lt;br /&gt;
&lt;br /&gt;
Das Projekt soll aber auch noch einen RS232-Pegelwandler vorsehen. Auch das ist (noch) ein typisches Problem (zumindest bei mir, weil ich noch einen PC mit RS232-Schnittstelle habe). Man könnte die kleine Schaltung auch mit einem MAX232N direkt auf der Exp aufbauen, ich habe mich aber aus Platzgründen für den [http://www.pollin.de/shop/dt/MzY5OTgxOTk-/Bausaetze_Module/Bausaetze/RS232_TTL_Wandler_Bausatz.html RS232-TTL-Wandler-Bausatz] von Pollin entschieden. Das ist zwar eine relativ große Platine, die man aber huckepack gut auf der Exp montieren kann.&lt;br /&gt;
&lt;br /&gt;
'''Für die Teile, die man für das ganze Projekt braucht, werden Bestell-Nummern vom [http://www.conrad.de/ce/ großen C] angegeben. Natürlich gibt es auch andere Versender, bei denen es evtl. günstiger wird.'''&lt;br /&gt;
&lt;br /&gt;
Was braucht man allgemein für den Aufbau einer Schaltung auf der Exp:&lt;br /&gt;
* Seitenschneider, Schere, Zange&lt;br /&gt;
* Lötkolben 25..30 Watt, Lötzinn&lt;br /&gt;
* Plastik 70 Schutzlack (CONRAD 813621)&lt;br /&gt;
* Isolierter Schaltdraht YV 0,20 mm² (CONRAD 606065)&lt;br /&gt;
* Versilberter CU-Draht 0,6 mm (CONRAD 605581)&lt;br /&gt;
&lt;br /&gt;
Mit dem versilberten CU-Draht stellt man auf der Unterseite (= Lötseite) der Exp Verbindungen zwischen den Bauteilen her; mit dem isolierten Schaltdraht werden Drahtbrücken auf der Oberseite (= Bestückungsseite) der Exp eingesetzt. Die Lage der Verbindungen zeige ich im Bestückungsplan. Man muss sich nicht an die genaue Lage der Verbindungen halten.&lt;br /&gt;
&lt;br /&gt;
'''Wenn man die Drähte und Bauteile an anderen Positionen einlötet, kann es aber sein, dass man die weitere Schaltung nicht mehr so aufbauen kann, wie ich das hier zeige! Möglicherweise sind die weiteren Teile dann nur noch mit einer &amp;quot;wilden&amp;quot; Freiverdrahtung machbar!'''&lt;br /&gt;
&lt;br /&gt;
==Aufbau==&lt;br /&gt;
Man braucht folgende Bauteile (Bestell-Nummern [http://www.conrad.de/ce/ CONRAD]):&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Anzahl || Bestell-Nr. || Bauteil-Bezeichnung:&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 191537 || RP6 Experimentierplatine&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.elv.de/ ELV] || Mini-USB-UART-Umsetzer UM2102&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.pollin.de/shop/index.html Pollin] || RS232-TTL-Wandler-Bausatz&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 168274 || Schottky-Diode 1N5817&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 736950 || Wannenstecker gewinkelt, 2 x 5-polig&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 741119 || 1-reihige Stiftleiste RM 2,54 mm (36-polig)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 742902 || Zehn Codierbrücken (aus Set)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 526630 || M3-Abstandbolzen 10 mm&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 815624 || Vier Muttern M3 (aus Set)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 815322 || Vier Schrauben M3 (aus Set)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Hier erst einmal der Schaltplan:&lt;br /&gt;
&lt;br /&gt;
[[bild:RP6_RS232_USB_SP.JPG]] &lt;br /&gt;
&lt;br /&gt;
Und dann der Bestückungsplan:&lt;br /&gt;
&lt;br /&gt;
[[bild:RP6_RS232_USB.JPG]] &lt;br /&gt;
&lt;br /&gt;
Ich habe die Drahtbrücken aus isoliertem Schaltdraht (es sind 33) rot eingezeichnet. Sie werden auf der '''Oberseite''' der Experimentierplatine bestückt!&lt;br /&gt;
&lt;br /&gt;
Zunächst wird der RS232-TTL-Wandler-Bausatz nach Anleitung aufgebaut. Die drei 2-poligen Anschlussklemmen werden NICHT eingelötet.&lt;br /&gt;
In die Experimentierplatine werden 4 Löcher (mit 3,2 mm Durchmesser) an den im Bestückungsplan hellgrün gekennzeichneten Stellen gebohrt. Hier werden die vier M3-Abstandbolzen 10 mm mit Muttern M3 eingesetzt. Darauf wird später die RS232-TTL-Wandler-Platine montiert.&lt;br /&gt;
&lt;br /&gt;
Die UM2102-Platine wird vorbereitet, indem zwei 5-polige und eine 6-polige Stiftleiste RM 2,54 mm auf der Lötseite direkt anliegend eingelötet werden.&lt;br /&gt;
&lt;br /&gt;
Danach werden alle Leiterbahnen, Brücken, Stecker und Jumper hergestellt und zum Schluß die UM2102-Platine an ihren Platz gelötet. Auf der Lötseite der RS232-TTL-Wandler-Platine werden 6 kurze Stücke (~ 2 cm) isolierte Schaltlitze (z.B. CONRAD 605808 o.ä.) an die Punkte +5V, Masse, CTS, RTS, TXD, RXD angelötet. Anschließend werden diese 6 Litzen auf der Exp an den gekennzeichneten Stellen angelötet, und die RS232-TTL-Wandler-Platine wird auf den Abstandbolzen mit Schrauben M3 befestigt.&lt;br /&gt;
&lt;br /&gt;
Viel Erfolg beim Aufbau!&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;br /&gt;
Will man zunächst den '''Mini-USB-UART-Umsetzer''' grob testen, werden die Jumper auf JP1 bis JP4 in Stellung &amp;quot;U&amp;quot; aufgesteckt. Alle anderen Jumper bleiben offen. Dann schließt man ihn mit einem USB-A zu Mini-USB Adapterkabel an einen PC an. Die UM2102-Platine sollte z.B. in Windows 7 problemlos erkannt werden. Falls ein VCP-Treiber nicht gefunden wird bzw. ein anderes Betriebssystem verwendet wird, finden sich die notwendigen '''Treiber''' [http://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx hier]. Der Mini-USB-UART-Umsetzer dürfte in Ordnung sein, wenn er vom Betriebssystem erkannt wird. Die komplette Funktion läßt sich aber nur prüfen, wenn man die Übertragung vom Microcontroller zum PC und umgekehrt ausführlich testet.&lt;br /&gt;
Das kann man z.B. tun, indem man ST1 (UART_TTL) mit dem 10-poligen Flachkabel des RP6 USB Interface (oder des RP6V2-TRANS) mit dem PROG_UART Stecker der RP6v2Base, M32, M128 oder M256 WiFi verbindet.&lt;br /&gt;
 '''ACHTUNG:''' Kein anderes (1:1) Flachkabel verwenden!!!&lt;br /&gt;
Die seriellen Ausgaben jedes beliebigen µC-Programms müßten dann auf einem '''Terminal-Programm''' (siehe auch [[RP6_-_Programmierung#Geeignete_Terminals]]!) auf dem PC zu empfangen sein. Damit ist die UART-USB Übertragung (zumindest in EINE Richtung) erfolgreich getestet.&lt;br /&gt;
&lt;br /&gt;
Genau so kann man den '''RS232-TTL-Wandler''' testen: JP1 bis JP4 von Stellung &amp;quot;U&amp;quot; umstecken in die andere (rechte) Stellung. JP5 aufstecken. Alle anderen Jumper bleiben offen. Der RS232-TTL-Wandler wird mit einem 1:1 Sub-D Kabel (9-polig, Stecker-Buchse) mit der RS232-Schnittstelle des PCs verbunden. Wie oben beschrieben wird ST1 (UART_TTL) mit dem Flachkabel des RP6 USB Interface mit dem PROG_UART Stecker der RP6v2Base, M32, M128 oder M256 WiFi verbunden. Auch hier sollte die serielle Verbindung zwischen dem Microcontroller und dem PC-Terminal-Programm in beiden Richtungen möglich sein.&lt;br /&gt;
&lt;br /&gt;
==Letzte Arbeiten==&lt;br /&gt;
&lt;br /&gt;
Was bleibt noch?&lt;br /&gt;
* Wenn die Platine komplett aufgebaut ist, kann man sie mit Plastik 70 Spray auf der Lötseite gegen Korrosion schützen&lt;br /&gt;
* Sich Anwendungen überlegen&lt;br /&gt;
* Anwendungen programmieren&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
==Allgemeine Daten und Tabellen==&lt;br /&gt;
&lt;br /&gt;
===Stecker===&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Stecker || Pins || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| ST1 || 10 || UART_TTL Wannenstecker (RX, TX, RTS, +5V *, GND)&lt;br /&gt;
|-&lt;br /&gt;
| ST2 || 4 || Suspend, RI, DTR, DSR an ST1&lt;br /&gt;
|-&lt;br /&gt;
| ST3 || 4 || TX, RX, RTS, CTS von UM2102 ODER RS232-TTL **&lt;br /&gt;
|-&lt;br /&gt;
| ST4 || 5 || Suspend, RI, DTR, DCD, DSR von UM2102&lt;br /&gt;
|-&lt;br /&gt;
| ST5 || 2 || 3,3 V, GND von UM2102&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Zu *)'''  Falls JP7 = ON!&lt;br /&gt;
&lt;br /&gt;
'''Zu **)''' Abhängig von JP1..JP4!&lt;br /&gt;
&lt;br /&gt;
====ST1 (UART_TTL)====&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Pin || Funktion || E/A || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || VDD || || +5 V&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || || Masse&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Suspend || A || Suspend (= ST2: 1)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || n.c. || ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || RI || E || Ring Indicator (= ST2: 2)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DSR || E || Data Set Ready (= ST2: 4)&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DTR || A || Data Terminal Ready (= ST2: 3)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || RX || E || Receive Data (= ST3: 2)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || TX || A || Transmit Data (= ST3: 1)&lt;br /&gt;
|-&lt;br /&gt;
| 10 || RTS || A || Request to Send (= ST3: 3)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Belegung dieses Steckers entspricht dem Stecker PROG des RP6 USB Interface und des RP6V2-TRANS. Das bedeutet, dass das 10-polige Flachkabel, das mit den beiden RP6 USB Interfaces mitgeliefert wird, auch für die Verbindung zwischen diesem Stecker UART_TTL und dem Wannenstecker PROG_UART des RP6-Systems (Base, M32, M128, M256 WiFi) verwendet werden kann.&lt;br /&gt;
 Will man ein eigenes Flachkabel für diese Verbindung herstellen,&lt;br /&gt;
 ist zu beachten, dass das Flachkabel '''gedreht''' (aus Pin 1 wird 10,&lt;br /&gt;
 aus Pin 2 wird 9, usw.) einzubauen ist!&lt;br /&gt;
Die Signale Suspend, RI, DSR und DTR werden zur Verbindung mit dem RP6-System nicht benötigt.&lt;br /&gt;
&lt;br /&gt;
====ST2====&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Pin || Funktion || E/A || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Suspend || A || = ST1: 3&lt;br /&gt;
|-&lt;br /&gt;
| 2 || RI || E || = ST1: 5&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DTR || A || = ST1: 7&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DSR || E || = ST1: 6&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====ST3====&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Pin || Funktion || E/A || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TX || A || Transmit Data (= ST1: 9)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || RX || E || Receive Data (= ST1: 8)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || RTS || A || Request to Send (= ST1: 10)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || CTS || E || Clear to Send&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
An diesem Stecker ST3 sind alle Signale vorhanden, die für die Kommunikation zwischen einem µC des RP6-Systems und einem USB-Port bzw. einer RS232-Schnittstelle relevant sind. Von diesem Stecker können die Schnittstellen-Signale (in der Regel werden nur TX, RX benötigt!) direkt zum UART auf einer der Platinen des RP6-Systems geführt werden.&lt;br /&gt;
&lt;br /&gt;
 '''ACHTUNG:'''&lt;br /&gt;
 ==&amp;gt; RX und TX kreuzen (d.h. µC:RX an ST3:TX und µC:TX an ST3:RX)!!!&lt;br /&gt;
 ==&amp;gt; TX und RTS dürfen nur mit µC-Eingängen verbunden werden!!!&lt;br /&gt;
&lt;br /&gt;
====ST4====&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Pin || Funktion || E/A || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Suspend || A || Suspend (von UM2102)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || RI || E || Ring Indicator (von UM2102)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DTR || A || Data Terminal Ready (von UM2102)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DCD || E || Data Carrier Detect (von UM2102)&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DSR || E || Data Set Ready (von UM2102)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
An diesem Stecker ST4 liegen Signale der seriellen Schnittstelle vom UM2102, die normalerweise nicht benötigt werden. Wenn Suspend, RI, DTR, DSR an ST1 (UART_TTL) genutzt werden sollen, kann man eine Drahtverbindung der Pins 1..3 und 5 dieses Steckers zu ST2 herstellen.&lt;br /&gt;
&lt;br /&gt;
====ST5====&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Pin || Funktion || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || + 3,3 V || 3,3 V / max. 100 mA (von UM2102)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || Masse&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
An diesem Stecker ST5 kann man eine Spannung von 3,3 V abnehmen, die vom UM2102 zur Verfügung gestellt wird. Der Ausgang darf maximal mit 100 mA belastet werden.&lt;br /&gt;
&lt;br /&gt;
====USRBUS====&lt;br /&gt;
&lt;br /&gt;
Der USRBUS stellt 14 Verbindungen zwischen den µC-Platinen (RP6Base, M32 und M128) und Experimentierplatinen, die man selbst gebaut hat, zur Verfügung. Die 14 Pins können frei belegt werden.&lt;br /&gt;
&lt;br /&gt;
Eine mögliche Belegung habe ich [http://www.roboternetz.de/community/threads/29281-RP6-USRBUS hier] vorgeschlagen.&lt;br /&gt;
Wenn man diesem Vorschlag folgt, ist RX des µCs an Y6, TX an Y8 und RST an Y10 des USRBUS zu finden. Natürlich muss man dann auf der jeweiligen µC-Platine oder Exp eine Verbindung der USRBUS-Pins (Y6, Y8) zum UART herstellen.&lt;br /&gt;
&lt;br /&gt;
Auf dieser Exp muss man JP8..10 schließen, wenn man den USRBUS auf diese Weise nutzen will.&lt;br /&gt;
&lt;br /&gt;
====UARTs====&lt;br /&gt;
&lt;br /&gt;
Im RP6-System sind die Hardware-UARTs an folgenden Steckern/Pins zu finden:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Platine || UART || RX || TX || RX an Stecker || TX an Stecker&lt;br /&gt;
|-&lt;br /&gt;
| RP6v2Base || 0 || PD0 || PD1 || PROGU: 2 * || PROGU: 3 *&lt;br /&gt;
|-&lt;br /&gt;
| RP6 CONTROL M32 || 0 || PD0 || PD1 || PROGU: 2  **|| PROGU: 3 **&lt;br /&gt;
|-&lt;br /&gt;
| RP6 CCPRO M128 || 0 || PE0 || PE1 || PROGU: 2 || PROGU: 3&lt;br /&gt;
|-&lt;br /&gt;
| || 1 || PD2 || PD3 || I/O: 8 || I/O: 7&lt;br /&gt;
|-&lt;br /&gt;
| RP6v2 M256 WIFI || 0 || PE0 || PE1 || PROGU: 2 || PROGU: 3&lt;br /&gt;
|-&lt;br /&gt;
| || 1 || PD2 || PD3 || USPI15: 8 || USPI15: 6&lt;br /&gt;
|-&lt;br /&gt;
| || 2 || PH0 || PH1 || USPI24: 8 || USPI24: 6&lt;br /&gt;
|-&lt;br /&gt;
| || 3 || PJ0 || PJ1 || n.c. ***|| n.c. ***&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Zu *)''' Kann man auch am Stecker &amp;quot;[[RP6#Serielle_Schnittstelle]]&amp;quot; auf dem RP6 Mainboard anschliessen!&lt;br /&gt;
&lt;br /&gt;
'''Zu **)''' Kann man auch am Stecker &amp;quot;[[RP6#Serielle_Schnittstelle_2]]&amp;quot; auf der M32 Platine anschliessen!&lt;br /&gt;
&lt;br /&gt;
'''Zu ***)''' Fest verbunden mit dem WLAN Modul, daher nicht nutzbar! &lt;br /&gt;
&lt;br /&gt;
 '''Stecker-Kürzel:'''&lt;br /&gt;
 PROGU   PROG_UART&lt;br /&gt;
 USPI15  UART_SPI1/T5&lt;br /&gt;
 USPI24  UART_SPI2/T4&lt;br /&gt;
&lt;br /&gt;
===Jumper===&lt;br /&gt;
&lt;br /&gt;
Zeichenerklärung:&lt;br /&gt;
* Zweipolige Jumper:&lt;br /&gt;
** Stellung ON = Jumper aufgesteckt (Kontakt geschlossen) &lt;br /&gt;
** Stellung OFF = Jumper abgezogen (Kontakt offen) &lt;br /&gt;
* Dreipolige Jumper:&lt;br /&gt;
** Stellung U = Jumper links * aufgesteckt&lt;br /&gt;
** Stellung R = Jumper rechts * aufgesteckt&lt;br /&gt;
&lt;br /&gt;
'''Zu *)''' Platine so gesehen, wie im Bestückungsplan!&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Jumper || Stellung || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| JP1 || U (S) || TX von USB&lt;br /&gt;
|-&lt;br /&gt;
| JP1 || R || TX von RS232&lt;br /&gt;
|-&lt;br /&gt;
| JP2 || U (S) || RX von USB&lt;br /&gt;
|-&lt;br /&gt;
| JP2 || R || RX von RS232&lt;br /&gt;
|-&lt;br /&gt;
| JP3 || U (S) || CTS von USB&lt;br /&gt;
|-&lt;br /&gt;
| JP3 || R || CTS von RS232&lt;br /&gt;
|-&lt;br /&gt;
| JP4 || U (S) || RTS von USB&lt;br /&gt;
|-&lt;br /&gt;
| JP4 || R || RTS von RS232&lt;br /&gt;
|-&lt;br /&gt;
| JP5 || ON || RS232-TTL-Wandler Power ON&lt;br /&gt;
|-&lt;br /&gt;
| JP5 || OFF (S) || RS232-TTL-Wandler Power OFF&lt;br /&gt;
|-&lt;br /&gt;
| JP6 || ON || Power für UM2102 auch von UART_TTL Stecker (Pin 1)&lt;br /&gt;
|-&lt;br /&gt;
| JP6 || OFF (S) || Power für UM2102 nur vom PC über USB-Stecker&lt;br /&gt;
|-&lt;br /&gt;
| JP7 || ON || +5 V Verbindung zwischen XBUS: VDD und UART_TTL Stecker (Pin 1)&lt;br /&gt;
|-&lt;br /&gt;
| JP7 || OFF (S) || Keine +5 V Verbindung zwischen XBUS und UART_TTL Stecker&lt;br /&gt;
|-&lt;br /&gt;
| JP8 || ON || TX an USRBUS RX (Pin Y6)&lt;br /&gt;
|-&lt;br /&gt;
| JP8 || OFF (S) || TX nicht an USRBUS&lt;br /&gt;
|-&lt;br /&gt;
| JP9 || ON || RTS an USRBUS RST (Pin Y10)&lt;br /&gt;
|-&lt;br /&gt;
| JP9 || OFF (S) || RTS nicht an USRBUS&lt;br /&gt;
|-&lt;br /&gt;
| JP10 || ON || RX an USRBUS TX (Pin Y8)&lt;br /&gt;
|-&lt;br /&gt;
| JP10 || OFF (S) || RX nicht an USRBUS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Zu (S)''' Standard-Stellung der Jumper ('''USB-UART-Betrieb über UART_TTL Stecker''')!&lt;br /&gt;
&lt;br /&gt;
 '''Hinweis:''' JP1 bis JP4 IMMER in dieselbe Stellung (U oder R) bringen!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=RP6v2 USB-RS232-Adapter: Software=&lt;br /&gt;
&lt;br /&gt;
Nutzt man die UARTs, die am PROG_UART Stecker der RP6Base, M32, M128 oder M256 WiFi liegen, mit dieser Adapter-Platine (siehe Tabelle [[RP6v2_USB-RS232-Adapter#UARTs]]!), kann man zum seriellen Lesen und Schreiben von Daten die Funktionen der vorhandenen UART-Libraries verwenden.&lt;br /&gt;
&lt;br /&gt;
Befehle für den Zugriff auf UART1 der RP6 CCPRO M128 sind in CompactC und BASIC des C-Control-Pro Systems enthalten (siehe Kapitel 6.19 RS232 der C-Control-Pro Anleitung!). Der Parameter ''serport'' der seriellen Funktionen muss auf 1 gesetzt werden, um den UART1 anzusprechen.&lt;br /&gt;
&lt;br /&gt;
Es bleibt die Frage, wie man mit den vertrauten Funktionen der RP6M256-UART-Library auf UART1 und UART2 der M256 WiFi zugreifen kann.&lt;br /&gt;
&lt;br /&gt;
Das ist recht einfach möglich, indem man die RP6M256uart Library anpasst.&lt;br /&gt;
&lt;br /&gt;
==RP6M256uart1 Library==&lt;br /&gt;
&lt;br /&gt;
Hier z.B. die Anpassung der RP6M256uart Library an '''UART1''':&lt;br /&gt;
&lt;br /&gt;
Datei RP6M256uart1.h:&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ------------------- [c]2011 / 2012 - AREXX ENGINEERING ---------------------&lt;br /&gt;
 * -------------------------- http://www.arexx.com/ ---------------------------&lt;br /&gt;
 * --------------------------- All rights reserved ----------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256uart1.h&lt;br /&gt;
 * Version: 1.1 - 24.02.2012&lt;br /&gt;
 * Target: RP6 CONTROL M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dominik S. Herwald&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * The M256 uart1 function Library header file. Detailled description&lt;br /&gt;
 * of each function can be found in the RP6M256uart1.c file!&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * CHANGELOG AND LICENSING INFORMATION CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6UART1_H&lt;br /&gt;
#define RP6UART1_H&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt; 	// Program memory (=Flash ROM) access routines.&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;			// C standard functions (e.g. itoa...)&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;			// I/O Port definitions&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;	// Interrupt macros (e.g. cli(), sei())&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// UART1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// TX:&lt;br /&gt;
&lt;br /&gt;
void writeChar1(char ch);&lt;br /&gt;
void writeStringLength1(char *data, uint8_t length, uint8_t offset);&lt;br /&gt;
void writeString1(char *data);&lt;br /&gt;
void writeNStringP1(const char *pstring);&lt;br /&gt;
#define writeString_P1(__pstr) writeNStringP1((PSTR(__pstr)))&lt;br /&gt;
&lt;br /&gt;
#define HEX 16&lt;br /&gt;
#define DEC 10&lt;br /&gt;
#define OCT 8&lt;br /&gt;
#define BIN 2&lt;br /&gt;
void writeInteger1(int16_t number, uint8_t base);&lt;br /&gt;
void write32BitInteger1(int32_t number, uint8_t base);&lt;br /&gt;
void writeIntegerLength1(int16_t number, uint8_t base, uint8_t length);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// RX:&lt;br /&gt;
extern volatile uint8_t uart1_status;&lt;br /&gt;
&lt;br /&gt;
#define UART1_RECEIVE_BUFFER_SIZE 500&lt;br /&gt;
#define UART1_BUFFER_OK 0&lt;br /&gt;
#define UART1_BUFFER_OVERFLOW 1&lt;br /&gt;
&lt;br /&gt;
char readChar1(void);&lt;br /&gt;
uint16_t readChars1(char *buf, uint16_t numberOfChars);&lt;br /&gt;
uint16_t getBufferLength1(void);&lt;br /&gt;
void clearReceptionBuffer1(void);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256uart1.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Bugs, feedback, questions and modifications can be posted on the AREXX Forum&lt;br /&gt;
 * on http://www.arexx.com/forum/ !&lt;br /&gt;
 * Of course you can also write us an e-mail to: info@arexx.nl&lt;br /&gt;
 * AREXX Engineering may publish updates from time to time on AREXX.com!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * - LICENSE -&lt;br /&gt;
 * GNU GPL v2 (http://www.gnu.org/licenses/gpl.txt, a local copy can be found&lt;br /&gt;
 * on the RP6 CD in the RP6 sorce code folders!)&lt;br /&gt;
 * This program is free software. You can redistribute it and/or modify&lt;br /&gt;
 * it under the terms of the GNU General Public License version 2 as published&lt;br /&gt;
 * by the Free Software Foundation.&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei RP6M256uart1.c:&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ------------------- [c]2011 / 2012 - AREXX ENGINEERING ---------------------&lt;br /&gt;
 * -------------------------- http://www.arexx.com/ ---------------------------&lt;br /&gt;
 * --------------------------- All rights reserved ----------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256uart1.c&lt;br /&gt;
 * Version: 1.1 - 16.07.2012&lt;br /&gt;
 * Target: RP6 CONTROL M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dominik S. Herwald&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 *&lt;br /&gt;
 * The M256 UART1 Library. (UART = &amp;quot;Universal Aynchronous Receiver Transceiver&amp;quot;)&lt;br /&gt;
 *&lt;br /&gt;
 * It contains data transfer functions for the UART (1). &lt;br /&gt;
 * Reception is Interrupt based with a circular buffer.&lt;br /&gt;
 *&lt;br /&gt;
 * --------&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You should better leave all this as it is if you just started with&lt;br /&gt;
 * C programming, but it is a good idea to read the comments and review the&lt;br /&gt;
 * code, it will help you to understand C programming for AVR better.&lt;br /&gt;
 *&lt;br /&gt;
 * Of course you are free to add new functions and improvements to this&lt;br /&gt;
 * library and make them available to the public on the Internet.&lt;br /&gt;
 * Please use the changelog at the end of this file to document your&lt;br /&gt;
 * changes. And add your name (or nickname) to any new function or &lt;br /&gt;
 * modification you added! E.g. a &amp;quot;modified by &amp;lt;nickname&amp;gt; at &amp;lt;date&amp;gt;&amp;quot; is &lt;br /&gt;
 * always a good idea to show other users where and what you changed the &lt;br /&gt;
 * source code!&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * CHANGELOG AND LICENSING INFORMATION CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256uart1.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// UART1 transmit functions:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a single character to the UART1.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			writeChar1('R');&lt;br /&gt;
 *			writeChar1('P');&lt;br /&gt;
 *			writeChar1('6');&lt;br /&gt;
 *			writeChar1('\n');&lt;br /&gt;
 *			// '\n' is a special code for the &amp;quot;new line&amp;quot; character!&lt;br /&gt;
 *			writeChar1('0');&lt;br /&gt;
 *			writeChar1(48); // 48 is ASCII code for '0'&lt;br /&gt;
 *			writeChar1(49); // 1&lt;br /&gt;
 *			writeChar1(50); // 2&lt;br /&gt;
 *			writeChar1(51); // 3&lt;br /&gt;
 *			//...&lt;br /&gt;
 *&lt;br /&gt;
 *			would output:&lt;br /&gt;
 *			RP6&lt;br /&gt;
 *			00123&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void writeChar1(char ch)&lt;br /&gt;
{&lt;br /&gt;
    while (!(UCSR1A &amp;amp; (1&amp;lt;&amp;lt;UDRE1)));&lt;br /&gt;
    UDR1 = (uint8_t)ch;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a null terminated string or buffer from SRAM to UART1.&lt;br /&gt;
 * Make sure that it really IS null terminated!&lt;br /&gt;
 * (&amp;quot;null terminated&amp;quot; means that the string has a null (=0) at the end.&lt;br /&gt;
 * this is automatically added to it by the compiler when you put the&lt;br /&gt;
 * string in double quotes like this: writeString1(&amp;quot;test&amp;quot;);  )&lt;br /&gt;
 *&lt;br /&gt;
 * ATTENTION: This fills up SRAM Memory with the&lt;br /&gt;
 * strings, even if they are constant and never changed.&lt;br /&gt;
 * If you want to write constant text strings to the UART1, better use&lt;br /&gt;
 * writeNStringP1(const uint8_t *pstring) (s. below), which reads the&lt;br /&gt;
 * text from flash program memory and does not fill up the SRAM with&lt;br /&gt;
 * the string data!&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			writeString1(&amp;quot;RP6 Robot System\n&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void writeString1(char *string)&lt;br /&gt;
{&lt;br /&gt;
	while(*string)&lt;br /&gt;
		writeChar1(*string++);&lt;br /&gt;
}&lt;br /&gt;
		&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a null terminated string from flash program memory to UART1.&lt;br /&gt;
 * You can use the macro writeString_P1(STRING); , this macro&lt;br /&gt;
 * ensures that the String is stored in program memory only!&lt;br /&gt;
 * Otherwise you need to use PSTR(&amp;quot;your string&amp;quot;) from AVRLibC for this. &lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			writeNStringP1(PSTR(&amp;quot;RP6 Robot System\n&amp;quot;));&lt;br /&gt;
 *&lt;br /&gt;
 *			// There is also a Macro that makes life easier and&lt;br /&gt;
 *			// you can simply write:&lt;br /&gt;
 *			writeString_P1(&amp;quot;RP6 Robot System\n&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void writeNStringP1(const char *pstring)&lt;br /&gt;
{&lt;br /&gt;
    uint8_t c;&lt;br /&gt;
    for (;(c = pgm_read_byte_near(pstring++));writeChar1(c));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a string with specified length and offset from SRAM to UART1.&lt;br /&gt;
 * If it is a null terminated string, output will be stopped at the&lt;br /&gt;
 * end! It does not need to be null terminated, but it is recommended&lt;br /&gt;
 * to use only null terminated strings/buffers, otherwise the function could&lt;br /&gt;
 * output any SRAM memory data stored after the string until it reaches a 0&lt;br /&gt;
 * or the specified length.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			writeStringLength1(&amp;quot;RP6 Robot Sytem\n&amp;quot;,16,0);&lt;br /&gt;
 *			// would output: &amp;quot;RP6 Robot Sytem\n&amp;quot;&lt;br /&gt;
 *			writeStringLength1(&amp;quot;RP6 Robot Sytem\n&amp;quot;,11,4);&lt;br /&gt;
 *			// would output: &amp;quot;Robot System&amp;quot;&lt;br /&gt;
 * 			writeStringLength1(&amp;quot;RP6 Robot Sytem\n&amp;quot;,40,4);&lt;br /&gt;
 *			// would output: &amp;quot;Robot System\n&amp;quot;&lt;br /&gt;
 *			// No matter if the specified length is 40 characters!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void writeStringLength1(char *string, uint8_t length, uint8_t offset)&lt;br /&gt;
{&lt;br /&gt;
	for(string = &amp;amp;string[offset]; *string &amp;amp;&amp;amp; length; length--)&lt;br /&gt;
		writeChar1(*string++);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a number (with specified base) to the UART1.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a hexadecimal number to the UART1:&lt;br /&gt;
 *			writeInteger1(0xAACC,16);&lt;br /&gt;
 *			// Instead of 16 you can also write &amp;quot;HEX&amp;quot; as this is defined in the&lt;br /&gt;
 *			// RP6M256uart1.h :&lt;br /&gt;
 *			writeInteger1(0xAACC, HEX);&lt;br /&gt;
 *			// Other Formats:&lt;br /&gt;
 *			writeInteger1(1024,DEC);  	// Decimal&lt;br /&gt;
 *			writeInteger1(044,OCT);		// Ocal&lt;br /&gt;
 *			writeInteger1(0b11010111,BIN); // Binary&lt;br /&gt;
 */&lt;br /&gt;
void writeInteger1(int16_t number, uint8_t base)&lt;br /&gt;
{&lt;br /&gt;
	char buffer[17];&lt;br /&gt;
	itoa(number, &amp;amp;buffer[0], base);&lt;br /&gt;
	writeString1(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a 32 Bit number (with specified base) to the UART1.&lt;br /&gt;
 * Usage is the same as writeInteger1.&lt;br /&gt;
 */&lt;br /&gt;
void write32BitInteger1(int32_t number, uint8_t base)&lt;br /&gt;
{&lt;br /&gt;
	char buffer[33];&lt;br /&gt;
	ltoa(number, &amp;amp;buffer[0], base);&lt;br /&gt;
	writeString1(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Same as writeInteger1, but with defined length.&lt;br /&gt;
 * This means this routine will add leading zeros to the number if length is&lt;br /&gt;
 * larger than the actual value or cut the upper digits if length is smaller&lt;br /&gt;
 * than the actual value.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a hexadecimal number to the UART1:&lt;br /&gt;
 *			writeIntegerLength1(0xAACC, 16, 8);&lt;br /&gt;
 *			// Instead of 16 you can also write &amp;quot;HEX&amp;quot; as this is defined in the&lt;br /&gt;
 *			// RP6M256uart1.h :&lt;br /&gt;
 *			writeIntegerLength1(0xAACC, HEX, 8);&lt;br /&gt;
 *			// Other Formats:&lt;br /&gt;
 *			writeIntegerLength1(1024,DEC,6);  	// Decimal&lt;br /&gt;
 *			writeIntegerLength1(044,OCT,4);		// Ocal&lt;br /&gt;
 *			writeIntegerLength1(0b11010111,BIN,8); // Binary&lt;br /&gt;
 */&lt;br /&gt;
void writeIntegerLength1(int16_t number, uint8_t base, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	char buffer[17];&lt;br /&gt;
	itoa(number, &amp;amp;buffer[0], base);&lt;br /&gt;
	int8_t cnt = length - strlen(buffer);&lt;br /&gt;
	if(cnt &amp;gt; 0) {&lt;br /&gt;
		for(; cnt &amp;gt; 0; cnt--, writeChar1('0'));&lt;br /&gt;
		writeString1(&amp;amp;buffer[0]);&lt;br /&gt;
	}&lt;br /&gt;
	else &lt;br /&gt;
		writeStringLength1(&amp;amp;buffer[0],length,-cnt);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// UART1 receive functions:&lt;br /&gt;
&lt;br /&gt;
volatile char uart1_receive_buffer[UART1_RECEIVE_BUFFER_SIZE+1];&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t uart1_status;&lt;br /&gt;
&lt;br /&gt;
uint16_t read_pos1 = 0;&lt;br /&gt;
uint16_t write_pos1 = 0; &lt;br /&gt;
uint16_t read_size1 = 0;&lt;br /&gt;
uint16_t write_size1 = 0;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * UART1 receive ISR.&lt;br /&gt;
 * Handles reception to circular buffer.&lt;br /&gt;
 */&lt;br /&gt;
ISR(USART1_RX_vect)&lt;br /&gt;
{	&lt;br /&gt;
	static volatile uint8_t dummy;&lt;br /&gt;
	if(((uint16_t)(write_size1 - read_size1)) &amp;lt; UART1_RECEIVE_BUFFER_SIZE) {&lt;br /&gt;
		uart1_receive_buffer[write_pos1++] = UDR1;&lt;br /&gt;
		write_size1++;&lt;br /&gt;
		if(write_pos1 &amp;gt; UART1_RECEIVE_BUFFER_SIZE) &lt;br /&gt;
			write_pos1 = 0;&lt;br /&gt;
		uart1_status = UART1_BUFFER_OK;&lt;br /&gt;
	}&lt;br /&gt;
	else {	&lt;br /&gt;
		dummy = UDR1;&lt;br /&gt;
		uart1_status = UART1_BUFFER_OVERFLOW;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Read a char from the circular buffer. &lt;br /&gt;
 * The char is removed from the buffer (or more precise: not accessible directly anymore&lt;br /&gt;
 * and will be overwritten as soon as new data becomes available)!&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 * // [...]&lt;br /&gt;
 * if(getBufferLength1()) 		&lt;br /&gt;
 *	   receivedData[data_position++] = readChar1();&lt;br /&gt;
 * // [...]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
char readChar1(void)&lt;br /&gt;
{&lt;br /&gt;
	uart1_status = UART1_BUFFER_OK;&lt;br /&gt;
	if(((uint16_t)(write_size1 - read_size1)) &amp;gt; 0) {&lt;br /&gt;
		read_size1++;&lt;br /&gt;
		if(read_pos1 &amp;gt; UART1_RECEIVE_BUFFER_SIZE) &lt;br /&gt;
			read_pos1 = 0;&lt;br /&gt;
		return uart1_receive_buffer[read_pos1++];&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Same as readChar1, but this function copies numberOfChars chars from the&lt;br /&gt;
 * circular buffer to buf. &lt;br /&gt;
 * It also returns the number of characters really copied to the buffer! &lt;br /&gt;
 * Just in case that there were fewer chars in the buffer...&lt;br /&gt;
 */&lt;br /&gt;
uint16_t readChars1(char *buf, uint16_t numberOfChars)&lt;br /&gt;
{&lt;br /&gt;
	uint16_t i = 0;&lt;br /&gt;
	uart1_status = UART1_BUFFER_OK;&lt;br /&gt;
	while(((uint16_t)(write_size1 - read_size1)) &amp;gt; 0 &amp;amp;&amp;amp; i &amp;lt; numberOfChars) {&lt;br /&gt;
		read_size1++;&lt;br /&gt;
		buf[i++] = uart1_receive_buffer[read_pos1++];&lt;br /&gt;
		if(read_pos1 &amp;gt; UART1_RECEIVE_BUFFER_SIZE) &lt;br /&gt;
			read_pos1 = 0;&lt;br /&gt;
	}&lt;br /&gt;
	return i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns the current number of elements in the buffer.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 * s. readChar1 function above!&lt;br /&gt;
 */&lt;br /&gt;
uint16_t getBufferLength1(void)&lt;br /&gt;
{&lt;br /&gt;
	return (((uint16_t)(write_size1 - read_size1)));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Clears the reception buffer - it disables UART1 Receive &lt;br /&gt;
 * interrupt for a short period of time. &lt;br /&gt;
 */&lt;br /&gt;
void clearReceptionBuffer1(void)&lt;br /&gt;
{&lt;br /&gt;
	static uint8_t dummy;&lt;br /&gt;
	UCSR1B &amp;amp;= ~(1 &amp;lt;&amp;lt; RXCIE1); // disable UART1 RX Interrupt&lt;br /&gt;
	dummy = UDR1;&lt;br /&gt;
	read_pos1 = 0;&lt;br /&gt;
	write_pos1 = 0; &lt;br /&gt;
	read_size1 = 0;&lt;br /&gt;
	write_size1 = 0;&lt;br /&gt;
	uart1_status = UART1_BUFFER_OK;&lt;br /&gt;
	UCSR1B |= (1 &amp;lt;&amp;lt; RXCIE1); // enable Interrupt again&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.1 16.07.2012 by Dominik S. Herwald&lt;br /&gt;
 * - v. 1.0 (initial release) 24.02.2012 by Dominik S. Herwald&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Bugs, feedback, questions and modifications can be posted on the AREXX Forum&lt;br /&gt;
 * on http://www.arexx.com/forum/ !&lt;br /&gt;
 * Of course you can also write us an e-mail to: info@arexx.nl&lt;br /&gt;
 * AREXX Engineering may publish updates from time to time on AREXX.com!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * - LICENSE -&lt;br /&gt;
 * GNU GPL v2 (http://www.gnu.org/licenses/gpl.txt, a local copy can be found&lt;br /&gt;
 * on the RP6 CD in the RP6 sorce code folders!)&lt;br /&gt;
 * This program is free software. You can redistribute it and/or modify&lt;br /&gt;
 * it under the terms of the GNU General Public License version 2 as published&lt;br /&gt;
 * by the Free Software Foundation.&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Für den Zugriff auf UART1 wurde allen Funktionsnamen eine &amp;quot;1&amp;quot; angehängt. Aus writeChar (UART0) wird also z.B. '''writeChar1''' (UART1). Für UART2 kann diese Library auf dieselbe Weise angepaßt werden. Die RP6M256uart1 Library kann wie die ursprüngliche Library in eigene Programme eingebunden werden,- natürlich auch ZUSÄTZLICH zur RP6M256uart Library.&lt;br /&gt;
&lt;br /&gt;
===Initialisierung===&lt;br /&gt;
&lt;br /&gt;
Wenn man die RP6M256uart Library auf den UART1 oder UART2 anpasst, muss man die Initialisierung des UARTs im eigenen Hauptprogramm durchführen.&lt;br /&gt;
&lt;br /&gt;
Für '''UART1''' kann das dann so aussehen:&lt;br /&gt;
&amp;lt;pre&amp;gt;	cli();			// Disable global interrupts.&lt;br /&gt;
&lt;br /&gt;
	// UART1:&lt;br /&gt;
	UBRR1H = UBRR_BAUD_LOW &amp;gt;&amp;gt; 8;	// Setup UART1: Baud is Low Speed&lt;br /&gt;
	UBRR1L = (uint8_t) UBRR_BAUD_LOW;&lt;br /&gt;
	UCSR1A = 0x00;&lt;br /&gt;
	UCSR1C = (0&amp;lt;&amp;lt;UMSEL10) | (0&amp;lt;&amp;lt;UMSEL11) | (1&amp;lt;&amp;lt;UCSZ11) | (1&amp;lt;&amp;lt;UCSZ10);&lt;br /&gt;
	UCSR1B = (1 &amp;lt;&amp;lt; TXEN1) | (1 &amp;lt;&amp;lt; RXEN1) | (1 &amp;lt;&amp;lt; RXCIE1);&lt;br /&gt;
&lt;br /&gt;
	clearReceptionBuffer1();&lt;br /&gt;
&lt;br /&gt;
	sei();			// Enable Global Interrupts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Software und USB-Treiber=&lt;br /&gt;
Der Hardwaretreiber wird von Windows eventuell nicht automatisch gefunden. Um das USB-Modul verwenden zu können, muss der Treiber manuell installiert werden.&lt;br /&gt;
Für Windows 7 wurde dieser [http://www.silabs.com/Support%20Documents/Software/CP210x_VCP_Win_XP_S2K3_Vista_7.exe Windows Treiber] von SiLabs getestet.&lt;br /&gt;
Treiber für andere Betriebssysteme können direkt bei ELV oder auch bei [http://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx SiLabs] gefunden werden.&lt;br /&gt;
&lt;br /&gt;
==Vorgehen USB-Treiber==&lt;br /&gt;
1. Treiber installieren, Verzeichnis merken&lt;br /&gt;
&lt;br /&gt;
2. USB-Modul anstecken&lt;br /&gt;
&lt;br /&gt;
3. Gerätemanager öffnen&lt;br /&gt;
&lt;br /&gt;
4. UM2102 wählen, Treibersoftware aktualisieren&lt;br /&gt;
&lt;br /&gt;
5. Auf dem Computer nach Treibersoftware suchen&lt;br /&gt;
&lt;br /&gt;
6. Installationsverzeichnis angeben, Unterordner einbeziehen&lt;br /&gt;
&lt;br /&gt;
==COM-Terminal==&lt;br /&gt;
Zum Auswerten der empfangenen Daten eignet sich eigentlich jedes COM-Terminal, z.B. [http://www.heise.de/download/hterm.html HTerm]. Es gilt lediglich zu beachten, dass die virtuelle Schnittstelle folgendermassen konfiguriert ist:&lt;br /&gt;
38400 Baud, 8Bit, 1Stop, Parity: None.&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
* [[RP6]]&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6 Kamera - Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2 I2C-Portexpander]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Universal_Serial_Bus USB]&lt;br /&gt;
* [http://de.wikipedia.org/wiki/RS-232 RS232]&lt;br /&gt;
* [[UART]]&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Transistor-Transistor-Logik TTL]&lt;br /&gt;
* [http://www.silabs.com/Support%20Documents/TechnicalDocs/cp2102.pdf CP2102 Datasheet]&lt;br /&gt;
* [http://www.ti.com/lit/ds/symlink/max232.pdf MAX232N Datasheet]&lt;br /&gt;
* [http://www.fairchildsemi.com/ds/1N/1N5818.pdf 1N5817 Datasheet]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Projekte]]&lt;br /&gt;
&lt;br /&gt;
=Autoren=&lt;br /&gt;
--[[Benutzer:Dirk|Dirk]] 17:06, 5. Sep 2012 (CET)&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Filou89|Filou]] 19:20, 26. Sep 2012 (CET)&lt;/div&gt;</summary>
		<author><name>Filou89</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6v2_USB-RS232-Adapter&amp;diff=21157</id>
		<title>RP6v2 USB-RS232-Adapter</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6v2_USB-RS232-Adapter&amp;diff=21157"/>
				<updated>2012-09-26T20:03:17Z</updated>
		
		<summary type="html">&lt;p&gt;Filou89: /* Vorgehen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=RP6v2 USB-RS232-Adapter: Hardware=&lt;br /&gt;
&lt;br /&gt;
In diesem Projekt soll eine &amp;quot;Exp&amp;quot; ([[RP6#Experimentierplatine]], CONRAD [http://www.conrad.de/ce/de/product/191537/RP6-EXPERIMENTIERPLATINE 191537]) für den [[RP6v2]] (natürlich auch für den [[RP6]]) &amp;quot;gebaut&amp;quot; werden, mit der ein (bei mir) ständig auftretendes &amp;quot;Problem&amp;quot; behoben wird:&lt;br /&gt;
&lt;br /&gt;
Ich brauche eine Verbindung vom Microcontroller (µC) zu einer RS232-Schnittstelle oder zum USB-Port eines PCs. Natürlich gibt es schon das mitgelieferte USB Interface des RP6v2 und neuerdings auch das [http://www.conrad.de/ce/de/product/191638/Arexx-RP6-USB-Interface-RP6V2-TRANS RP6V2-TRANS] bei CONRAD, das anstelle des mitgelieferten Exemplars verwendet werden kann. Die [[RP6v2#RP6v2_M256_WiFi_Platine]] hat aber z.B. noch zwei freie USARTs, die ich gern eigenständig und unabhängig von der seriellen Verbindung zum RobotLoader verwenden will.&lt;br /&gt;
&lt;br /&gt;
Da hilft nur ein eigener USB-UART-Umsetzer. Ich habe mich für dieses Projekt entschieden für den [http://www.elv.de/mini-usb-modul-um2102-komplettbausatz.html UM2102] von ELV. Die Platine ist preisgünstig, super-kompakt und nutzt den CP2102, der kaum Außenbeschaltung braucht. Treiber gibt es für Windows, Mac, WinCE, Linux und für den Direktzugriff auf den CP2102.&lt;br /&gt;
&lt;br /&gt;
Das Projekt soll aber auch noch einen RS232-Pegelwandler vorsehen. Auch das ist (noch) ein typisches Problem (zumindest bei mir, weil ich noch einen PC mit RS232-Schnittstelle habe). Man könnte die kleine Schaltung auch mit einem MAX232N direkt auf der Exp aufbauen, ich habe mich aber aus Platzgründen für den [http://www.pollin.de/shop/dt/MzY5OTgxOTk-/Bausaetze_Module/Bausaetze/RS232_TTL_Wandler_Bausatz.html RS232-TTL-Wandler-Bausatz] von Pollin entschieden. Das ist zwar eine relativ große Platine, die man aber huckepack gut auf der Exp montieren kann.&lt;br /&gt;
&lt;br /&gt;
'''Für die Teile, die man für das ganze Projekt braucht, werden Bestell-Nummern vom [http://www.conrad.de/ce/ großen C] angegeben. Natürlich gibt es auch andere Versender, bei denen es evtl. günstiger wird.'''&lt;br /&gt;
&lt;br /&gt;
Was braucht man allgemein für den Aufbau einer Schaltung auf der Exp:&lt;br /&gt;
* Seitenschneider, Schere, Zange&lt;br /&gt;
* Lötkolben 25..30 Watt, Lötzinn&lt;br /&gt;
* Plastik 70 Schutzlack (CONRAD 813621)&lt;br /&gt;
* Isolierter Schaltdraht YV 0,20 mm² (CONRAD 606065)&lt;br /&gt;
* Versilberter CU-Draht 0,6 mm (CONRAD 605581)&lt;br /&gt;
&lt;br /&gt;
Mit dem versilberten CU-Draht stellt man auf der Unterseite (= Lötseite) der Exp Verbindungen zwischen den Bauteilen her; mit dem isolierten Schaltdraht werden Drahtbrücken auf der Oberseite (= Bestückungsseite) der Exp eingesetzt. Die Lage der Verbindungen zeige ich im Bestückungsplan. Man muss sich nicht an die genaue Lage der Verbindungen halten.&lt;br /&gt;
&lt;br /&gt;
'''Wenn man die Drähte und Bauteile an anderen Positionen einlötet, kann es aber sein, dass man die weitere Schaltung nicht mehr so aufbauen kann, wie ich das hier zeige! Möglicherweise sind die weiteren Teile dann nur noch mit einer &amp;quot;wilden&amp;quot; Freiverdrahtung machbar!'''&lt;br /&gt;
&lt;br /&gt;
==Aufbau==&lt;br /&gt;
Man braucht folgende Bauteile (Bestell-Nummern [http://www.conrad.de/ce/ CONRAD]):&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Anzahl || Bestell-Nr. || Bauteil-Bezeichnung:&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 191537 || RP6 Experimentierplatine&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.elv.de/ ELV] || Mini-USB-UART-Umsetzer UM2102&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.pollin.de/shop/index.html Pollin] || RS232-TTL-Wandler-Bausatz&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 168274 || Schottky-Diode 1N5817&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 736950 || Wannenstecker gewinkelt, 2 x 5-polig&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 741119 || 1-reihige Stiftleiste RM 2,54 mm (36-polig)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 742902 || Zehn Codierbrücken (aus Set)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 526630 || M3-Abstandbolzen 10 mm&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 815624 || Vier Muttern M3 (aus Set)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 815322 || Vier Schrauben M3 (aus Set)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Hier erst einmal der Schaltplan:&lt;br /&gt;
&lt;br /&gt;
[[bild:RP6_RS232_USB_SP.JPG]] &lt;br /&gt;
&lt;br /&gt;
Und dann der Bestückungsplan:&lt;br /&gt;
&lt;br /&gt;
[[bild:RP6_RS232_USB.JPG]] &lt;br /&gt;
&lt;br /&gt;
Ich habe die Drahtbrücken aus isoliertem Schaltdraht (es sind 33) rot eingezeichnet. Sie werden auf der '''Oberseite''' der Experimentierplatine bestückt!&lt;br /&gt;
&lt;br /&gt;
Zunächst wird der RS232-TTL-Wandler-Bausatz nach Anleitung aufgebaut. Die drei 2-poligen Anschlussklemmen werden NICHT eingelötet.&lt;br /&gt;
In die Experimentierplatine werden 4 Löcher (mit 3,2 mm Durchmesser) an den im Bestückungsplan hellgrün gekennzeichneten Stellen gebohrt. Hier werden die vier M3-Abstandbolzen 10 mm mit Muttern M3 eingesetzt. Darauf wird später die RS232-TTL-Wandler-Platine montiert.&lt;br /&gt;
&lt;br /&gt;
Die UM2102-Platine wird vorbereitet, indem zwei 5-polige und eine 6-polige Stiftleiste RM 2,54 mm auf der Lötseite direkt anliegend eingelötet werden.&lt;br /&gt;
&lt;br /&gt;
Danach werden alle Leiterbahnen, Brücken, Stecker und Jumper hergestellt und zum Schluß die UM2102-Platine an ihren Platz gelötet. Auf der Lötseite der RS232-TTL-Wandler-Platine werden 6 kurze Stücke (~ 2 cm) isolierte Schaltlitze (z.B. CONRAD 605808 o.ä.) an die Punkte +5V, Masse, CTS, RTS, TXD, RXD angelötet. Anschließend werden diese 6 Litzen auf der Exp an den gekennzeichneten Stellen angelötet, und die RS232-TTL-Wandler-Platine wird auf den Abstandbolzen mit Schrauben M3 befestigt.&lt;br /&gt;
&lt;br /&gt;
Viel Erfolg beim Aufbau!&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;br /&gt;
Will man zunächst den '''Mini-USB-UART-Umsetzer''' grob testen, werden die Jumper auf JP1 bis JP4 in Stellung &amp;quot;U&amp;quot; aufgesteckt. Alle anderen Jumper bleiben offen. Dann schließt man ihn mit einem USB-A zu Mini-USB Adapterkabel an einen PC an. Die UM2102-Platine sollte z.B. in Windows 7 problemlos erkannt werden. Falls ein VCP-Treiber nicht gefunden wird bzw. ein anderes Betriebssystem verwendet wird, finden sich die notwendigen '''Treiber''' [http://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx hier]. Der Mini-USB-UART-Umsetzer dürfte in Ordnung sein, wenn er vom Betriebssystem erkannt wird. Die komplette Funktion läßt sich aber nur prüfen, wenn man die Übertragung vom Microcontroller zum PC und umgekehrt ausführlich testet.&lt;br /&gt;
Das kann man z.B. tun, indem man ST1 (UART_TTL) mit dem 10-poligen Flachkabel des RP6 USB Interface (oder des RP6V2-TRANS) mit dem PROG_UART Stecker der RP6v2Base, M32, M128 oder M256 WiFi verbindet.&lt;br /&gt;
 '''ACHTUNG:''' Kein anderes (1:1) Flachkabel verwenden!!!&lt;br /&gt;
Die seriellen Ausgaben jedes beliebigen µC-Programms müßten dann auf einem '''Terminal-Programm''' (siehe auch [[RP6_-_Programmierung#Geeignete_Terminals]]!) auf dem PC zu empfangen sein. Damit ist die UART-USB Übertragung (zumindest in EINE Richtung) erfolgreich getestet.&lt;br /&gt;
&lt;br /&gt;
Genau so kann man den '''RS232-TTL-Wandler''' testen: JP1 bis JP4 von Stellung &amp;quot;U&amp;quot; umstecken in die andere (rechte) Stellung. JP5 aufstecken. Alle anderen Jumper bleiben offen. Der RS232-TTL-Wandler wird mit einem 1:1 Sub-D Kabel (9-polig, Stecker-Buchse) mit der RS232-Schnittstelle des PCs verbunden. Wie oben beschrieben wird ST1 (UART_TTL) mit dem Flachkabel des RP6 USB Interface mit dem PROG_UART Stecker der RP6v2Base, M32, M128 oder M256 WiFi verbunden. Auch hier sollte die serielle Verbindung zwischen dem Microcontroller und dem PC-Terminal-Programm in beiden Richtungen möglich sein.&lt;br /&gt;
&lt;br /&gt;
==Letzte Arbeiten==&lt;br /&gt;
&lt;br /&gt;
Was bleibt noch?&lt;br /&gt;
* Wenn die Platine komplett aufgebaut ist, kann man sie mit Plastik 70 Spray auf der Lötseite gegen Korrosion schützen&lt;br /&gt;
* Sich Anwendungen überlegen&lt;br /&gt;
* Anwendungen programmieren&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
==Allgemeine Daten und Tabellen==&lt;br /&gt;
&lt;br /&gt;
===Stecker===&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Stecker || Pins || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| ST1 || 10 || UART_TTL Wannenstecker (RX, TX, RTS, +5V *, GND)&lt;br /&gt;
|-&lt;br /&gt;
| ST2 || 4 || Suspend, RI, DTR, DSR an ST1&lt;br /&gt;
|-&lt;br /&gt;
| ST3 || 4 || TX, RX, RTS, CTS von UM2102 ODER RS232-TTL **&lt;br /&gt;
|-&lt;br /&gt;
| ST4 || 5 || Suspend, RI, DTR, DCD, DSR von UM2102&lt;br /&gt;
|-&lt;br /&gt;
| ST5 || 2 || 3,3 V, GND von UM2102&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Zu *)'''  Falls JP7 = ON!&lt;br /&gt;
&lt;br /&gt;
'''Zu **)''' Abhängig von JP1..JP4!&lt;br /&gt;
&lt;br /&gt;
====ST1 (UART_TTL)====&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Pin || Funktion || E/A || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || VDD || || +5 V&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || || Masse&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Suspend || A || Suspend (= ST2: 1)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || n.c. || ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || RI || E || Ring Indicator (= ST2: 2)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DSR || E || Data Set Ready (= ST2: 4)&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DTR || A || Data Terminal Ready (= ST2: 3)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || RX || E || Receive Data (= ST3: 2)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || TX || A || Transmit Data (= ST3: 1)&lt;br /&gt;
|-&lt;br /&gt;
| 10 || RTS || A || Request to Send (= ST3: 3)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Belegung dieses Steckers entspricht dem Stecker PROG des RP6 USB Interface und des RP6V2-TRANS. Das bedeutet, dass das 10-polige Flachkabel, das mit den beiden RP6 USB Interfaces mitgeliefert wird, auch für die Verbindung zwischen diesem Stecker UART_TTL und dem Wannenstecker PROG_UART des RP6-Systems (Base, M32, M128, M256 WiFi) verwendet werden kann.&lt;br /&gt;
 Will man ein eigenes Flachkabel für diese Verbindung herstellen,&lt;br /&gt;
 ist zu beachten, dass das Flachkabel '''gedreht''' (aus Pin 1 wird 10,&lt;br /&gt;
 aus Pin 2 wird 9, usw.) einzubauen ist!&lt;br /&gt;
Die Signale Suspend, RI, DSR und DTR werden zur Verbindung mit dem RP6-System nicht benötigt.&lt;br /&gt;
&lt;br /&gt;
====ST2====&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Pin || Funktion || E/A || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Suspend || A || = ST1: 3&lt;br /&gt;
|-&lt;br /&gt;
| 2 || RI || E || = ST1: 5&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DTR || A || = ST1: 7&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DSR || E || = ST1: 6&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====ST3====&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Pin || Funktion || E/A || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TX || A || Transmit Data (= ST1: 9)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || RX || E || Receive Data (= ST1: 8)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || RTS || A || Request to Send (= ST1: 10)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || CTS || E || Clear to Send&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
An diesem Stecker ST3 sind alle Signale vorhanden, die für die Kommunikation zwischen einem µC des RP6-Systems und einem USB-Port bzw. einer RS232-Schnittstelle relevant sind. Von diesem Stecker können die Schnittstellen-Signale (in der Regel werden nur TX, RX benötigt!) direkt zum UART auf einer der Platinen des RP6-Systems geführt werden.&lt;br /&gt;
&lt;br /&gt;
 '''ACHTUNG:'''&lt;br /&gt;
 ==&amp;gt; RX und TX kreuzen (d.h. µC:RX an ST3:TX und µC:TX an ST3:RX)!!!&lt;br /&gt;
 ==&amp;gt; TX und RTS dürfen nur mit µC-Eingängen verbunden werden!!!&lt;br /&gt;
&lt;br /&gt;
====ST4====&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Pin || Funktion || E/A || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Suspend || A || Suspend (von UM2102)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || RI || E || Ring Indicator (von UM2102)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DTR || A || Data Terminal Ready (von UM2102)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DCD || E || Data Carrier Detect (von UM2102)&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DSR || E || Data Set Ready (von UM2102)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
An diesem Stecker ST4 liegen Signale der seriellen Schnittstelle vom UM2102, die normalerweise nicht benötigt werden. Wenn Suspend, RI, DTR, DSR an ST1 (UART_TTL) genutzt werden sollen, kann man eine Drahtverbindung der Pins 1..3 und 5 dieses Steckers zu ST2 herstellen.&lt;br /&gt;
&lt;br /&gt;
====ST5====&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Pin || Funktion || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || + 3,3 V || 3,3 V / max. 100 mA (von UM2102)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || Masse&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
An diesem Stecker ST5 kann man eine Spannung von 3,3 V abnehmen, die vom UM2102 zur Verfügung gestellt wird. Der Ausgang darf maximal mit 100 mA belastet werden.&lt;br /&gt;
&lt;br /&gt;
====USRBUS====&lt;br /&gt;
&lt;br /&gt;
Der USRBUS stellt 14 Verbindungen zwischen den µC-Platinen (RP6Base, M32 und M128) und Experimentierplatinen, die man selbst gebaut hat, zur Verfügung. Die 14 Pins können frei belegt werden.&lt;br /&gt;
&lt;br /&gt;
Eine mögliche Belegung habe ich [http://www.roboternetz.de/community/threads/29281-RP6-USRBUS hier] vorgeschlagen.&lt;br /&gt;
Wenn man diesem Vorschlag folgt, ist RX des µCs an Y6, TX an Y8 und RST an Y10 des USRBUS zu finden. Natürlich muss man dann auf der jeweiligen µC-Platine oder Exp eine Verbindung der USRBUS-Pins (Y6, Y8) zum UART herstellen.&lt;br /&gt;
&lt;br /&gt;
Auf dieser Exp muss man JP8..10 schließen, wenn man den USRBUS auf diese Weise nutzen will.&lt;br /&gt;
&lt;br /&gt;
====UARTs====&lt;br /&gt;
&lt;br /&gt;
Im RP6-System sind die Hardware-UARTs an folgenden Steckern/Pins zu finden:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Platine || UART || RX || TX || RX an Stecker || TX an Stecker&lt;br /&gt;
|-&lt;br /&gt;
| RP6v2Base || 0 || PD0 || PD1 || PROGU: 2 * || PROGU: 3 *&lt;br /&gt;
|-&lt;br /&gt;
| RP6 CONTROL M32 || 0 || PD0 || PD1 || PROGU: 2  **|| PROGU: 3 **&lt;br /&gt;
|-&lt;br /&gt;
| RP6 CCPRO M128 || 0 || PE0 || PE1 || PROGU: 2 || PROGU: 3&lt;br /&gt;
|-&lt;br /&gt;
| || 1 || PD2 || PD3 || I/O: 8 || I/O: 7&lt;br /&gt;
|-&lt;br /&gt;
| RP6v2 M256 WIFI || 0 || PE0 || PE1 || PROGU: 2 || PROGU: 3&lt;br /&gt;
|-&lt;br /&gt;
| || 1 || PD2 || PD3 || USPI15: 8 || USPI15: 6&lt;br /&gt;
|-&lt;br /&gt;
| || 2 || PH0 || PH1 || USPI24: 8 || USPI24: 6&lt;br /&gt;
|-&lt;br /&gt;
| || 3 || PJ0 || PJ1 || n.c. ***|| n.c. ***&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Zu *)''' Kann man auch am Stecker &amp;quot;[[RP6#Serielle_Schnittstelle]]&amp;quot; auf dem RP6 Mainboard anschliessen!&lt;br /&gt;
&lt;br /&gt;
'''Zu **)''' Kann man auch am Stecker &amp;quot;[[RP6#Serielle_Schnittstelle_2]]&amp;quot; auf der M32 Platine anschliessen!&lt;br /&gt;
&lt;br /&gt;
'''Zu ***)''' Fest verbunden mit dem WLAN Modul, daher nicht nutzbar! &lt;br /&gt;
&lt;br /&gt;
 '''Stecker-Kürzel:'''&lt;br /&gt;
 PROGU   PROG_UART&lt;br /&gt;
 USPI15  UART_SPI1/T5&lt;br /&gt;
 USPI24  UART_SPI2/T4&lt;br /&gt;
&lt;br /&gt;
===Jumper===&lt;br /&gt;
&lt;br /&gt;
Zeichenerklärung:&lt;br /&gt;
* Zweipolige Jumper:&lt;br /&gt;
** Stellung ON = Jumper aufgesteckt (Kontakt geschlossen) &lt;br /&gt;
** Stellung OFF = Jumper abgezogen (Kontakt offen) &lt;br /&gt;
* Dreipolige Jumper:&lt;br /&gt;
** Stellung U = Jumper links * aufgesteckt&lt;br /&gt;
** Stellung R = Jumper rechts * aufgesteckt&lt;br /&gt;
&lt;br /&gt;
'''Zu *)''' Platine so gesehen, wie im Bestückungsplan!&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Jumper || Stellung || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| JP1 || U (S) || TX von USB&lt;br /&gt;
|-&lt;br /&gt;
| JP1 || R || TX von RS232&lt;br /&gt;
|-&lt;br /&gt;
| JP2 || U (S) || RX von USB&lt;br /&gt;
|-&lt;br /&gt;
| JP2 || R || RX von RS232&lt;br /&gt;
|-&lt;br /&gt;
| JP3 || U (S) || CTS von USB&lt;br /&gt;
|-&lt;br /&gt;
| JP3 || R || CTS von RS232&lt;br /&gt;
|-&lt;br /&gt;
| JP4 || U (S) || RTS von USB&lt;br /&gt;
|-&lt;br /&gt;
| JP4 || R || RTS von RS232&lt;br /&gt;
|-&lt;br /&gt;
| JP5 || ON || RS232-TTL-Wandler Power ON&lt;br /&gt;
|-&lt;br /&gt;
| JP5 || OFF (S) || RS232-TTL-Wandler Power OFF&lt;br /&gt;
|-&lt;br /&gt;
| JP6 || ON || Power für UM2102 auch von UART_TTL Stecker (Pin 1)&lt;br /&gt;
|-&lt;br /&gt;
| JP6 || OFF (S) || Power für UM2102 nur vom PC über USB-Stecker&lt;br /&gt;
|-&lt;br /&gt;
| JP7 || ON || +5 V Verbindung zwischen XBUS: VDD und UART_TTL Stecker (Pin 1)&lt;br /&gt;
|-&lt;br /&gt;
| JP7 || OFF (S) || Keine +5 V Verbindung zwischen XBUS und UART_TTL Stecker&lt;br /&gt;
|-&lt;br /&gt;
| JP8 || ON || TX an USRBUS RX (Pin Y6)&lt;br /&gt;
|-&lt;br /&gt;
| JP8 || OFF (S) || TX nicht an USRBUS&lt;br /&gt;
|-&lt;br /&gt;
| JP9 || ON || RTS an USRBUS RST (Pin Y10)&lt;br /&gt;
|-&lt;br /&gt;
| JP9 || OFF (S) || RTS nicht an USRBUS&lt;br /&gt;
|-&lt;br /&gt;
| JP10 || ON || RX an USRBUS TX (Pin Y8)&lt;br /&gt;
|-&lt;br /&gt;
| JP10 || OFF (S) || RX nicht an USRBUS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Zu (S)''' Standard-Stellung der Jumper ('''USB-UART-Betrieb über UART_TTL Stecker''')!&lt;br /&gt;
&lt;br /&gt;
 '''Hinweis:''' JP1 bis JP4 IMMER in dieselbe Stellung (U oder R) bringen!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=RP6v2 USB-RS232-Adapter: Software=&lt;br /&gt;
&lt;br /&gt;
Nutzt man die UARTs, die am PROG_UART Stecker der RP6Base, M32, M128 oder M256 WiFi liegen, mit dieser Adapter-Platine (siehe Tabelle [[RP6v2_USB-RS232-Adapter#UARTs]]!), kann man zum seriellen Lesen und Schreiben von Daten die Funktionen der vorhandenen UART-Libraries verwenden.&lt;br /&gt;
&lt;br /&gt;
Befehle für den Zugriff auf UART1 der RP6 CCPRO M128 sind in CompactC und BASIC des C-Control-Pro Systems enthalten (siehe Kapitel 6.19 RS232 der C-Control-Pro Anleitung!). Der Parameter ''serport'' der seriellen Funktionen muss auf 1 gesetzt werden, um den UART1 anzusprechen.&lt;br /&gt;
&lt;br /&gt;
Es bleibt die Frage, wie man mit den vertrauten Funktionen der RP6M256-UART-Library auf UART1 und UART2 der M256 WiFi zugreifen kann.&lt;br /&gt;
&lt;br /&gt;
Das ist recht einfach möglich, indem man die RP6M256uart Library anpasst.&lt;br /&gt;
&lt;br /&gt;
==RP6M256uart1 Library==&lt;br /&gt;
&lt;br /&gt;
Hier z.B. die Anpassung der RP6M256uart Library an '''UART1''':&lt;br /&gt;
&lt;br /&gt;
Datei RP6M256uart1.h:&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ------------------- [c]2011 / 2012 - AREXX ENGINEERING ---------------------&lt;br /&gt;
 * -------------------------- http://www.arexx.com/ ---------------------------&lt;br /&gt;
 * --------------------------- All rights reserved ----------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256uart1.h&lt;br /&gt;
 * Version: 1.1 - 24.02.2012&lt;br /&gt;
 * Target: RP6 CONTROL M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dominik S. Herwald&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * The M256 uart1 function Library header file. Detailled description&lt;br /&gt;
 * of each function can be found in the RP6M256uart1.c file!&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * CHANGELOG AND LICENSING INFORMATION CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6UART1_H&lt;br /&gt;
#define RP6UART1_H&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt; 	// Program memory (=Flash ROM) access routines.&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;			// C standard functions (e.g. itoa...)&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;			// I/O Port definitions&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;	// Interrupt macros (e.g. cli(), sei())&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// UART1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// TX:&lt;br /&gt;
&lt;br /&gt;
void writeChar1(char ch);&lt;br /&gt;
void writeStringLength1(char *data, uint8_t length, uint8_t offset);&lt;br /&gt;
void writeString1(char *data);&lt;br /&gt;
void writeNStringP1(const char *pstring);&lt;br /&gt;
#define writeString_P1(__pstr) writeNStringP1((PSTR(__pstr)))&lt;br /&gt;
&lt;br /&gt;
#define HEX 16&lt;br /&gt;
#define DEC 10&lt;br /&gt;
#define OCT 8&lt;br /&gt;
#define BIN 2&lt;br /&gt;
void writeInteger1(int16_t number, uint8_t base);&lt;br /&gt;
void write32BitInteger1(int32_t number, uint8_t base);&lt;br /&gt;
void writeIntegerLength1(int16_t number, uint8_t base, uint8_t length);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// RX:&lt;br /&gt;
extern volatile uint8_t uart1_status;&lt;br /&gt;
&lt;br /&gt;
#define UART1_RECEIVE_BUFFER_SIZE 500&lt;br /&gt;
#define UART1_BUFFER_OK 0&lt;br /&gt;
#define UART1_BUFFER_OVERFLOW 1&lt;br /&gt;
&lt;br /&gt;
char readChar1(void);&lt;br /&gt;
uint16_t readChars1(char *buf, uint16_t numberOfChars);&lt;br /&gt;
uint16_t getBufferLength1(void);&lt;br /&gt;
void clearReceptionBuffer1(void);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256uart1.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Bugs, feedback, questions and modifications can be posted on the AREXX Forum&lt;br /&gt;
 * on http://www.arexx.com/forum/ !&lt;br /&gt;
 * Of course you can also write us an e-mail to: info@arexx.nl&lt;br /&gt;
 * AREXX Engineering may publish updates from time to time on AREXX.com!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * - LICENSE -&lt;br /&gt;
 * GNU GPL v2 (http://www.gnu.org/licenses/gpl.txt, a local copy can be found&lt;br /&gt;
 * on the RP6 CD in the RP6 sorce code folders!)&lt;br /&gt;
 * This program is free software. You can redistribute it and/or modify&lt;br /&gt;
 * it under the terms of the GNU General Public License version 2 as published&lt;br /&gt;
 * by the Free Software Foundation.&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei RP6M256uart1.c:&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ------------------- [c]2011 / 2012 - AREXX ENGINEERING ---------------------&lt;br /&gt;
 * -------------------------- http://www.arexx.com/ ---------------------------&lt;br /&gt;
 * --------------------------- All rights reserved ----------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256uart1.c&lt;br /&gt;
 * Version: 1.1 - 16.07.2012&lt;br /&gt;
 * Target: RP6 CONTROL M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dominik S. Herwald&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 *&lt;br /&gt;
 * The M256 UART1 Library. (UART = &amp;quot;Universal Aynchronous Receiver Transceiver&amp;quot;)&lt;br /&gt;
 *&lt;br /&gt;
 * It contains data transfer functions for the UART (1). &lt;br /&gt;
 * Reception is Interrupt based with a circular buffer.&lt;br /&gt;
 *&lt;br /&gt;
 * --------&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You should better leave all this as it is if you just started with&lt;br /&gt;
 * C programming, but it is a good idea to read the comments and review the&lt;br /&gt;
 * code, it will help you to understand C programming for AVR better.&lt;br /&gt;
 *&lt;br /&gt;
 * Of course you are free to add new functions and improvements to this&lt;br /&gt;
 * library and make them available to the public on the Internet.&lt;br /&gt;
 * Please use the changelog at the end of this file to document your&lt;br /&gt;
 * changes. And add your name (or nickname) to any new function or &lt;br /&gt;
 * modification you added! E.g. a &amp;quot;modified by &amp;lt;nickname&amp;gt; at &amp;lt;date&amp;gt;&amp;quot; is &lt;br /&gt;
 * always a good idea to show other users where and what you changed the &lt;br /&gt;
 * source code!&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * CHANGELOG AND LICENSING INFORMATION CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256uart1.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// UART1 transmit functions:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a single character to the UART1.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			writeChar1('R');&lt;br /&gt;
 *			writeChar1('P');&lt;br /&gt;
 *			writeChar1('6');&lt;br /&gt;
 *			writeChar1('\n');&lt;br /&gt;
 *			// '\n' is a special code for the &amp;quot;new line&amp;quot; character!&lt;br /&gt;
 *			writeChar1('0');&lt;br /&gt;
 *			writeChar1(48); // 48 is ASCII code for '0'&lt;br /&gt;
 *			writeChar1(49); // 1&lt;br /&gt;
 *			writeChar1(50); // 2&lt;br /&gt;
 *			writeChar1(51); // 3&lt;br /&gt;
 *			//...&lt;br /&gt;
 *&lt;br /&gt;
 *			would output:&lt;br /&gt;
 *			RP6&lt;br /&gt;
 *			00123&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void writeChar1(char ch)&lt;br /&gt;
{&lt;br /&gt;
    while (!(UCSR1A &amp;amp; (1&amp;lt;&amp;lt;UDRE1)));&lt;br /&gt;
    UDR1 = (uint8_t)ch;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a null terminated string or buffer from SRAM to UART1.&lt;br /&gt;
 * Make sure that it really IS null terminated!&lt;br /&gt;
 * (&amp;quot;null terminated&amp;quot; means that the string has a null (=0) at the end.&lt;br /&gt;
 * this is automatically added to it by the compiler when you put the&lt;br /&gt;
 * string in double quotes like this: writeString1(&amp;quot;test&amp;quot;);  )&lt;br /&gt;
 *&lt;br /&gt;
 * ATTENTION: This fills up SRAM Memory with the&lt;br /&gt;
 * strings, even if they are constant and never changed.&lt;br /&gt;
 * If you want to write constant text strings to the UART1, better use&lt;br /&gt;
 * writeNStringP1(const uint8_t *pstring) (s. below), which reads the&lt;br /&gt;
 * text from flash program memory and does not fill up the SRAM with&lt;br /&gt;
 * the string data!&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			writeString1(&amp;quot;RP6 Robot System\n&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void writeString1(char *string)&lt;br /&gt;
{&lt;br /&gt;
	while(*string)&lt;br /&gt;
		writeChar1(*string++);&lt;br /&gt;
}&lt;br /&gt;
		&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a null terminated string from flash program memory to UART1.&lt;br /&gt;
 * You can use the macro writeString_P1(STRING); , this macro&lt;br /&gt;
 * ensures that the String is stored in program memory only!&lt;br /&gt;
 * Otherwise you need to use PSTR(&amp;quot;your string&amp;quot;) from AVRLibC for this. &lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			writeNStringP1(PSTR(&amp;quot;RP6 Robot System\n&amp;quot;));&lt;br /&gt;
 *&lt;br /&gt;
 *			// There is also a Macro that makes life easier and&lt;br /&gt;
 *			// you can simply write:&lt;br /&gt;
 *			writeString_P1(&amp;quot;RP6 Robot System\n&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void writeNStringP1(const char *pstring)&lt;br /&gt;
{&lt;br /&gt;
    uint8_t c;&lt;br /&gt;
    for (;(c = pgm_read_byte_near(pstring++));writeChar1(c));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a string with specified length and offset from SRAM to UART1.&lt;br /&gt;
 * If it is a null terminated string, output will be stopped at the&lt;br /&gt;
 * end! It does not need to be null terminated, but it is recommended&lt;br /&gt;
 * to use only null terminated strings/buffers, otherwise the function could&lt;br /&gt;
 * output any SRAM memory data stored after the string until it reaches a 0&lt;br /&gt;
 * or the specified length.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			writeStringLength1(&amp;quot;RP6 Robot Sytem\n&amp;quot;,16,0);&lt;br /&gt;
 *			// would output: &amp;quot;RP6 Robot Sytem\n&amp;quot;&lt;br /&gt;
 *			writeStringLength1(&amp;quot;RP6 Robot Sytem\n&amp;quot;,11,4);&lt;br /&gt;
 *			// would output: &amp;quot;Robot System&amp;quot;&lt;br /&gt;
 * 			writeStringLength1(&amp;quot;RP6 Robot Sytem\n&amp;quot;,40,4);&lt;br /&gt;
 *			// would output: &amp;quot;Robot System\n&amp;quot;&lt;br /&gt;
 *			// No matter if the specified length is 40 characters!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void writeStringLength1(char *string, uint8_t length, uint8_t offset)&lt;br /&gt;
{&lt;br /&gt;
	for(string = &amp;amp;string[offset]; *string &amp;amp;&amp;amp; length; length--)&lt;br /&gt;
		writeChar1(*string++);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a number (with specified base) to the UART1.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a hexadecimal number to the UART1:&lt;br /&gt;
 *			writeInteger1(0xAACC,16);&lt;br /&gt;
 *			// Instead of 16 you can also write &amp;quot;HEX&amp;quot; as this is defined in the&lt;br /&gt;
 *			// RP6M256uart1.h :&lt;br /&gt;
 *			writeInteger1(0xAACC, HEX);&lt;br /&gt;
 *			// Other Formats:&lt;br /&gt;
 *			writeInteger1(1024,DEC);  	// Decimal&lt;br /&gt;
 *			writeInteger1(044,OCT);		// Ocal&lt;br /&gt;
 *			writeInteger1(0b11010111,BIN); // Binary&lt;br /&gt;
 */&lt;br /&gt;
void writeInteger1(int16_t number, uint8_t base)&lt;br /&gt;
{&lt;br /&gt;
	char buffer[17];&lt;br /&gt;
	itoa(number, &amp;amp;buffer[0], base);&lt;br /&gt;
	writeString1(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a 32 Bit number (with specified base) to the UART1.&lt;br /&gt;
 * Usage is the same as writeInteger1.&lt;br /&gt;
 */&lt;br /&gt;
void write32BitInteger1(int32_t number, uint8_t base)&lt;br /&gt;
{&lt;br /&gt;
	char buffer[33];&lt;br /&gt;
	ltoa(number, &amp;amp;buffer[0], base);&lt;br /&gt;
	writeString1(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Same as writeInteger1, but with defined length.&lt;br /&gt;
 * This means this routine will add leading zeros to the number if length is&lt;br /&gt;
 * larger than the actual value or cut the upper digits if length is smaller&lt;br /&gt;
 * than the actual value.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a hexadecimal number to the UART1:&lt;br /&gt;
 *			writeIntegerLength1(0xAACC, 16, 8);&lt;br /&gt;
 *			// Instead of 16 you can also write &amp;quot;HEX&amp;quot; as this is defined in the&lt;br /&gt;
 *			// RP6M256uart1.h :&lt;br /&gt;
 *			writeIntegerLength1(0xAACC, HEX, 8);&lt;br /&gt;
 *			// Other Formats:&lt;br /&gt;
 *			writeIntegerLength1(1024,DEC,6);  	// Decimal&lt;br /&gt;
 *			writeIntegerLength1(044,OCT,4);		// Ocal&lt;br /&gt;
 *			writeIntegerLength1(0b11010111,BIN,8); // Binary&lt;br /&gt;
 */&lt;br /&gt;
void writeIntegerLength1(int16_t number, uint8_t base, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	char buffer[17];&lt;br /&gt;
	itoa(number, &amp;amp;buffer[0], base);&lt;br /&gt;
	int8_t cnt = length - strlen(buffer);&lt;br /&gt;
	if(cnt &amp;gt; 0) {&lt;br /&gt;
		for(; cnt &amp;gt; 0; cnt--, writeChar1('0'));&lt;br /&gt;
		writeString1(&amp;amp;buffer[0]);&lt;br /&gt;
	}&lt;br /&gt;
	else &lt;br /&gt;
		writeStringLength1(&amp;amp;buffer[0],length,-cnt);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// UART1 receive functions:&lt;br /&gt;
&lt;br /&gt;
volatile char uart1_receive_buffer[UART1_RECEIVE_BUFFER_SIZE+1];&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t uart1_status;&lt;br /&gt;
&lt;br /&gt;
uint16_t read_pos1 = 0;&lt;br /&gt;
uint16_t write_pos1 = 0; &lt;br /&gt;
uint16_t read_size1 = 0;&lt;br /&gt;
uint16_t write_size1 = 0;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * UART1 receive ISR.&lt;br /&gt;
 * Handles reception to circular buffer.&lt;br /&gt;
 */&lt;br /&gt;
ISR(USART1_RX_vect)&lt;br /&gt;
{	&lt;br /&gt;
	static volatile uint8_t dummy;&lt;br /&gt;
	if(((uint16_t)(write_size1 - read_size1)) &amp;lt; UART1_RECEIVE_BUFFER_SIZE) {&lt;br /&gt;
		uart1_receive_buffer[write_pos1++] = UDR1;&lt;br /&gt;
		write_size1++;&lt;br /&gt;
		if(write_pos1 &amp;gt; UART1_RECEIVE_BUFFER_SIZE) &lt;br /&gt;
			write_pos1 = 0;&lt;br /&gt;
		uart1_status = UART1_BUFFER_OK;&lt;br /&gt;
	}&lt;br /&gt;
	else {	&lt;br /&gt;
		dummy = UDR1;&lt;br /&gt;
		uart1_status = UART1_BUFFER_OVERFLOW;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Read a char from the circular buffer. &lt;br /&gt;
 * The char is removed from the buffer (or more precise: not accessible directly anymore&lt;br /&gt;
 * and will be overwritten as soon as new data becomes available)!&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 * // [...]&lt;br /&gt;
 * if(getBufferLength1()) 		&lt;br /&gt;
 *	   receivedData[data_position++] = readChar1();&lt;br /&gt;
 * // [...]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
char readChar1(void)&lt;br /&gt;
{&lt;br /&gt;
	uart1_status = UART1_BUFFER_OK;&lt;br /&gt;
	if(((uint16_t)(write_size1 - read_size1)) &amp;gt; 0) {&lt;br /&gt;
		read_size1++;&lt;br /&gt;
		if(read_pos1 &amp;gt; UART1_RECEIVE_BUFFER_SIZE) &lt;br /&gt;
			read_pos1 = 0;&lt;br /&gt;
		return uart1_receive_buffer[read_pos1++];&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Same as readChar1, but this function copies numberOfChars chars from the&lt;br /&gt;
 * circular buffer to buf. &lt;br /&gt;
 * It also returns the number of characters really copied to the buffer! &lt;br /&gt;
 * Just in case that there were fewer chars in the buffer...&lt;br /&gt;
 */&lt;br /&gt;
uint16_t readChars1(char *buf, uint16_t numberOfChars)&lt;br /&gt;
{&lt;br /&gt;
	uint16_t i = 0;&lt;br /&gt;
	uart1_status = UART1_BUFFER_OK;&lt;br /&gt;
	while(((uint16_t)(write_size1 - read_size1)) &amp;gt; 0 &amp;amp;&amp;amp; i &amp;lt; numberOfChars) {&lt;br /&gt;
		read_size1++;&lt;br /&gt;
		buf[i++] = uart1_receive_buffer[read_pos1++];&lt;br /&gt;
		if(read_pos1 &amp;gt; UART1_RECEIVE_BUFFER_SIZE) &lt;br /&gt;
			read_pos1 = 0;&lt;br /&gt;
	}&lt;br /&gt;
	return i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns the current number of elements in the buffer.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 * s. readChar1 function above!&lt;br /&gt;
 */&lt;br /&gt;
uint16_t getBufferLength1(void)&lt;br /&gt;
{&lt;br /&gt;
	return (((uint16_t)(write_size1 - read_size1)));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Clears the reception buffer - it disables UART1 Receive &lt;br /&gt;
 * interrupt for a short period of time. &lt;br /&gt;
 */&lt;br /&gt;
void clearReceptionBuffer1(void)&lt;br /&gt;
{&lt;br /&gt;
	static uint8_t dummy;&lt;br /&gt;
	UCSR1B &amp;amp;= ~(1 &amp;lt;&amp;lt; RXCIE1); // disable UART1 RX Interrupt&lt;br /&gt;
	dummy = UDR1;&lt;br /&gt;
	read_pos1 = 0;&lt;br /&gt;
	write_pos1 = 0; &lt;br /&gt;
	read_size1 = 0;&lt;br /&gt;
	write_size1 = 0;&lt;br /&gt;
	uart1_status = UART1_BUFFER_OK;&lt;br /&gt;
	UCSR1B |= (1 &amp;lt;&amp;lt; RXCIE1); // enable Interrupt again&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.1 16.07.2012 by Dominik S. Herwald&lt;br /&gt;
 * - v. 1.0 (initial release) 24.02.2012 by Dominik S. Herwald&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Bugs, feedback, questions and modifications can be posted on the AREXX Forum&lt;br /&gt;
 * on http://www.arexx.com/forum/ !&lt;br /&gt;
 * Of course you can also write us an e-mail to: info@arexx.nl&lt;br /&gt;
 * AREXX Engineering may publish updates from time to time on AREXX.com!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * - LICENSE -&lt;br /&gt;
 * GNU GPL v2 (http://www.gnu.org/licenses/gpl.txt, a local copy can be found&lt;br /&gt;
 * on the RP6 CD in the RP6 sorce code folders!)&lt;br /&gt;
 * This program is free software. You can redistribute it and/or modify&lt;br /&gt;
 * it under the terms of the GNU General Public License version 2 as published&lt;br /&gt;
 * by the Free Software Foundation.&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Für den Zugriff auf UART1 wurde allen Funktionsnamen eine &amp;quot;1&amp;quot; angehängt. Aus writeChar (UART0) wird also z.B. '''writeChar1''' (UART1). Für UART2 kann diese Library auf dieselbe Weise angepaßt werden. Die RP6M256uart1 Library kann wie die ursprüngliche Library in eigene Programme eingebunden werden,- natürlich auch ZUSÄTZLICH zur RP6M256uart Library.&lt;br /&gt;
&lt;br /&gt;
===Initialisierung===&lt;br /&gt;
&lt;br /&gt;
Wenn man die RP6M256uart Library auf den UART1 oder UART2 anpasst, muss man die Initialisierung des UARTs im eigenen Hauptprogramm durchführen.&lt;br /&gt;
&lt;br /&gt;
Für '''UART1''' kann das dann so aussehen:&lt;br /&gt;
&amp;lt;pre&amp;gt;	cli();			// Disable global interrupts.&lt;br /&gt;
&lt;br /&gt;
	// UART1:&lt;br /&gt;
	UBRR1H = UBRR_BAUD_LOW &amp;gt;&amp;gt; 8;	// Setup UART1: Baud is Low Speed&lt;br /&gt;
	UBRR1L = (uint8_t) UBRR_BAUD_LOW;&lt;br /&gt;
	UCSR1A = 0x00;&lt;br /&gt;
	UCSR1C = (0&amp;lt;&amp;lt;UMSEL10) | (0&amp;lt;&amp;lt;UMSEL11) | (1&amp;lt;&amp;lt;UCSZ11) | (1&amp;lt;&amp;lt;UCSZ10);&lt;br /&gt;
	UCSR1B = (1 &amp;lt;&amp;lt; TXEN1) | (1 &amp;lt;&amp;lt; RXEN1) | (1 &amp;lt;&amp;lt; RXCIE1);&lt;br /&gt;
&lt;br /&gt;
	clearReceptionBuffer1();&lt;br /&gt;
&lt;br /&gt;
	sei();			// Enable Global Interrupts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Software und USB-Treiber=&lt;br /&gt;
Der Hardwaretreiber wird von Windows nicht automatisch gefunden. Um das USB-Modul verwenden zu können, muss der Treiber manuell installiert werden.&lt;br /&gt;
Für Windows 7 wurde dieser [http://www.silabs.com/Support%20Documents/Software/CP210x_VCP_Win_XP_S2K3_Vista_7.exe Windows Treiber] von SiLabs getestet.&lt;br /&gt;
Treiber für andere Betriebssysteme können direkt bei ELV oder auch bei [http://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx SiLabs] gefunden werden.&lt;br /&gt;
&lt;br /&gt;
==Vorgehen USB-Treiber==&lt;br /&gt;
1. Treiber installieren, Verzeichnis merken&lt;br /&gt;
&lt;br /&gt;
2. USB-Modul anstecken&lt;br /&gt;
&lt;br /&gt;
3. Gerätemanager öffnen&lt;br /&gt;
&lt;br /&gt;
4. UM2102 wählen, Treibersoftware aktualisieren&lt;br /&gt;
&lt;br /&gt;
5. Auf dem Computer nach Treibersoftware suchen&lt;br /&gt;
&lt;br /&gt;
6. Installationsverzeichnis angeben, Unterordner einbeziehen&lt;br /&gt;
&lt;br /&gt;
==COM-Terminal==&lt;br /&gt;
Zum Auswerten der empfangenen Daten eignet sich eigentlich jedes COM-Terminal, z.B. [http://www.heise.de/download/hterm.html HTerm]. Es gilt lediglich zu beachten, dass die virtuelle Schnittstelle folgendermassen konfiguriert ist:&lt;br /&gt;
38400 Baud, 8Bit, 1Stop, Parity: None.&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
* [[RP6]]&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6 Kamera - Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2 I2C-Portexpander]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Universal_Serial_Bus USB]&lt;br /&gt;
* [http://de.wikipedia.org/wiki/RS-232 RS232]&lt;br /&gt;
* [[UART]]&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Transistor-Transistor-Logik TTL]&lt;br /&gt;
* [http://www.silabs.com/Support%20Documents/TechnicalDocs/cp2102.pdf CP2102 Datasheet]&lt;br /&gt;
* [http://www.ti.com/lit/ds/symlink/max232.pdf MAX232N Datasheet]&lt;br /&gt;
* [http://www.fairchildsemi.com/ds/1N/1N5818.pdf 1N5817 Datasheet]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Projekte]]&lt;br /&gt;
&lt;br /&gt;
=Autoren=&lt;br /&gt;
--[[Benutzer:Dirk|Dirk]] 17:06, 5. Sep 2012 (CET)&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Filou89|Filou]] 19:20, 26. Sep 2012 (CET)&lt;/div&gt;</summary>
		<author><name>Filou89</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6v2_USB-RS232-Adapter&amp;diff=21156</id>
		<title>RP6v2 USB-RS232-Adapter</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6v2_USB-RS232-Adapter&amp;diff=21156"/>
				<updated>2012-09-26T19:58:23Z</updated>
		
		<summary type="html">&lt;p&gt;Filou89: /* Software und USB-Treiber */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=RP6v2 USB-RS232-Adapter: Hardware=&lt;br /&gt;
&lt;br /&gt;
In diesem Projekt soll eine &amp;quot;Exp&amp;quot; ([[RP6#Experimentierplatine]], CONRAD [http://www.conrad.de/ce/de/product/191537/RP6-EXPERIMENTIERPLATINE 191537]) für den [[RP6v2]] (natürlich auch für den [[RP6]]) &amp;quot;gebaut&amp;quot; werden, mit der ein (bei mir) ständig auftretendes &amp;quot;Problem&amp;quot; behoben wird:&lt;br /&gt;
&lt;br /&gt;
Ich brauche eine Verbindung vom Microcontroller (µC) zu einer RS232-Schnittstelle oder zum USB-Port eines PCs. Natürlich gibt es schon das mitgelieferte USB Interface des RP6v2 und neuerdings auch das [http://www.conrad.de/ce/de/product/191638/Arexx-RP6-USB-Interface-RP6V2-TRANS RP6V2-TRANS] bei CONRAD, das anstelle des mitgelieferten Exemplars verwendet werden kann. Die [[RP6v2#RP6v2_M256_WiFi_Platine]] hat aber z.B. noch zwei freie USARTs, die ich gern eigenständig und unabhängig von der seriellen Verbindung zum RobotLoader verwenden will.&lt;br /&gt;
&lt;br /&gt;
Da hilft nur ein eigener USB-UART-Umsetzer. Ich habe mich für dieses Projekt entschieden für den [http://www.elv.de/mini-usb-modul-um2102-komplettbausatz.html UM2102] von ELV. Die Platine ist preisgünstig, super-kompakt und nutzt den CP2102, der kaum Außenbeschaltung braucht. Treiber gibt es für Windows, Mac, WinCE, Linux und für den Direktzugriff auf den CP2102.&lt;br /&gt;
&lt;br /&gt;
Das Projekt soll aber auch noch einen RS232-Pegelwandler vorsehen. Auch das ist (noch) ein typisches Problem (zumindest bei mir, weil ich noch einen PC mit RS232-Schnittstelle habe). Man könnte die kleine Schaltung auch mit einem MAX232N direkt auf der Exp aufbauen, ich habe mich aber aus Platzgründen für den [http://www.pollin.de/shop/dt/MzY5OTgxOTk-/Bausaetze_Module/Bausaetze/RS232_TTL_Wandler_Bausatz.html RS232-TTL-Wandler-Bausatz] von Pollin entschieden. Das ist zwar eine relativ große Platine, die man aber huckepack gut auf der Exp montieren kann.&lt;br /&gt;
&lt;br /&gt;
'''Für die Teile, die man für das ganze Projekt braucht, werden Bestell-Nummern vom [http://www.conrad.de/ce/ großen C] angegeben. Natürlich gibt es auch andere Versender, bei denen es evtl. günstiger wird.'''&lt;br /&gt;
&lt;br /&gt;
Was braucht man allgemein für den Aufbau einer Schaltung auf der Exp:&lt;br /&gt;
* Seitenschneider, Schere, Zange&lt;br /&gt;
* Lötkolben 25..30 Watt, Lötzinn&lt;br /&gt;
* Plastik 70 Schutzlack (CONRAD 813621)&lt;br /&gt;
* Isolierter Schaltdraht YV 0,20 mm² (CONRAD 606065)&lt;br /&gt;
* Versilberter CU-Draht 0,6 mm (CONRAD 605581)&lt;br /&gt;
&lt;br /&gt;
Mit dem versilberten CU-Draht stellt man auf der Unterseite (= Lötseite) der Exp Verbindungen zwischen den Bauteilen her; mit dem isolierten Schaltdraht werden Drahtbrücken auf der Oberseite (= Bestückungsseite) der Exp eingesetzt. Die Lage der Verbindungen zeige ich im Bestückungsplan. Man muss sich nicht an die genaue Lage der Verbindungen halten.&lt;br /&gt;
&lt;br /&gt;
'''Wenn man die Drähte und Bauteile an anderen Positionen einlötet, kann es aber sein, dass man die weitere Schaltung nicht mehr so aufbauen kann, wie ich das hier zeige! Möglicherweise sind die weiteren Teile dann nur noch mit einer &amp;quot;wilden&amp;quot; Freiverdrahtung machbar!'''&lt;br /&gt;
&lt;br /&gt;
==Aufbau==&lt;br /&gt;
Man braucht folgende Bauteile (Bestell-Nummern [http://www.conrad.de/ce/ CONRAD]):&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Anzahl || Bestell-Nr. || Bauteil-Bezeichnung:&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 191537 || RP6 Experimentierplatine&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.elv.de/ ELV] || Mini-USB-UART-Umsetzer UM2102&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.pollin.de/shop/index.html Pollin] || RS232-TTL-Wandler-Bausatz&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 168274 || Schottky-Diode 1N5817&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 736950 || Wannenstecker gewinkelt, 2 x 5-polig&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 741119 || 1-reihige Stiftleiste RM 2,54 mm (36-polig)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 742902 || Zehn Codierbrücken (aus Set)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 526630 || M3-Abstandbolzen 10 mm&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 815624 || Vier Muttern M3 (aus Set)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 815322 || Vier Schrauben M3 (aus Set)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Hier erst einmal der Schaltplan:&lt;br /&gt;
&lt;br /&gt;
[[bild:RP6_RS232_USB_SP.JPG]] &lt;br /&gt;
&lt;br /&gt;
Und dann der Bestückungsplan:&lt;br /&gt;
&lt;br /&gt;
[[bild:RP6_RS232_USB.JPG]] &lt;br /&gt;
&lt;br /&gt;
Ich habe die Drahtbrücken aus isoliertem Schaltdraht (es sind 33) rot eingezeichnet. Sie werden auf der '''Oberseite''' der Experimentierplatine bestückt!&lt;br /&gt;
&lt;br /&gt;
Zunächst wird der RS232-TTL-Wandler-Bausatz nach Anleitung aufgebaut. Die drei 2-poligen Anschlussklemmen werden NICHT eingelötet.&lt;br /&gt;
In die Experimentierplatine werden 4 Löcher (mit 3,2 mm Durchmesser) an den im Bestückungsplan hellgrün gekennzeichneten Stellen gebohrt. Hier werden die vier M3-Abstandbolzen 10 mm mit Muttern M3 eingesetzt. Darauf wird später die RS232-TTL-Wandler-Platine montiert.&lt;br /&gt;
&lt;br /&gt;
Die UM2102-Platine wird vorbereitet, indem zwei 5-polige und eine 6-polige Stiftleiste RM 2,54 mm auf der Lötseite direkt anliegend eingelötet werden.&lt;br /&gt;
&lt;br /&gt;
Danach werden alle Leiterbahnen, Brücken, Stecker und Jumper hergestellt und zum Schluß die UM2102-Platine an ihren Platz gelötet. Auf der Lötseite der RS232-TTL-Wandler-Platine werden 6 kurze Stücke (~ 2 cm) isolierte Schaltlitze (z.B. CONRAD 605808 o.ä.) an die Punkte +5V, Masse, CTS, RTS, TXD, RXD angelötet. Anschließend werden diese 6 Litzen auf der Exp an den gekennzeichneten Stellen angelötet, und die RS232-TTL-Wandler-Platine wird auf den Abstandbolzen mit Schrauben M3 befestigt.&lt;br /&gt;
&lt;br /&gt;
Viel Erfolg beim Aufbau!&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;br /&gt;
Will man zunächst den '''Mini-USB-UART-Umsetzer''' grob testen, werden die Jumper auf JP1 bis JP4 in Stellung &amp;quot;U&amp;quot; aufgesteckt. Alle anderen Jumper bleiben offen. Dann schließt man ihn mit einem USB-A zu Mini-USB Adapterkabel an einen PC an. Die UM2102-Platine sollte z.B. in Windows 7 problemlos erkannt werden. Falls ein VCP-Treiber nicht gefunden wird bzw. ein anderes Betriebssystem verwendet wird, finden sich die notwendigen '''Treiber''' [http://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx hier]. Der Mini-USB-UART-Umsetzer dürfte in Ordnung sein, wenn er vom Betriebssystem erkannt wird. Die komplette Funktion läßt sich aber nur prüfen, wenn man die Übertragung vom Microcontroller zum PC und umgekehrt ausführlich testet.&lt;br /&gt;
Das kann man z.B. tun, indem man ST1 (UART_TTL) mit dem 10-poligen Flachkabel des RP6 USB Interface (oder des RP6V2-TRANS) mit dem PROG_UART Stecker der RP6v2Base, M32, M128 oder M256 WiFi verbindet.&lt;br /&gt;
 '''ACHTUNG:''' Kein anderes (1:1) Flachkabel verwenden!!!&lt;br /&gt;
Die seriellen Ausgaben jedes beliebigen µC-Programms müßten dann auf einem '''Terminal-Programm''' (siehe auch [[RP6_-_Programmierung#Geeignete_Terminals]]!) auf dem PC zu empfangen sein. Damit ist die UART-USB Übertragung (zumindest in EINE Richtung) erfolgreich getestet.&lt;br /&gt;
&lt;br /&gt;
Genau so kann man den '''RS232-TTL-Wandler''' testen: JP1 bis JP4 von Stellung &amp;quot;U&amp;quot; umstecken in die andere (rechte) Stellung. JP5 aufstecken. Alle anderen Jumper bleiben offen. Der RS232-TTL-Wandler wird mit einem 1:1 Sub-D Kabel (9-polig, Stecker-Buchse) mit der RS232-Schnittstelle des PCs verbunden. Wie oben beschrieben wird ST1 (UART_TTL) mit dem Flachkabel des RP6 USB Interface mit dem PROG_UART Stecker der RP6v2Base, M32, M128 oder M256 WiFi verbunden. Auch hier sollte die serielle Verbindung zwischen dem Microcontroller und dem PC-Terminal-Programm in beiden Richtungen möglich sein.&lt;br /&gt;
&lt;br /&gt;
==Letzte Arbeiten==&lt;br /&gt;
&lt;br /&gt;
Was bleibt noch?&lt;br /&gt;
* Wenn die Platine komplett aufgebaut ist, kann man sie mit Plastik 70 Spray auf der Lötseite gegen Korrosion schützen&lt;br /&gt;
* Sich Anwendungen überlegen&lt;br /&gt;
* Anwendungen programmieren&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
==Allgemeine Daten und Tabellen==&lt;br /&gt;
&lt;br /&gt;
===Stecker===&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Stecker || Pins || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| ST1 || 10 || UART_TTL Wannenstecker (RX, TX, RTS, +5V *, GND)&lt;br /&gt;
|-&lt;br /&gt;
| ST2 || 4 || Suspend, RI, DTR, DSR an ST1&lt;br /&gt;
|-&lt;br /&gt;
| ST3 || 4 || TX, RX, RTS, CTS von UM2102 ODER RS232-TTL **&lt;br /&gt;
|-&lt;br /&gt;
| ST4 || 5 || Suspend, RI, DTR, DCD, DSR von UM2102&lt;br /&gt;
|-&lt;br /&gt;
| ST5 || 2 || 3,3 V, GND von UM2102&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Zu *)'''  Falls JP7 = ON!&lt;br /&gt;
&lt;br /&gt;
'''Zu **)''' Abhängig von JP1..JP4!&lt;br /&gt;
&lt;br /&gt;
====ST1 (UART_TTL)====&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Pin || Funktion || E/A || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || VDD || || +5 V&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || || Masse&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Suspend || A || Suspend (= ST2: 1)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || n.c. || ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || RI || E || Ring Indicator (= ST2: 2)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DSR || E || Data Set Ready (= ST2: 4)&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DTR || A || Data Terminal Ready (= ST2: 3)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || RX || E || Receive Data (= ST3: 2)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || TX || A || Transmit Data (= ST3: 1)&lt;br /&gt;
|-&lt;br /&gt;
| 10 || RTS || A || Request to Send (= ST3: 3)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Belegung dieses Steckers entspricht dem Stecker PROG des RP6 USB Interface und des RP6V2-TRANS. Das bedeutet, dass das 10-polige Flachkabel, das mit den beiden RP6 USB Interfaces mitgeliefert wird, auch für die Verbindung zwischen diesem Stecker UART_TTL und dem Wannenstecker PROG_UART des RP6-Systems (Base, M32, M128, M256 WiFi) verwendet werden kann.&lt;br /&gt;
 Will man ein eigenes Flachkabel für diese Verbindung herstellen,&lt;br /&gt;
 ist zu beachten, dass das Flachkabel '''gedreht''' (aus Pin 1 wird 10,&lt;br /&gt;
 aus Pin 2 wird 9, usw.) einzubauen ist!&lt;br /&gt;
Die Signale Suspend, RI, DSR und DTR werden zur Verbindung mit dem RP6-System nicht benötigt.&lt;br /&gt;
&lt;br /&gt;
====ST2====&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Pin || Funktion || E/A || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Suspend || A || = ST1: 3&lt;br /&gt;
|-&lt;br /&gt;
| 2 || RI || E || = ST1: 5&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DTR || A || = ST1: 7&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DSR || E || = ST1: 6&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====ST3====&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Pin || Funktion || E/A || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TX || A || Transmit Data (= ST1: 9)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || RX || E || Receive Data (= ST1: 8)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || RTS || A || Request to Send (= ST1: 10)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || CTS || E || Clear to Send&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
An diesem Stecker ST3 sind alle Signale vorhanden, die für die Kommunikation zwischen einem µC des RP6-Systems und einem USB-Port bzw. einer RS232-Schnittstelle relevant sind. Von diesem Stecker können die Schnittstellen-Signale (in der Regel werden nur TX, RX benötigt!) direkt zum UART auf einer der Platinen des RP6-Systems geführt werden.&lt;br /&gt;
&lt;br /&gt;
 '''ACHTUNG:'''&lt;br /&gt;
 ==&amp;gt; RX und TX kreuzen (d.h. µC:RX an ST3:TX und µC:TX an ST3:RX)!!!&lt;br /&gt;
 ==&amp;gt; TX und RTS dürfen nur mit µC-Eingängen verbunden werden!!!&lt;br /&gt;
&lt;br /&gt;
====ST4====&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Pin || Funktion || E/A || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Suspend || A || Suspend (von UM2102)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || RI || E || Ring Indicator (von UM2102)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DTR || A || Data Terminal Ready (von UM2102)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DCD || E || Data Carrier Detect (von UM2102)&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DSR || E || Data Set Ready (von UM2102)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
An diesem Stecker ST4 liegen Signale der seriellen Schnittstelle vom UM2102, die normalerweise nicht benötigt werden. Wenn Suspend, RI, DTR, DSR an ST1 (UART_TTL) genutzt werden sollen, kann man eine Drahtverbindung der Pins 1..3 und 5 dieses Steckers zu ST2 herstellen.&lt;br /&gt;
&lt;br /&gt;
====ST5====&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Pin || Funktion || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || + 3,3 V || 3,3 V / max. 100 mA (von UM2102)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || Masse&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
An diesem Stecker ST5 kann man eine Spannung von 3,3 V abnehmen, die vom UM2102 zur Verfügung gestellt wird. Der Ausgang darf maximal mit 100 mA belastet werden.&lt;br /&gt;
&lt;br /&gt;
====USRBUS====&lt;br /&gt;
&lt;br /&gt;
Der USRBUS stellt 14 Verbindungen zwischen den µC-Platinen (RP6Base, M32 und M128) und Experimentierplatinen, die man selbst gebaut hat, zur Verfügung. Die 14 Pins können frei belegt werden.&lt;br /&gt;
&lt;br /&gt;
Eine mögliche Belegung habe ich [http://www.roboternetz.de/community/threads/29281-RP6-USRBUS hier] vorgeschlagen.&lt;br /&gt;
Wenn man diesem Vorschlag folgt, ist RX des µCs an Y6, TX an Y8 und RST an Y10 des USRBUS zu finden. Natürlich muss man dann auf der jeweiligen µC-Platine oder Exp eine Verbindung der USRBUS-Pins (Y6, Y8) zum UART herstellen.&lt;br /&gt;
&lt;br /&gt;
Auf dieser Exp muss man JP8..10 schließen, wenn man den USRBUS auf diese Weise nutzen will.&lt;br /&gt;
&lt;br /&gt;
====UARTs====&lt;br /&gt;
&lt;br /&gt;
Im RP6-System sind die Hardware-UARTs an folgenden Steckern/Pins zu finden:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Platine || UART || RX || TX || RX an Stecker || TX an Stecker&lt;br /&gt;
|-&lt;br /&gt;
| RP6v2Base || 0 || PD0 || PD1 || PROGU: 2 * || PROGU: 3 *&lt;br /&gt;
|-&lt;br /&gt;
| RP6 CONTROL M32 || 0 || PD0 || PD1 || PROGU: 2  **|| PROGU: 3 **&lt;br /&gt;
|-&lt;br /&gt;
| RP6 CCPRO M128 || 0 || PE0 || PE1 || PROGU: 2 || PROGU: 3&lt;br /&gt;
|-&lt;br /&gt;
| || 1 || PD2 || PD3 || I/O: 8 || I/O: 7&lt;br /&gt;
|-&lt;br /&gt;
| RP6v2 M256 WIFI || 0 || PE0 || PE1 || PROGU: 2 || PROGU: 3&lt;br /&gt;
|-&lt;br /&gt;
| || 1 || PD2 || PD3 || USPI15: 8 || USPI15: 6&lt;br /&gt;
|-&lt;br /&gt;
| || 2 || PH0 || PH1 || USPI24: 8 || USPI24: 6&lt;br /&gt;
|-&lt;br /&gt;
| || 3 || PJ0 || PJ1 || n.c. ***|| n.c. ***&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Zu *)''' Kann man auch am Stecker &amp;quot;[[RP6#Serielle_Schnittstelle]]&amp;quot; auf dem RP6 Mainboard anschliessen!&lt;br /&gt;
&lt;br /&gt;
'''Zu **)''' Kann man auch am Stecker &amp;quot;[[RP6#Serielle_Schnittstelle_2]]&amp;quot; auf der M32 Platine anschliessen!&lt;br /&gt;
&lt;br /&gt;
'''Zu ***)''' Fest verbunden mit dem WLAN Modul, daher nicht nutzbar! &lt;br /&gt;
&lt;br /&gt;
 '''Stecker-Kürzel:'''&lt;br /&gt;
 PROGU   PROG_UART&lt;br /&gt;
 USPI15  UART_SPI1/T5&lt;br /&gt;
 USPI24  UART_SPI2/T4&lt;br /&gt;
&lt;br /&gt;
===Jumper===&lt;br /&gt;
&lt;br /&gt;
Zeichenerklärung:&lt;br /&gt;
* Zweipolige Jumper:&lt;br /&gt;
** Stellung ON = Jumper aufgesteckt (Kontakt geschlossen) &lt;br /&gt;
** Stellung OFF = Jumper abgezogen (Kontakt offen) &lt;br /&gt;
* Dreipolige Jumper:&lt;br /&gt;
** Stellung U = Jumper links * aufgesteckt&lt;br /&gt;
** Stellung R = Jumper rechts * aufgesteckt&lt;br /&gt;
&lt;br /&gt;
'''Zu *)''' Platine so gesehen, wie im Bestückungsplan!&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Jumper || Stellung || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| JP1 || U (S) || TX von USB&lt;br /&gt;
|-&lt;br /&gt;
| JP1 || R || TX von RS232&lt;br /&gt;
|-&lt;br /&gt;
| JP2 || U (S) || RX von USB&lt;br /&gt;
|-&lt;br /&gt;
| JP2 || R || RX von RS232&lt;br /&gt;
|-&lt;br /&gt;
| JP3 || U (S) || CTS von USB&lt;br /&gt;
|-&lt;br /&gt;
| JP3 || R || CTS von RS232&lt;br /&gt;
|-&lt;br /&gt;
| JP4 || U (S) || RTS von USB&lt;br /&gt;
|-&lt;br /&gt;
| JP4 || R || RTS von RS232&lt;br /&gt;
|-&lt;br /&gt;
| JP5 || ON || RS232-TTL-Wandler Power ON&lt;br /&gt;
|-&lt;br /&gt;
| JP5 || OFF (S) || RS232-TTL-Wandler Power OFF&lt;br /&gt;
|-&lt;br /&gt;
| JP6 || ON || Power für UM2102 auch von UART_TTL Stecker (Pin 1)&lt;br /&gt;
|-&lt;br /&gt;
| JP6 || OFF (S) || Power für UM2102 nur vom PC über USB-Stecker&lt;br /&gt;
|-&lt;br /&gt;
| JP7 || ON || +5 V Verbindung zwischen XBUS: VDD und UART_TTL Stecker (Pin 1)&lt;br /&gt;
|-&lt;br /&gt;
| JP7 || OFF (S) || Keine +5 V Verbindung zwischen XBUS und UART_TTL Stecker&lt;br /&gt;
|-&lt;br /&gt;
| JP8 || ON || TX an USRBUS RX (Pin Y6)&lt;br /&gt;
|-&lt;br /&gt;
| JP8 || OFF (S) || TX nicht an USRBUS&lt;br /&gt;
|-&lt;br /&gt;
| JP9 || ON || RTS an USRBUS RST (Pin Y10)&lt;br /&gt;
|-&lt;br /&gt;
| JP9 || OFF (S) || RTS nicht an USRBUS&lt;br /&gt;
|-&lt;br /&gt;
| JP10 || ON || RX an USRBUS TX (Pin Y8)&lt;br /&gt;
|-&lt;br /&gt;
| JP10 || OFF (S) || RX nicht an USRBUS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Zu (S)''' Standard-Stellung der Jumper ('''USB-UART-Betrieb über UART_TTL Stecker''')!&lt;br /&gt;
&lt;br /&gt;
 '''Hinweis:''' JP1 bis JP4 IMMER in dieselbe Stellung (U oder R) bringen!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=RP6v2 USB-RS232-Adapter: Software=&lt;br /&gt;
&lt;br /&gt;
Nutzt man die UARTs, die am PROG_UART Stecker der RP6Base, M32, M128 oder M256 WiFi liegen, mit dieser Adapter-Platine (siehe Tabelle [[RP6v2_USB-RS232-Adapter#UARTs]]!), kann man zum seriellen Lesen und Schreiben von Daten die Funktionen der vorhandenen UART-Libraries verwenden.&lt;br /&gt;
&lt;br /&gt;
Befehle für den Zugriff auf UART1 der RP6 CCPRO M128 sind in CompactC und BASIC des C-Control-Pro Systems enthalten (siehe Kapitel 6.19 RS232 der C-Control-Pro Anleitung!). Der Parameter ''serport'' der seriellen Funktionen muss auf 1 gesetzt werden, um den UART1 anzusprechen.&lt;br /&gt;
&lt;br /&gt;
Es bleibt die Frage, wie man mit den vertrauten Funktionen der RP6M256-UART-Library auf UART1 und UART2 der M256 WiFi zugreifen kann.&lt;br /&gt;
&lt;br /&gt;
Das ist recht einfach möglich, indem man die RP6M256uart Library anpasst.&lt;br /&gt;
&lt;br /&gt;
==RP6M256uart1 Library==&lt;br /&gt;
&lt;br /&gt;
Hier z.B. die Anpassung der RP6M256uart Library an '''UART1''':&lt;br /&gt;
&lt;br /&gt;
Datei RP6M256uart1.h:&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ------------------- [c]2011 / 2012 - AREXX ENGINEERING ---------------------&lt;br /&gt;
 * -------------------------- http://www.arexx.com/ ---------------------------&lt;br /&gt;
 * --------------------------- All rights reserved ----------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256uart1.h&lt;br /&gt;
 * Version: 1.1 - 24.02.2012&lt;br /&gt;
 * Target: RP6 CONTROL M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dominik S. Herwald&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * The M256 uart1 function Library header file. Detailled description&lt;br /&gt;
 * of each function can be found in the RP6M256uart1.c file!&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * CHANGELOG AND LICENSING INFORMATION CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6UART1_H&lt;br /&gt;
#define RP6UART1_H&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt; 	// Program memory (=Flash ROM) access routines.&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;			// C standard functions (e.g. itoa...)&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;			// I/O Port definitions&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;	// Interrupt macros (e.g. cli(), sei())&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// UART1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// TX:&lt;br /&gt;
&lt;br /&gt;
void writeChar1(char ch);&lt;br /&gt;
void writeStringLength1(char *data, uint8_t length, uint8_t offset);&lt;br /&gt;
void writeString1(char *data);&lt;br /&gt;
void writeNStringP1(const char *pstring);&lt;br /&gt;
#define writeString_P1(__pstr) writeNStringP1((PSTR(__pstr)))&lt;br /&gt;
&lt;br /&gt;
#define HEX 16&lt;br /&gt;
#define DEC 10&lt;br /&gt;
#define OCT 8&lt;br /&gt;
#define BIN 2&lt;br /&gt;
void writeInteger1(int16_t number, uint8_t base);&lt;br /&gt;
void write32BitInteger1(int32_t number, uint8_t base);&lt;br /&gt;
void writeIntegerLength1(int16_t number, uint8_t base, uint8_t length);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// RX:&lt;br /&gt;
extern volatile uint8_t uart1_status;&lt;br /&gt;
&lt;br /&gt;
#define UART1_RECEIVE_BUFFER_SIZE 500&lt;br /&gt;
#define UART1_BUFFER_OK 0&lt;br /&gt;
#define UART1_BUFFER_OVERFLOW 1&lt;br /&gt;
&lt;br /&gt;
char readChar1(void);&lt;br /&gt;
uint16_t readChars1(char *buf, uint16_t numberOfChars);&lt;br /&gt;
uint16_t getBufferLength1(void);&lt;br /&gt;
void clearReceptionBuffer1(void);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256uart1.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Bugs, feedback, questions and modifications can be posted on the AREXX Forum&lt;br /&gt;
 * on http://www.arexx.com/forum/ !&lt;br /&gt;
 * Of course you can also write us an e-mail to: info@arexx.nl&lt;br /&gt;
 * AREXX Engineering may publish updates from time to time on AREXX.com!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * - LICENSE -&lt;br /&gt;
 * GNU GPL v2 (http://www.gnu.org/licenses/gpl.txt, a local copy can be found&lt;br /&gt;
 * on the RP6 CD in the RP6 sorce code folders!)&lt;br /&gt;
 * This program is free software. You can redistribute it and/or modify&lt;br /&gt;
 * it under the terms of the GNU General Public License version 2 as published&lt;br /&gt;
 * by the Free Software Foundation.&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei RP6M256uart1.c:&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ------------------- [c]2011 / 2012 - AREXX ENGINEERING ---------------------&lt;br /&gt;
 * -------------------------- http://www.arexx.com/ ---------------------------&lt;br /&gt;
 * --------------------------- All rights reserved ----------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256uart1.c&lt;br /&gt;
 * Version: 1.1 - 16.07.2012&lt;br /&gt;
 * Target: RP6 CONTROL M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dominik S. Herwald&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 *&lt;br /&gt;
 * The M256 UART1 Library. (UART = &amp;quot;Universal Aynchronous Receiver Transceiver&amp;quot;)&lt;br /&gt;
 *&lt;br /&gt;
 * It contains data transfer functions for the UART (1). &lt;br /&gt;
 * Reception is Interrupt based with a circular buffer.&lt;br /&gt;
 *&lt;br /&gt;
 * --------&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You should better leave all this as it is if you just started with&lt;br /&gt;
 * C programming, but it is a good idea to read the comments and review the&lt;br /&gt;
 * code, it will help you to understand C programming for AVR better.&lt;br /&gt;
 *&lt;br /&gt;
 * Of course you are free to add new functions and improvements to this&lt;br /&gt;
 * library and make them available to the public on the Internet.&lt;br /&gt;
 * Please use the changelog at the end of this file to document your&lt;br /&gt;
 * changes. And add your name (or nickname) to any new function or &lt;br /&gt;
 * modification you added! E.g. a &amp;quot;modified by &amp;lt;nickname&amp;gt; at &amp;lt;date&amp;gt;&amp;quot; is &lt;br /&gt;
 * always a good idea to show other users where and what you changed the &lt;br /&gt;
 * source code!&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * CHANGELOG AND LICENSING INFORMATION CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256uart1.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// UART1 transmit functions:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a single character to the UART1.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			writeChar1('R');&lt;br /&gt;
 *			writeChar1('P');&lt;br /&gt;
 *			writeChar1('6');&lt;br /&gt;
 *			writeChar1('\n');&lt;br /&gt;
 *			// '\n' is a special code for the &amp;quot;new line&amp;quot; character!&lt;br /&gt;
 *			writeChar1('0');&lt;br /&gt;
 *			writeChar1(48); // 48 is ASCII code for '0'&lt;br /&gt;
 *			writeChar1(49); // 1&lt;br /&gt;
 *			writeChar1(50); // 2&lt;br /&gt;
 *			writeChar1(51); // 3&lt;br /&gt;
 *			//...&lt;br /&gt;
 *&lt;br /&gt;
 *			would output:&lt;br /&gt;
 *			RP6&lt;br /&gt;
 *			00123&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void writeChar1(char ch)&lt;br /&gt;
{&lt;br /&gt;
    while (!(UCSR1A &amp;amp; (1&amp;lt;&amp;lt;UDRE1)));&lt;br /&gt;
    UDR1 = (uint8_t)ch;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a null terminated string or buffer from SRAM to UART1.&lt;br /&gt;
 * Make sure that it really IS null terminated!&lt;br /&gt;
 * (&amp;quot;null terminated&amp;quot; means that the string has a null (=0) at the end.&lt;br /&gt;
 * this is automatically added to it by the compiler when you put the&lt;br /&gt;
 * string in double quotes like this: writeString1(&amp;quot;test&amp;quot;);  )&lt;br /&gt;
 *&lt;br /&gt;
 * ATTENTION: This fills up SRAM Memory with the&lt;br /&gt;
 * strings, even if they are constant and never changed.&lt;br /&gt;
 * If you want to write constant text strings to the UART1, better use&lt;br /&gt;
 * writeNStringP1(const uint8_t *pstring) (s. below), which reads the&lt;br /&gt;
 * text from flash program memory and does not fill up the SRAM with&lt;br /&gt;
 * the string data!&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			writeString1(&amp;quot;RP6 Robot System\n&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void writeString1(char *string)&lt;br /&gt;
{&lt;br /&gt;
	while(*string)&lt;br /&gt;
		writeChar1(*string++);&lt;br /&gt;
}&lt;br /&gt;
		&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a null terminated string from flash program memory to UART1.&lt;br /&gt;
 * You can use the macro writeString_P1(STRING); , this macro&lt;br /&gt;
 * ensures that the String is stored in program memory only!&lt;br /&gt;
 * Otherwise you need to use PSTR(&amp;quot;your string&amp;quot;) from AVRLibC for this. &lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			writeNStringP1(PSTR(&amp;quot;RP6 Robot System\n&amp;quot;));&lt;br /&gt;
 *&lt;br /&gt;
 *			// There is also a Macro that makes life easier and&lt;br /&gt;
 *			// you can simply write:&lt;br /&gt;
 *			writeString_P1(&amp;quot;RP6 Robot System\n&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void writeNStringP1(const char *pstring)&lt;br /&gt;
{&lt;br /&gt;
    uint8_t c;&lt;br /&gt;
    for (;(c = pgm_read_byte_near(pstring++));writeChar1(c));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a string with specified length and offset from SRAM to UART1.&lt;br /&gt;
 * If it is a null terminated string, output will be stopped at the&lt;br /&gt;
 * end! It does not need to be null terminated, but it is recommended&lt;br /&gt;
 * to use only null terminated strings/buffers, otherwise the function could&lt;br /&gt;
 * output any SRAM memory data stored after the string until it reaches a 0&lt;br /&gt;
 * or the specified length.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			writeStringLength1(&amp;quot;RP6 Robot Sytem\n&amp;quot;,16,0);&lt;br /&gt;
 *			// would output: &amp;quot;RP6 Robot Sytem\n&amp;quot;&lt;br /&gt;
 *			writeStringLength1(&amp;quot;RP6 Robot Sytem\n&amp;quot;,11,4);&lt;br /&gt;
 *			// would output: &amp;quot;Robot System&amp;quot;&lt;br /&gt;
 * 			writeStringLength1(&amp;quot;RP6 Robot Sytem\n&amp;quot;,40,4);&lt;br /&gt;
 *			// would output: &amp;quot;Robot System\n&amp;quot;&lt;br /&gt;
 *			// No matter if the specified length is 40 characters!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void writeStringLength1(char *string, uint8_t length, uint8_t offset)&lt;br /&gt;
{&lt;br /&gt;
	for(string = &amp;amp;string[offset]; *string &amp;amp;&amp;amp; length; length--)&lt;br /&gt;
		writeChar1(*string++);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a number (with specified base) to the UART1.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a hexadecimal number to the UART1:&lt;br /&gt;
 *			writeInteger1(0xAACC,16);&lt;br /&gt;
 *			// Instead of 16 you can also write &amp;quot;HEX&amp;quot; as this is defined in the&lt;br /&gt;
 *			// RP6M256uart1.h :&lt;br /&gt;
 *			writeInteger1(0xAACC, HEX);&lt;br /&gt;
 *			// Other Formats:&lt;br /&gt;
 *			writeInteger1(1024,DEC);  	// Decimal&lt;br /&gt;
 *			writeInteger1(044,OCT);		// Ocal&lt;br /&gt;
 *			writeInteger1(0b11010111,BIN); // Binary&lt;br /&gt;
 */&lt;br /&gt;
void writeInteger1(int16_t number, uint8_t base)&lt;br /&gt;
{&lt;br /&gt;
	char buffer[17];&lt;br /&gt;
	itoa(number, &amp;amp;buffer[0], base);&lt;br /&gt;
	writeString1(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a 32 Bit number (with specified base) to the UART1.&lt;br /&gt;
 * Usage is the same as writeInteger1.&lt;br /&gt;
 */&lt;br /&gt;
void write32BitInteger1(int32_t number, uint8_t base)&lt;br /&gt;
{&lt;br /&gt;
	char buffer[33];&lt;br /&gt;
	ltoa(number, &amp;amp;buffer[0], base);&lt;br /&gt;
	writeString1(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Same as writeInteger1, but with defined length.&lt;br /&gt;
 * This means this routine will add leading zeros to the number if length is&lt;br /&gt;
 * larger than the actual value or cut the upper digits if length is smaller&lt;br /&gt;
 * than the actual value.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a hexadecimal number to the UART1:&lt;br /&gt;
 *			writeIntegerLength1(0xAACC, 16, 8);&lt;br /&gt;
 *			// Instead of 16 you can also write &amp;quot;HEX&amp;quot; as this is defined in the&lt;br /&gt;
 *			// RP6M256uart1.h :&lt;br /&gt;
 *			writeIntegerLength1(0xAACC, HEX, 8);&lt;br /&gt;
 *			// Other Formats:&lt;br /&gt;
 *			writeIntegerLength1(1024,DEC,6);  	// Decimal&lt;br /&gt;
 *			writeIntegerLength1(044,OCT,4);		// Ocal&lt;br /&gt;
 *			writeIntegerLength1(0b11010111,BIN,8); // Binary&lt;br /&gt;
 */&lt;br /&gt;
void writeIntegerLength1(int16_t number, uint8_t base, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	char buffer[17];&lt;br /&gt;
	itoa(number, &amp;amp;buffer[0], base);&lt;br /&gt;
	int8_t cnt = length - strlen(buffer);&lt;br /&gt;
	if(cnt &amp;gt; 0) {&lt;br /&gt;
		for(; cnt &amp;gt; 0; cnt--, writeChar1('0'));&lt;br /&gt;
		writeString1(&amp;amp;buffer[0]);&lt;br /&gt;
	}&lt;br /&gt;
	else &lt;br /&gt;
		writeStringLength1(&amp;amp;buffer[0],length,-cnt);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// UART1 receive functions:&lt;br /&gt;
&lt;br /&gt;
volatile char uart1_receive_buffer[UART1_RECEIVE_BUFFER_SIZE+1];&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t uart1_status;&lt;br /&gt;
&lt;br /&gt;
uint16_t read_pos1 = 0;&lt;br /&gt;
uint16_t write_pos1 = 0; &lt;br /&gt;
uint16_t read_size1 = 0;&lt;br /&gt;
uint16_t write_size1 = 0;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * UART1 receive ISR.&lt;br /&gt;
 * Handles reception to circular buffer.&lt;br /&gt;
 */&lt;br /&gt;
ISR(USART1_RX_vect)&lt;br /&gt;
{	&lt;br /&gt;
	static volatile uint8_t dummy;&lt;br /&gt;
	if(((uint16_t)(write_size1 - read_size1)) &amp;lt; UART1_RECEIVE_BUFFER_SIZE) {&lt;br /&gt;
		uart1_receive_buffer[write_pos1++] = UDR1;&lt;br /&gt;
		write_size1++;&lt;br /&gt;
		if(write_pos1 &amp;gt; UART1_RECEIVE_BUFFER_SIZE) &lt;br /&gt;
			write_pos1 = 0;&lt;br /&gt;
		uart1_status = UART1_BUFFER_OK;&lt;br /&gt;
	}&lt;br /&gt;
	else {	&lt;br /&gt;
		dummy = UDR1;&lt;br /&gt;
		uart1_status = UART1_BUFFER_OVERFLOW;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Read a char from the circular buffer. &lt;br /&gt;
 * The char is removed from the buffer (or more precise: not accessible directly anymore&lt;br /&gt;
 * and will be overwritten as soon as new data becomes available)!&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 * // [...]&lt;br /&gt;
 * if(getBufferLength1()) 		&lt;br /&gt;
 *	   receivedData[data_position++] = readChar1();&lt;br /&gt;
 * // [...]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
char readChar1(void)&lt;br /&gt;
{&lt;br /&gt;
	uart1_status = UART1_BUFFER_OK;&lt;br /&gt;
	if(((uint16_t)(write_size1 - read_size1)) &amp;gt; 0) {&lt;br /&gt;
		read_size1++;&lt;br /&gt;
		if(read_pos1 &amp;gt; UART1_RECEIVE_BUFFER_SIZE) &lt;br /&gt;
			read_pos1 = 0;&lt;br /&gt;
		return uart1_receive_buffer[read_pos1++];&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Same as readChar1, but this function copies numberOfChars chars from the&lt;br /&gt;
 * circular buffer to buf. &lt;br /&gt;
 * It also returns the number of characters really copied to the buffer! &lt;br /&gt;
 * Just in case that there were fewer chars in the buffer...&lt;br /&gt;
 */&lt;br /&gt;
uint16_t readChars1(char *buf, uint16_t numberOfChars)&lt;br /&gt;
{&lt;br /&gt;
	uint16_t i = 0;&lt;br /&gt;
	uart1_status = UART1_BUFFER_OK;&lt;br /&gt;
	while(((uint16_t)(write_size1 - read_size1)) &amp;gt; 0 &amp;amp;&amp;amp; i &amp;lt; numberOfChars) {&lt;br /&gt;
		read_size1++;&lt;br /&gt;
		buf[i++] = uart1_receive_buffer[read_pos1++];&lt;br /&gt;
		if(read_pos1 &amp;gt; UART1_RECEIVE_BUFFER_SIZE) &lt;br /&gt;
			read_pos1 = 0;&lt;br /&gt;
	}&lt;br /&gt;
	return i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns the current number of elements in the buffer.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 * s. readChar1 function above!&lt;br /&gt;
 */&lt;br /&gt;
uint16_t getBufferLength1(void)&lt;br /&gt;
{&lt;br /&gt;
	return (((uint16_t)(write_size1 - read_size1)));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Clears the reception buffer - it disables UART1 Receive &lt;br /&gt;
 * interrupt for a short period of time. &lt;br /&gt;
 */&lt;br /&gt;
void clearReceptionBuffer1(void)&lt;br /&gt;
{&lt;br /&gt;
	static uint8_t dummy;&lt;br /&gt;
	UCSR1B &amp;amp;= ~(1 &amp;lt;&amp;lt; RXCIE1); // disable UART1 RX Interrupt&lt;br /&gt;
	dummy = UDR1;&lt;br /&gt;
	read_pos1 = 0;&lt;br /&gt;
	write_pos1 = 0; &lt;br /&gt;
	read_size1 = 0;&lt;br /&gt;
	write_size1 = 0;&lt;br /&gt;
	uart1_status = UART1_BUFFER_OK;&lt;br /&gt;
	UCSR1B |= (1 &amp;lt;&amp;lt; RXCIE1); // enable Interrupt again&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.1 16.07.2012 by Dominik S. Herwald&lt;br /&gt;
 * - v. 1.0 (initial release) 24.02.2012 by Dominik S. Herwald&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Bugs, feedback, questions and modifications can be posted on the AREXX Forum&lt;br /&gt;
 * on http://www.arexx.com/forum/ !&lt;br /&gt;
 * Of course you can also write us an e-mail to: info@arexx.nl&lt;br /&gt;
 * AREXX Engineering may publish updates from time to time on AREXX.com!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * - LICENSE -&lt;br /&gt;
 * GNU GPL v2 (http://www.gnu.org/licenses/gpl.txt, a local copy can be found&lt;br /&gt;
 * on the RP6 CD in the RP6 sorce code folders!)&lt;br /&gt;
 * This program is free software. You can redistribute it and/or modify&lt;br /&gt;
 * it under the terms of the GNU General Public License version 2 as published&lt;br /&gt;
 * by the Free Software Foundation.&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Für den Zugriff auf UART1 wurde allen Funktionsnamen eine &amp;quot;1&amp;quot; angehängt. Aus writeChar (UART0) wird also z.B. '''writeChar1''' (UART1). Für UART2 kann diese Library auf dieselbe Weise angepaßt werden. Die RP6M256uart1 Library kann wie die ursprüngliche Library in eigene Programme eingebunden werden,- natürlich auch ZUSÄTZLICH zur RP6M256uart Library.&lt;br /&gt;
&lt;br /&gt;
===Initialisierung===&lt;br /&gt;
&lt;br /&gt;
Wenn man die RP6M256uart Library auf den UART1 oder UART2 anpasst, muss man die Initialisierung des UARTs im eigenen Hauptprogramm durchführen.&lt;br /&gt;
&lt;br /&gt;
Für '''UART1''' kann das dann so aussehen:&lt;br /&gt;
&amp;lt;pre&amp;gt;	cli();			// Disable global interrupts.&lt;br /&gt;
&lt;br /&gt;
	// UART1:&lt;br /&gt;
	UBRR1H = UBRR_BAUD_LOW &amp;gt;&amp;gt; 8;	// Setup UART1: Baud is Low Speed&lt;br /&gt;
	UBRR1L = (uint8_t) UBRR_BAUD_LOW;&lt;br /&gt;
	UCSR1A = 0x00;&lt;br /&gt;
	UCSR1C = (0&amp;lt;&amp;lt;UMSEL10) | (0&amp;lt;&amp;lt;UMSEL11) | (1&amp;lt;&amp;lt;UCSZ11) | (1&amp;lt;&amp;lt;UCSZ10);&lt;br /&gt;
	UCSR1B = (1 &amp;lt;&amp;lt; TXEN1) | (1 &amp;lt;&amp;lt; RXEN1) | (1 &amp;lt;&amp;lt; RXCIE1);&lt;br /&gt;
&lt;br /&gt;
	clearReceptionBuffer1();&lt;br /&gt;
&lt;br /&gt;
	sei();			// Enable Global Interrupts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Software und USB-Treiber=&lt;br /&gt;
Der Hardwaretreiber wird von Windows nicht automatisch gefunden. Um das USB-Modul verwenden zu können, muss der Treiber manuell installiert werden.&lt;br /&gt;
Für Windows 7 wurde dieser [http://www.silabs.com/Support%20Documents/Software/CP210x_VCP_Win_XP_S2K3_Vista_7.exe Windows Treiber] von SiLabs getestet.&lt;br /&gt;
Treiber für andere Betriebssysteme können direkt bei ELV oder auch bei [http://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx SiLabs] gefunden werden.&lt;br /&gt;
&lt;br /&gt;
==Vorgehen==&lt;br /&gt;
1. Treiber installieren, Verzeichnis merken&lt;br /&gt;
&lt;br /&gt;
2. USB-Modul anstecken&lt;br /&gt;
&lt;br /&gt;
3. Gerätemanager öffnen&lt;br /&gt;
&lt;br /&gt;
4. UM2102 wählen, Treibersoftware aktualisieren&lt;br /&gt;
&lt;br /&gt;
5. Auf dem Computer nach Treibersoftware suchen&lt;br /&gt;
&lt;br /&gt;
6. Installationsverzeichnis angeben, Unterordner einbeziehen&lt;br /&gt;
&lt;br /&gt;
==COM-Terminal==&lt;br /&gt;
Zum Auswerten der empfangenen Daten eignet sich eigentlich jedes COM-Terminal, z.B. [http://www.heise.de/download/hterm.html HTerm]. Es gilt lediglich zu beachten, dass die virtuelle Schnittstelle folgendermassen konfiguriert ist:&lt;br /&gt;
38400 Baud, 8Bit, 1Stop, Parity: None.&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
* [[RP6]]&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6 Kamera - Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2 I2C-Portexpander]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Universal_Serial_Bus USB]&lt;br /&gt;
* [http://de.wikipedia.org/wiki/RS-232 RS232]&lt;br /&gt;
* [[UART]]&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Transistor-Transistor-Logik TTL]&lt;br /&gt;
* [http://www.silabs.com/Support%20Documents/TechnicalDocs/cp2102.pdf CP2102 Datasheet]&lt;br /&gt;
* [http://www.ti.com/lit/ds/symlink/max232.pdf MAX232N Datasheet]&lt;br /&gt;
* [http://www.fairchildsemi.com/ds/1N/1N5818.pdf 1N5817 Datasheet]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Projekte]]&lt;br /&gt;
&lt;br /&gt;
=Autoren=&lt;br /&gt;
--[[Benutzer:Dirk|Dirk]] 17:06, 5. Sep 2012 (CET)&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Filou89|Filou]] 19:20, 26. Sep 2012 (CET)&lt;/div&gt;</summary>
		<author><name>Filou89</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6v2_USB-RS232-Adapter&amp;diff=21152</id>
		<title>RP6v2 USB-RS232-Adapter</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6v2_USB-RS232-Adapter&amp;diff=21152"/>
				<updated>2012-09-26T17:22:01Z</updated>
		
		<summary type="html">&lt;p&gt;Filou89: /* Autoren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=RP6v2 USB-RS232-Adapter: Hardware=&lt;br /&gt;
&lt;br /&gt;
In diesem Projekt soll eine &amp;quot;Exp&amp;quot; ([[RP6#Experimentierplatine]], CONRAD [http://www.conrad.de/ce/de/product/191537/RP6-EXPERIMENTIERPLATINE 191537]) für den [[RP6v2]] (natürlich auch für den [[RP6]]) &amp;quot;gebaut&amp;quot; werden, mit der ein (bei mir) ständig auftretendes &amp;quot;Problem&amp;quot; behoben wird:&lt;br /&gt;
&lt;br /&gt;
Ich brauche eine Verbindung vom Microcontroller (µC) zu einer RS232-Schnittstelle oder zum USB-Port eines PCs. Natürlich gibt es schon das mitgelieferte USB Interface des RP6v2 und neuerdings auch das [http://www.conrad.de/ce/de/product/191638/Arexx-RP6-USB-Interface-RP6V2-TRANS RP6V2-TRANS] bei CONRAD, das anstelle des mitgelieferten Exemplars verwendet werden kann. Die [[RP6v2#RP6v2_M256_WiFi_Platine]] hat aber z.B. noch zwei freie USARTs, die ich gern eigenständig und unabhängig von der seriellen Verbindung zum RobotLoader verwenden will.&lt;br /&gt;
&lt;br /&gt;
Da hilft nur ein eigener USB-UART-Umsetzer. Ich habe mich für dieses Projekt entschieden für den [http://www.elv.de/mini-usb-modul-um2102-komplettbausatz.html UM2102] von ELV. Die Platine ist preisgünstig, super-kompakt und nutzt den CP2102, der kaum Außenbeschaltung braucht. Treiber gibt es für Windows, Mac, WinCE, Linux und für den Direktzugriff auf den CP2102.&lt;br /&gt;
&lt;br /&gt;
Das Projekt soll aber auch noch einen RS232-Pegelwandler vorsehen. Auch das ist (noch) ein typisches Problem (zumindest bei mir, weil ich noch einen PC mit RS232-Schnittstelle habe). Man könnte die kleine Schaltung auch mit einem MAX232N direkt auf der Exp aufbauen, ich habe mich aber aus Platzgründen für den [http://www.pollin.de/shop/dt/MzY5OTgxOTk-/Bausaetze_Module/Bausaetze/RS232_TTL_Wandler_Bausatz.html RS232-TTL-Wandler-Bausatz] von Pollin entschieden. Das ist zwar eine relativ große Platine, die man aber huckepack gut auf der Exp montieren kann.&lt;br /&gt;
&lt;br /&gt;
'''Für die Teile, die man für das ganze Projekt braucht, werden Bestell-Nummern vom [http://www.conrad.de/ce/ großen C] angegeben. Natürlich gibt es auch andere Versender, bei denen es evtl. günstiger wird.'''&lt;br /&gt;
&lt;br /&gt;
Was braucht man allgemein für den Aufbau einer Schaltung auf der Exp:&lt;br /&gt;
* Seitenschneider, Schere, Zange&lt;br /&gt;
* Lötkolben 25..30 Watt, Lötzinn&lt;br /&gt;
* Plastik 70 Schutzlack (CONRAD 813621)&lt;br /&gt;
* Isolierter Schaltdraht YV 0,20 mm² (CONRAD 606065)&lt;br /&gt;
* Versilberter CU-Draht 0,6 mm (CONRAD 605581)&lt;br /&gt;
&lt;br /&gt;
Mit dem versilberten CU-Draht stellt man auf der Unterseite (= Lötseite) der Exp Verbindungen zwischen den Bauteilen her; mit dem isolierten Schaltdraht werden Drahtbrücken auf der Oberseite (= Bestückungsseite) der Exp eingesetzt. Die Lage der Verbindungen zeige ich im Bestückungsplan. Man muss sich nicht an die genaue Lage der Verbindungen halten.&lt;br /&gt;
&lt;br /&gt;
'''Wenn man die Drähte und Bauteile an anderen Positionen einlötet, kann es aber sein, dass man die weitere Schaltung nicht mehr so aufbauen kann, wie ich das hier zeige! Möglicherweise sind die weiteren Teile dann nur noch mit einer &amp;quot;wilden&amp;quot; Freiverdrahtung machbar!'''&lt;br /&gt;
&lt;br /&gt;
==Aufbau==&lt;br /&gt;
Man braucht folgende Bauteile (Bestell-Nummern [http://www.conrad.de/ce/ CONRAD]):&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Anzahl || Bestell-Nr. || Bauteil-Bezeichnung:&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 191537 || RP6 Experimentierplatine&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.elv.de/ ELV] || Mini-USB-UART-Umsetzer UM2102&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.pollin.de/shop/index.html Pollin] || RS232-TTL-Wandler-Bausatz&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 168274 || Schottky-Diode 1N5817&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 736950 || Wannenstecker gewinkelt, 2 x 5-polig&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 741119 || 1-reihige Stiftleiste RM 2,54 mm (36-polig)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 742902 || Zehn Codierbrücken (aus Set)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 526630 || M3-Abstandbolzen 10 mm&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 815624 || Vier Muttern M3 (aus Set)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 815322 || Vier Schrauben M3 (aus Set)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Hier erst einmal der Schaltplan:&lt;br /&gt;
&lt;br /&gt;
[[bild:RP6_RS232_USB_SP.JPG]] &lt;br /&gt;
&lt;br /&gt;
Und dann der Bestückungsplan:&lt;br /&gt;
&lt;br /&gt;
[[bild:RP6_RS232_USB.JPG]] &lt;br /&gt;
&lt;br /&gt;
Ich habe die Drahtbrücken aus isoliertem Schaltdraht (es sind 33) rot eingezeichnet. Sie werden auf der '''Oberseite''' der Experimentierplatine bestückt!&lt;br /&gt;
&lt;br /&gt;
Zunächst wird der RS232-TTL-Wandler-Bausatz nach Anleitung aufgebaut. Die drei 2-poligen Anschlussklemmen werden NICHT eingelötet.&lt;br /&gt;
In die Experimentierplatine werden 4 Löcher (mit 3,2 mm Durchmesser) an den im Bestückungsplan hellgrün gekennzeichneten Stellen gebohrt. Hier werden die vier M3-Abstandbolzen 10 mm mit Muttern M3 eingesetzt. Darauf wird später die RS232-TTL-Wandler-Platine montiert.&lt;br /&gt;
&lt;br /&gt;
Die UM2102-Platine wird vorbereitet, indem zwei 5-polige und eine 6-polige Stiftleiste RM 2,54 mm auf der Lötseite direkt anliegend eingelötet werden.&lt;br /&gt;
&lt;br /&gt;
Danach werden alle Leiterbahnen, Brücken, Stecker und Jumper hergestellt und zum Schluß die UM2102-Platine an ihren Platz gelötet. Auf der Lötseite der RS232-TTL-Wandler-Platine werden 6 kurze Stücke (~ 2 cm) isolierte Schaltlitze (z.B. CONRAD 605808 o.ä.) an die Punkte +5V, Masse, CTS, RTS, TXD, RXD angelötet. Anschließend werden diese 6 Litzen auf der Exp an den gekennzeichneten Stellen angelötet, und die RS232-TTL-Wandler-Platine wird auf den Abstandbolzen mit Schrauben M3 befestigt.&lt;br /&gt;
&lt;br /&gt;
Viel Erfolg beim Aufbau!&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;br /&gt;
Will man zunächst den '''Mini-USB-UART-Umsetzer''' grob testen, werden die Jumper auf JP1 bis JP4 in Stellung &amp;quot;U&amp;quot; aufgesteckt. Alle anderen Jumper bleiben offen. Dann schließt man ihn mit einem USB-A zu Mini-USB Adapterkabel an einen PC an. Die UM2102-Platine sollte z.B. in Windows 7 problemlos erkannt werden. Falls ein VCP-Treiber nicht gefunden wird bzw. ein anderes Betriebssystem verwendet wird, finden sich die notwendigen '''Treiber''' [http://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx hier]. Der Mini-USB-UART-Umsetzer dürfte in Ordnung sein, wenn er vom Betriebssystem erkannt wird. Die komplette Funktion läßt sich aber nur prüfen, wenn man die Übertragung vom Microcontroller zum PC und umgekehrt ausführlich testet.&lt;br /&gt;
Das kann man z.B. tun, indem man ST1 (UART_TTL) mit dem 10-poligen Flachkabel des RP6 USB Interface (oder des RP6V2-TRANS) mit dem PROG_UART Stecker der RP6v2Base, M32, M128 oder M256 WiFi verbindet.&lt;br /&gt;
 '''ACHTUNG:''' Kein anderes (1:1) Flachkabel verwenden!!!&lt;br /&gt;
Die seriellen Ausgaben jedes beliebigen µC-Programms müßten dann auf einem '''Terminal-Programm''' (siehe auch [[RP6_-_Programmierung#Geeignete_Terminals]]!) auf dem PC zu empfangen sein. Damit ist die UART-USB Übertragung (zumindest in EINE Richtung) erfolgreich getestet.&lt;br /&gt;
&lt;br /&gt;
Genau so kann man den '''RS232-TTL-Wandler''' testen: JP1 bis JP4 von Stellung &amp;quot;U&amp;quot; umstecken in die andere (rechte) Stellung. JP5 aufstecken. Alle anderen Jumper bleiben offen. Der RS232-TTL-Wandler wird mit einem 1:1 Sub-D Kabel (9-polig, Stecker-Buchse) mit der RS232-Schnittstelle des PCs verbunden. Wie oben beschrieben wird ST1 (UART_TTL) mit dem Flachkabel des RP6 USB Interface mit dem PROG_UART Stecker der RP6v2Base, M32, M128 oder M256 WiFi verbunden. Auch hier sollte die serielle Verbindung zwischen dem Microcontroller und dem PC-Terminal-Programm in beiden Richtungen möglich sein.&lt;br /&gt;
&lt;br /&gt;
==Letzte Arbeiten==&lt;br /&gt;
&lt;br /&gt;
Was bleibt noch?&lt;br /&gt;
* Wenn die Platine komplett aufgebaut ist, kann man sie mit Plastik 70 Spray auf der Lötseite gegen Korrosion schützen&lt;br /&gt;
* Sich Anwendungen überlegen&lt;br /&gt;
* Anwendungen programmieren&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
==Allgemeine Daten und Tabellen==&lt;br /&gt;
&lt;br /&gt;
===Stecker===&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Stecker || Pins || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| ST1 || 10 || UART_TTL Wannenstecker (RX, TX, RTS, +5V *, GND)&lt;br /&gt;
|-&lt;br /&gt;
| ST2 || 4 || Suspend, RI, DTR, DSR an ST1&lt;br /&gt;
|-&lt;br /&gt;
| ST3 || 4 || TX, RX, RTS, CTS von UM2102 ODER RS232-TTL **&lt;br /&gt;
|-&lt;br /&gt;
| ST4 || 5 || Suspend, RI, DTR, DCD, DSR von UM2102&lt;br /&gt;
|-&lt;br /&gt;
| ST5 || 2 || 3,3 V, GND von UM2102&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Zu *)'''  Falls JP7 = ON!&lt;br /&gt;
&lt;br /&gt;
'''Zu **)''' Abhängig von JP1..JP4!&lt;br /&gt;
&lt;br /&gt;
====ST1 (UART_TTL)====&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Pin || Funktion || E/A || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || VDD || || +5 V&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || || Masse&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Suspend || A || Suspend (= ST2: 1)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || n.c. || ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || RI || E || Ring Indicator (= ST2: 2)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DSR || E || Data Set Ready (= ST2: 4)&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DTR || A || Data Terminal Ready (= ST2: 3)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || RX || E || Receive Data (= ST3: 2)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || TX || A || Transmit Data (= ST3: 1)&lt;br /&gt;
|-&lt;br /&gt;
| 10 || RTS || A || Request to Send (= ST3: 3)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Belegung dieses Steckers entspricht dem Stecker PROG des RP6 USB Interface und des RP6V2-TRANS. Das bedeutet, dass das 10-polige Flachkabel, das mit den beiden RP6 USB Interfaces mitgeliefert wird, auch für die Verbindung zwischen diesem Stecker UART_TTL und dem Wannenstecker PROG_UART des RP6-Systems (Base, M32, M128, M256 WiFi) verwendet werden kann.&lt;br /&gt;
 Will man ein eigenes Flachkabel für diese Verbindung herstellen,&lt;br /&gt;
 ist zu beachten, dass das Flachkabel '''gedreht''' (aus Pin 1 wird 10,&lt;br /&gt;
 aus Pin 2 wird 9, usw.) einzubauen ist!&lt;br /&gt;
Die Signale Suspend, RI, DSR und DTR werden zur Verbindung mit dem RP6-System nicht benötigt.&lt;br /&gt;
&lt;br /&gt;
====ST2====&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Pin || Funktion || E/A || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Suspend || A || = ST1: 3&lt;br /&gt;
|-&lt;br /&gt;
| 2 || RI || E || = ST1: 5&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DTR || A || = ST1: 7&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DSR || E || = ST1: 6&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====ST3====&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Pin || Funktion || E/A || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TX || A || Transmit Data (= ST1: 9)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || RX || E || Receive Data (= ST1: 8)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || RTS || A || Request to Send (= ST1: 10)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || CTS || E || Clear to Send&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
An diesem Stecker ST3 sind alle Signale vorhanden, die für die Kommunikation zwischen einem µC des RP6-Systems und einem USB-Port bzw. einer RS232-Schnittstelle relevant sind. Von diesem Stecker können die Schnittstellen-Signale (in der Regel werden nur TX, RX benötigt!) direkt zum UART auf einer der Platinen des RP6-Systems geführt werden.&lt;br /&gt;
&lt;br /&gt;
 '''ACHTUNG:'''&lt;br /&gt;
 ==&amp;gt; RX und TX kreuzen (d.h. µC:RX an ST3:TX und µC:TX an ST3:RX)!!!&lt;br /&gt;
 ==&amp;gt; TX und RTS dürfen nur mit µC-Eingängen verbunden werden!!!&lt;br /&gt;
&lt;br /&gt;
====ST4====&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Pin || Funktion || E/A || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Suspend || A || Suspend (von UM2102)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || RI || E || Ring Indicator (von UM2102)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DTR || A || Data Terminal Ready (von UM2102)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DCD || E || Data Carrier Detect (von UM2102)&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DSR || E || Data Set Ready (von UM2102)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
An diesem Stecker ST4 liegen Signale der seriellen Schnittstelle vom UM2102, die normalerweise nicht benötigt werden. Wenn Suspend, RI, DTR, DSR an ST1 (UART_TTL) genutzt werden sollen, kann man eine Drahtverbindung der Pins 1..3 und 5 dieses Steckers zu ST2 herstellen.&lt;br /&gt;
&lt;br /&gt;
====ST5====&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Pin || Funktion || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || + 3,3 V || 3,3 V / max. 100 mA (von UM2102)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || Masse&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
An diesem Stecker ST5 kann man eine Spannung von 3,3 V abnehmen, die vom UM2102 zur Verfügung gestellt wird. Der Ausgang darf maximal mit 100 mA belastet werden.&lt;br /&gt;
&lt;br /&gt;
====USRBUS====&lt;br /&gt;
&lt;br /&gt;
Der USRBUS stellt 14 Verbindungen zwischen den µC-Platinen (RP6Base, M32 und M128) und Experimentierplatinen, die man selbst gebaut hat, zur Verfügung. Die 14 Pins können frei belegt werden.&lt;br /&gt;
&lt;br /&gt;
Eine mögliche Belegung habe ich [http://www.roboternetz.de/community/threads/29281-RP6-USRBUS hier] vorgeschlagen.&lt;br /&gt;
Wenn man diesem Vorschlag folgt, ist RX des µCs an Y6, TX an Y8 und RST an Y10 des USRBUS zu finden. Natürlich muss man dann auf der jeweiligen µC-Platine oder Exp eine Verbindung der USRBUS-Pins (Y6, Y8) zum UART herstellen.&lt;br /&gt;
&lt;br /&gt;
Auf dieser Exp muss man JP8..10 schließen, wenn man den USRBUS auf diese Weise nutzen will.&lt;br /&gt;
&lt;br /&gt;
====UARTs====&lt;br /&gt;
&lt;br /&gt;
Im RP6-System sind die Hardware-UARTs an folgenden Steckern/Pins zu finden:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Platine || UART || RX || TX || RX an Stecker || TX an Stecker&lt;br /&gt;
|-&lt;br /&gt;
| RP6v2Base || 0 || PD0 || PD1 || PROGU: 2 * || PROGU: 3 *&lt;br /&gt;
|-&lt;br /&gt;
| RP6 CONTROL M32 || 0 || PD0 || PD1 || PROGU: 2  **|| PROGU: 3 **&lt;br /&gt;
|-&lt;br /&gt;
| RP6 CCPRO M128 || 0 || PE0 || PE1 || PROGU: 2 || PROGU: 3&lt;br /&gt;
|-&lt;br /&gt;
| || 1 || PD2 || PD3 || I/O: 8 || I/O: 7&lt;br /&gt;
|-&lt;br /&gt;
| RP6v2 M256 WIFI || 0 || PE0 || PE1 || PROGU: 2 || PROGU: 3&lt;br /&gt;
|-&lt;br /&gt;
| || 1 || PD2 || PD3 || USPI15: 8 || USPI15: 6&lt;br /&gt;
|-&lt;br /&gt;
| || 2 || PH0 || PH1 || USPI24: 8 || USPI24: 6&lt;br /&gt;
|-&lt;br /&gt;
| || 3 || PJ0 || PJ1 || n.c. ***|| n.c. ***&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Zu *)''' Kann man auch am Stecker &amp;quot;[[RP6#Serielle_Schnittstelle]]&amp;quot; auf dem RP6 Mainboard anschliessen!&lt;br /&gt;
&lt;br /&gt;
'''Zu **)''' Kann man auch am Stecker &amp;quot;[[RP6#Serielle_Schnittstelle_2]]&amp;quot; auf der M32 Platine anschliessen!&lt;br /&gt;
&lt;br /&gt;
'''Zu ***)''' Fest verbunden mit dem WLAN Modul, daher nicht nutzbar! &lt;br /&gt;
&lt;br /&gt;
 '''Stecker-Kürzel:'''&lt;br /&gt;
 PROGU   PROG_UART&lt;br /&gt;
 USPI15  UART_SPI1/T5&lt;br /&gt;
 USPI24  UART_SPI2/T4&lt;br /&gt;
&lt;br /&gt;
===Jumper===&lt;br /&gt;
&lt;br /&gt;
Zeichenerklärung:&lt;br /&gt;
* Zweipolige Jumper:&lt;br /&gt;
** Stellung ON = Jumper aufgesteckt (Kontakt geschlossen) &lt;br /&gt;
** Stellung OFF = Jumper abgezogen (Kontakt offen) &lt;br /&gt;
* Dreipolige Jumper:&lt;br /&gt;
** Stellung U = Jumper links * aufgesteckt&lt;br /&gt;
** Stellung R = Jumper rechts * aufgesteckt&lt;br /&gt;
&lt;br /&gt;
'''Zu *)''' Platine so gesehen, wie im Bestückungsplan!&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Jumper || Stellung || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| JP1 || U (S) || TX von USB&lt;br /&gt;
|-&lt;br /&gt;
| JP1 || R || TX von RS232&lt;br /&gt;
|-&lt;br /&gt;
| JP2 || U (S) || RX von USB&lt;br /&gt;
|-&lt;br /&gt;
| JP2 || R || RX von RS232&lt;br /&gt;
|-&lt;br /&gt;
| JP3 || U (S) || CTS von USB&lt;br /&gt;
|-&lt;br /&gt;
| JP3 || R || CTS von RS232&lt;br /&gt;
|-&lt;br /&gt;
| JP4 || U (S) || RTS von USB&lt;br /&gt;
|-&lt;br /&gt;
| JP4 || R || RTS von RS232&lt;br /&gt;
|-&lt;br /&gt;
| JP5 || ON || RS232-TTL-Wandler Power ON&lt;br /&gt;
|-&lt;br /&gt;
| JP5 || OFF (S) || RS232-TTL-Wandler Power OFF&lt;br /&gt;
|-&lt;br /&gt;
| JP6 || ON || Power für UM2102 auch von UART_TTL Stecker (Pin 1)&lt;br /&gt;
|-&lt;br /&gt;
| JP6 || OFF (S) || Power für UM2102 nur vom PC über USB-Stecker&lt;br /&gt;
|-&lt;br /&gt;
| JP7 || ON || +5 V Verbindung zwischen XBUS: VDD und UART_TTL Stecker (Pin 1)&lt;br /&gt;
|-&lt;br /&gt;
| JP7 || OFF (S) || Keine +5 V Verbindung zwischen XBUS und UART_TTL Stecker&lt;br /&gt;
|-&lt;br /&gt;
| JP8 || ON || TX an USRBUS RX (Pin Y6)&lt;br /&gt;
|-&lt;br /&gt;
| JP8 || OFF (S) || TX nicht an USRBUS&lt;br /&gt;
|-&lt;br /&gt;
| JP9 || ON || RTS an USRBUS RST (Pin Y10)&lt;br /&gt;
|-&lt;br /&gt;
| JP9 || OFF (S) || RTS nicht an USRBUS&lt;br /&gt;
|-&lt;br /&gt;
| JP10 || ON || RX an USRBUS TX (Pin Y8)&lt;br /&gt;
|-&lt;br /&gt;
| JP10 || OFF (S) || RX nicht an USRBUS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Zu (S)''' Standard-Stellung der Jumper ('''USB-UART-Betrieb über UART_TTL Stecker''')!&lt;br /&gt;
&lt;br /&gt;
 '''Hinweis:''' JP1 bis JP4 IMMER in dieselbe Stellung (U oder R) bringen!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=RP6v2 USB-RS232-Adapter: Software=&lt;br /&gt;
&lt;br /&gt;
Nutzt man die UARTs, die am PROG_UART Stecker der RP6Base, M32, M128 oder M256 WiFi liegen, mit dieser Adapter-Platine (siehe Tabelle [[RP6v2_USB-RS232-Adapter#UARTs]]!), kann man zum seriellen Lesen und Schreiben von Daten die Funktionen der vorhandenen UART-Libraries verwenden.&lt;br /&gt;
&lt;br /&gt;
Befehle für den Zugriff auf UART1 der RP6 CCPRO M128 sind in CompactC und BASIC des C-Control-Pro Systems enthalten (siehe Kapitel 6.19 RS232 der C-Control-Pro Anleitung!). Der Parameter ''serport'' der seriellen Funktionen muss auf 1 gesetzt werden, um den UART1 anzusprechen.&lt;br /&gt;
&lt;br /&gt;
Es bleibt die Frage, wie man mit den vertrauten Funktionen der RP6M256-UART-Library auf UART1 und UART2 der M256 WiFi zugreifen kann.&lt;br /&gt;
&lt;br /&gt;
Das ist recht einfach möglich, indem man die RP6M256uart Library anpasst.&lt;br /&gt;
&lt;br /&gt;
==RP6M256uart1 Library==&lt;br /&gt;
&lt;br /&gt;
Hier z.B. die Anpassung der RP6M256uart Library an '''UART1''':&lt;br /&gt;
&lt;br /&gt;
Datei RP6M256uart1.h:&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ------------------- [c]2011 / 2012 - AREXX ENGINEERING ---------------------&lt;br /&gt;
 * -------------------------- http://www.arexx.com/ ---------------------------&lt;br /&gt;
 * --------------------------- All rights reserved ----------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256uart1.h&lt;br /&gt;
 * Version: 1.1 - 24.02.2012&lt;br /&gt;
 * Target: RP6 CONTROL M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dominik S. Herwald&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * The M256 uart1 function Library header file. Detailled description&lt;br /&gt;
 * of each function can be found in the RP6M256uart1.c file!&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * CHANGELOG AND LICENSING INFORMATION CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6UART1_H&lt;br /&gt;
#define RP6UART1_H&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt; 	// Program memory (=Flash ROM) access routines.&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;			// C standard functions (e.g. itoa...)&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;			// I/O Port definitions&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;	// Interrupt macros (e.g. cli(), sei())&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// UART1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// TX:&lt;br /&gt;
&lt;br /&gt;
void writeChar1(char ch);&lt;br /&gt;
void writeStringLength1(char *data, uint8_t length, uint8_t offset);&lt;br /&gt;
void writeString1(char *data);&lt;br /&gt;
void writeNStringP1(const char *pstring);&lt;br /&gt;
#define writeString_P1(__pstr) writeNStringP1((PSTR(__pstr)))&lt;br /&gt;
&lt;br /&gt;
#define HEX 16&lt;br /&gt;
#define DEC 10&lt;br /&gt;
#define OCT 8&lt;br /&gt;
#define BIN 2&lt;br /&gt;
void writeInteger1(int16_t number, uint8_t base);&lt;br /&gt;
void write32BitInteger1(int32_t number, uint8_t base);&lt;br /&gt;
void writeIntegerLength1(int16_t number, uint8_t base, uint8_t length);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// RX:&lt;br /&gt;
extern volatile uint8_t uart1_status;&lt;br /&gt;
&lt;br /&gt;
#define UART1_RECEIVE_BUFFER_SIZE 500&lt;br /&gt;
#define UART1_BUFFER_OK 0&lt;br /&gt;
#define UART1_BUFFER_OVERFLOW 1&lt;br /&gt;
&lt;br /&gt;
char readChar1(void);&lt;br /&gt;
uint16_t readChars1(char *buf, uint16_t numberOfChars);&lt;br /&gt;
uint16_t getBufferLength1(void);&lt;br /&gt;
void clearReceptionBuffer1(void);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256uart1.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Bugs, feedback, questions and modifications can be posted on the AREXX Forum&lt;br /&gt;
 * on http://www.arexx.com/forum/ !&lt;br /&gt;
 * Of course you can also write us an e-mail to: info@arexx.nl&lt;br /&gt;
 * AREXX Engineering may publish updates from time to time on AREXX.com!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * - LICENSE -&lt;br /&gt;
 * GNU GPL v2 (http://www.gnu.org/licenses/gpl.txt, a local copy can be found&lt;br /&gt;
 * on the RP6 CD in the RP6 sorce code folders!)&lt;br /&gt;
 * This program is free software. You can redistribute it and/or modify&lt;br /&gt;
 * it under the terms of the GNU General Public License version 2 as published&lt;br /&gt;
 * by the Free Software Foundation.&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei RP6M256uart1.c:&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ------------------- [c]2011 / 2012 - AREXX ENGINEERING ---------------------&lt;br /&gt;
 * -------------------------- http://www.arexx.com/ ---------------------------&lt;br /&gt;
 * --------------------------- All rights reserved ----------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256uart1.c&lt;br /&gt;
 * Version: 1.1 - 16.07.2012&lt;br /&gt;
 * Target: RP6 CONTROL M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dominik S. Herwald&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 *&lt;br /&gt;
 * The M256 UART1 Library. (UART = &amp;quot;Universal Aynchronous Receiver Transceiver&amp;quot;)&lt;br /&gt;
 *&lt;br /&gt;
 * It contains data transfer functions for the UART (1). &lt;br /&gt;
 * Reception is Interrupt based with a circular buffer.&lt;br /&gt;
 *&lt;br /&gt;
 * --------&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You should better leave all this as it is if you just started with&lt;br /&gt;
 * C programming, but it is a good idea to read the comments and review the&lt;br /&gt;
 * code, it will help you to understand C programming for AVR better.&lt;br /&gt;
 *&lt;br /&gt;
 * Of course you are free to add new functions and improvements to this&lt;br /&gt;
 * library and make them available to the public on the Internet.&lt;br /&gt;
 * Please use the changelog at the end of this file to document your&lt;br /&gt;
 * changes. And add your name (or nickname) to any new function or &lt;br /&gt;
 * modification you added! E.g. a &amp;quot;modified by &amp;lt;nickname&amp;gt; at &amp;lt;date&amp;gt;&amp;quot; is &lt;br /&gt;
 * always a good idea to show other users where and what you changed the &lt;br /&gt;
 * source code!&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * CHANGELOG AND LICENSING INFORMATION CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256uart1.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// UART1 transmit functions:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a single character to the UART1.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			writeChar1('R');&lt;br /&gt;
 *			writeChar1('P');&lt;br /&gt;
 *			writeChar1('6');&lt;br /&gt;
 *			writeChar1('\n');&lt;br /&gt;
 *			// '\n' is a special code for the &amp;quot;new line&amp;quot; character!&lt;br /&gt;
 *			writeChar1('0');&lt;br /&gt;
 *			writeChar1(48); // 48 is ASCII code for '0'&lt;br /&gt;
 *			writeChar1(49); // 1&lt;br /&gt;
 *			writeChar1(50); // 2&lt;br /&gt;
 *			writeChar1(51); // 3&lt;br /&gt;
 *			//...&lt;br /&gt;
 *&lt;br /&gt;
 *			would output:&lt;br /&gt;
 *			RP6&lt;br /&gt;
 *			00123&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void writeChar1(char ch)&lt;br /&gt;
{&lt;br /&gt;
    while (!(UCSR1A &amp;amp; (1&amp;lt;&amp;lt;UDRE1)));&lt;br /&gt;
    UDR1 = (uint8_t)ch;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a null terminated string or buffer from SRAM to UART1.&lt;br /&gt;
 * Make sure that it really IS null terminated!&lt;br /&gt;
 * (&amp;quot;null terminated&amp;quot; means that the string has a null (=0) at the end.&lt;br /&gt;
 * this is automatically added to it by the compiler when you put the&lt;br /&gt;
 * string in double quotes like this: writeString1(&amp;quot;test&amp;quot;);  )&lt;br /&gt;
 *&lt;br /&gt;
 * ATTENTION: This fills up SRAM Memory with the&lt;br /&gt;
 * strings, even if they are constant and never changed.&lt;br /&gt;
 * If you want to write constant text strings to the UART1, better use&lt;br /&gt;
 * writeNStringP1(const uint8_t *pstring) (s. below), which reads the&lt;br /&gt;
 * text from flash program memory and does not fill up the SRAM with&lt;br /&gt;
 * the string data!&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			writeString1(&amp;quot;RP6 Robot System\n&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void writeString1(char *string)&lt;br /&gt;
{&lt;br /&gt;
	while(*string)&lt;br /&gt;
		writeChar1(*string++);&lt;br /&gt;
}&lt;br /&gt;
		&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a null terminated string from flash program memory to UART1.&lt;br /&gt;
 * You can use the macro writeString_P1(STRING); , this macro&lt;br /&gt;
 * ensures that the String is stored in program memory only!&lt;br /&gt;
 * Otherwise you need to use PSTR(&amp;quot;your string&amp;quot;) from AVRLibC for this. &lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			writeNStringP1(PSTR(&amp;quot;RP6 Robot System\n&amp;quot;));&lt;br /&gt;
 *&lt;br /&gt;
 *			// There is also a Macro that makes life easier and&lt;br /&gt;
 *			// you can simply write:&lt;br /&gt;
 *			writeString_P1(&amp;quot;RP6 Robot System\n&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void writeNStringP1(const char *pstring)&lt;br /&gt;
{&lt;br /&gt;
    uint8_t c;&lt;br /&gt;
    for (;(c = pgm_read_byte_near(pstring++));writeChar1(c));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a string with specified length and offset from SRAM to UART1.&lt;br /&gt;
 * If it is a null terminated string, output will be stopped at the&lt;br /&gt;
 * end! It does not need to be null terminated, but it is recommended&lt;br /&gt;
 * to use only null terminated strings/buffers, otherwise the function could&lt;br /&gt;
 * output any SRAM memory data stored after the string until it reaches a 0&lt;br /&gt;
 * or the specified length.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			writeStringLength1(&amp;quot;RP6 Robot Sytem\n&amp;quot;,16,0);&lt;br /&gt;
 *			// would output: &amp;quot;RP6 Robot Sytem\n&amp;quot;&lt;br /&gt;
 *			writeStringLength1(&amp;quot;RP6 Robot Sytem\n&amp;quot;,11,4);&lt;br /&gt;
 *			// would output: &amp;quot;Robot System&amp;quot;&lt;br /&gt;
 * 			writeStringLength1(&amp;quot;RP6 Robot Sytem\n&amp;quot;,40,4);&lt;br /&gt;
 *			// would output: &amp;quot;Robot System\n&amp;quot;&lt;br /&gt;
 *			// No matter if the specified length is 40 characters!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void writeStringLength1(char *string, uint8_t length, uint8_t offset)&lt;br /&gt;
{&lt;br /&gt;
	for(string = &amp;amp;string[offset]; *string &amp;amp;&amp;amp; length; length--)&lt;br /&gt;
		writeChar1(*string++);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a number (with specified base) to the UART1.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a hexadecimal number to the UART1:&lt;br /&gt;
 *			writeInteger1(0xAACC,16);&lt;br /&gt;
 *			// Instead of 16 you can also write &amp;quot;HEX&amp;quot; as this is defined in the&lt;br /&gt;
 *			// RP6M256uart1.h :&lt;br /&gt;
 *			writeInteger1(0xAACC, HEX);&lt;br /&gt;
 *			// Other Formats:&lt;br /&gt;
 *			writeInteger1(1024,DEC);  	// Decimal&lt;br /&gt;
 *			writeInteger1(044,OCT);		// Ocal&lt;br /&gt;
 *			writeInteger1(0b11010111,BIN); // Binary&lt;br /&gt;
 */&lt;br /&gt;
void writeInteger1(int16_t number, uint8_t base)&lt;br /&gt;
{&lt;br /&gt;
	char buffer[17];&lt;br /&gt;
	itoa(number, &amp;amp;buffer[0], base);&lt;br /&gt;
	writeString1(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a 32 Bit number (with specified base) to the UART1.&lt;br /&gt;
 * Usage is the same as writeInteger1.&lt;br /&gt;
 */&lt;br /&gt;
void write32BitInteger1(int32_t number, uint8_t base)&lt;br /&gt;
{&lt;br /&gt;
	char buffer[33];&lt;br /&gt;
	ltoa(number, &amp;amp;buffer[0], base);&lt;br /&gt;
	writeString1(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Same as writeInteger1, but with defined length.&lt;br /&gt;
 * This means this routine will add leading zeros to the number if length is&lt;br /&gt;
 * larger than the actual value or cut the upper digits if length is smaller&lt;br /&gt;
 * than the actual value.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a hexadecimal number to the UART1:&lt;br /&gt;
 *			writeIntegerLength1(0xAACC, 16, 8);&lt;br /&gt;
 *			// Instead of 16 you can also write &amp;quot;HEX&amp;quot; as this is defined in the&lt;br /&gt;
 *			// RP6M256uart1.h :&lt;br /&gt;
 *			writeIntegerLength1(0xAACC, HEX, 8);&lt;br /&gt;
 *			// Other Formats:&lt;br /&gt;
 *			writeIntegerLength1(1024,DEC,6);  	// Decimal&lt;br /&gt;
 *			writeIntegerLength1(044,OCT,4);		// Ocal&lt;br /&gt;
 *			writeIntegerLength1(0b11010111,BIN,8); // Binary&lt;br /&gt;
 */&lt;br /&gt;
void writeIntegerLength1(int16_t number, uint8_t base, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	char buffer[17];&lt;br /&gt;
	itoa(number, &amp;amp;buffer[0], base);&lt;br /&gt;
	int8_t cnt = length - strlen(buffer);&lt;br /&gt;
	if(cnt &amp;gt; 0) {&lt;br /&gt;
		for(; cnt &amp;gt; 0; cnt--, writeChar1('0'));&lt;br /&gt;
		writeString1(&amp;amp;buffer[0]);&lt;br /&gt;
	}&lt;br /&gt;
	else &lt;br /&gt;
		writeStringLength1(&amp;amp;buffer[0],length,-cnt);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// UART1 receive functions:&lt;br /&gt;
&lt;br /&gt;
volatile char uart1_receive_buffer[UART1_RECEIVE_BUFFER_SIZE+1];&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t uart1_status;&lt;br /&gt;
&lt;br /&gt;
uint16_t read_pos1 = 0;&lt;br /&gt;
uint16_t write_pos1 = 0; &lt;br /&gt;
uint16_t read_size1 = 0;&lt;br /&gt;
uint16_t write_size1 = 0;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * UART1 receive ISR.&lt;br /&gt;
 * Handles reception to circular buffer.&lt;br /&gt;
 */&lt;br /&gt;
ISR(USART1_RX_vect)&lt;br /&gt;
{	&lt;br /&gt;
	static volatile uint8_t dummy;&lt;br /&gt;
	if(((uint16_t)(write_size1 - read_size1)) &amp;lt; UART1_RECEIVE_BUFFER_SIZE) {&lt;br /&gt;
		uart1_receive_buffer[write_pos1++] = UDR1;&lt;br /&gt;
		write_size1++;&lt;br /&gt;
		if(write_pos1 &amp;gt; UART1_RECEIVE_BUFFER_SIZE) &lt;br /&gt;
			write_pos1 = 0;&lt;br /&gt;
		uart1_status = UART1_BUFFER_OK;&lt;br /&gt;
	}&lt;br /&gt;
	else {	&lt;br /&gt;
		dummy = UDR1;&lt;br /&gt;
		uart1_status = UART1_BUFFER_OVERFLOW;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Read a char from the circular buffer. &lt;br /&gt;
 * The char is removed from the buffer (or more precise: not accessible directly anymore&lt;br /&gt;
 * and will be overwritten as soon as new data becomes available)!&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 * // [...]&lt;br /&gt;
 * if(getBufferLength1()) 		&lt;br /&gt;
 *	   receivedData[data_position++] = readChar1();&lt;br /&gt;
 * // [...]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
char readChar1(void)&lt;br /&gt;
{&lt;br /&gt;
	uart1_status = UART1_BUFFER_OK;&lt;br /&gt;
	if(((uint16_t)(write_size1 - read_size1)) &amp;gt; 0) {&lt;br /&gt;
		read_size1++;&lt;br /&gt;
		if(read_pos1 &amp;gt; UART1_RECEIVE_BUFFER_SIZE) &lt;br /&gt;
			read_pos1 = 0;&lt;br /&gt;
		return uart1_receive_buffer[read_pos1++];&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Same as readChar1, but this function copies numberOfChars chars from the&lt;br /&gt;
 * circular buffer to buf. &lt;br /&gt;
 * It also returns the number of characters really copied to the buffer! &lt;br /&gt;
 * Just in case that there were fewer chars in the buffer...&lt;br /&gt;
 */&lt;br /&gt;
uint16_t readChars1(char *buf, uint16_t numberOfChars)&lt;br /&gt;
{&lt;br /&gt;
	uint16_t i = 0;&lt;br /&gt;
	uart1_status = UART1_BUFFER_OK;&lt;br /&gt;
	while(((uint16_t)(write_size1 - read_size1)) &amp;gt; 0 &amp;amp;&amp;amp; i &amp;lt; numberOfChars) {&lt;br /&gt;
		read_size1++;&lt;br /&gt;
		buf[i++] = uart1_receive_buffer[read_pos1++];&lt;br /&gt;
		if(read_pos1 &amp;gt; UART1_RECEIVE_BUFFER_SIZE) &lt;br /&gt;
			read_pos1 = 0;&lt;br /&gt;
	}&lt;br /&gt;
	return i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns the current number of elements in the buffer.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 * s. readChar1 function above!&lt;br /&gt;
 */&lt;br /&gt;
uint16_t getBufferLength1(void)&lt;br /&gt;
{&lt;br /&gt;
	return (((uint16_t)(write_size1 - read_size1)));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Clears the reception buffer - it disables UART1 Receive &lt;br /&gt;
 * interrupt for a short period of time. &lt;br /&gt;
 */&lt;br /&gt;
void clearReceptionBuffer1(void)&lt;br /&gt;
{&lt;br /&gt;
	static uint8_t dummy;&lt;br /&gt;
	UCSR1B &amp;amp;= ~(1 &amp;lt;&amp;lt; RXCIE1); // disable UART1 RX Interrupt&lt;br /&gt;
	dummy = UDR1;&lt;br /&gt;
	read_pos1 = 0;&lt;br /&gt;
	write_pos1 = 0; &lt;br /&gt;
	read_size1 = 0;&lt;br /&gt;
	write_size1 = 0;&lt;br /&gt;
	uart1_status = UART1_BUFFER_OK;&lt;br /&gt;
	UCSR1B |= (1 &amp;lt;&amp;lt; RXCIE1); // enable Interrupt again&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.1 16.07.2012 by Dominik S. Herwald&lt;br /&gt;
 * - v. 1.0 (initial release) 24.02.2012 by Dominik S. Herwald&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Bugs, feedback, questions and modifications can be posted on the AREXX Forum&lt;br /&gt;
 * on http://www.arexx.com/forum/ !&lt;br /&gt;
 * Of course you can also write us an e-mail to: info@arexx.nl&lt;br /&gt;
 * AREXX Engineering may publish updates from time to time on AREXX.com!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * - LICENSE -&lt;br /&gt;
 * GNU GPL v2 (http://www.gnu.org/licenses/gpl.txt, a local copy can be found&lt;br /&gt;
 * on the RP6 CD in the RP6 sorce code folders!)&lt;br /&gt;
 * This program is free software. You can redistribute it and/or modify&lt;br /&gt;
 * it under the terms of the GNU General Public License version 2 as published&lt;br /&gt;
 * by the Free Software Foundation.&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Für den Zugriff auf UART1 wurde allen Funktionsnamen eine &amp;quot;1&amp;quot; angehängt. Aus writeChar (UART0) wird also z.B. '''writeChar1''' (UART1). Für UART2 kann diese Library auf dieselbe Weise angepaßt werden. Die RP6M256uart1 Library kann wie die ursprüngliche Library in eigene Programme eingebunden werden,- natürlich auch ZUSÄTZLICH zur RP6M256uart Library.&lt;br /&gt;
&lt;br /&gt;
===Initialisierung===&lt;br /&gt;
&lt;br /&gt;
Wenn man die RP6M256uart Library auf den UART1 oder UART2 anpasst, muss man die Initialisierung des UARTs im eigenen Hauptprogramm durchführen.&lt;br /&gt;
&lt;br /&gt;
Für '''UART1''' kann das dann so aussehen:&lt;br /&gt;
&amp;lt;pre&amp;gt;	cli();			// Disable global interrupts.&lt;br /&gt;
&lt;br /&gt;
	// UART1:&lt;br /&gt;
	UBRR1H = UBRR_BAUD_LOW &amp;gt;&amp;gt; 8;	// Setup UART1: Baud is Low Speed&lt;br /&gt;
	UBRR1L = (uint8_t) UBRR_BAUD_LOW;&lt;br /&gt;
	UCSR1A = 0x00;&lt;br /&gt;
	UCSR1C = (0&amp;lt;&amp;lt;UMSEL10) | (0&amp;lt;&amp;lt;UMSEL11) | (1&amp;lt;&amp;lt;UCSZ11) | (1&amp;lt;&amp;lt;UCSZ10);&lt;br /&gt;
	UCSR1B = (1 &amp;lt;&amp;lt; TXEN1) | (1 &amp;lt;&amp;lt; RXEN1) | (1 &amp;lt;&amp;lt; RXCIE1);&lt;br /&gt;
&lt;br /&gt;
	clearReceptionBuffer1();&lt;br /&gt;
&lt;br /&gt;
	sei();			// Enable Global Interrupts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Software und USB-Treiber=&lt;br /&gt;
Der Hardwaretreiber wird von Windows nicht automatisch gefunden. Um das USB-Modul verwenden zu können, muss der Treiber manuell installiert werden.&lt;br /&gt;
Für Windows 7 wurde dieser [http://www.silabs.com/Support%20Documents/Software/CP210x_VCP_Win_XP_S2K3_Vista_7.exe Windows Treiber] von SiLabs getestet.&lt;br /&gt;
Treiber fur andere Betriebssysteme können direkt bei ELV oder auch bei [http://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx SiLabs] gefunden werden.&lt;br /&gt;
&lt;br /&gt;
Zum auswerten der empfangenen Daten eignet sich eigentlich jedes COM-Terminal. Es gilt lediglich zu beachten, dass die virtuelle Schnittstelle folgendermassen konfiguriert ist:&lt;br /&gt;
38400 Baud, 8Bit, 1Stop, Parity: None.&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
* [[RP6]]&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6 Kamera - Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2 I2C-Portexpander]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Universal_Serial_Bus USB]&lt;br /&gt;
* [http://de.wikipedia.org/wiki/RS-232 RS232]&lt;br /&gt;
* [[UART]]&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Transistor-Transistor-Logik TTL]&lt;br /&gt;
* [http://www.silabs.com/Support%20Documents/TechnicalDocs/cp2102.pdf CP2102 Datasheet]&lt;br /&gt;
* [http://www.ti.com/lit/ds/symlink/max232.pdf MAX232N Datasheet]&lt;br /&gt;
* [http://www.fairchildsemi.com/ds/1N/1N5818.pdf 1N5817 Datasheet]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Projekte]]&lt;br /&gt;
&lt;br /&gt;
=Autoren=&lt;br /&gt;
--[[Benutzer:Dirk|Dirk]] 17:06, 5. Sep 2012 (CET)&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Filou89|Filou]] 19:20, 26. Sep 2012 (CET)&lt;/div&gt;</summary>
		<author><name>Filou89</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6v2_USB-RS232-Adapter&amp;diff=21151</id>
		<title>RP6v2 USB-RS232-Adapter</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6v2_USB-RS232-Adapter&amp;diff=21151"/>
				<updated>2012-09-26T17:20:20Z</updated>
		
		<summary type="html">&lt;p&gt;Filou89: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=RP6v2 USB-RS232-Adapter: Hardware=&lt;br /&gt;
&lt;br /&gt;
In diesem Projekt soll eine &amp;quot;Exp&amp;quot; ([[RP6#Experimentierplatine]], CONRAD [http://www.conrad.de/ce/de/product/191537/RP6-EXPERIMENTIERPLATINE 191537]) für den [[RP6v2]] (natürlich auch für den [[RP6]]) &amp;quot;gebaut&amp;quot; werden, mit der ein (bei mir) ständig auftretendes &amp;quot;Problem&amp;quot; behoben wird:&lt;br /&gt;
&lt;br /&gt;
Ich brauche eine Verbindung vom Microcontroller (µC) zu einer RS232-Schnittstelle oder zum USB-Port eines PCs. Natürlich gibt es schon das mitgelieferte USB Interface des RP6v2 und neuerdings auch das [http://www.conrad.de/ce/de/product/191638/Arexx-RP6-USB-Interface-RP6V2-TRANS RP6V2-TRANS] bei CONRAD, das anstelle des mitgelieferten Exemplars verwendet werden kann. Die [[RP6v2#RP6v2_M256_WiFi_Platine]] hat aber z.B. noch zwei freie USARTs, die ich gern eigenständig und unabhängig von der seriellen Verbindung zum RobotLoader verwenden will.&lt;br /&gt;
&lt;br /&gt;
Da hilft nur ein eigener USB-UART-Umsetzer. Ich habe mich für dieses Projekt entschieden für den [http://www.elv.de/mini-usb-modul-um2102-komplettbausatz.html UM2102] von ELV. Die Platine ist preisgünstig, super-kompakt und nutzt den CP2102, der kaum Außenbeschaltung braucht. Treiber gibt es für Windows, Mac, WinCE, Linux und für den Direktzugriff auf den CP2102.&lt;br /&gt;
&lt;br /&gt;
Das Projekt soll aber auch noch einen RS232-Pegelwandler vorsehen. Auch das ist (noch) ein typisches Problem (zumindest bei mir, weil ich noch einen PC mit RS232-Schnittstelle habe). Man könnte die kleine Schaltung auch mit einem MAX232N direkt auf der Exp aufbauen, ich habe mich aber aus Platzgründen für den [http://www.pollin.de/shop/dt/MzY5OTgxOTk-/Bausaetze_Module/Bausaetze/RS232_TTL_Wandler_Bausatz.html RS232-TTL-Wandler-Bausatz] von Pollin entschieden. Das ist zwar eine relativ große Platine, die man aber huckepack gut auf der Exp montieren kann.&lt;br /&gt;
&lt;br /&gt;
'''Für die Teile, die man für das ganze Projekt braucht, werden Bestell-Nummern vom [http://www.conrad.de/ce/ großen C] angegeben. Natürlich gibt es auch andere Versender, bei denen es evtl. günstiger wird.'''&lt;br /&gt;
&lt;br /&gt;
Was braucht man allgemein für den Aufbau einer Schaltung auf der Exp:&lt;br /&gt;
* Seitenschneider, Schere, Zange&lt;br /&gt;
* Lötkolben 25..30 Watt, Lötzinn&lt;br /&gt;
* Plastik 70 Schutzlack (CONRAD 813621)&lt;br /&gt;
* Isolierter Schaltdraht YV 0,20 mm² (CONRAD 606065)&lt;br /&gt;
* Versilberter CU-Draht 0,6 mm (CONRAD 605581)&lt;br /&gt;
&lt;br /&gt;
Mit dem versilberten CU-Draht stellt man auf der Unterseite (= Lötseite) der Exp Verbindungen zwischen den Bauteilen her; mit dem isolierten Schaltdraht werden Drahtbrücken auf der Oberseite (= Bestückungsseite) der Exp eingesetzt. Die Lage der Verbindungen zeige ich im Bestückungsplan. Man muss sich nicht an die genaue Lage der Verbindungen halten.&lt;br /&gt;
&lt;br /&gt;
'''Wenn man die Drähte und Bauteile an anderen Positionen einlötet, kann es aber sein, dass man die weitere Schaltung nicht mehr so aufbauen kann, wie ich das hier zeige! Möglicherweise sind die weiteren Teile dann nur noch mit einer &amp;quot;wilden&amp;quot; Freiverdrahtung machbar!'''&lt;br /&gt;
&lt;br /&gt;
==Aufbau==&lt;br /&gt;
Man braucht folgende Bauteile (Bestell-Nummern [http://www.conrad.de/ce/ CONRAD]):&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Anzahl || Bestell-Nr. || Bauteil-Bezeichnung:&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 191537 || RP6 Experimentierplatine&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.elv.de/ ELV] || Mini-USB-UART-Umsetzer UM2102&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.pollin.de/shop/index.html Pollin] || RS232-TTL-Wandler-Bausatz&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 168274 || Schottky-Diode 1N5817&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 736950 || Wannenstecker gewinkelt, 2 x 5-polig&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 741119 || 1-reihige Stiftleiste RM 2,54 mm (36-polig)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 742902 || Zehn Codierbrücken (aus Set)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 526630 || M3-Abstandbolzen 10 mm&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 815624 || Vier Muttern M3 (aus Set)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 815322 || Vier Schrauben M3 (aus Set)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Hier erst einmal der Schaltplan:&lt;br /&gt;
&lt;br /&gt;
[[bild:RP6_RS232_USB_SP.JPG]] &lt;br /&gt;
&lt;br /&gt;
Und dann der Bestückungsplan:&lt;br /&gt;
&lt;br /&gt;
[[bild:RP6_RS232_USB.JPG]] &lt;br /&gt;
&lt;br /&gt;
Ich habe die Drahtbrücken aus isoliertem Schaltdraht (es sind 33) rot eingezeichnet. Sie werden auf der '''Oberseite''' der Experimentierplatine bestückt!&lt;br /&gt;
&lt;br /&gt;
Zunächst wird der RS232-TTL-Wandler-Bausatz nach Anleitung aufgebaut. Die drei 2-poligen Anschlussklemmen werden NICHT eingelötet.&lt;br /&gt;
In die Experimentierplatine werden 4 Löcher (mit 3,2 mm Durchmesser) an den im Bestückungsplan hellgrün gekennzeichneten Stellen gebohrt. Hier werden die vier M3-Abstandbolzen 10 mm mit Muttern M3 eingesetzt. Darauf wird später die RS232-TTL-Wandler-Platine montiert.&lt;br /&gt;
&lt;br /&gt;
Die UM2102-Platine wird vorbereitet, indem zwei 5-polige und eine 6-polige Stiftleiste RM 2,54 mm auf der Lötseite direkt anliegend eingelötet werden.&lt;br /&gt;
&lt;br /&gt;
Danach werden alle Leiterbahnen, Brücken, Stecker und Jumper hergestellt und zum Schluß die UM2102-Platine an ihren Platz gelötet. Auf der Lötseite der RS232-TTL-Wandler-Platine werden 6 kurze Stücke (~ 2 cm) isolierte Schaltlitze (z.B. CONRAD 605808 o.ä.) an die Punkte +5V, Masse, CTS, RTS, TXD, RXD angelötet. Anschließend werden diese 6 Litzen auf der Exp an den gekennzeichneten Stellen angelötet, und die RS232-TTL-Wandler-Platine wird auf den Abstandbolzen mit Schrauben M3 befestigt.&lt;br /&gt;
&lt;br /&gt;
Viel Erfolg beim Aufbau!&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;br /&gt;
Will man zunächst den '''Mini-USB-UART-Umsetzer''' grob testen, werden die Jumper auf JP1 bis JP4 in Stellung &amp;quot;U&amp;quot; aufgesteckt. Alle anderen Jumper bleiben offen. Dann schließt man ihn mit einem USB-A zu Mini-USB Adapterkabel an einen PC an. Die UM2102-Platine sollte z.B. in Windows 7 problemlos erkannt werden. Falls ein VCP-Treiber nicht gefunden wird bzw. ein anderes Betriebssystem verwendet wird, finden sich die notwendigen '''Treiber''' [http://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx hier]. Der Mini-USB-UART-Umsetzer dürfte in Ordnung sein, wenn er vom Betriebssystem erkannt wird. Die komplette Funktion läßt sich aber nur prüfen, wenn man die Übertragung vom Microcontroller zum PC und umgekehrt ausführlich testet.&lt;br /&gt;
Das kann man z.B. tun, indem man ST1 (UART_TTL) mit dem 10-poligen Flachkabel des RP6 USB Interface (oder des RP6V2-TRANS) mit dem PROG_UART Stecker der RP6v2Base, M32, M128 oder M256 WiFi verbindet.&lt;br /&gt;
 '''ACHTUNG:''' Kein anderes (1:1) Flachkabel verwenden!!!&lt;br /&gt;
Die seriellen Ausgaben jedes beliebigen µC-Programms müßten dann auf einem '''Terminal-Programm''' (siehe auch [[RP6_-_Programmierung#Geeignete_Terminals]]!) auf dem PC zu empfangen sein. Damit ist die UART-USB Übertragung (zumindest in EINE Richtung) erfolgreich getestet.&lt;br /&gt;
&lt;br /&gt;
Genau so kann man den '''RS232-TTL-Wandler''' testen: JP1 bis JP4 von Stellung &amp;quot;U&amp;quot; umstecken in die andere (rechte) Stellung. JP5 aufstecken. Alle anderen Jumper bleiben offen. Der RS232-TTL-Wandler wird mit einem 1:1 Sub-D Kabel (9-polig, Stecker-Buchse) mit der RS232-Schnittstelle des PCs verbunden. Wie oben beschrieben wird ST1 (UART_TTL) mit dem Flachkabel des RP6 USB Interface mit dem PROG_UART Stecker der RP6v2Base, M32, M128 oder M256 WiFi verbunden. Auch hier sollte die serielle Verbindung zwischen dem Microcontroller und dem PC-Terminal-Programm in beiden Richtungen möglich sein.&lt;br /&gt;
&lt;br /&gt;
==Letzte Arbeiten==&lt;br /&gt;
&lt;br /&gt;
Was bleibt noch?&lt;br /&gt;
* Wenn die Platine komplett aufgebaut ist, kann man sie mit Plastik 70 Spray auf der Lötseite gegen Korrosion schützen&lt;br /&gt;
* Sich Anwendungen überlegen&lt;br /&gt;
* Anwendungen programmieren&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
==Allgemeine Daten und Tabellen==&lt;br /&gt;
&lt;br /&gt;
===Stecker===&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Stecker || Pins || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| ST1 || 10 || UART_TTL Wannenstecker (RX, TX, RTS, +5V *, GND)&lt;br /&gt;
|-&lt;br /&gt;
| ST2 || 4 || Suspend, RI, DTR, DSR an ST1&lt;br /&gt;
|-&lt;br /&gt;
| ST3 || 4 || TX, RX, RTS, CTS von UM2102 ODER RS232-TTL **&lt;br /&gt;
|-&lt;br /&gt;
| ST4 || 5 || Suspend, RI, DTR, DCD, DSR von UM2102&lt;br /&gt;
|-&lt;br /&gt;
| ST5 || 2 || 3,3 V, GND von UM2102&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Zu *)'''  Falls JP7 = ON!&lt;br /&gt;
&lt;br /&gt;
'''Zu **)''' Abhängig von JP1..JP4!&lt;br /&gt;
&lt;br /&gt;
====ST1 (UART_TTL)====&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Pin || Funktion || E/A || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || VDD || || +5 V&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || || Masse&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Suspend || A || Suspend (= ST2: 1)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || n.c. || ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || RI || E || Ring Indicator (= ST2: 2)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DSR || E || Data Set Ready (= ST2: 4)&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DTR || A || Data Terminal Ready (= ST2: 3)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || RX || E || Receive Data (= ST3: 2)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || TX || A || Transmit Data (= ST3: 1)&lt;br /&gt;
|-&lt;br /&gt;
| 10 || RTS || A || Request to Send (= ST3: 3)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Belegung dieses Steckers entspricht dem Stecker PROG des RP6 USB Interface und des RP6V2-TRANS. Das bedeutet, dass das 10-polige Flachkabel, das mit den beiden RP6 USB Interfaces mitgeliefert wird, auch für die Verbindung zwischen diesem Stecker UART_TTL und dem Wannenstecker PROG_UART des RP6-Systems (Base, M32, M128, M256 WiFi) verwendet werden kann.&lt;br /&gt;
 Will man ein eigenes Flachkabel für diese Verbindung herstellen,&lt;br /&gt;
 ist zu beachten, dass das Flachkabel '''gedreht''' (aus Pin 1 wird 10,&lt;br /&gt;
 aus Pin 2 wird 9, usw.) einzubauen ist!&lt;br /&gt;
Die Signale Suspend, RI, DSR und DTR werden zur Verbindung mit dem RP6-System nicht benötigt.&lt;br /&gt;
&lt;br /&gt;
====ST2====&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Pin || Funktion || E/A || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Suspend || A || = ST1: 3&lt;br /&gt;
|-&lt;br /&gt;
| 2 || RI || E || = ST1: 5&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DTR || A || = ST1: 7&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DSR || E || = ST1: 6&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====ST3====&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Pin || Funktion || E/A || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TX || A || Transmit Data (= ST1: 9)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || RX || E || Receive Data (= ST1: 8)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || RTS || A || Request to Send (= ST1: 10)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || CTS || E || Clear to Send&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
An diesem Stecker ST3 sind alle Signale vorhanden, die für die Kommunikation zwischen einem µC des RP6-Systems und einem USB-Port bzw. einer RS232-Schnittstelle relevant sind. Von diesem Stecker können die Schnittstellen-Signale (in der Regel werden nur TX, RX benötigt!) direkt zum UART auf einer der Platinen des RP6-Systems geführt werden.&lt;br /&gt;
&lt;br /&gt;
 '''ACHTUNG:'''&lt;br /&gt;
 ==&amp;gt; RX und TX kreuzen (d.h. µC:RX an ST3:TX und µC:TX an ST3:RX)!!!&lt;br /&gt;
 ==&amp;gt; TX und RTS dürfen nur mit µC-Eingängen verbunden werden!!!&lt;br /&gt;
&lt;br /&gt;
====ST4====&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Pin || Funktion || E/A || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Suspend || A || Suspend (von UM2102)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || RI || E || Ring Indicator (von UM2102)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DTR || A || Data Terminal Ready (von UM2102)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DCD || E || Data Carrier Detect (von UM2102)&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DSR || E || Data Set Ready (von UM2102)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
An diesem Stecker ST4 liegen Signale der seriellen Schnittstelle vom UM2102, die normalerweise nicht benötigt werden. Wenn Suspend, RI, DTR, DSR an ST1 (UART_TTL) genutzt werden sollen, kann man eine Drahtverbindung der Pins 1..3 und 5 dieses Steckers zu ST2 herstellen.&lt;br /&gt;
&lt;br /&gt;
====ST5====&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Pin || Funktion || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || + 3,3 V || 3,3 V / max. 100 mA (von UM2102)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || Masse&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
An diesem Stecker ST5 kann man eine Spannung von 3,3 V abnehmen, die vom UM2102 zur Verfügung gestellt wird. Der Ausgang darf maximal mit 100 mA belastet werden.&lt;br /&gt;
&lt;br /&gt;
====USRBUS====&lt;br /&gt;
&lt;br /&gt;
Der USRBUS stellt 14 Verbindungen zwischen den µC-Platinen (RP6Base, M32 und M128) und Experimentierplatinen, die man selbst gebaut hat, zur Verfügung. Die 14 Pins können frei belegt werden.&lt;br /&gt;
&lt;br /&gt;
Eine mögliche Belegung habe ich [http://www.roboternetz.de/community/threads/29281-RP6-USRBUS hier] vorgeschlagen.&lt;br /&gt;
Wenn man diesem Vorschlag folgt, ist RX des µCs an Y6, TX an Y8 und RST an Y10 des USRBUS zu finden. Natürlich muss man dann auf der jeweiligen µC-Platine oder Exp eine Verbindung der USRBUS-Pins (Y6, Y8) zum UART herstellen.&lt;br /&gt;
&lt;br /&gt;
Auf dieser Exp muss man JP8..10 schließen, wenn man den USRBUS auf diese Weise nutzen will.&lt;br /&gt;
&lt;br /&gt;
====UARTs====&lt;br /&gt;
&lt;br /&gt;
Im RP6-System sind die Hardware-UARTs an folgenden Steckern/Pins zu finden:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Platine || UART || RX || TX || RX an Stecker || TX an Stecker&lt;br /&gt;
|-&lt;br /&gt;
| RP6v2Base || 0 || PD0 || PD1 || PROGU: 2 * || PROGU: 3 *&lt;br /&gt;
|-&lt;br /&gt;
| RP6 CONTROL M32 || 0 || PD0 || PD1 || PROGU: 2  **|| PROGU: 3 **&lt;br /&gt;
|-&lt;br /&gt;
| RP6 CCPRO M128 || 0 || PE0 || PE1 || PROGU: 2 || PROGU: 3&lt;br /&gt;
|-&lt;br /&gt;
| || 1 || PD2 || PD3 || I/O: 8 || I/O: 7&lt;br /&gt;
|-&lt;br /&gt;
| RP6v2 M256 WIFI || 0 || PE0 || PE1 || PROGU: 2 || PROGU: 3&lt;br /&gt;
|-&lt;br /&gt;
| || 1 || PD2 || PD3 || USPI15: 8 || USPI15: 6&lt;br /&gt;
|-&lt;br /&gt;
| || 2 || PH0 || PH1 || USPI24: 8 || USPI24: 6&lt;br /&gt;
|-&lt;br /&gt;
| || 3 || PJ0 || PJ1 || n.c. ***|| n.c. ***&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Zu *)''' Kann man auch am Stecker &amp;quot;[[RP6#Serielle_Schnittstelle]]&amp;quot; auf dem RP6 Mainboard anschliessen!&lt;br /&gt;
&lt;br /&gt;
'''Zu **)''' Kann man auch am Stecker &amp;quot;[[RP6#Serielle_Schnittstelle_2]]&amp;quot; auf der M32 Platine anschliessen!&lt;br /&gt;
&lt;br /&gt;
'''Zu ***)''' Fest verbunden mit dem WLAN Modul, daher nicht nutzbar! &lt;br /&gt;
&lt;br /&gt;
 '''Stecker-Kürzel:'''&lt;br /&gt;
 PROGU   PROG_UART&lt;br /&gt;
 USPI15  UART_SPI1/T5&lt;br /&gt;
 USPI24  UART_SPI2/T4&lt;br /&gt;
&lt;br /&gt;
===Jumper===&lt;br /&gt;
&lt;br /&gt;
Zeichenerklärung:&lt;br /&gt;
* Zweipolige Jumper:&lt;br /&gt;
** Stellung ON = Jumper aufgesteckt (Kontakt geschlossen) &lt;br /&gt;
** Stellung OFF = Jumper abgezogen (Kontakt offen) &lt;br /&gt;
* Dreipolige Jumper:&lt;br /&gt;
** Stellung U = Jumper links * aufgesteckt&lt;br /&gt;
** Stellung R = Jumper rechts * aufgesteckt&lt;br /&gt;
&lt;br /&gt;
'''Zu *)''' Platine so gesehen, wie im Bestückungsplan!&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Jumper || Stellung || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| JP1 || U (S) || TX von USB&lt;br /&gt;
|-&lt;br /&gt;
| JP1 || R || TX von RS232&lt;br /&gt;
|-&lt;br /&gt;
| JP2 || U (S) || RX von USB&lt;br /&gt;
|-&lt;br /&gt;
| JP2 || R || RX von RS232&lt;br /&gt;
|-&lt;br /&gt;
| JP3 || U (S) || CTS von USB&lt;br /&gt;
|-&lt;br /&gt;
| JP3 || R || CTS von RS232&lt;br /&gt;
|-&lt;br /&gt;
| JP4 || U (S) || RTS von USB&lt;br /&gt;
|-&lt;br /&gt;
| JP4 || R || RTS von RS232&lt;br /&gt;
|-&lt;br /&gt;
| JP5 || ON || RS232-TTL-Wandler Power ON&lt;br /&gt;
|-&lt;br /&gt;
| JP5 || OFF (S) || RS232-TTL-Wandler Power OFF&lt;br /&gt;
|-&lt;br /&gt;
| JP6 || ON || Power für UM2102 auch von UART_TTL Stecker (Pin 1)&lt;br /&gt;
|-&lt;br /&gt;
| JP6 || OFF (S) || Power für UM2102 nur vom PC über USB-Stecker&lt;br /&gt;
|-&lt;br /&gt;
| JP7 || ON || +5 V Verbindung zwischen XBUS: VDD und UART_TTL Stecker (Pin 1)&lt;br /&gt;
|-&lt;br /&gt;
| JP7 || OFF (S) || Keine +5 V Verbindung zwischen XBUS und UART_TTL Stecker&lt;br /&gt;
|-&lt;br /&gt;
| JP8 || ON || TX an USRBUS RX (Pin Y6)&lt;br /&gt;
|-&lt;br /&gt;
| JP8 || OFF (S) || TX nicht an USRBUS&lt;br /&gt;
|-&lt;br /&gt;
| JP9 || ON || RTS an USRBUS RST (Pin Y10)&lt;br /&gt;
|-&lt;br /&gt;
| JP9 || OFF (S) || RTS nicht an USRBUS&lt;br /&gt;
|-&lt;br /&gt;
| JP10 || ON || RX an USRBUS TX (Pin Y8)&lt;br /&gt;
|-&lt;br /&gt;
| JP10 || OFF (S) || RX nicht an USRBUS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Zu (S)''' Standard-Stellung der Jumper ('''USB-UART-Betrieb über UART_TTL Stecker''')!&lt;br /&gt;
&lt;br /&gt;
 '''Hinweis:''' JP1 bis JP4 IMMER in dieselbe Stellung (U oder R) bringen!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=RP6v2 USB-RS232-Adapter: Software=&lt;br /&gt;
&lt;br /&gt;
Nutzt man die UARTs, die am PROG_UART Stecker der RP6Base, M32, M128 oder M256 WiFi liegen, mit dieser Adapter-Platine (siehe Tabelle [[RP6v2_USB-RS232-Adapter#UARTs]]!), kann man zum seriellen Lesen und Schreiben von Daten die Funktionen der vorhandenen UART-Libraries verwenden.&lt;br /&gt;
&lt;br /&gt;
Befehle für den Zugriff auf UART1 der RP6 CCPRO M128 sind in CompactC und BASIC des C-Control-Pro Systems enthalten (siehe Kapitel 6.19 RS232 der C-Control-Pro Anleitung!). Der Parameter ''serport'' der seriellen Funktionen muss auf 1 gesetzt werden, um den UART1 anzusprechen.&lt;br /&gt;
&lt;br /&gt;
Es bleibt die Frage, wie man mit den vertrauten Funktionen der RP6M256-UART-Library auf UART1 und UART2 der M256 WiFi zugreifen kann.&lt;br /&gt;
&lt;br /&gt;
Das ist recht einfach möglich, indem man die RP6M256uart Library anpasst.&lt;br /&gt;
&lt;br /&gt;
==RP6M256uart1 Library==&lt;br /&gt;
&lt;br /&gt;
Hier z.B. die Anpassung der RP6M256uart Library an '''UART1''':&lt;br /&gt;
&lt;br /&gt;
Datei RP6M256uart1.h:&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ------------------- [c]2011 / 2012 - AREXX ENGINEERING ---------------------&lt;br /&gt;
 * -------------------------- http://www.arexx.com/ ---------------------------&lt;br /&gt;
 * --------------------------- All rights reserved ----------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256uart1.h&lt;br /&gt;
 * Version: 1.1 - 24.02.2012&lt;br /&gt;
 * Target: RP6 CONTROL M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dominik S. Herwald&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * The M256 uart1 function Library header file. Detailled description&lt;br /&gt;
 * of each function can be found in the RP6M256uart1.c file!&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * CHANGELOG AND LICENSING INFORMATION CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6UART1_H&lt;br /&gt;
#define RP6UART1_H&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt; 	// Program memory (=Flash ROM) access routines.&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;			// C standard functions (e.g. itoa...)&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;			// I/O Port definitions&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;	// Interrupt macros (e.g. cli(), sei())&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// UART1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// TX:&lt;br /&gt;
&lt;br /&gt;
void writeChar1(char ch);&lt;br /&gt;
void writeStringLength1(char *data, uint8_t length, uint8_t offset);&lt;br /&gt;
void writeString1(char *data);&lt;br /&gt;
void writeNStringP1(const char *pstring);&lt;br /&gt;
#define writeString_P1(__pstr) writeNStringP1((PSTR(__pstr)))&lt;br /&gt;
&lt;br /&gt;
#define HEX 16&lt;br /&gt;
#define DEC 10&lt;br /&gt;
#define OCT 8&lt;br /&gt;
#define BIN 2&lt;br /&gt;
void writeInteger1(int16_t number, uint8_t base);&lt;br /&gt;
void write32BitInteger1(int32_t number, uint8_t base);&lt;br /&gt;
void writeIntegerLength1(int16_t number, uint8_t base, uint8_t length);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// RX:&lt;br /&gt;
extern volatile uint8_t uart1_status;&lt;br /&gt;
&lt;br /&gt;
#define UART1_RECEIVE_BUFFER_SIZE 500&lt;br /&gt;
#define UART1_BUFFER_OK 0&lt;br /&gt;
#define UART1_BUFFER_OVERFLOW 1&lt;br /&gt;
&lt;br /&gt;
char readChar1(void);&lt;br /&gt;
uint16_t readChars1(char *buf, uint16_t numberOfChars);&lt;br /&gt;
uint16_t getBufferLength1(void);&lt;br /&gt;
void clearReceptionBuffer1(void);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256uart1.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Bugs, feedback, questions and modifications can be posted on the AREXX Forum&lt;br /&gt;
 * on http://www.arexx.com/forum/ !&lt;br /&gt;
 * Of course you can also write us an e-mail to: info@arexx.nl&lt;br /&gt;
 * AREXX Engineering may publish updates from time to time on AREXX.com!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * - LICENSE -&lt;br /&gt;
 * GNU GPL v2 (http://www.gnu.org/licenses/gpl.txt, a local copy can be found&lt;br /&gt;
 * on the RP6 CD in the RP6 sorce code folders!)&lt;br /&gt;
 * This program is free software. You can redistribute it and/or modify&lt;br /&gt;
 * it under the terms of the GNU General Public License version 2 as published&lt;br /&gt;
 * by the Free Software Foundation.&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei RP6M256uart1.c:&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ------------------- [c]2011 / 2012 - AREXX ENGINEERING ---------------------&lt;br /&gt;
 * -------------------------- http://www.arexx.com/ ---------------------------&lt;br /&gt;
 * --------------------------- All rights reserved ----------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256uart1.c&lt;br /&gt;
 * Version: 1.1 - 16.07.2012&lt;br /&gt;
 * Target: RP6 CONTROL M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dominik S. Herwald&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 *&lt;br /&gt;
 * The M256 UART1 Library. (UART = &amp;quot;Universal Aynchronous Receiver Transceiver&amp;quot;)&lt;br /&gt;
 *&lt;br /&gt;
 * It contains data transfer functions for the UART (1). &lt;br /&gt;
 * Reception is Interrupt based with a circular buffer.&lt;br /&gt;
 *&lt;br /&gt;
 * --------&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You should better leave all this as it is if you just started with&lt;br /&gt;
 * C programming, but it is a good idea to read the comments and review the&lt;br /&gt;
 * code, it will help you to understand C programming for AVR better.&lt;br /&gt;
 *&lt;br /&gt;
 * Of course you are free to add new functions and improvements to this&lt;br /&gt;
 * library and make them available to the public on the Internet.&lt;br /&gt;
 * Please use the changelog at the end of this file to document your&lt;br /&gt;
 * changes. And add your name (or nickname) to any new function or &lt;br /&gt;
 * modification you added! E.g. a &amp;quot;modified by &amp;lt;nickname&amp;gt; at &amp;lt;date&amp;gt;&amp;quot; is &lt;br /&gt;
 * always a good idea to show other users where and what you changed the &lt;br /&gt;
 * source code!&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * CHANGELOG AND LICENSING INFORMATION CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256uart1.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// UART1 transmit functions:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a single character to the UART1.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			writeChar1('R');&lt;br /&gt;
 *			writeChar1('P');&lt;br /&gt;
 *			writeChar1('6');&lt;br /&gt;
 *			writeChar1('\n');&lt;br /&gt;
 *			// '\n' is a special code for the &amp;quot;new line&amp;quot; character!&lt;br /&gt;
 *			writeChar1('0');&lt;br /&gt;
 *			writeChar1(48); // 48 is ASCII code for '0'&lt;br /&gt;
 *			writeChar1(49); // 1&lt;br /&gt;
 *			writeChar1(50); // 2&lt;br /&gt;
 *			writeChar1(51); // 3&lt;br /&gt;
 *			//...&lt;br /&gt;
 *&lt;br /&gt;
 *			would output:&lt;br /&gt;
 *			RP6&lt;br /&gt;
 *			00123&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void writeChar1(char ch)&lt;br /&gt;
{&lt;br /&gt;
    while (!(UCSR1A &amp;amp; (1&amp;lt;&amp;lt;UDRE1)));&lt;br /&gt;
    UDR1 = (uint8_t)ch;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a null terminated string or buffer from SRAM to UART1.&lt;br /&gt;
 * Make sure that it really IS null terminated!&lt;br /&gt;
 * (&amp;quot;null terminated&amp;quot; means that the string has a null (=0) at the end.&lt;br /&gt;
 * this is automatically added to it by the compiler when you put the&lt;br /&gt;
 * string in double quotes like this: writeString1(&amp;quot;test&amp;quot;);  )&lt;br /&gt;
 *&lt;br /&gt;
 * ATTENTION: This fills up SRAM Memory with the&lt;br /&gt;
 * strings, even if they are constant and never changed.&lt;br /&gt;
 * If you want to write constant text strings to the UART1, better use&lt;br /&gt;
 * writeNStringP1(const uint8_t *pstring) (s. below), which reads the&lt;br /&gt;
 * text from flash program memory and does not fill up the SRAM with&lt;br /&gt;
 * the string data!&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			writeString1(&amp;quot;RP6 Robot System\n&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void writeString1(char *string)&lt;br /&gt;
{&lt;br /&gt;
	while(*string)&lt;br /&gt;
		writeChar1(*string++);&lt;br /&gt;
}&lt;br /&gt;
		&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a null terminated string from flash program memory to UART1.&lt;br /&gt;
 * You can use the macro writeString_P1(STRING); , this macro&lt;br /&gt;
 * ensures that the String is stored in program memory only!&lt;br /&gt;
 * Otherwise you need to use PSTR(&amp;quot;your string&amp;quot;) from AVRLibC for this. &lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			writeNStringP1(PSTR(&amp;quot;RP6 Robot System\n&amp;quot;));&lt;br /&gt;
 *&lt;br /&gt;
 *			// There is also a Macro that makes life easier and&lt;br /&gt;
 *			// you can simply write:&lt;br /&gt;
 *			writeString_P1(&amp;quot;RP6 Robot System\n&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void writeNStringP1(const char *pstring)&lt;br /&gt;
{&lt;br /&gt;
    uint8_t c;&lt;br /&gt;
    for (;(c = pgm_read_byte_near(pstring++));writeChar1(c));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a string with specified length and offset from SRAM to UART1.&lt;br /&gt;
 * If it is a null terminated string, output will be stopped at the&lt;br /&gt;
 * end! It does not need to be null terminated, but it is recommended&lt;br /&gt;
 * to use only null terminated strings/buffers, otherwise the function could&lt;br /&gt;
 * output any SRAM memory data stored after the string until it reaches a 0&lt;br /&gt;
 * or the specified length.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			writeStringLength1(&amp;quot;RP6 Robot Sytem\n&amp;quot;,16,0);&lt;br /&gt;
 *			// would output: &amp;quot;RP6 Robot Sytem\n&amp;quot;&lt;br /&gt;
 *			writeStringLength1(&amp;quot;RP6 Robot Sytem\n&amp;quot;,11,4);&lt;br /&gt;
 *			// would output: &amp;quot;Robot System&amp;quot;&lt;br /&gt;
 * 			writeStringLength1(&amp;quot;RP6 Robot Sytem\n&amp;quot;,40,4);&lt;br /&gt;
 *			// would output: &amp;quot;Robot System\n&amp;quot;&lt;br /&gt;
 *			// No matter if the specified length is 40 characters!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void writeStringLength1(char *string, uint8_t length, uint8_t offset)&lt;br /&gt;
{&lt;br /&gt;
	for(string = &amp;amp;string[offset]; *string &amp;amp;&amp;amp; length; length--)&lt;br /&gt;
		writeChar1(*string++);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a number (with specified base) to the UART1.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a hexadecimal number to the UART1:&lt;br /&gt;
 *			writeInteger1(0xAACC,16);&lt;br /&gt;
 *			// Instead of 16 you can also write &amp;quot;HEX&amp;quot; as this is defined in the&lt;br /&gt;
 *			// RP6M256uart1.h :&lt;br /&gt;
 *			writeInteger1(0xAACC, HEX);&lt;br /&gt;
 *			// Other Formats:&lt;br /&gt;
 *			writeInteger1(1024,DEC);  	// Decimal&lt;br /&gt;
 *			writeInteger1(044,OCT);		// Ocal&lt;br /&gt;
 *			writeInteger1(0b11010111,BIN); // Binary&lt;br /&gt;
 */&lt;br /&gt;
void writeInteger1(int16_t number, uint8_t base)&lt;br /&gt;
{&lt;br /&gt;
	char buffer[17];&lt;br /&gt;
	itoa(number, &amp;amp;buffer[0], base);&lt;br /&gt;
	writeString1(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a 32 Bit number (with specified base) to the UART1.&lt;br /&gt;
 * Usage is the same as writeInteger1.&lt;br /&gt;
 */&lt;br /&gt;
void write32BitInteger1(int32_t number, uint8_t base)&lt;br /&gt;
{&lt;br /&gt;
	char buffer[33];&lt;br /&gt;
	ltoa(number, &amp;amp;buffer[0], base);&lt;br /&gt;
	writeString1(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Same as writeInteger1, but with defined length.&lt;br /&gt;
 * This means this routine will add leading zeros to the number if length is&lt;br /&gt;
 * larger than the actual value or cut the upper digits if length is smaller&lt;br /&gt;
 * than the actual value.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a hexadecimal number to the UART1:&lt;br /&gt;
 *			writeIntegerLength1(0xAACC, 16, 8);&lt;br /&gt;
 *			// Instead of 16 you can also write &amp;quot;HEX&amp;quot; as this is defined in the&lt;br /&gt;
 *			// RP6M256uart1.h :&lt;br /&gt;
 *			writeIntegerLength1(0xAACC, HEX, 8);&lt;br /&gt;
 *			// Other Formats:&lt;br /&gt;
 *			writeIntegerLength1(1024,DEC,6);  	// Decimal&lt;br /&gt;
 *			writeIntegerLength1(044,OCT,4);		// Ocal&lt;br /&gt;
 *			writeIntegerLength1(0b11010111,BIN,8); // Binary&lt;br /&gt;
 */&lt;br /&gt;
void writeIntegerLength1(int16_t number, uint8_t base, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	char buffer[17];&lt;br /&gt;
	itoa(number, &amp;amp;buffer[0], base);&lt;br /&gt;
	int8_t cnt = length - strlen(buffer);&lt;br /&gt;
	if(cnt &amp;gt; 0) {&lt;br /&gt;
		for(; cnt &amp;gt; 0; cnt--, writeChar1('0'));&lt;br /&gt;
		writeString1(&amp;amp;buffer[0]);&lt;br /&gt;
	}&lt;br /&gt;
	else &lt;br /&gt;
		writeStringLength1(&amp;amp;buffer[0],length,-cnt);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// UART1 receive functions:&lt;br /&gt;
&lt;br /&gt;
volatile char uart1_receive_buffer[UART1_RECEIVE_BUFFER_SIZE+1];&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t uart1_status;&lt;br /&gt;
&lt;br /&gt;
uint16_t read_pos1 = 0;&lt;br /&gt;
uint16_t write_pos1 = 0; &lt;br /&gt;
uint16_t read_size1 = 0;&lt;br /&gt;
uint16_t write_size1 = 0;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * UART1 receive ISR.&lt;br /&gt;
 * Handles reception to circular buffer.&lt;br /&gt;
 */&lt;br /&gt;
ISR(USART1_RX_vect)&lt;br /&gt;
{	&lt;br /&gt;
	static volatile uint8_t dummy;&lt;br /&gt;
	if(((uint16_t)(write_size1 - read_size1)) &amp;lt; UART1_RECEIVE_BUFFER_SIZE) {&lt;br /&gt;
		uart1_receive_buffer[write_pos1++] = UDR1;&lt;br /&gt;
		write_size1++;&lt;br /&gt;
		if(write_pos1 &amp;gt; UART1_RECEIVE_BUFFER_SIZE) &lt;br /&gt;
			write_pos1 = 0;&lt;br /&gt;
		uart1_status = UART1_BUFFER_OK;&lt;br /&gt;
	}&lt;br /&gt;
	else {	&lt;br /&gt;
		dummy = UDR1;&lt;br /&gt;
		uart1_status = UART1_BUFFER_OVERFLOW;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Read a char from the circular buffer. &lt;br /&gt;
 * The char is removed from the buffer (or more precise: not accessible directly anymore&lt;br /&gt;
 * and will be overwritten as soon as new data becomes available)!&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 * // [...]&lt;br /&gt;
 * if(getBufferLength1()) 		&lt;br /&gt;
 *	   receivedData[data_position++] = readChar1();&lt;br /&gt;
 * // [...]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
char readChar1(void)&lt;br /&gt;
{&lt;br /&gt;
	uart1_status = UART1_BUFFER_OK;&lt;br /&gt;
	if(((uint16_t)(write_size1 - read_size1)) &amp;gt; 0) {&lt;br /&gt;
		read_size1++;&lt;br /&gt;
		if(read_pos1 &amp;gt; UART1_RECEIVE_BUFFER_SIZE) &lt;br /&gt;
			read_pos1 = 0;&lt;br /&gt;
		return uart1_receive_buffer[read_pos1++];&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Same as readChar1, but this function copies numberOfChars chars from the&lt;br /&gt;
 * circular buffer to buf. &lt;br /&gt;
 * It also returns the number of characters really copied to the buffer! &lt;br /&gt;
 * Just in case that there were fewer chars in the buffer...&lt;br /&gt;
 */&lt;br /&gt;
uint16_t readChars1(char *buf, uint16_t numberOfChars)&lt;br /&gt;
{&lt;br /&gt;
	uint16_t i = 0;&lt;br /&gt;
	uart1_status = UART1_BUFFER_OK;&lt;br /&gt;
	while(((uint16_t)(write_size1 - read_size1)) &amp;gt; 0 &amp;amp;&amp;amp; i &amp;lt; numberOfChars) {&lt;br /&gt;
		read_size1++;&lt;br /&gt;
		buf[i++] = uart1_receive_buffer[read_pos1++];&lt;br /&gt;
		if(read_pos1 &amp;gt; UART1_RECEIVE_BUFFER_SIZE) &lt;br /&gt;
			read_pos1 = 0;&lt;br /&gt;
	}&lt;br /&gt;
	return i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns the current number of elements in the buffer.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 * s. readChar1 function above!&lt;br /&gt;
 */&lt;br /&gt;
uint16_t getBufferLength1(void)&lt;br /&gt;
{&lt;br /&gt;
	return (((uint16_t)(write_size1 - read_size1)));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Clears the reception buffer - it disables UART1 Receive &lt;br /&gt;
 * interrupt for a short period of time. &lt;br /&gt;
 */&lt;br /&gt;
void clearReceptionBuffer1(void)&lt;br /&gt;
{&lt;br /&gt;
	static uint8_t dummy;&lt;br /&gt;
	UCSR1B &amp;amp;= ~(1 &amp;lt;&amp;lt; RXCIE1); // disable UART1 RX Interrupt&lt;br /&gt;
	dummy = UDR1;&lt;br /&gt;
	read_pos1 = 0;&lt;br /&gt;
	write_pos1 = 0; &lt;br /&gt;
	read_size1 = 0;&lt;br /&gt;
	write_size1 = 0;&lt;br /&gt;
	uart1_status = UART1_BUFFER_OK;&lt;br /&gt;
	UCSR1B |= (1 &amp;lt;&amp;lt; RXCIE1); // enable Interrupt again&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.1 16.07.2012 by Dominik S. Herwald&lt;br /&gt;
 * - v. 1.0 (initial release) 24.02.2012 by Dominik S. Herwald&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Bugs, feedback, questions and modifications can be posted on the AREXX Forum&lt;br /&gt;
 * on http://www.arexx.com/forum/ !&lt;br /&gt;
 * Of course you can also write us an e-mail to: info@arexx.nl&lt;br /&gt;
 * AREXX Engineering may publish updates from time to time on AREXX.com!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * - LICENSE -&lt;br /&gt;
 * GNU GPL v2 (http://www.gnu.org/licenses/gpl.txt, a local copy can be found&lt;br /&gt;
 * on the RP6 CD in the RP6 sorce code folders!)&lt;br /&gt;
 * This program is free software. You can redistribute it and/or modify&lt;br /&gt;
 * it under the terms of the GNU General Public License version 2 as published&lt;br /&gt;
 * by the Free Software Foundation.&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Für den Zugriff auf UART1 wurde allen Funktionsnamen eine &amp;quot;1&amp;quot; angehängt. Aus writeChar (UART0) wird also z.B. '''writeChar1''' (UART1). Für UART2 kann diese Library auf dieselbe Weise angepaßt werden. Die RP6M256uart1 Library kann wie die ursprüngliche Library in eigene Programme eingebunden werden,- natürlich auch ZUSÄTZLICH zur RP6M256uart Library.&lt;br /&gt;
&lt;br /&gt;
===Initialisierung===&lt;br /&gt;
&lt;br /&gt;
Wenn man die RP6M256uart Library auf den UART1 oder UART2 anpasst, muss man die Initialisierung des UARTs im eigenen Hauptprogramm durchführen.&lt;br /&gt;
&lt;br /&gt;
Für '''UART1''' kann das dann so aussehen:&lt;br /&gt;
&amp;lt;pre&amp;gt;	cli();			// Disable global interrupts.&lt;br /&gt;
&lt;br /&gt;
	// UART1:&lt;br /&gt;
	UBRR1H = UBRR_BAUD_LOW &amp;gt;&amp;gt; 8;	// Setup UART1: Baud is Low Speed&lt;br /&gt;
	UBRR1L = (uint8_t) UBRR_BAUD_LOW;&lt;br /&gt;
	UCSR1A = 0x00;&lt;br /&gt;
	UCSR1C = (0&amp;lt;&amp;lt;UMSEL10) | (0&amp;lt;&amp;lt;UMSEL11) | (1&amp;lt;&amp;lt;UCSZ11) | (1&amp;lt;&amp;lt;UCSZ10);&lt;br /&gt;
	UCSR1B = (1 &amp;lt;&amp;lt; TXEN1) | (1 &amp;lt;&amp;lt; RXEN1) | (1 &amp;lt;&amp;lt; RXCIE1);&lt;br /&gt;
&lt;br /&gt;
	clearReceptionBuffer1();&lt;br /&gt;
&lt;br /&gt;
	sei();			// Enable Global Interrupts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Software und USB-Treiber=&lt;br /&gt;
Der Hardwaretreiber wird von Windows nicht automatisch gefunden. Um das USB-Modul verwenden zu können, muss der Treiber manuell installiert werden.&lt;br /&gt;
Für Windows 7 wurde dieser [http://www.silabs.com/Support%20Documents/Software/CP210x_VCP_Win_XP_S2K3_Vista_7.exe Windows Treiber] von SiLabs getestet.&lt;br /&gt;
Treiber fur andere Betriebssysteme können direkt bei ELV oder auch bei [http://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx SiLabs] gefunden werden.&lt;br /&gt;
&lt;br /&gt;
Zum auswerten der empfangenen Daten eignet sich eigentlich jedes COM-Terminal. Es gilt lediglich zu beachten, dass die virtuelle Schnittstelle folgendermassen konfiguriert ist:&lt;br /&gt;
38400 Baud, 8Bit, 1Stop, Parity: None.&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
* [[RP6]]&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6 Kamera - Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2 I2C-Portexpander]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Universal_Serial_Bus USB]&lt;br /&gt;
* [http://de.wikipedia.org/wiki/RS-232 RS232]&lt;br /&gt;
* [[UART]]&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Transistor-Transistor-Logik TTL]&lt;br /&gt;
* [http://www.silabs.com/Support%20Documents/TechnicalDocs/cp2102.pdf CP2102 Datasheet]&lt;br /&gt;
* [http://www.ti.com/lit/ds/symlink/max232.pdf MAX232N Datasheet]&lt;br /&gt;
* [http://www.fairchildsemi.com/ds/1N/1N5818.pdf 1N5817 Datasheet]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
[[Kategorie:Projekte]]&lt;br /&gt;
&lt;br /&gt;
=Autoren=&lt;br /&gt;
--[[Benutzer:Dirk|Dirk]] 17:06, 5. Sep 2012 (CET)&lt;br /&gt;
--[[Benutzer:Filou89|Filou]] 19:20, 26. Sep 2012 (CET)&lt;/div&gt;</summary>
		<author><name>Filou89</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6Control_M32:_I2C-Slave&amp;diff=21001</id>
		<title>RP6Control M32: I2C-Slave</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6Control_M32:_I2C-Slave&amp;diff=21001"/>
				<updated>2012-09-13T22:16:06Z</updated>
		
		<summary type="html">&lt;p&gt;Filou89: /* I2C-Slave */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Planung=&lt;br /&gt;
&lt;br /&gt;
Erst mal die [http://www.roboternetz.de/community/threads/59178-RP6Control-M32-Projekt-I2C-Slave Planung]:&lt;br /&gt;
&lt;br /&gt;
* 1. Der I2C-Slave für die M32 soll genauso arbeiten, wie der RP6Base I2C-Slave (RP6Base_I2CSlave.c) in den Demos.&lt;br /&gt;
* 2. Er soll möglichst (fast) alle Funktionen/Ressourcen der M32 über I2C &amp;quot;fernsteuerbar&amp;quot; bzw. abfragbar machen.&lt;br /&gt;
* 3. Er soll als I2C-Master eine andere M32, die CCPRO M128 oder die M256 WiFi akzeptieren.&lt;br /&gt;
* 4. Er soll die I2C-Adresse 12 bekommen.&lt;br /&gt;
* 5. Er soll über XBUS INT2 mit dem Master verbunden sein.&lt;br /&gt;
* 6. Er soll wie der Base-Slave auch eine Timeout-Funktion haben.&lt;br /&gt;
* 7. Er soll folgende Befehle (commands) über I2C verstehen:&lt;br /&gt;
&amp;lt;pre&amp;gt;// Commands:&lt;br /&gt;
#define CMD_CONFIGIOS				0&lt;br /&gt;
#define CMD_SETIOS				1&lt;br /&gt;
#define CMD_CONFIG				2&lt;br /&gt;
#define CMD_SETLEDS				3&lt;br /&gt;
#define CMD_DISCHARGEPEAKDETECTOR		4&lt;br /&gt;
#define CMD_GETMICROPHONEPEAK			5&lt;br /&gt;
#define CMD_SETMEM_CS2				6&lt;br /&gt;
#define CMD_WRITESPI				7&lt;br /&gt;
#define CMD_WRITEWORDSPI			8&lt;br /&gt;
#define CMD_READSPI				9&lt;br /&gt;
#define CMD_READWORDSPI				10&lt;br /&gt;
&lt;br /&gt;
#define CMD_SET_WDT				11&lt;br /&gt;
#define CMD_SET_WDT_RQ				12&lt;br /&gt;
#define CMD_SET_HEARTBEAT			13&lt;br /&gt;
&lt;br /&gt;
#define CMD_SPI_EEPROM_WRITEBYTE		14&lt;br /&gt;
#define CMD_SPI_EEPROM_WRITEWORD		15&lt;br /&gt;
#define CMD_SPI_EEPROM_ENABLEWRITE 		16&lt;br /&gt;
#define CMD_SPI_EEPROM_DISABLEWRITE 		17&lt;br /&gt;
#define CMD_SPI_EEPROM_READBYTE			18&lt;br /&gt;
#define CMD_SPI_EEPROM_READWORD			19&lt;br /&gt;
#define CMD_SPI_EEPROM_GETSTATUS		20&lt;br /&gt;
&lt;br /&gt;
#define CMD_INITLCD				21&lt;br /&gt;
#define CMD_CLEARLCD				22&lt;br /&gt;
#define CMD_CLEARPOSLCD				23&lt;br /&gt;
#define CMD_WRITECHARLCD			24&lt;br /&gt;
#define CMD_WRITEINTEGERLCD			25&lt;br /&gt;
#define CMD_SETCURSORPOSLCD			26&lt;br /&gt;
&lt;br /&gt;
#define CMD_BEEP				27&lt;br /&gt;
#define CMD_SETBEEPERPITCH			28&lt;br /&gt;
#define CMD_SOUND				29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 Dabei setzt Befehl 0 die 8 freien I/O-Pins der M32 als Ein- oder Ausgänge.&lt;br /&gt;
 Befehl 1 schaltet die einzelnen I/O-Portpins.&lt;br /&gt;
 Befehl 2 ist Platzhalter ohne Funktion (z.B. zur Konfiguration des Slave).&lt;br /&gt;
 Befehl 3 schaltet die LEDs. Befehle 4, 5 gehen mit dem Mikro um.&lt;br /&gt;
 Befehle 6-10 sind die SPI-Befehle.&lt;br /&gt;
 Befehle 11,12 gehören zum Watchdog-Timer (wie bei der Base!).&lt;br /&gt;
 Befehl 13 schaltet die LCD Heartbeat (Herzschlag) Funktion.&lt;br /&gt;
 Befehle 14-20 lesen und schreiben von/aus dem SPI-EEPROM auf der M32.&lt;br /&gt;
 Befehle 21-26 steuern das LCD auf der M32 an.&lt;br /&gt;
 Befehle 27-29 steuern den Sound mit dem Beeper.&lt;br /&gt;
* 8. Er soll folgende Register zum Lesen durch den Master vorhalten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define I2C_REG_STATUS1     	0&lt;br /&gt;
#define I2C_REG_STATUS2     	1&lt;br /&gt;
#define I2C_REG_IO_STATUS     	2&lt;br /&gt;
#define I2C_REG_MEM_CS2    	3&lt;br /&gt;
#define I2C_REG_SPIBYTE    	4&lt;br /&gt;
#define I2C_REG_SPIWORD_L   	5&lt;br /&gt;
#define I2C_REG_SPIWORD_H   	6&lt;br /&gt;
#define I2C_REG_SPIEEPROMSTATUS 7&lt;br /&gt;
#define I2C_REG_SPIEEPROMBYTE  	8&lt;br /&gt;
#define I2C_REG_SPIEEPROMWORD_L 9&lt;br /&gt;
#define I2C_REG_SPIEEPROMWORD_H 10&lt;br /&gt;
#define I2C_REG_ADC_4_L      	11&lt;br /&gt;
#define I2C_REG_ADC_4_H      	12&lt;br /&gt;
#define I2C_REG_ADC_3_L      	13&lt;br /&gt;
#define I2C_REG_ADC_3_H      	14&lt;br /&gt;
#define I2C_REG_ADC_2_L      	15&lt;br /&gt;
#define I2C_REG_ADC_2_H      	16&lt;br /&gt;
#define I2C_REG_ADC_6_L     	17&lt;br /&gt;
#define I2C_REG_ADC_6_H     	18&lt;br /&gt;
#define I2C_REG_ADC_5_L    	19&lt;br /&gt;
#define I2C_REG_ADC_5_H    	20&lt;br /&gt;
#define I2C_REG_ADC_7_L      	21&lt;br /&gt;
#define I2C_REG_ADC_7_H    	22&lt;br /&gt;
#define I2C_REG_ADC_MIC_L     	23&lt;br /&gt;
#define I2C_REG_ADC_MIC_H     	24&lt;br /&gt;
#define I2C_REG_ADC_KEYPAD_L    25&lt;br /&gt;
#define I2C_REG_ADC_KEYPAD_H   	26&lt;br /&gt;
#define I2C_REG_RELEASEDKEYNUMBER 27&lt;br /&gt;
#define I2C_REG_PRESSEDKEYNUMBER  28&lt;br /&gt;
#define I2C_REG_LEDS      	29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 Die REGs 0,1 sind die Interrupt- und Status-Register wie beim Base-Slave.&lt;br /&gt;
 IO-Status (REG 2) sind die 8 freien I/O-Ports (sofern auf Eingänge geschaltet).&lt;br /&gt;
 REGs 3-10 sind Leseregister der SPI- und SPI-EEPROM-Funktionen.&lt;br /&gt;
 REGs 11-22 sind die freien ADC-Kanäle der M32.&lt;br /&gt;
 REGs 23,24 sind der ADC-Wert des Mikro.&lt;br /&gt;
 REGs 25,26 sind der ADC-Keypad-Wert.&lt;br /&gt;
 REGs 27,28 sind die Nummern der zuletzt losgelassenen bzw. gedrückten Taste.&lt;br /&gt;
 Mit REG 29 läßt sich der aktuelle Stand der 4 LEDs auslesen (an/aus).&lt;br /&gt;
* 9. Er soll auf die RP6Control Library [http://www.roboternetz.de/community/showthread.php?47198-RP6Control-M32-Neue-Library-Version-1.3beta V1.32beta] aufsetzen. Grund: Die aktuelle Lib V1.32beta ist voll kompatibel zur neuesten Version 1.3 und stellt mit eigenen Tasks schon regelmäßig die ADC-Werte und Werte der I/O-Ports zur Verfügung.&lt;br /&gt;
* 10. Bei Timeout soll die M32 funktionsfähig bleiben (Base-Slave bleibt dann in einer Endlosschleife stehen und muss resettet werden!).&lt;br /&gt;
&lt;br /&gt;
=I2C-Slave=&lt;br /&gt;
Hier mal eine erste Version des M32 I2C-Slave.&lt;br /&gt;
&lt;br /&gt;
Bitte testet diese Version! Was sollte noch geändert/verbessert werden? Fehler?&lt;br /&gt;
&lt;br /&gt;
Datei RP6Control_I2CSlave.c:&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M32 EXAMPLES&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: I2C Slave&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 *&lt;br /&gt;
 * A very common thing that many users will want to do with their M32 is &lt;br /&gt;
 * to control it with a second controller which has more free resources. &lt;br /&gt;
 * (more free memory, free I/O Ports and ADCs, faster, etc. pp.&lt;br /&gt;
 * for example the RP6 C-Control PRO M128 or M256 WIFI expansion Module)&lt;br /&gt;
 * &lt;br /&gt;
 * This programs allows you to control the RP6 CONTROL M32 completely via&lt;br /&gt;
 * I2C-Bus as a slave device!&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlLib.h&amp;quot;	 	// The RP6 Control Library v1.32beta.&lt;br /&gt;
								// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CslaveTWI.h&amp;quot;     // Include the I²C-Bus Slave Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// The Slave Address on the I2C Bus can be specified here:&lt;br /&gt;
#define RP6Control_I2C_SLAVE_ADR 12&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
// This bitfield contains the main interrupt event status bits. This can be&lt;br /&gt;
// read out and any Master devices can react on the specific events.&lt;br /&gt;
union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		uint8_t timeout:1;&lt;br /&gt;
		uint8_t mem_cs2Change:1;&lt;br /&gt;
		uint8_t insChange:1;&lt;br /&gt;
		uint8_t keyChange:1;&lt;br /&gt;
		uint8_t keypressed:1;&lt;br /&gt;
		uint8_t unused:3;&lt;br /&gt;
	};&lt;br /&gt;
} interrupt_status;&lt;br /&gt;
&lt;br /&gt;
// Some status bits with current settings and other things.&lt;br /&gt;
union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		uint8_t old_mem_cs2:1;&lt;br /&gt;
		uint8_t mem_cs2:1;&lt;br /&gt;
		uint8_t watchDogTimer:1;&lt;br /&gt;
		uint8_t wdtRequest:1;&lt;br /&gt;
		uint8_t wdtRequestEnable:1;&lt;br /&gt;
		uint8_t heartbeat:1;&lt;br /&gt;
		uint8_t unused:2;&lt;br /&gt;
	};&lt;br /&gt;
} status;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Generates Interrupt Signal and starts Software Watchdog&lt;br /&gt;
 */ &lt;br /&gt;
void signalInterrupt(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_dataWasRead = 0;&lt;br /&gt;
	DDRD |= EINT2;					// XBUS INT2&lt;br /&gt;
	PORTD |= EINT2;&lt;br /&gt;
	if(status.watchDogTimer)&lt;br /&gt;
		startStopwatch2();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Clears Interrupt&lt;br /&gt;
 */ &lt;br /&gt;
void clearInterrupt(void)&lt;br /&gt;
{&lt;br /&gt;
	stopStopwatch2();&lt;br /&gt;
	setStopwatch2(0);&lt;br /&gt;
	status.wdtRequest = false;&lt;br /&gt;
	PORTD &amp;amp;= ~EINT2;				// XBUS INT2&lt;br /&gt;
	DDRD &amp;amp;= ~EINT2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
freeIOs_t old_ins;&lt;br /&gt;
uint8_t   old_releasedKeyNumber;&lt;br /&gt;
uint8_t   update_count = 0;		&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function needs to be called frequently in the main loop. It updates&lt;br /&gt;
 * some values (currently only mem_cs2Change, insChange, keyChange and&lt;br /&gt;
 * keypressed status, but this may be expanded in future). &lt;br /&gt;
 */ &lt;br /&gt;
void task_update(void)&lt;br /&gt;
{&lt;br /&gt;
	if(getStopwatch4() &amp;gt; 250)&lt;br /&gt;
	{&lt;br /&gt;
		// Update mem_cs2 status:&lt;br /&gt;
		status.mem_cs2 = PINB &amp;amp; MEM_CS2;&lt;br /&gt;
		update_count++;&lt;br /&gt;
		setStopwatch4(0);&lt;br /&gt;
	}&lt;br /&gt;
	if(update_count &amp;gt; 5)&lt;br /&gt;
	{&lt;br /&gt;
		// Update mem_cs2Change:&lt;br /&gt;
		if(!interrupt_status.mem_cs2Change&lt;br /&gt;
		 &amp;amp;&amp;amp; (status.mem_cs2 != status.old_mem_cs2))&lt;br /&gt;
		{&lt;br /&gt;
			status.old_mem_cs2 = status.mem_cs2;&lt;br /&gt;
			interrupt_status.mem_cs2Change = true;&lt;br /&gt;
			signalInterrupt();&lt;br /&gt;
		}&lt;br /&gt;
		else if(interrupt_status.mem_cs2Change&lt;br /&gt;
		 &amp;amp;&amp;amp; (status.mem_cs2 == status.old_mem_cs2))&lt;br /&gt;
		{&lt;br /&gt;
			interrupt_status.mem_cs2Change = false;&lt;br /&gt;
			signalInterrupt();&lt;br /&gt;
		}&lt;br /&gt;
		// Update insChange:&lt;br /&gt;
		if(!interrupt_status.insChange &amp;amp;&amp;amp; (ins.byte != old_ins.byte))&lt;br /&gt;
		{&lt;br /&gt;
			old_ins = ins;&lt;br /&gt;
			interrupt_status.insChange = true;&lt;br /&gt;
			signalInterrupt();&lt;br /&gt;
		}&lt;br /&gt;
		else if(interrupt_status.insChange &amp;amp;&amp;amp; (ins.byte == old_ins.byte))&lt;br /&gt;
		{&lt;br /&gt;
			interrupt_status.insChange = false;&lt;br /&gt;
			signalInterrupt();&lt;br /&gt;
		}&lt;br /&gt;
		// Update keyChange:&lt;br /&gt;
		if(!interrupt_status.keyChange&lt;br /&gt;
		 &amp;amp;&amp;amp; (releasedKeyNumber != old_releasedKeyNumber))&lt;br /&gt;
		{&lt;br /&gt;
			old_releasedKeyNumber = releasedKeyNumber;&lt;br /&gt;
			interrupt_status.keyChange = true;&lt;br /&gt;
			signalInterrupt();&lt;br /&gt;
		}&lt;br /&gt;
		else if(interrupt_status.keyChange&lt;br /&gt;
		 &amp;amp;&amp;amp; (releasedKeyNumber == old_releasedKeyNumber))&lt;br /&gt;
		{&lt;br /&gt;
			interrupt_status.keyChange = false;&lt;br /&gt;
			signalInterrupt();&lt;br /&gt;
		}&lt;br /&gt;
		update_count = 0;&lt;br /&gt;
	}&lt;br /&gt;
	// Update keypressed status:&lt;br /&gt;
	interrupt_status.keypressed = pressedKeyNumber;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Registers that can be read by the Master. Their names should &lt;br /&gt;
// be self-explanatory and directly relate to the equivalent variables/functions &lt;br /&gt;
// in the RP6Library&lt;br /&gt;
&lt;br /&gt;
#define I2C_REG_STATUS1 		 	0&lt;br /&gt;
#define I2C_REG_STATUS2 		 	1&lt;br /&gt;
#define I2C_REG_IO_STATUS	 	 	2&lt;br /&gt;
#define I2C_REG_MEM_CS2				3&lt;br /&gt;
#define I2C_REG_SPIBYTE				4&lt;br /&gt;
#define I2C_REG_SPIWORD_L			5&lt;br /&gt;
#define I2C_REG_SPIWORD_H			6&lt;br /&gt;
#define I2C_REG_SPIEEPROMSTATUS		7&lt;br /&gt;
#define I2C_REG_SPIEEPROMBYTE		8&lt;br /&gt;
#define I2C_REG_SPIEEPROMWORD_L		9&lt;br /&gt;
#define I2C_REG_SPIEEPROMWORD_H		10&lt;br /&gt;
#define I2C_REG_ADC_4_L	 		 	11&lt;br /&gt;
#define I2C_REG_ADC_4_H	 		 	12&lt;br /&gt;
#define I2C_REG_ADC_3_L	 		 	13&lt;br /&gt;
#define I2C_REG_ADC_3_H	 		 	14&lt;br /&gt;
#define I2C_REG_ADC_2_L	 		 	15&lt;br /&gt;
#define I2C_REG_ADC_2_H	 		 	16&lt;br /&gt;
#define I2C_REG_ADC_6_L			 	17&lt;br /&gt;
#define I2C_REG_ADC_6_H			 	18&lt;br /&gt;
#define I2C_REG_ADC_5_L				19&lt;br /&gt;
#define I2C_REG_ADC_5_H				20&lt;br /&gt;
#define I2C_REG_ADC_7_L	 		 	21&lt;br /&gt;
#define I2C_REG_ADC_7_H 			22&lt;br /&gt;
#define I2C_REG_ADC_MIC_L 		 	23&lt;br /&gt;
#define I2C_REG_ADC_MIC_H 		 	24&lt;br /&gt;
#define I2C_REG_ADC_KEYPAD_L 	 	25&lt;br /&gt;
#define I2C_REG_ADC_KEYPAD_H 		26&lt;br /&gt;
#define I2C_REG_RELEASEDKEYNUMBER	27&lt;br /&gt;
#define I2C_REG_PRESSEDKEYNUMBER 	28&lt;br /&gt;
#define I2C_REG_LEDS	 		 	29&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// These variables contain the results of the functions readSPI(),&lt;br /&gt;
// readWordSPI(), SPI_EEPROM_readByte[s](), SPI_EEPROM_getStatus() after the&lt;br /&gt;
// Master sent one of the commands CMD_READSPI, CMD_READWORDSPI,&lt;br /&gt;
// CMD_SPI_EEPROM_READBYTE/WORD, CMD_SPI_EEPROM_GETSTATUS. So these variables&lt;br /&gt;
// are updated only &amp;quot;on demand&amp;quot; and NOT permanently!&lt;br /&gt;
uint8_t  spibyte;&lt;br /&gt;
uint16_t spiword;&lt;br /&gt;
uint8_t  spieepromstatus;&lt;br /&gt;
uint8_t  spieeprombyte;&lt;br /&gt;
uint16_t spieepromword;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This very important function updates ALL registers that the Master can read.&lt;br /&gt;
 * It is called frequently out of the Main loop. &lt;br /&gt;
 */&lt;br /&gt;
void task_updateRegisters(void)&lt;br /&gt;
{&lt;br /&gt;
	if(!I2CTWI_readBusy) &lt;br /&gt;
	{&lt;br /&gt;
		I2CTWI_readRegisters[I2C_REG_STATUS1] =				(uint8_t)(interrupt_status.byte);&lt;br /&gt;
		I2CTWI_readRegisters[I2C_REG_STATUS2] =				(uint8_t)(status.byte);&lt;br /&gt;
		I2CTWI_readRegisters[I2C_REG_IO_STATUS] =			(uint8_t)(ins.byte);&lt;br /&gt;
		I2CTWI_readRegisters[I2C_REG_MEM_CS2] =				(uint8_t)(status.mem_cs2);&lt;br /&gt;
		I2CTWI_readRegisters[I2C_REG_SPIBYTE] =				(uint8_t)(spibyte);&lt;br /&gt;
		I2CTWI_readRegisters[I2C_REG_SPIWORD_L] =			(uint8_t)(spiword);&lt;br /&gt;
		I2CTWI_readRegisters[I2C_REG_SPIWORD_H] =			(uint8_t)(spiword&amp;gt;&amp;gt;8);&lt;br /&gt;
		I2CTWI_readRegisters[I2C_REG_SPIEEPROMSTATUS] =		(uint8_t)(spieepromstatus);&lt;br /&gt;
		I2CTWI_readRegisters[I2C_REG_SPIEEPROMBYTE] = 		(uint8_t)(spieeprombyte);&lt;br /&gt;
		I2CTWI_readRegisters[I2C_REG_SPIEEPROMWORD_L] =		(uint8_t)(spieepromword);&lt;br /&gt;
		I2CTWI_readRegisters[I2C_REG_SPIEEPROMWORD_H] =		(uint8_t)(spieepromword&amp;gt;&amp;gt;8);&lt;br /&gt;
		I2CTWI_readRegisters[I2C_REG_ADC_4_L] =				(uint8_t)(adc4);&lt;br /&gt;
		I2CTWI_readRegisters[I2C_REG_ADC_4_H] =				(uint8_t)(adc4&amp;gt;&amp;gt;8);&lt;br /&gt;
		I2CTWI_readRegisters[I2C_REG_ADC_3_L] =				(uint8_t)(adc3);&lt;br /&gt;
		I2CTWI_readRegisters[I2C_REG_ADC_3_H] =				(uint8_t)(adc3&amp;gt;&amp;gt;8);&lt;br /&gt;
		I2CTWI_readRegisters[I2C_REG_ADC_2_L] =				(uint8_t)(adc2);&lt;br /&gt;
		I2CTWI_readRegisters[I2C_REG_ADC_2_H] =				(uint8_t)(adc2&amp;gt;&amp;gt;8);&lt;br /&gt;
		I2CTWI_readRegisters[I2C_REG_ADC_6_L] =				(uint8_t)(adc6);&lt;br /&gt;
		I2CTWI_readRegisters[I2C_REG_ADC_6_H] =				(uint8_t)(adc6&amp;gt;&amp;gt;8);&lt;br /&gt;
		I2CTWI_readRegisters[I2C_REG_ADC_5_L] =				(uint8_t)(adc5);&lt;br /&gt;
		I2CTWI_readRegisters[I2C_REG_ADC_5_H] =				(uint8_t)(adc5&amp;gt;&amp;gt;8);&lt;br /&gt;
		I2CTWI_readRegisters[I2C_REG_ADC_7_L] =				(uint8_t)(adc7);&lt;br /&gt;
		I2CTWI_readRegisters[I2C_REG_ADC_7_H] =				(uint8_t)(adc7&amp;gt;&amp;gt;8);&lt;br /&gt;
		I2CTWI_readRegisters[I2C_REG_ADC_MIC_L] =			(uint8_t)(adcMic);&lt;br /&gt;
		I2CTWI_readRegisters[I2C_REG_ADC_MIC_H] =			(uint8_t)(adcMic&amp;gt;&amp;gt;8);&lt;br /&gt;
		I2CTWI_readRegisters[I2C_REG_ADC_KEYPAD_L] =		(uint8_t)(adcKeypad);&lt;br /&gt;
		I2CTWI_readRegisters[I2C_REG_ADC_KEYPAD_H] =		(uint8_t)(adcKeypad&amp;gt;&amp;gt;8);&lt;br /&gt;
		I2CTWI_readRegisters[I2C_REG_RELEASEDKEYNUMBER] =	(uint8_t)(releasedKeyNumber);&lt;br /&gt;
		I2CTWI_readRegisters[I2C_REG_PRESSEDKEYNUMBER] =	(uint8_t)(pressedKeyNumber);&lt;br /&gt;
		I2CTWI_readRegisters[I2C_REG_LEDS] =				(uint8_t)(externalPort.LEDS);&lt;br /&gt;
		if(I2CTWI_dataWasRead &amp;amp;&amp;amp; I2CTWI_dataReadFromReg == 0)&lt;br /&gt;
			clearInterrupt();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Command Registers - these can be written by the Master.&lt;br /&gt;
// The other registers (read registers) can NOT be written to. The only way to&lt;br /&gt;
// communicate with the M32 is via specific commands. &lt;br /&gt;
// Of course you can also add more registers if you like...&lt;br /&gt;
&lt;br /&gt;
// ----------------------&lt;br /&gt;
&lt;br /&gt;
#define I2C_REGW_CMD 0&lt;br /&gt;
#define I2C_REGW_CMD_PARAM1 1&lt;br /&gt;
#define I2C_REGW_CMD_PARAM2 2&lt;br /&gt;
#define I2C_REGW_CMD_PARAM3 3&lt;br /&gt;
#define I2C_REGW_CMD_PARAM4 4&lt;br /&gt;
#define I2C_REGW_CMD_PARAM5 5&lt;br /&gt;
#define I2C_REGW_CMD_PARAM6 6&lt;br /&gt;
&lt;br /&gt;
// ----------------------&lt;br /&gt;
&lt;br /&gt;
uint8_t cmd;&lt;br /&gt;
uint8_t param1;&lt;br /&gt;
uint8_t param2;&lt;br /&gt;
uint8_t param3;&lt;br /&gt;
uint8_t param4;&lt;br /&gt;
uint8_t param5;&lt;br /&gt;
uint8_t param6;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Checks if a new Command has been received and also reads all &lt;br /&gt;
 * paramters associated with this command.&lt;br /&gt;
 * It returns true if a new command has been received.&lt;br /&gt;
 */&lt;br /&gt;
uint8_t getCommand(void)&lt;br /&gt;
{&lt;br /&gt;
	if(I2CTWI_writeRegisters[I2C_REGW_CMD] &amp;amp;&amp;amp; !I2CTWI_writeBusy) &lt;br /&gt;
	{&lt;br /&gt;
		cmd = I2CTWI_writeRegisters[I2C_REGW_CMD]; // store command register&lt;br /&gt;
		I2CTWI_writeRegisters[I2C_REGW_CMD] = 0; // clear command register (!!!)&lt;br /&gt;
		param1 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM1]; // parameters 1-6...&lt;br /&gt;
		param2 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM2];&lt;br /&gt;
		param3 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM3];&lt;br /&gt;
		param4 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM4];&lt;br /&gt;
		param5 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM5];&lt;br /&gt;
		param6 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM6];&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Command processor:&lt;br /&gt;
&lt;br /&gt;
// Commands:&lt;br /&gt;
#define CMD_CONFIGIOS				0&lt;br /&gt;
#define CMD_SETIOS					1&lt;br /&gt;
#define CMD_CONFIG					2&lt;br /&gt;
#define CMD_SETLEDS					3&lt;br /&gt;
#define CMD_DISCHARGEPEAKDETECTOR	4&lt;br /&gt;
#define CMD_GETMICROPHONEPEAK		5&lt;br /&gt;
#define CMD_SETMEM_CS2				6&lt;br /&gt;
#define CMD_WRITESPI				7&lt;br /&gt;
#define CMD_WRITEWORDSPI			8&lt;br /&gt;
#define CMD_READSPI					9&lt;br /&gt;
#define CMD_READWORDSPI				10&lt;br /&gt;
&lt;br /&gt;
#define CMD_SET_WDT					11&lt;br /&gt;
#define CMD_SET_WDT_RQ				12&lt;br /&gt;
#define CMD_SET_HEARTBEAT			13&lt;br /&gt;
&lt;br /&gt;
#define CMD_SPI_EEPROM_WRITEBYTE	14&lt;br /&gt;
#define CMD_SPI_EEPROM_WRITEWORD	15&lt;br /&gt;
#define CMD_SPI_EEPROM_ENABLEWRITE 	16&lt;br /&gt;
#define CMD_SPI_EEPROM_DISABLEWRITE 17&lt;br /&gt;
#define CMD_SPI_EEPROM_READBYTE		18&lt;br /&gt;
#define CMD_SPI_EEPROM_READWORD		19&lt;br /&gt;
#define CMD_SPI_EEPROM_GETSTATUS	20&lt;br /&gt;
&lt;br /&gt;
#define CMD_INITLCD					21&lt;br /&gt;
#define CMD_CLEARLCD				22&lt;br /&gt;
#define CMD_CLEARPOSLCD				23&lt;br /&gt;
#define CMD_WRITECHARLCD			24&lt;br /&gt;
#define CMD_WRITEINTEGERLCD			25&lt;br /&gt;
#define CMD_SETCURSORPOSLCD			26&lt;br /&gt;
&lt;br /&gt;
#define CMD_BEEP					27&lt;br /&gt;
#define CMD_SETBEEPERPITCH			28&lt;br /&gt;
#define CMD_SOUND					29&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
uint8_t rw_buffer[3];&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function checks if commands have been received and processes them.&lt;br /&gt;
 */ &lt;br /&gt;
void task_commandProcessor(void)&lt;br /&gt;
{&lt;br /&gt;
	if(getCommand()) &lt;br /&gt;
	{&lt;br /&gt;
		switch(cmd) &lt;br /&gt;
		{&lt;br /&gt;
			case CMD_CONFIGIOS: if(param1) setFreeIOsToOUT(); else setFreeIOsToIN(); break;&lt;br /&gt;
			case CMD_SETIOS: setOUTs(param1); break;&lt;br /&gt;
			case CMD_CONFIG: break;&lt;br /&gt;
			case CMD_SETLEDS: setLEDs(param1); break;&lt;br /&gt;
			case CMD_DISCHARGEPEAKDETECTOR:	dischargePeakDetector(); break;&lt;br /&gt;
			case CMD_GETMICROPHONEPEAK:	adcMic = getMicrophonePeak(); break;&lt;br /&gt;
			case CMD_SETMEM_CS2: if(param1) PORTB |= MEM_CS2; else PORTB &amp;amp;= ~MEM_CS2; break;&lt;br /&gt;
			case CMD_WRITESPI: writeSPI(param1); break;&lt;br /&gt;
			case CMD_WRITEWORDSPI: writeWordSPI((param1&amp;lt;&amp;lt;8)+param2); break;&lt;br /&gt;
			case CMD_READSPI: spibyte = readSPI(); break;&lt;br /&gt;
			case CMD_READWORDSPI: spiword = readWordSPI(); break;&lt;br /&gt;
			case CMD_SET_WDT: status.watchDogTimer = param1 ? true : false; break;&lt;br /&gt;
			case CMD_SET_WDT_RQ: status.wdtRequestEnable = param1 ? true : false; break;&lt;br /&gt;
			case CMD_SET_HEARTBEAT: status.heartbeat = param1 ? true : false; break;&lt;br /&gt;
			case CMD_SPI_EEPROM_WRITEBYTE: SPI_EEPROM_writeByte((param1&amp;lt;&amp;lt;8)+param2, param3); break;&lt;br /&gt;
			case CMD_SPI_EEPROM_WRITEWORD: rw_buffer[0] = param3; rw_buffer[1] = param4;&lt;br /&gt;
				SPI_EEPROM_writeBytes((param1&amp;lt;&amp;lt;8)+param2, &amp;amp;rw_buffer[0], 2); break;&lt;br /&gt;
			case CMD_SPI_EEPROM_ENABLEWRITE: SPI_EEPROM_enableWrite(); break;&lt;br /&gt;
			case CMD_SPI_EEPROM_DISABLEWRITE: SPI_EEPROM_disableWrite(); break;&lt;br /&gt;
			case CMD_SPI_EEPROM_READBYTE: spieeprombyte = SPI_EEPROM_readByte((param1&amp;lt;&amp;lt;8)+param2); break;&lt;br /&gt;
			case CMD_SPI_EEPROM_READWORD: SPI_EEPROM_readBytes((param1&amp;lt;&amp;lt;8)+param2, &amp;amp;rw_buffer[0], 2);&lt;br /&gt;
				spieepromword = (rw_buffer[0]&amp;lt;&amp;lt;8)+rw_buffer[1]; break;&lt;br /&gt;
			case CMD_SPI_EEPROM_GETSTATUS: spieepromstatus = SPI_EEPROM_getStatus(); break;&lt;br /&gt;
			case CMD_INITLCD: initLCD(); break;&lt;br /&gt;
			case CMD_CLEARLCD: clearLCD(); break;&lt;br /&gt;
			case CMD_CLEARPOSLCD: clearPosLCD(param1, param2, param3); break;&lt;br /&gt;
			case CMD_WRITECHARLCD: writeCharLCD(param1); break;&lt;br /&gt;
			case CMD_WRITEINTEGERLCD: writeIntegerLCD((param1&amp;lt;&amp;lt;8)+param2, param3); break;&lt;br /&gt;
			case CMD_SETCURSORPOSLCD: setCursorPosLCD(param1, param2); break;&lt;br /&gt;
			case CMD_BEEP: beep(param1, (param2&amp;lt;&amp;lt;8)+param3); break;&lt;br /&gt;
			case CMD_SETBEEPERPITCH: setBeeperPitch(param1); break;&lt;br /&gt;
			case CMD_SOUND: sound(param1, (param2&amp;lt;&amp;lt;8)+param3, (param4&amp;lt;&amp;lt;8)+param5); break;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is the Software watchdog function. After any interrupt event, a timer is&lt;br /&gt;
 * started and if a certain amount of time has passed by with no reaction from&lt;br /&gt;
 * the Master, the RP6 CONTROL M32 shows this by blinking with status LEDs 1..4&lt;br /&gt;
 * for 3 seconds. After this the interrupt and interrupt status are cleared.&lt;br /&gt;
 * Usually the Master program has errors or is locked up if it does not react,&lt;br /&gt;
 * so the blinking LEDs show, that there is a communication problem.&lt;br /&gt;
 */&lt;br /&gt;
void task_MasterTimeout(void)&lt;br /&gt;
{&lt;br /&gt;
	if(status.watchDogTimer)&lt;br /&gt;
	{&lt;br /&gt;
		static uint8_t blinkflag = 0;&lt;br /&gt;
		if(getStopwatch2() &amp;gt; 3000)	// 3 seconds timeout for the master to react on&lt;br /&gt;
		{							// our interrupt events - if he does not react, we &lt;br /&gt;
									// blink with LEDs 1..4 for another 3 seconds!&lt;br /&gt;
			interrupt_status.timeout = true;&lt;br /&gt;
			if(getStopwatch2() &amp;gt; 6000)&lt;br /&gt;
			{&lt;br /&gt;
				setLEDs(0b0000);	// Clear LEDs&lt;br /&gt;
				interrupt_status.byte = 0; // Clear interrupt status&lt;br /&gt;
				setStopwatch4(0);&lt;br /&gt;
				clearInterrupt();	// Clear interrupt&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else if(getStopwatch3() &amp;gt; 250)&lt;br /&gt;
		{&lt;br /&gt;
			status.wdtRequest = true;&lt;br /&gt;
			signalInterrupt();&lt;br /&gt;
			setStopwatch3(0);&lt;br /&gt;
		}&lt;br /&gt;
		if(interrupt_status.timeout)&lt;br /&gt;
		{&lt;br /&gt;
			if(getStopwatch5() &amp;gt; 200)&lt;br /&gt;
			{&lt;br /&gt;
				if(blinkflag)&lt;br /&gt;
				{&lt;br /&gt;
					setLEDs(0b1001);&lt;br /&gt;
					blinkflag = 0;&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				{&lt;br /&gt;
					setLEDs(0b0110);&lt;br /&gt;
					blinkflag = 1;&lt;br /&gt;
				}&lt;br /&gt;
				setStopwatch5(0);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * LCD Heartbeat function&lt;br /&gt;
 */&lt;br /&gt;
void task_LCDHeartbeat(void)&lt;br /&gt;
{&lt;br /&gt;
	if(status.heartbeat)&lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 500)&lt;br /&gt;
		{&lt;br /&gt;
			static uint8_t heartbeat = false;&lt;br /&gt;
			if(heartbeat)&lt;br /&gt;
			{&lt;br /&gt;
				clearPosLCD(1, 15, 1);&lt;br /&gt;
				heartbeat = false;&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				setCursorPosLCD(1, 15);&lt;br /&gt;
				writeStringLCD_P(&amp;quot;*&amp;quot;); &lt;br /&gt;
				heartbeat = true;&lt;br /&gt;
			}&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int16_t main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6Control();&lt;br /&gt;
&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);	   &lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_initSlave(RP6Control_I2C_SLAVE_ADR);&lt;br /&gt;
&lt;br /&gt;
	status.byte = 0;&lt;br /&gt;
	interrupt_status.byte = 0;&lt;br /&gt;
// TEST TEST TEST TEST TEST TEST&lt;br /&gt;
status.watchDogTimer = true;&lt;br /&gt;
status.heartbeat = true;&lt;br /&gt;
// TEST TEST TEST TEST TEST TEST&lt;br /&gt;
	startStopwatch1(); // For LCDHeartbeat function&lt;br /&gt;
	startStopwatch3();&lt;br /&gt;
	startStopwatch4();&lt;br /&gt;
	startStopwatch5();&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		task_commandProcessor();&lt;br /&gt;
		task_update();&lt;br /&gt;
		task_updateRegisters();&lt;br /&gt;
		task_RP6M32System();&lt;br /&gt;
		task_MasterTimeout();&lt;br /&gt;
		task_LCDHeartbeat();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=I2C-Master (RP6v2 M256 WiFi)=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
&lt;br /&gt;
* [[RP6]]&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6 - Morse-Code]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Weblinks=&lt;br /&gt;
&lt;br /&gt;
* [http://www.roboternetz.de/community/threads/59178-RP6Control-M32-Projekt-I2C-Slave RP6Control M32: Projekt I2C-Slave]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Autoren=&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Dirk|Dirk]] 19:20, 12. Sep 2012 (CET)&lt;/div&gt;</summary>
		<author><name>Filou89</name></author>	</entry>

	</feed>