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.