AVR-PC-Kopplung über USB

Gespeichert von DL6GL am Do., 16.04.2020 - 15:52
UART-USB Interface

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.

USB-UART interface schematics

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 (RXD/TXD) erfolgt auf die gleiche Weise. Die Handshake-Anschlüsse RTS, DTR und CTS werden i.d.R. nicht gebraucht.

USB-UART interface PCB

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

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. 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

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. Links unten in der Taskleiste auf das Windows-Symbol "Start" klicken.
  2. "Systemsteuerung" eintippen. Es reicht auch nur "System".
  3. Im rechten Teil des Fensters Systemsteuerung auf "System" klicken.
  4. Im Fenster "Startseite der Systemsteuerung" auf "Gerätemanager" klicken.
  5. Im Gerätemanager "Anschlüsse (COM & LPT)" öffnen.
     

Windows device manager

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).

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 configuration

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 Reconfiguration

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

Die verbreiteten MS Office-Alternativen wie OpenOffice und LibreOffice sind ungeeignet. Sie können den VBA-Code nicht verarbeiten. Ausweg z.B. 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

Sheet COMSet

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.

Sheet COMData, text 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.

Sheet COMData, numeric data, sine

Abb. 8: Sheet COMData, Empfang von numerischen Daten (Sinus) aus USB-Kopplung_003.hex.

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 Stoppbits
.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

 

Einordung