Skip to main content
Amateurfunk verbindet die Welt

AVR-PC-Kopplung über USB

Erstellt: DL6GL, 16.04.2020, letzte Änderung 08.01.2022

AVR-PC-Kopplung Teaser

Um Debugging-Zwischenergebnisse auf einem großen PC-Bildschirm darstellen zu können oder auch um Daten an einen PC zu übertragen, sind unterschiedliche Schnittstellen zu bedienen - beim PC in der Regel USB und beim AVR die UART (Universal Asynchronous Receiver Transmitter). Mit einem entsprechenden Chip ist das ein Kinderspiel. Damit sind Kopplungen an Terminalprogramme möglich. Auch eine Verarbeitung mit MS Excel wird gezeigt.

In einigen Anwendungen auf dieser Website werden LCD eingesetzt, um Kontrollausgaben für Testzwecke anzuzeigen. Das bedingt sechs freie Ports mit der entsprechenden Verdrahtung. Einfacher wäre eine Zweidrahtverbindung über RXD/TXD der AVR-UART. Mehr Platz für Anzeigen bietet der PC-Bildschirm obendrein.


1  USB-Modul

Fertige USB-UART-Module sind für ein paar Euro zu haben. Die China-Klone verwenden zumeist CH340G- oder CP2102-Chips. Da aus einem anderen Projekt noch ein FT232RL von FTDI übrig geblieben ist und aufgrund der problemlosen Anbindung an WinXP/Win10, kam dieser auf einer Selbstbauplatine doch noch zu Ehren. Auf Optokoppler in den UART-Leitungen wurde verzichtet.

UART-USB-Koppler Schaltung

Abb. 1: USB-UART-Modul, Schaltbild.

Die Statusanzeigen mit den 2mA-LED D1…D3 sind optional. Die Anschlüsse am MCU Connector sind so angeordnet, dass RXD, TXD und GND im Flachkabel nebeneinander liegen (Reihenfolge ab Pin 1: RXD, TXD und GND). RXD und TXD werden überkreuzt am AVR angeschlossen, also RXD↔TXD(AVR) und TXD↔RXD(AVR). GND-Verbindung nicht vergessen. Ein Anschluss an einen Arduino (RX/TX) erfolgt auf die gleiche Weise. Die Handshake-Anschlüsse RTS, DTR und CTS werden i.d.R. nicht gebraucht.

UART-USB-Koppler Platine

Abb. 2: USB-UART-Modul, Platine im Gehäuse.

Platinengröße und Bohrlöcher sind für ein Kunststoffgehäuse GEH KS 28 (reichelt.de) ausgelegt.


2  Software

Der Programmieraufwand für AVR-interne Debugging-Ausgaben statt eines LCD ist minimal. Die UART-spezifischen Zeilen sind blau markiert.

$regfile = "m328pdef.dat"                         'ATMega328P
$crystal = 16000000 '16 MHz xtal
$hwstack = 40
$swstack = 40
$framesize = 40
$Baud = 9600 '9600Baud, 8N1

Dim strText As String * 30 'Text to be displayed
Dim bytTmp0 As Byte

Config Serialout = Buffered , Size = 30
SReg.7 = 1 'Enable global interrupts

Ein Wort zu "$Baud": Das Statement wird hier gebraucht, um einerseits die Übertragungsgeschwindigkeit unabhängig zur ggf. anderen Standardeinstellung in BASCOM (Options - Communication) vorzugeben und andererseits die für die Hardware-UART vorgesehenen Ports (PD.0=RXD und PD.1=TXD beim ATmega328p) intern an das UART-Modul zu schalten. In manch einem Programmbeispiel wird $Baud gesetzt, auch wenn die Hardware-UART gar nicht benutzt wird. Damit werden die o.g. zwei Ports verschenkt, die ohne ein $Baud als normale I/O-Ports verwendet werden könnten.

