Multiplexen der Datenausgabe an eine Anzeige mit parallelem Anschluss

Multiplexing-Datenbus-Anzeige mit parallelem Ausgang und seriellem Port Arduino.

Der Artikel beschreibt die Methode zum Multiplexen der Verwendung von Port D des ATMEL 328P-Mikroprozessors (Arduino NANO), um eine alternative Byte-Ausgabe für die Anzeige und den Austausch über den seriellen Kanal bereitzustellen.

Irgendwie habe ich ein Gerät zur Überwachung des Kohlenmonoxidspiegels (CO) aus unnötigen Elementen zusammengebaut - ein Display des Nokia N95, Arduino NANO mit schlechten Anschlüssen (D3 und D11, defekt aufgrund eines erfolglosen Kurzschlusses auf +400 Volt beim Debuggen eines Hochspannungsgenerators), Platinen Sound Bites und Kohlenmonoxidsensor MQ7 spielen. All diese Details waren bis auf den einen oder anderen Grad fehlerhaft (mit Ausnahme des Sensors) und konnten in keinem anderen Projekt gefunden werden. Seltsamerweise hat sich herausgestellt, dass das Gerät sehr nützlich ist, wenn man auf dem Land einen Herd benutzt. Der Sommer 2019 erwies sich als nicht heiß und ich heizte den Ofen im Juli fast täglich für ein paar Wochen, wobei ich angenehm (Meditation auf der Flamme) mit nützlich (Recycling von gesägten Müllbäumen) kombinierte. Es stellte sich als sehr einfach heraus, die Verbrennungsregime zu steuern. Alle Manipulationen an den Klappen spiegelten sich sofort in den Ablesungen des Geräts wider, was eine intelligente Steuerung des Ofens ermöglichte. Das Gerät wird in diesem Artikel nicht beschrieben, es gibt im Internet jede Menge solcher Geräte für jeden Geschmack. Ein charakteristisches Merkmal meines Geräts ist die Funktion der kontinuierlichen Überwachung des Zustands des CO-Sensors auf der Grundlage eines Vergleichs der gespeicherten Referenzkurve in Echtzeit sowie der hohen Reaktionsrate auf Änderungen des CO-Niveaus, die durch den Vergleich der im vorherigen Zyklus gespeicherten Daten mit den aktuellen Daten erzielt wurden.

Der Schwerpunkt dieses Artikels liegt auf der Erhöhung der Prozessor- und Anzeigegeschwindigkeit bei parallelem Byte-Datenaustausch.

Die Anzeige hat einen parallelen Byteaustausch, und trotz der Verwendung aller mir bekannten Methoden zur Erhöhung des Wechselkurses erwies sich die Ausgabe zu ihr als ziemlich langsam. Der Hauptgrund ist die Notwendigkeit, ein Datenbyte bitweise an verschiedene Bits verschiedener Ports auszugeben, da Arduino Nano keinen einzigen vollwertigen Port mit einer Breite von einem Byte besitzt. Dieser Ausgabemodus benötigt ungefähr achtmal mehr Zeit als das Schreiben eines Bytes in ein Register. NANO hat einen einzigen vollwertigen Port D, aber seine niedrigstwertigen Bits werden für den seriellen Hardware-Port verwendet, über den die Skizzen in den Prozessor geladen und die Skizze mit der Host-Maschine ausgetauscht werden.

Ich habe eine relativ einfache Möglichkeit gefunden, die Ausgabe der Anzeige byteweise zu verwenden. Diese Methode besteht in der alternativen Verwendung von Port D für die Ausgabe von Daten an ein Display und für den Datenaustausch über einen seriellen Kanal.

Das vorgeschlagene Verfahren kann die Geschwindigkeit des integralen Austauschs mit der Anzeige signifikant erhöhen (ungefähr dreimal gemäß meinen Messungen). Das Wort "Integral" bedeutet, dass die Gesamtzeiten der Ausführung von Bildschirmwiedergabevorgängen auf Makroebene gemessen wurden. Es ist wahrscheinlich, dass die Messung der Zeit auf der Ebene der atomaren E / A einen signifikant größeren Gewinn ergibt (im Bereich der gleichen Größenordnung).

