avr-libc: Fehler in Interruptdefinition?

Gast #920358
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
#920402
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)
#920440
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...
Gast #920476
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.
#920490
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.
Gast #920647
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 :)
Moderator Persönliche Seite #920682
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren