Forum: Mikrocontroller und Digitale Elektronik Atmega8 lcd taster zahl inkrementieren asm


von Alex R. (s0urc3)


Lesenswert?

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? =)

von Karl H. (kbuchegg)


Lesenswert?

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.

von Alex R. (s0urc3)


Lesenswert?

Ok hört sich toll an. Danke für die Info, aber bei meiner Umsetzung ist 
irgendwie noch ein Fehler drin:
1
temp1= r16
2
zahl = r19
3
...
4
num:
5
    ldi r25,HIGH(c1)      ;Zählregister laden
6
    ldi r24,LOW(c1)
7
    
8
    sbic PINB,PB0         ;überspringe rjmp wenn Taste gedrückt
9
    rjmp num
10
    rcall lcd_clear       ;lösche LCD-Inhalt
11
    inc zahl              ;erhöhe Zahl um 1
12
    mov temp1,zahl        ;Zahl in temp1 packen und 
13
    rcall lcd_number      ;ausgeben
14
wait:
15
    sbiw r24,1            ;Warteschleife
16
    rjmp wait
17
    rjmp num              ;Springe zum Anfang
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?

von Alex R. (s0urc3)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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 
....

von entpreller (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Alex R. (s0urc3)


Lesenswert?

Jo danke Entpreller. Habs jetzt hinbekommen. Dankeschön :)

von Alex R. (s0urc3)


Lesenswert?

Danke für die Info Karl :)

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.