Die Messungen wurden an einem speziell zusammengebauten Modell (siehe Abbildung 1) folgendermaßen durchgeführt:

  1. Im Testprogramm wurden Zeitstempel mit der Ausgabe auf dem Hostcomputer platziert.
  2. Das Display wurde an die Pins D2 - D9 angeschlossen, ein Testprogramm wurde geladen, in dem das Byte durch Verteilung des Bytes nach Bits ausgegeben wurde.
  3. Das Display wurde an die Klemmen D0 - D7 angeschlossen, ein Testprogramm wurde geladen, in dem das Byte mit dem Befehl PORTD = data ausgegeben wurde.

Bild

Bild
Abbildung 1. Fotos des Layouts zum Testen des Output-Multiplexing

Die Programme sind exakt gleich, die Umstellung der Ausgabemethode erfolgte durch Änderung der Namen der Routinen SendDat und SendCom in SendDat1 bzw. SendCom1.
Die Ausgabe des Programms an den eingebauten Serienmonitor wurde in OneNote aufgezeichnet und analysiert.

Bild
Abbildung 2. Messen der Zeit, die für die Anzeige im Byte-Ausgabemodus benötigt wird

Bild
Abbildung 3. Messung der Bildschirmzeit im Bitausgabemodus

Die Messergebnisse sind in Tabelle 1 zusammengefasst.

Bild
Tabelle 1. Integrierter Wechselkursgewinn

Die Nachteile des vorgeschlagenen Verfahrens sind die Notwendigkeit, zusätzliche Befehle zu verwenden, um den Anzeigemodus zu wechseln und über eine serielle Schnittstelle auszutauschen.
Auch beim Empfang von Daten vom Host-Rechner sind einige Schwierigkeiten zu erwarten. Der Empfang ist nur mit der expliziten Einbeziehung des seriellen Kanalmodus möglich, der eine klare zeitliche Organisation der Prozesse in der Skizze erfordert.

Das Studium des Prozessorhandbuchs ergab die folgenden Informationen: Die Einbeziehung des seriellen Schnittstellenmodus unterbricht die Steuerung der Zweige D0 und D1 auf Hardwareebene. Dies bedeutet, dass Versuche, die Beine von der Skizze aus zu steuern, nicht zum gewünschten Ergebnis führen.

Eine weitere Untersuchung des Problems ergab, dass der gesamte Anschluss D dem Benutzer zur Verfügung steht, wenn Sie den seriellen Anschluss nicht mit dem Befehl Serial.open () in die Skizze aufnehmen. Sie können den Port mit dem Befehl DDRD = 0xFF auf allen Zweigen in den Ausgabemodus versetzen und gleichzeitig das gesamte Byte mit dem Befehl PORTD = data ausgeben, wobei die Datenvariable die Ausgabedaten enthält.

Das einmalige Versetzen von Port D in den Ausgabemodus ist ausreichend (im Setup). Das anschließende Ein- und Ausschalten des seriellen Kommunikationsmodus wirkt sich nicht auf den Port D-Modus aus. Er verbleibt im parallelen 8-Bit-Ausgangsmodus. Wenn der serielle Austauschmodus eingeschaltet ist, gehen die Anschlüsse D0 und D1 in den Empfangs- bzw. Sendemodus. Unabhängig vom vorherigen Status des D1-Bits wird auf dem D1-Pin eine „1“ angezeigt, und diese „1“ befindet sich die ganze Zeit auf diesem Pin, solange der serielle Übertragungsmodus aktiv ist, mit Ausnahme der Momente der Symbolübertragung. Wenn der serielle Übertragungsmodus ausgeschaltet ist, gehen die Ausgänge D0 und D1 in den Ausgangszustand und die Signale aus dem Ausgangsregister erscheinen auf ihnen. Wenn im Ausgangsregister anstelle von D1 "0" steht, wird am Ausgang eine negative Flanke erzeugt, die zur Übertragung des Störzeichens auf den seriellen Kanal führt.

Betrachten wir nun die Frage: Verhindert eine solche Verwendung von Port D das Herunterladen von Programmen? Beim Laden des Programms wird der Prozessor durch den Impuls zurückgesetzt, der vom USB-Port-Controller FT232RL (oder seinem analogen CH340) erzeugt wird, wenn das DTR-Signal gesetzt wird. Das DTR-Signal geht von 1 auf 0 und ein negativer Abfall durch den Kondensator setzt den Prozessor zurück. Nach einem Reset schaltet der Prozessor die serielle Schnittstelle ein, startet den Bootloader und empfängt den Programmcode. Das Ändern des Betriebsmodus von Port D beeinträchtigt also nicht das normale Laden der Skizze.
Wenn für die Skizze eine Ausgabe an die serielle Schnittstelle erforderlich ist, reicht der Befehl Serial.open () vor den Ausgabebefehlen aus.

