moin das problem hatte ich ja aschonmal leider funzt es immernoch nicht ! ichhabe nun eine variable in dem interrupt, der alle 20ms ausgeführt wird ist die variable bei 10 also 200ms soll er sie als KURZ erkennen und ist sie bei 200 (4 sekunden) soll er sie als lang erkennen ich hab mir überlegt das in dem INT. nur die VAR hochgezählt wird sofern das wahr wird: if (PIND == 254 || PIND == 253 || PIND == 251 || PIND == 247 || PIND == 239 || PIND == 223 || PIND == 191 || PIND == 127) aber ich verstehe das irgendwie nicht wie bzw wann man das loslassen auswerten kann ?!muss ich den aktuellen port in einer variable irgendwo zwischenspeichern und danach bei nächsten int mit dem aktuellen port vergleichen um eine veränderung(loslassen) festzustellen oder soll ich erstmal filtern WELCHER knopf gedrückt ist und dann mit IF_pin_is__Set abfragen ... und wo soll der counter wieder zurück gesetzt werden ? bis jetzt habe ich es so das ich in der main herausfinde was gedrückt ist und wielange ... undem ich eine caseanweisung mache: switch(taster1) { case 254: PORTB = 254; if (counter == 10) { lcd_clrscr(); lcd_puts("Position 1 saved"); delay(); delay(); delay(); delay(); taster1 = 0; counter = 0; } ich hoffe ihr könnt mir weiter helfen ! dankedafür schonmal ! gruß lordchen
Stimmt, du must Dir natürlich den vorherigen Zustand merken, um den Wechsel von Losgelassen nach Gedrückt und umgekehrt auszuwerten. In meinem Codebeispiel habe ich aber nur dan Wechsel zu Gedrückt ausgewertet. Ich habe auch nur einen Wiederhohlzähler für alle Tasten gemeinsam verwendet. D.h. wenn man eine Taste drückt, bevor man die andere losläßt, wird diese auch als lang gedrückt ausgewertet. Bei langem Druck, wird bei mir der gleiche Tastenkode wiederholt. Wenn man da ein anderes Register nimmt kann man aber auch einen anderen Kode erzeugen. Da ich den Wechsel zu Gedrückt auswerte, wird immer zuerst der Kode für kurz gedrückt ausgegeben und erst nach der Wartezeit auch der Kode für lang gedrückt (in meinem Beispiel ist beides dasselbe). Ich hoffe, jetzt kannst Du mein Beispiel besser verstehen. Du kannst es ja im Simulator ausprobieren. Peter
ne du danke für deine anwort aber ich verstehs nicht ... wie meinst du das ? wann muss ich den aktuellen portzustand denn abspeiichern ? und wie wird dieser im weiteren verlauf nochmal vergliachen ? gruß lordchen
Der alte entprellte Zustand aller 8 Tasten wird in "key_state" gespeichert. Der neue wird erstmal in "i" abgelegt. Dann wird die Flanke erkannt und das entsprechende Bit in "key_press" gesetzt, wo man es in der Main-Loop bequem testen und rücksetzen kann. Die Variablen "ct0" und "ct1" bilden 8 Stück 2-Bit-Zähler, d.h. Sie können bis 4 Zählen und dienen dem Entprellen. D.h. "key_state" übernimmt das Tastenbit erst, wenn es 4-mal hintereinander der entgegengesetzt Zustand war. Vielleicht solltest Du erstmal nur mit dem Entprellen anfangen, z.B.: http://www.mikrocontroller.net/attachment.php/20554/Get8key4.asm Das ist haargenau der C-Kode, aber ohne Repeat-Funktion und in AVR Assembler. Du kannst es bequem im Simulator laufen lassen, um die Funktion zu verstehen, bzw. direkt auf dem STK500. Dann kannst Du die Repeat-Funktion wieder anhängen. Aber da sind ja noch viele andere Entprellroutinen in der Codesammlung. Vielleicht nicht so kompakt, aber in der Funktionsweise ähnlich. Du darfst bloß keine Angst vor fremden Kode haben. Ist völlig normal, daß man da erst mal Bahnhof versteht. Einfach von oben anfangen, sich durchzuwusteln. Du kannst mir auch per E-Mail Fragen stellen. Peter
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.