www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega8, UART: UDR mehrmals auslesen?


Autor: Paul H. (powl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich habe da ein seltsames Problem, welches auftritt, wenn ich nach dem 
Empfang eines Zeichens das UDR in mehreren if-Abfragen hintereinander 
mehrmals auslese.

if(bit_is_set(UCSRA, RXC))
{
  if(UDR == 'o')
  {
    uart_puts_pgm(PSTR("O\n"));
  }

  if(UDR == 'l')
  {
    uart_puts_pgm(PSTR("L\n"));
  }
}

Wenn ich ein o sende erhalte ich sofort O als Rückmeldung, wie erwartet. 
Wenn ich allerdings ein l sende passiert was ganz komisches. Erst beim 
nächsten gesendeten Zeichen bekomme ich die Rückmeldung L, ganz egal was 
für ein Zeichen ich als letztes gesendet habe.

Mal ein Beispiel was ich mache:
Sende o - Rückmeldung O
Sende l - nix
Sende x (beliebiges Zeichen) - Rückmeldung L
Sende x - nix
Sende o - Rückmeldung O (hier klappts immer sofort)
Sende l - nix
Sende o - Rückmeldung O, sofort danach allerdings nochmal Rückmeldung 
L... wtf?

Wird da irgendwie was gepuffert? Wenn ich UDR zuerst in eine 
tmp-Variable einlese und dann mit dieser arbeite, dann funktionierts.

Warum?

lg PoWl

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
UDR ist ein FIFO. List du einen Wert, ist er aus dem Puffer raus und du 
bekommst den nächsten Wert.

Autor: Paul H. (powl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, ich habe im Beispiel zwei if-Abfragen. In der ersten wird nach "o" 
gefragt, in der zweiten nach "l". Wenn das ein FIFO ist und jedes 
Auslesen des UDR den FIFO um eins weiterrutschen lässt, wieso erhalte 
ich dann auf das l überhaupt noch eine Rückmeldung?

sobald ich ein einzelnes Zeichen sende wird es ja durch die erste 
if-Abfrage (also durch das erste Auslesen des UDR) sofort wieder aus dem 
FIFO rausgezogen.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lesen kannst du es so oft du willst.
Wieso du bei deinem Programm manchmal doch (halbwegs) sinnvolle Sachen 
zurückbekommst, hängt an deinem Programm (das wir nicht sehen).

Das UDR ist auch sehr gut im Datenblatt beschrieben (nur so als 
Standard-Antwort...).

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zitat aus dem Datenblatt:
The two Buffer Registers operate as a circular FIFO buffer. Therefore the UDR must only be read once for each incoming data!
Wenn du also mehrmals liest, ist das Verhalten undefiniert. Lese UDR 
also erst in eine temp Variable und prüfe die dann auf die gesuchten 
Zeichen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.