Forum: Mikrocontroller und Digitale Elektronik mal wieder ein Verständnissproblem mit fleury´s uart lib


von chillfactor (Gast)


Lesenswert?

Hi,

ich hab die Fleury lib nun etwas intensiver betrachtet und bin nochmals 
auf eine Unklarheit gestoßen:

Es geht um die Fehlerauswertung vom UCSRA Status Register hin zur getc() 
Funktion.
So wie ich das verstehe, soll man evtl. aufgetretene Fehler bei der 
Abfrage eines Bytes aus dem Puffer überprüfen, indem man das high-byte 
mit den definierten Fehlerbits (#defines in uart.h) vergleicht.

Wenn man sich nun allerdings betrachtet, wie das high-byte erzeugt wird, 
denk ich ist da ein kleiner Fehler drin:

1. beim Empfang des Bytes in der ISR wird das Statusregister in ein 
temporäres byte "lastRxError" gesichert, wobei natürlich nur die 
relevanten Fehlerbits maskiert werden (Schade, dass hier der Parity 
Fehler für evtl. spätere Portierungen mit Parityabfrage fehlt, bzw. vom 
Fehler  UART_BUFFER_OVERFLOW benutzt wird).

2. dieses Byte wird bei einer Abfrage mit getc() um 8 bit in das 
high-byte des Rückgabewerts geshiftet.

3. Wenn ich jetzt das Bitmuster des Status Registers im AVR Datenblatt 
(Beispiel ATMega8) mit den definierten Fehlercodes vergleiche, sind 
diese doch genau um ein bit verschoben:

Beispiel: das define UART_OVERRUN_ERROR ist 0x0400 also (0x04 << 8).
Das zugehörige Fehlerbit befindet sich im Atmel Datenblatt allerdings an 
der Stelle 3 => 2^3 = 8 => (0x08 << 8) = 0x0800 != 0x0400 ???

Wo liegt da der Hund begraben? Bitte korrigiert mich, wenn ich mit 
obiger Aussage falsch liege...

Gruß,
Alex

von Volker (Gast)


Lesenswert?

Das 3. bit hat doch die Wertigkeit 2^2, also 4. Das 1. bit hat ja die 
Wertigkeit 2^0=1.

von Stefan E. (sternst)


Lesenswert?

Volker wrote:
> Das 3. bit hat doch die Wertigkeit 2^2, also 4. Das 1. bit hat ja die
> Wertigkeit 2^0=1.

Nein, er meint Bit 3 von 0 an gezählt.

@  chillfactor:

Ja, sieht in der Tat nach einem Fehler aus.
Schreib ihm eine Mail.

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.