[erledigt] Interrupt/Servo.h-Frage

Nachtrag: Mit Tastern funktioniert soweit alles bestens. Die nächste Hürde ist die Erzeugung eines modulierten Pulses (ein 38 kHz-Signal, das alle halbe Sekunde für 1/10 Sekunden zwei IR-Sendedioden schaltet)

Hallo zusammen!

Ich möchte einen Servo interruptgesteuert bewegen. Etwa so:

  • Zu Beginn steht der Servo in Mittelstellung
  • Pin 2 bekommt Signal -> Servo geht auf Position 1 und nach 5 Sekunden wieder in Mittelstellung
  • Pin 3 bekommt Signal -> Servo geht auf Position 2 und nach 5 Sekunden wieder in Mittelstellung

Habe ich mit Problemen zu rechnen, wenn ich den servo.write()-Befehl in der ISR aufrufe? Werden irgendwelche Timer beeinflusst?

Die konkrete Schaltung besteht u. A. aus einem sehr kleinen und leichten Modellbau-Servo und zwei IR-Näherungssensoren (TSSP4P38 von Vishay, Produktseite hier). Der testweise benutzte Taster prellt ein bisschen – das dürfte bei den Sensoren ja wohl nicht der Fall sein, oder?

Wenn mir noch eine Frage einfällt ...

Gruß

Gregor

Warum mit Interrupts?

ElEspanol:
Warum mit Interrupts?

Weil ich das Verhalten des Servos unabhängig von allem Anderen machen möchte. Der soll in Mittelstellung bleiben, bis sich entweder links oder rechts etwas bewegt. Dann soll er in die entsprechende Richtung schwenken und nach ca. 5 Sekunden wieder in die Mitte zurück.

Nachtrag: Ob das Gewünschte funktioniert, probiere ich bislang halt „einfach so“ (mit Taster statt IR-Detektoren). Das funktioniert soweit prima.

Gruß

Gregor

Aber in der ISR möchtest du nur die Sensoren/ Testtaster abfragen, nicht den Servo drehen?

edit: doch, du willst den Servo drehen. Da würde ich Probleme erwarten, da ja die ISR so kurz wie möglich sein sollte. Und alle 20 ms ein uS ausgeben, geht ja auch über Interrupt. und Den innerhalb eines anderen aufzurufen, ich weiss nicht .....

ist aber eher nur so ein Bauchgefühl, mit Interupts hab ich jetzt nicht so die Erfahrung

Die Servo Lib arbeitet mit einem Timer Interrupt um das regelmäßig zu machen. In write() wird nur eine Variable gesetzt, die dann in der Timer ISR verwendet wird. Es wird auch beim atomaren Zugriff das SREG Register gesichert. Das ist also Interrupt-sicher.

Wenn du ganz sicher sein willst setzte in der ISR nur ein Flag und frage darauf in loop() ab

Hallo ElEspanol und Serenifly,

danke für die Hinweise.

Der Servo dreht momentan immerhin schon in eine der beiden Richtungen, wenn ich einen Taster drücke. Der prellt halt ein bisschen, was aber für den Moment egal ist.

Das mit dem servo.write() scheint demnach keine Probleme zu bereiten. Puh ...

Gruß

Gregor

wo machst du nun das servo.write ?

ElEspanol:
wo machst du nun das servo.write ?

In den ISRs. Bsp:

void ISR1()
{
 timerMem=millis();
 servo.write(Angle_2);
}

Gruß

Gregor