Forum: Mikrocontroller und Digitale Elektronik Fehler in uart-lib von Peter Fleury?


von tuxpilot (Gast)


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.

von Falk B. (falk)


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.

von tuxpilot (Gast)


Lesenswert?

tuxpilot schrieb:
> Aus uart.c Zeile ??? (von
> http://homepage.hispeed.ch/peterfleury/avr-software.html, abgerufen
> heute):
Zeile 464 ist richtig. Das hatte ich zwar ausgefüllt, aber dann Strg+Z 
oder so gedrückt. Sorry...

Das &~0x80 erscheint mir am sinnvollsten, sollte mit den mir bekannten 
AVRs (ausser ATXmega) funktionieren. War wohl ein Tippfehler.

von tuxpilot (Gast)


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
}

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.