Mit Config SerialOut = Buffered wird festgelegt, dass die Ausgabe über die UART Byte-seriell, gesteuert über eine BASCOM-interne Interrupt-Serviceroutine erfolgt. Deshalb müssen mit SReg.7=1 die Interrupts global eingeschaltet werden. Damit wird bewirkt, dass die nachfolgenden Print-Befehle sofort an die Interrupt-Serviceroutine übergeben werden, die diese im Hintergrund Byte für Byte abarbeitet. Ohne das "SerialOut" würde ein Print-Befehl warten, bis das letzte Byte abgeschickt wurde, so dass sich jedes Mal ein Stau ergibt, der das zu überwachende Programm unnötig verzögert.

strText = "Hello "
Do
For bytTmp0 = 1 To 10
Print strText ; bytTmp0
Print "This is a Test " ; bytTmp0 'Speed test: no byte confusion

Waitms 10
Print "One Test more" ; bytTmp0
Wait 1
Next bytTmp0
Loop

Zur Überprüfung, ob die Interrupt-Warteschlange auch funktioniert, feuern hier zwei "Prints" nacheinander. Sie kommen im PC sauber an. Die Trennzeichen ";" in den Print-Befehlen kleben die einzelnen Variablen zu einem Ausgabe-String zusammen. Am Ende wird automatisch ein Carriage Return (CR) und ein Line Feed (LF) angefügt. Ein weiteres ";" am Ende des Print-Befehls würde, hier unerwünscht, das angehängte CR/LF unterdrücken. Der String kann maximal 255 Zeichen lang sein.

Sollen übliche Gleitkomma-Messdaten vom Typ Single übertragen werden, sollten sie passend als String formatiert werden, etwa so mit 3 Nachkommastellen:

Dim sngTmp0 As Single
sngTmp0 = 12.345
Print Fusing(sngTmp0, "#.###") 'Format with 3 decimals

Alternative zur Hardware-UART

Wenn wie oben die Hardware-UART schon genutzt wird, beim ATmega328P sind das die Ports PD.0  (RXD) und PD.1 (TXD), kann ein weiterer Ausgabekanal für die serielle Kommunikation mit einer Software-UART an einem freien I/O-Port, hier z.B. PC.3, (ADC3) hergestellt werden. Beim Arduino UNO/NANO mit ATmega328P bedienen PD.0/PD.1 die USB-Schnittstelle.

'Open transmit channel on Port PC.3 for terminal output
Open "comc.3:9600, 8, n, 1" For Output As #1

In 'comc.3' wird der Port PC.3 zu einem UART-TXD-Port.
Mit '9600, 8, n, 1' werden wie oben ($Baud) Baudrate 9600 und Protokoll 8N1 festgelegt.

Wenn die Hardware-UART-Ports (PD.0/PD.1 beim ATmega328P) nicht für die UART benutzt werden, also überhaupt nicht oder als normale I/O-Ports, entfällt das $Baud = 9600-Statement. "Open com..." braucht es nicht.

Die Ausgabe auf das Terminal erfolgt dann so:

Dim strOut As String * 100                        'Output buffer

strOut = ...
Print # 1, strOut

In diesem Fall, nur Ausgabe auf ein Terminal, trifft es nicht zu, wenn aber auch eine Eingabe in den Controller über eine serielle Kommunikation per Software-UART erforderlich ist, sähe das Open-Statement so aus:

'Open receive channel on Port PC.2 for terminal input
Open "comc.2:9600, 8, n, 1" For Input As #2

Vor dem End-Statement müssen die Kanäle formal wieder geschlossen werden, im Output-Beispiel

Close #1
End

Die Software-UART soll nicht ganz so zuverlässig sein wie die Hardwarevariante, insbesondere wenn im Programm viele Interrupts wirksam sind. In der Praxis waren aber bislang keine Ausfälle zu beobachten.


3  COM-Anschluss im Win10 Gerätemanager

