Forum: Mikrocontroller und Digitale Elektronik Entprelle Funktion dunktioniert nicht


von Schiri (Gast)


Lesenswert?

Hallo,

ich versuche eine debounce Funktion zurecht zu basteln, der natürlich 
der jeweilige Taster übergeben wird.

Es funktioniert das folgende:
1
#define mPORTBReadBits(_bits)   (PORTB & (unsigned int)(_bits))
2
#define BUTOK_READ              !mPORTBReadBits(BIT_1)
3
4
5
6
if(BUTOK_READ)
7
          {
8
          DelayMs(100);
9
          DelayMs(100);
10
            if(!BUTOK_READ)
11
            {
12
            DelayMs(50);
13
            DelayMs(50);
14
            tueirgendwas();
15
            }
16
          }

Meiner debounce Funktion wird als Parameter ein unsigned int übergeben 
(das müßte nach oben doch eigentlich passen).

Leider funktioniert das untere nicht:
1
unsigned char debounce(unsigned int taster)
2
{
3
    if(taster)
4
    {
5
    DelayMs(100);
6
    DelayMs(100);
7
    if(!taster)
8
        {
9
            DelayMs(50);
10
            DelayMs(50);
11
            return 1;
12
        }
13
14
    }
15
    return 0;
16
}
17
18
19
int main(){
20
21
while(1)
22
{
23
if(debounce(BUTOK_READ))
24
tueirgendwas;
25
}
26
}

Syntaktisch müßte dies doch genau dasselbe sein? Liegt es doch an dem 
Makro, den ich der Funktion debounce als Parameter übergebe? Fällt sonst 
etwas ins Auge?

von Karl H. (kbuchegg)


Lesenswert?

Wie soll denn taster in dieser Funktion
1
unsigned char debounce(unsigned int taster)
2
{
3
    if(taster)
4
    {
5
    DelayMs(100);
6
    DelayMs(100);
7
    if(!taster)
8
...

jemals seinen Wert ändern?

Hier
1
  if(debounce(BUTOK_READ))
kriegt die Funktion den jetzt gerade aktuellen Zustand des Portpins. 
Nicht mehr und nicht weniger. DIe FUnktion speichert sich den in einer 
lokalen Variablen (eben dem 'taster') und das wars. Während die Funktion 
läuft, verändert sich der Wert dieser Variablen nicht.


Aber ich muss mich wundern. Du hast doch in deinem anderen Thread 
scheinbar die Danegger Erkennung/Entprellung am laufen? Was willst du 
denn noch mehr? Komfortabler und besser als das dort wirds nicht.

: Bearbeitet durch User
von :-) (Gast)


Lesenswert?

Schiri schrieb im Titel von Beitrag #3900599:
> dunktioniert

Ist es zu viel verlangt mal über den Betreff zu schauen ob ein 
Schreibfehler drinn ist?

von Karl H. (kbuchegg)


Lesenswert?

Schiri schrieb:

> Liegt es doch an dem
> Makro, den ich der Funktion debounce als Parameter übergebe? Fällt sonst
> etwas ins Auge?

Was mir ins Auge fällt, das ist das da scheinbar wieder mal banale C 
Grundlagen fehlen. Du 'übergibst kein Makro'. Beim AUfruf einer FUnktion 
werden die Funktionsargumente ausgewertet
1
  foo( 8 + 5 );

und die Funktion kriegt das Ausgerechnete und speichert sich dieses 
Ergebnis in ihrer lokalen Variablen, die du in der Argumentliste benannt 
hast
1
void foo( int jkl )
2
{
3
  // jkl hat hier den Wert 12
4
}

daran ändert sich auch nichts, wenn du die Textersetzung des 
Präprozessors in Anspruch nimmst, um anstelle der Berechnung direkt beim 
Aufruf
1
#define ARG  8 + 5
2
3
4
...
5
   foo( ARG );
da eine Bezeichnung dafür künstlich einzuführen. Beim AUfrufer wird der 
zum Zeitpunkt des Aufrus vorliegende Wert ermittelt und dieser Wert an 
die FUnktion übergeben.

: Bearbeitet durch User
von Seppel (Gast)


Lesenswert?

:-) schrieb:
> Schiri schrieb im Titel von Beitrag #3900599:
>> dunktioniert
>
> Ist es zu viel verlangt mal über den Betreff zu schauen ob ein
> Schreibfehler drinn ist?

Ist es zu viel verlangt mal über den Beitrag zu schauen, ob ein 
Schreibfehler drin ist?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Karl Heinz schrieb:
> foo( 8 + 5 );
> ...
> hastvoid foo( int jkl )
> {
>   // jkl hat hier den Wert 12
Das fände ich sehr bedenklich...  ;-)

von npn (Gast)


Lesenswert?

Lothar Miller schrieb:
> Karl Heinz schrieb:
>> foo( 8 + 5 );
>> ...
>> hastvoid foo( int jkl )
>> {
>>   // jkl hat hier den Wert 12
> Das fände ich sehr bedenklich...  ;-)

Kommt aber fast hin ;-))

von Schiri (Gast)


Lesenswert?

Karl Heinz schrieb:
> Aber ich muss mich wundern. Du hast doch in deinem anderen Thread
> scheinbar die Danegger Erkennung/Entprellung am laufen? Was willst du
> denn noch mehr? Komfortabler und besser als das dort wirds nicht.

Richtig.
Der Aufruf über z.b.
1
debounce(IOPORT_B, BIT_1)
funktioniert ja auch.

Ich habe mich nur in der Übergabe der Makros verrant.

Denkbar wäre ja auch einfach:
1
#define tasterread          debounce(IOPORT_B, BIT_1)

von Felix P. (fixxl)


Lesenswert?

Um den Zustand eines Pins zu lesen, sollte jedenfalls nicht PORTB 
sondern PINB abgefragt werden.

von Peter D. (peda)


Lesenswert?

Schiri schrieb:
>           DelayMs(100);
>           DelayMs(100);

Was soll der Schwachsinn, ein Delay 2* mit der halben Zeit aufzurufen?

Das zeigt, daß man nicht mal eine µs über den geklauten Code nachgedacht 
hat. Dann kann man natürlich auch nicht erkennen, daß das die 
schlechteste Entprellung weltweit ist.

Tippe wenigstens 100+100 in den Taschenrechner ein, trage das Ergebnis 
bei Delay ein und lösche das Delay danach.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Peter Dannegger schrieb:
> Das zeigt, daß man nicht mal eine µs über den geklauten Code nachgedacht
> hat.

 LOL.
 Das kann einen schon bis zur Weißglut treiben, aber du bleibst sonst
 ziemlich cool, schlechter Tag heute ? ;-)

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.