PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Frage zu UART Sende/Empfangs-puffer und Timing



xrzr
11.11.2015, 19:59
Hallo,
ich Plane zwei Atmega 2560 per UART zu verbinden die dann untereinander Daten austauschen sollen.

Auf µC1 (IC1) soll ein Hauptprogrammlaufen und auf µC2 (IC2) ein nebenprogramm.
Anbei ist mal ein Entwurf vom Programm.

Meine Frage:
Der IC2 wird vermutlich seine Schleife schneller durchlaufen als IC1. somit ggfls. auch mehr als einmal die Daten an IC1 senden, bevor dieser einmal sein Programm durchlaufen hat.
1. Wenn ich von IC2 werte an IC1 sende stehen die doch im Puffer oder?
2. Wie groß ist Puffer und wo kann ich das genau nachlesen im Datenblatt?
3. Oder sind die Werte gelöscht, sobald ich neue Werte per UART sende

shedepe
12.11.2015, 11:34
Hey,
ja der Usart hat einen Puffer. Die Größe solltest du im Datenblatt finden wenn du nach "usart buffer" suchst. Ich rate einfach mal: 1-2 bytes.
Verlust von Daten kannst du allerdings komplett verhindern, wenn du den Empfang in einen Interrupt verlagerst.
Daher meine Empfehlung: Verwende Interrupts für den Usart und dann musst du dir eigentlich keine Gedanken mehr drüber machen. (Außer du hast sehr viele, langlaufende Interrupts)

askazo
12.11.2015, 11:35
Hi,
der Uart-Receive-Buffer fasst nur 2 Werte (siehe Seite 218 im Datenblatt).
Wenn Du sichergehen möchtest, dass Du beim Empfangen keine Daten verlierst, solltest Du das per Interrupt machen.

Gruß,
askazo

xrzr
13.11.2015, 17:24
Danke.
So habe ich es mir schon fast gedacht.
Habe jetzt eine andere Lösung, so das die UART verbindung entfällt und ich nur einen µC benötige.

Peter(TOO)
13.11.2015, 19:57
Hallo,

So habe ich es mir schon fast gedacht.
Habe jetzt eine andere Lösung, so das die UART verbindung entfällt und ich nur einen µC benötige.

So wild ist das eigentlich gar nicht, zudem gibt es dazu Bibliotheken.

Im einfachsten Fall, wird in der ISR jedes Zeichen in einen Puffer geschrieben. Das Hauptprogramm liest dann aus diesem Puffer.
Mit etwas mehr Komfort, macht die ISR dann noch XOFF/XON, stoppt den also Sender bevor der Puffer überläuft.

Komplexere Protokolle packe ich meistens als zustandsgesteuerten Automaten direkt in die ISR.
Der Rechenaufwand in der ISR ist recht klein, da mit jedem Zeichen nur eine einzelne Zustandsänderung berechnet werden muss. Der Vorteil liegt darin, dass sofort auf Fehler reagiert werden kann und das mit dem letzten Empfangenen Zeichen aus das Protokoll abgearbeitet ist, die Reaktionszeit auf eine Meldung wird dadurch kürzer. Die ausgewerteten Daten werden dann an das Hauptprogramm weitergegeben, entweder über globale Variablen und Flags oder einen Puffer.

MfG Peter(TOO)