Forum: Compiler & IDEs expected ')' before '&=' token


von Kenny S. (Firma: Redire) (bobdekaiser)


Lesenswert?

Aloha!
Ich danke schonmal jedem, der sich das Programm mal anguckt!
Ich selber begreife absolut nicht wieso diese Fehler auftreten.
1
// CPU-Takt:____________________________________________________________________________________________________________________
2
#define F_CPU 1000000                        // CPU-Geschwindigkeit definieren
3
4
// Library:_____________________________________________________________________________________________________________________
5
#include <avr/io.h>                          // IO des yC definieren
6
#include <avr/sleep.h>                        // Sleep des yC definieren
7
#include <util/delay.h>                        // Delay-Funktionen des yC definieren
8
#include <avr/interrupt.h>                      // Interrupt-Funktionen des yC definieren
9
10
// Makros: _____________________________________________________________________________________________________________________  
11
#define BitSetzen(Byte,Bit) ((Byte) |= ( 1 << (Bit)))        // Makro für Bit setzen
12
#define BitLoeschen(Byte,Bit) ((Byte) &= ~( 1 << (Bit)))      // Makro für Bit löschen
13
#define BitToggeln(Byte,Bit) ((Byte) ^= ( 1 << (Bit)))        // Makro für Bit toggeln
14
15
#define AusgangDefinieren(Byte,Bit) ((Byte) |= ( 1 << (Bit)))    // Gleich wie Bit setzen, aber für die Lesbarkeit des Prog.
16
#define EingangDefinieren(Byte,Bit) ((Byte) &= ~( 1 << (Bit)))    // Gleich wie Bit löschen, aber für die Lesbarkeit des Prog.
17
18
#define PullUpEinschalten(PORT,Bit) ((PORT) |= ( 1 << (Bit)))    // Gleich wie Bit setzen, aber für die Lesbarkeit des Prog.
19
#define PullUpAusschalten(PORT,Bit) ((PORT) &= ~( 1 << (Bit)))    // Gleich wie Bit löschen, aber für die Lesbarkeit des Prog.
20
21
// Datenbereiche / Hilfsvariablen: _____________________________________________________________________________________________
22
#define Antiprell 50                        // Entprellung für bsp. Taster o.ä. (50ms)
23
24
/* _____________________________________________________________________________________________________________________________
25
*  Eingänge der Taster definieren
26
*  TasterPlus zum Erhöhen der Einschaltzeit in der PWM
27
*  TasterMinus zum Reduzieren der Einschaltzeit in der PWM
28
*/
29
#define TasterPlusDDR  DDRA
30
#define TasterPlusPORT  PORTA
31
#define TasterPlusANS  PA0
32
#define TasterPlusPIN  PINA
33
34
#define TasterMinusDDR  DDRA
35
#define TasterMinusPORT PORTA
36
#define TasterMinusANS  PA1
37
#define TasterMinusPIN  PINA
38
39
// TasterPlus als Eingang definieren: __________________________________________________________________________________________
40
EingangDefinieren(TasterPlusDDR,TasterPlusANS);
41
42
// TasterMinus als Eingang definieren: _________________________________________________________________________________________
43
EingangDefinieren(TasterMinusDDR,TasterMinusANS);
44
45
// TasterPlus PullUp deaktivieren: _____________________________________________________________________________________________
46
PullUpAusschalten(TasterPlusPORT,TasterPlusANS);
47
48
// TasterMinus PullUp deaktivieren: ____________________________________________________________________________________________
49
PullUpAusschalten(TasterMinusPORT,TasterMinusANS);
50
51
52
53
54
int main(void)
55
{
56
/* 
57
*  Aus der "Waveform Genration Mode Bit Description" ergibt sich folgende Bitfolge:
58
*  Es wird "Mode 1" augewählt (PWM, Phase Correct, 8-bit)
59
*  Register: TCCR1A == WGM10 (PWM10) = 1 / WGM11 (PWM11) = 0 /  TCCR1B == WGM12 (CTC1) = 0 / WGM13 = 0
60
*  Prescaler im TCCR1B: CS10 = 1 / CS11 = 0 / CS12 = 1 daraus ergibt sich ein Prescale von 1024 zur CPU-Frequenz
61
*  1000000 / 1024 = 976,5625 Zähltakte pro Sekunde
62
*/
63
64
// PWM Mode 1:
65
BitLoeschen(TCCR1A,WGM10);      //
66
BitLoeschen(TCCR1A,WGM11);      //Alle Bits für den PWM Mode auf 0 schreiben
67
BitLoeschen(TCCR1B,WGM12);      //
68
BitLoeschen(TCCR1B,WGM13);      //
69
70
BitSetzen(TCCR1A,WGM10);      //
71
BitLoeschen(TCCR1A,WGM11);      //Mode 1 (PWM,Phase Correct, 8-bit) einstellen
72
BitLoeschen(TCCR1B,WGM12);      //
73
BitLoeschen(TCCR1B,WGM13);      //
74
75
// Prescaler einstellen:
76
BitLoeschen(TCCR1B,CS10);      //
77
BitLoeschen(TCCR1B,CS11);      //Alle Bits für den Prescaler auf 0 schreiben
78
BitLoeschen(TCCR1B,CS12);      //
79
80
BitSetzen(TCCR1B,CS10);        //
81
BitLoeschen(TCCR1B,CS11);      //Prescaler mit dem Wert 1024 einstellen
82
BitSetzen(TCCR1B,CS12);        //
83
84
// Compare Mode einstellen:
85
BitLoeschen(TCCR1A,COM1B0);      //
86
BitLoeschen(TCCR1A,COM1B1);      //Alle Bits für den "Compare Mode" auf 0 schreiben
87
BitLoeschen(TCCR1A,COM1A0);      //
88
BitLoeschen(TCCR1A,COM1A1);      //
89
90
BitLoeschen(TCCR1A,COM1B0);      //
91
BitLoeschen(TCCR1A,COM1B1);      //Den Compare Mode auf "Clear on compare match" einstellen
92
BitLoeschen(TCCR1A,COM1A0);      //Frage für den Unterricht!!!! Wie wird das nochmal deklariert bez. COM1B1 etc.????????????
93
BitSetzen(TCCR1A,COM1A1);      //
94
95
// Ausgang für den PWM-Mode setzen. Dieser ist nach dem Datenblatt vorgegeben:
96
// DDRB + PB3
97
98
AusgangDefinieren(DDRB,PB3);    // Frage für den Unterricht!!!! Wo finde ich das im Datenblatt????????????
99
100
// Ende der PWM Einstellung _________________________________________________________________________________________________________
101
102
103
/* Merke: OCR1A ist für die PWM-Pulsbreite zuständig. Es gilt bei einem 8-bit Timer folgende Formel:
104
*  255 = 100% // 2,55 = 1% 
105
*  255 / 100 x prozentualer Sollwert
106
*  Dieser Wert muss in den OCR1A geschrieben werden!
107
*  Bsp.: 25% = 63,75 demnach gilt: OCR1A = 63 (ca. Ganzzahl)
108
*  D.h. 25% eingeschaltet und 75% ausgeschaltet
109
*/ 
110
111
112
/* Aufgabenstellung: Bei Betätigung des Tasters wird die Leistung am Motor erhöht. (Beispiel anhand einer LED)
113
*  Um eine Ganzzahl zu erhalten nehme ich nicht den Wert 255 als Berechnungsgrundlage, sondern 250.
114
*  Bei 250 erhalte ich in der Formel, bei 10% Schritten, immer Ganzzahlen.
115
*/
116
117
// Variablen:
118
volatile uint8_t Sollwert = 0;
119
120
volatile uint8_t Prozent = 0;
121
122
volatile uint8_t TasterPlus_gedrueckt = 0;
123
124
volatile uint8_t TasterMinus_gedrueckt = 0;
125
126
127
128
    while (1) 
129
    {
130
    //TasterPlus entprellen!!!
131
    if ( 1 == (TasterPlusPIN & (1 << TasterPlusANS)))
132
    {
133
      _delay_ms(Antiprell);
134
      TasterPlus_gedrueckt = 1;
135
    }
136
    else
137
    {
138
      TasterPlus_gedrueckt = 0;
139
    }
140
    
141
    //TasterMinus entprellen!!!
142
    if ( 1 == (TasterMinusPIN & (1 << TasterMinusANS)))
143
    {
144
      _delay_ms(Antiprell);
145
      TasterMinus_gedrueckt = 1;
146
    } 
147
    else
148
    {
149
      TasterMinus_gedrueckt = 0;
150
    }
151
    
152
    //+10% wenn der TasterPlus gedrückt wurde!!!
153
    if ( 1 == ( TasterPlus_gedrueckt & (Prozent <= 100) ))
154
    {
155
      Prozent + 10;
156
      Sollwert = 250 / 100 * Prozent;
157
    }
158
    
159
    //-10% wenn der TasterMinus gedrückt wurde!!!
160
    if ( 1 == ( TasterMinus_gedrueckt & (Prozent >= 0) ))
161
    {
162
      Prozent - 10;
163
      Sollwert = 250 / 100 * Prozent;
164
    }
165
    
166
    //In das OCR1A Register schreiben!!!
167
    OCR1A = Sollwert;
168
    }
169
  
170
}

