Baudratenfehler

OP #2637852
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
Gast #2637856
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
Gast #2637880
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.
#2637883
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.
Gast #2637890
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
OP #2637895
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 !?
OP #2637902
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
#2637905
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
Moderator #2637925
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).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren