Baudrate Atmega168

Gast #402778
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.
Gast #402780
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
Gast #402781
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.
Gast #402784
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
#402785
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.

...
#402786
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.

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