- LiTime Speicher und Akkus         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 20

Thema: Timer1 verwenden

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.02.2006
    Alter
    37
    Beiträge
    140

    Timer1 verwenden

    Anzeige

    Praxistest und DIY Projekte
    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?

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    39
    Beiträge
    1.516
    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

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.02.2006
    Alter
    37
    Beiträge
    140
    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

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    39
    Beiträge
    1.516
    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

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    37
    Beiträge
    4.255
    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

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.02.2006
    Alter
    37
    Beiträge
    140
    Wow, danke vielmals, ich werd das gleich ausprobieren wenn ich nach Hause komme
    DANKE

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.02.2006
    Alter
    37
    Beiträge
    140
    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.

  8. #8
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    39
    Beiträge
    1.516
    > 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

  9. #9
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Im CTC mode des Timers sollte er overflow Interrupt normalerweise nicht auftreten. Da müßte man Ersatzweise den output compare Interrupt nehmen.

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.02.2006
    Alter
    37
    Beiträge
    140
    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ß!

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test