Mega8 USART Receive Buffer

Gast #6047674
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!
Gast #6047686
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
Gast #6047740
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.
Gast #6048014
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren