entprellen.bekomme es nicht richtig hin.

Gast #4022834
Lesenswert?

Hallo,

ich versuche jetzt seit ca ner stunde eine led mit einem taster zu 
schalten. der taster soll als schalter fungieren!

ich möchte den taster software mäßig entprellen!

hier mein code:
1
/*
2
 * test.c
3
 *
4
 */ 
5

6
#define F_CPU 125000
7
#include  <avr\io.h>  //AVR Register und Konstantendefinitionen
8
#include <util/delay.h>
9

10

11
#define TASTERPORT PINC
12
#define TASTERBIT PINC1
13

14
void initial(void)
15
{
16

17
  // **** Einrichten von Ein- und Ausgängen ***************
18
  DDRC = 0x01;        // PortC 0  Ausgänge PORTC1-6 Eingänge
19
  PORTC |=0x02;  // Pull Up an PortC0 und 1 aktivieren
20

21
}
22

23

24
char taster(void)
25
{
26
  static unsigned char zustand;
27
  char rw = 0;
28
  
29
  if(zustand == 0 && !(TASTERPORT & (1<<TASTERBIT)))   //Taster wird gedrueckt (steigende Flanke)
30
  {
31
    zustand = 1;
32
    rw = 1;
33
  }
34
    else if (((zustand == 1) || (zustand == 2)) && !(TASTERPORT & (1<<TASTERBIT)))   //Taster wird gehalten
35
    {
36
      zustand = 2;
37
      rw = 0;
38
    }
39
  else if (zustand == 2 && (TASTERPORT & (1<<TASTERBIT)))   //Taster wird losgelassen (fallende Flanke)
40
  {
41
    zustand = 3;
42
    rw = 0;
43
  }
44
  else if (zustand == 3 && (TASTERPORT & (1<<TASTERBIT)))   //Taster losgelassen
45
  {
46
    zustand = 0;
47
    rw = 0;
48
  }
49

50
  return rw;
51
}
52

53

54
int main (void) {            
55
  initial();
56
  
57
  while(1) {
58
    //if((PINC&(1<<PINC1))==0 && zustand_taster==0) 
59
    if(taster())
60
    {
61
      PORTC|=(1<<PC0);
62
    
63
    }
64
    
65
  
66
    if(taster())
67
     {
68
      PORTC&=~(1<<PC0);
69
    
70
    }
71
    }               
72
  
73

74
  return 0;                 
75
}

Also ich habe den code für die tasterfunktion aus dem entrpell wiki von 
mikrocontroller.net.
Ich verstehe nicht ganz die variable zustand....wie kann diese in der if 
abgefragt werden, wenn diese nie initialisiert wird?
ich weiß das man für alle zustände des tasters diese variable will, aber 
ich muss doch am anfang sagen, dass der zustand z.b. 0 ist also taster 
nicht gedrückt.

die led wird mit einem taster auf masse geschaltet. habe den internen 
pullup aktiviert für die led.

