Moba-Tools Frage zum Stepper_Slider beispiel

Hallo Microbahner, Hallo agmue,

ich habe mir die Schrittmotor-Beispiele der Moba-Tools angeschaut. Da gibt es einige Zeilen die ich nicht verstehe:

void loop() {
  enum {ENDPOSITION, STARTPOSITION, BEWEGUNG};
  static byte status;               // Schrittkettenstatus
  static bool alt = digitalRead(weiterPin), akt = digitalRead(weiterPin);
  alt = akt;
  akt = digitalRead(weiterPin);

Den zwei Variablen alt und akt wird der Zustand von Pin "weiterpin" zugewiesen
Dann wird alt = akt gesetzt
dann wird noch einmal akt neu eingelesen

dann gibt es eine Abfrage auf

      } else if (alt && !akt) {

Da würde ich sagen das kann doch gar nicht funktionieren weil "alt" und "akt" den gleichen Wert haben müssten.
Dann kann doch true && !true bzw. false und !false niemals true ergeben.

Jedenfalls nicht zuverlässig weil ja genau passend wenn in akt noch einmal der Schaltzustand von "weiterpin" eingelesen wird sich der Schaltzustand von "weiterpin" geändert haben müsste.

Aber vielleicht habe ich auch gerade "unlogische" Tomaten auf den Augen. Kann die Tomaten mal bitte jemand abnehmen ich finde den "Lösehebel" nicht ;-)))

Edit hier der komplette code

/*  Demo zum Anschluß eines unipolaren Stepmotors 28BYJ-48
    mit Verwendung einer Beschleunigungsrampe
    Slider-Minimalprogramm: Endposition - Startposition - Bewegung von Start- zu Endposition
    Danke an 'agmue' vom arduino.cc Forum für dieses Beispiel
*/

#include <MobaTools.h>
MoToStepper Step1(4096);           // HALFSTEP ist default
const byte linksPin = 8, rechtsPin = 9, weiterPin = 10;

void setup() {
  Serial.begin(9600);
  Serial.println("Anfang");
  pinMode(linksPin, INPUT_PULLUP);   // aktiv LOW
  pinMode(rechtsPin, INPUT_PULLUP);  // aktiv LOW
  pinMode(weiterPin, INPUT_PULLUP);  // aktiv LOW
  Step1.attach( 4, 5, 6, 7 ); // Anschluß an digitalen Ausgängen; Treiber IN1,IN2,IN3,IN4
  Step1.setSpeed( 60 );       // = 6 U/Min
}

void loop() {
  enum {ENDPOSITION, STARTPOSITION, BEWEGUNG};
  static byte status;               // Schrittkettenstatus
  static bool alt = digitalRead(weiterPin), akt = digitalRead(weiterPin);
  alt = akt;
  akt = digitalRead(weiterPin);
  if (alt != akt) {
    delay(30);                // einfaches Entprellen
  }

  switch (status) {
    case ENDPOSITION:
      if (!digitalRead(linksPin)) {
        Step1.doSteps(10);
      } else if (!digitalRead(rechtsPin)) {
        Step1.doSteps(-10);
      } else if (alt && !akt) {
        Step1.setZero();              // Endpunkt für Motor 1 setzen
        Serial.println("STARTPOSITION");
        status++;
      } else {
        Step1.stop();
      }
      break;
    case STARTPOSITION:
      if (!digitalRead(linksPin)) {
        Step1.doSteps(10);
      } else if (!digitalRead(rechtsPin)) {
        Step1.doSteps(-10);
      } else if (alt && !akt) {
        Step1.setSpeed( 240 );          // = 24 U/Min
        Step1.setRampLen(500);          // Beschleunigung
        Step1.write(0);                 // Bewegung zu Endpunkt
        Serial.println("BEWEGUNG");
        status++;
      } else {
        Step1.stop();
      }
      break;
    case BEWEGUNG:
      if ( !Step1.moving() ) {          // warten bis die Bewegung abgeschlossen ist
        Step1.setSpeed( 60 );           // = 6 U/Min
        Step1.setRampLen(0);            // Beschleunigung
        Serial.println("ENDPOSITION");
        status = 0;
      }
      break;
    default:
      status = 0;
  }
}

viele Grüße Stefan

Hallo Stefan,
das was hinter dem 'static' steht, wird nur einmalig beim Initiieren gemacht.
Nur die folgenden 2 Zeilen werden bei jedem Durchlauf ausgeführt. Danach hat 'alt' den Pinzustand vom vorherigen Durchlauf, und 'akt' den derzeitigen Zustand. Das kann sich also durchaus unterscheiden.

MicroBahner:
Hallo Stefan,
das was hinter dem 'static' steht, wird nur einmalig beim ersten Aufruf von loop gemacht.
Nur die folgenden 2 Zeilen werden bei jedem Durchlauf ausgeführt. Danach hat 'alt' den Pinzustand vom vorherigen Durchlauf, und 'akt' den derzeitigen Zustand. Das kann sich also durchaus unterscheiden.

Aha ! Ich Danke dir für's "Tomaten abnehmen" ;-))
viele Grüße Stefan

Wenn ich es mir das so anschaue, dann bin ich nicht so ganz glücklich, denn status sollte auch einen Startwert bekommen, während der Startwert von alt und akt eigentlich egal ist, da er ja gleich wieder überschrieben wird. Eventuell also so:

void loop() {
  enum {ENDPOSITION, STARTPOSITION, BEWEGUNG};
  static byte status = ENDPOSITION;               // Schrittkettenstatus
  static bool alt = false, akt = false;
  alt = akt;
  akt = digitalRead(weiterPin);

Fändest Du das verständlicher?