PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Syntax Error bei ISR()



.patrick
03.07.2010, 00:00
Hi!

Der untenstehende Code ist noch nicht getestet und macht auch noch nicht viel Sinn.

Warum bekomme ich in der Zeile mit "ISR(TIMER0_COMP_vect)" einen Syntay-Error in eclipse, egal welchen Interrupt-Vektor ich übergebe? Ich seh's nicht.





#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>

int main()
{
//LED-Port als Ausgang
DDRC = 255;
//Timer0 auf CTC-Betrieb setzen
TCCR0 |= (1 << WGM01) | (0 << WGM00);
//Vorteiler auf 256 setzen
TCCR0 |= (1 << CS02) | (0 << CS01) | (0 << CS00);
//Vergleichswert für CTC-Betrieb setzen
OCR0 = 120;
//Compare-Match-Interrupt für Timer0 aktivieren
TIMSK|= (1 << OCIE0);
//Globale Interrupts aktivieren
sei();

while(1)
{

}

return 0;
}


//Funktion die aufgerufen wird, wenn TCCR0 = OCR0
ISR(TIMER0_COMP_vect)
{
//LEDs toggeln
PORTC = ~PORTC;
}

Dirk
03.07.2010, 06:28
Wenn ich main mit "int main(void)" deklariere, wird das ohne Fehler kompiliert, sonst auch nur mit einer Warnung.

Gruß Dirk

.patrick
03.07.2010, 07:05
hmm. Also ignorier ich die Warnung garnz einfach?!

Danke!

Hubert.G
03.07.2010, 10:39
Es ist nicht gut Warnungen zu ignorieren. Es kann gut gehen, aber auch nicht.

Dirk
03.07.2010, 11:31
@.patrick:

hmm. Also ignorier ich die Warnung garnz einfach?!
Warum?
Mach doch das "void" einfach da hin, dann gibt's auch keine Warnung mehr.

Gruß Dirk

.patrick
03.07.2010, 13:42
ISR(void TIMER0_COMP_vect)


Dabei bekomm ich aber 'nen Fehler: "two or more data types in declaration specifiers".


Gruß!

Hubert.G
03.07.2010, 13:55
Dort gehört das "void" auch nicht hin.

BurningWave
03.07.2010, 14:02
Entweder function(), was das gleiche ist wie function(void) und was keine Parameter bedeutet oder function(datentyp parametername,...) also mit Parameter. vor den Funktionsnamen kommt bei der Definition eben noch der Rückgabedatentyp also z.B. int, wenn int zurückgegeben wird oder void, wenn man nichts zurückgibt.

PicNick
03.07.2010, 14:52
"ISR" ist keine Function im üblichen Sinne, sondern ein Macro mit einem vordefiniertem Symbol in der Klammer. dieses Symbol gibt die ISR-Vector Nummer an.
Daraus muss der Einsprung in eine Interrupt-Routine angelegt werden UND ein Vector darauf in der isr-vectortabelle.
Call-Argumente und return-Values gibt's definitiv nicht.
Insofern hiesse es sowieso immer

void isr_entry(void)

schau mal nach, die Schreibweise "TIMER0_COMP_vect" muss GENAU stimmen ( "_vect" ist kleingeschrieben ?)

sternst
03.07.2010, 15:05
Wo kommt die Fehlermeldung überhaupt her? Vom Compiler oder von Eclipse selber? Letzteres kannst du dann einfach ignorieren, Eclipse kommt dann wohl nur nicht mit der etwas ungewöhnlichen Schreibweise klar, die ja erst durch die Makro-Auflösung die konkrete Funktionsdeklaration ergibt. Denn diese Makro-Auflösung kann Eclipse selber nicht vollständig durchführen, da dafür das wichtige mcu-Define fehlt. Und das unvollständig Aufgelöste ergibt dann wohl keine syntaktisch richtige Funktionsdeklaration.

luigi_2k
06.01.2011, 09:50
Hallo,
meine Antwort kommt etwas spät, aber da ich selbst das Problem hatte und durch google auf diesen Thread gestoßen bin, hilft's vielleicht noch anderen Suchenden:

Wie sternst zuvor schon vermutete, liegt das Problem allein in der Darstellung im Eclipse. Der Compiler selbst gibt keinerlei Warnungen oder Fehler aus. Ich habe dann das ISR-Makro nach und nach von Hand ersetzt, bis ich auf das Makro "_VECTOR(N)" gestoßen bin, welches nicht aufgelöst werden konnte (Im Editor die Warnung: "Syntax error", mit STRG+Klick konnte die Quelle des defines nicht gefunden werden). Nach kurzer Suche fand ich es im Header "<avr/sfr_defs.h>". Dieses include in der main.c nachtragen hat das Problem behoben. Scheinbar ist die hierarchische Suche des Editors durch Includes begrenzt (aufwandbedingt?).

Also nochmal kurz:

#include <avr/sfr_defs.h> behebt das Problem!

Gruß,
luigi_2k

Jaecko
06.01.2011, 22:15
In Eclipse lässt sich der Parser aber auch ändern. Wo genau weiss ich leider grad nicht, nur man kann einen anderen Parser auswählen, der zwar beim Laden der Dateien länger braucht, dafür aber alle Makros zurückverfolgt und korrekt auflöst.

luigi_2k
07.01.2011, 06:24
Das wäre sicherlich die elegantere Lösung, da ich bei meiner Variante immerhin "völlig unnötig" einen Header eingefügt habe, nur um keine gelben Schlangenlinien zu bekommen.