PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit dem Uart



FiTus
15.06.2006, 14:51
Hallo Leute,


uint16_t ubrr = (uint16_t) ((uint32_t) F_CPU/(16*BAUDRATE) - 1);

wer kann mir sagen was die Klammern mit dem uintXX_t genau bedeuten/bewirken?

Wenn ich die Zeile mit BAUD 38400 verwende geht alles einwand frei,

setze ich aber 9600 ein, geht nichts mehr.

danach geht es so weiter


UBRRH = (uint8_t) (ubrr>>8);
UBRRL = (uint8_t) (ubrr);

Mfg
FiTus

SprinterSB
15.06.2006, 18:03
Das sind casts, also Typumwandlungen bzw. besagen, in welchem Typ berechnet wird.

F_CPU passt üblicherweise nicht in 16 Bit rein, daher wird die Berechnung in 32 Bit gemacht. Das Ergebnis past in 16 Bit rein (sollte es zumindest, wenn nicht, hat man unsinnige Werte angegeben). Je nachdem, um welche Objekte es sich in der Zuweisung handelt, wird die Auswertung auf dem Host erledigt (zur Compilezeit durch constant folding etc) oder zur Laufzeit durch das Programm. Letzteres, falls einer der Werte zur Compilezeit nicht bekannt ist.

Hast du einen Baud-Kristall? Ansonsten ist evtl. die Toleranz zu groß und du must im double speed mode betreiben. Ist die Gegenseite richtig eingestellt?

AVR-Baudraten-Rechner (JavaScript) (http://people.freenet.de/gjl/helferlein/avr-uart-rechner.html)

FiTus
15.06.2006, 18:27
Hast du einen Baud-Kristall? Ansonsten ist evtl. die Toleranz zu groß und du must im double speed mode betreiben. Ist die Gegenseite richtig eingestellt?

Baud-Kristall? was ist das?

naja bei 38400 (aus c) geht es ja auch, und als ich die funktion in assembler direkt programmiert habe ging es mit 9600 baud auch. also die gegenstelle passt

am speed mode hab ich nix verändert.

SprinterSB
15.06.2006, 19:06
hmmm. ich nehme an, du hast den Code aus RN-Wissen. Wie sieht denn dein Listfile (oder asm) aus?

Baud-Kristalle sind Quarze mit "krummen" Frequenzen, mit denen sich übliche Baudraten besonders gut reproduzieren lassen.

FiTus
15.06.2006, 19:14
richtig, das ist der code aus rn-wissen. ich verwende auf meinem testboard noch den internen 8Mhz oszi. später kommt dann wahrscheinlich ein 8 mhz quarz ran. (chip atmega16)

was sollte ich im listfile sehen, sollte da was auffällig sein?

Mfg
FiTus

SprinterSB
15.06.2006, 19:23
Ich würde nur mal schauen, ob der Code so aussieht wie er soll. Hast du es schon mal mit den UBRR-Werten wie im asm-Programm versucht? Ich nehme mal an es ist ein Rundungsproblem in C.

FiTus
15.06.2006, 19:32
im anhang sind die files

ogni42
15.06.2006, 19:39
Bei 38,4 und 9,6 kBd ist der Fehler bei 8Mhz derselbe (0,2%). Findet man im Datenblatt. Allerdings kann es sein, dass die 8MHz nicht 100% stimmen und dann kommt es immer auf die Applikation an.

SprinterSB
15.06.2006, 20:07
Der Code scheint auf 38400 zu passen, wohl ein Problem mit der Generierung. Wirf mal die Objekte und das Zeug weg (make clean)

SprinterSB
15.06.2006, 20:09
Öhm...da steht auch noch die 38400 in der Quelle. Die muss natürlich von einem Spezialisten auf 9600 umgestellt werden..

FiTus
15.06.2006, 22:31
des war ja die version mit 38,4 die ich dir geschickt hab, weil ich zu testzwecken im letzten stand die beiden sachen auf was funktionierendes gestellt hab. wenn ich bei #define die 9600 schreibe haut es einfach net hin.