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
in deiner initialisierung behandelst Du portD, später nutzt Du aber portB, soll das so sein?
hallo martin nein war ein kleiner fehler, ldi r17, 0b00001010 out DDRB, r17 ldi r17, 0b00000101 out PORTB, r17
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
hallo, oh noch ein kleiner fehler sbis PINB, 2 ;überspringe nächsten Befehl, falls Taster2 nicht gedrückt so sollte es doch sein
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.
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
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
> 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.