Forum: Mikrocontroller und Digitale Elektronik entprellen.bekomme es nicht richtig hin.


von m0ron (Gast)


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

von Peter D. (peda)


Lesenswert?

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

Saugute Idee.
Bloß warum willst Du unbedingt die 1 Millionste und eins Version 
erfinden, bzw. warum sollte jemand die schier unendliche Geduld haben, 
zum 1 Millionsten und eins mal die Fehler zu erklären (Fusseln vom Mund 
wisch)?

von HildeK (Gast)


Lesenswert?

Peter Dannegger schrieb:
> warum sollte jemand die schier unendliche Geduld haben,
> zum 1 Millionsten und eins mal die Fehler zu erklären

Falsch. Nur zum 1 Millionsten Mal.  Die 1 Million und erste war deine 
und die löste das Problem, wurde schon erklärt und funktioniert auch ... 
:-)

von Jobst M. (jobstens-de)


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

von Micha H. (mlh) Benutzerseite


Lesenswert?

Jobst M. schrieb:
> { x = Taste
>   wenn x = xold, dann out = x
>   xold = x
> }

Je nach Implementierung kann das funktionieren, muss aber nicht. Dann 
wundert sich der Anwender warum's meistens geht, nur manchmal eben 
nicht.

: Bearbeitet durch User
von Walter (Gast)


Lesenswert?

m0ron schrieb:
> Ich verstehe nicht ganz die variable zustand....wie kann diese in der if
> abgefragt werden, wenn diese nie initialisiert wird?

Variablen die nicht explizit mit was anderem initialisiert werden werden 
am Anfang (im startup code) auf 0 gesetzt

von Jobst M. (jobstens-de)


Lesenswert?

Micha H. schrieb:
> Je nach Implementierung kann das funktionieren, muss aber nicht.

Was kann denn dabei noch schief gehen?

von MaWin (Gast)


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
 }

von Thomas (Gast)


Lesenswert?

würde gucken ob du evtl noch einen kleinen kondensator rein hängst, dann 
sparst du dir ärker in der SW:

http://www.mikrocontroller.net/articles/Entprellung

von Micha H. (mlh) Benutzerseite


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.

von Jobst M. (jobstens-de)


Lesenswert?

Micha H. schrieb:
> Für stabile Entprellung müssen mehrere Samples verglichen werden.

Nö, müssen nicht. Dann wartet man einfach länger.
Wenn Du z.B. 5 Samples jede ms machst komme ich mit 2 Samples in 5ms zum 
selben Ergebnis.

Gruß

Jobst

von Micha H. (mlh) Benutzerseite


Lesenswert?

Jobst M. schrieb:
> Nö, müssen nicht.

Müssen muss garnichts.

> Dann wartet man einfach länger.

Ja, sowas merkt man gerne an chinesischem Billigkram. Obwohl, sowas 
"können" auch deutsche "Experten".

Qualität ist anders.

von Jobst M. (jobstens-de)


Lesenswert?

Micha H. schrieb:
> Qualität ist anders.

Mehr als vernünftig zu funktionieren braucht es nicht. Und das tut die 
Lösung. Zuverlässig!
Welches Szenario sollte denn Deiner Meinung damit nicht klappen?

von Peter D. (peda)


Lesenswert?

Jobst M. schrieb:
> Und das tut die
> Lösung. Zuverlässig!

Dann würde er ja nicht fragen.

MaWin hat recht, man darf eine Funktion nicht in 2 Kontexten aufrufen.
Die Funktion kann ja nicht hellsehen, wer sie aufruft.
Daher bewirkt sie rein zufällig mal hü und mal hott.

von MaWin (Gast)


Lesenswert?

Micha H. schrieb:
> Qualität ist anders.

Nö, Sachverstand geht anders.

Man muss zum Entprellen nicht mehrfach abfragen.

PeDa Entsprellroutine enthält das gegen einstreuende Störungen, z.B. 
eines Handys.

Bei kurzen Leitungen ist das überflüssig.

von Timm R. (Firma: privatfrickler.de) (treinisch)


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

von Teo D. (teoderix)


Lesenswert?

Timm Reinisch schrieb:
> mäßig entprellt...

Was zum Teufel ist den das? O_O

von Helmut L. (helmi1)


Lesenswert?

Teo Derix schrieb:
> Timm Reinisch schrieb:
>> mäßig entprellt...
>
> Was zum Teufel ist den das? O_O

Ist wie ein bisschen Schwanger...

von Paul Baumann (Gast)


Lesenswert?

>> mäßig entprellt...

Mäßigt Euch mal ein wenig....
;-)

MfG Paul

von Teo D. (teoderix)


Lesenswert?

Helmut Lenzen schrieb:
> Ist wie ein bisschen Schwanger...

Das war mir schon klar aber mancher glaubt an Wunder und da wollt ich 
halt auch mal teilhaben :)

von Thomas H. (Firma: CIA) (apostel13)


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.

von Basteler (Gast)


Lesenswert?

manchmal lernt man auch was dazu, indem man fremden Code studiert. Und 
wenn es dann was erwiesenermaßen ordentliches ist, um so besser.

von !!! (Gast)


Lesenswert?

Groß- und Kleinschreibung verwenden

von !!! (Gast)


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.

von Konrad S. (maybee)


Lesenswert?

Thomas Holmes schrieb:
> Weil es Sin macht das man als Anfänger lernt Probleme selber zu lösen.

Das ist schon richtig, aber das Entprellen eines Tasters ist nunmal 
keine triviale Aufgabe - nicht nur für Anfänger. Wer dazu Hilfe anbieten 
mag, der sollte sich überlegen, wie er den Fragesteller an den Artikel 
Entprellung heranführt.

von Jobst M. (jobstens-de)


Lesenswert?

Peter Dannegger schrieb:
> Jobst M. schrieb:
>> Und das tut die
>> Lösung. Zuverlässig!
>
> Dann würde er ja nicht fragen.

Ne, Peter, hier verwechseltst Du gerade meinen Vorschlag und die 
Kommentare dazu und die Frage des TOs - zumindest habe ich den Eindruck.


Gruß

Jobst

von Teo D. (teoderix)


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.

von Adolf (Gast)


Lesenswert?

Basteler schrieb:
> manchmal lernt man auch was dazu, indem man fremden Code studiert.
> Und
> wenn es dann was erwiesenermaßen ordentliches ist, um so besser.

Extrem optimierterer Code ist für einen Anfänger nicht gut zu verstehen 
und oft schwer zu analysieren.

von spess53 (Gast)


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

von Teo D. (teoderix)


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.

von Konrad S. (maybee)


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.

von Teo D. (teoderix)


Lesenswert?

@Konrad S.

Ja, selbstständiges Denken ist heutzutage sehr dünn gesät :( Aber die 
Lösung des Problems ist und bleibt trivial.

: Bearbeitet durch User
von Konrad S. (maybee)


Lesenswert?

Teo Derix schrieb:
> Aber die
> Lösung des Problems ist und bleibt trivial.

Ja, man verweist den Anfänger auf den Artikel Entprellung. ;-)

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.