Was mir auffällt ist das du in der ISR schreibst "if (taster == r) ; {". Somit wird switch immer ausgeführt. Und warum prüfst du auf "r"? Du kannst einfach auf "1" oder "!0" prüfen.
MfG Hannes
Hallo Alex!
.. Werde mich dann mit dem Thema Tastenentprellung auseinandersetzen und diese dann implementieren ..Falsch gemacht? Du hattest davor geschrieben ".. auseinandersetzen .." danach ".. implementieren ..". Mir siehts umgekehrt aus: ".. implementieren .." danach ".. auseinandersetzen .."... besteht das Problem "ich blink wie ich will" immer noch. Was habe ich falsch gemacht? .. Ist das überhaupt der richtige Code .. ? ..
Beim schnellen Hinsehen fälllt mir auf, Du hast ISC00 und ISC01 gesetzt. Da kommt der Interrupt INT0 bei rising edge. Wie schaltet denn der Taster/Button? Gegen GND oder Vcc? Dass Du den INT0-Pinn (PD2) auf Ausgang setzt macht ja nix aus, denn das Datenblatt schreibt ja auch ".. even if the INT0, INT1 or PCINT17..0 pins are configured as outputs .."; es sieht für mich nur überraschend aus. Meine Taster gehen (fast) immer auf Eingänge mit PullUp und schalten gegen GND.
Ciao sagt der JoeamBerg
Was mir auffällt ist das du in der ISR schreibst "if (taster == r) ; {". Somit wird switch immer ausgeführt. Und warum prüfst du auf "r"? Du kannst einfach auf "1" oder "!0" prüfen.
MfG Hannes
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
Geändert von Searcher (01.01.2018 um 11:52 Uhr) Grund: Registername für ATtiny2313A berichtigt
Hoffentlich liegt das Ziel auch am Weg
..................................................................Der Weg zu einigen meiner Konstruktionen
HI zusammen und ein frohes neues Jahr,
Hab die ISC00 und ISC01 Bits nun auf fallende Flanke gesetzt. Das If (taster == r) wurde aus der ISR gelöscht. Des weitern habe ich den PullUp-Widerstand noch in meine Schaltung mit eingebaut.
Jetzt funktioniert alles prima.
@oberallgeier
Hab auf jeden Fall versucht es im voraus zu verstehen. Aber wie heißt es so schön learning by doing. Bin halt noch ganz am Anfang, was das programmieren von AVR's betrifft. Aber danke dir trotzdem für die Hilfreichen Tipps.
Danke euch allen für eure Hilfe.
LG
Alex
Lesezeichen