Hi, ich habe ein sehr seltsames Problem. Ich benutze eine Atmega168 mit internem Quarz und Clock durch 8, also mit 1 Mhz Frequenz. Es ist voellig egal, was ich bei F_CPU, SYSCLOCK, X_TAL im Source einstelle, mein Uart laeuft nur mit 4800Baud. Ich verwende die Lib von Peter Fleury. Es ist auch egal, ob ich im Source 1 als Frequenz angebe oder eine utopische hohe Zahl und dann neu compilliere. Im Makefile gebe ich keine Frequenz an, sondern definitiv im Source. Durch dieses komische Verhalten habe ich das Gefuehl, dass saemtliche Berechnungen fuer Timer, usw falsch sein muessten. Was kann das sein? Gruesse Dusty
Gast
#2270634
>Was kann das sein?
Du brennst immer eine falsche HEX Datei
die mit deinem Programm nichts zu tun hat.
Noe. Hab ich auch als ersten Verdacht gehabt. Das Hex ist aber das richtige.
Gast
#2270684
Stephan Kempa schrieb: > Atmega168 mit internem Quarz Wo hast Du den her? Extra von Atmel produzieren lassen? Offiziel gibs sowas jedenfalls nicht. Aber vermutlich läuft auch Dein Atmega168 wie alle anderen mit dem internen RC-Oszillator. Schau ins Datenblatt, insbesondere die Abschnitte "19.8.3 Asynchronous Operational Range" und "19.11 Examples of Baud Rate Setting". Dann sollte Dir einiges klarer werden.
das ist ja komisch. Warum läuft der denn ständig mit 4800 ? Was hast du denn sonst noch so versucht ? K.
Stephan Kempa schrieb: > Es ist voellig egal, was ich bei F_CPU, SYSCLOCK, X_TAL im Source > einstelle, und wo genau stellst du das ein?
Ich habe folgendes in meinem Source stehen, bevor irgendwelche anderen Header-Dateien eingebunden werden, also ganz am Anfang.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
Bei der Lib von Peter Fleury wird der Uart mit diesem Aufruf initialisiert.
1 | |
UART_BAUD_SELECT ist als folgendes Macro in der Lib definiert.
1 | |
Also wird die tatsaechliche Baudrate doch dadurch berechnet, oder lieg ich da falsch. Es ist aber egal, was ich bei F_CPU eintrage. Durch diese Verhalten glaube ich halt, dass alle Berechnungen die auf F_Cpu bassieren dann falsch sind. Auch solche, wie _delay_ms und andere.
Gast
#2271087
Stephan Kempa schrieb: > Ich habe folgendes in meinem Source stehen, Papier ist geduldig. Du mußt es auch dem Prozessor sagen.
Stephan Kempa schrieb: > Ich habe folgendes in meinem Source stehen, bevor irgendwelche anderen > Header-Dateien eingebunden werden, also ganz am Anfang. >
1 | |
2 | |
3 | |
4 | |
Kommentiere mal 2 Zeilen aus und ändere die mittlere auf 1L:
1 | |
2 | |
3 | |
und schau nach, ob der Compiler dann meckert (irgendwas mit "redefined"). Wenn ja, wird das F_CPU irgendwo anders gesetzt. Das hat dann wg. dem "#ifndef F_CPU" Vorrang. Die Stelle gilt es dann zu finden.
Gast
#2271104
Die richtige Baudrate wird durch das Makro aus der Taktfrequenz berechnet egal welchen Takt du einstellst (im Source). Wenn du 4800 Baud einstellst, wird diese abhängig vom CPU Takt berechnet. Und damit bleiben es immer 4800 Baud egal welchen Takt du einstellst. ps: der interne Oszillator ist kein Quarz sondern ein RC Oszillator. Dieser ist stark Betriebsspannungabhängig (und auch Temperatur) und daher ungeeignet um eine Baudrate einzustellen. Es sei denn du benutzt die Baudrate deines PCs als Zeitnormal und stellst damit das AVR Zeitnormal nach (oder paßt den Baudraten Divisor an).
@Frank Das ist ja das Seltsame. Der Compiler meckert nix an. Hab das jetzt mal gemacht. Hier die Ausgaben des Compiler:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
Kein einziger Fehler. @Uwe Ans Macro wird aber doch F_CPU uebergeben. Also muesste doch bei aenderung auch das Ergebniss anders sein, oder seh ich den Wald vor lauter Baeumen nicht? Beispiel: F_CPU=1000000L ((1000000)/((4800)*16l)-1)=12.020833 F_CPU=8000000L ((8000000)/((4800)*16l)-1)=103.166
Gast
#2271527
Bei den Mega48/88/168/328 liegt das Register UBRR bei 0xC4. Die Fleury-Routinen kennen ich nicht. Schreiben die denn auch an diese Adresse? Oder sprechen diese die Adresse 0x09 an, wo zum Beispiel UBRR vom ATmega16 und anderen ATmegas liegt?
Wenn du UART_BAUD_RATE auf 4800 stellst bekommst du egal für welches F_CPU immer eine Baudrate von 4800 das ist ja der Sinn der Berechnung. Wenn du eine andere Baudrate möchtest, musst du UART_BAUD_RATE entsprechend definieren. >>F_CPU=1000000L >>((1000000)/((4800)*16l)-1)=12.020833 >>F_CPU=8000000L >>((8000000)/((4800)*16l)-1)=103.166 damit wird der Wert für den Baudratenteiler berechnet, der bei steigender CPU Frequenz größer werden muss um die gleiche Baudrate zu erhalten.
Gast
#4211370
Für 1 MHz würd ich den UART aber auch nur mit 4800 baud betreiben, weil sonst die Abweichung größer 1% wird (siehe vorherige Antwort). Hier eine Übersicht, welche Baudraten man mit welcher CPU Frequenz einstellen kann, ohne über 1% zu kommen: 1MHz: 4800 2MHz: 9600 3MHz: 14400 4MHz: 19200 6MHz: 28800 8MHz: 38400, 56000 9MHz: 56000 11MHz: 38400, 57600, 115200 12MHz: 57600 ...
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.