Jack schrieb:> #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
Finde ich nicht besonders clever. Wenn man das nachrechnet, kommt da
totaler Müll bei raus.
Jack schrieb:> F_CPU+BAUD*8
Was soll das?
So wird das ausgerechnet:
UBRRn = (fOSC /16BAUD) -1
mfg.
Hi,
gut danke schön. Das habe ich geändert, es läuft aber immer noch nicht
Korrekt.
Hab jetzt folgendes gemacht:
unsigned char xxx;
xxx = uart_getc();
uart_puts(&xxx);
xxx = uart_getc();
uart_puts(&xxx);
xxx = uart_getc();
uart_puts(&xxx);
xxx = uart_getc();
uart_puts(&xxx);
xxx = uart_getc();
uart_puts(&xxx);
Habs einfach paar mal öfters eingetippt, die ersten 3 mal kommt nur
irgendwas, ohne das ich etwas eingebe. Dann kann ich etwas eingeben und
er gibt mir sogar den richtigen Wert wieder, jedoch mit zwei
Folgezeichen die aussehen wie eine eckige 0 :) (in binär 11111111
00010000)
Kann es sein, dass am Anfang noch etwas müll im Register steht und ich
erstmal löschen muss??? Nur wie am besten??
Mit freundlichen Grüßen
Jack
Thomas Eckmann schrieb:> Jack schrieb:>> #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden>> Finde ich nicht besonders clever. Wenn man das nachrechnet, kommt da> totaler Müll bei raus.
Dann rechne besser nochmal nach. Die Formel ist nämlich korrekt und
besser als deine Einfach-Formel, eben weil eine eventuelle Aufrundung
enthalten ist.
Das hier:
Jack schrieb:> xxx = uart_getc();> uart_puts(&xxx);
sendet natürlich nach jedem gültigen Zeichen noch eine zufällige Anzahl
von Müllzeichen nach. Denn uart_puts erwartet einen Null-terminierten
String. Oder besser, es sollte. Denn das hier:
> void uart_puts (const char *s){> do{> uart_putc (*s);> }while(*s++);> }
erwartet zwar einen Null-terminierten Sting, sendet aber die Null mit.
Deine Schrottzeichen sind also genau das, was das das Programm macht.
Stefan Ernst schrieb:> Dann rechne besser nochmal nach. Die Formel ist nämlich korrekt und>> besser als deine Einfach-Formel, eben weil eine eventuelle Aufrundung>> enthalten ist.
Das ist nicht meine Formel, sondern die aus dem Datenblatt.
Thomas Eckmann schrieb:> Das ist nicht meine Formel, sondern die aus dem Datenblatt.
Das ist nicht die aus dem Datenblatt. Dort sieht man eine mathematische
Formel. Wenn man die sehr schlicht umsetzt, d.h. alle Variablen darin
als Integer annimmt, kommt Deine (entschuldige: die von Dir
geschriebene) Formel raus.
Geht man das Thema aber ohne die Integer-Vereinfachung an und rechnet
sauber mathematisch, kommt - danach auf Integer umgerechnet - die Formel
des OP raus, die allgemein gebräuchlich ist.
Hc Zimmerer schrieb:> Thomas Eckmann schrieb:>>> Das ist nicht meine Formel, sondern die aus dem Datenblatt.>>>> Das ist nicht die aus dem Datenblatt. Dort sieht man eine mathematische>> Formel. Wenn man die sehr schlicht umsetzt, d.h. alle Variablen darin>> als Integer annimmt, kommt Deine (entschuldige: die von Dir>> geschriebene) Formel raus.>>>> Geht man das Thema aber ohne die Integer-Vereinfachung an und rechnet>> sauber mathematisch, kommt - danach auf Integer umgerechnet - die Formel>> des OP raus, die allgemein gebräuchlich ist.
Anstatt hier dumm rumzusülzen solltest du vielleicht mal ins Datenblatt
reingucken.
mfg.
Thomas Eckmann schrieb:>> Geht man das Thema aber ohne die Integer-Vereinfachung an und rechnet>>>> sauber mathematisch, kommt - danach auf Integer umgerechnet - die Formel>>>> des OP raus, die allgemein gebräuchlich ist.>> Anstatt hier dumm rumzusülzen solltest du vielleicht mal ins Datenblatt> reingucken.>> mfg.
is nu Mal so: wenn man die Formel aus dem Datenblatt korrekt umsetzt,
dann muss man runden. Das machst Du nicht und das ist nicht korrekt.
Also bitte nicht gleich beleidigt sein und andere anmachen!
Walter schrieb:> is nu Mal so: wenn man die Formel aus dem Datenblatt korrekt umsetzt,>> dann muss man runden. Das machst Du nicht und das ist nicht korrekt.>> Also bitte nicht gleich beleidigt sein und andere anmachen!
Erstens bin ich nicht beleidigt und zweitens, wer mich anmacht, den
mache ich auch an.
Und jetzt mal sachlich:
Bei dem 14,74600 MHz Quarz handelt es sich um einen Baudratenquarz.
Solche Quarze setzt man da ein, wo man exakte Baudraten haben möchte. Da
wird überhaupt nicht gerundet. Sondern das geht in Integer immer glatt
auf.
Und deswegen runde ich da nicht und das ist sehr korrekt.
Deswegen nimmt man nämlich einen Baudratenquarz.
Mit so einer komischen Formel, allgemeingültig(?), versaut man sich
leider die ganze Rechnerei. Mag sein, daß das für 20 MHz ja Sinn macht.
Aber nicht für 14,74600 MHz.
mfg.
Thomas Eckmann schrieb:> Mit so einer komischen Formel, allgemeingültig(?), versaut man sich> leider die ganze Rechnerei. Mag sein, daß das für 20 MHz ja Sinn macht.> Aber nicht für 14,74600 MHz.
das ist keine komische Formel, man versaut sich nichts, sie ist
allgemeingültig.
Deine mag ja für 14,74600 MHz stimmen, für nicht Baudratenquarze und die
gibts ja auch stimmt sie nicht.
Dann müsstest du korerekterweise vor dem Berechnen abfragen ob es ein
Baudratenquarz ist und wenn nicht die Berechnung mit der komischen
Formel machen.
Das fände ich aber wirklich komisch
Walter schrieb:> das ist keine komische Formel, man versaut sich nichts, sie ist>> allgemeingültig.>> Deine mag ja für 14,74600 MHz stimmen, für nicht Baudratenquarze und die>> gibts ja auch stimmt sie nicht.>> Dann müsstest du korerekterweise vor dem Berechnen abfragen ob es ein>> Baudratenquarz ist und wenn nicht die Berechnung mit der komischen>> Formel machen.>> Das fände ich aber wirklich komisch
Stimmt. Das ist keine komische Formel.
Eine mathematische Formel, die auch nur ein einziges Mal falsch rechnet,
ist wirklich nicht komisch, sondern Müll.
mfg.
Thomas Eckmann schrieb:> Stimmt. Das ist keine komische Formel.> Eine mathematische Formel, die auch nur ein einziges Mal falsch rechnet,> ist wirklich nicht komisch, sondern Müll.
Ich weiss nicht, wie du zu der Aussage kommst, dass die Formel Müll
berechnet.
Auch im Fall eines Baudratenquarzes kommt da selbstverständlich das
richtige raus. Wahrscheinlich hast du dich beim Taschenrechner vertippt.
In beiden Fällen kommt eine Integer 7 raus.
Bei 14.476 Mhz und 9600 Baud errechnet sich nach Datenblatt-Formel ein
einzustellender Wert von 8.6
Deine Datenblattformel würde daher bei einer Einstellung von 8 liegen,
während der gerundete Wert einen Wert von 9 ergibt. 8.6 liegt näher an 9
als an 8, daher ist der Fehler dort kleiner. Und genau das macht die
Formel mit der Rundungskorrektur. Und um nichts anderes als um eine
Rundungskorrektur handelt es sich bei dem zusätzlichen Term. Damit bei
einem rein rechnerischen Ergebnis von 12.9 dann auch tatsächlich 13
rauskommt und nicht 12.
Und das hier
> Sondern das geht in Integer immer glatt auf.
ist ein Irrtum, wovon man sich leicht überzeugen kann, wenn man mal mit
deinem 'Baudratenquarz' 14.476Mhz und einer Baudrate von 9600
nachrechnet. Baudratenquarze haben die Eigenschaft, dass man viele
Baudraten mit ihnen glatt erzeugen kann. Aber viele ist nicht
gleichbedeutend mit allen/immer.