Gerd Heinz, 14.12.2014
Reduziert man Kommunikation auf das absolute Minimum, entsteht eine sehr einfache Schnittstelle, die vom Prinzip her schon in ersten NOKIA-Handies als M-Bus vorhanden war [5]. Als Grundlage der seriellen Schnittstelle [8] sind UART-Schnittstellen nahezu in jedem Mikrocontroller vorhanden. Legt man Rx und Tx der UART auf einem Draht zusammen, entsteht ein "Single Wire Asynchronous Receiver Transmitter" (SWART). SWART ist im Bereich intelligenter Sensorik und Aktorik bei niedrigen Datenraten oder kurzen Entfernungen vorteilhaft anwendbar. Im Vergleich zu I²C oder LIN ist SWART unkompliziert und potentiell viel flexibler einsetzbar, da keinerlei Libraries oder Spezialhardware erforderlich sind. Eine Schottky-Diode hat jeder: Einfach mal ausprobieren. Das Bild zeigt nicht etwa die deutsche Flagge, sondern die SWART-Steckerbelegung bei Verwendung von Futaba-Verlängerungskabeln für Funkfernsteuer-Servos.
Was man sich wünschen würde, wäre eine Implementierung von SWART (ohne Schottky-Diode) in jedem Mikrocontroller. Aber dieser Ruf kam bei den ehemaligen Kollegen vom IC-Design noch nicht an.
Seit es Ethernet, USB oder RS485 gibt, kann die serielle Schnittstelle in Punkto Störsicherheit, Geschwindigkeit oder Reichweite nicht mehr mithalten. Ihr bleiben der Sensor- und Aktormarkt bei vergleichsweise kurzen Entfernungen und niedrigen Datenraten.
Viele Bemühungen galten und gelten der Gestaltung einfachster Kommunikation mit wenigen Leitungen. Man denke an I²C, Dallas 1-Wire etc.. Im Gegensatz zu Spezialprotokollen sind UART weltweit verbreitet.
Größtes Ärgernis bei der Nutzung von UARTs sind die zwei Datenleitungen TX (für transmit) und RX (für receive) bei gleichartigen Geräten. Immer wieder kommt es in der Praxis vor, daß bei der Verbindung von zwei gleichartigen Geräte RX auf RX und TX auf TX zu liegen kommt.
Um Gleichartige zu verbinden, wird ein Spezialkabel benötigt, bei dem RX und TX gekreuzt sind. Bei der RS232 hieß das "Null-Modem-Kabel", es diente der Verbindung gleichartiger Geräte (z.B. PC zu PC).
Abb.0: Ein speziell gekreuztes Kabel ist zur Verbindung gleichartiger UARTs nötig, damit jeweils TX auf RX geht.
Damit sind stets zwei Sorten von Kabeln vorzuhalten: ungekreuzte und gekreuzte. Und wehe, man steckt das falsche Kabel! Dann senden die Ausgänge TX gegeneinander und es gibt einen Kurzschluß.
Auch ist eine Kommunikation von mehr als zwei Geräten auf einem Bus prinzipiell nicht möglich, weil TX nur low oder high ausgeben kann, aber kein Abschalten vorgesehen ist.
Zur Überwindung dieser Probleme wird hier eine Single-Wire UART (SWART) Verbindung vorgestellt, die auf UART aufbaut. Diese ist im Bereich intelligenter Sensorik und Aktorik bei niedrigen Datenraten und kurzen Entfernungen vorteilhaft anwendbar.
Mehr als zwei Teilnehmer können mitarbeiten, Probleme mit gekreuzten Kabeln entfallen vollständig.
Universal Asynchronous Receicer Transmitter (UART oder USART z.B. innerhalb einer RS232) [9] stellen das Fundament der Kommunikation dieser Erde dar. Sie sind aus dieser Welt nicht wegzudenken und unter der Oberfläche praktisch überall vorhanden.
Der UART als (nichtinvertierenden) Kern der "Seriellen Schnittstelle" stehen dutzende Softwaretools zur Verfügung. Die 8-Bit Variante der UART kommt UNIX-, LINUX- wie DOS-artigen Programmen entgegen, Tools wie PuTTY, Brayterm, Hyperterminal oder Hterm stehen zur Verfügung.
Da bis heute praktisch jede textuelle Kommunikation auf UART und ASCII aufbaut, man denke an Telnet, Email, SSH, HTML etc. würden Hardware, wie Softwareentwicklungen einfacher und übersichtlicher werden, ließe sich die serielle Schnittstelle auf mehrere Geräte erweitern.
Nicht zuletzt leisten schon kleinste Logikanalysatoren (Saleae, USBee u.a.) eine perfekte ASCII/Hex-Decodierung des seriellen Datenstroms.
Hilfsmittel für UART-artige Protokolle sind weltweit verbreitet. USB-VCP-Tunnel bilden eine einfache Chance, vom PC aus mit UART-Geräten zu kommunizieren.
Kommt man mit dem Prinzip "entweder senden oder empfangen" (simplex) aus, wird der Übergang auf die hier diskutierte Eindraht-UART (SWART) viel Freude mit sich bringen: Einfacher kann man nicht kommunizieren!
Die SWART könnte überall dort Freunde gewinnen, wo es klein und fein hergeht. So zum Beispiel ist es denkbar, die pulsweitenmodulierte Schnittstelle von (Modellbau-) Servos durch eine SWART-Schnittstelle abzulösen.
Wenn wir von UART und SWART reden, dann in der Standard-Variante 8n1n (8 Bit, keine Parität, 1 Stoppbit, keine Flußkontrolle). Zu übertragende Daten liegen heutzutage meist als Byte (8 Bit) vor.
Zu beachten wäre noch, daß UART nicht RS232 ist, auch wenn beide als "serielle Schnittstelle" bezeichnet werden: Während die RS232 mit negierten Bitwerten und mit zwei hohen Betriebsspannungen von 12...15 Volt daherkommt, arbeiten UARTs mit nichtinvertierten Bits und mit einer einzigen Betriebsspannung von 3...5 Volt.
Im Beitrag wird nur die Hardware diskutiert. Da Anforderungen an Kommunikationsprotokolle von Anwendung zu Anwendung extrem variieren, werden Festlegungen dazu bewußt vermieden. Nur eine vage Idee wird im letzten Abschnitt angedeutet.
Ein Sensor-Experiment mit SWART
Für ein geplantes Forschungsprojekt [1] mit dem Institut für Physik der Humboldt-Universität Berlin wurde ein Sensorknoten, bestehend aus einem ATtiny85 Mikrocontroller mit Wasserstoff-Sensor, mit einer Soft-UART in SWART-Ausprägung versehen, siehe Quelltexte weiter unten.
Er mißt die Kapazität eines Wasserstoff-Sensors und ermittelt dessen Istwert. Ein Sollwert einer kritischen Wasserstoff-Konzentration kann mit einem Taster ins EEPROM eingelesen werden, bei dieser Konzentration löst der Mikrocontroller einen Alarm aus [1].
Erfahrungen sollten im Umgang mit SWART gesammelt werden: Wieviele Sensoren lassen sich anschließen; mit welchen Buslängen darf man rechnen; wie stark wird der Bus bei welchen Baudraten durch Interferenzen (EMV) gestört; welche Baudraten sind unter welchen Konditionen erreichbar etc..
Auch war vorgesehen, ein minimalistisches SWART-Busprotokoll zu entwickeln und zu erproben. Leider wurde das Projekt aus verschiedensten Gründen nicht realisiert, eine Projektförderung kam nicht zustande. So blieb es bei diesem Experiment.
Abb.1: SWART-Bus mit drei Geräten. Bild oben vlnr.: USB-VCP-Adapter, Wasserstoff-Sensor und LCD. Die blaue LED am Sensorknoten gibt Alarm. PuTTY und LCD zeigen parallel die Meßwerte des Wasserstoff-Sensors an. Unten: Kommunikationsprinzip und Sensorschaltung nach [1].
PuTTY kann Eingaben an den H-Sensor machen oder Parameter des LCD abfragen/setzen. Wenn sich die Sprachsyntax von Sensor und LCD nicht überschneiden, ist nicht einmal ein Protokoll nötig, um die drei Geräte kommunizieren zu lassen.
Einstellbar sind hier 9600 bis 115200 Baud, 8n1n. Historisch gewachsen befindet sich die Schottky-Diode D1 im USB-Adapter, der Pull-Up Widerstand am H-Sensor. Zur Verdrahtung dienen 3-polige Servokabel (Typ Futaba) aus dem Modellbau (sw: GND, rt: +5V, ws: RTX).
Obwohl der low-Pegel durch die Dioden um etwa 0,3 Volt angehoben wird, funktioniert die Lösung bei verschiedenen Anwendungen tadellos. Verwendet man zum Beispiel Schottky-Dioden vom Typ TSS42U im Gehäuse 0603, so fällt bei 1mA weniger als 0,28V über der Diode ab. Bei einer Reverse-Voltage von 1V ist deren Kapazität mit 10 pF angegeben. Damit wäre die Prinziplösung sogar marktfähig.
Abb.2: Prinzip einer Single Wire Asynchronous Receiver/Transmitter (SWART) Schnittstelle. Der high-Pegel wird von einem Pull-Up-Widerstand gezogen. TX wird über Schottky-Dioden an RX angeschlossen und zieht nur beim Bitwert "low" nach unten.
Es entsteht eine Kommunikation ("simplex"), die Eigenschaften der UART-Variante der 2-Draht RS485 teilt: Gegensenden ist zwar nicht möglich, aber gefahrlos. Beim Senden eines Byte sollte man vorab den eigenen Empfänger ausschalten.
Gegenüber der RS485 allerdings ist sie harmlos: Wird versehentlich gegengesendet, werden nur Bits gestört, es kann nichts durchbrennen.
Abb.3: Versuchsaufbau einer SWART als Erweiterung eines USB-VCP Adapters (Basis FTDI FT232RL) [11].
In einem ersten Versuch (Abb.2) wurde ein vierpoliger Stecker eines USB-VCP-Adapters (GND, VDD, TX, RX) mit einer Schottkydiode (Pfeil) zur SWART umfunktioniert. Es kam eine eigentlich viel zu große Schottkydiode (mit hoher Kapazität) zum Einsatz. Aber selbst die tut es.
Mehr zu USB-UARTs und Ethernet-UARTs siehe [11] und [12].
Wie lang kann ein SWART-Bus sein?
Die maximale Länge eines SWART-Busses soll berechnet werden. Sie wird durch die kapazitive Belastung und den pull-up Widerstand (4,7 kΩ) begrenzt.
Die Bitdauer bei einer SWART-Datenrate von 115200 Baud beträgt 8,68 µs. Für eine saubere Datenübertragung nehmen wir eine zu realisierende Spannungsanstiegsdauer dt von kleiner einer Mikrosekunde an (dt = 1 µs).
Bei den hier verwendeten, dreiadrigen Servo-Kabeln aus dem Modellbau mißt man eine Kapazität von etwa 60 pF pro Meter bei nebeneinander liegenden Adern.
Bei einer Betriebsspannung VCC = 5V und einem pull-up Widerstand von 4,7 kΩ zieht dieser mit rund I = 0,5 mA bei dU = 2,5 V die RTX-Leitung hoch.
Wir stellen die bekannte Gleichung dU/dt = I/C nach C um, und erhalten
Bei 115200 Baud können wir dann problemlos ein etwa 3 Meter langes Kabel mit 180 pF treiben, ehe die LH-Flanke zu langsam wird.
Senken wir die Baudrate auf 9600 Baud, so ist mit einer Bitdauer von 104 µs zu rechnen. In diesem Fall können wir uns eine LH-Flankendauer von dt = 10 µs leisten.
Entsprechend ließe sich mit R = 4,7 kΩ bei 9600 Baud ein zehnfach längeres, etwa 30 Meter langes Übertragungskabel treiben.
Zu berücksichtigen wären allerdings zusätzliche, parasitäre Kapazitäten anderer Busteilnehmer. Auch ist dann der ohmsche Spannungsabfall über VCC und GND auf dem Kabel zu beachten.
Bei langen Leitungen sollte man deshalb nur GND und RTX übertragen und weit entfernte Transmitter separat mit VCC versorgen.
Ob diese Zahlen in Praxis zutreffen, wäre allerdings noch zu erproben, zumal elektromagnetische Einstrahlungen externer Störquellen nicht berücksichtigt sind.
Unsere kleinsten Mikrocontroller (z.B. ATtiny) haben meist keine UART als Baugruppe. Hier haben wir die UART per Software nachzubilden. Versuchen wir, die Bedingungen für die Programmierung des UART-Portpins auszuloten, machen wir interessante Entdeckungen.
Um UARTs in quartzlosen, kleinsten Microcontrollern per Software realisieren zu können, hat sich eine Methode bewährt, die große Toleranzen der Bitzeiten erlaubt: Sendet man zwei STOP-Bits und empfängt man mit einem STOP-Bit, so steht eine ganze Bitzeit als Toleranz für jedes Byte zur Verfügung. Der Bittakt kann dann bis zu 10% differieren. Allerdings ist nach Empfang ein zusätzliches Leerbit einzufügen, ehe wieder gesendet werden darf. Aber das entsteht in der Software meist ohne zutun.
So gesehen, trifft die Standardvariante 8n1n für quartzlose SWART-Geräte nicht ganz zu, besser wäre es vielleicht, bei SWART von 8nXn zu sprechen, wobei für den Sender X=2 und für den Empfänger X=1 gilt - mit zusätzlichem Leerbit.
Das Prinzipbild Abb.1 zeigt schon, daß es nicht nötig ist, den high-Pegel aktiv auszugeben. Den zieht bereits der pull-up Widerstand. Auf das Senden des high-Pegels können wir folglich verzichten. Wird gesendet, besitzt unser Port-Pin nur zwei Zustände.
Einerseits haben wir den low-Zustand zu senden, andererseits ist das Senden des high-Zustands überflüssig, stattdessen können wir hier auf Empfang umschalten. Wird nun empfangen, genügt ebenfalls dieser Zustand. Insgesamt kommen wir also mit der Initialisierung zweier Zustände am Portpin aus:
Abb.4: Realisierung einer SWART für Mikrocontroller in Software. Es ist lediglich ein Pullup-Widerstand nötig, der sinnvoll auf zwei Widerstände mit doppeltem Wert aufgeteilt werden kann.
In der Praxis kann die Initialisiserung des RTX-Portpins für einen ATtiny85 dann so aussehen (Auszug C-source AVR-Studio4):
/* UART Tx/Rx Zustände für Single-Wire UART (Rx und Tx liegen auf einem Pin): Uout Tx sendet low outport low Uout Tx sendet high inport mit pullup Uin receive inport mit pullup --> nur zwei Zustände sind nötig: receive und sendL */ #define receive { bitclr(Udir, Upin); bitset(Uoport,Upin); } // input pup #define sendL { bitset(Udir, Upin); bitclr(Uoport,Upin); } // output low #define sendH { receive; } // output over pullup
"Udir" stellt das Richtungsregister dar, "Uoport" das Ausgaberegister. "Upin" ist die Nummer des Portpins. Wir sehen, daß drei Zustände codiert wurden, der Zustand "sendH" ist dem Zustand "receive" identisch. Die Definition des Zustands "sendH" ist eigentlich überflüssig, er verbessert nur die Lesbarkeit der aufrufenden Routine fputc(). Die kann zum Beispiel so aussehen:
// Soft_UART TX für ATtiny85 void fputc(uint8_t ch) { // ein UART Zeichen senden // non-inverting-UART // soft-send one character bit by bit uint8_t i=0; // send startbit low: starteBittakt(OneBitDelay); // start timer with bit clock sendL; // startbit low waitabit(); // wait for next clock // send 8 bits: for (i=0; i<8; i++) // send all bits of "ch" { // sende jeweils das LSB (rechtes) if ((ch & 0x01)) // if right most bit is one { sendH; } // send one else // if right most bit is zero { sendL; } // send zero ch = ch >> 1; // bit shift right (send LSB) waitabit(); // wait for next clock } // sende 2 Stopbits (lieber bissel zuviel, erhöht Fehlertoleranz): sendH; // send stopbit = high waitabit(); // erstes Stopbit waitabit(); // zweites Stopbit -> interner RC-Osz. beendeBittakt(); // receive; // Empfang mit pullup == sendH }
Realisierung mit "harten" UARTs
Größere Prozessoren, man denke an ATmega, aber auch an FT232RL, bieten nun eine UART-Baugruppe in Hardware. Will man leicht erhöhte low-Pegel, wie in der Prinziplösung dargestellt, aus Gründen der Störsicherheit reduzieren, können wir die Schottkydioden durch nMOS Transistoren (n-channel enhancement) ersetzen. Die gibt es preiswert im SOT23-Gehäuse (BSS123, BSS138, BSN20...), siehe Abb.5.
Dabei ergibt sich allerdings ein Problem. Der nMOS-Transistor negiert den TX-Signalpegel. Zur Kompensation haben wir das Signal vorab zu negieren. Eine vorab-Negation des auszugebenden Bytes per Software würde nicht genügen, da durch den Transistor auch Start- und Stopbit negiert werden würden.
Plant man, zwei Module mit einer SWART auszurüsten, so kann man vorteilhaft auf jeder Platine einen Pullup-Widerstand anordnen, in Abb.5 erscheint er deshalb in zwei Hälften geteilt.
Plant man eine busarige Vernetzung mehrerer SWART-Units, so ist der halbe Pullup je nur an zwei Endpunkten zu bestücken. Oder man bestückt nur einen Pullup irgendwo am Bus. Oder man nutzt die soft-steuerbaren, internen Pullups der Controller.
Abb.5: Werden Mikrocontroller mit UARTs in Hardware benutzt, empfehlen sich nMOS-Transistoren zur Kopplung. Vorab ist das Signal zu negieren.
Gegenüber der eleganteren, Software-basierten SWART, wie auch gegenüber der Lösung mit Schottkydioden ist diese Lösung recht aufwendig. Um aber einen Zugang zu einem SWART-Modulsystem zu bekommen, wird sie sich am Busmaster (z.B. FTDI, USB-VCP) nicht vermeiden lassen.
Bei mir genügt die Lösung mit einer Schottkydiode für Zwecke des Debugging. Man kann hoffen, daß Prozessorhersteller irgendwann aufspringen werden und ihre UARTs um einen Inverter, ein Registerbit namens "SWART" und ein SWART-Pin (das könnte auch das RX-Pin der UART sein) erweitern werden. Freie, reservierte Register-Bits sind bei Atmel-Prozessoren meist ohnehin vorhanden.
Zur optimalen Leiterkartenentflechtung wie zur Kurzschlußvermeidung bei Verpolung hat sich eine dreipolige Anordnung in der bei Modellbau-Servos üblichen Form in der Bauart Futaba im 100 mil Raster (2,54 mm) bewährt:
Abb.6: Für Experimente können Servostecker als SWART-Stecker genutzt werden (hier Bauart Futaba). vlnr: Stecker, Kupplung (Buchse), Layout (Sicht auf Buchse)
Erweitert man diesen Stecker auf die Möglichkeit, auch duplex arbeiten zu können, ergibt sich für den Bus-Master vorteilhaft eine kompatible Anordnung des TX-Sendepins als Pin-Nummer 4.
Aber bei der Verwendung von TX steckt der Teufel wieder im Detail. Beim zugehörigen Slave UART wären die RX- und TX-Pins zu vertauschen!
Der Anfang mit SWART ist schnell gemacht. Abb.7 zeigt einen Combi-Adapter für SWART oder UART auf Basis eines USB-VCP Wandlers von FTDI. Wird die Schottkydiode D4 bestückt und ist BU2 3-polig, arbeitet die Schaltung als SWART. Wird BU2 vierpolig bestückt und wird D4 weggelassen, arbeitet sie als gewöhnliche UART. TSS42U ist eine Schottkydiode im 0603 Gehäuse mit geringer Kapazität und geringer Durchlaßspannung bei kleinen Strömen.
Abb.7: Schaltung eines USB-Combi-Adapters für UART oder SWART. Wird die Schottkydiode D4 bestückt und ist BU2 3-polig, arbeitet die Schaltung als SWART. Wird BU2 vierpolig bestückt und wird D4 weggelassen, arbeitet sie als gewöhnliche UART.
SWART-Multiplex mit der Betriebsspannung
Eine Lösung, deren Eigenschaften den iButtons oder dem 1-Wire Verfahren ähneln, entsteht durch Multiplexing mit der Betriebsspannung. Vorausgesetzt, unser Sensor hat einen minimalen Strombedarf, können wir im Protokoll High-Pausen definieren, in denen niemand zu senden hat. Die Pausen dienen der Hochladung der RTX-Leitung zur Übertragung der Betriebsspannung.
Ein einfaches Verfahren wäre auch die Sendung eines Bytes 0xff vom Master nach jedem Nutzbyte. Damit kann eine hinreichende Menge an Energie transferiert werden, die für verschiedene Sensoren mit einer Stromaufnahme im Mikroamperbereich genügt.
Allerdings schränkt die Implementierung des Verfahrens zur Hochladung das Kommunikationsprotokoll ein: Es wird unvermeidlich proprietär werden.
Zur Hochladung ist eine (unsymmetrische) Master-Slave Struktur mit einem Pullup-Transistor (Abb.8) sinnvoll. Die Kommunikation ist blockiert, wenn dieser eingeschaltet ist. Pausen sollten definiert werden, um Senden oder Gegensenden während des Hochladens zu vermeiden. Der Master unterscheidet sich nun gravierend von den Slaves.
Man beachte, daß der Master neben dem Pullup-Transistor (T3) einen Pullup-Widerstand (Rpu) besitzen muß: Letzterer wird für die Slaves gebraucht. Wenn diese senden, muß der Pullup-Transistor gesperrt bleiben. Nur der Pullup-Transistor selbst ließe sich noch einsparen.
Abb.8: Stromsparende Sensoren lassen sich über Betriebsspannungs-Multiplex mit SWART verbinden. Ein pMOS-Pullup-Transistor T3 kann zusätzlich das Hochladen verstärken, wenn der Slave nur empfangen muß. Die Schottky-Diode D1 überträgt die Energie zur Betriebsspannung VDD des Slave
Schutzschaltungen an den Pins unserer Controller sind fast generell mit Schutzdioden nach VDD und GND versehen. Die interne VDD-Schutzdiode eines Slave-IC wird meist genügen, eine externe Schottky-Diode D1 entfällt dann. Der Energiespeicher C1 läßt sich einsparen, wenn Pausen zwischen den Hochladungsphasen so kurz wie möglich und definiert kurz sind. Zum worst-case Scenario wird die Übertragung eines Byte aus Nullen: 0x00.
Wie schon bemerkt, können mehrere SWART-Units physisch an eine RTX-Leitung angeschlossen werden. Es entsteht ein relativ langsamer Bus, der mit verfügbaren Terminal-Tools zu debuggen wäre, der aus nur einer Leitung besteht und der für intramaschinelle Kommunikation, z.B. auch in Robotern oder PKW, geeignet wäre.
Bliebe eine anwendungsspezifische Protokolldefinition offen. Da nun mehrere Slaves angeschlossen sind, benötigt jeder eine eigene Adresse. Mit der Einführung von Adressen und damit verbunden eines spezifischen Busprotokolls würde die Schnittstelle allerdings recht anspruchsvoll werden.
Abb.9: SWART-Bus. Mehrere SWART-Transceiver sind gleichberechtigt auf einer Leitung verbunden.
Im Falle unseres Wasserstoff-Sensors nach Abb.1 sendet der Sensor gleichzeitig an Display und PC, Tastatureingaben werden vom Sensor verarbeitet und auf dem Display angezeigt. Weil sich die Sprachsyntax von LCD und Sensor nicht überschneiden, benötigen die Bus-Teilnehmer keine Adressen.
(Vereinfacht 01/2023 - weniger ist mehr!)
Nur als Hilfestellung für ein mögliches Protokoll: Es sollte und könnte einfach sein. Bleiben wir beim ASCII, können wir ohne Spezialterminal mitlesen.
Das Protokoll könnten wir z.B. "SWART-Bus" nennen.
Ein Startbyte, nach dem alle schweigend zu lauschen haben, macht den Anfang. Idealerweise reservieren wir dafür kein Zeichen: Wer anfängt, bekommt den Bus (die UARTs sind schließlich asynchron). Gegenüber einem LOW auf allen Bits hätte dies den Vorzug, daß wir im Paket auch Hex-Zahlen senden könnten.
Wenn der Adressraum physisch 52 Devices nicht übersteigt (ASCII: a...z und A...Z), so könnte die Adresse aus drei Byte bestehen. Im ersten steht der Empfänger, im zweiten der Sender, im dritten die Größe des Datenpakets als Zweierpotenz als ASCII "0 ... 9" (2^0 ... 2^9 = 1, 2, 4, 8, 16, 32, 64, 128, 256, 512).
So hieße "Yk4": Knoten "k" sendet an Knoten "Y" genau 2^4 = 16 Byte Daten.
Hintenan könnte man noch eine ASCII-Checksumme senden.
Was mich persönlich an einem solchen Protokoll reizen würde: Es wäre unkompliziert. Man kann sich in Ruhe der eigentlichen Entwicklungsaufgabe widmen und vergeudet nicht Tage oder Wochen, um den Bus zu verstehen und Bus-Probleme zu fixen.
Aber die Zukunft der Kommunikation sieht wohl anders aus. Aus heutiger Sicht wäre eine völlig andere Sichtweise auf ein Busprotokoll denkbar.
Reagiert ein Gerät nur auf seine eigenen, spezifischen Sprachelemente und sind diese den anderen Beteiligten fremd, dann benötigt man überhaupt kein Busprotokoll. Jeder reagiert nur auf die ihn betreffenden Sprachelemente. Wir sind dann bei moderner KI-Forschung angekommen.
Spätere Arbeiten an einem DCC-Stellwerk für Modellbahnen [10] verdeutlichten, daß Busprotokolle noch minimalistischer ausfallen können, wenn man sich vorab mit den Sprachelementen der beteiligten Geräte beschäftigt und diese innerhalb einer "Sprache" aufeinander abgleicht.
Erst nach Abschluß dieses Artikels fiel auf, daß die hier vorgestellte SWART-Schnittstelle nicht neu ist: Der Pionier Nokia hatte Ende der 1990er Jahre in die damals neuesten NOKIA-51xx/61xx-Smartphones einen sogenannten "M-Bus" integriert, dessen Hardware der hier vorgestellten Variante entspricht, siehe [5], [6], [8] und [13]. Der M-Bus arbeitet simplex (half-duplex) mit 9600 Baud.
Unter den Links auf [6] und [13] finden sich RS232-Adapter für Nokia's M-Bus:
Abb.10: Serieller Bus-Adapter für den Nokia M-BUS nach [6].
Günther Knöpfel [7] war so freundlich, uns seine Haussteuerung zu beschreiben, die ebenfalls dreiadrige Hardware-UARTs mit Dioden benutzt und auf den M-Bus von Nokia aufbaut. Er bezeichnet seine Lösung als G-Bus (1/2023).
UART sind weltweit verbreitet. Größtes Ärgernis bei der Nutzung von UARTs sind die zwei Datenleitungen RX und TX. Um zwei gleich aufgebaute Geräte verbinden zu können, ist ein Kabel mit gekreuzten RX/TX-Leitungen erforderlich. Auch lassen sich nicht mehr als zwei Geräte verbinden.
Um mehr als zwei UARTs verbinden zu können, wird hier eine Single-Wire UART (SWART) vorgestellt, die auf UART aufbaut. Diese ist im Bereich intelligenter Sensorik und Aktorik bei niedrigen Datenraten und kurzen Entfernungen vorteilhaft anwendbar.
Die SWART-Schnittstelle eignet sich besonders für quartzlose Sensoren und Aktoren mit kleinsten Mikrocontrollern, deren UARTs in Software realisiert sind. Das Sende-Empfangs-Portpin (RTX) kann hierbei mit nur zwei Zuständen programmiert werden (sendLow und receive).
Der zusätzliche Code für eine Soft-UART beträgt etwa 100 Byte. Es wird nur ein I/O-Pin (RTX) für RX und TX belegt. Um quarzlose Soft-UARTs betreiben zu können, wird eine Variante vorgestellt, die tolerant gegenüber variierenden Bitzeiten ist.
Wird eine SWART auf Mikrocontrollern mit Hardware-UART realisiert (z.B. FTDI USB-VCP), ist zusätzlich eine Schottky-Diode erforderlich.
SWART-Multiplex mit der Betriebsspannung ist theoretisch möglich, erfordert aber den Einbau zusätzlicher Hochlade-Pausen in das Programm.
Werden mehrere SWART-Units an eine RTX-Leitung angeschlossen, entsteht ein SWART-Bus, der bei Abgleich der Sprachelemente innerhalb einer Sprache ohne (proprietäres) Busprotokoll auskommen kann.
[1] Heinz, G.: Wasserstoffsensor mit ATtiny (Link)
[2] Heinz, G.: SWART LCD Adapter (Link)
[3] Heinz, G.: Single-Wire UART (SWART) - Prinzip und Schaltungstechnik. Der Link zu dieser Seite ist unter www.gheinz.de/techdocs zu finden (Link)
[4] Heinz, G.: Single-Wire UART (SWART) - Schaltungstechnik, Prinzip und Ausführungen. Allererste Fassung vom 27.2.2015 als (PDF)
[5] Wernicke, Th. u.a.: Nokia Pop-Up-Port auf M-Bus umbauen (1.2.2006) Nokiaport.de The Center of Mobile Modification. (Link)
[6] Johnny's Privat GSM: Datenkabel für das Nokia-Handy im Eigenbau. Aug. 2003. Nokia 51xx/61xx M2BUS Interface. (Link)
[7] Knöpfel, G.: Haussteuerung mit G-Bus. (Eine Analogie zu SWART und M-Bus. 1/2023). (PDF)-Beschreibung und Beispiele als (ZIP)
[8] Bredendiek, J.: Die Nutzung der RS232-Hardware (USART). Eine Einführung. (Link)
[9] UART Einführung unter Mikrocontroller.net (Link)
[10] Heinz, G.: DCC-Stellwerk mit Fahrstraßenspeicher. (Link)
[11] Heinz, G.: Isolierte USB-COM-Ports (USB-VCP). (Link)
[12] Heinz, G.: Isolierte Ethernet-UART. (Link)
[13] Barron, M.: Homemade Serial to Nokia MBus. (Link)
URL: www.gheinz.de
Mails to info@gheinz.de
Ergänzungen/Korrekturen: 27.2.2015, 9.4.2015, 8.11.2016
Layout vereinfacht, Adds: M-Bus-Adapter, Inhaltsverz., Links, viele Ergänzungen. 19.1.2023
Besucher seit dem 6. 12. 2021: