Using the UART/de

Aus MCS Wiki AVR
< Using the UART(Weitergeleitet von Using the UART)
Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

UART

Ein Universal Asynchronous Receiver and Transmitter (UART) kann benutzt werden um Daten zwischen zwei Geräten zu senden und zu empfangen. Diese zwei Geräte können sein: PC-zu-PC, PC-zu-Mikrocontroller oder Mikrocontroller-zu-Mikrocontroller. Die UART Kommunikation benutzt TTL Spannungen von +5V and 0V oder LVTTL abhängig von der Mikrocontroller Betriebsspannung.

 

Wenn eine Verbindung zum PC gewünscht wird dann muss das RS232-Protokoll verwendet werden. Das bedeutet, dass mit definierten Spannungen (+15V und -15V) kommuniziert werden muss. Die kann mit einem MAX232 Level-Shifter erreicht werden.

 

Die Hardware wird im folgenden Schaltplan dargestellt:

 

Uart.png

 

Der DB-9 Anschluss hat 9 Pins aber es müsse nur 3 davon benutzt werden. Die obige Grafik zeigt die Vorderansicht - gelötet wird auf der anderen Seite. Bei den meisten Anschlüssen sind die Pinbezeichnungen auch auf den Steckern und Buchsen selbst zu lesen.

 

Wenn der verwendete Mikrocontroller HW-UART nicht unterstützt dann kann auch Software-UART benutzt werden. Siehe unten. Wenn der Mikrocontroller einen HW-UART unterstützt dann werden die TxD und RxD Pins mit TxD und RxD im Schaltplan verbunden. Wenn der Mikrocontroller mehrere HW-UARTs hat dann werden die TxD0 und RxD0 Pins mit TxD und RxD entsprechend obigem Schaltplan verbunden.

Nun muss per Programm der Mikrocontroller initialisiert werden. Öffnen Sie dazu eine neue .bas Datei und fügen Sie die folgenden Programmzeilen am Anfang hinzu.

 

$regfile = "verwendeter_mikrocontroller def.dat"

$crystal = 8000000

$baud = 19200

 

Stellen Sie sicher, dass der benutzte Mikrocontroller mit $regfile angegeben wird - zum Beispiel der ATMega32

$regfile = "m32def.dat"

 

Einige Mikrocontroller können einen internen Oszillator als Taktquelle verwenden. Einige Mikrocontroller verwenden den internen Oszillator standardmäßig. Bei Benutzung eines internen Oszillators braucht man keinen (externen) Quarz.

 

Führen Sie diesen Schritt nur aus wenn Sie einen internen Oszillator verwenden.

Öffnen Sie den BASCOM-AVR Programmer wie folgt:


Uart pg.png

 

Wählen Sie den “Lock and Fuse Bits” Tab aus und and maximimieren Sie das Programmer-Fenster.
Prüfen Sie, ob Sie den folgenden “Fusebit” Abschnitt sehen:

  "1:Divide Clock by 8 Disabled"

  und

        "Int. RC Osc. 8 MHz; Start-up time: X CK + X ms; [CKSEL=XXXX SUT=XX]"

 

Uart fusebits.png

 

Diese Einstellungen gibt es nicht bei jedem AVR Mikrocontroller. Wenn Sie die Einträge bei sich nicht haben dann ändern Sie nicht irgendwelche Fuse Bits.


 

Wenn diese Einstellungen verfügbar sind aber mit anderen Werten dann ändern Sie die Werte durch die Drop Down Möglichkeiten. Schließlich klicken Sie den "Program FS" Knopf und dann "Refresh" um die tatsächlichen Einstellungen zu sehen.

 

Verbinden Sie nun Mikrocontroller und PC mit einem Kabel mit DB-9 Anschluss

Schreiben Sie ein Testprogramm für Ihren Mikrocontroller welches folgendermaßen aussehen sollte:


 

$regfile = "m32def.dat" 'Verwendeter Mikrocontroller

$crystal = 8000000                                        

$baud = 19200                                            

 

Do

 Print "Hallo Welt"

Waitms 25

Loop

 

End

 

Öffnen Sie nun Das BASCOM Terminal-Programm und stellen Sie die Verbindungseinstellungen unter “Terminal” -> “Settings” ein. Wählen Sie den Com-Port wie am PC und stellen Sie eine Baudrate ein von 19200, Parity none, Data bits 8, Stop bits 1, Handshake none, emulation none.

 

Uart terminal.png Uart terminalshow.png

 

Wenn Sie das "Hallo Welt" im BASCOM Terminal Emulator Fenster angezeigt bekommen dann ist alles in Ordnung.

 

