LED per Taster an und ausschalten

Gast #1301503
Lesenswert?

Hallo zusammen,
ich möchte für meine mündliche Abiprüfung Thema 
Mikrocontroller/Assembler ein einfaches Assembler Programm schreiben, 
das bei einem Tastendruck eine LED anschaltet und bei einem erneuten 
Druck wieder ausschaltet.
Hierzu habe ich das folgende Programm geschrieben, was auch im AVR 
Siumlator funktioniert wie es soll:
1
.include "m8def.inc"
2

3
ldi r20, low (RAMEND)
4
out SPL, r20
5

6
ldi r20, high (RAMEND)
7
out SPH, r20
8

9
ldi r18, 0b01000000
10
out DDRD, r18
11

12
loop:  SBIC PIND, 2   ; Nächsten Befehl überspringen wenn Taster gedrückt
13
  rcall AnAus
14
  rjmp loop
15

16
AnAus:   in r20, PORTD  
17
  com r20        ; Alle Bits invertieren
18
  andi r20, 0b01000000  ; Alle Bits außer LED-Bit 0 setzen
19
  out PORTD, r20 ; Nach PORTD ausgeben
20
  ret

Leider brennt die LED nur während ich den Taster gedrückt halte, wenn 
ich loslasse geht sie wieder aus.

Hat einer von euch eine Idee woran es liegen könnte?

Entprellen kommt hier nicht in Frage, da das Programm möglichste einfach 
zu halten. Selbst wenn es wegen dem Prellen nicht funktioniert, würde 
die LED wenigstens manchmal anbleiben.

Vielen Dank Schonmal für eure Hilfe,

Gruß Philipp
Gast #1301516
Lesenswert?

Der Schalter prellt aber doch nicht immer so, dass die LED am Ende aus 
ist. Oder gibt es immer genau so viele Preller wie es benötigt, um das 
LED am Ende aus zu lassen?
Ich denke eher, dass es einen kleinen, unscheinbaren Programmierfehler 
gibt, den ich noch nicht sehe.
#1301749
Lesenswert?

> Leider brennt die LED nur während ich den Taster gedrückt halte, wenn
> ich loslasse geht sie wieder aus.
>
> Hat einer von euch eine Idee woran es liegen könnte?

Ja, genau so ist das ja auch programmiert.
Solange deine Taste gedrückt ist, wird ständig AnAus aufgerufen.

Was du übersiehst: Dein µC ist viel schneller als du dir vorstellst. So 
schnell kannst du deinen Taster gar nicht drücken und wieder loslassen, 
dass die loop-Schleife nicht viele tausend mal durchlaufen wird. Deine 
LED brennt in Wirklichkeit nicht durchgehend sondern blinkt rasend 
schnell.
#1301754
Lesenswert?

Du must nicht nur auf das druecken der Taste warten sondern auch auf das 
loslassen der Taste. Sonst wird wie Karl heinz schon geschrieben hatte 
deine schleife rasend schnell durchlaufen. Also teste am ende von AnAus 
ob der Taster losgelassen wurde. Wenn nicht must du darauf warten.

Gruss Helmi
Gast #1301847
Lesenswert?

Vielen Dank,
das was die Zündende Idee. Dass ich da nicht selbst drauf gekommen bin 
:-)
Hab jetzt mein Programm ein ganz klein wenig wie folgt verändert:
1
.include "m8def.inc"
2

3
ldi r20, low (RAMEND)
4
out SPL, r20
5

6
ldi r20, high (RAMEND)
7
out SPH, r20
8

9
ldi r18, 0b01000000
10
out DDRD, r18
11

12
loop:  SBIC PIND, 2
13
    rcall AnAus
14
    rjmp loop
15

16
AnAus:   SBIC PIND, 2
17
    rjmp AnAus
18
    in r20, PORTD
19
    com r20
20
    andi r20, 0b01000000
21
    out PORTD, r20
22
    ret

Das Programm funktinoiert jetzt wunderbar, dank Euch.

großes Lob

gruß Philipp

P.S.: Hinzugefügt habe ich die ersten beiden Zeilen nach AnAus
#4606867
Lesenswert?

Um einigermassen sauber zu entprellen muss Du auf den ersten Kontakt des 
Tasters reagieren (LED umschalteb, z.b mit NOT-Befehl) und dann alle 
weiteren Abfragen über eine definierte Zeit (ausprobieren, hängt auch 
vom Tastertyp ab, aber so 30-50ms wären bei Handbetätigung keine 
Problem) von weitereb Abfragen ausschliessen. Dann kann es Dir egal sein 
ob der nach dem Druck noch rumprellt oder nicht...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren