Tastenmatrix 3x4 Problem

#2229693
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.
Angehängte Dateien:
#2229739
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.
Gast #2229777
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
Gast #2229785
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.
Gast #2229814
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.
#2229881
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren