Forum: Compiler & IDEs Präprozessor Fehler oder der vorm PC? Ich hoffe der am PC


von Jörg E. (jackfritt)


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
}

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Der Präprozessor ist nicht der Compiler.
Mit einem uint16_t kann der nichts anfangen.
1
#define T0_COUNTER  (uint16_t) ((1.0 * F_CPU / (( T0_PRESCALE * BAUD ) + 0.5)))
2
                     ********

: Bearbeitet durch User
von Kaj (Gast)


Lesenswert?

Jörg Esser schrieb:
> Präprozessor Fehler oder der vorm PC? Ich hoffe der am PC
Was haben diese Fehler mit deinem PC zu tun?

von Karl H. (kbuchegg)


Lesenswert?

Und wenn ich den Rest so sehe: Nope. Der Präprozessor kann auch 
offiziell nicht Floating Point rechnen.

von Karl H. (kbuchegg)


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.

: Bearbeitet durch User
von Jörg E. (jackfritt)


Lesenswert?

Ok verstanden. Vielen Dank Karl Heinz. Ich werde mal versuchen den Teil 
als Präprozessortauglichen Text umzuschreiben.

von Daniel (Gast)


Lesenswert?

Kaj schrieb:
> Was haben diese Fehler mit deinem PC zu tun?

Gemeint ist kein Fehler am PC sondern vor dem PC, PEBCAK also (Problem 
Exists Between Chair And Keyboard)

von Kaj (Gast)


Lesenswert?

Daniel schrieb:
> Gemeint ist kein Fehler am PC sondern vor dem PC, PEBCAK also (Problem
> Exists Between Chair And Keyboard)
Ah ok, dann hab ich nichts gesagt :)

von R. F. (rfr)


Lesenswert?

OSI Ebene 8 halt.

Gruss

Robert

von Name (Gast)


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).

von Jim M. (turboj)


Lesenswert?

Name schrieb:
> Sieht aus, als ob dem Compiler uint16_t nicht bekannt

Falsch. Erstens ist da inttypes.h included (und damit uint16_t bekannt) 
und zweitens ist das innerhalb einer Präprozessor #if Anweisung. Damit 
muss das bereits vom Präprozessor ausgewertet werden können - der kann 
aber kein uint16_t typecast.

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.