erstellt17.11.2012 | |||||||||||||||||||||||||||||||
RS232 Schnittstelle | |||||||||||||||||||||||||||||||
Es gibt Serielle RS232 Kabel und sogenannte Nullmodem Kabel. Um von einem PC aus mit einen Mikrocontroller zu kommunizieren benötigen wir ein Nullmodem Kabel. Bei einen Nullmodem Kabel sind die Datenleitungen nicht eins zu eins angeschlossen wie beim RS232 Kabel, sondern gekreuzt.
| RS232-Nullmodem Kabel | ||||||||||||||||||||||||||||||
Warum sind die Adern gekreuzt ?
| |||||||||||||||||||||||||||||||
Man stelle sich eine Telefonverbindung vor. Wenn an einen Apparat in die Sprechmuschel gesprochen wird kommt es ja am anderen Apparat aus der Hörmuschel wieder raus. Umgekehrt ist es dann genauso. Also muss eine Verbindung statt finden zwischen Sprechkapsel und Hörmuschel und umgekehrt zwischen Hörmuschel und Sprechkapsel was voraussetzt das die Verbindungen gekreuzt sind. Und genau das entspricht den gekreuzten Datenleitungen. Also was der PC sendet soll am Mikrocontroller ja nicht an der Senderseite sondern an der Empfängerseite ankommen, und umgekehrt. |
|||||||||||||||||||||||||||||||
Man kann
bei Mikrocontroller die keine UART Schnittstelle besitzen , diese
auch
Softwaremäßig nachbilden , das benötigt aber sehr viel Ressourcen und ist auch langsamer. Wenn in der Programmierung des Atmega's nichts anderes angegeben wurde benutzt der Atmega standardmäßig den Hardware UART sofern die Bascom Direktive " Baud " im Programmkopf angegeben wurde. Fehlt diese Direktive werden die mit RXD und TXD benannten Anschlüsse am Atmega wie ganz normale I/O Pins behandelt. |
|||||||||||||||||||||||||||||||
Datengeschwindigkeit |
|||||||||||||||||||||||||||||||
Um die Daten vom PC zum Mikrocontroller zu
übertragen benötigt man ein sogenanntes Protokoll , das ist praktisch eine Leitlinie darüber wie die Daten übertragen werden , ob die Datenübertragung verifiziert wird oder wie die Daten Codiert oder Verschlüsselt werden usw. Da die Datenübertragung hier nur über drei Leitungen statt findet , also eine Leitung von PC zum Mikrocontroller , eine vom Mikrocontroller zum PC und eine Masse Leitung, und es keine zusätzlichen Leitungen für die Synchronisation gibt müssen die Daten mit der gleichen Geschwindigkeit Empfangen werden , in der sie auch Gesendet wurden. Weichen die Geschwindigkeiten mehr als 2% voneinander ab muss man mit Datenverlust rechnen. | |||||||||||||||||||||||||||||||
Diese
Geschwindigkeit wird in Baud pro Sekunde angegeben. Um die Daten fehlerfrei zu übertragen muss die "Baud" Angabe innerhalb der Programmierung angegeben werden. Die Taktfrequenz des Mikrokontrollers ist immer ein vielfaches des Baud Wertes oder besser gesagt die Baudgeschwindigkeit ist immer ein Bruchteil des Prozessor Taktes. Das ist auch der Grund warum so oft Quarze Verwendung finden die völlig krumme Werte haben z.B 3,686400 MHz oder 1,843200 MHz |
|||||||||||||||||||||||||||||||
Bei einem Quarz mit 1Mhz würden
folgende Baudraten fehlerfrei funktionieren: 2400 oder 4800 | |||||||||||||||||||||||||||||||
Baud
sagt uns nun wie viele ASKII Zeichen innerhalb einer Sekunde übertragen
werden , so sagt uns der Baudwert von 2400 das innerhalb einer Sekunde
2400 ASKII Zeichen übertragen werden können. Bei einen Protokoll von 8N1 , was soviel heißt wie 8Bit für ein ASKII Zeichen plus 1 Stop Bit werden also pro ASKII Zeichen 9 Bit übertragen. Bei einer Baudrate von 2400 werden also pro Sekunde 9 mal 2400 Bit übertragen, also 21600 Bit / Sekunde. |
|||||||||||||||||||||||||||||||
Spannungsanpassung |
|||||||||||||||||||||||||||||||
Die meisten Atmega Mikrocontroller arbeiten mit
einer Spannung von 5 Volt es gibt auch einige die mit ca 3,8 Volt,
arbeiten z.B. der Atmega8 L (L für Low) . Beim Mikrocontroller entspricht die Spannung nahe Masse eine Logische Null und die Spannung nahe der Positiven Betriebsspannung eine Logische Eins. Die Schnittstelle im PC , also die COM Schnittstelle arbeitet mit ganz anderen Spannungspegel, nämlich mit Spannungen von ca 12 Volt Minus bis 12Volt Plus. Dabei stellt die Spannung unter Minus 3 Volt eine Logische 1 dar und über 3 Volt Plus eine Logische 0 dar. Also es sind nicht nur die Spannungen Unterschiedlich sonder es sind auch noch invertierte Signale. Um diese Differenzen zwischen Mikrocontroller und PC anzupassen setzt man einen sogenannten Pegelwandler ein. quasi ein Dolmetscher der zwischen beiden Parteien fremder Sprachen vermittelt. Der bekannteste Pegelwandler dieser Art ist wohl der Max232 . Den kann man mit der gleichen 5 Volt betreiben mit der auch der Mikrocontroller betrieben wird, intern wird durch einen Spannungsvervielfacher die Spannungen unter Zuhilfenahme externer Kondensatoren auf den erforderlichen Wert angehoben und invertiert. Anders sieht es aus ,wenn der Controller nicht mit dem PC sondern mit einem anderen Mikrocontroller verbunden werden soll, dann können beide Controller direkt kommunizieren und es ist kein Pegelwandler erforderlich. Wegen der Unterschiedlichen Spannungspegel bezeichnet man den Anschluß am Controller auch nicht "RS232" oder "COM" sondern "UART" ( Universal Asynchronous Receiver Transmitter) | |||||||||||||||||||||||||||||||
Der Pegelumsetzer MAX232 |
|||||||||||||||||||||||||||||||
Der MAX232
ist einer der Bekanntesten Pegelkonverter für die RS232
(serielle Schnittstelle des PCs) und verfügt
über 2 integrierte DC-DC-Wandler, einer zur
Spannungsverdopplung (+10V) und einen als Spannungsinverter (-10V).
Für diese Wandler werden 4 Kondensatoren benötigt. Um
eine korrekte Wandlung eines TTL Signals auf ein RS232 Signal zu
ermöglichen muss eine Pegelumsetzung auf die höheren
Pegel erfolgen und zusätzlich muss das Signal invertiert
werden.
|
|||||||||||||||||||||||||||||||
Max 232 Datenblatt | |||||||||||||||||||||||||||||||
PC - Mikrocontroller / Stecker oder Kupplung ? | |||||||||||||||||||||||||||||||
Auf der Seite des PC's wird am Datenkabel eine Kupplung benötigt der PC selber hat den dazugehörigen Einbaustecker , auf der Mikrokontrollerseite hab ich es so eingerichtet , das ich an dieser Seite des Datenkabel einen Stecker benötige , falls man kein Nullmodem Kabel zur Verfügung hat, kann man sich Alternativ ein sogenannten "Gender Changer " besorgen,das ist ein Adapter in dem die Datenleitungen gekreuzt sind , so kann man ein Normales Serielles Kabel benutzen und steckt einfach den Adapter drauf,somit hat man sich ein Null-Modem geschaffen. Adapter mit gekreuzten Datenleitungen------------------> |
|||||||||||||||||||||||||||||||
Die RS232 Schnittstelle am PC verfügt über einen 9 poligen SUB-D Steckeranschluss. |
| ||||||||||||||||||||||||||||||
Datenaustausch
PC <-> Mikrocontroller | |||||||||||||||||||||||||||||||
Daten
auszutauschen ist mit Bascom nicht schwierig. Zunächst gibt
man dem AVR im Header eine Baudrate an und schon kann man mit einem
einfachen "Print X" den Wert
Achtung! Schreibt man das Baud-Statement in den Header wird nicht nur die UART initialisiert, sondern es werden außerdem gleich die entsprechenden RXD / TXD-Pins konfiguriert! das heißt praktisch: Beim Atmega 8 wird Pin 2 als Eingang und Pin 3 als Ausgang gesetzt und die Digital-IOs "PD0" und "PD1" sind damit nicht mehr verfügbar! Wenn man die serielle Schnittstelle nicht benutzt sollte also auch auf das "$Baud"-Statement im Header verzichtet werden. Ein Beispiel für die Ausgabe von Werten über die serielle Schnittstelle: x = 107 |
|||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||
Will man zwischen anderen
ASCII-Zeichen ein Sonderzeichen versenden dass BASCOM nicht
kennt, dann kann man den ASCII-Code des Sonderzeichens einfach
und dann später im Programm:
| |||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||
Für den Empfang
bzw. zum Senden von Daten im Ascii-Format genügt auf dem PC
grundsätzlich jedes Terminalprogramm. Der AVR generiert seine Baudrate indem er den Quarztakt teilt. Wie bei allen binären Teilen kann es da zu Rundungsfehlern kommen, die zumindest bei höheren Baudraten, also schnellem Datentransfer, zu Übertragungsfehlern führen können. Deshalb ist es sinnvoll hierbei keine "glatten" Taktfrequenzen zu verwenden, sondern "krumme" Quarze mit Frequenzen wie 3,6864 7,3728 oder 9,216 MHz. | |||||||||||||||||||||||||||||||
Wenn kein Null-Modem Kabel zur Hand sein sollte
und auch keinen Adapter zur Verfügung hat, kann man die
Anschlüsse PIN 2 und Pin 3 untereinander vertauschen und somit
ein Normales Serielles Kabel benutzen. | |||||||||||||||||||||||||||||||
Hyperterminal müssen wir die auf der
PC Tastatur eingegeben Zeichen auf dem Bildschirm sehen können
, weil dieser Tastaturcode über die RS232 Schnittstelle zum
Max232 gesendet wird, und von da an , ( durch die Brücke)
wieder zurück zum PC. Somit ist dann sichergestellt, das der Max232 und die Verbindung zum PC korrekt verdrahtet ist. Zuvor müssen wir im Terminal Programm noch die benötigte Adresse für den Com Port eingeben , wenn wir die nicht auf Anhieb wissen testen wir einfach halber durch angefangen von Com Port 1 bis ...... , anschließend müssen wir die benötigte Datenübertragungsrate in Baud eingeben, die ist hauptsächlich von der verwendeten Taktfrequenz abhängig und kann auch wenn man sich die Berechnungen ersparen möchte einfach durchgetestet werden , man fängt beispielsweise bei der kleinsten also 1200 an und arbeitet sich langsam hoch 2400 usw.... Sollte nur Hieroglyphen auf dem Bildschirm erscheinen , haben wir möglicherweise die falsche Datenübertragungsrate eingestellt. | |||||||||||||||||||||||||||||||
Schreibt man das Baud-Statement in den Header wird nicht nur die UART initialisiert, sondern es werden außerdem gleich die entsprechenden RXD / TXD-Pins konfiguriert! D.h. Praktisch beim Atmega 8: Pin 2 wird als Eingang und Pin 3 als Ausgang gesetzt und die Digital-IOs PD0 und PD1 sind damit nicht mehr verfügbar! Wenn man die serielle Schnittstelle nicht benutzt sollte also auch auf das $baud-Statement im Header verzichtet werden. | |||||||||||||||||||||||||||||||
Testprogramm zum Testen der
Rs232 Schnittstelle und der Displayausgabe hier: | |||||||||||||||||||||||||||||||
Folgende Bascom Befehle
beziehen sich auf die UART Schnittstelle : | |||||||||||||||||||||||||||||||
$Baud |
|||||||||||||||||||||||||||||||
Damit stellt man die gewünschte Übertragungsgeschwindigkeit ein. Diese ist von der Frequenz abhängig, mit der der µC getaktet wird. Diese muss Bascom mit $crystal bekannt gegeben werden. Beispiel: | |||||||||||||||||||||||||||||||
$baud = 9600 |
|||||||||||||||||||||||||||||||
Print |
|||||||||||||||||||||||||||||||
Dieser
Befehl sendet eine Zeichenfolge (einen Text) über die UART. | |||||||||||||||||||||||||||||||
übermittelt
die Zeichenfolge "Hallo Welt!" und fügt die unsichtbaren
Zeichen CR und LF an. Das sieht in einem normalen Terminalprogramm so
aus: Analysiert
man aber die übermittelten Daten, dann sieht man, dass
für jedes Zeichen der ASCII-Code übermittelt wurde.
Hier der Dezimal- und Hex-Code der übermittelten Zeichen: | |||||||||||||||||||||||||||||||
Wenn man diese Codes mit einer
Askiitabelle vergleicht, dann erkennt man die Zusammenhänge. PRINT 1 | |||||||||||||||||||||||||||||||
übermittelt das Zeichen "1" und nicht die Zahl 1. In einem normalen Terminalprogramm wird also das Zeichen "1" angezeigt. Analysiert man was wirklich übermittelt wird, dann sieht das so aus: | |||||||||||||||||||||||||||||||
Dezimal: 49 13 10 |
|||||||||||||||||||||||||||||||
Will man die Zahl 1 ohne Umwandlung in ein Zeichen übermitteln, dann nimmt man dafür den Befehl PRINTBIN. | |||||||||||||||||||||||||||||||
Printbin |
|||||||||||||||||||||||||||||||
Mit PRINTBIN werden die Daten, ohne Umwandlung in einen Text, übermittelt. Folgender Befehl übermittelt wirklich die Zahl 1: | |||||||||||||||||||||||||||||||
PRINTBIN 1 |
|||||||||||||||||||||||||||||||
Analysiert man das was an den Computer gesendet wurde, dann sieht das so aus: | |||||||||||||||||||||||||||||||
Dezimal: 1 |
|||||||||||||||||||||||||||||||
So können reine Daten, ohne umwandeln, übermittelt werden. Diese lassen sich aber dafür nicht mehr in einem normalen Terminalprogramm anzeigen. Dafür bräuchte man einen Anzeigemodus der die empfangenen Daten in Hex oder Dezimal anzeigt. | |||||||||||||||||||||||||||||||
Input | |||||||||||||||||||||||||||||||
Der Befehl INPUT erwartet eine Zeichenfolge von der UART und schreibt diese in eine Variable. INPUT wartet so lange auf die Zeichenfolge bis CARRIAGE RETURN (CR) übermittelt wurde. Das Programm bleibt also stehen, bis CR über die UART rein kommt. Das ist ideal, wenn das Programm in der MainLoop nur kommuniziert. Es ist nicht ideal, wenn in der MainLoop auch noch andere Dinge erledigt werden sollten. Dafür gibt es andere Befehle wie INKEY oder ISCHARWAITING. Außerdem gibt es sogar die Möglichkeit, einen Interrupt auslösen zu lassen, wenn eine Zeichenfolge angekommen ist. Dieses Beispiel wartet bis eine mit CR abgeschlossene Zeichenfolge übermittelt wurde und schickt diese über die UART zurück: Dim Empfangen As String * 20 |
|||||||||||||||||||||||||||||||
Mit CONFIG INPUT kann man einstellen, welches unsichtbare Zeichen oder welche unsichtbare Zeichenfolge einen Empfang abschließt. Und mit ECHO OFF kann man einstellen, dass in ein Terminal eingegebene Zeichen nicht sofort wieder zurück geschickt werden. | |||||||||||||||||||||||||||||||
Inputbin | |||||||||||||||||||||||||||||||
Bei diesem Befehl wartet Bascom auf Binärdaten. Es wartet also nicht auf Text, wie es INPUT macht, sondern auf reine Daten. An diesen Befehl wird als Argument eine Variable übergeben. INPUTBIN stoppt das Programm so lange, bis diese Variable befüllt wurde. Wird also eine BYTE-Variable übergeben, dann genügt ein Byte und das Programm läuft weiter. Wird eine WORD-Variable übergeben, dann wartet INPUTBIN bis zwei Byte (=WORD) übergeben wurden. Beispiel: | |||||||||||||||||||||||||||||||
Dim My_word_var As Word |
|||||||||||||||||||||||||||||||
Waitkey | |||||||||||||||||||||||||||||||
Dieser Befehl wartet bis ein Zeichen über die UART zum µC übertragen wurde und gibt dieses zurück. WAITKEY blockiert so lange bis ein Zeichen übermittelt wurde. Wird eine BYTE-Variable damit befüllt, dann steht in der BYTE-Variable der ASCII-Code des übermittelten Zeichens. Wird eine STRING-Variable befüllt, dann weiß Bascom, dass der übermittelte ASCII-CODE ein Textzeichen ist und gibt dieses bei PRINT als solches zurück. Beispiel: | |||||||||||||||||||||||||||||||
Dim My_byte As Byte |
|||||||||||||||||||||||||||||||
Inkey | |||||||||||||||||||||||||||||||
Wenn ein Zeichen im zwei Byte großen UART-Buffer steht, dann gibt INKEY ein Zeichen zurück. Steht nichts mehr im UART-Buffer, dann gibt INKEY die Zahl 0 zurück. INKEY bleibt also nicht stehen wie es bei WAITKEY der Fall ist. Das ist oft eine feine Sache, aber nicht ideal wenn in den zu übermittelnden Daten auch mal ein Nullbyte vorkommen kann. In so einem Fall sollte man vorher mit ISCHARWAITING prüfen ob etwas im UART-Buffer steht. Beispiel: | |||||||||||||||||||||||||||||||
Dim My_string As String * 1 |
|||||||||||||||||||||||||||||||
ISCHARWAITING | |||||||||||||||||||||||||||||||
ISCHARWAITING gibt 1 zurück, wenn im UART-Buffer ein Zeichen wartet. ISCHARWAITING gibt 0 zurück, wenn kein Zeichen im UART-Buffer wartet. Beispiel: siehe INKEY | |||||||||||||||||||||||||||||||
Dim My_string As String * 1 |
|||||||||||||||||||||||||||||||
Echo | |||||||||||||||||||||||||||||||
Die Einstellung ECHO ON gibt an, dass vom Befehl INPUT sofort nach dem Empfang eines Zeichens, dieses Zeichen zurück geschickt werden soll. Das ist die Standardeinstellung! Die Einstellung ECHO OFF gibt an, dass nichts zurück geschickt werden soll. | |||||||||||||||||||||||||||||||
CONFIG SERIALIN | |||||||||||||||||||||||||||||||
Stellt die Hardware-UART so ein, dass ein Buffer für den Empfang verwendet wird. | |||||||||||||||||||||||||||||||
CONFIG
SERIALOUT | |||||||||||||||||||||||||||||||
Damit kann man einen Buffer für den Versand von Daten über die UART einrichten. Wenn man Daten ohne Buffer über die UART schickt, dann bleibt das Programm so lange stehen bis alle Daten verschickt wurden. Im Gegensatz zum µC selber, ist so ein Versand sehr, sehr langsam. Um das Programm schneller fortsetzen zu können, kann man einen Buffer einrichten. Die Daten werden mit PRINT in den Buffer geschrieben. Und falls der Buffer groß genug für die neuen Daten ist, läuft das Programm weiter. Die Daten werden im Hintergrund über die UART verschickt. | |||||||||||||||||||||||||||||||
CONFIG COM1 | |||||||||||||||||||||||||||||||
Probleme ? |
|||||||||||||||||||||||||||||||
Überprüfe ob das richtige Serielle Kabel benutzt wird , ist es wirklich ein Null-Modem Kabel ? |
|||||||||||||||||||||||||||||||
Oder sind nicht alle Pins innerhalb des Kabels miteinander verbunden. Es gibt spezielle Kabel die man mitunter von anderen Geräten benutzt, die eine andere Pin Belegung aufweisen? |
|||||||||||||||||||||||||||||||
Haben
die Kondensatoren die für den Pegelwandler Max 232 Verwendung
finden die richtige Kapazität? |
|||||||||||||||||||||||||||||||
Stimmt die
Datenübetragungsrate? bei falsch gewählter
Datenübetragunsrate bekommt man gar keine Information im
Terminal Programm angezeigt, oder es erscheinen Hieroglyphen auf dem
Bildschirm . Die Datenübetragungsrate ist in der Hauptsache
von der Prozessor Geschwindigkeit abhängig z.B. bei 1 Mhz (
also Standard beim Atmega 8) sollte es mit einer
Datenübetragungsrate von 2400 Baud funktionieren. |
|||||||||||||||||||||||||||||||
Oder der Prozessor fängt an zu Schwingen, und verhindert dadurch eine saubere Datenübertragung was man erfolgreich verhindert indem man möglichst nahe am Anschluss des Prozessors zwischen dem Minus und Plus Anschluss einen 100 nf Kondensator anschließt. | |||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||
Aktualisiert 22.06.2022 | |||||||||||||||||||||||||||||||
Copyright 2009 by Ms |