mikrocontroller.net

Forum: Compiler & IDEs error: expected identifier or '(' before '}' token


Autor: Andreas Herrmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich habe mit der Software für meine Studienarbeit irgendwie 
größere Probleme. Ich komme nicht dahinter, was die folgende 
Fehlermeldung von mir will:
../gps_studienarbeit_software.c:141: error: expected identifier or '(' 
before '}' token

Es wäre super, wenn mir da jemand weiterhelfen könnte.
Vielen Dank im Voraus.
Nachfolgend der Quelltext:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>

#include "mydefs.h"
#include "PROTOS.h"
#include "serial.h"
#include "lcd.h"


//"volatile" für alle Variablen die in Interrupt's geändert werden
unsigned int volatile overflow;

char line[80];     //Zeichenpuffer

unsigned char satcount;
unsigned char gsvcount;

//###################################################################### 
#############
SIGNAL(SIG_OVERFLOW1)        /* signal handler for tcnt1 overflow 
interrupt */
//###################################################################### 
#############
{
 if(overflow>0) overflow--;
}

//###################################################################### 
#############
/* Hauptprogramm */
int main(void)
//###################################################################### 
#############
{
 unsigned char c;

 DDRA=0xFF;    // set io-pins on PortA
 PORTA=0;     //LCD-Datenbus

 DDRD=0xC0;    // set io-pins on PortD
 PORTD=0x00;   //LED's

 SFIOR&=!(1<<PUD);   //Pullups Enable
// SFIOR=0;     //Pullups Enable

 LCDInit();
 ser_init();

//Timer1
 TCCR1A=0;
 TCCR1B=0x01;        //Timer1 Start Takt = F/1
 TIMSK=(1<<TOIE1);   /* enable timer1 overflow int */
 sei();              //enable interrupts

 LCDCls();
 LCDWrite("GPS-Display");
 LCDPos(2,1);
 LCDWrite("Andreas Herrmann");
 Delay1ms(1000);
 LCDCls();

 overflow=TIME_OUT;


   ser_puts("$PRWIILOG,???,V,,,\n"); //Alle Messages abschalten
   Delay1ms(100);
   ser_puts("$PRWIILOG,GGA,A,T,1,0\n"); //GGA Message ein. Jede Sekunde
   Delay1ms(100);
   ser_puts("$PRWIILOG,RMC,A,T,1,0\n"); //RMC Message ein. Jede Sekunde
   Delay1ms(100);
//   ser_puts("$PRWIILOG,GSA,A,T,1,0\n"); //GSA Message ein. Jede 
Sekunde
//   Delay1ms(100);
   ser_puts("$PRWIILOG,GSV,A,T,1,0\n"); //GSV Message ein. Jede Sekunde
   Delay1ms(100);
//#endif

//#ifdef SIRF
//Checksumme am Ende erforderlich !
   //GPS könnte noch auf 9600 Baud stehen.
/*   UBRRL=UART_BAUD_SELECT_9600; //Auf höhere Baudrate schalten
   Delay1ms(100);
   ser_puts("$PSRF100,1,4800,8,1,0*0E\n"); //Neue Baudrate zum GPS 
senden
   Delay1ms(100);
   UBRRL=UART_BAUD_SELECT_4800; //und zurückschalten
  Delay1ms(100);
*/
//   ser_puts("$PSRF103,01,00,00,01*25\n"); //GLL Message abschalten
//   ser_puts("$PSRF103,02,00,00,01*26\n"); //GSA Message abschalten
//   ser_puts("$PSRF103,03,00,00,01*27\n"); //GSV Message abschalten
//   ser_puts("$PSRF103,04,00,00,01*20\n"); //RMC Message abschalten
//   ser_puts("$PSRF103,05,00,00,01*21\n"); //VTG Message abschalten

   ser_puts("$PSRF103,00,00,01,01*25\n"); //GGA Message 1s einschalten
   Delay1ms(100);
   ser_puts("$PSRF103,04,00,01,01*21\n"); //RMC Message 1s einschalten
   Delay1ms(100);
   ser_puts("$PSRF103,03,00,01,01*26\n"); //GSV Message 1s einschalten
   Delay1ms(100);
//#endif

 for(;;) // Anfang Programm Endlosschleife
  {
   do { c=ser_getc(); }while(c!='$'); //Warte auf Anfang einer Message 
z.B. "$GPGGA"

   GetLine(','); //Hole den Header

   if(strcmp(line,"GPGGA")==0) GP_GGA();
   if(strcmp(line,"GPRMC")==0) GP_RMC();
   if(strcmp(line,"GPGSA")==0) GP_GSA();
   if(strcmp(line,"GPGSV")==0) GP_GSV();
   if(strcmp(line,"GPVTG")==0) GP_VTG();

  } // Ende Programm Endlosschleife
}


