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
intmain(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
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 ?
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.
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).
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
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 !?
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.
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
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
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§ion=docs_compilerSettingsJakov 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).
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.