Timer fragen

Grüß euch.

Ich hab da ein, zwei Fragen bezüglich der Timer eines arduinos, bzw spezifisch des Nanos.

Prinzipiell mal: es geht um ein Programm welches mit Wire.h zwei VL53L0X Abstandsensoren einliest, und anhand der Werte dann einen Servo und einen Esc mit Servo.h ansteuert.
Funktioniert auch so alles.

Meine Frage bezieht sich jetzt auf die verwendeten Timer, und ob mein Wissen bis jetzt mal richtig ist.

So wie ich das bis jetzt herausgefunden habe (Timer Interrupt :: Meine Arduino-Projekte) verwendet jede Funktion hier ihren eigenen Timer.

8 Bit Timer0: Verwendung für Funktionen millis(), micros(), delay() und für PWM bei Pin D5 und D6
16 Bit Timer1: Verwendung z.B. für der Servo-, VirtualWire- und TimerOne-Library und für PWM bei Pin D9 und D10
8 Bit Timer2: Verwendung für Funktion tone() und für PWM bei Pin D3 und D11

Servo.h verwendet demnach Timer1. Anscheinend kann man beliebig viele Servos mit der Servo.h Lib ansprechen, deswegen schätze ich mal, dass der Timer einfach rennt, und dann eine Flag(o.ä.) ausgegeben wird sobald der gewünschte Wert für einen Servo erreicht ist. viele servos, viele Flags.
Wenn man nur einmal ein servo.write() aufruft, bewegt sich der Servo und bleibt dann in der Position stehen, auch wenn danach ein delay() kommt. Demnach läuft der Timer im Hintergrund weiter und sendet weiter seine Flags, weil ein Servo braucht doch durchgehend seinen 20ms Puls, richtig?
Würde nur einmal die Servoposition/Pulsweite ausgegeben werden, dann würde der Servo ja nur hinfahren versuchen, und danach lose sein.

Ich hab jetzt noch nicht genau herausfinden können welchen Timer Wire.h verwendet, jedoch habe ich mehrfach gelesen, dass dies auch Timer 1 sein müsste.
Dieser wird jetzt aber bekanntlich von Servo.h für (mehrere) Servos verwendet. Ist der Timer deswegen nicht verfügbar für andere Funktionen, welche auf den selben Timer zugreifen? Oder kann ein Timer gut für mehrer Funktionen verwendet werden?

Ich glaube auch zu wissen, dass wenn man einen Timer auf Registerebene selbst verändert, er für die angegebenen Funktionen nicht mehr zur verfügung steht.
Möchte ich nun zB Servo.h und micros() verwenden, brauch aber auch einen Timer für irgendwas spezifisches, dann kann ich nur Timer2 hierfür verwenden.

In conclusion würde das für mich bedeuten dass Timer einen bestimmten Wert erhalten(prescaler, maxwert, startwert,..), entweder durch mich oder Standard libs/funktionen, und dieser Timer dann für verschiedene Funktionen verwendet werden kann. Ungefähr Richtig?

franzgustavdreht:
8 Bit Timer0: Verwendung für Funktionen millis(), micros(), delay() und für PWM bei Pin D5 und D6
16 Bit Timer1: Verwendung z.B. für der Servo-, VirtualWire- und TimerOne-Library und für PWM bei Pin D9 und D10
8 Bit Timer2: Verwendung für Funktion tone() und für PWM bei Pin D3 und D11

Diese Liste ist soweit richtig.

franzgustavdreht:
Anscheinend kann man beliebig viele Servos mit der Servo.h Lib ansprechen,

Nein, die Zahl pro Timer ist schon begrenzt ( auf 12 wenn ich mich recht erinnere ). Allerdings kann die servo.h mehrere Timer verwenden ( wenn vorhanden, z.B. auf dem Mega ).

franzgustavdreht:
Ich hab jetzt noch nicht genau herausfinden können welchen Timer Wire.h

I2C hat eine eigene spezifische HW. Ich wüsste nicht, das da noch ein Timer benötigt wird.

