Taster & AD-Wandler entprellen

#1569910
Lesenswert?

Hallo!

Brauche Eure Hilfe.. Komme einfach nicht weiter....

Zuerst habe ich eine entprellung mit einem Taster ausprobiert und danach 
mit einem AD-Wandler, doch irgendwie funktioniert es nicht richtig...

Beim AD-Wandler habe ich einen Neigungssensor angeschlossen und mit dem 
entprellen möchte ich die picks ausfiltern...

Besten Dank für Eure Hilfe

Grüssli
Blaze
1
/************************************************************************/
2
/*Teste entprellen*/
3

4
unsigned char Taste_S2()
5
{
6
  unsigned char i;
7
  unsigned char taste = 0;
8

9
  for (i=0; i<200; i++)
10
  {
11
    ClrWdt();                // Watchdog Reset
12
    taste = PORTAbits.RA4;          // Taste einlesen
13
    
14
    if(taste != taste_entprellt)      // Stimmt neuer Wert mit dem letzten überein?
15
    {  
16
      taste_entprellt = taste;      // Kopieren
17
      i= 0;                // Mit der Entprellung neu beginnen
18
    }
19
  }
20
  return taste_entprellt;            // Zurück mit der entprellten Taste
21
}
22

23
/************************************************************************/
24
/*AD Wandler entprellen*/
25

26
void ReadAD()
27
{
28
  unsigned char i;  
29
  ConvertADC();                     // Start conversion
30
  while( BusyADC() );               // Wait for completion
31

32
  for (i=0; i<100; i++)
33
  {
34
    ClrWdt();                // Watchdog Reset    
35
    AD_Wert = ReadADC();             // Read result
36

37
    if(AD_Wert != AD_Wert_entprellt)    // Stimmt neuer Wert mit dem letzten überein?
38
    {  
39
      AD_Wert_entprellt = AD_Wert;    // Kopieren
40
      i= 0;                // Mit der Entprellung neu beginnen
41
    }
42
  }
43
}
Gast #1569934
Lesenswert?

und was funktioniert nicht???????????
und wo ist dein Programm???

200 mal den gleichen AD Wert lesen ohne den Wandler neu zu starten ist 
sowieso Käse,
zum anderen wen du 200 Mal misst wird mit Sicherheit nicht 200x der 
gleche Wert rauskommen
#1569976
Lesenswert?

Meine Idee:

Ich möchte Neigungen anzeigen, bin aber immer noch fleissig am Lernen..
1
void Grad()
2
{
3
  if (AD_Wert < 7000)
4
    Momentan_Grad = -6;
5
  
6
  if (AD_Wert > 7001 && AD_Wert < 8000)
7
    Momentan_Grad = -5;
8

9
  if (AD_Wert > 8001 && AD_Wert < 9000)
10
    Momentan_Grad = -4;
11

12
  if (AD_Wert > 9001 && AD_Wert < 10000)
13
    Momentan_Grad = -3;
14

15
  if (AD_Wert > 10001 && AD_Wert < 11000)
16
    Momentan_Grad = -2;
17

18
  if (AD_Wert > 11001 && AD_Wert < 12000)
19
    Momentan_Grad = -1;
20

21
  if (AD_Wert > 12001 && AD_Wert < 13000)
22
    Momentan_Grad = 0;
23

24
  if (AD_Wert > 13001 && AD_Wert < 14000)
25
    Momentan_Grad = 1;
26

27
  if (AD_Wert > 14001 && AD_Wert < 15000)
28
    Momentan_Grad = 2;
29

30
  if (AD_Wert > 15001 && AD_Wert < 16000)
31
    Momentan_Grad = 3;
32

33
  if (AD_Wert > 16001 && AD_Wert < 17000)
34
    Momentan_Grad = 4;
35

36
  if (AD_Wert > 17001 && AD_Wert < 18000)
37
    Momentan_Grad = 5;
38

39
  if (AD_Wert > 18001)
40
    Momentan_Grad = 6;
41
  
42
}
Persönliche Seite #1570100
Lesenswert?

Du könntest der ReadAD einen Rückgabewert mitgeben, der zeigt, ob die 
Messung im Spannungsbereich für -20° bis +20° Neigung war:
1
// Willkürliche Werte, weil Datenblatt nicht vorhanden
2
#define ULIMIT  1234
3
#define OLIMIT 23456
4
#define ANZAHL_VERSUCHE 42
5

6
unsigned char ReadAD(void)
7
{
8
  unsigned int summe = 0;
9
  unsigned int mittel = 0;
10
  unsigned char versuche = ANZAHL_VERSUCHE;
11

12
  do
13
  {
14
    versuche -= 1;
15
    ConvertADC();            // Start conversion
16
    while( BusyADC() );      // Wait for completion
17
    ClrWdt();                // Watchdog Reset    
18
    summe += ReadADC();      // Read result
19
    mittel = summe / (ANZAHL_VERSUCHE - versuche);
20
  } while ( versuche && ((mittel < ULIMIT) || (mittel > OLIMIT)) );
21

22
  if ( versuche )
23
    AD_Wert = mittel;  
24
 
25
  return versuche;
26
}

Testanwendung:
1
#include ...
2

3
unsigned int AD_Wert;
4
char Momentan_Grad;
5

6
int main(void)
7
{
8
  while(1)
9
  {
10
    if( ReadAD() )      // Nur wenn AD_Wert innerhalb +-20°
11
    {
12
       Grad();          // AD_Wert in Momentan_Grad umrechnen
13
       Grad_anzeigen(); // und Momentan_Grad anzeigen
14
    }
15
  }
16
}

Mir gefällt das mit dem Aufaddieren nicht besonders. Man will doch eher 
den Momentanwert haben und keinen gemittelten Wert oder?

Statt

  unsigned int summe = 0;
  ...
  summe += ReadADC();      // Read result
  mittel = summe / (ANZAHL_VERSUCHE - versuche);

würde man dann

  mittel = ReadADC();      // Read result

schreiben. summe könnte man ganz weglassen.
#1570233
Lesenswert?

Und über diese Geschichte
1
 if (AD_Wert > 7001 && AD_Wert < 8000)
2
    Momentan_Grad = -5;
3

4
  if (AD_Wert > 8001 && AD_Wert < 9000)
5
    Momentan_Grad = -4;
6

7
  if (AD_Wert > 9001 && AD_Wert < 10000)
8
    Momentan_Grad = -3;
9

10
  if (AD_Wert > 10001 && AD_Wert < 11000)
11
 ...

sollte man auch noch einmal reden

* welches ist eigentlich die Neigung bei einem Messwert von genau 9000?
* für den hier angegebenen Zusammenhang wird dir ja wohl noch eine 
Formel einfallen.
#1571258
Lesenswert?

Wau vielen Dank für Eure Tipps, hat mir wirklich sehr geholfen...
Jetzt funktioniert es so wie ich es mir vorgestellt habe...

Danke Namensvetter :-)

Betreff diesem Code...
1
 if (AD_Wert > 7001 && AD_Wert < 8000)
2
    Momentan_Grad = -5;

Hättest Du eine Bessere Variante??

hätte es mit der Funktion Case lösen wollen, aber funktionierte nicht 
wirklich....

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