Moin Männer und natürlich Frauen, ich habe wohl noch mal eine Anfängerfrage: Ich habe mein Programm so aktualisiert, dass ich mit einem Tasterdruck an PINC die LEDs an PORTD toggle. Du nun bei längerem Tasterdruck die LEDs dunkler leuchteten (weil immer getoggelt wurde), habe ich die Schleife switch_off_ eingebaut. Manchmal gehen die LEDs beim Drücken kurz aus und wieder an, bzw. umgekehrt. Woran kann das liegen? start: ; Stack-Pointer initialisieren ldi r16, HIGH(RAMEND) out SPH, r16 ldi r16, LOW(RAMEND) out SPL, r16 ; PORTC als Ausgang ldi r16, 0xFF out DDRC, r16 ldi r16, 0xFF out PORTC, r16 ; PÓRT D als Eingang ldi r16, 0x00 out DDRD, r16 ; Pull-Up aktivieren ldi r16, 0xFF out PORTD, r16 main: sbis PIND, 2 rcall switch_off rjmp main switch_off: mov r17, r16 in r16, PORTC com r16 out PORTC, r16 mov r16, r17 switch_off_: sbis PIND, 2 rjmp switch_off_ ret
Für den Fall das Du dieses Tutorial benutzt hat: https://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen würde ich empfehlen alle Punkte abzuarbeiten. Also unten auf der Seite immer wieder : Vor zu ... Damit werden fast alle nötigen Punkte abgearbeitet.
Es reicht, die Tasten in einem Timer-Interrupt nur alle 10-30ms abzufragen. Damit sind sie ohne Kopfstand entprellt. Die Erkennung des Zustandwechsels (Flankenerkennung) macht man üblicherweise mit einem Hilfsflag. Dabei wird der Tastenzustand und das Hilfsflag verglichen. Am Ende wird das Hilfsflag mit dem Tastenzustand wieder gleichgesetzt. Nur wenn sich beim Vergleich der Tastenzustand und der des Hilsflags unterscheiden, gab es eine Tastenaktion. Auf die wird dann reagiert. So wie du es gelöst hast ist es zwar für deine simple Anwendung möglich, aber du hängst während des gesamten Tastendrucks in einer Endlosschleife und kannst auf sonst nix reagieren. Gewöhne dir sowas erst garnicht an, das gilt als böses Foul beim programmieren.
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.