Schrittmotor auf Tastendruck anhalten

Servus zusammen,

ich bin an einem kleinen Projekt dran und komme leider nicht weiter.
Ich möchte mit einem Schrittmotor und einem Microtaster ein Referenzlauf realisieren.
Und zwar:
Der Schrittmotor soll von 0 bis 180° verfahren und bei auslösen des Microschalters (habe ich über ISR realisiert) soll der aktuelle Schritt gespeichert und auf 0 Grad zurück gefahren werden.

Das mit dem Schritt speichern habe hinbekommen, nur verfährt der Schrittmotor nach Tasterbetätigung noch bis 180 Grad bevor er zum Ursprung zurück fährt.

Bitte Sketch

void setup() {
   
   pinMode(interruptPin, INPUT_PULLUP);
   attachInterrupt(digitalPinToInterrupt(interruptPin), REFERENZ_ISR, LOW);
   SchalterHigh = 0;
   myservo.attach(6);                                                   // attaches the servo on pin 6 to the servo object
   myservo.write(180); 



void REFERENZ_ISR(){

  Position = pos;
  SchalterHigh = 1;
}

void loop() {
  Referenzlauf(); 
  ServoTest();
}

void ServoTest()
{   
    
    for (pos = StartPos; pos <= EndPos; pos += 1) {   
        myservo.write(180-pos);                         // 
       delay(20);     
    }
  }

void Referenzlauf(){
  if (SchalterHigh) {
    
        Serial.print("Gemessene Pos.: ");
        Serial.println(Position);
        EndPos1 = Position - 3;
        StartPos1 = EndPos1 - 70;
            if (StartPos1 > 180){
                StartPos1 = 0;
                }
        Serial.print("End Pos.: ");
        Serial.println(EndPos1);
        Serial.print("Start Pos.: ");
        Serial.println(StartPos1);                 
        SchalterHigh = 0;
        delay(100);
  }
  
}

Ich möchte also das Verfahren per ISR sofort stoppen und dann mit dem Rückfahren beginnen, falls es ein wenig kompliziert ausgedrückt war :wink:

Den GAAANNNZZZEEENNN Sketch, nicht nur Auszüge. Bei dazuinstallierten Bibliotheken auch Link auf dessen Quellen.
Hast Du nun einen Servo oder einen Stepper?

Beim Servo hilft nur: kleinen Schritt machen, Endschalter kontrollieren, nächsten Schritt, Endschalter kontrollieren usw.
Grüße Uwe

In der ISR sehe ich keinen Vorteil.

Aus einer for-Schleife kann man mittels return raus. Nicht schön, aber geht:

void ServoTest()
{
  if (SchalterHigh) {
    if (!digitalRead(interruptPin)) {
      SchalterHigh = 0;
    }
  } else {
    for (pos = StartPos; pos <= EndPos; pos += 1) {
      if (digitalRead(interruptPin)) {
        Position = 180 - pos;
        myservo.write(180 - StartPos);
        SchalterHigh = 1;
        Ausgabe = 1;
        return;
      }
      myservo.write(180 - pos);                     //
      delay(20);
    }
  }
}

Besser wäre es, die Schleife mittels loop und die Zeit mit millis() zu realisieren.