Beispiel

Sie können auch das folgende Programm mit dem BASCOM Terminal Emulator ausprobieren welches verschiedene Sende- und Empfangs-Befehle demonstriert.

 

$regfile = "m88def.dat"

$crystal = 8000000

$baud = 19200

 

Dim Akey As Byte  'Bytevariable deklarieren

 

Print

Print "Hallo, geben Sie irgendein alphanumerisches Zeichen ein.."

Akey = Waitkey()  'Waitkey wartet bis ein Zeichen von der UART empfangen wird

Print Akey

 

Wait 1

Print

Print "Danke! Wie Sie sehen gibt der Mikrocontroller eine Zahl aus."

Print "aber nicht das getippte Zeichen."

 

Wait 1

Print

Print "Probieren Sie nun die Enter-Taste.."

Akey = Waitkey()

Akey = Waitkey()

Print Akey

 

Print

Print "Die Zahl die Sie sehen ist der ASCII-Wert des eingetippten Zeichens."

Print "Wir müssen die Zahl wieder zurück umwandeln in das eingetippte Zeichen..."

Print     'Beachten Sie die Funktion dieser Zeile..

Print "Geben Sie wieder ein alphanumerisches Zeichen ein..."

Akey = Waitkey()

Print Chr(akey) 'Beachten Sie was hier passiert

Print "Jetzt klappt es!"

 

Wait 1

Print

Print "In vielen Situationen reicht ein Tastendruck nicht aus..."

Print "Geben Sie nun Ihren Namen ein und dann Enter zum Bestätigen"

 

Dim Inputstring As String * 12          'Zeichenkettenvariable deklarieren

 

 

Do

Akey = Waitkey()

If Akey = 13 Then Goto Thanks           'Bei Enter zu thanks springen

   Inputstring = Inputstring + Chr(akey) 'Zeichen an Zeichenkette anhängen/span>

Loop

 

Thanks:

Print "Vielen Dank" ; Inputstring ; " !"             'Beachten Sie die Funktion des Semikolons ; für mehrere Parameter

 

Wait 1

Print

Print "Sehen Sie sich den Programm-Code an und versuchen Sie zu verstehen,"

Print "wie das Programm arbeitet. Drücken Sie auch F1 während die Schreibmarke auf einem Befehl steht."

Print

Print "Wenn Sie alles verstanden haben dann gehen Sie weiter zum nächsten Beispielprogramm."

 

End

 

ASCII

Wie Sie im vorigen Beispiel gesehen haben benutzen wir den PRINT Befehl um irgendetwas zur UART zu senden. Genaugenommen senden wir nicht einfach Text sondern wir senden ASCII-Zeichen. ASCII heißt American Standard Code for Information Interchange. ASCII ist eine Tabelle mit 127 Zeichen.

 

ASCII Tabelle (unvollständig)

 

Dezimal  Hex    Binär     Wert

-------  ---    ------     -----

000    000   00000000      NUL    (Null char.)

008    008   00001000       BS    (Backspace)

009    009   00001001       HT    (Horizontal Tab)

010    00A   00001010       LF    (Line Feed)

012    00C   00001100       FF    (Form Feed)

013    00D   00001101       CR    (Carriage Return)

048    030   00110000        0

049    031   00110001        1

052    034   00110100        4

065    041   01000001        A

066    042   01000010        B

067    043   01000011        C

 

Die vollständige ASCII Tabelle finden Sie hier

 

CARRIAGE RETURN (CR) UND LINE FEED (LF)

Im vorigen Beispiel konnten Sie auch sehen, dass ein weiterer PRINT Befehl den Text in die nächste Zeile schreibt. Das kommt dadurch, dass der PRINT Befehl immer auch die CR und LF Zeichen anhängt uns ausgibt.

 

Wenn wir schreiben:

Print “ABC”

dann senden wir 65 66 67 13 10 to the UART. (Im Binär-Format)

 

Das Carriage Return Zeichen (13) bewegt die Schreibmarke zurück zur Position 0 der aktuellen Zeile. Das line feed (10) bewegt die Schreibmarke in die nächste Zeile.

 

Print “ABC” ;

Wenn wir ein Semikolon (;) am Ende der Zeile benutzen ...

sendet BASCOM kein carriage return/line feed so dass man weiteren Text nach dem ABC auf der selben Zeile schreiben kann.

 

Print “ABC” ; Chr(13) ;

Das würde nur ABC CR senden. Der nachfolgende Text würde das ABC überschreiben.

 

Übersicht

