Portpins dauerhaft abfragen

Gast #2661502
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?
Gast #2661520
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.
Moderator (Firma: Titel) Persönliche Seite #2661529
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...  ;-)
#2661628
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.