Forum: Mikrocontroller und Digitale Elektronik Baudratenfehler


von Jakov K. (jackenkoffer)


Lesenswert?

Hallo !
ich habe folgendes Programm, es soll mir ins terminal unaufhörlich den 
buchstaben 'x' schreiben... :
1
#include <avr/io.h>
2
3
#ifndef F_CPU
4
#define F_CPU 4000000L
5
#endif
6
#define BAUD 9600L
7
// Berechnungen
8
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)
9
// clever runden
10
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))
11
// Reale Baudrate
12
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) // Fehler in Promille
13
#if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))
14
#error Systematischer Fehler der Baudrate groesser 1% und damit zu hoch!
15
#endif
16
17
int main(void){
18
19
  UCSRB |= (1<<TXEN);
20
  UCSRC |= (1<<URSEL)|(3<<UCSZ0);
21
  // UART TX einschalten
22
  // Asynchron 8N1
23
  UBRRH = UBRR_VAL >> 8;
24
  UBRRL = UBRR_VAL & 0xFF;
25
26
  while(1){
27
28
    while (!(UCSRA & (1<<UDRE))){ /* warten bis Senden moeglich */
29
    }
30
    UDR = 'x';
31
    /* schreibt das Zeichen x auf die Schnittstelle */
32
33
  }
34
  return(0);
35
}
jetzt spuckt mir der Compiler die Fehlermeldung
"#error Systematischer Fehler der Baudrate groesser 1% und damit zu 
hoch!"
raus.

Da ich diesen Quellcode vom tutorial abgeschrieben habe, dürfte da doch 
kein Fehleer sein, oder etwa doch ?
Warum ist denn der Baudratenfehler zu hoch ??

Danke im Voraus,
Jakov

von der Hippie (Gast)


Lesenswert?

Warum nimmt denn kein Mensch hier die
1
[c][/c]
 tags???


Außerdem spuckt dein compiler das nicht aus sondern den Fehler hast du 
selbst definiert:
1
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) // Fehler in Promille
2
#if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))
3
#error Systematischer Fehler der Baudrate groesser 1% und damit zu hoch!
4
#endif

von Yalu X. (yalu) (Moderator)


Lesenswert?

der Hippie schrieb:
> Warum nimmt denn kein Mensch hier die
1
 [c][/c]
> tags???

Hab sie mal nachgetragen.

von Jakov K. (jackenkoffer)


Lesenswert?

Ich bin hier relativ neu und: ... wie macht man das mit den tags genau ?

wenn man den scheiß durchrechnet, kommt 1055,xxx  raus ..
also , das wird wohl nicht stimmen können.

was wurde da denn falsch gemacht ?

von Wolfgang (Gast)


Lesenswert?

Jakov K. schrieb:
> was wurde da denn falsch gemacht ?
Mit der von dir eingetragenen CPU-Frequenz und den 
Ei´nstellmöglichkeiten des Baudratengenerators läßt sich die 
Taktfrequenz für den USART nicht genauer einstellen. Im Datenblatt ist 
dazu sogar eine ausführliche Tabelle mit Taktfrequenzen, Baudraten und 
resultierenden Baudratenfehlern.

von Karl H. (kbuchegg)


Lesenswert?

Jakov K. schrieb:
> Ich bin hier relativ neu und: ... wie macht man das mit den tags genau ?

Du schreibst am Beginn deines Codes
1
[C]
und nach deinem Code
1
[/C]


> wenn man den scheiß durchrechnet, kommt 1055,xxx  raus ..
> also , das wird wohl nicht stimmen können.

Warum soll das nicht stimmen?
Wenn maximal eine Abweichung von 10 von den 1000 im zulässigen Bereich 
ist, dann bist du mit 1055 da eben ausserhalb des Bereichs. 990 wären 
noch ok, 1010 wären auch noch ok. 1055 ist von diesem Bereich schon weit 
weg.

> was wurde da denn falsch gemacht ?

Da wurde überhaupt nichts falsch gemacht. Deine Kombination 4Mhz und 
9600 Baud erlaubt eben nichts besseres.

von Yalu X. (yalu) (Moderator)


Lesenswert?