Um herauszufinden, mit welchem COM-Anschluss Windows die Kommunikation aufbaut, müssen wir den Gerätemanager in der Systemsteuerung öffnen.
In Win10 ist die Systemsteuerung mit vielen Klicks zu erreichen, so geht's schneller:

  1. Tastenkombination Windows + X drücken.
  2. Im Kontextmenü auf "Gerätemanager" klicken.
  3. Im Gerätemanager auf "Anschlüsse (COM & LPT)" klicken.
  4. In der Liste darunter den betreffenden COM-Port auswählen.
  5. Nach Rechtsklick darauf "Eigenschaften" wählen.

USB-Koppler im Win-Gerätemanager konfigurieren

Abb. 3: COM3-Anschluss im Gerätemanager.

Das USB-UART-Modul hat nach Einstecken des USB-Kabels den virtuellen Port "USB Serial Port (COM3)" belegt. Unter "Anschlusseinstellungen" ist noch das von BASCOM vorgegebene Standardprotokoll zu überprüfen und ggf. einzustellen.

Mit "$Baud XXXX" in BASCOM sind eingestellt:
XXXX Baud, hier 9600,
8N1 (8 Datenbits, No Parity, 1 Stoppbit, keine Flusssteuerung).
$Baud legt zudem die Hardware-UART-Schnittstelle auf zwei fest zugeordnete digitale IO-Pins, bei der ATmega48 bis 328-Familie auf PD.0 = RXD und PD.1 = TXD und konfiguriert die UART wie oben.

Bei anderen USB-Chips, etwa dem CH340G, muss noch ein Treiber aus dem Internet, z.B. [2] installiert werden, für den CP2102 [3]. Den FT232RL erkennen Win10 und auch WinXP ohne weiteres Zutun sofort. Mit ein Grund, etwas mehr für ein FT232RL-Modul auszugeben.


4  Terminalprogramme

Bis WinXP gab es noch Hyperterminal unter Zubehör - Kommunikation. Mit Win10 müssen wir ein externes Programm einsetzen, z.B. [1]. Die gängigsten Freeware-Programme sind HTerm und PuTTY. Beide kommen ohne Installation aus. Mir gefällt PuTTY besser:
PuTTY serielle Konfiguration


Abb. 4: PuTTY Konfiguration, links: Startfenster (Session).

  1. Die Verbindung ist "Serial", egal, ob über RS232 oder USB.
  2. Anklicken zur Konfiguration der seriellen Verbindung (rechtes Fenster).
  3. Benutzte Com-Schnittstelle, hier COM3 (Abb. 3), setzen.
  4. Protokoll wie im Gerätemanager (Abb. 3) eingestellt:
    9600 Baud,
    8N1 (8 Data bits, No Parity, 1 Stop bit, No Flow control).
  5. Open: Schnittstelle öffnen, PuTTY ist empfangsbereit.

Diese Einstellung kann man speichern (linkes Fenster in Abb. 4):

  1. In "Saved Sessions" einen Namen eingeben, z.B. "USB serial COM3".
  2. Save-Button klicken. Der Eintrag erscheint damit im Fenster unter "Default Settings".
  3. Beim nächsten Aufruf diesen Eintrag markieren und gleich auf "Open" klicken oder Doppelklick auf den Eintrag.

Alle Einstellungen und weitere Aktionen lassen sich im laufenden Betrieb mit Rechtsklick auf die Titelleiste ändern.

PuTTY Konfiguration

Abb. 5: PuTTY Rekonfiguration und weitere Aktionen.


5  Verarbeitung mit Excel

