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
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.
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?
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?
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 | } |
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.