3ms Filter für Digitaleingänge

OP #1394651
Lesenswert?

Servus,

ich möchte einen 3ms Filter für Digitaleingänge im AVR einbauen. Wie 
kann das effizient gemacht werden? Man kann hier einfach 3ms warten, um 
zu sehen, ob der Eingangswert stabil ist, aber der Prozess wird 
blockiert. Vielleicht nur mit Interrupts?

Danke
Senmeis
Gast #1394683
Lesenswert?

Simples Digitalfilter aber auch 3ms delay:
1
void ISR_all_300us(void)
2
{
3
  if ( true == InPort() )
4
  {
5
    if ( 10 > Ctr )  Ctr++;
6
    if ( 10 == Ctr) Result = true;
7
  }
8
  else
9
  {
10
    if ( 0 < Ctr )  Ctr--;
11
    if ( 0 == Ctr) Result = false;
12
  }
13
}

Bei einfachen Anwendungen wie Tasten einlesen reicht:
1
void ISR_all_3ms(void)
2
{
3
  Result = InPort();
4
{
OP #1406846
Lesenswert?

Wie wär mit diesem Code?
1
uint8_t di, di_old, digital_input;
2
ISR_1ms()
3
{
4
    if (di != di_old)  // Wert aktualisieren
5
    {
6
       di_old = di;
7
       counter = 1;
8
    }
9
    else
10
    {
11
       if (counter == 4)  // 3ms erreicht
12
       {  
13
         digital_input = di;  // neuen Digitaleingang melden
14
         counter = 0;
15
       }
16
       else
17
       {
18
          if (counter != 0)  // Ist ein Änderung vorgekommen?
19
          counter ++;
20
       }
21
    }
22
}

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