Hallo Alex,
weil ich in Bascom programmiere, kann ich C nur recht grob verstehen. Die "taster" Routine scheint Sinn zu machen, wenn sie ständig aufgerufen wird. Du rufst sie aber nur in Deiner ISR auf. Sie ist auch für Taster ausgelegt, die nach LOW schalten.
Wie die anderen schon geschrieben haben sind dafür die ISC00 und ISC01 Bits noch nicht richtig eingestellt. Wenn die Bits dann auf fallende Flanke eingestellt sind, wird die ISR nur mit der fallenden Flanke aufgerufen und die "taster" routine kann die Zustände "Taster wird losgelassen" bzw "Taster losgelassen" nicht erreichen, da ja in dem Fall die ISR gar nicht aufgerufen wird. (Bitte ein Aufschrei wenn ich falsch liege )
Die "taster" Routine muß also ständig unabhängig vom Taster Interrupt zB durch einen eigenen Timer aufgerufen werden. Bedeutet aber auch gößere Änderungen im Programm.
Zum Testen Deiner main könntest Du Dein ursprüngliches Programm nehmen und zunächst auf eine unschöne aber einfache Entprellung zurückgreifen. Dazu ganz am Ende der ISR ein delay von 20ms einsetzen und danach noch das INTF0 Flag im GIFR durch Schreiben einer 1 auf das INTF0 löschen; Ende der ISR.
Dadurch wird die ISR bei Tasterbetätigung aufgerufen, das INTF0 automatisch gelöscht, Aktionen durchgeführt und dann 20ms lang abgewartet, ob noch Tastenpreller auftreten. Wenn welche aufgetreten sind und das ist zimlich sicher, steht das INTF0 wieder. Das wird jetzt noch manuell gelöscht!, damit nicht sofort nach Beendigung der ISR diese sofort wieder aufgerufen wird.
Bleibt der Finger auf der Taste oder wird sie losgelassen, tritt keine fallende Flanke auf und es passiert nichts weiter; nur eben dann wieder bei erneutem Tastendruck.
Der Nachteil ist, daß wie schon mal von 021aet04 erwähnt wurde, das delay das Programm für 20ms aufhält und damit auch das 500ms Blinktiming während Tastendruck minimal verändern kann. Zum Testen würde ich das mal probieren und dann mich nochmal intensiv mit der Entprellung beschäftigen.
Gruß und ein Frohes Neues an alle
Searcher
Lesezeichen