Hallo, Ich hab seit gestern die Beiträge in dem Thread "Tastatur Matrix entprellen" zum Thema Entprellen einer Matrix verfolgt. Heute hab ich gesehen ihr hab den Thread dicht gemacht. Der Threaderöffner hat sich aber auch angestellt! Aber egal, jedenfalls hab ich auch vor in nächster Zeit ein Projekt mit einer Tastaturmatrix zu realisieren. Und da könnte ich diese Routine auch gut gebrauchen! Mir ist allerdings noch nicht so richtig klar, wie ich die Routine in die Timer gesteuerte Entprellung von Peter einbringe. Vielleicht stehe ich auch gerade aufm Schlauch aber vielleicht könnte mir kurz jemand helfen. Ich hoffe ihr habt die Nase nicht völlig voll vom Matrix Entprellen und verstoßt mich nicht gleich! Also besten Dank schon mal im Voraus und einen Schönen Abend! #include <avr/io.h> #define ROW0 (1<<PB0) #define ROW1 (1<<PB2) #define COL0 (1<<PB1) #define COL1 (1<<PB3) #define NOP() _asm_ volatile("nop"::) uint8_t keyscan() { uint8_t val; DDRB &= ~(ROW0 | ROW1 | COL0 | COL1); // Inputs PORTB |= ROW0 | ROW1 | COL0 | COL1; // with pullup PORTB &= ~COL0; // Low DDRB |= COL0; // Output NOP(); // load Input latch ! val = (PINB & (ROW0 | ROW1)) << 1; // Bit 1, 3 DDRB &= ~(ROW0 | ROW1 | COL0 | COL1); // Inputs PORTB |= ROW0 | ROW1 | COL0 | COL1; // with pullup PORTB &= ~COL1; // Low DDRB |= COL1; // Output NOP(); // load Input latch ! val |= PINB & (ROW0 | ROW1); // add Bit 0, 2 return val; }
Andreas M. schrieb: > Mir ist allerdings noch nicht so richtig klar, wie ich die Routine in > die Timer gesteuerte Entprellung von Peter einbringe. > Vielleicht stehe ich auch gerade aufm Schlauch aber vielleicht könnte > mir kurz jemand helfen. Die Funktion liefert ein Byte, in dem bitweise codiert ist, welche Taste gerade gedrückt ist. Im Entprellcode ist das hier die Stelle
1 | i = key_state ^ ~KEY_PIN; |
an der die jetzt gerade gedrückten Tasten (in Form einer Abfrage des PIN Registers der Tasten) in die Entprellung eingehen. Bei dir kriegst du die gerade gedrückten Tasten nicht durch Abfrage des PIN Registers, sondern durch den Aufruf der Funktion. Also wirst du KEY_PIN ersetzen durch .... Aufpassen musst du jetzt nur darauf, ob aus der Funktion eine gedrückte Taste mit einem 1-Bit oder mit einem 0-Bit repräsentiert wird. Der Originalcode der Entprellung ist auf eine 0-Bit/Taste_gedrückt Situation ausgelegt. Daher auch das ~. Wenn das in der Funktion anders rum ist, dann fällt eben die ~ weg.
Hallo Besten Dank für deine schnelle Anwort!!! Jetzt ist es klar, wie ichs machen muss! Gruß Andreas
Hallo, hab noch mal ne kurze Frage. Habs gerade mal ausprobiert zu Programmieren. Aber wie muss ich denn jetzt eigendlich die Tasten aufrufen? Ohne Matrix Routine muss man ja "get_key_short( 1<<KEY1 )"aufrufen aber was muss ich den jetzt anstatt des KEY1 eintragen? In der Variable val werden ja die Bit gespeichert aber wie kann ich die dort prüfen? Besten Dank schon mal! Is wahrscheinlich ganz einfach aber komme gerade nicht drauf! Liegt vielleicht am Wetter, da will man sich eig gleich zum Schlafen hinlegen. Andreas
Hab gerade noch ne Idee gehabt! Kann man es vielleicht so machen? #define Tasten val #define Taste0 0 #define Taste1 1 #define Taste2 2 #define Taste3 3 Und dann so aufrufen "get_key_short( 1<<Taste1 )" oder is das ne dumme Idee? Dann streich ich sie gleich wieder! Andreas
Habs gerade mal mit nem Atmega 16 aufgebaut und ausprobiert. Aber so richtig gut scheint meine Idee nicht zu sein. Es funktionieren leider nur zwei Tasten! Könnste mir jemand helfen, damit es klappt? Andreas
Andreas M. schrieb: > Habs gerade mal mit nem Atmega 16 aufgebaut und ausprobiert. Aber so > richtig gut scheint meine Idee nicht zu sein. > Es funktionieren leider nur zwei Tasten! > > Könnste mir jemand helfen, damit es klappt? Ehe du mit der Entprellung weiter machst ... taste doch erst mal die Matrix-Funktion für sich alleine. Häng 4 LED an einen Port, Pins 0 bis 4 und sieh nach, ob die sauber aufleuchten, wenn du die entsprechende Taste drückst.
1 | ....
|
2 | |
3 | int main() |
4 | {
|
5 | uint8_t keys; |
6 | |
7 | DDRD = 0xFF; |
8 | ....
|
9 | |
10 | while( 1 ) |
11 | {
|
12 | keys = keyscan(); |
13 | PORTD = keys; |
14 | }
|
15 | }
|
Ihr macht immer den gleichen Fehler: Zuviel ungetesteten Code auf einmal. Und wenn dann nichts geht, dann weiß man nicht, wo man mit der Sucherei anfangen soll. Die Entprellung ist darauf angewiesen, dass die keyscan() Funktion einwandfrei eine gedrückte Taste erkennt. Ist das nicht gegeben, dann kann die Entprellung auch nichts machen. Also muss man das erst mal testen, ob das Scannen der Tasten-Matrix funktioniert, ob die Hardware richtig aufgebaut und angeschlossen ist, was passiert eigentlich wenn man mehrere Tasten drückt etc. etc. Bei jeder einzelnen der gedrückten Tasten muss sich an den LEDs was tun (entweder ausgehen oder leuchten, je nachdem wie die LED angeschlossen sind). Jede Taste ist mit einem Bit in 'keys' verknüpft und die wiederrum (durch die Ausgabe) mit jeweils einer LED. Beim Testen fängt man immer mit der einfachsten Softwareschicht an. Jede weitere darüber liegende Schicht macht die Dinge komplexer und nicht einfacher. Je komplexer .. desto schwieriger ist es Fehler in den untersten Schichten zu diagnostizieren. Also muss man sich die untersten Schichten mal losgelöst von allem anderen vornehmen. Das heißt nicht, dass dort jetzt ein Problem sitzt. Aber es könnte eines dort sein und selbst wenn man nichts findet, ist das dann schon mal ein potentieller Fehlerpunkt den man ausschliessen kann.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.