Hi Leute, Bin noch neu in der Mc Szene und versuche mich gerade an der UART es klappt aber garnichts! Benutze einen ATMega32 und versuche UART zu initiallisieren, bekomme aber immer fehlermeldung: ../test.c:144:5: error: #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! Komme auch mit den anderen beiträgen zur UART und Baudrate nicht wirklich weiter! so siht meine initialisierung für UART aus: #ifndef F_CPU #define F_CPU 1000000UL // Systemtakt in Hz #endif #define BAUD 9600UL // Baudrate // Berechnungen #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler. #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010)) #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! #endif Vielen Dank im voraus Masse!
Steht doch alles da: > #error Systematischer Fehler der Baudrate > grösser 1% und damit zu hoch! Datenblatt lesen, z.B. S165 Bit "U2X" anschauen, dann klappt es.
Was ist denn bitte an der Fehlermeldung bitte nicht zu verstehen?
Justus Skorps schrieb:
> Was ist denn bitte an der Fehlermeldung bitte nicht zu verstehen?
Vielen Dank genau wegen solcher Antworten Liebe ich Foren! ;-)
Warum eigentlich 2x bitte?
Ich danke aber Trotzdem dem Gast und schau mir das
Bit "U2X" mal genauer an bin ja noch neuling und weiß noch garnicht was
es macht?!Meld mich dann nochmal....
Mathias Bergter schrieb: > Vielen Dank genau wegen solcher Antworten Liebe ich Foren! ;-) und ich liebe Leute, die Fehlermeldungen nicht mal lesen, Code nur kopieren ohne zu schauen, was er macht, und die nicht in Datenblätter schauen... > Warum eigentlich 2x bitte? schon mal auf die Uhrzeiten geschaut?
Höhr zu ich will über Mc diskuttieren und nix anderes das ist mein erster Beitrag und du hilfst mir nicht weiter also lass es doch einfach!Ausserdem bin ich wie schon öfters gasagt noch Anfänger und sitze schon ne weile vor dem Programm ohne weiter zu kommen! Wenn ich U2X = 1 setze verändert sich meine ungenauigkeit auf 0,2% und der Fehler dürfte nicht mehr kommen!habs vestanden!
Nimm die P.Fleury UART Lib, er hat freundlicherweise deine Arbeit schon gemacht..
aber wie verwende ich diese P.Fleury UART Lib?Gibt es da ein beispiel
Ok hab sei gestern nochmal das ganze TUT durchgeackert und einige erkentnisse gewonnen!kann jetzt auch Daten senden zumindest laut Simulation im AVR Studio undzwar ohne P.Fleury weil ich damit nicht klar kam und auch sehen wollte was ich da mache! Hab jedoch immernoch 2 Probleme und zwar das mit der Baudrate und mit der CPU Frequenz!Da komm ich einfach nicht weiter wenn ich die Fehlermelungen auskommentiere geht es aber es soll ja dann auch schließlich beim Original Funktionieren? Kann jemand helfen??? #ifndef F_CPU #define F_CPU 1000000 // Systemtakt in Hz - Definition als unsigned long beachten >> Ohne ergeben Fehler in der Berechnung #endif #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000" #define BAUD 9600UL // Baudrate // Berechnungen #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler. #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010)) #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! #endif int main (void) // Hauptprogramm { { UCSRA |= (1<<U2X); // Divisor Halbieren UCSRB |= (1<<TXEN)|(1<<RXEN)|(1<<RXCIE); // UART TX einschalten UCSRC |= (1<<URSEL)|(3<<UCSZ0); // Asynchron 8N1 UBRRH = UBRR_VAL UBRRL = UBRR_VAL & 0xFF; } .....Programmrest... }
Bax 182 schrieb: > Probleme und zwar das mit der Baudrate und mit der CPU Frequenz!Da komm > ich einfach nicht weiter wenn ich die Fehlermelungen auskommentiere geht > es aber es soll ja dann auch schließlich beim Original Funktionieren? > > Kann jemand helfen??? Nimm einen Baudratenquarz. Mit 10Mhz gibt es keinen vernünftigen Teiler, so dass du die gewünschte Baudrate von 9600 einigermassen sauber erreichen kannst. Das ist ein Hardwareproblem. Ungefähr so, wie wenn du mit einer Uhr auf der du nur 5-Minutenstriche und einen Minutenzeiger hast, 28 Sekunden abmessen willst. Du kannst noch so gut im schätzen sein, du wirst einen Fehler haben. Bei deinem µC ist es nun mal so, dass sich die Werte mit 10Mhz nicht vernünftig ausgehen. http://www.mikrocontroller.net/articles/Baudratenquarz
Erstmal Danke für die schnelle wenn auch bedrückende Antwort!Aber wieso 10MHz wollte doch nur 1MHz also von intern Takten lassen?
Bax 182 schrieb: > Ok hab sei gestern nochmal das ganze TUT durchgeackert und einige > erkentnisse gewonnen! Ja, genau das ist auch der Weg. Dafür machen sich viele Menschen die Arbeit und schreiben Tutorials, um es Einsteigern wie Dir zu erleichtern. > Kann jemand helfen??? Ja. Fang doch Schritt für Schritt an. Bist Du schon einmal im Single Step die Anweisungen durchgegangen? Hast Du Dir nach jedem Befehl angesehen, was im Prozessor passiert? Welche Register wie verändert werden? Hast Du dann den Inhalt der Register mit dem Handbuch verglichen, um raus zubekommen, ob die Bautrate und die Kommunikationseinstellungen stimmen? Dann löst sich Dein vermeintliches Problem von selbst. Und bei der katastrophalen Rechtschreibung kann ich Dir nicht helfen. Auf alle Fälle willkommen in der Welt der Mikrocontroller :-) Michael
Kurzer Nachtrag: laut Datenblatt Seite 165 müsste der ja eigentlich gehen bei UBRR = 12 und UCSRA |= (1<<U2X); ??
Ja Rechtschreibung ist nicht so mein Ding aber 0en und 1en wohl auch nicht :-)
Deine Formel unter // Berechnungen berücksichtigt nicht, dass du mit gesetztem U2X Bit arbeitest UCSRA |= (1<<U2X); // Divisor Halbieren D. h. du setzt in den Zeilen UBRRH = UBRR_VAL UBRRL = UBRR_VAL & 0xFF; Zahlen für einen anderen Baudwert als den mit dem du die Berechnung gemacht hast (BAUD 9600UL)! Schau in das Datenblatt. Dort ist eine Tabelle mit den Werten für UBRR, die du in UBRRH und UBRRL auftrennen kannst, bei gegebenen Baudraten und Taktwerten. Dort steht auch der jeweilige Baudratenfehler. Du solltest eine Kombination auswählen mit geringem (<2%) Absolutwert des Baudratenfehlers. Die Zeile UBRRH = UBRR_VAL ist auch falsch. Sie muss lauten (AVR-GCC-Tutorial) UBRRH = UBRR_VAL >> 8; Bei einem Systemtakt von 1000000 Hz besteht der Verdacht, dass der interne Oszillator benutzt wird. In dem Fall ist eine Baudrate von 9600 unrealistisch. Der Systemtakt kann bereits durch Temperaturschwankungen so stark abweichen, dass Übertragungsfehler auftreten.
Bax 182 schrieb: > Erstmal Danke für die schnelle wenn auch bedrückende Antwort!Aber wieso > 10MHz wollte doch nur 1MHz also von intern Takten lassen? Tschuldigung: Hab mich in den Nullen verzählt. Das Problem ist aber dasselbe.
Juhu hab endlich die Fehlermeldung bei der CPU_F einstellung gefunden! Jetzt noch die Baudrate UBRRH = UBRR_VAL >> 8; das da ne 12 rein nach der Tabelle also UBRRH = UBRR_VAL >> 12; aber das funzt nicht!
Bax 182 schrieb: > Juhu hab endlich die Fehlermeldung bei der CPU_F einstellung gefunden! > Jetzt noch die Baudrate Endlich bist du beim Datenblatt! > UBRRH = UBRR_VAL >> 8; > das da ne 12 rein nach der Tabelle also > UBRRH = UBRR_VAL >> 12; > aber das funzt nicht! Kann auch nicht, weil du Bitschubersei und einzutragenden Wert miteinander verwurschtest. In UBRR soll der Wert 12 rein (FOSC=1 MHz, BAUD=9600, U2X=1) also: #define UBRR_VAL 12 UBRRH = UBRR_VAL >> 8; UBRRL = UBRR_VAL & 0xFF; Oder UBRRH = 12 >> 8; UBRRL = 12 & 0xFF; Oder UBRR = 12; // In UBRRH und UBRRL trennt das der Compiler auf!
Nein leider geht es auch mit diesen eingaben nicht!bzw. die Fehlermedung kommt immernoch: avr-gcc.exe -mmcu=atmega32 -Wall -gdwarf-2 -Os -fsigned-char -DF_CPU=1000000UL -MD -MP -MT TEST.o -MF dep/TEST.o.d -c ../TEST.c ../TEST.c:19:4: error: #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! make: *** [WIEGELJENAIII.o] Error 1 Build failed with 1 errors and 0 warnings... ************************************************ Die Baudrate wird aus dieser Formel berechnet (hab ich aus dem Tut!) #ifndef F_CPU #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000" #define F_CPU 1000000UL #endif #define BAUD 9600UL // Baudrate // Berechnungen #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler. #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010)) #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! #endif Hab die Formel Nachgerechnet und komme immer auf 7% hab ja aber UX=1 was die Formel nicht beachtet!!!D.h. das meine Einstellungen evtl. bereits richtig sind aber die Formel einfach nicht mehr passt? Und bei der Fehlermeldung steht -DF_CPU=1000000UL wenn ich das aber auf FOSC=1000000UL einstelle sagt er mir wieder das die F_CPU noch nicht festgelegt wurde und das jetzt gemacht wird??! Was ist da nun richtig?? An dieser Stelle nochmal vielen Dank an alle die sich bis jetzt mit meinem Problem befasst haben!! ;-)
Wenn du mit U2X=1 arbeitest, dann entweder in den Formeln 16 durch 8 ersetzen, oder einfach die halbe Baudrate angeben. Letzteres ist zwar einfacher, aber auch verwirrender, wenn man später mal wieder in den Code schaut. Also auf jeden Fall dann die BAUD-Zeile mit einem entsprechenden Kommentar versehen.
Das mit der Baudrate Funktioniert ist aber wirklich verwirrend! Aber auch wenn ich in der Formel die 16 durch 8 ersetze hab ich den Fehler immernoch?!
Bax 182 schrieb: > Aber auch wenn ich in der Formel die 16 durch 8 ersetze hab ich den > Fehler immernoch?! Nicht "in der Formel", sondern "in den Formeln", und dann sollte auch der Fehler weg sein. Ach, und in der ersten Formel muss dann auch noch die 8 durch eine 4 ersetzt werden. ;-)
Nein, dann bekommst du die Fehlermeldung nicht mehr. > Und bei der > Fehlermeldung steht -DF_CPU=1000000UL wenn ich das aber auf > FOSC=1000000UL einstelle sagt er mir wieder das die F_CPU noch nicht > festgelegt wurde und das jetzt gemacht wird??! F_CPU ist inzwischen bei WINAVR der Standardname, um die Taktrate anzugeben und so taucht es auch in der Kommandozeile für den GCC auf (-DF_CPU=1000000UL). FOSC in Anlehnung an fosc aus dem Datenblatt sieht man gelegentlich in alten Sourcen und Tutorials. Du weisst ja inzwischen wie man beide verwendet und kannst alte Sachen an den neuen Stil anpassen...
Jawohl Stefan Super das wars hatte vergessen die 8 durch 2 zu Teilen, ich geh fest!! Danke !!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.