Schalterprellen erkennen und beseitigen

Was ist Schalterprellen?

Als Prellen wird ein mechanisch ausgelöster Störeffekt bei elektromechanischen Schaltern und Tastern bezeichnet: Statt des sofortigen elektrischen Kontaktes ruft die Betätigung des Schalters kurzzeitig ein mehrfaches Schließen und Öffnen des Kontakts hervor (Quelle: Wikipedia).

Um hier ein besseres Bild zu vermitteln: Es kommt beim Schließen (seltener bzw. weniger ausgeprägt auch beim Öffnen) eines Tasters/Schalters nicht zu einem exakten Wechsel von Aus auf Ein sondern im Abstand von einigen Mikro- bis Millisekunden zu mehreren „Mini“-Ein und „Mini“-Aus. Dieser Effekt hat (meist fast) nichts damit zu tun, WIE man auf den Taster/Schalter drückt!

Quelle: Wikipedia

Warum stört das Schalterprellen die (Addon-)Verarbeitung?

Für die meisten Anwendungen eines Tasters/Schalters hat das Schalterprellen keine Bedeutung, da sich damit weder für die Türklingel noch für den Lichtschalter ein Nachteil ergibt.

Erfolgt aber eine elektronische Signalverarbeitung, dann kann die empfindliche Elektronik einen einzigen Einschaltvorgang so interpretieren, als ob zwei- oder mehrmals eingeschaltet worden wäre.

Wie erkennt man, dass Schalterprellen auftritt?

Tritt Schalterprellen auf, dann wird bei Betätigung des Tasters/Schalters zunächst Chaos ausgelöst. Bereits wenige Millisekunden später registriert die USB-Box allerdings (mindestens) ein neuerliches Aus- und Einschalten, hervorgerufen durch das Schalterprellen! Ohne Gegenmaßnahmen würde nun das Rennen fortgesetzt, obwohl keiner der Fahrer den Taster/Schalter erneut betätigt hat.

Was kann man gegen Schalterprellen unternehmen?

Am einfachsten ist es, die Absicherung gegen Schalterprellen in das Addon zu integrieren. Die Möglichkeit ist, den Zeitpunkt der ersten Betätigung zu speichern und dann bei weiteren Betätigungen zu prüfen, wie viel Zeit inzwischen vergangen ist. Bei sehr kurzen Intervallen (z.B. < 1000 ms) zwischen zwei Ein- oder Aus-Ereignissen kann man davon ausgehen, dass es sich um Schalterprellen handelt.

Warum ist „cpsleep“ hier keine gute Idee?
Ein Abfangen mit „cpSleep“ wird übrigens nicht funktionieren, da dadurch das Ereignis, welches durch Schalterprellen ausgelöst wurde, nur verzögert - aber doch - abgearbeitet wird. Das gilt auch für eine Lösung mit „cpEnterCriticalSectionEvent“, da alle weiteren Events nur warten, bis der geschützte Bereich wieder frei ist.

Im folgenden Code Snippet wird geprueft, ob seit der letzten Betaetigung eines Fusstasters mindestens 5 s vergangen sind. Damit wird nicht nur das Schalterprellen, sondern auch eine versehentlich erfolgte, zweimalige Betätigung abgefangen.

{ Event: DigInputEvent }
{ Parameter: ...,Cockpit.Station=<EingangNummer>,... }
 
begin  
  ...
  // Dauer bestimmen, wie lange es her ist, dass dieser (!) Fusstaster zuletzt gedrueckt wurde
  Drueckabstand :=  cpGetSystemTimeMs() - cpGetFloatVar('FusstasterZeit' + IntToStr(Cockpit.Station)); 
 
  // Aktuelle Zeit der Betaetigung dieses Fusstasters für die naechste Abfrage speichern
  cpSetFloatVar('FusstasterZeit' + IntToStr(Cockpit.Station), cpGetSystemTimeMs());
 
  // Wurde der Fusstaster bereits vor laengerer Zeit betaetigt? Sonst Exit!
  IF Drueckabstand < 5000 THEN EXIT;
 
  // Weitere Verarbeitung sinnvoll, da weder Schalterprellen noch versehentliche Doppel-Betätigung vorliegt
  ...
end.

Anmerkung:
Grundlegende Kenntnisse der AddOn-Programmierung werden vorausgesetzt, d.h. die Definition der entsprechenden Variablen usw. wird hier nicht gesondert erklärt. Der angeführte Code ist ein Beispiel und in dieser Form daher nicht lauffähig.

 
cockpit-xp/chaos/chaos_mit_tastern/taster_schalter_prellen.txt · Zuletzt geändert: 2020/11/28 12:16 (Externe Bearbeitung)