Tastenmatrix 3x4 Problem

OP #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:
OP #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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.