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(); } } } }
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.
Wenn Du Deinen source besser formatierst siehts Du auch
1 | void Delay100us(unsigned char time) |
2 | {
|
3 | unsigned char k,l; |
4 | |
5 | |
6 | for(k=0; k<time; k++) |
7 | {
|
8 | for(l=0; l<40; l++) |
9 | {
|
10 | //Ein CPU-Clock = 0.125us bei 8MHz
|
11 | NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); |
12 | NOP(); |
13 | NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); |
14 | NOP(); |
15 | }
|
16 | }
|
17 | }
|
18 | }
|
da ist eine Klammer zuviel...
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.
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).
Klaus Falser wrote: > Das wirst Du in Zukunft öfter brauchen (außer du gehst in das > Management). Der war gut...
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?
1 | #define F_CPU 8000000UL
|
2 | #include <util/delay.h> |
3 | |
4 | //...
|
5 | |
6 | _delay_ms(100); |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.