Forum: Mikrocontroller und Digitale Elektronik Tastatur Matrix entprellen


von Patrick (Gast)


Lesenswert?

Hallo alle zusammen.
Ich hab bei meinem aktuellen Projekt mehere Tasten, die in einer Matrix 
angeordent sind. Es sind 4 Tasten.

Nun möchte ich die Timer gesteuerte Entprellung von Peter für meine 
Matrix nutzen.
Allerdings bin relativer Anfänger und hab keinen Plan wie ich die 
Routine umschreiben muss, damit es klappt.

Vielleicht kann ja jemand helfen.

Vielen Dank schon mal

Gruß Patrick

: Gesperrt durch User
von Peter D. (peda)


Lesenswert?

Patrick schrieb:
> Allerdings bin relativer Anfänger und hab keinen Plan wie ich die
> Routine umschreiben muss, damit es klappt.

Die Routine mußt Du garnicht umschreiben.
Du mußt nur eine Routine hinzufügen, die die Tasten einliest und für 
jede gedrückte Taste ein Bit in dem Byte setzt.
Und diese wird statt des Eingangsports in der ersten Zeile der 
Entprellroutine aufgerufen.

Ne Matrix für nur 4 Tasten lohnt sich allerdings nicht.


Peter

von Patrick (Gast)


Lesenswert?

Hallo Peter,
Vielen Dank für deine schnelle Antwort!
Wie muss ich denn so eine Routine schreiben?
Ich hab wirklich keinen Plan, wie ich das machen muss.

Kannst du mir vielleicht eine schreiben?

Gruß Patrick

von Karl H. (kbuchegg)


Lesenswert?

Patrick schrieb:
> Hallo Peter,
> Vielen Dank für deine schnelle Antwort!
> Wie muss ich denn so eine Routine schreiben?
> Ich hab wirklich keinen Plan, wie ich das machen muss.

Dann frage ich mich:
Warum willst du für 4 Tasten eine Matrix einsetzen?

Du sparst nichts dadurch.
Auf der anderen Seite ist es allerdings eine gute Übung im logischen 
Denken.


> Kannst du mir vielleicht eine schreiben?

Na komm.
Was wird das?

du wirst doch wohl noch eine Idee haben, wie man bei 4 matrixförmig 
angeordneten Tasten die Zeilen der Matrix setzen muss und was einem dann 
die ausgelesenen Spaltenwerte über die gedrückten Tasten verraten!

Das ist summa summareum einfach nur ein wenig geordnetes Pin-Wackeln. 
UNd wenn man sich das ganze ein wenig auf dem Papier überlegt, dann 
kommt man auch ganz schnell drauf, wie eine Strategie aussehen könnte. 
Wenn man so will: Es ist in erster Linie erst mal nur eine 
Knobelaufgabe, sich eine Strategie zurecht zu legen. Und erst dann in 
zweiter Linie wird diese Strategie in Code gegossen.

                         +-- Pullup --       + -- Pullup --
                         |                   |
                         | Taste 1           | Taste 2
     Zeile 1 ------------+-------------------+-------
                         |                   |
                         | Taste 3           | Taste 4
     Zeile 2 ------------+-------------------+------
                         |                   |
                     Spalte 1             Spalte 2


(Die Taster sitzen jeweils so an den SChnittpunkten in der Matrix, dass 
sie die Zeile mit der Spalte verbinden, wenn man den Taster drückt. Die 
Pullup Widerstände sind dazu da, dass die Spalten-Leitungen auch dann 
einen definierten 1-Pegel haben, wenn in der jeweiligen Spalte keine 
Taste gedrückt ist.).

Annahme: du setzt Zeile 1 auf '1', und Zeile 2 auf '0'.
Siehst du dir die Ergebnisspalten 'Spalte 1' und 'Spalte 2' an, und 
stellst fest, dass 'Spalte 1' auf 0 ist und 'Spalte 2' auf 1, welche 
Taste war dann gedrückt?

                         +-- Pullup --       + -- Pullup --
                         |                   |
                         | Taste 1           | Taste 2
     Zeile 1 -- 1 >------+-------------------+-------
                         |                   |
                         | Taste 3           | Taste 4
     Zeile 2 -- 0 >------+-------------------+------
                         |                   |
                         v                   v

                         0                   1

                         |                   |
                     Spalte 1             Spalte 2

