PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : anzeige UART Puffer leer



emulein
05.08.2005, 12:22
Hallo,

hätte mal folgende Frage, wenn ich mit meinem mega8 was über die serielle empfange kann ich das in einen Puffer schreiben. Jetzt hole ich mir den Inhalt einzeln ab, wenn der Puffer leer ist bekomme ich das doch mit einem Register angezeigt (weiß gerade nicht welches). Gib´s so was auch für das senden von Zeichen?. Hintergrund ist der ich habe eine 485er Schnittstelle wo ich senden will und empfangen. Ich möchte sobald das letzte Zeichen draußen ist, selbst von Schreibmodus in den Lesemodus umschalten. Gibt´s da ein Register wo das Angezeigt wird?

Gruss Frank

PicNick
05.08.2005, 13:20
Der Buffer für Serialin

_RS_HEAD_PTR0 , a byte counter that stores the head of the buffer
_RS_TAIL_PTR0 , a byte counter that stores the tail of the buffer.
_RS232INBUF0 , an array of bytes that serves as a ring buffer for the received characters.

Der Buffer für Serialout

_RS_HEAD_PTRW0 , byte that stores the head of the buffer
_RS_TAIL_PTRW0 , byte that stores the tail of the buffer
_RS232OUTBUF0, array of bytes for the ring buffer that stores the printed data.

Mit vergleichen Head / Tail kannst du sehen was voll und was leer ist

emulein
05.08.2005, 13:32
Hallo Robert,

danke, ich glaube das bringt mich weiter. Werde ich heute Abend gleich mal versuchen.

Gruss Frank

emulein
03.10.2005, 22:27
Hi Robert,

hat leider etwas lange gedauert!!, konnte erst jetzt an dem Projekt weiter machen. Muss leider gestehen das mich dein Tip nicht weiter gebracht hat, irgendwie kriege ich das nicht hin. Finde in nicht´s was ich abfragen kann, ob das UART-Puffer leer ist. Wenn ich mit einem Wait nach dem letzten Zeichen arbeite geht´s, nur dann fehlt mir ein stück von dem was der Motor zurück sendet. Von den drei Registern, ich hoffe das nennt man so, kann ich da eins direkt abfragen, ob der Puffer leer ist?.

Wäre froh, wenn du da noch ein Tipp für mich hättest, hab´s das ganze WE versucht und es geht einfach nicht.

DANKE!!

Gruss Frank

PicNick
04.10.2005, 06:58
Mit dem Buffer in Serialout habe ich auch gekämpft, weil Gefahr besteht, die eigenen Daten zu überschreiben. Lies mal nach
https://www.roboternetz.de/wiki/pmwiki.php?n=Softback1core.Uart

oe9vfj
04.10.2005, 11:21
Aus den von Robert erwähnten Variablen für das serielle Buffer ist ersichtlich, ob das letzte Zeichen an den HW-USART übergeben wurde. Dies bedeutet aber nicht, dass damit auch der Sendevorgang schon beendet ist und zwar aus folgendem Grund:
Der HW-USART hat ein UDR Register, in welches die zu sendenden Bytes geschrieben werden. Weiters gibt es das Transmit-Shift-Register, aus welchem die Bits in den UART-Ausgang geschoben werden. Ist dieses Transmit-Shift-Register leer, wird es mit dem im UDR-Register befindlichen Byte wieder gefüllt. Nun ist das UDR-Register leer und es kann softwareseitig mit dem nächsten Byte gefüllt werden.
Dieser Vorgang wird von BASCOM übernommen. Es genügt mit PRINT die zu senden Informationen zu übergeben, BASCOM erledigt alles weitere.

D.H. die Buffer-Variablen ergeben einen leeren Buffer, nachdem das letzte Byte in das UDR-Register geschrieben wurde. Im schlimmsten Fall werden aber noch zwei Bytes gesendet und zwar das Byte im Transmit-Shift-Register (zumindest der Teil, welcher noch nicht gesendet wurde) und das Byte im UDR Register.

Um festzustellen, ob der USART zur Gänze geleert ist, gibt es das TXC Bit.





do ' Warten bis das TXC Bit gesetzt ist.
loop until UCSRA.TXC = 1

Set UCSRA.TXC ' zum zurücksetzen von TXC muss 1 geschrieben werden
' gemäss Datenblatt
Set PortB.1 ' Umschalten von Senden auf Empfangen am RS485




Mit diesem TXC Bit lässt sich übrigens auch ein Interrupt auslösen, welcher dann die Umschaltung von Senden auf Empfangen vornehmen könnte.

Ich habe obigen Code noch nicht auf Hardware ausprobiert. Für Set PortB.1 musst Du natürlich Deinen Code für das Umschalten des Sende/Empfang am RS485 einsetzen, auch muss vor dem Senden (PRINT) der umgekehrte Vorgang erfolgen.

Obiger Code ist für einen AVR mit einem USART. Bei einem AVR mit 2 USARTs müssen die Namen entsprechend geändert werden.

Sofern Du in Deinem Programm ohnehin immer warten musst, bis alles ausgesendet wurde um dann auf empfangen umzuschalten, kannst Du Dir eigentlich die gebufferte Ausgabe ersparen, da diese dann keinen Vorteil bringt, wenn Du die Zeit, in welcher der AVR im Hintergrund sendet nicht sinnvoll nutzen kannst. Auch für die nicht gebufferte Ausgabe gilt allerdings das oben gesagte.

04.10.2005, 21:59
Hallo Josef,

sorry, bin gerade erst von der Arbeit gekommen.
Das werde ich auf jedem Fall morgen mal versuchen, obwohl ich sagen muss, klingt ziemlich kompliziert für mich. Mit dem Übertragen von Daten über eine Serielle hab ich absolut keine Erfahrung. Ich hoffe das ich das mit euere Hilfe hin bekommen. Werde morgen Abend mal melden was geht.

DANKE!!

Gruss Frank

04.10.2005, 22:02
Hi,

hab schon wieder vergessen mich einzuloggen, mist!!!!

Frank

emulein
05.10.2005, 23:11
Hi,

so heute mal gleich eingeloggt!!,

bin einen Schritt weiter, das umschalten der 485 klappt jetzt ohne wait-Befehel. DANKE!!!!

Bekomme jetzt was zurück und es stimmt auch fast, muss jetzt das ganze mal sortieren, ich meine Steuerzeichen raus und so. Muss ich aber morgen machen, gehe jetzt schlafen.

bis dann

Gruss Frank

emulein
08.10.2005, 08:13
Hi Leute,

habe es hinbekommen, das empfangen geht jetzt so wies soll!!!.
Also noch mal vielen Danke!! an Josef und Robert.

Gruss Frank