Präprozessor Fehler oder der vorm PC? Ich hoffe der am PC

OP #3893944
Lesenswert?
• ▲
▼
Hallo liebe Forumsteilnehmer,
folgendes Problem: Wenn man den Teil unten mit
1
 
2
#if 1
3
......
4
#endif
auskommentiert (#if 0 ;) dann gibt es keine Fehlermeldung ala:
1
../main.c:56:32: error: missing binary operator before token "("
2
 #define T0_COUNTER  (uint16_t) ((1.0 * F_CPU / (( T0_PRESCALE * BAUD ) + 0.5)))
3
                                ^
4
../main.c:66:48: note: in expansion of macro 'T0_COUNTER'
5
 #define BAUD_REAL_NEW (F_CPU/(T0_PRESCALE * (( T0_COUNTER / 2 )+1)))     // Reale Baudrate
6
                                                ^
7
../main.c:71:26: note: in expansion of macro 'BAUD_REAL_NEW'
8
 #define BAUD_ERROR_NEW ((BAUD_REAL_NEW*1000)/BAUD)
9
                          ^
10
../main.c:77:7: note: in expansion of macro 'BAUD_ERROR_NEW'
11
 #if ((BAUD_ERROR_NEW <990) || (BAUD_ERROR_NEW >1010))
12
       ^
13
make: *** [main.o] Error 1
Ich bin ratlos. Bitte um Erleuchtung. Danke schonmal.
1
#include <avr/io.h>
2
#include <inttypes.h>
3
#include <avr/interrupt.h>
4
#include <avr/sleep.h>
5
#include <util/delay.h>
6

7
#undef F_CPU
8
#define F_CPU 8000000
9
// Berechnungen
10
#define     BAUD 9600
11

12
// --------------------------------------------------------
13
// Timer0 ist 8 Bit
14
// Wir berechnen den optimalen Prescale-Faktor
15
// --------------------------------------------------------
16

17
#define T0_MAX_COUNTER    256UL
18

19
// --------------------------------------------------------
20
// 8-Bit Timer - Timer0
21
// --------------------------------------------------------
22
#define _T0_PRESCALE_0    (0)
23
#define _T0_PRESCALE_1    (1<<CS00)
24
#define _T0_PRESCALE_8    (1<<CS01)
25
#define _T0_PRESCALE_64    (1<<CS01 | 1<<CS00)
26
#define _T0_PRESCALE_256  (1<<CS02)
27
#define _T0_PRESCALE_1024  (1<<CS02 | 1<<CS00)
28

29
// --------------------------------------------------------
30
// Timer0 Vorteiler für Baudrate berechnen
31
// --------------------------------------------------------
32
#if (F_CPU  / BAUD ) < T0_MAX_COUNTER
33
# define T0_PRESCALE    1UL      // prescaler :1
34
# define T0_PRESCALE_VALUE  _T0_PRESCALE_1
35

36
#elif (F_CPU  / (BAUD  * 8UL )) < T0_MAX_COUNTER
37
# define T0_PRESCALE    8UL      // prescaler :8
38
# define T0_PRESCALE_VALUE  _T0_PRESCALE_8
39

40
#elif (F_CPU  / (BAUD  * 64UL )) < T0_MAX_COUNTER
41
# define T0_PRESCALE    64UL      // prescaler :64
42
# define T0_PRESCALE_VALUE  _T0_PRESCALE_64
43

44
#elif (F_CPU  / (BAUD  * 256UL )) < T0_MAX_COUNTER
45
# define T0_PRESCALE    256UL      // prescaler :256
46
# define T0_PRESCALE_VALUE  _T0_PRESCALE_256
47

48
#elif (F_CPU  / (BAUD  * 1024UL)) < T0_MAX_COUNTER
49
# define T0_PRESCALE    1024UL      // prescaler :1024
50
# define T0_PRESCALE_VALUE  _T0_PRESCALE_1024
51

52
#else
53
# error "T0_FREQUENCE"
54
#endif
55

56
#define T0_COUNTER  (uint16_t) ((1.0 * F_CPU / (( T0_PRESCALE * BAUD ) + 0.5)))
57
// in T0_PRESCALE_VALUE stehen dann Bit-Werte für den Prescaler.
58
//#define TEST1 ( T0_COUNTER / 2 )
59

60
// Berechnungen
61
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
62
#define BIT_TIME UBRR_VAL * 2
63
#define BIT_TIME_ALT (int) (1000000.0/((float) BAUD)+0.5)
64
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
65
#define BAUD_REAL_ALT (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
66
#define BAUD_REAL_NEW (F_CPU/(T0_PRESCALE * (( T0_COUNTER / 2 )+1)))     // Reale Baudrate
67

68
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
69
#define BAUD_ERROR_ALT ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
70

71
#define BAUD_ERROR_NEW ((BAUD_REAL_NEW*1000)/BAUD)
72

73
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
74
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
75
#endif
76
#if 1
77
#if ((BAUD_ERROR_NEW <990) || (BAUD_ERROR_NEW >1010))
78
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
79
#endif
80
#endif
81
int main() { //Wayne ?
82
}
#3893976
Lesenswert?
• ▲
▼
Ich denke, du verwechselst da was. Oder bedenkst es nicht.

Natürlich kannst du schreiben
1
#define PI 3.141592654
2

3
int main()
4
{
5
  double radius = 5.0;
6
  double area = 2 * PI * radius;
7
}

und der Präprozessor ersetzt dir PI durch 3.141592654.
Aber das ist eine reine Textersetzung! Dem Präprozessor ist es 
grundsärtzlich wurscht, was du im #define als Ersatztext für PI 
angegeben hast.

Wenn du den Präprozessor aber nötigst, den Ersatztext zu interpretieren
1
#if (PI > 2 )
2
  #error "Pi ist zu gross"
3
#endif
dann muss der Präprozessor mit dem Ersatztext tatsächlich arbeiten. Und 
da gibt es Einschränkungen. Hier ist PI nicht nur einfach ein Text der 
durch einen anderen Text ersetzt wird. Das was dann durch die Ersetzung 
entsteht muss auch den syntaktischen Anforderungen des Präprozessors 
entsprechen. Und der ist da viel einfacher gestrickt als der Compiler.
Gast #3894799
Lesenswert?
• ▲
▼
Jörg Esser schrieb:
>
1
> ../main.c:56:32: error: missing binary operator before token "("
2
>  #define T0_COUNTER  (uint16_t) ((1.0 * F_CPU / (( T0_PRESCALE * BAUD ) 
3
> + 0.5)))
4
>

Sieht aus, als ob dem Compiler uint16_t nicht bekannt ist und dadurch 
den Cast nicht erkennt (ein generelles Problem von C's typedefs - ein 
typedef-Identifier ändert die Syntax; jenachdem was 'a' ist, ist 
'(a)(b)' gültig oder ein Syntaxerror).

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.