Hi ich habe gerade vor für meinen ATmega16 die UART Schnittstelle zu
implementieren.
Ich habe keinen Oszilator also verwende ich den internen Taktgeber. Laut
den Fuses "SUT_CKSEL" steht bei mir der Wert "INTROSC_8MHz_6CK_64ms"
also gehe ich davon aus das ich für die Berechnung von UBBR F_CPU auf
8000000UL setzen muss.
Baudrate ist mir egal iwas um 4800 oder 9600.
Für 9600 habe ich folgendes berechnet:
((8000000+9600*8) / (9600*16) - 1) = 51
Also habe ich folgende Initialisierungsfunktion:
1
voiduart_init(){
2
//ubrr with 8MHz
3
UBRRH=0;
4
UBRRL=51;
5
6
UCSRB|=(1<<RXEN)|(1<<TXEN);
7
//uart format 8N1
8
UCSRC|=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ2);
9
}
Was mache ich da falsch?
Hat einer von euch eine Idee ich teste das einfach mit einem
1
uart_putc(uart_getc());
in der endlos Schleife
Bitte um Hilfe :) und vielen Dank für eure Aufmerksamkeit
charly schrieb:> also gehe ich davon aus das ich für die Berechnung von UBBR F_CPU auf> 8000000UL setzen muss.
exakt.
Aber kontrollier besser, ob der µC wirklich mit ca. 8Mhz läuft!
(dazu eignet sich zb delay_ms. Entweder die Zeit, die du angegeben hast
stimmt oder sie stimmt nicht, wenn du in F_CPU die 8Mhz einträgst)
> Für 9600 habe ich folgendes berechnet:>> ((8000000+9600*8) / (9600*16) - 1) = 51
Dazu gibt es Makros, die die Berechnung ausgehend von F_CPU und der
gewünschten Baudrate für dich erledigen. Benutze sie!
Du willst derartige berechnete Zahlen nicht direkt im Code stehen haben!
> Was mache ich da falsch?
Was funktioniert denn nicht?
Wahrscheinlich stimmt deine µC-Takrate nicht. Wenn du mit 8Mhz rechnest,
deine Fuse-Einstellung aber nach wie vor auf den 1Mhz Default steht,
dann ist klar, dass da nichts vernünftiges dabei rauskommt.
Das ist der häufigste Fehler - also kontrollier, ob dein µC wirklich mit
8Mhz läuft oder nicht.
Und dann ist natürlich noch das Nicht-Verwenden eines QUarzes
problematisch. Die internen 8Mhz sind halt nur so lala genau.
>>
1
>uart_putc(uart_getc());
2
>
> in der endlos Schleife
schlechte Idee.
Dein erster Test sollte ein einfaches
1
uart_putc('X');
sein.
Also erst mal nur Ausgabe und sonst nichts. Wenn du davon abhängig bist,
dass sowohl die Eingabe als auch die Ausgabe fehlerfrei funktionieren
müssen, dann ist das fürs erste schon mal eine Voraussetzung zu viel.
http://www.mikrocontroller.net/articles/AVR_Checkliste#UART.2FUSART
Danke guter Tipp also das geht schon einige ms auseinander. Bei 10s
schon > 200ms Was kann ich denn zur Stabilisierung machen? Ggf eine
geringere Freqeunz z.B. 1Mhz?
Gruß
charly schrieb:> Für 9600 habe ich folgendes berechnet:>> ((8000000+9600*8) / (9600*16) - 1) = 51
Die Formel ist falsch, allerdings das Ergebnis fast gleich:
((8000000) / (9600*16) - 1) = 51,6
> Also habe ich folgende Initialisierungsfunktion:> void uart_init(){> //ubrr with 8MHz> UBRRH = 0;> UBRRL = 51;
Dreh mal die Reihenfolge um: zuerst Low-Byte und dann High-Byte.
Jetzt kann zusätzlich zum Fehler durch Rundung von UBRR noch die
Taktfrequenz zu sehr abweichen, dass die Übertragung nicht richtig
funktioniert. Du brauchst ggf. einen externen Quarz.
Gruß Dietrich
Der nächstliegende Schritt wurde Ihnen doch schon vom Moderator
vorgegeben, nämlich die Checkliste, und dort speziell 'Sonstige
Fehlerquellen'; nur noch durchlesen und Punkt für Punkt abhaken.
> Für einen Character Size von vermutlich 8 Bit müßtest du doch eigentlich> (1 << UCSZ1) | (1 << UCSZ0) setzen ?
Auch wahr.
Aber am besten, das UCSRC gar nicht setzen, der Initial Value passt doch
schon.
> Und ausserdem gibt es kein UCSZ2 in UCSRC
Jaja, das ist im Datenblatt etwas irreführend.
der alte Hanns schrieb:> Auch wahr.> Aber am besten, das UCSRC gar nicht setzen, der Initial Value passt doch> schon.
Und ein halbes Jahr später hast du den Salat.
der alte Hanns schrieb:> Nanu, der C-Compiler bringt da keine Fehlermeldung?
Wäre natürlich schön wenn er das machen würde.
Er setzt zwei mal direkt hintereinander das 2. Bit in UCSRC, das zu
erkennen sollte doch möglich sein ?
Wenn man später nochmal nachlesen will was man gemacht hat ist es
einfacher, zumindest für mich, wenn solche Einstellungen direkt im Code
stehen.
Ich heiße Du nicht Sie ;)
Da die fachliche Seite der Diskussion offenbar ins Stocken geraten ist,
sei mir gestattet, Holger L. noch etwas persönlicher zu antworten, der
Moderator darf's dann auch bald wieder löschen:
Natürlich ist auch die Anredeform, wie alles Sprachliche (und überhaupt
Alles) dem Wandel unterworfen, man denke an das friderizianische Er
("Gehe Er mir aus dem Wege"), oder das Ihr:
»Wohlwend, Ihr könnt hier nicht mit uns von Euren Sachen reden; das sind
unsere Kinder, vor denen es sich nicht schickt!«
...
»Du hast ihn scharf behandelt!« sagte er zu ihr, »wie zum Teufel gerätst
du auf den Einfall, per Wohlwend und per Ihr mit ihm zu reden?«
»Ich denke, man spricht so mit den Sträflingen in den Zuchthäusern; in
meinen Augen ist er aber nichts Besseres!«
Nur so die 2ct eines alten Hundes, pardon, eines alten Hanns.
der alte Hanns schrieb:> "Ein alter Hund lernt keine neuen Tricks", an die ubiquitäre Duzerei> werde ich mich nicht mehr gewöhnen.
Wie alt bist du/sind Sie, wenn ich mal fragen darf?
Ich bin nämlich auch nicht mehr so ganz jung, habe aber keinerlei
Probleme mit der Duzerei. Naja, Kind der sittenlosen 60er...
Du stammst vermutlich noch aus den 50ern oder noch früher. Trotzdem ist
die Sache nicht hoffnungslos. Mein Alter Herr ist Baujahr 41 und hat's
auch gelernt...
Hängt eigentlich wohl vor allem vom Umfeld ab. Am schlimmsten ist es
wohl im Beamten-Milieu. Auch im Milieu der Quasi-Beamten, also z.B.
aufwärts ab der mittlere Leitungsebene in großen Konzernen...
Naja, wäre ja auch das erste Mal in der Geschichte der Zivilisation, daß
Beamte/Quasibeamte irgendwas zur Vereinfachung des Lebens unternehmen
würden...
an c-hater
Vereinfachung bedeutet keineswegs immer Verbesserung.
Ansonsten ist es wohl eine Frage der Gewohnheit (auch so ein Merkmal des
Alters): ich kann mit der neueren Literatur nicht viel anfangen, schon
mit dem sonst geschätzten Arno Schmidt habe ich regelmäßig
Schwierigkeiten; literarisch zu Hause fühle ich mich im 19. Jahrhundert,
Hauff, Keller (siehe oben), Raabe - das prägt. Und wenn das dann
abschätzig als 'Biedermeier reloaded' bezeichnet wird (Hallo, Herr
Brunner!), dann ist mir das wurschtegal (einer der wenigen Vorzüge des
Alters).
Ein Lehrer hat mir vor langer Zeit etwas beigebracht, kurz
zusammengefasst : Entweder man sagt sie aus Respekt vor einer Person,
oder man sagt sie weil es ein Arschloch ist. Was man aus dem letzten
Zitat aus Excelsior entnehme könnte.
Außerdem kenne ich Leute die ein du zu persönlich finden, es ihren
Freunden vorbehalten.
Da ich Sie nicht kenne und demnach nicht einschätzen kann wie es
aufzufassen ist, wäre zumindest für mich noch eine kleine Erklärung
hilfreich.
Warum, bitte, sollte ich Sie für ein "Arschloch" halten? (übrigens eine
merkwürdige Theorie von Ihrem Lehrer).
Sie haben erkannt, was Moderator, spess53, ich und andere übersahen;
Ihre Umgangsformen, soweit zu erkennen, sind einwandfrei, was man von
vielen anderen hier nicht unbedingt behaupten kann. Kurz: Sie sind mir
ein geschätzter Gesprächspartner, oder, falls das besser ankommt: ich
rede gerne mit Dir.
Das ist ja nur eine der drei Möglichkeiten gewesen.
Zugegeben hatte ich die schlimmste Variante eher in Betracht gezogen.
Persönliche Erfahrungen, das Umfeld, die Anonymität im Internet etc...
Was die Theorie angeht, die finde ich gar nicht so verkehrt. Das Sie in
dem (negativen) Fall soll Distanz ausdrücken, den Standpunkt
verdeutlichen ohne direkt zu beleidigen.
Danke es geht mir auch so, ich wünsche Dir noch einen schönen Abend.