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 Sendeseite sondern an der Empfangsseite 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 vom 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 einer 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 12 Volt 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 sondern 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 Anschluss 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
|
![]() |
||||||||||||||||||||||||||||||||||||
![]() |
|||||||||||||||||||||||||||||||||||||
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------------------> |
![]() |
||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||
Datenaustausch
Atmega <> Atmega |
|||||||||||||||||||||||||||||||||||||
Was
es gilt zu beachten beim Austausch von Daten zwischen
2 Atmegas. Grundsätzlich können zwei Atmegas durch die UART Schnittstelle miteinander Daten austauschen. UART ( Universelle Asynchrone Receiver -Transmitter ) ist eine Serielle Datenschnittstelle die nur mit drei Leitungen aus kommt . Masse , Empfang und Sendeleistung ( GND, RX,TX). |
|||||||||||||||||||||||||||||||||||||
Bei
vebindungen die direkt von Atmega zu Atmega statt finden
sind die Verbindungsleitungen gekreuxt.![]() |
|||||||||||||||||||||||||||||||||||||
Datenaustausch
PC <-> Mikrocontroller
|
|||||||||||||||||||||||||||||||||||||
Daten auszutauschen ist mit Bascom
nicht schwierig.
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. |
![]() |
||||||||||||||||||||||||||||||||||||
Mit dem Programm "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 einfachhalber 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 der Anweisung "$crystal" bekannt gegeben werden. Beispiel: $baud = 9600 |
|||||||||||||||||||||||||||||||||||||
Print
|
|||||||||||||||||||||||||||||||||||||
Dieser Befehl sendet eine Zeichenfolge
(einen Text) über die UART.
|
|||||||||||||||||||||||||||||||||||||
Dieser Code : Analysiert man aber die übermittelten
Daten, dann sieht man, dass für jedes Zeichen der
ASCII-Code übermittelt wurde. |
|||||||||||||||||||||||||||||||||||||
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 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? |
|||||||||||||||||||||||||||||||||||||
Oder der Prozessor fängt an zu
Schwingen, und verhindert dadurch eine saubere
Datenübertragung was man erfolgreich verhindert |
|||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||
Aktualisiert 04.08.2024 | |||||||||||||||||||||||||||||||||||||
Copyright 2009 by Ms |