mikrocontroller.net

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


Autor: Alex R. (s0urc3)
Datum:

Bewertung
0 lesenswert
nicht 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:
.equ c1=60000

      ldi r24,HIGH(c1)       ;Zählregister werden mit
      ldi r25,LOW(c1)        ;c1 geladen
...
num1:
      sbic PINB,PB0          ;rjmp überspringen wenn Taste gedrückt
      rjmp num1               
      rcall lcd_clear        ;Lösche LCD-Inhalt
      ldi temp1,01
      rcall lcd_number       ;Gebe Nummer auf dem LCD aus

wait1:                       ;Warteschleife damit der
      sbiw r24,1             ;Taster nicht gleich
      rjmp wait              ;die anderen Zahlen aufruft
num2:
      sbic PINB,PB0          ;rjmp überspringen wenn Taste gedrückt
      rjmp num1             
      rcall lcd_clear        ;Lösche LCD_Inhalt
      ldi temp1,02
      rcall lcd_number       ;Gebe Nummer auf dem LCD aus
      
      ldi r25,HIGH(c1)       ;Zählregister werden mit
      ldi r24,LOW(c1)        ;c1 geladen
wait2:
      sbiw r24,1             ;Warteschleife und so weiter
      rjmp wait2
...
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? =)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alex R. (s0urc3)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok hört sich toll an. Danke für die Info, aber bei meiner Umsetzung ist 
irgendwie noch ein Fehler drin:
temp1= r16
zahl = r19
...
num:
    ldi r25,HIGH(c1)      ;Zählregister laden
    ldi r24,LOW(c1)
    
    sbic PINB,PB0         ;überspringe rjmp wenn Taste gedrückt
    rjmp num
    rcall lcd_clear       ;lösche LCD-Inhalt
    inc zahl              ;erhöhe Zahl um 1
    mov temp1,zahl        ;Zahl in temp1 packen und 
    rcall lcd_number      ;ausgeben
wait:
    sbiw r24,1            ;Warteschleife
    rjmp wait
    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?

Autor: Alex R. (s0urc3)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok tut mir leid ...ich depp hab vor dem rjmp num noch ein rjmp wait 
drinne ^^
num:
    ldi r25,HIGH(c1)
    ldi r24,LOW(c1)
    
    sbic PINB,PB0
    rjmp num
    rcall lcd_clear
    inc zahl
    mov temp1,zahl
    rcall lcd_number
wait:
    sbiw r24,1
    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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
 wait:
     sbiw r24,1            ;Warteschleife
     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 
....

Autor: entpreller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alex R. (s0urc3)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jo danke Entpreller. Habs jetzt hinbekommen. Dankeschön :)

Autor: Alex R. (s0urc3)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Info Karl :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.