C XMEGA -> USART -> SPI Mode

Wenn du F_CPU 32MHz hast, kommt für BSEL 399.999 raus, geht also nicht. Max zulässig wären BSEL 4095d (12bit, 0xFFF).
Siehe Post #19.
Habe es den Rechner ausrechnen lassen und dabei evtl. ein casting Problem gehabt?
 
In dem Zusammenhang hat mich mal geärgert, daß man im Studio beim kompilieren zwar Warnings und Errors werfen lassen kann, aber dabei leider keine berechneten Compilerkonstanten ausgeben lassen kann...
GCC hat Unmengen von Schaltern. So wie man mit einem Schalter einstellen kann, daß das Assemblerlisting nicht gelöscht wird, gibt es bestimmt auch einen Schalter, der dafür sorgt, daß die Ausgabe des Präprozessors nicht gelöscht wird. In dieser Datei wirst Du dann alle Berechnungen finden. (Zugegeben, die GCC-Ausgaben sind etwas gewöhnungsbedürftig. Maschinenlesbar eben ;) nicht so gut menschenlesbar...)
muss ich alles was größer als int ist bei nem #define casten?
Nein. Der Standardtyp int ist maschinenabhängig, d.h. bei AVR 16 Bit breit.
Der Präprozessor benutzt den Standard, wenn nichts anderes angeben ist.
In defines schreibt man dann z.B.

CodeBox C
#define F_CPU 32000000UL
um dem Präprozessor mitzuteilen, daß er die Zahl als unsigned long interpretieren soll.
Es funktioniert natürlich auch so, wie Du es gemacht hast, da ein define eine reine Zeichenersetzung ist.
Damit weichst Du aber vom anerkannten guten Programmierstil ab, d.h. Du machst Dein Programm damit für andere weniger leicht lesbar.

Edit:
Damit der Präprozessor Dich richtig versteht, mußt Du natürlich den gesamten zu ersetzenden Text immer in Klammern setzten.

CodeBox C
#define F_CPU ((uint32_t) 32000000)
 
Zuletzt bearbeitet:
GCC hat Unmengen von Schaltern. So wie man mit einem Schalter einstellen kann, daß das Assemblerlisting nicht gelöscht wird, gibt es bestimmt auch einen Schalter, der dafür sorgt, daß die Ausgabe des Präprozessors nicht gelöscht wird. In dieser Datei wirst Du dann alle Berechnungen finden.
Nein, das meine ich nicht. Ich bleib ja bei Assembler.
Da kannst Du ja mit Direktiven Compilerkonstanten festlegen, und auch aus Konstanten weitere Konstanten berechnen lassen.
Ferner gibt's Direktiven für bedingte Compilierung.
Ähnlich wie hier wollte ich mal die Einträge ins Baudratenregister automatisieren - hat da auch soweit geklappt. Als Tüpfelchen auf dem "i" wollte ich dann den Baudratenfehler beim Compilieren auswerfen lassen - mit der .message-Direktive. Oder ggf der .warning-Direktive. Und das geht eben nicht. AFAIR konnte ich zwar mit bedingter Compilierung was ausgeben lassen, aber den tatsächlichen Fehler (also den Zahlenwert) eben nicht.
Hier nochmal Anspielungen auf das Problem...

Aber wir sind OT...
 
Als Tüpfelchen auf dem "i" wollte ich dann den Baudratenfehler beim Compilieren auswerfen lassen - mit der .message-Direktive. Oder ggf der .warning-Direktive. Und das geht eben nicht. AFAIR konnte ich zwar mit bedingter Compilierung was ausgeben lassen, aber den tatsächlichen Fehler (also den Zahlenwert) eben nicht.
Das geht schon, aber vielleicht nicht ganz so, wie Du es Dir vorstellst. Den tatsächlichen Zahlenwert bekommst Du nur außerhalb des Compilers, z.B. mit grep aus der Ausgabedatei des Präprozessors.

CodeBox C
#define BAUD       9600UL
#define UBRR_VAL   ((F_CPU+BAUD*8)/(BAUD*16)-1)
#define BAUD_REAL   (F_CPU/(16*(UBRR_VAL+1)))
#define BAUD_ERROR   ((BAUD_REAL*1000)/BAUD)
#if ((BAUD_ERROR<990)|(BAUD_ERROR>1010))
#error Baudrate Fehler > 1 %
#endif
EO OT
 
Das geht schon, aber vielleicht nicht ganz so, wie Du es Dir vorstellst.
Erzeugt beim Versuch der Compilierung bei mir folgenden Error:
"Expression: Syntax error, unexpected SYMBOL" in Zeile 5.
Kommentiert man if und endif-Direktiven aus, kommt der (korrekte) error "Baudrate Fehler..." allerdings ohne "%". Soweit war ich auch schon vorher.
Aber damals wollte ich die Ergebnisse als Messages im Ausgabefenster (über dem "Memory use summary") sehen...
Nicht nur beim UART.
Ausserhalb kann ich auch selbst rechnen (hab genug Zettel da) bzw hab meine App...
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)