UART-Übertragung - Wartezeit?

Gast #402114
Lesenswert?
• ▲
▼
Hallo zusammen,

ich habe ein kleines Problem... Und zwar möchte ich an meinen
Mikrocontroller (AT90S8515) ein Zeichen senden, worauf mir dann der µC
mehrere Bytes zurücksenden soll.
Das vom PC per Hyperterminal gesendete Zeichen kommt an, die
zurückgeschickten Daten sind jedoch verstümmelt.
Dies liegt wohl daran, dass die UART nicht so schnell senden kann wie
ich Daten ins UDR schiebe. Also habe ich versucht mittels TXC bzw.
UDRE-Bit zu warten, bis die UART wieder frei ist. Beides jedoch ohne
Erfolg. Mittels einer festen Zeitverzögerung klappt es.
Was muß ich tun, damit auch die saubere Lösung mit Ausertung der
Statusbits funktioniert?

Vielen Dank!
Björn


Mein Sourcecode:

unsigned char x = 0;
while (RX_Text[x] != '\0')
{
  UDR = RX_Text[x];
  x++;

  unsigned char y = 4;    //mit manueller Schleife funktionierts
  while (y >0)
  {
                time();
    y--;
  }
//  while (!TXC)           // Bit-Auswertung geht nicht... :-(
//  {
//    asm volatile ("nop");
//  }
}
Gast #402117
Lesenswert?
• ▲
▼
Hallo,

ich habe von C keine Ahnung, aber die Abfrage von UDRE geht hier schon
immer.

uart_send:
        sbis    UCSRA,UDRE                  ; Send-Register leer ?
        rjmp    uart_send                    ; nein

        out     UDR,TEMP_A
        ret

Gruß aus Berlin
Michael
Gast #402119
Lesenswert?
• ▲
▼
Erstaunlich, dass das funktioniert. Guck noch mal in dein C Buch rein.
Beispielsweise unter den Operatoren "&&" und "&".

Empfehlen würde ich eher die Version
  while (!(USR & BITPOS_6))
wobei UDRE (oder was auch immer für ein Bit das ist) sicher lesbarer
ist als BITPOS_6.
#402120
Lesenswert?
• ▲
▼
Übrigens macht man sowas besser mit einem FIFO (= Ringpuffer) und per
Interrupt.
Prinzip: Alle zu sendenden Zeichen kommen in den FIFO, und der
UDRE-Interrupt wird freigegeben. In der UDRE-ISR wird jedesmal, wenn
der UART "frei" ist, ein Zeichen aus dem FIFO geholt und ins UDR
geschrieben. Wenn der FIFO leer ist, deaktiviert sich der Interrupt
selbst.
Vorteil: Man schreibt nur einmal die Daten in den FIFO, den Rest macht
die ISR dann von alleine, d.h. man verschwendet keine Zeit mit
Warteschleifen. Der µC kann z.B. auch schon wieder neue Daten empfangen
und verarbeiten, während er noch "alte" Zeichen aus dem FIFO sendet.

MfG Olaf
Gast #402122
Lesenswert?
• ▲
▼
>while (!USR && BITPOS_6)
>Erstaunlich, dass das funktioniert.

!USR invertiert USR logisch: Alles, was ungleich 0 (wahr) ist, wird zu
0 (falsch).
BITPOS_6 ist immer wahr (könnte man sich also auch sparen).
Wenn also in USR irgendwas passiert (also irgendein Bit gesetzt
wird), wird die Schleife verlassen.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.