Ich habe keinen UART auf meinem Mikrocontroller. Wie kann ich einen hinzufügen?


13

Ich verwende einen ATMEGA32HVB- Mikrocontroller, der über eine Funktion zum Zellenausgleich verfügt, mit der wir 4 Batterien hintereinander anschließen und jeweils eine verwenden können. Das ist sehr nützlich für die Energieverwaltung, daher kann ich keinen anderen Mikrocontroller verwenden. Bitte schlagen Sie einige Methoden vor, um einen UART hinzuzufügen, damit ich problemlos eine Schnittstelle zu seriellen Geräten herstellen kann.


11
Die von user26129 beschriebene Software-UART-Methode wird als Bit-Banging bezeichnet .
Johan.A

4
Nur meine sehr subjektiven $ 0,02, aber ich würde normalerweise einen separaten dedizierten Batteriecontroller und einen UART mit integriertem uC vorziehen, anstatt umgekehrt. Warum benötigen Sie das in uC integrierte Batteriemanagement?
Mels

Ich muss wiederaufladbare Batterien verwenden, die mit einem Solarpanel aufgeladen werden. Ich benötige also 4 Batterien in Serie, die jeweils einzeln verwendet werden
user27475

4
Eine Frage ist, wie oft Sie den UART verwenden möchten und in welche Richtungen. Wenn Sie nur gelegentlich eine Debug- oder Statusmeldung generieren möchten, kann die Bit-Banging-serielle Ausgabe zu einem Zeitpunkt sehr attraktiv aussehen, an dem Ihr Prozessor nicht besonders stark nachgefragt wird. Es gibt Ticks wie die Verwendung von Pin-Change-Interrupts, die die durchschnittliche Auslastung eines Eingangskanals ebenfalls verringern können. Wenn Sie jedoch erwarten, Zeichen mit einer hohen Baudrate zu einem Zeitpunkt zu empfangen, an dem Sie andere Echtzeit-Verpflichtungen haben, ist dies möglicherweise der Fall ein Problem.
Chris Stratton

Antworten:


17

Wie bereits erwähnt, können Sie Ihrem System entweder zusätzliche Hardware hinzufügen, um die UART-Funktionalität bereitzustellen, oder Sie können eine in der Software emulieren. Wenn Sie die Kontrolle über das gesamte Hardware-Design haben und das Hinzufügen eines weiteren ICs eine Option ist, würde ich den hardwarebasierten Ansatz stark in Betracht ziehen. Sie können einen Software-UART zwar mit Bit-Banging zum Funktionieren bringen , möchten jedoch die CPU-Ressourcen möglicherweise nicht für die Generierung des erforderlichen Timings verwenden.

