Forum: Compiler & IDEs UL oder L am Ende von F_CPU Frequenz


von Gronach (Gast)


Lesenswert?

Hallo allerseits,

eine kleine Frage, warum ist im GCC Tutorial zu den Atmel 
Mikrocontrollern bei der Erklärung des Uart Sendens und Empfangens 
dringend darauf hingewiesen L(ong) statt UL am Ende von F_CPU zu 
verwenden?
Wenn ich im AVR Studio meine 16000000 in der Confi eintrage verwendet 
der Compiler automatisch 16000000UL, wenn ich für die uart Funktion mit 
#define extra 16000000L anschaffe bekomme ich eine Warnung über die 
Redefinierung der Frequenz. Verwende ich aber UL kommen sogar Errors und 
es funktioniert gar nicht. In Postings hier im Forum las ich dass man 
generell UL verwenden sollte.
Was ist nun also an der Sache dran?
(PS: Verwende einen externen 16MHz Quarz, Fuses dementsprechend gesetzt)

von Fried V. (tich)


Lesenswert?

Also ich nehme immer UL, verwende den GCC von WinAVR, allerdings mit der 
Code Blocks IDE, die ist auch für umme und IMHO sehr zu empfehlen.
Gruß Fried

von Johannes M. (johnny-m)


Lesenswert?

Gronach wrote:
> Hallo allerseits,
>
> eine kleine Frage, warum ist im GCC Tutorial zu den Atmel
> Mikrocontrollern bei der Erklärung des Uart Sendens und Empfangens
> dringend darauf hingewiesen L(ong) statt UL am Ende von F_CPU zu
> verwenden?
Weil die Berechnung des Baudratenfehlers, die im Tutorial-Beispiel 
enthalten ist, einen vorzeichenbehafteten Wert benötigt. Die Berechnung 
muss demzufolge in dem Fall in signed long durchgeführt werden. Wenn 
man den Wert für die CPU-Frequenz mit UL angibt, funktioniert die 
Berechnung nicht.

von Gronach (Gast)


Lesenswert?

Ah, super danke!
Das heißt wenn ich den Fehlerwert händisch für die fixierte Baudrate 
nachrechne und die Berechnungsroutine rausschmeiße kann ich getrost UL 
für den Rest des Programms verwenden?

von 900ss (900ss)


Lesenswert?

Gronach wrote:
> Ah, super danke!
> Das heißt wenn ich den Fehlerwert händisch für die fixierte Baudrate
> nachrechne und die Berechnungsroutine rausschmeiße kann ich getrost UL
> für den Rest des Programms verwenden?

Sollte so sein. Es gibt da meines Wissens keine feste Vereinbahrung ob 
nun L oder UL. Es kommt eben darauf an, was man mit der Konstante dann 
berechnet, wie du schon erfahren hast.

von Simon K. (simon) Benutzerseite


Lesenswert?

Du kannst die Berechnung auch abwandeln, dann läuft's auch mit UL
1
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
2
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
3
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD)
4
 
5
#if ((BAUD_ERROR>1010) || (BAUD_ERROR<990))
6
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
7
#endif

Siehe auch die Diskussionsseite dazu:
http://www.mikrocontroller.net/articles/Diskussion:AVR-GCC-Tutorial#Baudraten_Macros_mit_UL

von Gronach (Gast)


Lesenswert?

Wow, genial, danke! Die Diskussionsseite hatte ich bis jetzt nur 
überflogen, das ist ja wirklich ein ausgezeichneter Tipp, danke!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.