PuTTY erlaubt zwar ein Anlegen eines Log-Files oder das Kopieren über die Zwischenablage zur Archivierung des Übertragungsprotokolls, es reizte mich aber, so etwas auch mit meinem Lieblingsprogramm Excel zu realisieren. Versuche mit Excel VBA-Bordmitteln blieben unbefriedigend. Wie immer, wenn die Möglichkeiten von VBA ausgeschöpft sind, bietet der Griff unter die Haube des Betriebssystems mit Windows API's (Application Programming Interface) einen Ausweg. Den Zugriff auf die serielle Schnittstelle erlaubt die Windows-interne Kernel32.dll. Das Einbinden externer DLL oder OCX ist damit unnötig.

Findige Köpfe zeigen im Internet wie das geht. Fast schon passend war das Beispiel in [4]. Zumindest war dort schon mal zu erkennen, wie die Daten aus dem Com-Port abzuholen sind. Abhängig von der Taktrate, mit der der AVR seine Daten abschickt, und der Pause zwischen zwei Lesevorgängen im Excel-Programm (Post delay, s.u.) können allerdings mehrere AVR-Datensätze gepackt in einem Stück ankommen. Da der AVR mit dem Print-Befehl jeden Datensatz mit CR (Carriage Return) und LF (Line Feed) abschließt, musste der Übertragungssatz von der Schnittstelle damit wieder in die einzelnen Datensätze zerlegt werden. Der benutzte Delimiter (CR + LF oder nur LF) ist wählbar. LF und CR, falls vorhanden, werden vor der Anzeige entfernt. Um neben Textdaten auch numerische Daten zu verarbeiten mit der Möglichkeit, diese als Grafik anzuzeigen, werden diese in für Excel bekömmliche Zahlen konvertiert.

Die in mehreren Anläufen zur o.a. Datenkonvertierung entstandene Excel-Anwendung ist im Download zu finden. Sie ist in VBA (Visual Basic for Applications) programmiert. Vor der erstmaligen Nutzung sind daher die aktiven Inhalte (Makros) zu aktivieren. Der Quellcode ist ungeschützt. Ganz Vorsichtige können vor der Aktivierung nachschauen: Es sind keine Viren oder sonstige Ferkeleien dort versteckt. Wer wissen will, ob meine Originaldatei etwa nachträglich verfälscht wurde, mag den SHA-256-Hashwert vergleichen:

ba6163cdde4b81a2d9429116b6b78f6b1095209a35f2527b5856855bcc3c2266  ExcelCommAPI_110.xlsm

Mit den verbreiteten MS Office-Alternativen wie OpenOffice und LibreOffice wird es problematisch. Sie können den Excel VBA-Code nur eingeschränkt verarbeiten, die Schnittstelle zur Kernel32.DLL vermutlich überhaupt nicht. Ausweg eventuell z.B. mit ComVisu [5], für Privatanwender kostenlos.

Wer selber noch Hand anlegen will, die Benutzerschnittstelle ist im Modul Main untergebracht. Die Kernel32 API-Funktionen sind im Klassenmodul CLRS232 gekapselt. Sie werden mit den in Abb. 3 vorgegebenen Eingangsdaten aus dem gelb markierten Bereich des Excel-Sheets COMSet (Abb. 6) versorgt.

Das Excel-Workbook enthält drei Blätter:


5.1   Sheet COMSet

Excel-Sheet COM Set

Abb. 6: Sheet COMSet, Setup der Kommunikationsparameter.

In den ersten 5 gelben Eingabefeldern werden die Com Port-Daten entsprechend Abb. 3 eingestellt. Die in den ersten zwei Feldern (Com Port, Baud Rate) zur Auswahl stehenden Daten können im Excel-Menüband Daten - Datenüberprüfung bei Bedarf erweitert werden.

Mit dem Button 'Check Delimiter' kann vorab geprüft werden, ob Daten empfangen werden und welche Delimiter, nur LF (1) oder CR + LF (2) in den AVR-Datensätzen verwendet werden. Der Delimiter muss gesetzt sein (1 oder 2), da das Leseprogramm diesen Parameter verwendet, um das Ende von AVR-Datensätzen zu erkennen.

