PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupt softwareseitig entprellen...



Murus
15.09.2005, 20:48
Hallo zusammen,

Ich steuer momentan ein Servo mit zwei Tastern an. Wenn man einen Taster drückt, dann macht er einen Schritt in die eine, mit dem anderen Taster macht er einen Schritt in die andere Richtung.
Nur: der macht bei einem Tastendruck z.T. gleich mehrere Schritte in die eine Richtung. Man kann zählen. Er soll 20 Schritte machen (also 20mal drücken. Nur: Er ist schon z.T. schon nach 15 Schritten am Anschlag. Der Taster prellt.

Ich mach das ganze so:
In der Do-loop-Hauptschleife wird das Servo auf seiner Position gehalten:
do
servo(1)=A
loop

Dann wird über die zwei externen Interrupts INT0 und INT1, an denen die beiden Taster hängen, der Wert von A verändert. Wenn ich also eine Taste drücke==> nen Interrupt auslöse, ändert das Servo seine Position, was es auch brav macht. Nur prellen die Taster... Es werden z.T mehrere Interrupts nacheinander ausgelöst. Und für so etwas muss man doch interrupts nehmen, oder? Geht doch gar net anders, da er ja in der Hauptschleife das Servo beschäftigen muss...
Wie entprelle ich die Sache?
Mit Waitms in der Interrupt-Schleife?? Oder gibts da auch einen Debounce-Befehl? Wie anzuwenden, falls ja?

Herzliche Grüsse
Mario

Marco78
15.09.2005, 23:03
Der AVR durchläuft in der Sekunde (sehr) oft die Hauptschleife. Das sind ja max. 20 Takte. 8MHz=8000000 Takte pro Sekunde. Das ganze geteilt durch 20 (was großzügig gerechnet ist) ergibt wie oft pro Sek. die Schleife durchlaufen wird.
Wenn der AVR nur die Servos stellen soll und sonst nix und du die Taster in der Hauptschleife abfragst bis du bei max. 50 Takten. Möglich wäre es also. Wenn er nichts anderes machen soll.

Ich entprelle immer mit waitms. Ich glaube auch, das Debounce das nicht anders macht.
Irgendein Wert zwischen waitms 50 und waitms 200 wird da reichen. Das kannst du aber auch in der ISR machen.

Wenn der AVR nur die Servos stellen soll, würde ich alles in der Schleife machen und das waitms vor dem LOOP einfügen. Somit wird der Servo gestellt und dann erst neu abgefragt was passieren soll.
Ein waitms zwischen Taster abfragen und den stellen würde eine kleine Verzögerung auslösen, die ein dann evtl glauben lässt man hat nicht richtig gedrückt oder so. Zumindest wäre es nicht so schön.

Murus
16.09.2005, 09:40
Ok, wenn man es schon in der H-Schleife macht, kann man ja auch gleich Debounce nehmen. Habs jetzt so hingekriegt, danke!

Herzlichen Gruss
Mario