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
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.
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.
Stephan Kempa schrieb:> Ich habe folgendes in meinem Source stehen, bevor irgendwelche anderen> Header-Dateien eingebunden werden, also ganz am Anfang.>
1
>#ifndefF_CPU
2
>#defineF_CPU1000000L
3
>#endif
4
>
Kommentiere mal 2 Zeilen aus und ändere die mittlere auf 1L:
1
// #ifndef F_CPU
2
#define F_CPU 1L
3
// #endif
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.
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).
avr-objcopy: --change-section-lma .eeprom=0x0000000000000000 never used
36
37
Creating Extended Listing: main.lss
38
avr-objdump -h -S main.elf > main.lss
39
40
Creating Symbol Table: main.sym
41
avr-nm -n main.elf > main.sym
42
43
Size after:
44
main.elf :
45
section size addr
46
.text 4646 0
47
.bss 266 8388864
48
.stab 8580 0
49
.stabstr 962 0
50
.debug_aranges 192 0
51
.debug_pubnames 856 0
52
.debug_info 4540 0
53
.debug_abbrev 1632 0
54
.debug_line 3757 0
55
.debug_frame 784 0
56
.debug_str 1161 0
57
.debug_loc 1790 0
58
.debug_ranges 144 0
59
Total 29310
60
61
62
63
Errors: none
64
-------- end --------
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
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.
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
...