Forum: Mikrocontroller und Digitale Elektronik Abfrage ob einer von mehreren Tastern gedrückt


von R. F. (inet_surfer88)


Lesenswert?

Hallo,

ich habe an einem Gerät 16 Taster, die ich abfrage.
Hier das Beispiel für TASTER_0
1
#define TASTER_0 (!(PINA &  (1 << 0)))
2
3
if (TASTER_0 == 1)
4
{
5
}

An einer Stelle im Programm soll eine Abfrage gemacht werden, ob ein 
beliebiger Taster von insgesamt 16 Stück gedrückt wurde.

Das würde dann bedeuten:
1
if (TASTER_0 == 1 | TASTER_1 == 1 | TASTER_2 == 1 | ......... )

Hat jemand eine Idee für mich, wie man das ganze eleganter lösen könnte? 
So finde ich das ziemlich unübersichtlich.

Die Taster hängen kreuz und quer verteilt an den Ports, aus 
Layouttechnischen Gründen. Wenn z.B. immer 8 Taster an einem Port hängen 
würden, hätte man einfach prüfen können ob der Port !0 ist. Aber diese 
Variante scheidet aus, da Ein- und Ausgänge gemischt an den Ports.

Ich programmiere mit dem 6er Studio von Atmel und einem ATMEGA644P.

von Peter K. (peterka2000)


Lesenswert?

Man könnte es zum Beispiel auf
1
if (TASTER_0 | TASTER_1 | TASTER_2 | ......... )
verschönern.

von R. F. (inet_surfer88)


Lesenswert?

Peter K. schrieb:
> Man könnte es zum Beispiel auf
>
1
if (TASTER_0 | TASTER_1 | TASTER_2 | ......... )
> verschönern.

Vielen Dank. Das macht es schon mal ein wenig kürzer. Hatte ich gar 
nicht daran gedacht. An anderer Stelle im Programm frage ich mal auf 0 
und mal auf 1 ab, deswegen schreibe ich es immer dazu. Aber da frage ich 
immer nur ein Taster ab und dann stört es nicht so. Aber in dem Fall 
werd ich das ==1 einfach weglassen.

von Dihydrogenmonoxid (Gast)


Lesenswert?

R. F. schrieb:
> if (TASTER_0 | TASTER_1 | TASTER_2 | ......... )

Solange deine Taster nicht entprellt sind, wirst du da aber auch keine 
große Freude dran haben.

von Peter D. (peda)


Lesenswert?

R. F. schrieb:
> An einer Stelle im Programm soll eine Abfrage gemacht werden, ob ein
> beliebiger Taster von insgesamt 16 Stück gedrückt wurde.

So eine merkwürdige Aufgabe ist mir in meiner gesamten bisherigen Praxis 
noch nicht vorgekommen.

Ich will immer nur wissen, ob eine Taste von losgelassen nach gedrückt 
gewechselt hat und das natürlich entprellt.
Die Entprellfunktion kann dann auch gleich alle 16 Tastenstatus in ein 
uint16_t ablegen.

von g457 (Gast)


Lesenswert?

> An einer Stelle im Programm soll eine Abfrage gemacht werden, ob ein
> beliebiger Taster von insgesamt 16 Stück gedrückt wurde.

Hardwarelösung wenn man zu viele Pins frei hat: Alle Schalter 
zusammenverodert drauflegen und ebendort nachfragen.

Softwarelösung sofern die Taster sinnvoll(tm) verteilt sind:
1
#define TASTER_00_TO_07         (~PINA)
2
#define TASTER_08_TO_15         (~PINB)
3
#define TASTER_00_TO_15         ((((uint16_t)TASTER_08_TO_15) << 8) | TASTER_00_TO_07)
4
#define ANY_OF_TASTER_00_TO_15  (TASTER_00_TO_07 | TASTER_08_TO_15)
..oder so ähnlich.

HTH

von g457 (Gast)


Lesenswert?

> So eine merkwürdige Aufgabe ist mir in meiner gesamten bisherigen Praxis
> noch nicht vorgekommen.

Bei des TOs Fragestellung musste ich sofort an AT-Tastatur-artige 
Tastenkombinationen denken, z.B. sowas wie ctrl+alt+sysrq :-)

Abgesehen davon könnten die "Taster" auch mikroschalterartige Dinger 
sein, die in einem nicht näher bezeichneten Gehäuse als (weiche) 
Sicherungsmaßnahmen verteilt sind.

von R. F. (inet_surfer88)


Lesenswert?

Peter Dannegger schrieb:

> So eine merkwürdige Aufgabe ist mir in meiner gesamten bisherigen Praxis
> noch nicht vorgekommen.


Es handelt sich um ein Gerät mit 16 Tasten, denen natürlich im Betrieb 
"sinnvolle" Funktionen zugeordnet sind.
Nach dem Einschalten wird der Controller und das Display initialisiert, 
danach werden Firmwareversion und weitere Systemdaten zur Info 
angezeigt. Nach einem Druck auf einen beliebigen Taster ist das Gerät 
betriebsbereit.

von Georg (Gast)


Lesenswert?

R. F. schrieb:
> So finde ich das ziemlich unübersichtlich

Um Tasten sinnvoll auszuwerten, ist eine Entprell-Software nötig, wie 
sie hier schon zillionenmal veröffentlicht wurde. Es ist zweckmässig, 
innerhalb dieser Software auch solche Abfragen zu erledigen wie "ist 
irgendeine Taste gedrückt" oder "ist Taste X länger als 3 Sekunden 
gedrückt", weil da alle nötigen Informationen vorliegen.

Das gilt gerade dann, wenn die Portanschlüsse wild verteilt sind, weil 
man das dann nur an einer Stelle im Programm behandeln muss. Sonst führt 
eine Änderung der Pinbelegung schon an den Rand des Abgrunds.

Georg

von Peter D. (peda)


Lesenswert?

Bei einem Tastenblock besteht oft nicht die Notwendigkeit, daß alle 
Tasten gleichzeitig gedrückt werden können. Daher setzt dann die 
Entprellroutine nicht je Taste ein Bit, sondern gibt den Tastencode 
zurück, z.B.:
0x00 - keine Änderung
0x01 ... 0x10 - Taste wurde gedrückt
0x41 ... 0x50 - Taste wird gehalten (Autorepeat).
0x81 ... 0x90 - Taste wurde losgelassen

Man braucht dann auch keine 16 Eingänge, sondern 8 reichen.

Die Auswertung der Einganspins in jeder Funktion neu, macht den Code nur 
unnötig groß und kompliziert.
Eine zentrale Entprell- und Abfragefunktion ist da viel einfacher und 
flexibler.

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.