LEDs toggeln nicht richtig

Gast #4428887
Lesenswert?
• ▲
▼
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
Gast #4428940
Lesenswert?
• ▲
▼
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.