Forum: Mikrocontroller und Digitale Elektronik Tastenmatrix 3x4 Problem


von Nino K. (lnino)


Angehängte Dateien:

Lesenswert?

Hi an alle.

Habe mir eine Tastenmatrix von Conrad gekauft und habe anhand folgender 
Anleitung aus dem Netz versucht diese anzusprechen. Es funktioniert 
alles bis auf die Zahlen 1 bis 3.
http://www.kramann.info/40_Mikrocontroller/15_Peripherie/03_Tastenmatrix/index.php
Es ist sogar die selbe Tastenmatrix, welche ich gekauft habe.

Ich lasse mir die Zahlen auf einem Display ausgeben. Aber bei den Zahlen 
1-3 erscheint nichts, bei allen anderen schon.

Habe die Verkabelung überprüft und ob ich die richtigen Pins am MCU 
verwende. Hier kann ich keinen Fehler finden.

Habe meinen Quellcode angehängt, vielleicht könnte ihr etwas erkennen. 
Ich weiß echt nicht weiter.

Vielen Dank.

von Julian R. (tuefftler)


Lesenswert?

Prüf mal die Verbindung von µC(PB2) zu dem Pin in der Mitte der 
Tastatur.
Meine Überlegung ist, dass da irgendwo die Verbindung nicht passt und 
somit die Zeile ausfällt.
Code hab ich mir nicht angeschaut(mag kein C)

julian

von Nino K. (lnino)


Lesenswert?

Die Verbindungen habe ich schon mehrfach kontrolliert. Daran liegt es 
nicht. Wenn ich die Kabel von PB2(123) und PB3(456) vertausche, dann 
kommt wenn ich 1 drücke eine 4, 2->5, 3->6. Und wenn ich 4,5 oder 6 
drücke passiert wieder nichts. Hier sollte eigentlich dann 1,2,3 kommen 
nach dem vertauschen der Kabel.

An den Kabeln und den Ports liegt es eher nicht.

von Thomas (Gast)


Lesenswert?

Hallo,

an Deiner Routine kann ich keine Fehler sehen, also eher Hardware.

Aber warum ich überhaupt schreibe:
Was passiert wenn Du 2 Tasten gleichzeitig drückst ???
Kurzschluss zwischen PC1, PC2, PC3 ???

Statt die Pins auf High/Low solltest die sie dauerhaft auf 0 setzten und 
dafür DDRC schalten, also nur den Pin auf Output der gerade Low sein 
soll.

Damit erhältst du sozusagen einen "Open Kollektor" Ausgang und kein 
Kurzschluss droht !!!

Gruss Thomas

von Wilhelm F. (Gast)


Lesenswert?

El Nino schrieb:

> Habe die Verkabelung überprüft und ob ich die richtigen Pins am MCU
> verwende. Hier kann ich keinen Fehler finden.

Ich habe auch so eine Matrixtastatur 3x4, und kann sie entweder mit 
Diodenentkopplung an 4 Pins anschließen, oder gleich an 7 Pins.

Den Code möchte ich mir jetzt auch nicht anschauen, das ist immer etwas 
speziell und individuell.

Wichtig ist aber, daß man alle 7 Pins am µC auf Input bzw. 
High-Impedance initialisiert. Und zum Scannen jeweils einen (einzigen) 
Pin einer Reihe (oder Spalte) aktiv setzt, und an der Spalte (oder 
Reihe) schaut, was gedrückt wurde.

Wenn die Tastatur schon geprüft wurde, kann es doch eigentlich nur an 
der Verdrahtung liegen, oder an Initialisierung und Software.

von Thomas (Gast)


Lesenswert?

... oder er hat schon einen Pin zerschossen weil er 2 Tasten 
gleichzeitig gedrückt hat !!!!

von MaWin (Gast)


Lesenswert?

Vielleicht eine kleine Verzögerung zwischen PORTC&= und PINB

Aber muß Code so lang sein ?

uint8_t scan[3]={1<<PC1,1<<PC2,1<<PC3};
uint8_t line[4]={1<<PB2,1<<PB3,1<<PB4,1<<PB5};
uint8_t key[4][3]={{1,2,3},{4,5,6},{7,8,9},{0xFF,0,0xFF}};
uint8_t last[3]={0,0,0};
uint8_t pressed,down,line,row,col;

DDRC|=0xE0; DDRB&=0x3C; PORTB|=0x3C;
row=0;
while(1)
{
   PORTC=(PORTC|0xE0)&scan[row];
   pressed=~PINB;
   down=pressed&~last[row];
   for(col=0;col<4;col++) if(down&line[col])
   {
      if(key[col][row]!=0xFF) screen(key[col][row]);
   }
   last[row]=pressed;
   row=(row+1)%3;
   delay_ms(10);
}

Ich weiß, wenn man ein Gigabyte-Betriebssystem wie Windows toppen will, 
muß man früh anfangen Speicher zu verschwenden.

von Thomas (Gast)


Lesenswert?

Wieder einer der die PortC Pins auf High/Low setzt damit man schön 
Kurzschluss machen kann wenn man 2 Tasten gleichzeitig drückt !!!

von MaWin (Gast)


Lesenswert?

Gummitaster, die haben ja 10k Ohm.

von Thomas (Gast)


Lesenswert?

MaWin schrieb:
> Gummitaster, die haben ja 10k Ohm

wenn das so ist (wusste ich nicht)
dann ist aber ein kräftiger Delay zwische setzen von PortC und Eingängen 
lesen fällig !!!

von Peter D. (peda)


Lesenswert?

1
#include <avr\io.h>
2
3
#define NOP();  asm volatile("nop"::);
4
5
6
#define KEY_PIN         PINB
7
#define KEY_PORT        PORTB
8
#define KEY_DDR         DDRB
9
10
// Pin 0..3 = column 1..4
11
// Pin 4..6 = row 1..3
12
13
14
uint8_t keyscan( void )
15
{
16
  uint8_t col = 0, row = 0;
17
18
  KEY_PORT |= 0x7F;                     // all pullups on
19
  KEY_DDR = (KEY_DDR & 0x80) | 0x70;    // pin 6..4 = output
20
  KEY_PORT &= 0x8F;                     // pin 6..4 = output low
21
  NOP();                                // wait until inputs sampled
22
  if( ~KEY_PIN & 1<<0 )                 // if pin 0 = low
23
    col = 4;
24
  if( ~KEY_PIN & 1<<1 )
25
    col = 3;
26
  if( ~KEY_PIN & 1<<2 )
27
    col = 2;
28
  if( ~KEY_PIN & 1<<3 )
29
    col = 1;
30
  row = col;
31
  if( col ){                            // if column found, check row
32
    KEY_PORT |= 0x7F;                   // all pullups on
33
    KEY_DDR = (KEY_DDR & 0x80) | 0x0F;  // pin 3..0 = output
34
    KEY_PORT &= 0xF0;                   // pin 3..0 = output low
35
    NOP();                              // wait until inputs sampled
36
    if( ~KEY_PIN & 1<<4 )
37
      row = 5;
38
    if( ~KEY_PIN & 1<<5 )
39
      row = 9;
40
    if( ~KEY_PIN & 1<<6 )
41
      row = 13;
42
  }                                     // 0 = no key
43
  return row - col;                     // 1..12 = key
44
}


Peter

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
Noch kein Account? Hier anmelden.