Forum: Mikrocontroller und Digitale Elektronik Taster entprellen ATtiny13A


von Dimi (Gast)


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

von Georg G. (df2au)


Lesenswert?

Warum das Rad neu erfinden? Such nach Entprellung hier im Forum. Es gibt 
n+1 Beiträge dazu. Meist wird die PeDa Lösung als optimal empfohlen.

von Dimi (Gast)


Lesenswert?

ok vielen dank

von jojo (Gast)


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.

von m.n. (Gast)


Lesenswert?

Vielleicht ist es für Dich als Anfänger etwas kompliziert. Aber sieh Dir 
die Schaltung und das kurze Programm einfach einmal an. Es müßte sich 
problemlos auf einen Tiny13 übertragen lassen.
Beitrag "Re: EIN-AUS mit Taster per Interrupt, ATtiny25 o.ä."

von jojo (Gast)


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
}

von jojo (Gast)


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

von Dimi (Gast)


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.

von Dimi (Gast)


Lesenswert?

jojo schrieb:
> ich entrprell immer so,

Kann ich den Code auch für zwei Zustände benutzen? Kurzes 
tippen(state=0x02) und drauf drücken(state=0x10)?

Danke

von Claude M. (stoner)


Lesenswert?

Dimi schrieb:
> Kann ich den Code auch für zwei Zustände benutzen? Kurzes
> tippen(state=0x02) und drauf drücken(state=0x10)?

Am Besten du nimmst den Code von Peter Dannegger aus Entprellung. 
Der Code ist hundertfach (wenn nicht tausendfach) in Verwendung, 
funktioniert und kann alles was du willst (kurz, lang, etc.).

von Walter (Gast)


Lesenswert?

Georg G. schrieb:
> Warum das Rad neu erfinden?

weil es nie schadet sich selbst was zu erarbeiten.

Klar, wenn ich gerade die Steuerung für Raumschiff Enterprise 
programmiere werde ich mich nicht mit Entprellen von Tasten aufhalten.
Für einen Anfänger aber eine gute Übung.

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.