-
Timer1 verwenden
Hallo!
Ich habe eine simple Frage, wie kann ich beim Timer1 einen Interrupt auslösen?, ich habe ihn glaub ich schon eingestellt, also ctc mode, prescaler,... und jetzt sollte er wenn er OCR1A erreicht einen Interrupt auf TOV1 auslösen. Nur ich weiß nicht wo die Interruptvektortabelle ist. Kann mir da jemand helfen?
-
Hallo,
wo jetzt - RP6 M32 Erweiterungsmodul?
Auf dem Roboter selbst wird Timer 1 schon für die Motoren verwendet (PWM) - nur auf dem Erweiterungsmodul ist der noch frei...
Schau Dir doch einfach mal den Library Code an - da wird ja schon einer der Timer verwendet. Wie dann der passende Timer1 Interrupt heisst kannst Du dann raten bzw. im Datenblatt nachlesen ;)
MfG,
SlyD
-
Ok, es handelt sich ums Erweiterungsmodul, also das M32.
Mit Raten hab ichs nicht so, und die Library habe ich bereits Stundenlang danach durchforstet, anscheinden hab ich da was übersehn...
Das mit dem Datenblatt, also in Assembler wäre das kein Problem, nur ich programmier hald noch nicht lange in C, und jetzt weiß ich nicht wie ich zur Adresse $012 (das ist die Timer1 OVF) einen Sprungbefehl auf mein Unterprogramm geben kann.
mfg Gerko
-
Stundenlang?
Such mal nach (in RP6RobotBaseLib.c bzw. RP6ControlLib.c):
ISR(TIMER0_COMP_vect)
(recht weit unten)
Der Compiler setzt an die Adressen automatisch Sprungbefehle zu den entsprechend deklarierten ISRs. Die sind alle nach demselben Schema benannt: HardWareMODUL_EVENT_vect...
MfG,
SlyD
-
Die Interruptroutine sieht so aus:
ISR(TIMER1_OVF_vect )
{
/* Interrupt Code */
}
Die nötigen Namen der Vektoren findet man in der Doku der AVR-libc, auf der Seite zur <avr/interrupt.h>:
http://www.nongnu.org/avr-libc/user-...nterrupts.html
-
Wow, danke vielmals, ich werd das gleich ausprobieren wenn ich nach Hause komme
DANKE
-
Problem:
Leider hat das auch noch nicht ganz funktioniert, der Compiler schreibt mir folgende Fehlermeldungen hin:
Code:
../RP6Lib/RP6control/RP6ControlLib.c: In function 'initRP6Control':
../RP6Lib/RP6control/RP6ControlLib.c:935: error: static declaration of '__vector_9' follows non-static declaration
../RP6Lib/RP6control/RP6ControlLib.c:934: error: previous declaration of '__vector_9' was here
../RP6Lib/RP6control/RP6ControlLib.c: In function '__vector_9':
../RP6Lib/RP6control/RP6ControlLib.c:936: warning: implicit declaration of function 'servoAnsteuerung'
Die Einstellungen für den Timer 1 sehen wie folgt aus:
Code:
TCCR1A= (0 << COM1A1)
| (0 << COM1A0)
| (0 << COM1B1)
| (0 << COM1B0)
| (0 << FOC1A)
| (0 << FOC1B)
| (0 << WGM11)
| (0 << WGM10);
TCCR1B= (0 << ICNC1)
| (0 << ICES1)
| (0 << WGM13)
| (1 << WGM12) //CTC-Mode (Auslösen bei OCR1A-->TOV1 to MAX
| (1 << CS12) //Prescaller = 256
| (0 << CS11)
| (0 << CS10);
OCR1A = 625;
TIMSK = (0 << TICIE1)
| (0 << OCIE1A)
| (0 << OCIE1B)
| (1 << TOIE1); //wird ausgelöst wenn TOV1 set
ISR(TIMER1_OVF_vect)
{
servoAnsteuerung();
}
Ich habe das direkt in die bereits vorhandene RP6Controlllib.c geschrieben. Das Unterprogramm servoAnsteuerung steht in einem anderen File (wo auch das Hauptprogramm steht) aber deswegen müsste er es doch trotzdem finden. Warum funktioniert der Timer1 nicht so wie ich das mache? Ich habe mir auch die funktion von TIMER0 angesehen, aber das ist im Prinzip das gleiche denke ich.
Aber ich habe auch eine erfreuliche Nachricht:
Inzwischen ist das 4x20 Display vom Conrad gekommen, ich habe schon geschafft auf dem ziemlich viel Text auszugeben und vielleicht bau ich mir in den nächsten Tagen zusätzlich zur Zustandsanzeige, die derzeit die Position der einzelnen Servos angibt noch eine kleine Wetterstationd dazu.
-
> deswegen müsste er es doch trotzdem finden.
NEIN.
C-Compiler finden fast garNICHTS selber ;)
Deklarier die ISR doch einfach in deinem Hauptprogramm - das hat in der Library eigentlich nix verloren denn alle anderen Programme (die Beispielprogramme z.B.) haben diese servoAnsteuerung() Funktion ja gar nicht...
In einer Library steht normalerweise nur allgemeiner Code der mit allen Programmen die die lib nutzen funktioniert.
Ist der Code da oben exakt so in der Lib drin?
Tipp: Funktion (hier die ISR) innerhalb einer Funktion deklarieren ist meistens böse ;)
MfG,
SlyD
-
Im CTC mode des Timers sollte er overflow Interrupt normalerweise nicht auftreten. Da müßte man Ersatzweise den output compare Interrupt nehmen.
-
Wow, danke keine Fehler mehr, du bist eine Maschine :)
Der Timer macht zwar noch nichts, aber das heißt nur das ich etwas aus dem Datenblatt falsch gelesen habe.
Danke für die rasche Hilfe, da macht das Programmieren wirklich Spaß!