Moin und Hallo,
ich habe ein Projekt bisher immer mit 'Programmers Notepad' (PN)
bearbeitet, und aus dem PN auch die Hex Files erzeugt (Tool/[WinAVR]
Make All).
Nun habe ich das gleiche Projekt in AVR Studio 4 angelegt. Unter den
Projekt Options habe ich meine F_CPU auf 11059200 Hz eingestellt.
Die Baudrate berechne ich wie im Tutorial beschrieben:
1
#ifndef F_CPU
2
#define F_CPU 11059200L // Systemtakt in Hz, das L am Ende ist wichtig, NICHT UL verwenden!
Der Fehler zeigt auf die Baudrate Berechnung.
Der Fehler ist beim Kompilieren über PN nicht aufgetreten. Warum meldet
das AVR Studio diesen Fehler, und wie bekomme ich ihn weg?
Hat jemand einen Tipp?
Gruß
matsch
Hat keiner eine Idee?
Wenn ich die Fehlerabfrage auskommentiere läuft das Programm
einwandfrei. Das kann doch aber nicht der Sinn sein, oder?
Gruß
Matsch
fehlt eine „(“. Das müsste aber später eine andere Fehlermeldung geben,
womit sich die Frage stellt, ob Du uns wirklich Deinen aktuellen Code
gezeigt hast. Bitte immer Copy&Paste verwenden, sonst werden Mitleser
potentiell in die Irre geführt und suchen sich einen Wolf.
Ich vermute den Fehler auch eher in den Einstellungen vom AVR Studio als
im Code. Ich finde da nur leider nichts.
AVR Studio: 4.18 Build 700
WinAVR: 20100110
Gruß
Matsch
Obiges Codestück kompiliert ohne Fehler durch. Es kommt aber Dein
Fehler, wenn man F_CPU in 11059200UL ändert. Wetten, Deine
Kommandozeile enthält -DF_CPU=11059200UL? Schau mal ins
Compile-Fenster.
Die Abhilfe hängt davon ab, woher das „UL“ kommt. Am einfachsten
änderst Du im Macro selbst F_CPU in (long)F_CPU.
Das Problem ist nämlich, dass BAUD_ERROR durch die Promotionsregeln
sonst unsigned long wird und deshalb das „-10“ im
Fehlerüberprüfungs-Makro zu unsigned long promotet wird, zu einer
riesigen Zahl (ULONG_MAX-9). Und da passt dann (fast) alles drunter.
Hc Zimmerer schrieb:> Obiges Codestück kompiliert ohne Fehler durch. Es kommt aber Dein> Fehler, wenn man F_CPU in 11059200UL ändert. Wetten, Deine> Kommandozeile enthält -DF_CPU=11059200UL? Schau mal ins> Compile-Fenster.>> Die Abhilfe hängt davon ab, woher das „UL“ kommt. Am einfachsten> änderst Du im Macro selbst F_CPU in (long)F_CPU.
Moin,
ich habe mir schon so etwas gedacht.
In der Kommandozeile steht:
Da findet sich das -DF_CPU=11059200UL.
In den 'Project Options' (siehe Bild) habe ich die Quarz-Frequenz
eingestellt. Ein U bzw. ein UL anhängen geht in dem Dialog nicht.
In meinem alten MAKE File stehen folgende Zeilen:
1
# Processor frequency.
2
# This will define a symbol, F_CPU, in all source code files equal to the
3
# processor frequency. You can then use this symbol in your source code to
4
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
5
# automatically to create a 32-bit value in your source code.
6
# Typical values are:
7
# F_CPU = 1000000
8
# F_CPU = 1843200
9
# F_CPU = 2000000
10
# F_CPU = 3686400
11
# F_CPU = 4000000
12
# F_CPU = 7372800
13
# F_CPU = 8000000
14
# F_CPU = 11059200
15
# F_CPU = 14745600
16
# F_CPU = 16000000
17
# F_CPU = 18432000
18
# F_CPU = 20000000
19
F_CPU=11059200
Binde ich das Makefile ein (gleicher Dialog wie Bild), ist der Fehler
weg.
Es muss doch aber auch im AVR Studio einzustellen sein, bzw. wo muss ich
welches Macro ändern?.
Gruß
Matsch
Habe in einem anderen Thread gelesen: "Der Präprozessor kennt weder
'unsigned char' noch 'double'". Kann das auch für 'long' gelten?
Ich habe jetzt einmal eine andere UART Fehlerberechnung aus einem
anderen Projekt verwendet:
Es fehlt das '-1000' und die Abfrage ist eine andere. Mathematisch
gesehen ist es doch das gleiche, oder?
Wie kann ich mir die Werte von BAUD_ERROR, F_CPU, usw. vom AVR Studio
anzeigen lassen?
Gruß
Matsch
Matthias R. schrieb:> wenn ich das (long) einfüge, bekomme ich folgenden
Fehler:../src/prjdef.c:268:33: error: missing binary operator before token "("
Es passiert selten, aber es passiert: Ich habe übersehen, dass es sich
um reine Präprozessor-Arithmetik handelt, und die versteht keine casts.
> Die Unterschiede sind, soweit ich es erkenne> Fehler: #define BAUD_ERROR ((BAUD_REAL*1000)/UART_BAUD_RATE-1000)> OK: #define BAUD_ERROR ((BAUD_REAL*1000)/UART_BAUD)> undFehler: #if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))> OK: #if ((BAUD_ERROR < 990) || (BAUD_ERROR > 1010))> Es fehlt das '-1000' und die Abfrage ist eine andere. Mathematisch> gesehen ist es doch das gleiche, oder?
In Präprozessor-Mathematik (oder auch C) ist es nicht genau das gleiche:
Die jeweils zweite Version bleibt im unsigned-long-Zahlenbereich,
negative Zahlen sind ausgeschlossen. Deshalb funktioniert sie.
> Wie kann ich mir die Werte von BAUD_ERROR, F_CPU, usw. vom AVR Studio> anzeigen lassen?
Nur indem Du sie in einer C-Zeile verwendest, z.B.
> und das dann ausgibst.
Manche Dinge sind so einfach, da sieht man den Code vor lauter Zeichen
nicht ;-)
Danke für die Ausführungen und Hilfe.
Gruß
Matsch