LED mit Taster ein/aus schalten

OP #3614941
Lesenswert?

Hallo hab hier mal ein kleines Programm geschrieben, aber es tut nicht 
was ich will

Es soll per Tasten druck eine LED an bzw: ausgeschaltet werden.

Ich habe keinen Plan was ich noch falsch mache.
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
  while (1)
25
  {
26
    
27
    if(!(PIND & (1<<PD2)))
28
    {
29
      taste_jetzt  = taste_gedruckt;  
30
      taste_vorher = taste_nicht_gedruckt;
31
    }
32
    else
33
    taste_jetzt  = taste_nicht_gedruckt; 
34
    taste_vorher = taste_gedruckt;
35
    
36
        
37
  
38
    if(taste_vorher != taste_jetzt)
39
    {
40
      if (taste_jetzt == taste_gedruckt)
41
      {
42
        PORTB ^= (1<<PB0);  
43
      }
44
    } taste_vorher = taste_jetzt
45
  }
46
}

mfg Daniel
#3614955
Lesenswert?

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
#3614961
Lesenswert?

Siehe Entprellung
Ich mache Flankenerkennung (steigend) immer so:
1
while(1)
2
{
3
    PINDnew=PIND;
4
    flankeD=~PINDnew;
5
    flankeD=flankeD&PINDold;
6
    PINDold=PINDnew;
7
    
8
    if(flankeD&(1<<4))      // PD4
}
Die Variablen sind unsigend char
Zum Entprellen würde ein Delay in der while helfen, ich führe die 
Routine aber immer in einem Timer Interrupt aus.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren