Forum: Mikrocontroller und Digitale Elektronik Baudrate Converter


von Dieter G. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

im Rahmen der Entwicklung einer Amateurfunk-Relaissteuerung auf Basis 
von Svxlink möchte ich ein kleines Teilprojekt publizieren, das 
eventuell auch für andere Anwendungen interessant ist.

Anforderung:

Baudrate-Konvertierung 1,5 MBaud auf 115,200 kBaud mit integriertem 
receive buffer und Software-Handshake

Problemstellung:

Die erste Version der Svxlink-Relais-Steuerung wurde mit dem Raspberry 
Pi 3 ausgestattet, der aber immer wieder Probleme machte (kaputtes 
Filesystem der SD-Karte).
Da der Pi in dem Zustand im Linux Maintenance Mode hängen blieb, in dem 
kein Netzwerk verfügbar ist, war per Remote kein Netzwerkzugriff 
möglich.

Die wichtigsten Anforderungen an ein neues Design u.a. waren:
- das Linux-OS auch im run level 1 oder 2 (also ohne Netzwerk) zu 
erreichen
- bei Stromausfall den SBC kontrolliert und autark herunterzufahren und 
nicht einfach herunterkrachen zu lassen (erfordert Batteriebetrieb und 
-ladung)
- LCD-Display und Tastenbedienung

In der zweiten Version wurde anstelle des Pi 3 ein NanoPC-T4 verwendet. 
Das u.a. auch wegen der Bootmöglichkeit von der NVME-SSD. Der T4 bietet 
eine serielle Schnittstelle, über die der T4 auch im maintenance mode 
per Telnet erreichbar ist.
Diese Schnittstelle sollte über einen RS232/TCPIP-Converter adaptiert 
werden. Allerdings bietet diese Schnittstelle nur eine recht unübliche 
Baudrate von 1.5MBaud.
Da der TCP/IP-Converter, wie er bei ebay vielfach angeboten wird, nur 
eine maximale Baudrate von 115200 schafft, habe ich kurzerhand einen 
Konverter auf Basis des AtTiny 841 dazwischengehängt.

Realisierung:

- die Taktrate von 12 MHz ist für polling-Betrieb hinreichend hoch, so 
daß keine Interrupts und damit kein Stack nötig ist.
- alle nötigen Variablen werden in den verfügbaren Registern gehalten.
- somit ist das komplette RAM von 512 Bytes für den receive buffer 
verfügbar.
- die gerade Anzahl von 512 Bytes machen die Verwaltung der read/write 
pointer des als Ringpuffer realisierten receive buffers wesentlich 
einfacher.

Daher war es möglich die Software entsprechend minimalistisch zu 
gestalten.

Erreicht der Füllgrad des buffers ein oberes Limit, wird XOFF gesendet 
und bei Erreichen eines unteren Limits wieder ein XON.
Die thresholds ist so gesetzt daß in meinem Anwendungsfall keine buffer 
overflows passieren.

Die gesamte Schaltung funktioniert mittlerweile seit über einem Jahr 
ohne Probleme.

Im Anhang der Sourcecode und die Solution Files für das Microchip 
Studio.

von Dieter G. (Gast)



Lesenswert?

Anbei noch der KiCad-Auszug

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.