Und hier die Fehler:
Fehler    expected ')' before '&=' token  24
Fehler    recipe for target 'main.o' failed  \Makefile  76
Fehler    expected ')' before '&=' token  24
Fehler    expected ')' before '&=' token  27
Fehler    expected ')' before '&=' token  27
Fehler    expected ')' before '(' token  37
Fehler    expected identifier or '(' before 'volatile'  37
Fehler    expected identifier or '(' before 'volatile'  38
Fehler    expected ')' before '(' token  38
Fehler    expected identifier or '(' before 'volatile'  42
Fehler    expected ')' before '(' token  42
Fehler    expected identifier or '(' before 'volatile'  43
Fehler    expected ')' before '(' token  43

expected ')' before '&=' token  - Diese kommen in den #define am anfang 
vor (wo DDR/BIT und PORT/Bit definiert werden)

expected identifier or '(' before 'volatile' UND expected ')' before '(' 
token- das kommt zum Beispiel hier vor : #define TasterPlusPORT PORTA

Vielen Dank!!!

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Kenny S. schrieb:
> if ( 1 == (TasterMinusPIN & (1 << TasterMinusANS)))

Zeilen zählen, um Fehler und Code zusammen zu bringen, mag ich grad 
nicht so. Aber ich bin recht sicher, dass diese Zeile nicht das tut, was 
du dir dabei gedacht hast. Du hast da namlich nur die Wahl zwischen 1==0 
und 1==2.