void Delay1ms(unsigned int time)

{
 unsigned int i;

 for(i=0; i<time; i++) Delay100us(10);
}


void Delay100us(unsigned char time) {


 unsigned char k,l;


 for(k=0; k<time; k++)
  {
   for(l=0; l<40; l++)
    {
     //Ein CPU-Clock = 0.125us bei 8MHz
     NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); 
NOP();
     NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); 
NOP();
    }
  }
  }
  }

Autor: Hmm... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo hast du denn die Funktion/Makro NOP definiert?

Achja, dir ist bewusst das die Schleifen in Delay100us u.U. vom Compiler 
wegoptimiert werden? Und selbst wenn nicht benötigen die Schleifen 
selbst einige Rechenzeit (Variable inkrementieren, Vergleichen, etc) 
wodurch du um einiges länger als 100µs warten würdest.

Schau dir mal hier auf der Seite das Tutorial zum Timer an, da wird 
beschrieben wie man so etwas mit einem Hardwaretimer erledigt.

Wenn ich mich recht entsinne, sollte übrigens der GCC bereits 
Delay-Funktionen bereit stellen.

Autor: Bernhard M. (boregard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du Deinen source besser formatierst siehts Du auch
void Delay100us(unsigned char time)
{
    unsigned char k,l;


    for(k=0; k<time; k++)
    {
        for(l=0; l<40; l++)
        {
            //Ein CPU-Clock = 0.125us bei 8MHz
            NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP();
            NOP();
            NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP();
            NOP();
        }
    }
}
}
da ist eine Klammer zuviel...

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstens wäre es sinnvoll, auch im Code zu kennzeichnen, welche Zeile den 
Fehler verursacht. Außerdem verwende bitte die 
Code-Formatierungsfunktion des Forums oder poste den Code als Anhang! 
Und mach vernünftige Einrückungen. Das da oben ist eine mittlere 
Katastrophe. Wenn ein Student mir mit sowas käme, würde ich ihn sofort 
wieder wegschicken und mir das erst ansehen, wenn es vernünftig 
formatiert ist.

Und noch was: SIGNAL und die signal.h sind veraltet. Falls Du es noch 
nicht getan hast, lade eine aktuelle Version runter. Und schau in der 
libc-Doku nach, wie es richtig geht. Auch das AVR-GCC-Tutorial gibt 
darüber Auskunft.

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es heißt, dass du die eine } zuviel hast, oder jedenfalls die Klammern 
nicht zusammenpassen.
Besorge Dir einen anständigen Editor, formattieren den Code so, dass man 
immer { und } erkennt.
Das wirst Du in Zukunft öfter brauchen (außer du gehst in das 
Management).

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Falser wrote:
> Das wirst Du in Zukunft öfter brauchen (außer du gehst in das
> Management).
Der war gut...

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johannes M. wrote:

> Und mach vernünftige Einrückungen. Das da oben ist eine mittlere
> Katastrophe. Wenn ein Student mir mit sowas käme, würde ich ihn sofort
> wieder wegschicken und mir das erst ansehen, wenn es vernünftig
> formatiert ist.

Japs, sehe ich auch so. Ich wuerde mir echt gut ueberlegen, was ich da 
abgebe. Schlampiger kann es ja nicht mehr aussehen. Und diese 
NOP()-Kette da ist auch grausam. Fuer den AVR (scheint ja einer zu sein) 
gibt es delay-Funktionen, die nachgewiesenerweise auch funktionieren, 
also warum verwendest Du sie nicht?

  #define F_CPU 8000000UL
  #include <util/delay.h>

  //...

  _delay_ms(100);

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.