Welchen Taster muss man drücken, damit sich dieses 0/1 Muster an den 
Spalten einstellt, wenn das Zeilenmuster wie eingezeichnet war? Wenn du 
es nicht siehst, dann geh einfach jeden der 4 Taster durch und überlege, 
welches Spaltenmuster sich bei gegebenem Zeilenmuster einstellt, wenn du 
genau diesen Taster drücken würdest. Bei irgendeinem der 4 Taster stellt 
sich genau das angegebenen Muster ein.

von ....bitte ausfüllen.... (Gast)


Lesenswert?

Ich drücke Taste 1 und 3: Peng!

von Karl H. (kbuchegg)


Lesenswert?

....bitte ausfüllen.... schrieb:
> Ich drücke Taste 1 und 3: Peng!

Ich hab ja nicht gesagt, WIE er die Zeilenleitungen auf 0 oder 1 setzen 
soll. Das ist das eine, das andere ist, dass man da mit ein paar Dioden 
die Sache entkoppeln kann um auch mit Mehrfachbetätigungen klar zu 
kommen.

Der springende Punkt ist aber, dass Patrick selber arbeiten soll anstatt 
sich alles vorkauen zu lassen - und wenn geht gleich in Codeform 
vorkauen, damit er nur ja nicht selber nachdenken muss und, Gott 
bewahre, vielleicht sogar dabei was lernt.

von Uwe S. (de0508)


Lesenswert?

Karl Heinz Buchegger,

du leitest ihn sehr gut und ich finde es immer wieder spannend, wie 
feinfühlig Du auf die Möglichkeiten des Fragestellers eingehen kannst!

Danke.

Peter (PeDa) hatte auch schon mal einen Matrix-Scan-Code programmiert 
und hier veröffentlicht.

Damit kann man dann die Matrix mit der Entprellroutine verbinden.

von Peter D. (peda)


Lesenswert?

Wenn Du mir den Vorteil einer Matrix mit 4 Tasten aufzeigen kannst, 
schreib ichs Dir.
Also gegenüber 4 Tasten einfach direkt an 4 Pins gegen GND.


Peter

von Thomas E. (thomase)


Lesenswert?

Peter Dannegger schrieb:
> Wenn Du mir den Vorteil einer Matrix mit 4 Tasten aufzeigen kannst...
Es werden nur 4 statt 5 Leitungen zum Tastenfeld benötigt.

mfg.

von multi (Gast)


Lesenswert?

Wozu benötigst du für die 4 Taster eine 5. Leitung? Jeder Taster an 
einen Pin. Macht 4.

von Karl H. (kbuchegg)


Lesenswert?

multi schrieb:
> Wozu benötigst du für die 4 Taster eine 5. Leitung? Jeder Taster an
> einen Pin. Macht 4.

Er sagte 'zum Tastenfeld'. Die 5.te Leitung ist GND

(formal richtig, aber nur ein sehr kleiner Vorteil)

von Thomas E. (thomase)


Lesenswert?

multi schrieb:
> Wozu benötigst du für die 4 Taster eine 5. Leitung? Jeder Taster an
> einen Pin. Macht 4.
Na, dann habe ich mich wohl verzählt - oder du hast GND vergessen.

mfg.

von Thomas E. (thomase)


Lesenswert?

Karl Heinz Buchegger schrieb:
> (formal richtig, aber nur ein sehr kleiner Vorteil)
Wenn aber nur eine 4-adrige Leitung unter Putz vorhanden ist...

mfg.

von R. M. (rmax)


Lesenswert?

Immerhin kann man 4-polig noch mit einem einfachen Telefonkabel 
erschlagen. Je nach Situation kann das ein sehr großer Vorteil sein.

von Thomas E. (thomase)


Lesenswert?

R. Max schrieb:
> Immerhin kann man 4-polig noch mit einem einfachen Telefonkabel
> erschlagen. Je nach Situation kann das ein sehr großer Vorteil sein.
So ein schönes Spiralkabel vom Hörer.

mfg.

von Patrick (Gast)


Lesenswert?

Guten Abend und Hallo,
vielen Dank für die große Beteiligung.

Meine Tasten Matrix is in einer fertig gekauften Tastutur und damit 
nicht änderbar.
Ansonsten macht eine 4 Tasten Matrix natürlich keinen Sinn.

