Langsames UART mit PIC - Software oder Hardware?

Hallo NG!

Ich bin's mal wieder...

Momentan experimentiere ich ein wenig mit dem PIC16F628 und dessen UART. Soweit läuft das Ganze auch schon recht gut, allerdings ist meiner Meinung die Geschwindigkeit mehr als dürftig.

Der PIC läuft in einer Endlosschleife und fragt dabei immer ab, ob Daten von der seriellen Schnittstelle kommen. Wenn welche da sind, geht es mit einer kleinen Routine weiter (in etwa 50 words, µC-Takt ist 12MHz). Wenn er das Ganze abgearbeitet hat, gibt er eine Bestätigung (Senden von einem Zeichen) an den PC zurück.

Auf der PC-Seite sieht es ähnlich aus: Wenn das Programm startet, wird über ein MSComm-Control ein Zeichen an den PIC gesendet. In einem Sub, den das Control auslöst, wenn Daten ankommen, wird überprüft, ob das ankommende Zeichen das Bestätigungszeichen ist, woraufhin wieder ein Zeichen an den PIC ausgegeben wird. Das läuft dann in einer Endlosschleife ab.

Momentan bin ich bei 57600 Baud. Wobei ich die tatsächliche Geschwindigkeit auf knapp 6000 Baud schätze. Rein theoretisch wäre also fast das zehnfache an Geschwindigkeit drin.

Wenn ich am PC die Abfrage nach dem "Acknowledge" nicht mache, geht die Ausgabe zwar, allerdings ist es nur eine Frage der Zeit, wann die UART des PICs nicht mehr hinterher kommt.

Meiner Meinung wäre es also Sinnvoll, das Handshake auf RTS zu legen. Nur: Was muss ich wann am PIC ausgeben? TTL-Low während der Kommunikation, und wenn fertig auf TTL-High? Bei Google habe ich leider nichts gefunden, vielleicht auch wegen Suchbegriffmangel.

Ich wäre für Tipps dankbar - auch in etwas andere Richungen ;)

MfG & TIA

Chris

PS: Software für den PIC (cc5x) und für den PC (VB) kann ich bei Bedarf auf meinen Webspace legen.

--
www.hobby-elektronik.de.vu
Achtung: E-Mail-Adresse im "From" ungültig!
Verwendet hobbyelektronik at gmx dot net
Reply to
Christof Rueß
Loading thread data ...

"Christof Rueß" schrieb im Newsbeitrag news: snipped-for-privacy@individual.net...

Wenn man jedes Byte bestaetigt, wird das langsam, logisch.

50 Words sind auch nicht gerade wenig. Man sollte also Puffer einbauen, im PC sind ja 16 Byte im FIFO des UART, auf PIC-Seite baut man ihn sich selber.

Ist der Puffer fast voll, sendet man X-OFF (oder -CTS), ist er ausreichend leer ein X-ON (oder +CTS).

Das erlaubt fast volle Datenrate, vor allem gleichzeitiges ueberlappendes Senden und Empfangen. Modems sind noch ein bischen trickreicher und bestaetigen nur ganze Bloecke und auch die sogar out-of-order.

Die Umsetzung muss man ein bischen an das anpassen, was man eigentlich machen will (wenn jedes Bytes bestaetigt werden MUSS weil man nur dadurch entscheiden kann, was man als naechstes Byte sendet, ist natuerlich Essig).

--
Manfred Winterhoff, reply-to invalid, use mawin at despammed.com
homepage: http://www.geocities.com/mwinterhoff/
de.sci.electronics FAQ: http://dse-faq.elektronik-kompendium.de/
Read 'Art of Electronics' Horowitz/Hill before you ask.
Lese 'Hohe Schule der Elektronik 1+2' bevor du fragst.
Reply to
MaWin

"MaWin" schrieb:

FIFO wird meiner Meinung etwas problematisch, da die Übertragung recht spontan ist und die übertragenen Daten manchmal nur 2 Byte lang sind und manchmal auch ein paar tausend Byte. (Konkret geht es um einen RS232->MPU-Wandler für ein Grafikdisplay)

Würde sich ein solches Handshake auch nach einem Byte lohnen? Also einfach nach der Übertragung CTS kurz auf TTL-Low hängen und gleich danach wieder auf TTL-High? Wäre zumindest einiges schneller als mein überlanges Handshake.

MfG

Chris

Reply to
Christof Rueß

"Christof Rueß" schrieb im Newsbeitrag news: snipped-for-privacy@individual.net...

Moment, bei einem FIFO spricht ja nichts dagegen, das der Thread, der die Daten aus dem FIFO rausholt, sie holt so bald welche drin sind. Man kann also problemlos auch nur 2 Byte uebertragen, es wird dabei nie X-OFF / X-ON gesendet weil der FIFO ja nie in die Naehe von voll kam. Bei 1024 Bytes werden sendeseitig jedoch alle in einem Rutsch gesendet, BIS ein X-OFF (oder CTS) eintritt, dann MUSS der Sender innerhalb des naechsten oder der naechsten Bytes anhalten, damit der als 'fast voll' signalisierte FIFO nicht 'ganz voll' wird und ueberlaeuft. Die FIFO-Behandlung ist aus Sicht des Datensende/empfangsprogramms transparent. Das stopft die Daten halt nicht mehr direkt ins Senderegister oder holt sie aus dem Empfangsregister, sondern tut und holt sie beim FIFO. Ein zweiter Prozess (Interrupt-gesteuert bzw. Hardware beim PC) packt Daten aus dem Sende-FIFO in das Sende-Register und Daten aus dem Empfangsregister in das FIFO und schickt X-ON/X-OFF bzw. steuer CTS. Es gibt sicherlich Beispielcode in den Samples der uC-Hersteller, hab aber keinen Link.

--
Manfred Winterhoff, reply-to invalid, use mawin at despammed.com
homepage: http://www.geocities.com/mwinterhoff/
de.sci.electronics FAQ: http://dse-faq.elektronik-kompendium.de/
Read 'Art of Electronics' Horowitz/Hill before you ask.
Lese 'Hohe Schule der Elektronik 1+2' bevor du fragst.
Reply to
MaWin

"MaWin" schrieb:

Ok, Anfängerverständnisprobleme meinerseits ;)

Dann wird es zwar nichts mehr mit dem D/C, das ich auf DTR gelegt habe, da werde ich aber sicherlich einen Weg finden...

Google spuckte bei mir folgendes aus:

formatting link

Das sieht schon mal recht gut aus - muss ich dann nur noch mit meinen Routinen verbinden.

MfG

Chris

Reply to
Christof Rueß

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.