Forum: Mikrocontroller und Digitale Elektronik TASTER


von Kay B. (newbie)


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

von Martin (Gast)


Lesenswert?

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

von Kay B. (newbie)


Lesenswert?

hallo martin
nein war ein kleiner fehler,

ldi r17, 0b00001010
out DDRB, r17


ldi r17, 0b00000101
out PORTB, r17

von jack (Gast)


Lesenswert?

Wo wird denn in Deinem Programm Taster2 ausgewertet?

von Martin Schneider (Gast)


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

von Kay B. (newbie)


Lesenswert?

hallo,
oh noch ein kleiner fehler

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

so sollte es doch sein

von Karl heinz B. (kbucheg)


Lesenswert?

Schau mal hier:
1
  sbic PINB, 0        ;überspringe nächsten Befehl, falls Taster1 gedrückt
2
  rcall LEDoff        ;springe Unterprogramm an
3
4
  sbis PINB, 0        ;überspringe nächsten Befehl, falls Taster1 nicht
5
gedrückt
6
  rcall LEDon        ;springe Unterprogramm an
7
8
  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.




von Kay B. (newbie)


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

von Karl heinz B. (kbucheg)


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

von Kay B. (newbie)


Lesenswert?

HALLO KARL
danke nochmals für den denkanstoss
jetz gehts

von Karl heinz B. (kbucheg)


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.


von Kay B. (newbie)


Lesenswert?

manchmal dauerts etwas länger
danke nochmals

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.