Added doc
This commit is contained in:
@@ -0,0 +1,45 @@
|
||||
# Tasten-Matrix
|
||||
|
||||
**Dateien:** `hal/matrix.h`, `hal/matrix.cpp`, `config/pins.h`
|
||||
|
||||
## Hardware
|
||||
|
||||
5×5-Matrix mit externer 10-kΩ-Pullup-Beschaltung auf den COL-Leitungen (immer HIGH im Ruhezustand). Dioden zwischen Schalter-DO und ROW-Leitung (Anode = Schalter, Kathode = ROW) verhindern Geistertasten bei Mehrfachdrücken.
|
||||
|
||||
Scan-Prinzip: ROW LOW treiben → gedrückter Schalter zieht zugehörige COL durch Diode auf LOW.
|
||||
|
||||
## Scan-Logik
|
||||
|
||||
```
|
||||
für jede ROW r:
|
||||
ROW r → OUTPUT LOW
|
||||
warte 10 µs (Einschwingen)
|
||||
für jede COL c:
|
||||
raw = (digitalRead(COL[c]) == LOW)
|
||||
Debounce prüfen
|
||||
ROW r → INPUT (hochohmig, Pullup-Freigabe)
|
||||
```
|
||||
|
||||
ROW-Pins wechseln zwischen OUTPUT-LOW (während Scan) und INPUT (hochohmig) – kein dauerhaftes LOW.
|
||||
|
||||
## Debounce
|
||||
|
||||
- **10 ms**, Software-seitig pro Taste
|
||||
- Flanken-Erkennung: Zustandsänderung (raw) wird mit Timestamp notiert
|
||||
- Erst nach 10 ms stabiler neuer Zustand wird `s_debounced` aktualisiert und der Callback aufgerufen
|
||||
- Callback: `matrix_cb(key_id, pressed)` → `CEventQueue::push(KEY_DOWN / KEY_UP)`
|
||||
|
||||
## Key-ID-Berechnung
|
||||
|
||||
```cpp
|
||||
key_id = col * MATRIX_ROWS + row
|
||||
// col 0–4, row 0–4
|
||||
// key_id 0–4: Encoder-SW (COL_0)
|
||||
// key_id 5–24: MX-Buttons (COL_1–4)
|
||||
```
|
||||
|
||||
## Kontext
|
||||
|
||||
- Läuft im Loop-Kontext (kein ISR)
|
||||
- Encoder-SW-Tasten gehen durch denselben Matrix-Pfad (COL_0)
|
||||
- `matrix_scan()` wird einmal pro `loop()` aufgerufen
|
||||
Reference in New Issue
Block a user