Forum: Mikrocontroller und Digitale Elektronik 3ms Filter für Digitaleingänge


von Owen S. (senmeis)


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

von Bertram S. (bschall)


Lesenswert?

Timer Interrupt das Polling der Eingänge betreibt... da blockt dann nix!

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Interrupt auf 1ms stellen, in 3 aufeinanderfolgenden ISRs den Zustand 
prüfen, wenn stabil, dann Vorgang auslösen.

von manateemoo (Gast)


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
{

von Owen S. (senmeis)


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
}

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.