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
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)
Johannes M. wrote:
> Offensichtlich kennt der Compiler ISR nicht...
Nicht? Und wieso heißt die Funktion dann "__vector_16" und nicht "ISR"?
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...
Ohne weiteren Sourcecode und eventuell einer Beschreibung, wie sich der Fehler bemerkbar macht, lässt sich dazu weiter nichts sagen.
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.
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.
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).
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 :)
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 ;)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.