Forum: Mikrocontroller und Digitale Elektronik UART initiallisierung geht nicht


von Bax 1. (masse)


Lesenswert?

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!

von Gast (Gast)


Lesenswert?

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.

von Justus S. (jussa)


Lesenswert?

Was ist denn bitte an der Fehlermeldung bitte nicht zu verstehen?

von Bax 1. (masse)


Lesenswert?

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

von Justus S. (jussa)


Lesenswert?

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?

von Bax 1. (masse)


Lesenswert?

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!

von Gast (Gast)


Lesenswert?

Nimm die P.Fleury UART Lib, er hat freundlicherweise deine Arbeit schon 
gemacht..

von Bax 1. (masse)


Lesenswert?

aber wie verwende ich diese P.Fleury UART Lib?Gibt es da ein beispiel

von Phantomix X. (phantomix)


Lesenswert?

Wird mit der lib mitgeliefert.

von Bax 1. (masse)


Lesenswert?

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

}

von Karl H. (kbuchegg)


Lesenswert?

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

von Bax 1. (masse)


Lesenswert?

Erstmal Danke für die schnelle wenn auch bedrückende Antwort!Aber wieso 
10MHz wollte doch nur 1MHz also von intern Takten lassen?

von Michael S. (captain-stone)


Lesenswert?

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

von Bax 1. (masse)


Lesenswert?

Kurzer Nachtrag:

laut Datenblatt Seite 165 müsste der ja eigentlich gehen bei

UBRR = 12 und

UCSRA |= (1<<U2X); ??

von Bax 1. (masse)


Lesenswert?

Ja Rechtschreibung ist nicht so mein Ding aber 0en und 1en wohl auch 
nicht :-)

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Bax 1. (masse)


Angehängte Dateien:

Lesenswert?

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!

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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!

von Bax 1. (masse)


Lesenswert?

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!! ;-)

von Stefan E. (sternst)


Lesenswert?

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.

von Bax 1. (masse)


Lesenswert?

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?!

von Stefan E. (sternst)


Lesenswert?

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. ;-)

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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

von Bax 1. (masse)


Lesenswert?

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
Noch kein Account? Hier anmelden.