franzgustavdreht:
Oder kann ein Timer gut für mehrer Funktionen verwendet werden?

Im Prinzip ja, aber dann muss die Software das entsprechend verwalten. Zwei unabhängig voneinander geschriebene Lib's die den selben Timer verwenden kommen sich in die Quere, das funktioniert nicht. Meine MobaTools nutzen den Timer1 z.B. für die Ansteuerung von Servos, Steppern und das weiche Auf- und Abblenden von Led's ( alles kann parallel genutzt werden ). Aber das muss dann eben innerhalb der Software entsprechend realisert werden, dass sich das nicht in die Quere kommt.

MicroBahner:
Diese Liste ist soweit richtig.
Nein, die Zahl pro Timer ist schon begrenzt ( auf 12 wenn ich mich recht erinnere ). Allerdings kann die servo.h mehrere Timer verwenden ( wenn vorhanden, z.B. auf dem Mega ).

Okay, 12 kommt der Anzahl welche ich mir realistisch als beliebig vorgestellt habe schon sehr nahe.
Was sagst du dazu dass die Servos im Hintergrund ihre Position halten?

franzgustavdreht:
...Wenn man nur einmal ein servo.write() aufruft, bewegt sich der Servo und bleibt dann in der Position stehen, auch wenn danach ein delay() kommt. Demnach läuft der Timer im Hintergrund weiter und sendet weiter seine Flags, weil ein Servo braucht doch durchgehend seinen 20ms Puls, richtig?
Würde nur einmal die Servoposition/Pulsweite ausgegeben werden, dann würde der Servo ja nur hinfahren versuchen, und danach lose sein.

MicroBahner:
I2C hat eine eigene spezifische HW. Ich wüsste nicht, das da noch ein Timer benötigt wird.

Würde dass dann bedeuten dass Abfragen/Befehle, welche über wire.h durchgeführt werden, nicht stören sollten, wenn mein Programm zB alle verfügbaren (0,1,2) Timer verwendet oder ich sie selbst beschreibe?
Also... ~Ich kann zB Timer1 mit MobaTools reservieren, die anderen beiden für irgendwas anderes benutzen und werd am ende nicht von wire.h eingeschränkt?
~Wire.h ist "unabhängig" von anderen Arduino funktionen?

MicroBahner:
Meine MobaTools nutzen den Timer1 z.B. für die Ansteuerung von Servos, Steppern und das weiche Auf- und Abblenden von Led's ( alles kann parallel genutzt werden ). Aber das muss dann eben innerhalb der Software entsprechend realisert werden, dass sich das nicht in die Quere kommt.

MobaTools ist eine Library von dir?
Richtig angewendet läuft also praktisch Timer1 durchgehend und gibt dann zu den richtigen Zeitpunkten Anweisung an die Pins für HIGH oder LOW?
Timer 1 ist jetzt also auch von MobaTools reserviert?

Ich hab jetzt noch nicht genau herausfinden können welchen Timer Wire.h verwendet, jedoch habe ich mehrfach gelesen, dass dies auch Timer 1 sein müsste.

Falsch!

Eigentlich verwendet Wire keinen Timer!

Mittlerweile kennt Wire allerdings auch einen Timeout.
Diese Funktionalität verwendet micros(), also indirekt Timer0

Ich glaube auch zu wissen, dass wenn man einen Timer auf Registerebene selbst verändert, er für die angegebenen Funktionen nicht mehr zur verfügung steht.

Vorsichtshalber sage ich ja, das stimmt.

Aber andererseits verwende ich gerne Timer0 für Asynchrone Taster oder Encoder abfragen.
Das macht dann mal einen Jitter bei den Zeiten zwischen den Abfragen, wenn man die PWM von Timer0 verstellt, aber damit muss man dann leben.

Es gibt also wohl ein nebeneinander.
Oder eine Mehrfachverwendung eines Timers führ mehrere Zwecke.

In meinem Beispiel:

  1. Timer0 für millis(), micros() …
  2. Timer0 für PWM
  3. Timer0 für Drehencoder abfragen
    Alles gleichzeitig.
    Also eine Dreifachbelegung.