Register UCSR0C Bit 7

OP #7807404

Das Bit 7 im Register UCSR0C Bit 7 signalisiert ja dass ein Datenbyte im UDR vorliegt. Laut Manual wird dieses Bit 7 gelöscht, sobald das Byte aus dem UDR0 gelesen wird. Hat bisher im Studio 4 auch gut geklappt. Nun, in Studio 7 wird dieses Bit nicht immer automatisch gelöscht. Bei mir nach 2 Lesevorgängen. Handelt es sich dabei um einen Debuggerfehler? Ist da etwas bekannt?

Der Befehl:

1
lds  temp4,UDR0

sollte doch das Bit7 löschen. Wäre es sinnvoll das UDR0 2x hintereinander auszulesen?

Ich sag mal so: was die Simulatoren in irgendwelchen Studios machen, spielt eigentlich keine Rolle.

Wichtig ist, was der reale Prozessor macht. Das steht im Datenblatt.

Oliver P.S. UCSR0C Bit 7 tut mit an Sicherheit grenzender Wahrscheinlichkeit nicht das, was du beschreibst.

Hier nochmal die Erklärung: "The receiver Shift Register can now act as a third buffer level. This is done by allowing the received data to remain in the serial Shift Register (see Figure 69) if the Buffer Registers are full, until a new start bit is detected."

D.h. sind beide Puffer noch voll, wird beim 4. Startbit das Schieberegister gelöscht und nach dem Stopbit steht das 4. Byte im Schieberegister.

OP

Vielen Dank für die Antworten. Also folgendes: Im Simulator empfange ich ja keine echten Telegramme. D.H der Puffer ist ja leer. Ich setze das Bit 7 im Simulator, um den Interrupt auszulösen. Die Routine liest das Byte dann das UDR-Register in temp4. Der Inhalt ist natürlich 0. Zur Weiterverarbeitung ändere ich im Whatch den Wert von temp 4. Das alles ist klar, und funktioniert auch. Der Puffer sollte jetzt aber leer sein, und das Bit 7 gelöscht werden. Ich leese jetzt beim Debugen das UDR nochmals in ein nicht gebrauchtes Register, und dann klappt das auch mit dem Reset von Bit 7. In Echt ist durch die Interruproutine das gelesen Byte schon lange verarbeitet, bis das nächste Byte eintrift.

Meine Frage war ob das ein bekannter Debuger-Fehler ist. Leben kann ich damit ganz gut.

Gruß Fritz

Fritz T. schrieb:

Ich setze das Bit 7 im Simulator, um den Interrupt auszulösen.

Dann verhält sich der Simulator anders, als der echte Chip. In echt ist das Bit nämlich Read-only. Manche Simulatoren erlauben mit einer Stimulusdatei oder in einem Terminalfenster eine UART-Eingabe zu simulieren.

Fritz T. schrieb:

In Echt ist durch die Interruproutine das gelesen Byte schon lange verarbeitet, bis das nächste Byte eintrift.

Dann dürfen aber keine anderen Interrupts oder atomare Zugriffe ihn blockieren. Bei höchster Baudrate sind nur 80 CPU-Zyklen schnell mal vorbei.

OP

Die Routine bringt erst mal das, bzw. die Bytes an einen "sicheren Ort". Die eigentliche Auswertung erfolgt dann "stressfrei" in der Hauptschleife.

Ja, in Echt ist das Bit 7 tatsächlich read only. Das Programm beeinflusst es auch nicht. Aber auch die anderen Register sind im Simulator ja manipulierbar.

Bei einer Baudrate von 19200 braucht ein Byte ca 500 uS, macht dann bei 20 MHz ca. 10000 CPU Takte. Also genügend Reserve. Insgesamt mischen die Timer mit (erzeugen langsame Impulse), Die meiste Zeit langweilt sich das Programm aber in der Hauptschleife.

Gruß Fritz

(Firma: Jasinski)

Wenn im Topic die UART von ATMEGAs gemeint ist, dann liegt hier möglicherweise eine Verwechslung vor, denn das besagte Bit 7, das Datenempfang signalisiert, befindet sich im UCSRxA-Register. Im UCSRxC ist etwas anderes – die Titelzeile wäre demnach dann auch irreführend. Der dritte Screenshot beinhaltet die Erklärung und Beispiele (in C und Assembler), wie man den Empfangsbuffer leeren kann, aber das nur so nebenbei.

Angehängte Dateien:

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über ein Jahr alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.