Hallo, ich versuche mich zum ersten Mal an Interrupts. Habe mit dem Datenblatt gearbeitet, komme aber nun nicht weiter. Der Interrupt soll bei einer steigenden Flanke an PB2 ausgelöst werden. Was habe ich vergessen!? Grüße Anne
> Was habe ich vergessen!?
V.a. das reti am Ende des Interrupt Handlers. Abgesehen davon ist
1 | ldi temp, 0b10000000 |
2 | out SREG, temp |
unsinnig, da es das gleiche macht wie "sei" zwei Zeilen weiter. Und warum setzt Du das PUD-Bit? Was hängt denn an dem Pin überhaupt dran?
Hallo, es soll ein Taster an den PIN. Ich kann nicht mit reti arbeiten, weil der Attiny15 in dem Sinne keinen Stack hat. Grüße Anne
Habe es jetzt mal geändert...so geht es nun auch, nur das er bevor er in die Endlosschleife geht, das Interupt schon einmal ausführt und PB0 setzt, obwohl der Taster nocht nicht betätigt wurde. Grüße Anne
Der Tiny15 hat einen Hardware-Stack. Das macht aber keinen Unterschied. Ein Interrupt Handler muss trotzdem mit reti abgeschlossen werden. Das ist allerdings vermutlich nicht das Problem. Wie soll der Taster denn angeschlossen werden? Und Du schreibst, es soll ein Taster an den Pin. Was ist denn jetzt dran? Taster an externen Interrupts machen eigentlich wenig Sinn, weil sie zu stark prellen. Das dürfte allerdings zumindest in diesem Falle nicht zu einem Nichtfunktionieren führen.
Aha, war ich zu langsam. Aber trotzdem: Wie ist der Taster denn angeschlossen? Vom µC-Pin gegen Masse oder andersrum? Deshalb auch meine Frage oben, warum Du das PUD setzt. Wenn der Taster (wie es üblich ist) gegen Masse angeschlossen ist, macht es keinen Sinn, die Pull-Ups auszuschalten. Und alle Pull-Ups auszuschalten ist sowieso meist nicht sinnvoll. Es reicht normalerweise, den einzelnen Pull-Up des dazugehörigen Pins auszuschalten.
Momentan versuch ich es nur in der Software-Simulation... Es wird ein Taster angeschlossen gegen +5V und das Interrupt soll bei der High-Flanke auslösen und dann einen Wert um 1 erhöhen.
Hm aber ich dachte ich nutze Interrupts, weil dort das Taster-Prellen nicht stört, ansonten könnte ich es auch gleich ohne machen...
> Es wird ein Taster angeschlossen gegen +5V und das Interrupt soll bei > der High-Flanke auslösen und dann einen Wert um 1 erhöhen. Dann brauchst Du aber einen Pull-Down-Widerstand am Pin, um im nicht-gedrückten Zustand einen definierten Pegel zu haben. Und genau deshalb schließt man Taster i.d.R. gegen Masse an, damit man die im µC eingebauten Pull-Ups verwenden kann und keine externen Widerstände braucht. >Hm aber ich dachte ich nutze Interrupts, weil dort das Taster-Prellen >nicht stört, ansonten könnte ich es auch gleich ohne machen... Gerade da stören sie. Interrupt-Bearbeitung ist viel zu schnell für mechanische Kontakte. Ohne zusätzliche Maßnahmen tritt der Interrupt mehrmals hintereinander auf. Es macht auch keinen Sinn, auf Tastendrücke innerhalb von Mikrosekunden zu reagieren. Das Prellen liegt oft schon im Millisekunden-Bereich. Taster fragt man i.d.R. zyklisch alle paar zig Millisekunden ab. Dadurch erübrigt sich einerseits die Prell-Problematik und andererseits ist das für einen menschlichen Betätiger immer noch "Echtzeit", also verzögerungsfrei.
Hm, ok habe es jetzt so abgeändert und in der Simulation geht es auch. Aber wenn ich echt jetzt testen würde, würde meine Zahl dann durch das Taster-Prellen mehrfach erhöht werden...Also muss ich mir da jetzt nochmal Gedanken machen... Danke Dir auf jeden Fall, Du hast mir sehr geholfen! VG Anne
Überleg einfach mal, wie lange der µC braucht, um Deinen Interrupt Handler abzuarbeiten. Das sind etwas weniger als 10 µs (geschätzt, ich hab jetzt keine Lust, das genau nachzurechnen). Nach dem Rücksprung ist er sofort wieder bereit für den nächsten Interrupt. Und durch das Prellen ist es sehr wahrscheinlich, dass der Interrupt sofort wieder ausgelöst wird. Die Prellvorgänge liegen meist im Bereich unter 1 ms. Wenn man den oder die Taster jetzt nur noch alle paar zig ms abfragt, ist das kein Problem mehr, weil man nur bei jeder Abfrage schauen muss, ob sich der Zustand des Tasters gegenüber der letzten Abfrage geändert hat. Und kein Mensch schafft es, einen Taster so zu drücken, dass der Kontakt weniger als einige 10 ms geschlossen ist...
Hallo, ich habe es nun so versucht, aber das Prellen des Tasters beeinflusst immer noch. Weiteres Problem, der Reset Pin ist zwar als Ausgang definiert, aber die angeschlossene LED leuchtet nie. VG Anne
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.