Hier finden Sie einige Befehle, die in Zusammenhang mit UART-Kommunikation benutzt werden können:

 

Waitkey()

Waitkey wartet bis ein Zeichen im seriellen Puffer empfangen wird.

 

Ischarwaiting()

Gibt eine 1 zurück wenn ein Zeichen im Hardware UART Puffer ansteht.

 

Inkey()

Inkey gibt den ASCII-Wert des ersten Zeichens aus dem seriellen Eingabe-Puffer zurück.

 

Print

Sendet eine variable oder eine konstante Zeichenkette zum UART.

 

 

 

Ein weiiteres Beispiel

Dieses Beispiel zeigt wie Ischarwaiting verwendet wird um zu prüfen ob eine Taste gedrückt wurde. Falls dies der Fall ist wird die Taste in eine Variable eingelesen:


 

'Print "Tippen Sie die Taste B um zu starten"

Dim Serialcharwaiting As Byte, Serialchar As Byte

 

Serialcharwaiting = Ischarwaiting()   'Prüfen, ob B oder b gedrückt wurde. Dann goto

If Serialcharwaiting = 1 Then

 Serialchar = Inkey()

If Serialchar = 66 Or Serialchar = 98 Then

    Goto MyRoutine

End If

End If

 

Goto Main

 

Myroutine:

'Anweisungen

 

Main:

'Anweisungen

End

 

 

BUFFERING SERIAL DATA

Wenn Sie mit hoher Geschwindigkeit senden und empfangen wollen dann müssen Sie serielle Input und serielle Output Puffer verwenden. Das Puffern wurde in BASCOM implementiert und kann nur mit Hardware UARTs verwendet werden.

 

Um einen UART für Pufferung zu konfigurieren muss der CONFIG Befehl benutzt werden.

 

Config Serialout Buffered Size 20

und/oder

Config Serialin Buffered Size 20

 

Mehr Informationen finden Sie in der BASCOM-Hilfe. Suchen Sie nach "config serialin". Es gibt auch ein Beispielprogramm “RS232BUFFER.BAS” im Samples-Verzeichnis.

 

 

SOFTWARE UART

Die bisherigen Beispiele benutzen die Hardware UART. Das bedeutet, dass die internen UART Register und interne Hardware (RxD(0) and TxD(0)) des AVR genutzt werden. Wenn Sie keinen Hardware UART haben dann können Sie auch Software UART benutzen.

 

Der BASCOM Compiler macht es leicht, weitere UARTS zu definieren. BASCOM kann fast jeden Pin für Software UARTs benutzen.


 

Bedenken Sie, dass Software UART nicht so stabil ist wie Hardware UART und deshalb kann man Timing-Probleme bekommen wenn viele Interrupts im Programm benutzt werden.

 

Für dieses Beispiel benutzen wir die Pins portc.1 und portc.2.

Verbinden Sie portc.1 mit TxD und portc.2 mit RxD entsprechend obigem Schaltplan.

 

Ändern Sie $regfile und programmieren Sie dieses Beispiel:

 

$regfile = "m88def.dat"

$crystal = 8000000

$baud = 19200

 

Dim B As Byte

Waitms 100

 

'Öffnen eines TRANSMIT-Kanals für Ausgabe

Open "comc.1:19200,8,n,1" For Output As #1

Print #, "serial output"

 

'Öffnen eines RECEIVE-Kanals für Input

Open "comc.2:19200,8,n,1" For Input As #2

'Weil es keine Verbindung zwischen Input- und Output-Pin gibt

'gibt es KEIN ECHO wenn Tasten getippt werden

 

Print #, "Drücken Sie eine alphanumerische Taste"

 

'Mit INKEY() können wir prüfen, ob ein Zeichen verfügbar ist

'Bei der Benutzung mit der Software-UART muss der Kanal mit angegeben werden.

Do

   'In Byte speichern

   B = Inkey(#2)

   'Wenn der Wert > 0 dann wurde etwas empfangen

   If B > 0 Then

      Print #, Chr(b)                         'Zeichen ausgeben

   End If

Loop

Close #2                                         'Kanäle schließen

Close #1

 

End

 

Nachdem der Mikrocontroller programmiert und das Kabel angeschlossen wurde öffnen Sie das Terminal Emulator Fenster von BASCOM mit Terminal-icon.png .

Sie sollten dann sehen, wie das Programm nach aplphanumerischer Eingabe fragt und dann sollte die Eingabe wieder im Terminal Fenster ausgegeben werden


Languages   English Deutsch  
Meine Werkzeuge
Namensräume
Varianten
Aktionen
Navigation
In anderen Sprachen
Sprache