Forum: Mikrocontroller und Digitale Elektronik Tastenmatrix, mal wieder


von Martin K. (dschadu)


Lesenswert?

Edit: Vergesst es, hab PullDowns vergessen...

Hi,
ich versuch grade eine Tastenmatrix auszulesen, aber irgendwie 
verzweifel ich grade.
Anzeigen tu ich mir die gedrückte Taste aktuell noch auf einer 7 Segment 
Anzeige, das funktioniert einwandfrei.
Die Anzeige springt aber hin und her, ich hab jetzt alles soweit raus 
gelöscht, das ich nurnoch 1, 4, 7 oder n (für Stern-Taste) anzeige.
Mal steht die Anzeige, dann springt alles wild hin und her. Ein 
Tastendruck wird nur manchmal wirklich angezeigt, danach flimmert alles 
wieder. Normal soll die letzte gedrückte Taste einfach dauerhaft 
angezeigt werden.
Angeschlossen ist im Konkreten Beispiel PC5 als Output, über die 
Tastenmatrix zurück auf PD0..PD3

Hat jemand Rat warum die Anzeige spinnt? Bzw warum's nicht so hinhaut 
wie ichs möchte?
1
#define F_CPU 16000000
2
3
4
/* Includes */
5
#include <avr/io.h>
6
#include <util/delay.h>
7
#include <avr/interrupt.h>
8
9
#include "config.h"
10
11
uint8_t pressed = 12;    //12 = Default Wert, 10 = *, 11 = #
12
13
int main (void)
14
{
15
  TCCR0 |= (1<<CS02)|(1<<CS00);        //CS02, CS00: Prescaler 1024, ~16,384ms
16
  TCCR2 |= (1<<CS22)|(1<<CS20);        //CS22: Prescaler 128, ~10,24ms
17
  TIMSK |= (1<<TOIE0)|(1<<TOIE2);      //Overflow Enable für Timer0&Timer2 (8bit)
18
19
  DDRD = 0b11110000;      //Ausgänge setzen
20
  DDRC |= (1<<DDC5);      //Ausgang setzen
21
  PORTC |= (1<<PC5);      //PullUps Einschalten
22
23
  sei();
24
25
  while(1)
26
  {
27
    [...] //Zuweisung Tastendruck -> Anzeige (und reset von 'pressed' auf 12)
28
  }
29
}
30
31
ISR(TIMER2_OVF_vect)
32
{
33
    [...]
34
}
35
36
ISR(TIMER0_OVF_vect)
37
{
38
  //Tastendruck zu "pressed" zuweisen
39
  if (Row1) pressed = 1;
40
  if (Row2) pressed = 4;
41
  if (Row3) pressed = 7;
42
  if (Row4) pressed = 10;  
43
}

config.h:
1
#define Row1 (PIND & (1<<PIND0))
2
#define Row2 (PIND & (1<<PIND1))
3
#define Row3 (PIND & (1<<PIND2))
4
#define Row4 (PIND & (1<<PIND3))

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.