Forum: Compiler & IDEs avr-libc: Fehler in Interruptdefinition?


von enrico (Gast)


Lesenswert?

Hi Leuts,

also bin gerade mit meinem ATMega324p am verzweifeln^^. Versuche gerade 
nen stupiden Timer mit CTC zum laufen zu bringen, allerdings lässt sich 
das Teil von meiner Autorität nicht ganz überzeugen...

Jetzt bin ich neben einigen kuriositäten auf einen Widerspruch gestoßen.
hab ne ISR:

ISR(TIMER0_COMPA_vect) {
  missiontime++;
}

Wenn ich da nen fehler reinhaue zeig mir der debugger folgenden text:

main.c: In function ‘__vector_16’:
main.c:95: error: expected expression before ‘.’ token

ja, ich hab einfach mal nen Punkt reingesetzt^^. Mein Problem ist nur, 
dass es __vector_16 schreibt. Im Datenblatt allerdings steht bei den 
vectors:

16 $001E TIMER1_OVF Timer/Counter1 Overflow
17 $0020 TIMER0_COMPA Timer/Counter0 Compare Match A

So wie ich das verstehe ist da die Definition falsch!? oder gibts da 
iwas ominöses was ich übersehen habe? Habt ihr damit auch schon 
Erfahrungen gemacht?

Danke,
Enrico

von Johannes M. (johnny-m)


Lesenswert?

enrico wrote:
> ISR(TIMER0_COMPA_vect) {
>   missiontime++;
> }
>
> Wenn ich da nen fehler reinhaue zeig mir der debugger folgenden text:
>
> main.c: In function ‘__vector_16’:
> main.c:95: error: expected expression before ‘.’ token
Hast Du die avr/interrupt.h includiert? Der Fehler lässt mich vermuten, 
dass das nicht der Fall ist. Offensichtlich kennt der Compiler ISR 
nicht...

> ja, ich hab einfach mal nen Punkt reingesetzt^^.
Wo?

> Mein Problem ist nur,
> dass es __vector_16 schreibt. Im Datenblatt allerdings steht bei den
> vectors:
>
> 16 $001E TIMER1_OVF Timer/Counter1 Overflow
> 17 $0020 TIMER0_COMPA Timer/Counter0 Compare Match A
>
> So wie ich das verstehe ist da die Definition falsch!? oder gibts da
> iwas ominöses was ich übersehen habe? Habt ihr damit auch schon
> Erfahrungen gemacht?
Das ist schon i.O. Im Datenblatt fängt die Zählung der Vektoren 
(unverständlicherweise) mit 1 bei RESET an, in der lib ist das aber nach 
Adressen sortiert und deshalb ist Vektor Nr. 1 da der INT0 (RESET liegt 
an der Adresse 0)

von Stefan E. (sternst)


Lesenswert?

Johannes M. wrote:
> Offensichtlich kennt der Compiler ISR nicht...

Nicht? Und wieso heißt die Funktion dann "__vector_16" und nicht "ISR"?

von Johannes M. (johnny-m)


Lesenswert?

Stefan Ernst wrote:
> Johannes M. wrote:
>> Offensichtlich kennt der Compiler ISR nicht...
>
> Nicht? Und wieso heißt die Funktion dann "__vector_16" und nicht "ISR"?
Das ist natürlich nicht von der Hand zu weisen. Dann stimmt irgendwas 
anderes nicht. Das "__vector_16" ist jedenfalls korrekt eingesetzt 
worden, also ist vermutlich zumindest die richtige ioXXX.h drin...

von Stefan E. (sternst)


Lesenswert?

Ohne weiteren Sourcecode und eventuell einer Beschreibung, wie sich der 
Fehler bemerkbar macht, lässt sich dazu weiter nichts sagen.

von lkmiller (Gast)


Lesenswert?

