mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik TASTER


Autor: Kay B. (newbie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HALLO,
habe hier ein kleines beispiel, mit einem mega8515 mit 2tastern.
taster1 ledon taster2 ledoff.
 bis jetz geht das programm soweit wenn ich taster1 gerdrückt halte 
ledon geht an, wenn ich ihn loslasse geht sie wieder aus.

ich wollte gern das wenn ich taster1 kurz drücke ledon(led geht an) und 
taster2 kurz drücke ledoff(led geht aus ) wie kann ich das 
bemerkstelligen.
hoffe das mir einer weiter helfen kann.

danke


.INCLUDE "M8515def.inc"
.LIST
.def   TEMP  = r16

.cseg
.org  0x0000





start:
 ldi TEMP,low(ramend)         ;Stackpointer initialisieren
 out SPL,TEMP
 ldi TEMP,high(ramend)
 out SPH,TEMP

ldi r17, 0b00001010
out DDRD, r17


ldi r17, 0b00000101
out PORTD, r17

rjmp main



main:
sbic PINB, 0        ;überspringe nächsten Befehl, falls Taster1 gedrückt

rcall LEDoff        ;springe Unterprogramm an

sbis PINB, 0        ;überspringe nächsten Befehl, falls Taster1 nicht 
gedrückt

rcall LEDon        ;springe Unterprogramm an


rjmp main          ;endlosschleife


LEDoff:
cbi PORTB, 1        ;Lösche Bit 1 im PORT B
ret

LEDon:
sbi PORTB, 1        ;Setze Bit 1 im PORT B
ret

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
in deiner initialisierung behandelst Du portD, später nutzt Du aber 
portB, soll das so sein?

Autor: Kay B. (newbie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo martin
nein war ein kleiner fehler,

ldi r17, 0b00001010
out DDRB, r17


ldi r17, 0b00000101
out PORTB, r17

Autor: jack (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo wird denn in Deinem Programm Taster2 ausgewertet?

Autor: Martin Schneider (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiß leider nicht, wo Taster 2 angeschlossen ist.
Ansonsten ginge es prinzipiell so:

main:
sbis PINB, 2        ;überspringe nächsten Befehl, falls Taster2 nicht 
gedrückt

rcall LEDoff        ;springe Unterprogramm an

sbis PINB, 0        ;überspringe nächsten Befehl, falls Taster1 nicht
gedrückt

rcall LEDon        ;springe Unterprogramm an


rjmp main


Alternativ könntest u auch die "bulletproof" Routine von Peter Danegger
nutzen - in den Forenbeiträgen dazu ist auch die Erkennung kurzer
und langer Tastendrücke beschrieben.

@Peter: wirklich gut, ich hatte kaum Mühe, die Routine auf einem
S1200 umzusetzen: zwei Tasten zum Ein-/Ausschalten, parametrieren und
stellen für eine Heizgriffsteuerung am Motorrad reichen damit.

Ahoi, Martin

Autor: Kay B. (newbie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
oh noch ein kleiner fehler

sbis PINB, 2        ;überspringe nächsten Befehl, falls Taster2 nicht
gedrückt

so sollte es doch sein

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau mal hier:
  sbic PINB, 0        ;überspringe nächsten Befehl, falls Taster1 gedrückt
  rcall LEDoff        ;springe Unterprogramm an

  sbis PINB, 0        ;überspringe nächsten Befehl, falls Taster1 nicht
gedrückt
  rcall LEDon        ;springe Unterprogramm an

  rjmp main          ;endlosschleife

Mir geht es um den sbic
Da steht explizit, dass der Aufruf von LEDoff
gemacht wird, wenn Taster1 nicht gedrückt ist. Der Taster
wird aber die meiste Zeit nicht gedrückt sein, also wird
jedesmal LEDoff aufgerufen.
Wenn du den anderen Taster2 drückst, wird LEDon aufgerufen.
Die Led wird eingeschaltet und das Programm geht in den
nächsten Schleifendurchlauf. Da aber Taster1 nicht gedrückt
ist wird gleich wieder LEDoff aufgerufen und die LED wird
wieder ausgeschaltet. Taster2 ist immer noch gedrückt und
die LED wird gleich wieder eingeschaltet.

Was du also siehst:

> bis jetz geht das programm soweit wenn ich taster1 gerdrückt
> halte ledon geht an, wenn ich ihn loslasse geht sie wieder aus.

ist gar nicht das, was wirklich passiert. Wenn du Taster2 drückst
dann blinkt die LED in Wirklichkeit. Nur tut sie das so schnell
dass du es nicht siehst. Erst dann wenn du den Taster loslässt,
hört das Blinzeln wieder auf, weil niemand mehr die LED einschaltet.
Wohl wird sie immer wieder ausgeschaltet. Aber eine LED die schon
aus ist, ändert nichts wenn man sie wieder und wieder ausschaltet.

Kannst ja mal folgendes probieren.
Drück den einen Taster: Die LED 'geht an'
Lass ihn wieder los: Die LED 'geht aus'
Jetzt drückst du noch mal denselben Taster: Die LED 'geht wieder an'.
Allerdings drückst du jetzt den anderen Taster, sodass jetzt beide
Taster gedrückt sind: Die LED brennt weiter. Eventuell wird sie
ein bischen heller.
Jetzt lässt du den zuerst gedrückten Taster los: Die Led brennt
weiter in voller Leuchtkraft.
Erst wenn du den 2-ten Taster loslässt geht sie wieder aus.




Autor: Kay B. (newbie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HALLO KARL,
ich wollte das gern so haben wenn ich kurz taster1 drücke led geht an,
und wenn ich taster2 kurz drücke das die led wieder ausgeht,
aber wie bewerkstellige ich das? bin in dieser sache noch anfänger,
danke

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nochmal:

Schau dir die beiden Abfragen an.
Prinzipiell sollten sie ja identisch sein.
In beiden Fällen lautet doch das Prinzip:

   wenn taster gedrückt
     mache Aktion

in deinem Fall (da Assembler) ist es allerdings eher:

   wenn taster nicht gedrückt überspringe die nächste Anweisung
     mache Aktion

Das ist für beide Taster auf Logikebene gleich.
Deine beiden Abfragen sind aber nicht gleich!
Der eine ist ein sbis, der andere ein sbic

Autor: Kay B. (newbie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HALLO KARL
danke nochmals für den denkanstoss
jetz gehts

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> danke nochmals für den denkanstoss

So solls sein.
Klar hätte ich damit auch schon vor 1 Stunde rausrücken
können, was ganz konkret zu ändern sei.
Du hättest das geändert -> funktioniert.

Aber, der Lerneffekt ist viel größer wenn du den letzten
Schritt selber machst und ich dir nur die Richtung zeige
in dies geht.


Autor: Kay B. (newbie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
manchmal dauerts etwas länger
danke nochmals

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.