Ein Blick auf das Datenblatt zeigt, dass Ihr Mikrocontroller sowohl über SPI als auch über I2C (von Atmel als Two-Wire Interface (TWI) bezeichnet) verfügt. Dies wären wahrscheinlich die besten Schnittstellen, um einen externen UART anzuschließen. Diese Geräte sind von einer Reihe von Herstellern erhältlich. Einige Beispiele:

  • Exar ( http://www.exar.com/connectivity/uart-and-bridging-solutions/i2c-spi-uarts ) verfügt über eine Reihe von SPI / I2C 1- und 2-Kanal-UART-Geräten, die ~ 1,6- 3,3 V Betriebsbereich. Ich habe keinen dieser Teile speziell verwendet, aber ich habe in der Vergangenheit Exar-Geräte (mit parallelen Speicherbus-Schnittstellen) verwendet, und sie haben gut funktioniert.

  • NXP ( http://ics.nxp.com/products/bridges/i2c.spi.slave.uart.irda.gpio/ ) bietet eine Reihe von SPI / I2C-UART / IrDA / GPIO-Geräten an, auch in den Versionen 1 und 2 -Kanalsorten über ein paar Spannungsbereiche. Ich habe diese Teile (insbesondere den SC16IS762) in der Vergangenheit ausgiebig mit großem Erfolg verwendet.

  • Maxim ( http://www.maximintegrated.com/datasheet/index.mvp/id/2052 ) verfügt über die mit SPI verbundenen UARTs MAX3110E und MAX3111E. Ein einzigartiges Merkmal dieser Geräte ist, dass sie über einen integrierten RS-232-Leitungstreiber verfügen. Wenn Sie Ihren UART also an ein Gerät anschließen müssen, das RS-232-Leitungsspannungen anstelle von Logikpegeln verwendet (z. B. einen PC), kann dies hilfreich sein, da Sie dadurch nicht einen weiteren Leitungstreiber-IC zu Ihrer Karte hinzufügen müssen.


Wow, ich wusste nie, dass Maxim diese Gegenstände hat, würde +2, wenn ich könnte.
Tevo D


8

Sie müssen einen Software-UART-Treiber verwenden. Je nachdem, was Sie von diesem UART erwarten, können Sie den AVR305 (extrem kompakt, aber keine anderen Funktionen als das Blockieren von Halbduplex-Senden / Empfangen), den AVR274 (Interrupt-gesteuert, ziemlich vollständige Funktionen) oder einen eigenen Software-UART-Treiber verwenden Sie können eine verwenden, die Sie im Internet finden, zum Beispiel indem Sie 'avr software uart' googeln.


3

Ein kurzer Hinweis zum Software "UART" -Design: Es gibt zumindest qualitativ unterschiedliche Ansätze, die man je nach Anforderung verfolgen kann:

  • Ein Bit-Bang-Treiber "Alles übernehmen" deaktiviert alle Interrupts und verwendet zyklisch gezählten Code, um jedes Bit zu takten. Das Empfangen von Daten mit dem Treiber "Alles übernehmen" setzt voraus, dass der Controller beim Eintreffen von Daten nur darauf wartet.

  • Ein Bit-Bang-Treiber zum Übernehmen der Hauptschleife verhält sich ähnlich wie oben, außer dass er eine Timer-Ressource für Bit-Timings verwendet, anstatt die Zyklen zu zählen. Interrupts, die nicht zu lange dauern, können aktiviert bleiben. Für die serielle Übertragung kann die Zeitgeberressource mit fester Rate mit anderen Zwecken geteilt werden; Für den seriellen Empfang muss der Bit-Bang-Treiber jedoch in der Lage sein, den Timer neu zu laden, wenn das Startbit eintrifft, damit es in der Mitte jeder eingehenden Bitzeit abläuft.

  • Ein vollständig unterbrechungsgesteuerter Bit-Bang-Treiber verwendet einen Timer mit fester Rate, der vorzugsweise mit einem Vielfachen der Datenrate ausgeführt wird (3x und 5x sind beide besser als 4x), und erledigt alles über diesen Timer. Ein solcher Treiber kann gleichzeitig mit allen anderen ausgeführt werden, erfordert jedoch eine schnellere CPU als die früheren Treibertypen.

Um zu vermeiden, dass die ersten beiden Arten von Controllern ewig auf Daten warten, die möglicherweise nie eingehen, wird in Leseroutinen häufig ein Timeout-Wert angegeben. Beachten Sie, dass, wenn die Schleife eines Controllers z. B. "ein Byte abruft, während bis zu 100 ms darauf gewartet werden", andere Vorgänge ausgeführt werden, wenn keines kam, dann das nächste Byte abruft usw. " und ein Byte kommt zwischen dem Zeitpunkt an, zu dem die "Abruf" -Routine abgelaufen ist und die Steuerung wieder zu warten beginnt, geht dieses Byte verloren; Das Gerät, mit dem es kommuniziert, muss mit dieser Möglichkeit rechnen.

Nur der dritte Treibertyp kann die Möglichkeit des Eintreffens eines Datenbytes behandeln, während ein Datenbyte übertragen wird. Die ersten beiden Stile können jedoch für einige Vollgeschwindigkeits-Vollduplex-Kommunikationsprotokolle verwendet werden, wenn der Controller nur sprechen muss, wenn er angesprochen wird. Der Trick besteht darin, eine "Daten lesen und schreiben" -Routine zu haben, die auf ein eingehendes Startbit wartet, und wenn eines erkannt wird, Lese- und Schreibvorgänge so zu überlappen, dass die Steuerung jedes Bit sendet, während sie die eingehenden Daten untersucht. Sobald die Steuerung das eingehende Startbit erkennt, weiß sie genau, wann sie nach den nächsten 8 Datenbits und dem Stoppbit suchen soll, und weiß daher, dass sie die Zeit zwischen den Daten sicher verwenden kann, um ihre eigenen Daten auszugeben.

Ein Teil: Ein Controller, der zum Empfangen von Daten einen der ersten beiden Bit-Bang-Arten verwendet, muss jedes Datenbyte vor der fallenden Flanke des Startbits des nächsten Bytes verarbeiten, um Datenverlust zu vermeiden. Wenn die Steuerung weiß, dass die Verarbeitung mindestens ein halbes Bit dauert, kann sie die für die Verarbeitung verfügbare Zeit maximieren, indem sie jedes Byte akzeptiert, sobald es das letzte Datenbit erfasst hat, anstatt auf das Stoppbit zu warten. Als weiteres Mittel, um dem Controller mehr Zeit zu geben, kann es jedoch hilfreich sein, das Gerät, das ihm Daten sendet, mit zwei Stoppbits anstatt mit einem zu beauftragen. Wenn "Parität markieren" konfiguriert werden kann, wird eine weitere zusätzliche Bitzeit hinzugefügt. Die Übertragung bei z. B. 115200-8-M-2 ermöglicht eine längere Verarbeitungszeit als 57600-8-N-1, obwohl Daten mehr als 1,6-mal schneller eingespeist werden.


1

Sie können einfach den I / O-Pin der uC verwenden. Lediglich beim Umschalten oder Übertragen von Daten auf diese Pins sollte die Frequenz der Pins doppelt so hoch sein wie die Baudrate. So funktioniert UART normalerweise, es tastet das Bit-Signal in der Mitte ab.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.