Forum: Mikrocontroller und Digitale Elektronik Portpins dauerhaft abfragen


von Benulba (Gast)


Lesenswert?

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?

von Uwe (Gast)


Lesenswert?

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.

von Onkel Peter (Gast)


Lesenswert?

dann kann dein controller aber nichts anderes mehr machen, als Taster 
abfragen...

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


Lesenswert?

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...  ;-)

von Falk B. (falk)


Lesenswert?

Siehe Multitasking

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Hat der Atmega162 eigentlich keinen Pin-Change-Interrupt?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Simon H. (simi)


Lesenswert?

@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
Noch kein Account? Hier anmelden.