-         

Ergebnis 1 bis 10 von 10

Thema: anzeige UART Puffer leer

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    14.02.2004
    Ort
    Kaiserslautern
    Beiträge
    78

    anzeige UART Puffer leer

    Anzeige

    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

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    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
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    14.02.2004
    Ort
    Kaiserslautern
    Beiträge
    78
    Hallo Robert,

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

    Gruss Frank

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    14.02.2004
    Ort
    Kaiserslautern
    Beiträge
    78
    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

  5. #5
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Mit dem Buffer in Serialout habe ich auch gekämpft, weil Gefahr besteht, die eigenen Daten zu überschreiben. Lies mal nach
    http://www.roboternetz.de/wiki/pmwik...back1core.Uart
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.11.2004
    Ort
    Hard, Vorarlberg
    Beiträge
    155
    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.



    Code:
    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.
    Viele Grüße
    Josef
    -------------------------------------------------------------------------------------
    DOS-File System für BASCOM-AVR auf http://members.aon.at/voegel

  7. #7
    Gast
    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

  8. #8
    Gast
    Hi,

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

    Frank

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    14.02.2004
    Ort
    Kaiserslautern
    Beiträge
    78
    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

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    14.02.2004
    Ort
    Kaiserslautern
    Beiträge
    78
    Hi Leute,

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

    Gruss Frank

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •