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
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.
> 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