Hallo Community, ich habe eine Frage bezüglich der dauerhaften Abfrage einzelner Pins. Ich benutze den Atmega162, mit 4 Tastern an 4 unterschiedlichen Pins. Ich frage den Flankenwechsel nun über while-Schleifen ab. BSP: while(!(taster_stop==1)) { taster = pineinlesen(); if(taster==0 && taster_alt==1) { Funktion(); taster_stop=1; } taster_alt = taster; } Alle Taster/Pins werden so abgefragt. Jetzt ergibt sich allerdings ja das Problem, dass die Abfragen nur nacheinander ausgeführt werden und nicht gleichzeitig. Jede Abfrage erfolgt in main. Hat jemand einen Vorschlag, wie ich das ändern könnte?
Dann lies doch alle Taster Parallerl ein ! Wenn sie auf untreschiedlichen Ports sind dann ließ sie nacheinander ein und kopier sie in ein Register und werte am ende das Register aus.
dann kann dein controller aber nichts anderes mehr machen, als Taster abfragen...
Benulba schrieb: > Hat jemand einen Vorschlag, wie ich das ändern könnte? Dann musst du deine Funktion() so programmieren, dass sie in kleinen schrittweisen Häppchen abgearbeitet werden kann und nicht den Programmablauf für 500ms aufhält. Das Stichwiort dazu ist "Zustandsautomat". Und jetzt kannst du bei einer erkannten Flanke am Tasterpin in diesem Automaten "einen Schritt weiterschalten" und das nächste Aufgabenhäppchen bearbeiten. Wenn du die Durchlaufzeit der Hauptschleife (es ist ja eine Schleife, weil sie dauernd durchlaufen wird) unter z.B. 50ms hältst, dann meint der Benutzer, das du "sofort" reagierst. Das ist der Trick, so funktioniert auch Windows... ;-)
Benulba schrieb: > Ich frage den Flankenwechsel nun über while-Schleifen ab. Und um da mal ganz konkret zu werden: Genau da liegt dein Problem. Hier > while(!(taster_stop==1)) > { > das Problem, dass die Abfragen nur nacheinander ausgeführt werden und > nicht gleichzeitig. Genau gleichzeitig muss auch nicht sein. Ein paar Nanosekunden Differenz tun keinem weh. > Hat jemand einen Vorschlag, wie ich das ändern könnte? Das Problem ist, dass du deine Denkweise ändern musst. Du musst weg von der Denkweise mache solange wie, und danach machst du dieses und jenes hin zu einer ereignisgesteuerten Sichtweise. (Eine Statemaschine ist auch nichts anderes als eine ereignisgesteuerte Sichtweise, nur eben in einer Orgtanisationsform, die sich bewährt hat) Was ist eine Ereignisgesteuerte Sichweise? Es ist genau das, was wir tagtäglich im realen Leben machen. Keine Hausfrau stellt sich eine halbe Stunde an den Herd und bleibt dabei stehen um dem Wasser beim Kochen zuzusehen nur um dann, wenn sie mit Kochen fertig ist, sich 2 Stunden zur Waschmaschine zu setzen um der Trommel beim Drehen zuzusehen. Wie machen wir solche Dinge im realen Leben 'gleichzeitig'? Wir machen das, indem wir nicht auf die Beendigung der Vorgänge warten sondern ständig von einem Vorgang zum nächsten 'hüpfen'. Dort sehen wir uns die Sache an, entscheiden ob es etwas zu tun gibt und wenn ja dann wird das gemacht. Weiter gehts zum nächsten Vorgang. while( 1 ) { // Hauptschleife blick zum Herd - ist er eingeschaltet? Nein - schalte ihn ein Ja - kocht das Wasser? Ja - gib die Nudeln rein Nein - keine Aktion notwendig Blick zur Waschmaschine - ist die eingeschaltet Nein - einschalten Ja - Ist Waschmittel drinnen? Ja - Wäsche drinnen? Programm auswählen und starten Nein - gib die Wäsche hinein Ist das Programm fertig durchgelaufen? Nein - keine Aktion notwendig Ja - hole die Wäsche heraus Blick zum Baby - schläft es? Ja - atmet es noch? Ja - keine Aktion notwendig Nein - Notarzt anrufen Nein - schreit es? Ja - Schnuller geben Nein - spielt es? Ja - keine Aktion notwendig Nein - Spielzeug geben } und so geht das immer Reihum. Bei jedem Durchgang wird ein mögliches Ereignis nach dem anderen geprüft und je nachdem auf das Ereignis reagiert. Aber: nirgends wird gewartet. Es wird weder darauf gewartet, dass das Nudelwasser kocht noch dass die Waschmaschine fertig ist. Und so schaffen wir es 3 Dinge mehr oder weniger gleichzeitig zu tun. Wobei dein µC da noch viel besser drann ist, weil er nicht dauernd hin und herrennen muss und ausserdem die 'Checkliste' viele Tausend mal in der Sekunde abarbeiten kann.
@Karl Heinz Buchegger Das ist ja mal eine coole Erklärung ereignisorientierten Programmierens! Gefällt mir!!
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.