- Labornetzteil AliExpress         
Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 33

Thema: Zeiten zwischen Flanken von Interrupts messen

  1. #11
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Die einstellungen der Ein/Ausgänge sind u.A. für die UART. Für die Messung der Flanken braucht man nur die Eingangspins auch wirklich als Eingänge definieren.

  2. #12
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    40
    Beiträge
    1.516
    Die Pins in obigem Code passen allerdings nicht zur RP6 Hardware.
    Das ist für nen MEGA8 o.ä.

    Schau Dir die Schaltpläne und das MEGA32 Datenblatt an!
    PD6 ist beim RP6 M32 Erweiterungsmodul ICP...

    MfG,
    SlyD

  3. #13
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hallo Lee,
    Ich nutze den RP6 mit der M32-Erweiterung.
    Davon konnte ich nach deinem 1. Post ...
    Ich möchte an meinem RP6 den Beschleunigungssensor MEMSIC D2125E anschließen.
    ... nicht ausgehen.
    Klar: Bei der RP6Control M32 ist Timer1 frei.
    ICP ist PD6 und auf der M32 auch noch frei (Name: IO_PD6).

    Gruß Dirk

  4. #14
    Neuer Benutzer Öfters hier
    Registriert seit
    26.03.2009
    Beiträge
    22
    OK. Ich glaub das Beispielprogramm hab ich jetz so langsam verstanden. Nun hab ich mir auch schon nen paar Gedanken zu meinem Anwendungsfall gemacht und ich frage mich jetzt, wie ich den ICP am besten nutze. Der Sensor hat ja 2 Ausgänge. Sprich X und Y, die beide angeschlossen werden müssen. Die Frage ist jetzt, was ich an den ICP anschließe, wenn ich X und Y an INT1 und INT2 oder wie auch immer anschließe.

    Im Grunde wäre es ja optimal, wenn man zwei ICP´s hätte. Eine andere möglichkeit wäre den ICP immer dann zu schalten, wenn ein Interruptereignis ausgelöst wird, sprich beide Ereignisse vereint auf den ICP zu führen, wenn ihr versteht was ich meine . Aber dann wäre es wahrscheinlich sogar schneller nur die Interrupts zu nehmen und direkt die Zeit aus dem Timer auszulesen. Der ICP ist doch nur so, dass er bei der ausgewählten Flanke automatisch den Zähler ins Register schreibt oder?

    Wäre nett wenn mir mal jemand einen gedanklichen Anstoß geben könnte, wie man das am Besten löst.

    Gruß Lee

  5. #15
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Man kann die ICP Funktion nicht nur über den ICP Pin nutzen. Man kann auch den analogen Komperator nutzen, um die selbe Funktion auszulösen. Insbesondere der Pin AIN1 = PB3 beim Mega32 ist dazu gut geeigent. Die andere Komperator Seite läßt sich softwaremäßig auf 1.2 V setzen. Damit könnte man im Wesel die beiden Kanäle messen.

    Der unterschied zu normalen Interrupteingängen und dem Auslesen des Timer standes ist auch nur gering. Man kreigt mit der ICP funktion etwa mehr Genauigkeit, denn es kann etwas dauern bis der Interrupt tatsächlich ausgelöst wird. Das wird vor allem dann interessant wenn noch andere Interrupts auftreten können, denn die können einen Interrupt schon etwas länger aufhalten. Müßte man sehen wie hoch die nötige Auflösung ist und was sonst noch an Interrupts aktiv ist.

  6. #16
    Neuer Benutzer Öfters hier
    Registriert seit
    26.03.2009
    Beiträge
    22
    Öhm sorry aber: Versteh ich nicht.

    Also laut Datenblatt des Sensors dauert ein Zyklus entweder 2,5ms oder 10ms, hab leider kein Oszilloskop, sonst würd ich mir das mal angucken. Innerhalb dieses Zeitraumes fällt die Flanke dann irgendwann wieder ab, je nach der Position des Sensors. Sprich man muss bei der aufsteigenden Flanke anfangen zu messen, bei der fallenden die Zeitdifferenz aufnehmen, bei der nächsten steigenen die Zeit des kompletten Zyklusses aufnehmen und den Timer wieder zurücksetzen. Wenn man dann jetzt die Werte ins Verhältnis setzt (Fallende Flanke/kompletter Zyklus) bekommt man einen Wert zwischen 0 und 1 der einem Auskunft über die Erdbeschleunigung gibt. Soviel zur Theorie. Jetzt ist nur die Frage, wie genau das mit den Interrupts ist. Und dann wäre noch das Problem das es das ganze noch einmal gibt. Man müsste also praktisch noch die fallende Flanke des zweiten Ausgangs aufnehmen, da die steigenden Flanken von X und Y parallel sind.

    Und es wäre echt mal cool, wenn ihr mir ne Antwort gebt die ich auch verstehe :-D . Denn ich hab vor dem RP6 noch nie was in C gemacht und ich hab eigentlich keine Ahnung von den Interrupts. Bin halt nur so weit, dass ich den Beispielcode halbwegs versteh.

    Gruß Lee

  7. #17
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.236
    OK versuchen wir es mal ganz von vorne.

    Ein Interrupt ist ein Ereignis, das von einer externen oder internen Quelle des Microcontrollers ausgelöst wird und den normalen Programmablauf unterbricht.

    Der ATMEGA 32 hat eine ganze Menge von diesen Interruptquellen.
    Die für Dich interessanten dürfte der ICP Interrupt sowie der INT0 bzw. der INT1 und der Timer 1 Overflow Interrupt sein.

    Der Input Capture Interrupt ( ICP ) wird durch eine Zustandsänderung am ICP Pin ausgelöst. Ob das bei der steigenden oder fallenden Flanke an diesem Pin passiert ist Einstellbar.
    Der Vorteil des ICP ist, das der aktuelle Zählerstand des TCNT1 Registers in das Capture Register übernommen wird, sobald ein ICP Ereignis auftritt.
    Sprich die Funktion ist optimal zum messen von Zeiten geeignet.

    Der INT0 bzw. 1 wird auch durch zustandsänderungen am entsprechenden Input Pin ausgelöst.
    Will man ihn aber zur Zeitmessung nutzen muss der Timer TCNT1 per Software ausgelesen werden, wodurch es manchmal zu Problemen kommen kann - Überholeffekte in der Überlaufvariable des Timers 1.

    Nun kommt es noch auf die maximal mögliche Periodendauer zwischen 2 Interrupts an. Ist diese Periodendauer so groß, das der maximale Zählerstand des Counters 1 ( 65535 ) überschritten wird, muß in der Timer 1 Overflow Routine eine weitere Variable hochgezählt werden, die dann das höherwertige Wort der Zeitmessung darstellt und in den ICP und INTx Routinen mit verarbeitet werden muß.
    Da der Zeitpunkt vom Auftreten des Interrupts bis zum Auslesen durch die Interruptroutine immer gleich ist ( wenn man das ganz an den Anfang der Interruptroutine setzt ) kriegt man auch mit INTx sehr genaue Werte.
    Die tatsächlichen Reaktionszeiten kann man wunderbar mit dem Simulator aus dem AVR Studio 4 ermitteln.
    Für optimalen Speed kann man die Interruptroutinen auch in Assembler programmieren, wenn man das kann und mag.

    Die umstellung des Interrupt sensing macht man sinnvollerweise im entsprechenden Interrupt.
    Wurde der Interrupt durch eine steigende Flanke ausgelöst wird in der gestarteten Interuptroutine auf fallende Flanke umgeschaltet.
    Die nun folgende Flanke deines Sensors wird also wieder diese Interruptroutine aufrufen, wo dann wieder auf "steigende Flanke" umgeswitched wird.

    Die Auswertung der ermittelten Zeiten lass ich immer in der Hauptroutine machen.
    Die entsprechede Interruptroutine ermittelt die Meßwerte, speichert diese in einer Variable ab und setzt ein Flag ( Bit Variable ).
    Die Hauptroutine fragt dieses Flag ab, wenn es gesetzt ist wird des wieder zurückgesetzt und die Berechnungsroutine / Displayanzeige oder was auch immer ausgeführt.
    So kriegt man schlanke Interruptroutinen und ein nachvollziehbares Programm.

  8. #18
    Neuer Benutzer Öfters hier
    Registriert seit
    26.03.2009
    Beiträge
    22
    Das ist mal eine schöne Antwort \/. Ich werde das mal so Umsetzen und gucken wie genau es wird. Da ich die ICP Variante mit zwei Sensor-Ausgängen nicht wirklich nutzen kann, bzw. nicht weiß wie, hoffe ich das das mit den 2 Interrupts auch recht genau ist.

    Wie gesagt, schöne Antwort! Danke dir!

    Wenn ich das Testprogramm fertig hab werd ich euch mal ein Äuglein drüber werfen lassen.

    Gruß Lee

  9. #19
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.236
    Da ich die ICP Variante mit zwei Sensor-Ausgängen nicht wirklich nutzen kann, bzw. nicht weiß wie, hoffe ich das das mit den 2 Interrupts auch recht genau ist.
    Du kannst die ICP Variante auf jeden Fall schon mal für einen Ausgang nutzen.
    Der Unterschied zu einem normalen INTx ist, das der Wert, den das TCNT1 Register zum Zeitpunkt des Interrupts hatte im ICR1 Register abgespeichert wird.
    Du kannst Dir dann in der dazugehörigen Interruptroutine den Wert von dort abholen ( auslesen ).

  10. #20
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Die größte Unsicherheit die man bei der verwendung des externen interrupts erwarten kann, ist wenn ein anderer Interrupt dazwischen kommt. Für einen kurze ISR routine sollten da ein paar µS, sein. Das sollte gegen die 2,5 ms in der Regel zu vernachlässigen sein. Vor allem tritt dieser Fehler nur eher selten auf. Ein bischen aufpassen müßte man nur ob da für andere Programmteile noch Interrupts aktiv sind, die eventuell länger brauchen.
    Wenn einem das zu ungenau ist müßte man den analog Comperator als Alternativen ICP-eingang nutzen und die Messungen der beiden Kanäle nacheinander machen. Man kann den analog Comperator auch ähnlich dem externen Interrupt nutzen und legt sich also durch die Wahl des Pins noch nicht auf eine Softwarevariante fest.

    Solange die einzelen Zeitdifferenzen nicht größer als 65000 Timer Takte sind, muß man sich um die Überläufe noch nicht extra kümmern. Das vereinfacht das Programm schon um einiges und man braucht den timer Overflow interrupt nicht.

    Wenn man den Prescaler für den Timer richtig wählt, sollte man ohne den Überlauf auskommen. Für 2,5 ms Periode dürfte der Timer noch mit 20 MHz laufen, ist also gar kein Problem. Für 10 ms Periode dürfte der Timer mit höchstens 6,5 MHz laufen, man wird da wohl den Timertakt niedriger als den vollen Systemtakt wählen müssen.

Seite 2 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test