Wär echt nett, wenn du mir eine Routine dafür schreiben könntest!!!

Schönen Abend
Gruß Patrick

von Ein Gast (Gast)


Lesenswert?

Patrick schrieb:
> Wär echt nett, wenn du mir eine Routine dafür schreiben könntest!!!

Mir bitte auch - für DS18B20 mit DHT11 und Ausgabe auf 3x16 DOG LCD 
Modul

von Karl H. (kbuchegg)


Lesenswert?

Ähm.
Ich hab da auf Arbeit auch so ein Problem, mit dem ich seit Tagen nicht 
recht weiter komme. Könntest du da auch ....

von Thomas E. (thomase)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Könntest du da auch ....
bei mir nochmal den Rasen mähen?

mfg.

von Daniel F. (df311)


Lesenswert?

mein perpetuum mobile und meine kristallkugel hatten eine kleine 
meinungsverschiedenheit, seit der arbeiten beide nicht mehr so wie sie 
sollten.

kann mir die vielleicht jemand reparieren?

irgendwann muss ich mal meinen plan in die tat umsetzen und versuchen 
eine matrix mit 16 tasten und sagenhaften 3 io-pins + vcc und gnd (und 
ein bisschen hühner und truthahnfutter) zu bauen und entprellen.

p.s. truthähne sind größer als hennen und bekommen daher auch größeres 
futter (aber keine controller) ;-)

von ....bitte ausfüllen.... (Gast)


Lesenswert?

Patrick schrieb:
> Wär echt nett, wenn du mir eine Routine dafür schreiben könntest!!!

Ich lese gerade ein nettes Buch, geht über Hirnforschung und 
"verblödete" Kiddies. Da wird genau das beschrieben. Es wird nicht mehr 
selber gedacht. Es ist viel schneller, woanders zu fragen. Das bringt 
einen zwar eventuell schnell zu einer Lösung, man lernt aber nichts 
davon. Das Gehirn geht ein, wenn es nicht mehr selber arbeiten darf. Aus 
diesem Grunde muss man es fördern.

Da wir nicht wollen, dass irgendwann "verblödete" Ex-Kiddies unsere 
Rente erarbeiten oder gar uns pflegen, versuchen wir, dagegen anzugehen. 
Daher fördern wir das obige Verhalten nicht, sondern unterstützen die 
Selbtlernfähigkeit, die jedem Menschen inne wohnt und die die Menschheit 
genau dahin gebracht hat, wo sie aktuell steht (scheinbar am Abrgund).

von Peter D. (peda)


Lesenswert?

....bitte ausfüllen.... schrieb:
> Da wir nicht wollen, dass irgendwann "verblödete" Ex-Kiddies

Laßt doch endlich mal dieses ewige Herumgetrolle sein, wird Euch das 
nicht langweilig?

Jemandem vorzuwerfen, er sei blöd, bringt ihn bestimmt nicht weiter.
Wenn man keine Lust hat, reicht es völlig, einfach garnicht zu 
antworten.

Ein Forum sollte primär nicht dazu dienen, ständig nur Emotionen 
abzulassen, weil einen die Frau nicht rangelassen hat oder der Chef 
einen ärgert.
Dafür gibts ja auf dem PC das NULL-Device, da kann man allen Ärger 
aufschreiben und dahin verschieben.


Peter

von oldmax (Gast)


Lesenswert?

Hi
Ach kommt.... das ist doch ein klacks..
1
 
2
Read_IO:
3
   LDS r16, 0b11111110   ; Row 0
4
   In R17,  Portx
5
   OR r17,0b00000010     ; Row 1 auf high
6
   And R17, R16          ; Bit 2 - 7 sind unbeteiligt....
7
   Out Portx, R17
8
   In r16, Porty
9
   ROL  r16
10
   ROL  r16              ; auf Bit 2 und 3 schieben
11
   COM  r16              ; Bits drehen, da Potential gegen low 
12
   ANDI r16, 0b00001100  ; nur Bit 2 und 3 bewerten
13
14
   Mov  r4, r16          ; merken
15
16
   LDS r16, 0b11111101   ; Row 1
17
   In R17,  Portx
18
   OR r17,0b00000001     ; Row 0 auf high
19
   And R17, R16          ; Bit 2 - 7 sind unbeteiligt....
