Hallo Bernd.
Es vereinfacht in vielen Fällen die Programmieraufgabe ungemein, wenn das Programm ein Nebeneinander von asynchronem Hauptprogramm und mit fester Frequenz aufgerufener Interruptroutine realisiert.
Der Controller prüft dann z.B. in festen Zeitabständen die Signale der Hardware, z.B. den Tastereingang und verdichtet diese Inputs zu Systemzuständen, z.B. 'Taste nicht gedrückt' oder 'Taste seit nn Millisekunden ununterbrochen gedrückt' oder noch weiter verdichtet zur Benutzereingabe 'Feinpositionierung' und 'Eilgang', jeweils abgeleitet aus nn.
Dazu wird bei jedem Durchlauf der ISR (Interrupt Service Routine) ein Zähler um eins erhöht, wenn die Taste gedrückt ist, oder aber ausgewertet und genullt, wenn sie nicht gedrückt ist. Zeiten <20 Millisekunden betrachtet man dann als Kontaktprellen, Werte größer xx als Feinpositionierung, größer yy als Eilgang; das alles passt i.d.R. locker in die ISR bei z.B. 1ms ISR-Zyklus und 4MHz Prozessortakt.
Auf diese Weise ist auch eine schnell reagierende Notabschaltung machbar, die selbst dann funktioniert, wenn das Hauptprogramm vielleicht gerade auf Daten von der seriellen Schnittstelle wartet, die langwierige Fütterung einer LCD-Anzeige abarbeitet oder gar in einer Endlosschleife hängt!
Die ISR kann auch gut die Erzeugung der Schrittmotorimpulse übernehmen. Feinpositionierung und Eilgang unterscheiden sich ja nur dadurch, dass ein 1ms-Interrupt (das ist mein Liebling) nur bei jedem 200sten oder jedem zweiten (Beispielwerte!) Aufruf einen Schrittmotorimpuls ausgibt. Dazu braucht es noch nicht mal ein Hauptprogramm.
Ist jetzt eine wenig klarer geworden, wie die Lösung aussehen kann? Wenn nicht, dann frag ruhig noch mal nach.
Gruß
Christian.
Lesezeichen