Alle Taster einer Tastenmatrix gleichzeitig abfragen und ausgeben können

Die (fast) "Gleichzeitigkeit" ist in Wirklichkeit ein sehr schnelles hintereinander Abfragen der Tasten.

Das Wort Keyboard "scannen" passt da schon sehr gut. Ein Scanner fährt einen "Bereich" ab.
Ein Flachbettscanner zum Beispiel oder ein Kopierer.

Wenn eine Tastatatur die als Matrix mit Reihen (englisch row) und Spalten (english row)
gescannt wird bedeutet das
Schalte row 1 dann lese alle Spalten
Schalte row 2 dann lese alle Spalten
Schalte row 3 dann lese alle Spalten
Schalte row 4 dann lese alle Spalten
Schalte row 5 dann lese alle Spalten
Schalte row 6 dann lese alle Spalten
Schalte row 7 dann lese alle Spalten

In der Anleitung von Nick Gammon ist auf diesem Bild durch die blaue Farbe dargestellt wie row 1 auf LOW geschaltet ist
Außerdem ist in dem Bild die Taste "T1" (grüne Bechriftung) heruntergedrückt


dadurch ist dann an "col1" ebenfalls LOW
An col 2, col 3 und col 4 ist HIGH

Das bedeutet durch OUTPUT, LOW schalten der row 1 werden die Taster T1, T2, T3, T4 abgefragt.
Dann wird row 1 wieder auf INPUT geschaltet und dann row 2 auf OUTPUT LOW
dann kann man die Taster in der zweiten Reihe abfragen

Dann wird row 2 wieder auf INPUT geschaltet und dann row 3 auf OUTPUT LOW
dann kann man die Taster in der dritten Reihe abfragen

Dann wird row 3 wieder auf INPUT geschaltet und dann row 4 auf OUTPUT LOW
dann kann man die Taster in der vierten Reihe abfragen

und dieses Umschalten row1, row2, row3, row4, und dann col Einlesen macht man so schnell wie das Programm laufen kann.

Es wird schon 2 bis 5 Millisekunden dauern bis man alle 4 rows durchgeschaltet und dann die 4 cols abgefragt hat

Und bei 7 Reihen 8 Spalten dann ca 10 millisekunden,

1 Like

Das sollte schneller gehen, selbst wenn man 16 * digitalRead + 8 * digitalWrite verwendet.
Mal spaßeshalber ausprobiert, komme ich auf ca. 120 µs für das reine Multiplexen und Einlesen
auf einem 16 MHz Uno. Also schneller als die Zeit, die man für das Entprellen sowieso berücksichtigen sollte (?).

Was genau hast du da ausprobiert? Direkt IO-pins am Arduino-Uno schalten?
IO-pins an einem MCP23S17 (also SPI-interface)?
IO-pins an einem MCP23017 (also I2C)?
Der SX1509 hat I2C und da wird es bei 400 kHz nicht so schnell gehen

Da hast du Recht. Wie ich geschrieben habe, lief mein Test mit digitlRead/digitalWrite, also direkte IO Pins.
I2C oder andere Serielle Sachen (shiftIn) sind natürlich deutlich langsamer.
Sorry

Na ja ich komme hier auf 1,2 mSec. für 64 Tastzusände. Aber nur auslesen und in ein Array speichern. Aufbau ist mit 1 PCF 8574A; 1 PCF8575 und 1 74HC244. Mit dem 74HC244 lege ich den Grundstein für einen leichteren Ausbau auf weitere Tastzustände.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.