Forum: Mikrocontroller und Digitale Elektronik 4x4 Matrix Ansteuerung


von Kalle K. (kalledk)


Angehängte Dateien:

Lesenswert?

Hi,


habe eine 4x4 Tastenmatrix an einen Atmega32 an den PORTB mit 15kOhm 
Widerständen angeschlossen.
Jetzt bekomme ich es einfach nicht hin die Tasten anzusprechen.
Fürs erste wollte ich einfach nur eine LED aufleuchten lassen, die an 
PA7 ist, wenn ich eine Taste in der Zeile von PB4 drücke aber wenn das 
Programm gestartet ist leuchtet die LED bereits. An den Tasten kann es 
eig nicht liegen, habe sie alle einzeln durchgeprüft ob die 
Entsprechenden pins auch nur verbunden sind, wenn man die entsprechende 
Taste drückt.

habe mich bei dem Quellcode an einem Programm Orientiert was ich hier im 
Forum gefunden habe.
(http://www.mikrocontroller.net/attachment/48476/matrix3x4.c)

Hat vielleicht einer eine Idee was ich falsch mache?
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
int main(void) 
5
6
{
7
8
 DDRA=0xF0;
9
 
10
 while(1)
11
 {
12
  PORTB |= (1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3) | (1<<PB4) | (1<<PB5) | (1<<PB6); 
13
14
 
15
 
16
  DDRB |= ( 1 << DDB0 ) | ( 1<<DDB1) | ( 1 << DDB2 ) | ( 1 << DDB3 );  
17
  DDRB &= ~( ( 1 << DDB4 ) | ( 1<<DDB5) | ( 1 << DDB6 ) | ( 1<<DDB7));
18
 
19
 
20
  PORTB |= ( 1 << PB4 ) | ( 1<<PB5) | ( 1 << PB6 ) | ( 1<<PB7);
21
  PORTB &= ~((1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3)); 
22
 
23
  _delay_ms(1);
24
25
26
    if( !(PINB & (1<<PINB4)) ) 
27
    { 
28
     PORTA |= ( 1 << PA7 );
29
    } 
30
    else
31
    {
32
     PORTA &= ~(1<<PA7);
33
    }
34
  }
35
36
}

von Karl H. (kbuchegg)


Lesenswert?

Und wie ist deine LED angeschlossen?


KOnzentrier dich doch erst mal nur auf 1 Taste anstatt gleich die ganze 
Matrix.

Damit die Taste links oben im Eck deine LED steuert muss PB0 als 
Ausgansg und auf 0 sein, während PB4 auf Eingang + Pullup steht.
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
5
int main()
6
{
7
  DDRB = ( 1 << PB0 );    // PB0 auf Ausgang
8
                          // damit ist PB4 automatisch Eingang
9
10
11
  PORTB = ( 1 << PB4 );   // PB4 auf 1, damit ist PB4 ein Eingang mit Pullup
12
                          // während PB0 damit automatisch auf 0 gelegt wird
13
14
15
  DDRA = 0xF0;
16
17
  while( 1 ) {
18
19
    if( PINB & ( 1 << PB4 ) )
20
      PORTA |= ( 1 << PA7 );
21
    else
22
      PORTA &= ~( 1 << PA7 );
23
  }
24
}

und das probierst du erst mal.

(Wozu sollen die 15k gut sein? Das einzige was du damit erreichst ist, 
dass du einen Spannungsteiler mit dem internen Pullup Widerstand 
gebastelt hast. Und ob das noch reicht, dass der Pin den Eingang als 
High akzeptiert? Ich weiß nicht. Weg mit den 15k.)

von Kalle K. (kalledk)


Lesenswert?

Vielen Dank für deine schnelle Hilfe

es lag an den 15k Widerständen.
hatte das irgendwo gesehen und dachte die müssen dazwischen
aber jetzt gehts.

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.