20
   Out Portx, R17
21
   In r16, Porty
22
   Com   r16
23
   ANDI r16, 0b00000011  ; nur Bit 0 und 1 bewerten
24
   Or  r16,r4            ; mit gemerkten Bits kombinieren
25
   STS New_In, r16       ; ablegen
26
   RCALL Dedounce        ; nun noch entprellen
27
RET
Na ja, anpassen muss noch ....
Gruß oldmax

von loller (Gast)


Lesenswert?

Also man sollte vor allem auch beachten welche Varianten und Invarianten 
in dem speziellen Fall eine vier Tasten Matrix vorkommen, eventuell gilt 
dann P=NP ...

von Uwe S. (de0508)


Angehängte Dateien:

Lesenswert?

Hallo,

hier ist eine Lösung, die ich mal als Demo für ein Programm eines 
Bekannten zusammen gestellt habe.

Alle 10ms wird

1
void task_key_debounce(void);

über einen Timer in der Interruptroutine aufgerufen.

Den Code im Hauptprogramm |main()| schreibe ich jetzt nicht hier hinein.

von Peter D. (peda)


Lesenswert?

1
#include <avr/io.h>
2
3
#define ROW0    (1<<PB0)
4
#define ROW1    (1<<PB2)
5
#define COL0    (1<<PB1)
6
#define COL1    (1<<PB3)
7
8
#define NOP()           __asm__ volatile("nop"::)
9
10
uint8_t keyscan()
11
{
12
  uint8_t val;
13
14
  DDRB  &=  ~(ROW0 | ROW1 | COL0 | COL1); // Inputs
15
  PORTB |=  ROW0 | ROW1 | COL0 | COL1;  // with pullup
16
17
  PORTB &= ~COL0;                       // Low
18
  DDRB  |=  COL0;                       // Output
19
  NOP();                                // load Input latch !
20
  val = (PINB & (ROW0 | ROW1)) << 1;    // Bit 1, 3
21
22
  DDRB  &= ~(ROW0 | ROW1 | COL0 | COL1); // Inputs
23
  PORTB |=  ROW0 | ROW1 | COL0 | COL1;  // with pullup
24
25
  PORTB &= ~COL1;                       // Low
26
  DDRB  |=  COL1;                       // Output
27
  NOP();                                // load Input latch !
28
  val |= PINB & (ROW0 | ROW1);          // add Bit 0, 2
29
30
  return val;
31
}

Peter

von Patrick (Gast)


Lesenswert?

Hallo,
vielen Dank für die Hilfe aber leider programiere ich immer in C.

Kann ich das irgendwie in C umschreiben?

Und bitte keine höchst unpassenden Kommentare mehr.
Ich noch Anfänger, was Mikrocontroller angeht.
Also bitte Nachsicht!


Gruß Patrick

von Uwe S. (de0508)


Lesenswert?

Hallo Patrick,

hmm, jetzt fällt mir die Gesichtsklappe herunter. :-(

Das ist doch "C" mit den AVR Macros!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Uwe S. schrieb:
> Das ist doch "C" mit den AVR Macros!

Er bezog sich wohl auf das Posting von oldmax:

  Beitrag "Re: Tastatur Matrix entprellen"

Das kommt davon, wenn man nicht zitiert.

von loller (Gast)


Lesenswert?

Uwe S. schrieb:
> Hallo Patrick,
>
> hmm, jetzt fällt mir die Gesichtsklappe herunter. :-(
>
> Das ist doch "C" mit den AVR Macros!
>
>
>
>     Beitrag melden Bearbeiten Löschen

Was hast Du denn erwartet ?
Das ist der übliche Versuch eine Aufgabe lösen zu lassen.
Nur wenn dann der Lehrer/Prof o.ä. nachfragt gibt's was auf die Mütze 
...
Würde schon gerne vom OP wissen was denn bei seiner vier Tasten Matrix 
die Variante und Invariante ist :-P
Das konkludiert also zu OP=NP ...

von Karl H. (kbuchegg)


Lesenswert?

Patrick schrieb:
> Hallo,
> vielen Dank für die Hilfe aber leider programiere ich immer in C.
>
> Kann ich das irgendwie in C umschreiben?


Jetzt reichts.
Das muss ein Troll sein.
Ich mach dann mal dicht.

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.