TASTER

OP #442006
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
Gast #442018
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
#442022
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.



#442038
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
#442052
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.

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