9600 Baud bei 4MHz sollten schon gehen. Wahrscheinlich wird aber
irgendwo extern (z.B. im Makefile) F_CPU auf einen anderen Wert als
4000000 gesetzt (z.B. 1000000).

von spess53 (Gast)


Lesenswert?

Hi

>Da wurde überhaupt nichts falsch gemacht. Deine Kombination 4Mhz und
>9600 Baud erlaubt eben nichts besseres.

Diese Kombination ergibt einen Fehler von 0,2%. Also kein Grund für eine 
Fehlermeldung.

MfG Spess

von Jakov K. (jackenkoffer)


Lesenswert?

was muss ich den machen, um ein passendes Ergebnis zu erzielen ?
eine andere baudrate wählen ?
oder einen anderen QUarz ?

wenn man es druchrechnet, dann ist BAUD_ERROR = 1055
und es wurde ja verglichen, dass BAUD_ERROR weder größer 10 noch kleiner 
-10 sein darf.

das kann dann nicht stimmen, da müsste man noch die Differenz aus 1000 & 
dem BAUD_ERROR nehmen !?

von H.Joachim S. (crazyhorse)


Lesenswert?

4MHz und 9600baud ergeben 0,2%, absolut im Rahmen.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Jakov K. schrieb:
> wenn man es druchrechnet, dann ist BAUD_ERROR = 1055

Da hast du dich verrechnet.

Trotzdem: Der eigentliche Fehler liegt woanders. Wie kompilierst du
das Programm?

Benutzt du ein Makefile? Dann such in dem Makefile nach einer Zeile,
die "F_CPU" enthält.

von Jakov K. (jackenkoffer)


Lesenswert?

oke, jetzt habe ich aus :
1
#ifndef F_CPU
2
#define F_CPU 4000000L 
3
#endif
das gemacht:
1
#define F_CPU 4000000L

jetzt kommt die Warnung raus, ich habe F_CPU neu definiert.

ich benutze Kontrollerlab, und frage euch ob jemand weiß, wie man in 
Konrtollerlab die Makefile datei aufrugen kann und verändern kann ?

Gruß, Jakov

von Falk B. (falk)


Lesenswert?

@  Jakov K. (jackenkoffer)

>was muss ich den machen, um ein passendes Ergebnis zu erzielen ?

Nur einmal F_CPU definieren. Entweder im Quelltext, ODER in den 
Projektoptione im AVR-Studo ODER im Makefile. Nur EINE Option ist 
zielführend.

>eine andere baudrate wählen ?
>oder einen anderen QUarz ?

Nein. 9k6 bei 4 MHzs sind voll OK.

>wenn man es druchrechnet, dann ist BAUD_ERROR = 1055

Das wäre meilenweit weg von der Realität. In deinem Beipiel ist 
BAUD_ERROR schon um den Offset 1000 Promille verringert, sollte also im 
Bereich von +/- 10 liegen, wenn men max. 1% Fehler will.

>und es wurde ja verglichen, dass BAUD_ERROR weder größer 10 noch kleiner
>-10 sein darf.

Eben.

>das kann dann nicht stimmen, da müsste man noch die Differenz aus 1000 &
>dem BAUD_ERROR nehmen !?

Machst du doch!
1
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) // Fehler in Promille

MFG
Falk

von Jakov K. (jackenkoffer)


Lesenswert?

Hehe...
das Problem hat sich auf eine magische art und weise gelöst, als ich das 
Projekt einmal abgespeichert habe ..
houuups.
naja, wird nicht wieder vorkommen :D

von Yalu X. (yalu) (Moderator)


Lesenswert?

Jakov K. schrieb:
> ich benutze Kontrollerlab, und frage euch ob jemand weiß, wie man in
> Konrtollerlab die Makefile datei aufrugen kann und verändern kann ?

Ich habe noch nie damit gearbeitet. Aber da scheint es für alle
Einstellungen Dialoge zu geben, so auch für die Taktfrequenz:

  http://www.cadmaniac.org/projectMain.php?projectName=kontrollerlab&section=docs_compilerSettings

Jakov K. schrieb:
> das Problem hat sich auf eine magische art und weise gelöst, als ich das
> Projekt einmal abgespeichert habe ..

Wahrscheinlich wird dann erst das Makefile generiert (wenn überhaupt
eins verwendet wird).

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.