: Bearbeitet durch User
von Kenny S. (Firma: Redire) (bobdekaiser)


Lesenswert?

Aloha!
Danke für die schnelle Antwort, gucke ich mir gleich an.
Ich habe weiter unten beschrieben wo die Fehler sind (ich hoffe auch gut 
genug) da die Zeilennummern nicht mit Kopiert wurden.

Beitrag #5884795 wurde vom Autor gelöscht.
von M.K. B. (mkbit)


Lesenswert?

Vermutlich passiert bei den Defines irgendwas unerwartetes. Lass dir den 
Präprozessoroutput vom Compiler ausgeben und schau da was komisch 
aussieht.

von (prx) A. K. (prx)


Lesenswert?

Kenny S. schrieb:
> EingangDefinieren(TasterPlusDDR,TasterPlusANS);

Ausserhalb einer Funktion wirds nichts mit diesen Zeilen.

Nebenbei: In sauber formatiertem Quelltext fällt sowas auf.

: Bearbeitet durch User
von Kenny S. (Firma: Redire) (bobdekaiser)


Lesenswert?

Aloha!
@A. K. das war es auch! VIelen Dank für die schnellen Antworten und für 
die Hilfe!! <3
Guten Abend noch!!
Damit sind die anderen Fehler weg!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Kenny S. schrieb:
> @A. K. das war es auch!

