Forum: Compiler & IDEs Entprellung die 1000ste


von prellung (Gast)


Lesenswert?

vorweg: BITTE NICHT ERSCHIESSEN!

Ich weiß es gibt etliche threads dazu. Also was macht einer mehr :O)

AAlso ich habe da mal was vorbereitet:
---
1
void CheckPinState(void)
2
{
3
  if ((!(PINB & (1<<PB5))) && (PinState == 0)) //wenn Taster gedrückt
4
  {
5
    TCNT1 = 0; // Timer starten      
6
    PinState = 1;
7
  }
8
  else if (PINB & (1<<PB5)) // wenn Taste losgelassen
9
  {    
10
    PinState = 0;
11
  }
12
  else if ((PinState == 1) && (TCNT1 >= 97)) //Wenn Taste nach 5ms noch immer gedrückt
13
  {
14
    counter++;
15
    PinState = 2;
16
  }
17
}
---

Worum gehts: Eine einfache (SEHR einfache) Prellroutine die ich in 
meiner Main starte um meine Tasten zu entprellen. Der Unterschied zu 
anderen Routinen ist das ich eben kein Delay sondern einen Timer 
benutze. Man könnte sicher hingehen und das auch noch über Interrupts 
machen aber so funktioniert es schon einmal. Nun zu der Frage aller 
Fragen: Funktioniert meine Routine grade zufällig oder ist irgendwo ein 
Fehler versteckt den ich garnicht durchschaue? Letztendlich wird für 
eine variable "Entprellzeit" über Timer geprüft ob ein Signal anliegt.

Ich frage deswegen weil ich in verschiedenen Threads von Herrn 
Danneger-EntprellGURU gelesen habe das viele Routinen eben zufällig oder 
nur projektbasiert funktionieren. Ist dies hier ebenfalls der Fall?



Danke und Gruß
prellung

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

prellung schrieb:

> Ich frage deswegen weil ich in verschiedenen Threads von Herrn
> Danneger-EntprellGURU gelesen habe das viele Routinen eben zufällig oder
> nur projektbasiert funktionieren. Ist dies hier ebenfalls der Fall?

projektbasiert würde ich unterschreiben.

Deine Entprellung benutzt den Timer1 und sie benutzt ihn so, dass er zu 
sonst fast nichts mehr benutzbar ist.
PeDas Entprellung ist von der Sorte: wenn du sowieso schon einen Timer 
im System hast, der regelmässig ISR Aufrufe auslöst, dann kann der die 
Enptrellung auch noch gleich mitmachen. Die rutscht praktisch überall 
noch mit rein.

Zum anderen entprellt PeDas Entprellung nicht nur das Niederdrücken 
sondern auch das Loslassen eines Tasters. Ein Punkt der hier überhaupt 
nicht vor kommt.

Ich wüsste keinen Grund, wenn ich sowieso schon einen Timer benutze, 
warum ich die PeDa Entprellung nicht nehmen sollte. Und umgekehrt: wenn 
ich noch keinen Timer benutze, dann wäre die PeDa Entprellung ein Grund 
das zu tun.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

prellung schrieb:
> Funktioniert meine Routine grade zufällig oder ist irgendwo ein
> Fehler versteckt den ich garnicht durchschaue?

Wenn Du sie selber schon nicht durchschaust, wie soll das dann ein 
anderer?
Es stimmt, if-else Monster sind wirklich schlecht zu durchschauen.

Du versucht ja offensichtlich eine Statemaschine zu erstellen, dann 
schreibe es auch als eine:
1
enum{
2
      IRGENDWAS,
3
      IRGEDWIE,
4
      NOCHNSTATE,
5
};
6
7
  switch( PinState ){
8
    case IRGENDWAS:
9
// usw.

Eine Funktion funktioniert auch nicht im luftleeren Raum.
Wenn sie jemand verstehen soll, mußt Du auch den Kontext hinschreiben, 
in dem sie aufgerufen wird (Main-Loop).

Und wenn eine Funktion etwas an den Aufrufer zurückliefern soll, ist ein 
void denkbar ungeeignet.
Globale Variablen nimmt man nur, wenn es nicht anders geht.

: Bearbeitet durch User
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.