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
Timer Interrupt das Polling der Eingänge betreibt... da blockt dann nix!
Interrupt auf 1ms stellen, in 3 aufeinanderfolgenden ISRs den Zustand prüfen, wenn stabil, dann Vorgang auslösen.
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 | {
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.