Forum: Mikrocontroller und Digitale Elektronik Flankenerkennung bzw. Flankenzählen


von Marco (Gast)


Lesenswert?

Hi,

zunächsteinmal, ich bin Anfänger in Sachen Microcontroller. Wir haben in 
der Schule die Aufgabe bekommen das Prellen eine Tasters mit einem uC 
ohne externen Interrupt, sprich im Polling Betrieb auf einem LCD 
auszugeben. D.h. es sollen die steigenden und fallenden Flanken gezählt 
werden beim drücken eines Tasters. Leider hab ich keine Ahnung wie das 
zu bewerkstelligen ist und bitte somit euch um Hilfe.

Grüße Marco

von troll (Gast)


Lesenswert?

In regelmäßigen Abständen den Pin abfragen. Pinwechsel 0->1 heisst es 
gab eine steigende Flanke und umgekehrt. Entweder wirklich per Schleife 
oder Timerinterrupt.

von Marco (Gast)


Lesenswert?

D.h. ich nehme mir eine for-Schleife und frage in dieser dann erst eine 
Flanke von 0->1 ab, wenn diese Flanke erkannt wurde wird auf eine 1->0 
abgefragt. Ist das so korrekt?
Wann springe ich dann in diese for-Schleife? Beim ersten Tastendruck 
oder läuft diese Schleife ununterbrochen?

von Clemens S. (zoggl)


Lesenswert?

du hast eine while schleife, in der fragst du den taster ab. wenn sich 
etwas ändert, aktualisierst du den LCD(*) und wenn du damit fertig bist, 
gehst du wieder in die while schleife.

(*) sofern dieser nicht dauerhaft beschrieben werden muss.

welche HW hast du im einsatz?

von Clemens S. (zoggl)


Lesenswert?

in schönstem pseudo C:
1
while(1)
2
{
3
   if (pin_vorher != pin jetzt )
4
    {
5
6
    if (pin= 1)
7
     {
8
     steigende flanken ++
9
     }
10
    else
11
     {
12
     fallende flanken ++
13
     }
14
    pin vorher = pin jezt
15
    LCD aktualisieren(neue werte)
16
    }
17
18
}

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Marco schrieb:
> D.h. ich nehme mir eine for-Schleife und frage in dieser dann erst eine
> Flanke von 0->1 ab, wenn diese Flanke erkannt wurde wird auf eine 1->0
> abgefragt. Ist das so korrekt?
Nicht ganz.
Es gibt in einem uC-Programm eine einzige Schleife, die laufend 
ausgeführt wird: die Hauptschleife.
Abhängig von irgendwelchen Ereignissen werden von dort aus Zweige des 
Programms aufgerufen. Aber in keinem dieser Zweige wird auf irgendwas 
gewartet, sondern, wenn irgendwas noch nicht fertig ist (z.B. RS232 
Puffer noch nicht frei), wird der Zweig sofort wieder beendet und mit 
der Hauptschleife weitergemacht.
Bei brauchbarer Programmauslegung dauert dann so ein 
Hauptschleifendurchlauf maximal 10-50ms. So dass schlimmstenfalls mit 
einer Verzögerung von 1/20..1/100 Sekunde z.B. auf eine Benutzereingabe 
reagiert wird.

von Karl H. (kbuchegg)


Lesenswert?

Marco schrieb:
> D.h. ich nehme mir eine for-Schleife und frage in dieser dann erst eine
> Flanke von 0->1 ab, wenn diese Flanke erkannt wurde wird auf eine 1->0
> abgefragt. Ist das so korrekt?

Du "fragst keine Flanke ab".

Du hast Variablen. Und in Variablen kann man sich Werte speichern. Zb 
Werte, die man von einem Port einliest. Und wenn man die sich in einer 
Variablen speichert, dann kann man nach dem nächsten mal Einlesen 
vergleichen, ob sich der Wert verändert hat
1
   Variable = Wert_vom_Port;
2
3
   while( 1 ) {
4
5
     eingelesner_Wert = Wert_vom_Port;
6
7
     if( Variable != eingelesener_Wert ) {
8
       
9
       da hat sich was getan. Jetzt liefert der Eingang
10
       plötzlich einen anderen Wert als im Schleifendurchlauf
11
       zuvor
12
13
     }
14
15
     // den diesmal eingelesenen Wert in der Variablen wegspeichern
16
     // damit dieser Wert nach dem nächsten Port abfragen damit
17
     // verglichen werden kann
18
19
     Variable = eingelesener_Wert
20
   }

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.