Kann man einen Taster so programmieren, dass er bei jeder Betätigung
eine Zahl um 1 inkrementiert und diese dann auf dem LCD ausgibt?
Ich habe nur einen Weg gefunden mit dem ich vorprogrammierte Zahlen mit
Tastendruck ausgeben kann:
1
.equ c1=60000
2
3
ldi r24,HIGH(c1) ;Zählregister werden mit
4
ldi r25,LOW(c1) ;c1 geladen
5
...
6
num1:
7
sbic PINB,PB0 ;rjmp überspringen wenn Taste gedrückt
8
rjmp num1
9
rcall lcd_clear ;Lösche LCD-Inhalt
10
ldi temp1,01
11
rcall lcd_number ;Gebe Nummer auf dem LCD aus
12
13
wait1: ;Warteschleife damit der
14
sbiw r24,1 ;Taster nicht gleich
15
rjmp wait ;die anderen Zahlen aufruft
16
num2:
17
sbic PINB,PB0 ;rjmp überspringen wenn Taste gedrückt
18
rjmp num1
19
rcall lcd_clear ;Lösche LCD_Inhalt
20
ldi temp1,02
21
rcall lcd_number ;Gebe Nummer auf dem LCD aus
22
23
ldi r25,HIGH(c1) ;Zählregister werden mit
24
ldi r24,LOW(c1) ;c1 geladen
25
wait2:
26
sbiw r24,1 ;Warteschleife und so weiter
27
rjmp wait2
28
...
29
LCD_Routine aus dem Tutorial
Gibt es eine Möglichkeit in diesen Quellcode inc Befehle einzufügen und
ihn sozusagen etwas schöner zu gestalten? =)
Alex R. schrieb:> Gibt es eine Möglichkeit in diesen Quellcode inc Befehle einzufügen und> ihn sozusagen etwas schöner zu gestalten? =)
Sicher gibt es das.
Entscheide dich für ein Register (du hast ja noch genug), leg fest, dass
es die nächste auszugebende Zahl beiinhalten soll und nach der Erkennung
eines Tastendrucks erhöhst du dann das Register, ehe du dessen Inhalt
nach temp1 kopierst um den Wert auszugeben.
Ok tut mir leid ...ich depp hab vor dem rjmp num noch ein rjmp wait
drinne ^^
1
num:
2
ldi r25,HIGH(c1)
3
ldi r24,LOW(c1)
4
5
sbic PINB,PB0
6
rjmp num
7
rcall lcd_clear
8
inc zahl
9
mov temp1,zahl
10
rcall lcd_number
11
wait:
12
sbiw r24,1
13
rjmp num
so wenn ich jetzt kurz auf die Taste drücke inkrementiert er um 3, wenn
ich länger gedrückt halte entsprechend höher. Woran liegt das? Kann ich
das irgendwie verhindern? Hat es etwas mit dem Prellen zu tun?
Alex R. schrieb:> Wenn ich auf die Taste drücke wird um 1 erhöht und die Zahl erscheint> auch auf dem Display.Wenn ich sie jedoch nochmal drücke passiert> nichts.Wieso?
Wie stellst du dir vor, dass der µC jemals aus dieser Schleife
1
wait:
2
sbiw r24,1 ;Warteschleife
3
rjmp wait
heraus kommen soll? Der hängt da drinnen fest, subtrahiert fleissig 1
von r24/r25 und im übrigen schleift er und schleift und schleift und
....
Alex R. schrieb:> Hat es etwas mit dem Prellen zu tun?
Genau da liegt das Problem. Versuchs folgendermaßen:
Wenn Taste gedrückt ein paar µs Pause.
Dann in eine Schleife, welche erst verlassen wird, wenn die Taste
losgelassen wird.
Noch einmal ein paar µs warten.
Damit sollte es funktionieren.
Alex R. schrieb:> Ok tut mir leid ...ich depp hab vor dem rjmp num noch ein rjmp wait
:-)
> so wenn ich jetzt kurz auf die Taste drücke inkrementiert er um 3, wenn> ich länger gedrückt halte entsprechend höher. Woran liegt das?
Das liegt daran, dass die Ausgabe aufs LCD nicht schneller von statten
geht. Wenn die nicht da wäre, dann würde der µC das Register in einem
Tempo hochzählen, so was hast du noch nicht erlebt :-)
> Kann ich> das irgendwie verhindern? Hat es etwas mit dem Prellen zu tun?
Nein. Direkt hat es nichts damit zu tun.
Aber du liegst schon nicht ganz falsch.
Du bist an einem Punkt angelangt, an dem du merkst, dass diese
Warteschleifenmethoden immer mehr zum SChuss ins Knie werden.
Schau ins AVR-Tutorial Abschnitt "Tastenentprellen". Dort findest du
Möglichkeiten wie man Tastenabfragen richtig macht.