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))
|