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)
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...
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:
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 :)
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.