Hier hat offenbar niemand ein Problem, sondern nur die Frage, wie sich 
der Name von Funktion ISR() in ganz was Anderes (__vector_16) ändern 
kann.
>Und wieso heißt die Funktion dann "__vector_16" und nicht "ISR"?

In interrupt.h zu finden.
ISR ist ein define:
1
#define __INTR_ATTRS used, externally_visible
2
#define ISR(vector) void vector (void) __attribute__ ((signal,__INTR_ATTRS));  void vector (void)

Fazit: Hauptsache es funktioniert.

von Stefan E. (sternst)


Lesenswert?

lkmiller wrote:
> Hier hat offenbar niemand ein Problem, ...

Doch, siehe ersten Post:
"Versuche gerade nen stupiden Timer mit CTC zum laufen zu bringen, 
allerdings lässt sich das Teil von meiner Autorität nicht ganz 
überzeugen..."

>>Und wieso heißt die Funktion dann "__vector_16" und nicht "ISR"?
>
> In interrupt.h zu finden.
> ...

Oh mann, das war doch nur eine rhetorische Frage, um Johannes zu zeigen, 
dass er sich bezüglich des einen Punktes irrt.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

lkmiller wrote:
> Hier hat offenbar niemand ein Problem, sondern nur die Frage, wie sich
> der Name von Funktion ISR() in ganz was Anderes (__vector_16) ändern
> kann.

Ganz einfach:
1
#define TIMER0_COMPA_vect __vector_16

ISR() selbst ist kein Funktionsname, sondern ein Makro (was die
Großbuchstaben ja andeuten sollen).

von enrico (Gast)


Lesenswert?

Ihr seid drollig was ihr aus meiner Frage gemacht habt^^

> Wenn ich da nen fehler reinhaue zeig mir der debugger folgenden text:
...
ihr solltet nicht meinen absichtlich reingehauenen Fehler analysieren, 
sondern mich darüber aufklären warum der Vector die Nr. 16 trägt und 
nicht, wie im Datenblatt angegeben, die Nummer 17 ;).

Also das ganze funktioniert auch mittlerweile und anscheinend darf man 
den Vectordefinitionen in ihrem Namen nicht so ganz trauen ;).
AVR-GCC fängt damit bei 0 an (RESET), ATMEL und damit die Datenblätter 
fangen wohl mit 1 für RESET an... Allerdings sind andere trotzdem 
gleich...
Ach was weiß ich^^ hauptsache es läuft jetzt (war übrigens ne 
Fehldefiniton meinerseits, 2x den gleichen Timer verwendet :D Jetzt 
spackt nur noch Timer2^^

Aber trotzdem danke für euer Bemühen :)

von enrico (Gast)


Lesenswert?

Für mich ists allerdings auch schon etwas zu spät^^ Der erste Poster 
(danke @Johannes) hatte mein problem ja doch gleich fast korrekt 
erfasst ;)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

enrico wrote:

> Also das ganze funktioniert auch mittlerweile und anscheinend darf man
> den Vectordefinitionen in ihrem Namen nicht so ganz trauen ;).

Naja, das sind ja bibliotheksinternen Namen (die leider halt im Rahmen
von Fehlermeldungen oder der Symboltabelle mal bis zum Nutzer
,,durchschlagen'' können).  Insofern musst du den Nummern dort nicht
über den Weg trauen, den Namen darfst und sollst du aber trauen.

> AVR-GCC fängt damit bei 0 an (RESET), ATMEL und damit die Datenblätter
> fangen wohl mit 1 für RESET an...

Ja, wobei die avr-libc Reset nicht wie einen Interruptvektor behandelt
(ist ja auch keiner).  Die Interruptvektoren selbst werden daher bei
1 beginnend gezählt, und nur diese bekommen Namen der Form __vector_N.

> Allerdings sind andere trotzdem
> gleich...

Häh?  Manche sind gleicher als andere, oder was? ;-)  Nein, da ist
generell eine Differenz von 1 drin, s. o.

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
Noch kein Account? Hier anmelden.