-         

Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 33

Thema: Zeiten zwischen Flanken von Interrupts messen

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    26.03.2009
    Beiträge
    22

    Zeiten zwischen Flanken von Interrupts messen

    Anzeige

    Hallo mal wieder,

    Ich denke gerade drüber nach, wie man die Zeiten zwischen Flanken von Interrupts möglichst genau messen kann.

    Und zwar ist das ganze für folgendes:
    Ich möchte an meinem RP6 den Beschleunigungssensor MEMSIC D2125E anschließen. In der Doku des Sensors befindet sich ein Aufbau die Digitalen Signale aus dem Sensor in Analoge umzuwandeln. Das habe ich jetzt aufgebaut und die analogen Signale auf die A/D-Wandler gelegt. Das Problem ist nur das das ganze ziemlich schwankt und von den Messergebnissen eigentlich gar nicht sein kann.

    Also die zweite Version:
    Und zwar gibt der Sensor die Signale mithilfe von steigenden und fallenden Flanken aus. Die steigende flanke symbolisiert den Start der Messreihe und der erste Wert wird bei der fallenden Flanke genommen. Der komplette Zyklus geht dann bis zur nächsten steigenden Flanke. Dann berechnet man noch den Anteil des ersten Wertes am kompletten Zyklus und man erhält den Wert, den man haben will. Da der Sensor zweiachsig ist, müsste man die fallende Flanke des zweiten Sensors auch noch mit aufnehmen und diese auch ins Verhältnis zum gesamten Zyklus setzen.

    Jetzt ist nur die Frage:
    Wie kann die die 1. Achse so ansteuern, dass sie bei steigender und fallender Flanke aufgerufen wird und wie kann ich die 2. Achse so anschließen, dass sie nur bei einer fallenden Flanke das Interrupt aufruft.

    Und dann wäre halt noch die Sache wie ich die Zeiten zwischen steigend/fallend und steigend/steigend aufnehmen kann.

    Wäre echt klasse wenn mich jemand mal aufklären könnte. Am besten vielleicht mit einem kleinen Beispiel, wie ich überhaupt die Interrupts ansteuer, da ich noch nie damit gearbeitet hab.

    Anbei findet ihr die Dokumentation zum Sensor.

    Gruß Lee
    Angehängte Dateien Angehängte Dateien

  2. #2
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Die meistens beste methode zur Zeitmessung ist die Input Capture Funktion von Timer1. Allerdings weiss ich nicht, ob Timer 1 eventuell schon blockiert ist (nicht jede nutzung blockiert den Timer auch) und ober der ISP Pin (= PD6 beim Mega32) noch frei ist. Statt des ICP Pins kann man notfalls auch einen ADC Eingang nutzen, ist dann aber komplizierter.
    Ein Beispielprogramm dazu findet sich im Wiki Bereich:
    http://www.roboternetz.de/wissen/index.php/Timer/Counter_(Avr)

    Da sind auch ein paar Beispiele zu Interrupts dabei.
    Die anderen Pins die einen Interrupt auslösen können sind Int0,Int1,Int2.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    26.03.2009
    Beiträge
    22
    Hi,

    Ich habe mir das in der Wiki mal durchgelesen. In einem anderen Forum unter http://opensourcesegway.forumprofi.d...ensor-t24.html hat jemand schonmal den selben Sensor angeschlossen. Er nutzt für Xout INT0 und für Yout INT1. Desweiteren nutzt er den Timer1 mit einem Prescaler von 64. Allerdings bin ich aus dem Wikibeitrag nicht so wirklich schlau geworden. Dort wird zwar das Überlauf Interrupt genuzt aber bei einem 16-bit Timer wird der glaub ich gar nicht benötigt, da der komplette Zeitraum in etwa bei 10ms liegt. Oder lieg ich mit dem Gedanken jetzt völlig falsch?

    Wodurch würde denn der Timer1 schon genutzt?
    Die Stopwatches des RP6 nutzen Timer0 und wenn TCCR2 Timer2 ist, wird der auch bereits genutzt.

    Sonst werden eigentliche keine Timer-Funktionen genutzt.

    Der PD6 jedenfalls ist frei. Aber eine Frage noch zu ISP und ICP. Du erwähnst oben beides und meinst das selbe oder? Wo ist denn da der Unterschied?

    Wäre klasse wenn du mir das ganze nochmal erklären könntest.

    Gruß Lee

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    Wodurch würde denn der Timer1 schon genutzt?
    Beim RP6 wird Timer1 für die Motor-PWM benutzt.
    Sieh dir mal die RP6RobotBaseLib.c an. Am Ende der Lib findest du die Initialisierung der Timer. Es werden alle genutzt.

    Gruß Dirk

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    26.03.2009
    Beiträge
    22
    Hallo Dirk,

    Ich nutze den RP6 mit der M32-Erweiterung. In der lib des M32 konnte ich nur den Timer0 und Timer2 finden. Sprich Timer1 müsste frei sein.

    Gruß Lee

  6. #6
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Das oben mit ISP waw ein Tipfehler, das sollte ICP heißen. Wenn der Timer1 für PWM benutzt wird könnte er immer noch für die ICP funktion geeigent sein. Hängt dann aber von den Einstellungen ab. Wenn der frei durchläuft und die Frequenz reicht, sollte es gehen. Wenn man nur kurze Zeiten braucht kann man den Überlaufinterrupt natürlich auch weglassen. m Prinzip stellt der ICP Pin einen weiteren externen Interrupt zur Verfügung bei dem man zusätzlich den Timerstand vom Timer 1 gespeichert kriegt.

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    32
    Beiträge
    1.514
    > Sprich Timer1 müsste frei sein.

    Ist er. Steht sogar in nem Kommentar in der Initialisierung vom RP6 M32 Modul drin

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    26.03.2009
    Beiträge
    22
    Code:
     TCCR1B = (1<< ICNC1) + (1<<CS10)    // start Timer mit Systemtakt
    + (1 << ICES1);            // steigende Flanke auswählen
    Da wird ja der Interrupt auf steigende Flanke gesetzt. Wie kann ich die jetzt auf fallend oder auf beides einstellen?

    Und wofür steht folgendes im Beispielcode:

    Code:
    DDRB = 0;  			 // Alles Eingänge, PB0 ist ICP
     PORTB = 0xFF - (1<<PB0);        // Pullups an Eingängen außer ICP
     DDRC = 0;     		 	 // Eingänge
     PORTC = 0xFF;  		 // Pullups an Eingängen 
     DDRD = (1<<PD1);        // Eingänge, außer PD1 = Tx (UART)
     PORTC = 0xFF- (1<<PD1); // Pullups an alle Eingängen (außer TX)
    Gruß Lee

  9. #9
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Der 2 te Teil des beispielcodes ist das definieren welche Ports Eingänge/Ausgänge sind. Das sollte im wesenlichen schon bein RO6 code da sein. Fehlt eventuell nur ein oder 2 Pins.

    Der ICP Interrupt kann man nur entweder auf steigende oder fallende Flanke setzen. Wenn man wie hier beide Flanken braucht, dann muß man jedesmal die Falanke umschalten.
    Die Falnke steuert das BIT ICES1. Wenn man den teil (1<<ICES1) durch (0 << ICES1) ersetzt, dann gibts die fallende Flanke.

    (0 << ICES1) ist auch nur eine andere Schreibweise für 0, aber das sieht man welches Bit man gerade nicht setzen wollte.

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    26.03.2009
    Beiträge
    22
    Ok das mit den Flanken hab ich jetz kapiert, aber wozu werden die ganzen Ein-/Ausgänge denn benötigt? Ich meine im Grunde gehts ja nur um den Timer und die dazugehörigen Interrupts. Oder sind die Ein-/Ausgänge für die UART?

Seite 1 von 4 123 ... LetzteLetzte

Berechtigungen

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