4x4 Matrix Ansteuerung

OP #2297243
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
}
Angehängte Dateien:
#2297300
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.)

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.