Forum: Mikrocontroller und Digitale Elektronik LED mit Taster ein/aus schalten


von Daniel L. (daniel_l49)


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

von Daniel L. (daniel_l49)


Lesenswert?

hab noch etwas vergessen
1
if(!(PIND & (1<<PD2))) // wenn Taste gedrückt

von Dark Maul (Gast)


Lesenswert?

Daniel L. schrieb:
> }
>     else
>     taste_jetzt  = taste_nicht_gedruckt;
>     taste_vorher = taste_gedruckt;

lol... überleg dir mal ob da vielleicht Klammern fehlen.

von Karl H. (kbuchegg)


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

: Bearbeitet durch User
von Max H. (hartl192)


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.

: Bearbeitet durch User
von Daniel L. (daniel_l49)


Lesenswert?

Oke danke für die Antworten

Es funktioniert schon

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.