jedenfalls ist jetzt bei mir reiner zufalls wann die led ausgeschaltet 
wird. je nachdem wann in die erste oder 2te if bedingung gesprungen 
wird.
irgendwie denke ich das ich recht nah dran bin, aber ich brauche jetzt 
mal hilfe :(.

gruß m0ron
#4023282
Lesenswert?

m0ron schrieb:
> die led wird mit einem taster auf masse geschaltet. habe den internen
> pullup aktiviert für die led.

... hast Du dazu mal ein Schaltbild!? :-/


Irgendwie (im Idealfall durch einen Timerinterupt) musst Du eine Zeit 
warten.

Jedes Mal liest Du den Taster ein und vergleichst seinen Zustand mit dem 
vom vorherigen Durchlauf. Sind beide Identisch, kannst Du den Wert 
übernehmen, sonst nicht.

Also:

{ x = Taste
  wenn x = xold, dann out = x
  xold = x
}

In Deiner SW arbeitest Du dann nur noch mit 'out'


Gruß

Jobst
Gast #4023610
Lesenswert?

m0ron schrieb:
> while(1) {
>     //if((PINC&(1<<PINC1))==0 && zustand_taster==0)
>     if(taster())
>     {
>       PORTC|=(1<<PC0);
>
>     }
>
>
>     if(taster())
>      {
>       PORTC&=~(1<<PC0);
>
>     }
>     }

Ist doch grosser Unsinn. Denk mal nach:

Die Schleife läuft immer um, wahrscheinlich 10000 mal pro Sekunde.

Wenn zufällig während der Zeitdauer der ersten Hälfte der Schleife der 
Taster gedrpckt wurde, schaltest du die LED ein (wenn sie nach Masse 
geschaltet ist). Wenn zufällig der Taster aber erst während der zweiten 
1/20000 Sekunde des Schleifendurchlaufs gedrückt wird, führt der 
Tastendruck zum ausschalten.

Das kann nicht funktionieren. Es ist zufällig, was passiert, weil du 
nicht auf 1/20000 Sekunde genau den Knopf runterdrücken kannst.

Die Funktion

> char taster(void)
> {
>   static unsigned char zustand;
>   char rw = 0;
>
>   if(zustand == 0 && !(TASTERPORT & (1<<TASTERBIT)))   //Taster wird
> gedrueckt (steigende Flanke)
>   {
>     zustand = 1;
>     rw = 1;
>   }
>     else if (((zustand == 1) || (zustand == 2)) && !(TASTERPORT &
> (1<<TASTERBIT)))   //Taster wird gehalten
>     {
>       zustand = 2;
>       rw = 0;
>     }
>   else if (zustand == 2 && (TASTERPORT & (1<<TASTERBIT)))   //Taster
> wird losgelassen (fallende Flanke)
>   {
>     zustand = 3;
>     rw = 0;
>   }
>   else if (zustand == 3 && (TASTERPORT & (1<<TASTERBIT)))   //Taster
> losgelassen
>   {
>     zustand = 0;
>     rw = 0;
>   }
>
ist auch dubios.

Du fragst 4 mal !(TASTERPORT & (1<<TASTERBIT)) ab, glaubst du, da kommt 
immer dasselbe bei raus ? Es ist schliesslich der TAster, der gedrückt 
wird und prellt.
Ausserdem folgest du zwar dem Tastenzustand, in dem du "gedrückt" 
"gehalten" "losgelassen" zeitgenau erkennst, aber entprellen tust du 
nicht, du könntest gleich
return zustand==0&&(!(TASTERPORT & (1<<TASTERBIT)))==1; schreiben.

Zum Entprellen benötigst du eine Zeitverzögerung.

So einfach kann Entprellen eines (bis 8) Tastern sein (ohne 
Initialisierung):

 uint8_t tasten,gedrueckt;

 while(1)// die Programm-Hauptschleife
 {
   tasten=TASTERPORT&TASTERBIT;
   gedrueckt=tasten&~gedrueckt;
   if(gedrueckt&TASTERBIT)
   {
     // Taster 1 wurde gerade runtergedrückt, mach was
   }
   // mach was sonst in der Programm-Hauptschleife passieren muß
   gedrueckt=tasten;
   _delay_ms(10); // damit sie bestimmt länger dauert als eventuelles 
Prellen
 }
Persönliche Seite #4023895
Lesenswert?

Jobst M. schrieb:
> Micha H. schrieb:
>> Je nach Implementierung kann das funktionieren, muss aber nicht.
>
> Was kann denn dabei noch schief gehen?

Da werden nur zwei Samples verglichen, das Ergebnis kann noch immer 
Zufallselemente haben.
Für stabile Entprellung müssen mehrere Samples verglichen werden. Peda's 
Code nimmt 3 oder 4 wenn ich mich nicht irre, der von mir meist benutzte 
nimmt 5 Samples, ist dafür nicht so universell einsetzbar.
(Firma: privatfrickler.de) #4024383
Lesenswert?

m0ron schrieb:

> ich möchte den taster software mäßig entprellen!

Leute! Ihr redet alle am Kern der Sache vorbei! Der Taster soll nur 
mäßig entprellt werden! Dafür ist der Code von Peter Danegger zum 
Beispiel komplett ungeeignet, denn der entprellt ja total! Auch mehrere 
Samples auszuwerten dürfte einer mäßigen Entprellung nur bedingt 
zuträglich sein :-))

scnr

 Timm
(Firma: CIA) #4024419
Lesenswert?

Peter Dannegger schrieb:
> Saugute Idee.
> Bloß warum willst Du unbedingt die 1 Millionste und eins Version
> erfinden

