www.mikrocontroller.net

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


Autor: enrico (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Stefan Ernst (sternst)
Datum:

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

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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: lkmiller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#define __INTR_ATTRS used, externally_visible
#define ISR(vector) void vector (void) __attribute__ ((signal,__INTR_ATTRS));  void vector (void)

Fazit: Hauptsache es funktioniert.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
#define TIMER0_COMPA_vect __vector_16

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

Autor: enrico (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: enrico (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.