mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Kenny S. (Firma: Redire) (bobdekaiser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aloha!
Ich danke schonmal jedem, der sich das Programm mal anguckt!
Ich selber begreife absolut nicht wieso diese Fehler auftreten.
// CPU-Takt:____________________________________________________________________________________________________________________
#define F_CPU 1000000                        // CPU-Geschwindigkeit definieren

// Library:_____________________________________________________________________________________________________________________
#include <avr/io.h>                          // IO des yC definieren
#include <avr/sleep.h>                        // Sleep des yC definieren
#include <util/delay.h>                        // Delay-Funktionen des yC definieren
#include <avr/interrupt.h>                      // Interrupt-Funktionen des yC definieren

// Makros: _____________________________________________________________________________________________________________________  
#define BitSetzen(Byte,Bit) ((Byte) |= ( 1 << (Bit)))        // Makro für Bit setzen
#define BitLoeschen(Byte,Bit) ((Byte) &= ~( 1 << (Bit)))      // Makro für Bit löschen
#define BitToggeln(Byte,Bit) ((Byte) ^= ( 1 << (Bit)))        // Makro für Bit toggeln

#define AusgangDefinieren(Byte,Bit) ((Byte) |= ( 1 << (Bit)))    // Gleich wie Bit setzen, aber für die Lesbarkeit des Prog.
#define EingangDefinieren(Byte,Bit) ((Byte) &= ~( 1 << (Bit)))    // Gleich wie Bit löschen, aber für die Lesbarkeit des Prog.

#define PullUpEinschalten(PORT,Bit) ((PORT) |= ( 1 << (Bit)))    // Gleich wie Bit setzen, aber für die Lesbarkeit des Prog.
#define PullUpAusschalten(PORT,Bit) ((PORT) &= ~( 1 << (Bit)))    // Gleich wie Bit löschen, aber für die Lesbarkeit des Prog.

// Datenbereiche / Hilfsvariablen: _____________________________________________________________________________________________
#define Antiprell 50                        // Entprellung für bsp. Taster o.ä. (50ms)

/* _____________________________________________________________________________________________________________________________
*  Eingänge der Taster definieren
*  TasterPlus zum Erhöhen der Einschaltzeit in der PWM
*  TasterMinus zum Reduzieren der Einschaltzeit in der PWM
*/
#define TasterPlusDDR  DDRA
#define TasterPlusPORT  PORTA
#define TasterPlusANS  PA0
#define TasterPlusPIN  PINA

#define TasterMinusDDR  DDRA
#define TasterMinusPORT PORTA
#define TasterMinusANS  PA1
#define TasterMinusPIN  PINA

// TasterPlus als Eingang definieren: __________________________________________________________________________________________
EingangDefinieren(TasterPlusDDR,TasterPlusANS);

// TasterMinus als Eingang definieren: _________________________________________________________________________________________
EingangDefinieren(TasterMinusDDR,TasterMinusANS);

// TasterPlus PullUp deaktivieren: _____________________________________________________________________________________________
PullUpAusschalten(TasterPlusPORT,TasterPlusANS);

// TasterMinus PullUp deaktivieren: ____________________________________________________________________________________________
PullUpAusschalten(TasterMinusPORT,TasterMinusANS);




int main(void)
{
/* 
*  Aus der "Waveform Genration Mode Bit Description" ergibt sich folgende Bitfolge:
*  Es wird "Mode 1" augewählt (PWM, Phase Correct, 8-bit)
*  Register: TCCR1A == WGM10 (PWM10) = 1 / WGM11 (PWM11) = 0 /  TCCR1B == WGM12 (CTC1) = 0 / WGM13 = 0
*  Prescaler im TCCR1B: CS10 = 1 / CS11 = 0 / CS12 = 1 daraus ergibt sich ein Prescale von 1024 zur CPU-Frequenz
*  1000000 / 1024 = 976,5625 Zähltakte pro Sekunde
*/

// PWM Mode 1:
BitLoeschen(TCCR1A,WGM10);      //
BitLoeschen(TCCR1A,WGM11);      //Alle Bits für den PWM Mode auf 0 schreiben
BitLoeschen(TCCR1B,WGM12);      //
BitLoeschen(TCCR1B,WGM13);      //

BitSetzen(TCCR1A,WGM10);      //
BitLoeschen(TCCR1A,WGM11);      //Mode 1 (PWM,Phase Correct, 8-bit) einstellen
BitLoeschen(TCCR1B,WGM12);      //
BitLoeschen(TCCR1B,WGM13);      //

// Prescaler einstellen:
BitLoeschen(TCCR1B,CS10);      //
BitLoeschen(TCCR1B,CS11);      //Alle Bits für den Prescaler auf 0 schreiben
BitLoeschen(TCCR1B,CS12);      //

BitSetzen(TCCR1B,CS10);        //
BitLoeschen(TCCR1B,CS11);      //Prescaler mit dem Wert 1024 einstellen
BitSetzen(TCCR1B,CS12);        //

// Compare Mode einstellen:
BitLoeschen(TCCR1A,COM1B0);      //
BitLoeschen(TCCR1A,COM1B1);      //Alle Bits für den "Compare Mode" auf 0 schreiben
BitLoeschen(TCCR1A,COM1A0);      //
BitLoeschen(TCCR1A,COM1A1);      //

BitLoeschen(TCCR1A,COM1B0);      //
BitLoeschen(TCCR1A,COM1B1);      //Den Compare Mode auf "Clear on compare match" einstellen
BitLoeschen(TCCR1A,COM1A0);      //Frage für den Unterricht!!!! Wie wird das nochmal deklariert bez. COM1B1 etc.????????????
BitSetzen(TCCR1A,COM1A1);      //

// Ausgang für den PWM-Mode setzen. Dieser ist nach dem Datenblatt vorgegeben:
// DDRB + PB3

AusgangDefinieren(DDRB,PB3);    // Frage für den Unterricht!!!! Wo finde ich das im Datenblatt????????????

// Ende der PWM Einstellung _________________________________________________________________________________________________________


/* Merke: OCR1A ist für die PWM-Pulsbreite zuständig. Es gilt bei einem 8-bit Timer folgende Formel:
*  255 = 100% // 2,55 = 1% 
*  255 / 100 x prozentualer Sollwert
*  Dieser Wert muss in den OCR1A geschrieben werden!
*  Bsp.: 25% = 63,75 demnach gilt: OCR1A = 63 (ca. Ganzzahl)
*  D.h. 25% eingeschaltet und 75% ausgeschaltet
*/ 


/* Aufgabenstellung: Bei Betätigung des Tasters wird die Leistung am Motor erhöht. (Beispiel anhand einer LED)
*  Um eine Ganzzahl zu erhalten nehme ich nicht den Wert 255 als Berechnungsgrundlage, sondern 250.
*  Bei 250 erhalte ich in der Formel, bei 10% Schritten, immer Ganzzahlen.
*/

// Variablen:
volatile uint8_t Sollwert = 0;

volatile uint8_t Prozent = 0;

volatile uint8_t TasterPlus_gedrueckt = 0;

volatile uint8_t TasterMinus_gedrueckt = 0;



    while (1) 
    {
    //TasterPlus entprellen!!!
    if ( 1 == (TasterPlusPIN & (1 << TasterPlusANS)))
    {
      _delay_ms(Antiprell);
      TasterPlus_gedrueckt = 1;
    }
    else
    {
      TasterPlus_gedrueckt = 0;
    }
    
    //TasterMinus entprellen!!!
    if ( 1 == (TasterMinusPIN & (1 << TasterMinusANS)))
    {
      _delay_ms(Antiprell);
      TasterMinus_gedrueckt = 1;
    } 
    else
    {
      TasterMinus_gedrueckt = 0;
    }
    
    //+10% wenn der TasterPlus gedrückt wurde!!!
    if ( 1 == ( TasterPlus_gedrueckt & (Prozent <= 100) ))
    {
      Prozent + 10;
      Sollwert = 250 / 100 * Prozent;
    }
    
    //-10% wenn der TasterMinus gedrückt wurde!!!
    if ( 1 == ( TasterMinus_gedrueckt & (Prozent >= 0) ))
    {
      Prozent - 10;
      Sollwert = 250 / 100 * Prozent;
    }
    
    //In das OCR1A Register schreiben!!!
    OCR1A = Sollwert;
    }
  
}


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
Autor: A. K. (prx)
Datum:

Bewertung
1 lesenswert
nicht 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
Autor: Kenny S. (Firma: Redire) (bobdekaiser)
Datum:

Bewertung
0 lesenswert
nicht 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.
Autor: M.K. B. (mkbit)
Datum:

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

Autor: A. K. (prx)
Datum:

Bewertung
2 lesenswert
nicht 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
Autor: Kenny S. (Firma: Redire) (bobdekaiser)
Datum:

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

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
 if ( 1 == ( TasterPlus_gedrueckt && (Prozent <= 100) ))

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

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

Nächster Fehler:
       Prozent + 10;

Diese Zeile hat NULL Effekt. Es muss heißen:
       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:
  if (TasterPlus_gedrueckt && (Prozent < 100))

Ähnliche Überlegungen gelten für TasterMinus.

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

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

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

Nächster, falsch:
      Prozent - 10;

Richtig:
      Prozent -= 10;

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

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

Bewertung
0 lesenswert
nicht lesenswert
Die Zeilen zwischen
#define TasterMinusPIN  PINA

und
int main(void)

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

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

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

Autor: A. K. (prx)
Datum:

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

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.

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