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.
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
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.
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
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.
... oder er hat schon einen Pin zerschossen weil er 2 Tasten gleichzeitig gedrückt hat !!!!
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.
Wieder einer der die PortC Pins auf High/Low setzt damit man schön Kurzschluss machen kann wenn man 2 Tasten gleichzeitig drückt !!!
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 !!!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.