mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Ablauf Taster-Abfrage


Autor: Daniel M (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

ich kämpfe gerade mit dem STK500, einem ATmega8 + Taster + LED.

Folgendes, ich möchte mit dem Taster die LED Einschalten und beim
nächsten Tasten ausschalten.

1. Tasterzustand einlesen
2. Warten (ca. 50ms)
3. Tasterzustand einlesen
4. Zustand aus 1 und 3 XOR
==> Wenn Taster-BIT aus 4 LOW Sprung zu 1
5. Aktueller LED Status umdrehen
6. Ausgabe von 5
7. Sprung zu 1

Irgendwie hat mir der Biergarten heut Nachmittag stark zu gesetzt, oder
ich bin zu blöd. Versuche es übrigens in Assembler. Die Zeitverzögerung
habe ich übrigens hinbekommen mittels Timer, eigentlich dachte ich,
dass das schwierige ist.

Gruß Daniel

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum XOR und nicht AND?

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. Tasterzustand einlesen und solange er low ist - warten!
2. Warten (ca. 50ms)
3. Tasterzustand einlesen und solange er high ist - warten!
4. Aktueller LED Status umdrehen
5. Sprung zu 1

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Ralf:
Ziemlicher Blödsinn

@Daniel:
Prinzipiell sollte dein Ansatz funktionieren.
Vermutlich machst du im Programm selbst einen Fehler...Posten!

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Rahul:

Wo liegt dein Problem? Wenn was falsch ist, dann erklär es mir mal...

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK:
1. Tasterzustand einlesen und solange er low ist - warten!
Worauf Warten? Soll der Controller die ganze Zeit darauf warten, dass
die High-Pegel bekommt?

2. Warten (ca. 50ms)
Schon wieder dieses böse Wort.

3. Tasterzustand einlesen und solange er high ist - warten!
Und schon wieder.
Dein Programm macht nichts anderes als dauernd darauf zu warten, dass
sich der Zustand einer Taste ändert.

4. Aktueller LED Status umdrehen
5. Sprung zu 1

Daniel hat da schon den richtigen Ansatz:
Er liest den Zustand der Tasten ein. Wartet eine Zeit ab, und
vergleicht dann den vorher eingelesenen Zustand mit dem aktuellen.
Die Wartezeit von 50ms ist schon ziemlich lang. Wenn der Controller
sonst nicht viel zutun hat, stört das aber erstmal wenig.
In diesen 50ms könnte es sein, dass die Taste ihren Zustand noch mal
ändert.
Mit der zweiten Abfrage stellt man fest, ob das anliegende Signal den
richtigen Wert hat, und der Taster nicht mehr prellt.

Ich verstehe leider nicht, wieso dein Programm die ganze Zeitdarauf
warten soll, dass bestimmte Pegel anliegen. Das bremst nur, und
erfordert, dass der Bediener dauernd die Taste betätigt und wieder
loslässt.

@Daniel:
Du musst erst abfragen, ob die Taste noch betätigt ist, oder es sich um
einen neuen Tast-Vorgang handelt. Sonst togglet die LED solange die
Taste betätigt wird.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn der Taster aber nicht an einem Interrupteingang hängt, muß ich ihn
doch ständig abfragen, oder? Ich weiß ja nie wann der Taster gedrückt
wird???
Zudem macht das Programm von Daniel ja auch nichts anderes? Er springt
immer wieder zu Pos. 1 zurück. Einmal von 4 oder von 7.

Versteh ich da was nicht?

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Programm fragt bei Bedarf den Tasterzustand ab.
Der Teil, den Daniel programmieren will, gehört vielleicht zu einem
grösseren Programm, das vielleicht noch irgendwas berechnet oder
irgendeine Anzeige bedient oder was auch immer.
Wenn der Controller jetzt die ganze Zeit darauf warten würde, was
welche Taste macht, wäre das ziemlich uneffektiv.
Bei grösseren Projekten macht man es dann sowieso so, dass die Tasten
im Rahmen eines Timer-Interrupts abgefragt werden.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Zum letzten Beitrag. Welche Werte sind für den Timer-Interrupt zum
Eingänge prüfen gängig? Alle 25ms?

Gruß

Thomas

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Rahul:

Mit welcher Timer-Interrupt Zeit fragt man die Tasten während dem
Hauptprogramm ab, sodass man nichts verpasst? (@HanneS: ich meine nicht
die Entprellzeit)

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Abfrageintervall etwa 4...50ms. Der genaue Wert richtet sich danach, was
der Timer-Int noch so alles zu erledigen hat.

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.