Baudratenfehler

OP #2637852
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
Gast
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
Gast
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.
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.
Gast
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
OP
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 !?
OP
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
@  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
Moderator
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).

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.