Forum: Mikrocontroller und Digitale Elektronik Baudrate Atmega168


von Dave_ (Gast)


Lesenswert?

Hallo zusammen

Kann mir jemand von euch verraten, wie ich die Richtige Baudrate beim
ATmega168 einstellen kann. Die Baudrate ist 19200 KBaud.

Wozu dienen UBRRnH und UBRRnL und wie werden sie richtig
initialisiert?

David

von Ronny (Gast)


Lesenswert?

So wie´s im Datenblatt steht.Das Register ist ein Teiler für den
Haupttakt.Den musst du also schonmal wissen.Dann wird beides (also
Haupttakt und gewünschte Baudrate) in die Formel im Datenblatt
eingesetzt und schon weisst du,welchen Wert du reinschreiben musst.Per
WinAVR (GCC) kannst du einfach

UBR = Wert;

schreiben,bei Assembler musst du noch die Reihenfolge von Low und
Highpart beachten.

von Magnus Müller (Gast)


Lesenswert?

[Ironie]

Zu dem Thema gibts super Infos im Datenblatt. Das kostet bei
www.atmel.com zwar satte 0,00 Euro, aber das isses echt Wert ;o)

[/Ironie]


Gruß,
Magnetus

von Dave_ (Gast)


Lesenswert?

Das grobe weiß ich auch. Das Probelm ist, daß ich versuche mit einem
ATMEGA168 Daten an ein Terminal zu senden und dieses emfpängt nur
komsiche zeichen. Jetz weiß ich nicht ob ich die Bautrate richtig
gestetzt habe, weil ich nicht weiß was ich in den UBRRnH und was in den
 UBRRnL schreiben soll. Was heißt das wenn eine Zahl da steht und dann
>>8 z.B. BAUD >> 8 was im USERS Manuel so steht?

David

von Ronny (Gast)


Lesenswert?

Poste deinen Code,LIES & VERSUCH ZUMINDEST das Datenblatt ZU VERSTEHEN.
Atmel drückt sich gemessen an anderen Herstellern nun wirklich noch
ganz brauchbar aus.Sogar Beispiele sind in selbigem zu finden.

Das Forum hier dient in erster Linie zum lernen und Erfahrungen
austauschen.Um Arbeit/Hausaufgaben an andere zu degradieren ist es der
verkehrte Ort.

von Ronny (Gast)


Lesenswert?

"Was heißt das wenn eine Zahl da steht und dann
>>8 z.B. BAUD >> 8 was im USERS Manuel so steht?"

Ich versteh die Frage nicht.

von Hannes L. (hannes)


Lesenswert?

Baudratenquarz verwendet?

...

von Dave_ (Gast)


Lesenswert?

Ja Ja ich weiß es schon.  Habe das Datenblatt ausführlichst studiert.
Ich habe es auch schon geschafft daß der Controller die daten empfängt.
Das Problem ist daß ich es nicht senden kann. Ich weiß nicht woran es
liegt. Habe ein Max232 zwischen Controller und Computer geschalten und
versuche in einer einfachen endlosschleife einfach das zeichen 'a' zu
senden, damit es im terminal auftaucht. Nachdem ich den genzen tag
verschwendet habe und außer daß irgendwelche Y auftauchen taucht das
gewünschte a nicht auf. Ich vermute daß es an der Bautrate liegt, darum
habe ich nachgefragt.

Beispiel USARS Manuell

void USART_Init( unsigned int baud )
{
/* Set baud rate */
UBRRnH = (unsigned char)(baud>>8);  <-------- Was heißt das??
UBRRnL = (unsigned char)baud;
/* Enable receiver and transmitter */
UCSRnB = (1<<RXENn)|(1<<TXENn);
/* Set frame format: 8data, 2stop bit */
UCSRnC = (1<<USBSn)|(3<<UCSZn0);


Die Daten empfangen tue ich mir der einstellung. UBRR0L = 8. 115200und
für UBRR0H gebe ich 0 ein. aber da mein Terminal maximal 19400 Baud
kann muß ich doch bei 16 Mhz UBRR0L = 51 eingeben. was muß ich für
UBRR0H eingeben?

Fest steht es lauft nicht und ich suche nach lösungen vielleicht ist es
eine kleinigkeit, bitte um verständniss.

David

von Hannes L. (hannes)


Lesenswert?

> Baudratenquarz verwendet?

Ich meinte damit:

- Hast Du einen Quarz an den AVR angeschlossen?
- Ist die Frequenz des Quarzes für Baudraten geeignet
  (z.B. 3,6864MHz)
- Hast du die entsprechenden Fusebits eingestellt, damit der AVR den
  Quarz auch benutzt?

Die C-Syntax kenne ich nicht, ich arbeite in Assembler.

Aber UBBRnH und UBBRnL stehen für das H-Byte und L-Byte des
UART-Vorteiler-Registers, wobei H und L für Highbyte und Lowbyte stehen
und n für die Nummer des UART. Da der Mega168 nur über U(S)ART0 verfügt,
ist n natürlich 0.

Du musst Deinen Baudratenwert also in Highbyte und Lowbyte zerlegen und
das Highbyte in UBBR0H schreiben, das Lowbyte in UBBR0L.

...

von Karl H. (kbuchegg)


Lesenswert?

> Du musst Deinen Baudratenwert also in Highbyte und Lowbyte zerlegen
> und das Highbyte in UBBR0H schreiben, das Lowbyte in UBBR0L.

@Dave

... und genau das macht der Code

UBRRnH = (unsigned char)(baud>>8);  <-------- Was heißt das??
UBRRnL = (unsigned char)baud;

Das >> steht für 'nach rechts schieben' und zwar um 8 Bits.
Also eine Division durch 256.

Die Frage ist jetzt allerdings: welchen Wert hat 'baud'?

Ach ja: Es ist im übrigen nicht der Fall, dass in 'baud' die
gewünschte Baudrate stehen soll. Du hast das Datenblatt studiert.
Dann ist dir sicherlich auch aufgefallen, dass es da eine
Formel gibt, nach der sich der zu setzende Wert aus der
Baudrate und der verwendeten Taktfrequenz errechnet.
D.h. Du gehst mit deiner Baudrate und der Taktfrequenz in die
Formel hinein, kriegst einen Wert heraus und dieser Wert
wird dann in die Register UBRRnH und UBRRnL nach obiger
Methode gesetzt.

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.