Forum: Mikrocontroller und Digitale Elektronik Tasten und aufrufe


von Thomas Leist (Gast)


Lesenswert?

Hallo,

Irgendwie kriege ich das nicht richtig hin - bzw. ich komme nicht drauf
wie man es besser machen kann.
Also:

ich habe drei taster, ein LCD und wenn die erste taste gedrückt wird,
dann soll "text" auf dem LCD stehen, wenn man eine andere Taste
drückt, dann soll ein anderer Text auf dem lcd stehen.

So habe ich es gemacht:

schleife:
loop1:
  sbic PINC, 1
  rjmp loop1
  ... Text1

loop2:
  sbic PINC, 2
  rjmp loop2
  ... Text2

loop3:
  sbic PINC, 3
  rjmp loop3
  ... Text3

rjmp schleife

das problem ist halt nur ich halt nur diese reihenfolge der tasten
drücken kann, also erts taste 1 dann die zweite taste und dann die
dritte taste. Aber wenn ich erst die erste taste drücke und dann die
dritte taste drücke dann passiert natürlich nichts, weil das programm
im "loop2" festhängt und wartet bis taste 2 gedrückt wird.

Wie kann man das noch realisieren

Ich komme irgendwie nicht drauf.

MFG

von Michael Ehrhardt (Gast)


Lesenswert?

Hallo,

ich kenne zwar den Assemler nicht so genau, aber versuche 'mal
folgendes:

schleife:

  sbis PINC, 1
  ... Text1

  sbis PINC, 2
  ... Text2

  sbis PINC, 3
  ... Text3

rjmp schleife

Gruß Micha

von Thomas Leist (Gast)


Lesenswert?

mmmmhh,

nee ist nicht so das wahre was du da geschrieben hast. Das LCD zeigt
irgendwelche Kombinationen von den drei Texten an.

Aber trotzdem danke
:-)

von Peter D. (peda)


Lesenswert?

Am besten ist es, wenn man die Tasten erstmal entprellt und dann das nur
Drücken erkennt (Wechsel von Losgelassen nach Gedrückt).

Das macht man im Timerinterrupt, damit nicht unnütz Rechenzeit
verwartet wird und kann dann im Hauptprogramm gemütlich die Auswertung
vornehmen.

Hier mal ein Beispielcode, der 8 LEDs mit 8 Tasten wechselt:

http://www.mikrocontroller.net/attachment.php/20554/Get8key4.asm


Peter

von Jochen (Gast)


Lesenswert?

Du hast schon in dem Text von Michael die "sbis" in die für dein
programm benötigten "sbic" geändert, wenn du das vergessen haben
solltest, dann schreibt er der reihe nach "TEXT1" "TEXT2" "TEXT3"
auf das display und fängt wieder von vorne an.

Mfg Jochen.

von Thomas Leist (Gast)


Lesenswert?

Ja genau, mit "sbis" macht der das wie du sagst (Jochen).

@peter:
mit dem entprellen kann man ja ersteinmal vernachlässigen.
Das mit der Rechenzeit versteh ich - ist ja klar, er "wartet" in der
Schleife so lange bis man nach ner stunde mal die Taste drückt.
Und wie soll ich das anstellen mit dem Timerinterrupt?


MFG

von Jochen (Gast)


Lesenswert?

Aber mit "sbic" statt "sbis" geht es?

Jochen.

von Rahul (Gast)


Lesenswert?

schleife:
  loop1:
    sbic PINC, 1
    rjmp loop2
    ... Text1
    rjmp schleife

  loop2:
    sbic PINC, 2
    rjmp loop3
    ... Text2
    rjmp schleife

  loop3:
    sbic PINC, 3
    rjmp schleife
    ... Text3

rjmp schleife

oder nicht?
Bin nicht so ASM-bewandert (und habe gerade keine Lust im Instruction
Set Summary nachzugucken), gehe aber davon aus, dass sbic ein Test auf
Null (skip if bit is clear?) ist und die folgende Anweisung
übersprungen wird, sobald die Bedingung erfüllt ist (low-aktive
Taster?!).
Es wir also getestet, ob die Taste gedrückt wird.
Ist das nicht der Fall, wird die folgende Anweisung (rjmp)
ausgeführt, und das Programm an der nächsten Abfrage weiter geführt.
Wird die Taste gedrückt, erscheint der Text auf dem Display, und es
wird mit der allgemeinen Abafrage fortgefahren.
Problem, das sich stellt:
Es wird solange der Text an das Display geschickt, wie die Taste
gedrückt wird.
Also noch eine Abfrage, die das Programm quasi anhält, solange die
Taste gedrückt wird.
Also:

schleife:
  loop1:
    sbic PINC, 1
    rjmp loop2
    ... Text1
    warte1:
      sbis PINC,1
      rjmp warte1

    rjmp schleife

  loop2:
    sbic PINC, 2
    rjmp loop3
    ... Text2
    warte2:
      sbis PINC,2
      rjmp warte1
    rjmp schleife

  loop3:
    sbic PINC, 3
    rjmp schleife
    ... Text3
    warte3:
      sbis PINC,3
      rjmp warte1

rjmp schleife

unter der Vorraussetzung, dass SBIS "skip if Bit is set" heisst...
Gruß Rahul

von Tobi (Gast)


Lesenswert?

an dem code oben sollte man noch die sprunglabel anpassen (warte1-3 sind
falsch :) und eine pause vor der warteschleife zum taste loslassen. dann
ist der tester gleich ein wenig entprellt. ich würd für die pause eine
schleife bis 255 und eine so bis 10 oder so nehmen (kommt auf deinen
takt an, beispiel für 4mhz)

von Thomas Leist (Gast)


Lesenswert?

JA!!!

Das mit den anderen SChleifen ist mir nicht eingefallen.
Ganz herzlichen dank an euch allen.

Bis denne

von Rahul (Gast)


Lesenswert?

copy'n'paste-Fehler... hatte keine Lust den ganzen Quatsch x-mal zu
tippen...

von Gerd (Gast)


Lesenswert?

@Peter,

dein Code ist so brillant und so optimiert, dass ihn ein Anfänger nicht
so leicht verstehen kann.

Daher wundere ich mich nicht, dass du damit auf taube Ohren (blinde
Augen?) stößt.

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.