Daniel L. schrieb:
> if(!(PIND & (1<<PD2)))
> {
> taste_jetzt = taste_gedruckt;
> taste_vorher = taste_nicht_gedruckt;
> }
Ho, ho, ho
Nur weil eine Taste jetzt gedrückt ist, bedeutet das nicht, dass die
Taste vorher nicht gedrückt war.
'Schläft' dein Benutzer auf der Taste ein, dann stellst du viele tausend
mal hintereinander fest, dass die Taste gedrückt ist und auch in der
Abfrage zuvor gedrückt war.
Und 'by the way': egal wie schnell dein menschlicher Benutzer ist, aus
Sicht deines µC ist alles was er tut eine Super-Zeitlupe. Dein µC ist
millionenfach schneller als selbst der schnellste menschliche Benutzer.
Wenn du also fragst, was du falsch gemacht hast: Du hast die
Leistungsfähigkeit deines µC grob unterschätzt.
1 | #include <asf.h>
|
2 | #define F_CPU 3686400UL
|
3 | #include <avr/io.h>
|
4 | #include <interrupt.h>
|
5 | #include <util/delay.h>
|
6 | #include <stdio.h>
|
7 |
|
8 | #define taste_gedruckt 1
|
9 | #define taste_nicht_gedruckt 0
|
10 |
|
11 |
|
12 | int main (void)
|
13 | {
|
14 |
|
15 | DDRB = 0xff;
|
16 | DDRD = 0x00;
|
17 | PORTD = 0xff;
|
18 |
|
19 | int i = 0;
|
20 | int taste_jetzt;
|
21 | int taste_vorher;
|
22 |
|
23 |
|
24 | if(!(PIND & (1<<PD2)))
|
25 | taste_vorher = taste_gedruckt;
|
26 | else
|
27 | taste_vorher = taste_nicht_gedruckt;
|
28 |
|
29 | while (1)
|
30 | {
|
31 |
|
32 | if(!(PIND & (1<<PD2)))
|
33 | {
|
34 | taste_jetzt = taste_gedruckt;
|
35 | }
|
36 | else
|
37 | taste_jetzt = taste_nicht_gedruckt;
|
38 |
|
39 | if(taste_vorher != taste_jetzt)
|
40 | {
|
41 | if (taste_jetzt == taste_gedruckt)
|
42 | {
|
43 | PORTB ^= (1<<PB0);
|
44 | }
|
45 | taste_vorher = taste_jetzt
|
46 | }
|
47 | }
|
48 | }
|
Allerdings:
je nachdem wie gut deine Tasten mechanisch beisammen sind, wirst du ein
neues Problem feststellen: Taster prellen
Entprellung