Fehler in uart-lib von Peter Fleury?

Gast #5273510
Lesenswert?

Aus uart.c Zeile ??? (von 
http://homepage.hispeed.ch/peterfleury/avr-software.html, abgerufen 
heute):
1
#if defined(UART0_UBRRH)
2
UART0_UBRRH = (unsigned char)((baudrate>>8)&0x80) ;
3
#endif    
4
UART0_UBRRL = (unsigned char) (baudrate&0x00FF);

Wozu ist das &0x80 gut?

Im alten ATmega8 gibt es zwar das URSEL-Bit an der entsprechenden 
Stelle. Das soll aber 0 sein, wenn man nach UBRRH schreiben möchte.

Ausserdem werden durch das &0x80 die unteren 4 Bit gelöscht, die ja für 
langsame Baudraten nötig sind.


Ich bin auf dieses Problem gestoßen, als ich versucht habe, ein UART mit 
300 Baud auf meinem ATtiny841 mit 8MHz zu programmieren. Egal wie hoch 
ich die Zahl in
1
uart_init(ubrr_value)
geschrieben habe, die Baudrate war immer etwas über 4000 Baud.

Ich habe das &0x80 entfernt, und so funktioniert es.
#5273526
Lesenswert?

@tuxpilot (Gast)

>http://homepage.hispeed.ch/peterfleury/avr-software.html, abgerufen
>heute):
>#if defined(UART0_UBRRH)
>UART0_UBRRH = (unsigned char)((baudrate>>8)&0x80) ;

Sieht nach einer Verschlimmbesserung auf. Das sollte wohl eher ein | 
sein.

>Im alten ATmega8 gibt es zwar das URSEL-Bit an der entsprechenden
>Stelle. Das soll aber 0 sein, wenn man nach UBRRH schreiben möchte.

Dann sollte es eher ein & ~0x80 sein. Oder ein & 0x7F.

>Ausserdem werden durch das &0x80 die unteren 4 Bit gelöscht, die ja für
>langsame Baudraten nötig sind.

Eben.
Gast #5273709
Lesenswert?

Habe gerade bemerkt, dass dieses Bit 0x8000 den Double Speed Mode 
aktivieren soll, was auch für &~0x80 spricht.

Zeile 458:
1
if ( baudrate & 0x8000 )
2
{
3
    #if UART0_BIT_U2X
4
    UART0_STATUS = (1<<UART0_BIT_U2X);  //Enable 2x speed 
5
    #endif
6
}

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