Forum: Mikrocontroller und Digitale Elektronik LED per Taster an und ausschalten


von Philipp (Gast)


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

von Matthias (Gast)


Lesenswert?

Entprellen über RC-Glied?
Hab keine Ahnung von Assembler aber den Status der LED in einem Bit 
speichern bzw. bei Tastendruck toggeln, oder das ganze mit dem 
entsprechenden Portpin machen.
Viel Erfolg.

von Steffen (Gast)


Lesenswert?

Ums Entprellen wirst du hier wahrscheinlich nicht rumkommen. Entweder 
per Software (was du ja wohl nicht möchtest) oder per Hardware.

Viele Grüße

von Philipp (Gast)


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.

von juppi (Gast)


Lesenswert?

Ganz einfach

Wenn Taster betätigt wurde  LED Änderung
Zeitschleife 10-50 mS.

Ist keine Entprellung ,ist einfach und funktioniert.

MfG

von Karl H. (kbuchegg)


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.

von Helmut L. (helmi1)


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

von Philipp (Gast)


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

von Günther (Gast)


Lesenswert?

Was sind hier jetzt die Ein und ausgänge?

von Der Andere (Gast)


Lesenswert?

Günther schrieb:
> Was sind hier jetzt die Ein und ausgänge?

Och nöö, man, der Junge hat inzwischen sein Informatikstudium schon 
versemmelt, so lange ist das her.
Lass die Threadleiche in Frieden ruhen.

von Olli Z. (z80freak)


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...

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
Noch kein Account? Hier anmelden.