Ich habe ein GPS-Gerät, von dem ich Daten abrufen muss (die NMEA-Strings). Meine MCU ist jedoch viele Male pro Sekunde damit beschäftigt, etwas anderes zu verarbeiten. Gibt es eine Möglichkeit, ein UART/RS232-TTL-Signal zu "pausieren" oder zu puffern, während meine MCU Sachen macht? Ich schaue mir entweder einen dsPIC33FJ128GP802 oder einen AT32UC38x an.
Die Verarbeitung meines OSD kann nicht unterbrochen werden, Interrupts sind also aus.
Zwei Dinge.
Ich kann auf beide Methoden näher eingehen, wenn mehr Klarheit erforderlich ist.
Randnotiz für Mikrochip. Ich denke, ihr Assistent für den c18-Compiler (habe den c30 noch nicht oft verwendet) wird Ihnen eine Bibliothek geben, mit der Sie die Daten von UART für Sie in die Warteschlange stellen können.
Wenn Ihr Bildschirm-Controller mit Interrupts fertig ist, können Sie ihn dann nicht einfach in einen Interrupt auf höherer Ebene stecken?
Dies bedeutet, dass der RX-Daten-Interrupt immer dann Zeit hat, die Daten in eine Warteschlange zu stellen, wenn Sie Ihren Interrupt verlassen. Dies bedeutet auch, dass jedes Mal, wenn Ihre anderen Interrupts ausgelöst werden, sie die von Ihnen erwartete Priorität erhalten.
Platzieren Sie dann in Ihrem Hauptregelkreis, der nicht unterbrechungsgesteuert ist, die Verarbeitung Ihrer GPS-Daten. Das hält die Dinge schön unterteilt. Denken Sie daran, dass Sie bei den meisten GPS-Baudraten lange Zeit haben, Zeichen aus der Zeichenfolge zu ziehen, da 4800 oder 9600 Baud langsam sind ...
Ich glaube, dass einige der dsPIC-Familie DMA-Unterstützung in der MSSP-Peripherie haben, die das Puffern des Eingabestroms ohne CPU-Eingriff bis zu einem Punkt ermöglicht, der durch den verfügbaren Speicher begrenzt ist.
Verwenden Sie einen Interrupt, um die GPS-Daten in Blöcken zu verarbeiten. Stellen Sie einfach sicher, dass der Interrupt für Ihre Videoverarbeitungsarbeit auf eine höhere Priorität eingestellt ist, damit er den GPS-Handling-Interrupt stoßen kann.
Es hört sich so an, als müssten Sie Ihren PIC wirklich dem Display widmen, 80-90% CPU-Auslastung ist viel. Ich sehe einige Ähnlichkeiten zwischen einem Computer und seiner Grafikkarte. Ich denke, Sie sollten unbedingt in Betracht ziehen, Ihr Projekt in 2 PICs aufzuteilen, von denen 1 das gesamte Video (wie eine Grafikkarte) und das andere die andere Verarbeitung übernimmt. Dieser zweite PIC kann eine gewisse Flusssteuerung zwischen Ihrem Video-PIC haben, so dass der Video-PIC Sie wissen lässt, wenn er etwas freie CPU-Zeit hat. Sobald Ihr 2. PIC sieht, dass es zusätzliche Zeit gibt, wird er Daten darauf ausgeben.
Zusatz: Das GPS-Paket enthält wahrscheinlich viel mehr Informationen als das, was Ihr Display benötigt, Ihr separater PIC kann die Daten "bereinigen", um Ihnen genau das zu geben, was Sie wollen / brauchen.
Wenn Ihr zweiter PIC nicht viel leistet, können Sie wahrscheinlich mit einem sehr günstigen PIC (unter 3 $) davonkommen. Diese Kosten sind wahrscheinlich die Zeit wert, die Sie beim Codieren und Debuggen auf einem einzelnen PIC sparen.
Ein weiterer möglicher Grund für den Propeller-Chip, der in dem anderen Thread besprochen wurde, ist das eingebaute Timing für das Video, und Sie können ein separates Zahnrad für RS232 verwenden, ohne das Video zu beeinträchtigen.
Es scheint, dass der AT32UC3B1256 auch eine periphere DMA-Fähigkeit hat, sodass Sie Daten vom GPS empfangen können, ohne Interrupts zu verwenden.
Ich habe eine Videoüberlagerung in einer Anwendung durchgeführt, die eine Abfrage während der Datenanzeige erforderte. Wenn Sie einen Ersatz-FSR zur Verfügung haben, fügen Sie Folgendes ein:
btfsc INTCONx,RCIF ; Ich habe vergessen, in welchem INTCON es ist movff RCREG,POSTINC2 ; Oder welcher FSR frei ist
mindestens einmal alle 16 Zeilen (es kann am bequemsten sein, dies in jeder Zeile zu tun). Nur drei Zyklen pro Linie. Wenn Sie keinen Ersatz-FSR zur Verfügung haben, Ihr Anzeigecode jedoch erweitert und nicht in einer Schleife ausgeführt wird, müssen Sie mindestens alle sechzehn Zeilen Folgendes verwenden:
movff INTCONx,SerStatus+N ; N=0 für den ersten, 1 für den nächsten usw. ... und dann (nicht unbedingt sofort) btfsc SerStatus+N movff RCREG,SerData+N
zu einem Preis von drei Zyklen auf einer Linie und zwei auf einer anderen; am Ende der Anzeige:
lfsr 0, SerData btfsc SerStatus+0 movff SerData+0,POSTINC0 btfsc SerStatus+1 movff SerData+1,POSTINC0 btfsc SerStatus+2 movff SerData+2,POSTINC0 ... movlw (SerData & 255) subwf FSR0L,m ; W enthält nun die Anzahl der empfangenen Bytes ; Daten befinden sich in SerData+0 bis SerData+(W-1)
Der Trick besteht darin, sich keine Gedanken darüber zu machen, was mit den Daten zu tun ist, während die Anzeige angezeigt wird. Werfen Sie es einfach irgendwohin und sortieren Sie es später aus.
Angenommen, Ihr GPS-Gerät gibt NMEA-Strings mit 4800 bps aus - Sie sollten in der Lage sein, ein paar freie Zyklen in Ihrem Videogenerator zu finden, um einen seriellen Bitstrom zu decodieren.
Fehlt das:
Wenn Ihr GPS-Gerät Hardware-Flusskontrolle unterstützt, können Sie es möglicherweise zwischen Frames warten oder wenn Ihr Gerät im Leerlauf ist
Eine andere Option wäre eine externe SPI/I2C-zu-UART-Brücke. Einige dieser Geräte haben angemessen große FIFOs, die es ihnen ermöglichen, außerhalb Ihres PIC zu puffern. Warten Sie es erneut während Ihrer Leerlaufzeit
4800 Baud ist ein Zeichen alle 2 ms. Dies ist für die meisten Mikrocontroller (einschließlich PICs) ein Hundezeitalter, und Sie sollten KEIN Problem haben, die Daten aus dem Halteregister des UART zu sammeln. Denken Sie daran, dass selbst der einfachste UART einen eingebauten 2-Zeichen-FIFO (das Halteregister und das Schieberegister) hat. Wenn Sie nicht alle 2 ms ein paar Zyklen finden können, um ein Zeichen aufzunehmen, müssen Sie einen kräftigeren Prozessor finden, einen mit einem FIFO, oder den Job aufteilen, wie andere Leute erwähnt haben.
Der von Ihnen erwähnte dsPIC verfügt über 4-Byte-FIFOs auf dem UART und ist auch DMA-fähig. Während 90 % eine hohe Systemlast für das OSD darstellen (sind Sie sicher, dass Sie Ihr OSD so effizient wie möglich ausführen?), weiß ich nicht, warum Sie bei dieser Systemlast Probleme haben sollten, einen 4800-Byte-NMEA-Stream einzuziehen . Das Verpassen des einen oder anderen GPS-Updates wird Ihre Anwendung wahrscheinlich auch nicht allzu sehr beeinträchtigen.
Die meisten seriellen Geräte implementieren eine Art 'Flusskontrolle' == dies ist entweder über zusätzliche Drähte (RTS 'Request to Send', CTS 'Clear to Send') ein 'Handshake', der es dem empfangenden Gerät ermöglicht, CTS hi oder lo auf Suspend zu setzen Übertragung ..
.. ODER (für Geräte, die nur RxD/TxD-Leitungen verwenden) 'Software-Flusskontrolle' ( == Sie senden ihnen einen bestimmten ASCII-Code, um zu sagen: 'Senden stoppen' und einen anderen, um 'OK, jetzt neu starten' zu sagen)
Schlagen Sie in Ihrem GPS-Datenblatt nach 'Flusskontrolle'.
Kellenjb
Thomas o
Kortuk