mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Umstig von PN auf VAR Studio - Baudrate Fehler


Autor: Matthias R. (matsch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
#ifndef F_CPU
   #define F_CPU 11059200L    // Systemtakt in Hz, das L am Ende ist wichtig, NICHT UL verwenden!
#endif
 
#define UART_BAUD_RATE 19200L 
#define UBRR_VAL (F_CPU+UART_BAUD_RATE*8)/(UART_BAUD_RATE*16)-1)    // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))                  // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/UART_BAUD_RATE-1000)        // Fehler in Promille
 
#if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))
   #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
#endif  
Wenn ich nun ein Build erstellen möchte, bekomme ich diesen Fehler:
../src/prjdef.c:267:41: warning: the right operand of "<" changes sign when promoted
../src/prjdef.c:268:4: error: #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
make: *** [prjdef.o] Error 1
Build failed with 1 errors and 1 warnings...
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

Autor: Matthias R. (matsch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier
#define UBRR_VAL (F_CPU+UART_BAUD_RATE*8)/(UART_BAUD_RATE*16)-1)
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.

Autor: Matthias R. (matsch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da hast du recht.
Hier daher noch einmal der Original-copy-and-paste code:
//-----------------------------------------------------------------------------
// UART initialisieren 
// es wird die Library von Peter Fleury benutzt.
//------1---------2---------3---------4---------5---------6---------7---------8 
  #ifndef F_CPU
  /* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
    F_CPU im Makefile definiert werden, eine nochmalige Definition
    hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
    #ifndef/#endif 
  
    Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio 
    verwendet wird und dort eine andere, nicht zur Hardware passende 
    Taktrate eingestellt ist: Dann wird die folgende Definition 
    nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?) 
    von AVRStudio */
 
    #define F_CPU 11059200L    // Systemtakt in Hz, das L am Ende ist wichtig, NICHT UL verwenden!
//    #define F_CPU  8000000L    // Systemtakt in Hz, das L am Ende ist wichtig, NICHT UL verwenden!
  #endif
 
  // #define UART_BAUD_RATE 2400L          // Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!
  // #define UART_BAUD_RATE 4800L          // Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!
  // #define UART_BAUD_RATE 9600L          // Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!
  // #define UART_BAUD_RATE 14400L         // Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!
  #define UART_BAUD_RATE 19200L         // Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!
  // #define UART_BAUD_RATE 28800L         // Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!
  // #define UART_BAUD_RATE 38400L         // Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!
  // #define UART_BAUD_RATE 57600L         // Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!
  // #define UART_BAUD_RATE 76800L         // Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!
  // #define UART_BAUD_RATE 115200L        // Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!
  // #define UART_BAUD_RATE 230400L        // Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!
 
  // Berechnungen
  
  #define UBRR_VAL ((F_CPU+UART_BAUD_RATE*8)/(UART_BAUD_RATE*16)-1)    // clever runden
  #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))                  // Reale Baudrate
  #define BAUD_ERROR ((BAUD_REAL*1000)/UART_BAUD_RATE-1000)        // Fehler in Promille
 

  #if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))
    #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
  #endif  

  uart_init(UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU));
Ich habe beim Kommentare entfernen wohl die Klammer mit reduziert. 
Sorry.
Gruß
Matsch

Autor: Matthias R. (matsch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Matthias R. (matsch)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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:
avr-gcc -I"D:\Projekte\Test\SoftwareMega16\src"  -mmcu=atmega16 -Wall -gdwarf-2 -std=gnu99                                    -DF_CPU=11059200UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT main.o -MF dep/main
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:
# Processor frequency.
#     This will define a symbol, F_CPU, in all source code files equal to the 
#     processor frequency. You can then use this symbol in your source code to 
#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
#     automatically to create a 32-bit value in your source code.
#     Typical values are:
#         F_CPU =  1000000
#         F_CPU =  1843200
#         F_CPU =  2000000
#         F_CPU =  3686400
#         F_CPU =  4000000
#         F_CPU =  7372800
#         F_CPU =  8000000
#         F_CPU = 11059200
#         F_CPU = 14745600
#         F_CPU = 16000000
#         F_CPU = 18432000
#         F_CPU = 20000000
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

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde hier eingreifen:
#if ((BAUD_ERROR>10) || ((long)BAUD_ERROR<-10))
                         ^^^^^^

EDIT: Wenn ich mir's recht überlege, wäre es hier sauberer:
 #define BAUD_ERROR (((long)BAUD_REAL*1000)/UART_BAUD_RATE-1000)        // Fehler in Promille
                      ^^^^^^
Das ersetzt den oberen Vorschlag.

Autor: Matthias R. (matsch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
wenn ich das (long) einfüge, bekomme ich folgenden Fehler:
../src/prjdef.c:268:33: error: missing binary operator before token "("
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:
#define UART_BAUD 19200L

// calculate real baud rate:
#define UBRR_VAL ((F_CPU+UART_BAUD*8)/(UART_BAUD*16)-1)            // round
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))                    // real baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/UART_BAUD)                  // error in promille

#if ((BAUD_ERROR < 990) || (BAUD_ERROR > 1010))
#  error Error of baud rate of RS232 UART is more than 1%. That is too high!
#endif

  uart_init(UART_BAUD_SELECT(UART_BAUD,F_CPU));
Mit der Berechnung bekomme ich keinen Fehler.

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)
und
Fehler: #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?

Wie kann ich mir die Werte von BAUD_ERROR, F_CPU, usw. vom AVR Studio 
anzeigen lassen?

Gruß
Matsch

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.
ultoa(BAUD_ERROR, puffer, 10);
und das dann ausgibst.

Autor: Matthias R. (matsch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hc Zimmerer schrieb:
> Nur indem Du sie in einer C-Zeile verwendest, z.B.
>
> ultoa(BAUD_ERROR, puffer, 10);
> 
> 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.