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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.