Kaum zu glauben.

A.K. hat Dir keinen syntaktischen Fehler, sondern einen inhaltlichen 
Fehler gezeigt: Deine Bitmaskierung ergibt niemals 1, sondern höchstens 
2.

Die Fehlermeldung des Compilers muss einen anderen Fehler meinen.

: Bearbeitet durch Moderator
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Noch ein paar Fehler:

Kenny S. schrieb:
> if ( 1 == ( TasterPlus_gedrueckt & (Prozent <= 100) ))
>     {
>       Prozent + 10;
>       Sollwert = 250 / 100 * Prozent;
>     }

Prozent scheint hier irgendeine Zahl zwischen 0 und 100 zu sein. Diesen 
Wert bitweise mit TasterPlus_gedrueckt zu verbinden ist Unsinn. Hier 
muss "&&" und nicht "&" verwendet werden:

Es muss heißen:
1
 if ( 1 == ( TasterPlus_gedrueckt && (Prozent <= 100) ))

Der Vergleich eines Bool-Ergebnisses mit 1 ist hyperfluid und macht das 
unleserlich.

Besser:
1
 if (TasterPlus_gedrueckt && (Prozent <= 100))

Nächster Fehler:
1
       Prozent + 10;

Diese Zeile hat NULL Effekt. Es muss heißen:
1
       Prozent += 10;

Nächster Fehler:

Mit obiger Bedingung kann Prozent den Wert 110 erreichen, da hier auf 
größer-gleich geprüft wird.

Daher muss es heißen:
1
  if (TasterPlus_gedrueckt && (Prozent < 100))

Ähnliche Überlegungen gelten für TasterMinus.

Falsch:
1
 if ( 1 == ( TasterMinus_gedrueckt & (Prozent >= 0) ))

Richtig:
1
 if (TasterMinus_gedrueckt && (Prozent > 0))

Also: "&&" statt einfachem "&", ">" statt ">="

Nächster, falsch:
1
      Prozent - 10;

Richtig:
1
      Prozent -= 10;

Weiter mag ich nicht schauen, da werden wohl noch weitere Fehler 
schlummern.

: Bearbeitet durch Moderator
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die Zeilen zwischen
1
#define TasterMinusPIN  PINA

und
1
int main(void)

gehören dort nicht hin. Außerhalb einer Funktion können keine 
Zuweisungen durchgeführt werden.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Kenny S. schrieb:
> Und hier die Fehler:
> Fehler    expected ')' before '&=' token  24

Was ist denn das für ein komischer Compiler, der noch nichtmal 
Zeilennummern ausgibt und wo man Tokens zählen muss???

>       Sollwert = 250 / 100 * Prozent;

Bei deiner Deklaration der Variablen ist das gleichbedeutend mit

>       Sollwert = 2 * Prozent;

Was vermutlich gemeint ist:

>       Sollwert = 250 * Prozent / 100;

von (prx) A. K. (prx)


Lesenswert?

Frank M. schrieb:
> A.K. hat Dir keinen syntaktischen Fehler, sondern einen inhaltlichen
> Fehler gezeigt:

Beides. 20:25 den inhaltlichen, 20:43 den syntaktischen. Seine Reaktion 
dürfte sich auf den zweiten Beitrag bezogen haben.

: Bearbeitet durch User
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.