www.mikrocontroller.net

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


Autor: Philipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
.include "m8def.inc"

ldi r20, low (RAMEND)
out SPL, r20

ldi r20, high (RAMEND)
out SPH, r20

ldi r18, 0b01000000
out DDRD, r18

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

AnAus:   in r20, PORTD  
  com r20        ; Alle Bits invertieren
  andi r20, 0b01000000  ; Alle Bits außer LED-Bit 0 setzen
  out PORTD, r20 ; Nach PORTD ausgeben
  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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Philipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: juppi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ganz einfach

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

Ist keine Entprellung ,ist einfach und funktioniert.

MfG

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Philipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
.include "m8def.inc"

ldi r20, low (RAMEND)
out SPL, r20

ldi r20, high (RAMEND)
out SPH, r20

ldi r18, 0b01000000
out DDRD, r18

loop:  SBIC PIND, 2
    rcall AnAus
    rjmp loop

AnAus:   SBIC PIND, 2
    rjmp AnAus
    in r20, PORTD
    com r20
    andi r20, 0b01000000
    out PORTD, r20
    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

Beitrag #4606151 wurde von einem Moderator gelöscht.
Autor: Günther (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Was sind hier jetzt die Ein und ausgänge?

Autor: Der Andere (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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.

Autor: Olli Z. (z80freak)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.