Weil es Sin macht das man als Anfänger lernt Probleme selber zu lösen. 
Nur so kann man sich weiter entwickeln. Es gibt unzählige Wege zu 
entprellen. Und es ist überhaupt kein Problem wenn eine selbstgestrickte 
Lösung noch Optimierungspotenzial hat. Alles macht mehr Sin als eine 
hier vorgekaute Lösung zu benutzen. Das ist hier schließlich keine 
Codeschipsel-Bibliothek, sondern ein Forum dessen Sinn durchaus in der 
Beantwortung von Fragen zu selbst programmierten Problemen zu sehen ist. 
Wer keine Lust hat zum 1000 und 1ten mal Fragen zu einem Thema zu 
beantworten der lässt es halt einfach. Was mich ein wenig wundert ist 
das Herr Dannegger  durchaus gerne 1000 und 1 mal die selben  Fragen 
beantwortet, wenn es um  seinem eigenen Entprellen-Code geht.
Gast #4024484
Lesenswert?

m0ron schrieb:
> Hallo,
>
> ich versuche jetzt seit ca ner stunde eine led mit einem taster zu
> schalten. der taster soll als schalter fungieren!
>
> ich möchte den taster software mäßig entprellen!
>
> hier mein code:

Ich hatte mal
Stunde durch stunde und
Led mit led und
Taster mit taster und
Schalter mit schalter
Code mit code
etc...
ersetzt.
Der Compiler ging dann nicht mehr richtig.
Das betrifft auch Beiträge.
#4024509
Lesenswert?

Konrad S. schrieb:
> das Entprellen eines Tasters ist nunmal
> keine triviale Aufgabe - nicht nur für Anfänger.

Ähh... WAS???
Jeder der selbstständig zu denken gelernt hat und weiß was Prellen eines 
Tasters zu bedeuten hat, kommt da in Sekundenbruchteilen auf die Lösung. 
Das umsetzen in SW scheitert dann höchsten an fehlenden 
Programmierkenntnissen.
Gast #4024513
Lesenswert?

Hi

>Jeder der selbstständig zu denken gelernt hat und weiß was Prellen eines
>Tasters zu bedeuten hat, kommt da in Sekundenbruchteilen auf die Lösung.
>Das umsetzen in SW scheitert dann höchsten an fehlenden
>Programmierkenntnissen.

Nein. Das scheitert am Prinzip. Das ist genial. Auch wenn DeDa zugibt, 
das es auf einer Hardwareimplemtietrung beruht. Darauf kommt kein 
Anfänger.

MfG Spess
#4024528
Lesenswert?

spess53 schrieb:
> Nein. Das scheitert am Prinzip. Das ist genial. Auch wenn DeDa zugibt,
> das es auf einer Hardwareimplemtietrung beruht. Darauf kommt kein
> Anfänger.

Was faselt der Herr da?

Wenn du mit "DeDa", peda's Eierlegendewollmilchsau meinst, die hab ich 
weder erwähnt noch Bezug darauf genommen, noch das diese 
Eierlegendewollmilchsau Trivial oder für Anfänger leicht zu verstehen 
ist. Das Liegt aber nicht an der, nicht gegebenen, Komplexität der SW 
Entprellung, sondern daran das es eben eine Eierlegendewollmilchsau ist.
#4024540
Lesenswert?

Teo Derix schrieb:
> Jeder der selbstständig zu denken gelernt hat und weiß was Prellen eines
> Tasters zu bedeuten hat, kommt da in Sekundenbruchteilen auf die Lösung.

Der Anfänger versteht eben nicht worin das Problem besteht.

Nicht vernünftig funktionierende Tastenbedienungen kommerzieller Geräte 
belegen immer wieder mal, dass Nicht-Anfänger zuweilen auch ihre 
Probleme damit haben.

Teo Derix schrieb:
> oder für Anfänger leicht zu verstehen

Der Anfänger hat das grundlegende Problem, dass er die Schwierigkeiten 
der µC-gerechten Erfassung physikalischer Eigenschaften, Zustände oder 
Größen völlig unterschätzt. Das Abfragen eines Tasters ist nur 
scheinbar eine triviale Aufgabe, aber es erfordert die 
Auseinandersetzung mit den nicht idealen Eigenschaften eines 
pysikalischen Systems.

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