Es gibt jedoch Subtilität. Es besteht darin, dass der RxD-Eingang des FT232RL-Chips mit dem TxD-Ausgang verbunden bleibt und die Daten, die zur Anzeige gehen, empfangen und weiter an die Host-Maschine gesendet werden. Diese Daten sehen wie Rauschen aus, obwohl dies in Wirklichkeit nicht der Fall ist (Abbildung 4).

Bild
Abbildung 4. Bildschirmansicht im Byte-Ausgabemodus ohne Blockierung

Es gibt zwei Möglichkeiten, mit diesem unnötigen Signal umzugehen.

Der erste Weg ist Software. Es besteht darin, dass die Skizze vor der Ausgabe den Befehl Serial.println () verwendet, um vor der Ausgabe nützlicher Informationen eine neue Zeile zu erstellen. Auf diese Weise kann der Hostrechner eingehende Leitungen leichter analysieren und nützliche Informationen aus der Skizze hervorheben.

Der zweite Weg ist Hardware. Der RxD-Eingang des FT232RL ist über einen 1 kΩ-Widerstand mit dem TxD-Ausgang verbunden. Um die Übertragung von Informationen zu blockieren, verbinden Sie einfach den Eingang RxD FT232RL mit "1". Dies am einfachsten zu machen, ist eine der freien Schlussfolgerungen von Arduino. Ich habe die Ausgabe von D8 verwendet. Um diese Aktion auszuführen, habe ich an Pin 7 des RP1B-Widerstands mit einem Nennwert von 1 kΩ Drähten mit einem Stecker am Ende gelötet und ihn zur mechanischen Fixierung durch die Löcher in der Platine geführt. In Abbildung 5 ist diese Verbindung durch eine rote Linie dargestellt, Abbildung 6 zeigt eine Fotografie der Lötstelle.

Bild
Abbildung 5. Teil der Arduino Nano-Schaltung

Bild
Abbildung 6. Ort des Lötens eines zusätzlichen Drahtes in Arduino NANO

Dieser Mechanismus funktioniert folgendermaßen: Nach dem Zurücksetzen befindet sich der D8-Zweig im hochohmigen Eingangsmodus und die Arduino-Platine stört den normalen Betrieb des Programmlademechanismus auf der Platine nicht.

Wenn die Steuerung der Anzeige in der Skizze gestartet werden muss, wird der Pin D8 in den aktiven Pin-Modus geschaltet und auf „1“ gesetzt (dies blockiert die Übertragung von Daten vom Pin TxD Atmel328P zum Pin RxD FT232RL). Danach wird der Befehl Serial.end () ausgeführt. Die Vorgehensweise ist wichtig, da nach dem Ausschalten des seriellen Übertragungsmodus das Bit D1 auf dem TxD-Pin erscheint, das im Ausgangsregister von Port D des vorherigen Byte-Datensatzes in diesem Port gespeichert ist. Wenn das Bit D1 "0" war, schaltet der Prozessorzweig beim Ausschalten des seriellen Übertragungsmodus von "1" auf "0" um, und dies erzeugt eine parasitäre Zeichenübertragung auf dem seriellen Kanal.

Beim Debuggen stellte sich außerdem heraus, dass wir vor dem Blockieren des seriellen Kanals auf das Ende der Übertragung des gesamten Puffers zum Host-Computer warten mussten, da sonst ein Teil der übertragenen Daten verloren gehen würde.

Wenn eine Skizze die Datenübertragung über die serielle Schnittstelle ermöglichen soll, müssen Sie den seriellen Übertragungsmodus aktivieren und die Blockierung der seriellen Datenübertragung deaktivieren, indem Sie den Lesemodus auf Pin D8 einstellen.

Um diese Aufgaben auszuführen, wurden der Skizze zwei Routinen hinzugefügt:

void s_begin() { Serial.begin(115200); //    TxD   USART.  TxD   "1",  RxD   pinMode(8, INPUT); //    RxD FT232RL  "1",       RxD FT232RL } 

 void s_end() { Serial.flush(); //   pinMode(8, OUTPUT); //  FT232RL  "1"       .   D8_High; //    Serial.end(); //   .      TxD  RxD    D0(RxD)  D1(TxD)  D } 

Ein vollständiges Testprogramm kann hier abgelegt werden.

Source: https://habr.com/ru/post/de476986/


All Articles