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:
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
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.
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.
> 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.
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
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:
1
.include"m8def.inc"
2
3
ldir20,low(RAMEND)
4
outSPL,r20
5
6
ldir20,high(RAMEND)
7
outSPH,r20
8
9
ldir18,0b01000000
10
outDDRD,r18
11
12
loop:SBICPIND,2
13
rcallAnAus
14
rjmploop
15
16
AnAus:SBICPIND,2
17
rjmpAnAus
18
inr20,PORTD
19
comr20
20
andir20,0b01000000
21
outPORTD,r20
22
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
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.
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...