Post Delay legt eine Pause (in sec.) nach jeder Schreib- oder Leseoperation fest. Falls die Daten nicht korrekt ankommen, kann die Zeit hier geändert werden.


5.2  Sheet COMData

Hier wird die Datenaufnahme gesteuert und angezeigt. Daten liefern zwei AVR-Programme für ATmega328P/Arduino:
USB-Kopplung_002.bas / .hex: Textdaten
USB-Kopplung_003.bas / .hex: Numerische Daten, Sinusfunktion.

Excel-Sheet COM Data


Abb. 7: Sheet COMData, Empfang von Textdaten aus USB-Kopplung_002.hex.

Anzahl XX aufzunehmender Übertragungssätze: End with XX records.
Ein empfangener Übertragungssatz (Record) kann mehrere AVR-Datensätze enthalten.
Eingabe XX = 0: Endlosschleife, Beenden mit Klick auf Button 'Stop Com'.
Eingabe XX > 0: Es werden XX Übertragungssätze gelesen. Währenddessen ist Excel zur Beschleunigung der Datenaufnahme gesperrt, damit auch die Buttons.
Der aktuelle Übertragungssatz wird unten in der Statuszeile angezeigt.

Button 'Start Com': Übertragung starten.
Button 'Stop Com': Übertragung beenden, falls die Endlosschleife gewählt wurde.
Button 'Show graph': (Nur) numerische Daten als Chart visualisieren. In Abb. 7 für Text abgeblockt.
In den Zellen F3 bis I3 können Position und Größe des Charts eingestellt werden.

Excel-Sheet Übertragungsprotokoll


Die Grafik wurde nach Klick auf 'Show graph' automatisch erzeugt.


5.3  Sheet RawData

Hier werden die Rohdaten, so wie sie ankommen, nur zwischengespeichert, um einen unverzögerten Datenfluss zu gewährleisten. Erst wenn die Übertragung beendet ist, erfolgt die Auswertung, d.h. Zerlegung der Übertragungssätze in einzelne AVR-Datensätze mit Hilfe des Delimiters, Prüfen Text / numerisch, bei letzterem Prüfen des Dezimalzeichens, ggf. Korrektur, und Konvertierung in einen Zahlenwert. Dann erst werden die Daten in das Sheet COMData geschrieben.


5.4  Die COM-Schnittstelle


Input-Variable Funktion
.ComPort Nummer des Com-Ports, z.B. für Com3 eine 3
.BaudRate Baudrate
.Parity Parität (N=None, keine; O=Odd, ungerade; E=Even, gerade)
.Databits Anzahl Datenbits
.StopBits Anzahl Stopbits
.PostCommDelay
Pause in sec. nach einer Read- oder Write-Operation

Operationen (Methoden) sind:

Methode Funktion
.OpenComms
Com-Port mit den oben definierten Input-Parametern öffnen
.WriteComm
Einen Text-String in den Com-Port schreiben, Übergabe in Puffer .Data
.ReadComm
Einen Text-String aus dem Com-Port lesen, Übergabe in Puffer .Data
.FlushComms
Read/Write Text-Puffer .Data löschen
.CloseComms
Com-Port schließen

Zu beachten sind die Punkte vor den Variablen und Methoden, etwa ".Data".

Referenzen
[1] https://www.heise.de/download/products/netzwerk/remote-access#?cat=netz…
[2] https://learn.sparkfun.com/tutorials/how-to-install-ch340-drivers/all
[3] https://www.silabs.com/products/development-tools/software/usb-to-uart-…
     https://shop.in-circuit.de/data/manual/301000001A_CP2102.pdf
[4] https://www.ozgrid.com/forum/index.php?thread/149027-com-serial-port-to…
[5] http://comvisu.de/index.htm


Download                      

USB_UART_Interface_Schematics&PCB.zip        

USB_UART_Interface_Software_110.zip