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 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]. Es liefert allerdings mehrere AVR-Datensätze gepackt in einem Stück ab. Da der AVR mit dem Print-Befehl jeden Datensatz mit CR (Carriage Return) und LF (Line Feed) abschließt, wurde der Stream von der Schnittstelle damit wieder in die einzelnen Datensätze zerlegt. Der benutzte Delimiter ist LF, so dass auch nur mit LF abgeschlossene Datensätze aus anderen Quellen erkannt werden. LF und CR, falls vorhanden, werden vor der Anzeige entfernt.

Excel communication sheet

Abb. 6: Excel-Sheet zur Datenübertragung vom AVR.

Neben Debugging-Ausgaben könnten damit natürlich auch Text-formatierte Daten wie oben gezeigt vom Mikrocontroller nach Excel zur weiteren Auswertung gesendet werden.

Das Excel-Sheet ist im Download zu finden. Es 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 Originaldateien etwa nachträglich verfälscht wurden, mag die SHA-256-Hashwerte vergleichen:

4245c6248941d07b16df3889c7e09175169747069f5a184ad316e8b8f8018129    ExcelCommAPI_100.xlsm
75ceccc4bedc1ab0f38f4a671954111335f04c27fbe86c49700be78a787518fb         ExcelCommAPI_100.xls
1421c20bad40930d2823ba702516f283c45e239d4d0a51ec17b551a063b28b42  ExcelCommAPI_101.xlsm
e46752e0f157b4bfa209c97e33d85317a2191fbd0ade340f0b081d118aa1d213       ExcelCommAPI_101.xls

Die verbreiteten MS Office-Alternativen wie OpenOffice und LibreOffice sind ungeeignet. Sie können den VBA-Code nicht verarbeiten.

Das Excel-Sheet liegt in zwei Formaten vor:
.xlsm, entwickelt und getestet mit Excel 2010 SP2 (32 Bit) unter Win10 (64 Bit)
.xls, getestet mit Excel 2000 SP3 unter WinXP SP3.

Wer selber noch Hand anlegen will, die Benutzerschnittstelle ist in Sub StartCom im Modul Main untergebracht. Die Kernel32 API-Funktionen sind im Klassenmodul CLRS232 gekapselt. Sie werden mit den in Abb. 4 vorgegebenen Eingangsdaten aus dem gelb markierten Bereich des Excel-Sheets (Abb. 6) versorgt. Die in den ersten zwei Feldern (Com Port, Baud Rate) zur Auswahl stehenden Daten können im Excel-Menüband Daten - Datenüberprüfung - Datenüberprüfung bei Bedarf erweitert werden.

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

Update V1.01, 26.04.2020:
Das Excel-Sheet V1.00 eignet sich weniger zur Aufnahme von Datenreihen. Es wurde daher in zwei Blätter aufgeteilt, Blatt 1 zum Setup des Com-Ports, Blatt 2 zur Datenaufnahme mit automatischer Scroll-Funktion.

 

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…

Einordung