Tastatur Matrix entprellen

Gast #2820029
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
#2820069
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
Gast #2820094
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
#2820108
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.
#2820174
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.
#2820192
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.
Gast #2820577
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
#2820608
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) ;-)
Gast #2821147
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).
#2821171
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
Gast #2821187
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
#2821232
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
Gast #2821253
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
Gast #2821284
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 ...
Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.