Forum: Mikrocontroller und Digitale Elektronik Mega8 USART Receive Buffer


von Meseeks (Gast)


Lesenswert?

Hallo zusammen,

ich habe mit Freude im Datenblatt
https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-2486-8-bit-AVR-microcontroller-ATmega8_L_datasheet.pdf
gelesen, dass der Mega8 einen 2Level Fifo hat.

Mir fehlt noch eine explizite Information:
Zum "Bit 7 – RXC: USART Receive Complete" seht geschrieben
>"This flag bit is set when there are unread data in the receive buffer and 
>cleared when the receive buffer is empty"

Weiß jemand, ob die Hardware dieses Bit SOFORT nach lesen vom FIFO 
zurücksetzt? Also wenn man UDR ließt und sofort im Anschluss eine 
Prüfung auf dem RXC Bit macht, das Ergebnis valide ist?

>> und
wie verhält sich der Interrupt wenn enabled. Wenn im FIFO zwei Byte 
liegen, in der ISR eines gelesen wird, wird der Interrupt dann sofort 
wieder angesprungen?

>> oder
was ist, wenn das zweite Byte eintritt wenn das Programm schon in der 
ISR ist, aber USR noch nicht gelesen hat?

>>> meine Bytes liegen mir so am Herzen und sie gehören alle mir - MY PRECIOUS!

Viele Grüße!

von c-hater (Gast)


Lesenswert?

Meseeks schrieb:

> Mir fehlt noch eine explizite Information:
> Zum "Bit 7 – RXC: USART Receive Complete" seht geschrieben
>>"This flag bit is set when there are unread data in the receive buffer and
>>cleared when the receive buffer is empty"
>
> Weiß jemand, ob die Hardware dieses Bit SOFORT nach lesen vom FIFO
> zurücksetzt? Also wenn man UDR ließt und sofort im Anschluss eine
> Prüfung auf dem RXC Bit macht, das Ergebnis valide ist?

Ja, das letzte Lesen des RXC-Bits ist sogar hyperfluid.

>>> und
> wie verhält sich der Interrupt wenn enabled. Wenn im FIFO zwei Byte
> liegen, in der ISR eines gelesen wird, wird der Interrupt dann sofort
> wieder angesprungen?

Naja, bei nächster Gelegenheit. Interrupts höherer Priorität können (und 
werden) sich vordrängeln.

>>> oder
> was ist, wenn das zweite Byte eintritt wenn das Programm schon in der
> ISR ist, aber USR noch nicht gelesen hat?

Dann ändert sich erstmal nix. Das wäre erst der Fall, wenn noch ein 
drittes Byte eintrifft.

>>>> meine Bytes liegen mir so am Herzen und sie gehören alle mir - MY PRECIOUS!

Dann lerne:

1) Datenblätter lesen
2) Programmieren

von Stefan F. (Gast)


Lesenswert?

Meseeks schrieb:
> Weiß jemand, ob die Hardware dieses Bit SOFORT nach lesen vom FIFO
> zurücksetzt? Also wenn man UDR ließt und sofort im Anschluss eine
> Prüfung auf dem RXC Bit macht, das Ergebnis valide ist?

Ja, das Bit ist sofort danach valide.

> Wenn im FIFO zwei Byte liegen, in der ISR eines gelesen wird,
> wird der Interrupt dann sofort wieder angesprungen?

Der Chip hat keinen FIFO. Er hat ein 8bit Schieberegister und ein 8bit 
Data Register. Wenn das Schieberegister ein ganzes Byte empfangen hat, 
wird dieses ins Datenregister übertragen und dann die ISR aufgerufen.

Wenn das vorherige Byte im Datenregister bis dahin noch nicht ausgelesen 
wurde, bleibt das Byte im Schieberegister und wird später ins 
Datenregister übertragen.

Wenn du das Datenregister ausliest und ein weiteres Bytes bereits im 
Schieberegister wartet, wird die ISR nach Beendigung schnellstmöglich 
erneut angesprungen.

> was ist, wenn das zweite Byte eintritt wenn das Programm schon
> in der ISR ist, aber USR noch nicht gelesen hat?

Du meinst wohl UDR. Wie gesagt kann der Chip ein Byte im UDR Register 
halten und eins im Schieberegister. Wenn dann aber noch ein drittes 
ungelesenes Byte empfangen wird, vergisst das Schieberegister seinen 
Inhalt in dem Moment, wo das Startbit des dritten Bytes rein kommt.

von Oliver S. (oliverso)


Lesenswert?

Stefan F. schrieb:
> Der Chip hat keinen FIFO.

Doch, der Receiver hat einen FIFO, wie alle AVR. Das Schieberegister 
selber, plus zwei Register FIFO.

Oliver

von Dubbel Dubb (Gast)


Lesenswert?

>wie verhält sich der Interrupt wenn enabled. Wenn im FIFO zwei Byte
>liegen, in der ISR eines gelesen wird, wird der Interrupt dann sofort
>wieder angesprungen

So, stimmt, habe etwas nicht wargenommen:

>>When interrupt-driven data reception is used, the receive complete routine
>>must read the received data from UDR in order to clear the RXC Flag,otherwise a 
new interrupt
>>will occur once the interrupt routine terminates.


Zum Thema FIFO Level:
Seite 148 bei Registerbeschreibung UDR, letzter Absatz
>The receive buffer consists of a two level FIFO. The FIFO will change its >state 
whenever the receive buffer is accessed.

von Peter D. (peda)


Lesenswert?

Meseeks schrieb:
> gelesen, dass der Mega8 einen 2Level Fifo hat.

So ist es, mit dem Empfangsregister sind so max 3 Bytes gepuffert.
Das Empfangsregister wird aber überschrieben, sobald das nächste 
Startbit eintrifft.
Schickt man also "12345" zur UART, wird man danach "125" auslesen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.