Taster entprellen ATtiny13A

Gast #3278334
Lesenswert?

Hallo Zusammen,

ich bin gerade dabei eine LED mit ein Taster ein- und auszuschalten. 
Dazu habe ich folgendes geschrieben, allerdings kriege ich den Schalter 
nicht entprellt. Was mache ich hier falsch oder was habe ich hier nicht 
berücksichtigt.

(Ich bin noch etwas unerfahren in uC Programmierung)
1
int main(void)
2
{
3
  unsigned char buttonPress;
4
  unsigned char buttonRelease;
5
  unsigned int count;
6
  
7
  DDRB  = ((1<<DDB0)|(1<<DDB1));
8
  PORTB = ((1<<PB0)|(1<<PB1));
9

10
  while(1)
11
  {
12
    if(PINB & (1<<PB2))
13
    {
14
      count++;
15
    }  
16
      
17
      if((count>=2)&&(count<=20))
18
      {
19
        buttonPress=1;
20
        count=0;
21
      }
22
    
23
        else
24
        {
25
          buttonPress=0;
26
        }
27
        
28
    
29
    if(!(PINB &(1<<PB2)))
30
    {
31
      buttonRelease=1;
32
    }
33
    
34
    
35
      if(buttonPress==1)
36
      {
37
        PORTB=(1<<PB0);
38
      }
39
      
40
      if(buttonRelease==1)
41
      {
42
        if(buttonPress==1)
43
        {
44
          PORTB=(0<<PB0);
45
          buttonRelease=0;
46
        }
47
      }
48

49
  }
50
}
vielen Dank
Gast #3278369
Lesenswert?

Wenn dein Schalter gedrückt ist zählst Du bis 2, dann setzt du 
buttonPress auf 1  und count =0.
Im nächsten Schleifendurchlauf (Taster noch gedrückt) geht count auf 1, 
und somit buttonPress auf 0 (else Zweig), beim dritten mal wird 
buttonPress wieder auf 1 gesetzt (count =2).
Und das obwohl die ganze Zeit der Taster gedrückt ist.

-> Dein Zustand Toggelt solange Du den Taster Drückst.

Dagegen wird der Andere zustand (Taster nicht gedrückt) nicht entprellt.
Eine 0 setzt unmitelbar buttonRelease.
Gast #3278393
Lesenswert?

ich entrprell immer so,
schaus Dir mal an!
1
int main(void)
2
{
3
  static unsigned char buttonPress =0;
4
  static unsigned char state =0;
5

6
  DDRB  = ((1<<DDB0)|(1<<DDB1));
7
  PORTB = ((1<<PB0)|(1<<PB1));
8

9
  while(1)
10
  {
11
    state <<=1;             // state um eins nach links schieben (letztes bit ist somit 0)
12

13
    if(PINB & (1<<PB2))     // wenn Taste gedrückt ist 
14
    {
15
      state |=1;            // letztes bit von state auf 1 setzen ()
16
    }
17
    
18
    // wenn letze 3 bits von state auf 1 dann wurde die Taste über 3 zyklen gedrückt gehalten
19
    if( (state & 0x07) == 0x07)  
20
    {
21
      buttonPress =1;            //setze Zustand auf Taste Gedückt
22
    }
23
    // wenn letze 3 bits von state auf 0 dann wurde die Taste über 3 zyklen nicht gedrückt
24
    else if((state & 0x07) == 0x00)
25
    {
26
      buttonPress =0;            // setze Zustand auf nicht gedrückt.
27
    }
28
    else
29
    {
30
       // no action -> alter Zustand halten   
31
    }
32
    
33
    
34
    if(buttonPress==1)
35
    {
36
      PORTB=(1<<PB0);
37
    }
38
    else
39
    {
40
      PORTB=(0<<PB0); 
41
    }
42
  }
43
}
Gast #3278405
Lesenswert?

Ach ja, in der Ausgabe steckt noch ein kleien Fehler:

Du willst ja wahrscheinlich nur ein Bit setzen/löschen
1
    if(buttonPress==1)
2
    {
3
      PORTB |= (1<<PB0);     // setze bit 1
4
    }
5
    else
6
    {
7
      PORTB &= ~(1<<PB0);    // lösche bit 1
8
    }

viele Grüße

Norbert
Gast #3278443
Lesenswert?

vielen Dank für die tolle Unterstützung.

Ich habe es mit Norberts Vorschlag erfolgreich ausprobiert und werde das 
für On/Off umsetzen.

Die Zeit kann ich ja dann über Timer anpassen.


Danke nochmals.

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