Strukturierung eines Projekts

Hallo,

nachdem ich nun mehrere Tutorials durchgearbeitet habe und mein erstes "großes" Projekt in Planung ist, stelle ich mir folgende Frage:

Wie baue ich zeitlich betrachtet einen Sketch auf, bei dem es rel. viel um zeitliche Abhängigkeiten geht?

Grundsätzlich gibt es ja mind. zwei Vorgehensweisen:

  1. Ich betrachte void loop() als Seite eines Buches, welche ich jeweils komplett erfasse. Sprich ich betrachte alles was in void loop() steht als zeitgleich.
    Somit wäre das Durchblättern des Buches die Zeitachse. Mit jedem Durchlaufen von void loop() erhöht sich die Seitenzahl +1.

  2. Ich betrachte das Durchlaufen von void loop() als Zeitachse (und springe ggf. innerhalb von void loop() via Schleifen o.ä.).

Da ich absoluter Anfänger bin, kann ich mir gut vorstellen, dass es noch viele weitere Varianten bzgl. der Strukturierung eines Projekts gibt.

Nun würde ich gerne folgendes wissen:

a) Gibt es weitere Varianten bzgl. der Strukturierung eines Projekts und falls ja, wie sehen diese aus?
b) Anhand welcher Kriterien entscheidet Ihr Euch für 1. oder 2. (oder X.)?

Hoffe, ich konnte meine u.U. etwas merkwürdig anmutenden Fragen genau genug stellen, um einigermaßen verstanden werden zu können.

Gruß Chris

Hallo,

die Frage ist was heist für dich Zeitlich relevant ?
Ziehst du viele Timer auf? also benutzt du viele Delays?
Oder soll das Programm nur schnellst möglich durchlaufen werden?
Ich Persönlich halte mich immer an die 2. Variante, wobei mir die 1. auch bisher so nicht bekannt war ( oder ich verstehe gerade nicht was du meinst).
Meines erachtens hast du garkeine Andere Chance, im Loop werden alle Programmzielen nacheinander abgearbeitet und dann z.B. ans Prozessausgangswort geschrieben.
Was soll es denn Grundlegend überhaupt werden?

Viele Grüße

K06-PI:
was heist für dich Zeitlich relevant ?

Wann welcher Knopf gedrückt wird oder wann welche LED angeht.

K06-PI:
Ziehst du viele Timer auf? also benutzt du viele Delays?

Bisher nutze ich noch gar nichts. Insbesondere die Nutzung von Delays bereitet mir Kopfzerbrechen, da diese Programmabläufe blockieren würden.

K06-PI:
Oder soll das Programm nur schnellst möglich durchlaufen werden?

Nein, natürlich geht es nicht darum, dass das Programm nur möglichst schnell durchlaufen wird.

K06-PI:
Was soll es denn Grundlegend überhaupt werden?

Das hier: http://arduino.cc/forum/index.php/topic,120840.0.html

Gruß Chris

Insbesondere die Nutzung von Delays bereitet mir Kopfzerbrechen, da diese Programmabläufe blockieren würden.

Da hast du das grundsätzliche Problem doch klar erfasst.

Dein Bild vom Buch umblättern seh ich zwar nicht ganz so, ( Eher ein HD Video, ohne die Auflösung, aber mit 100 Bildern/Sek :slight_smile:
Alles was nacheinander passiert, wird in späteren loop() Durchläufen gemacht.
Dass in einem loop() Durchlauf natürlich die einzelnen Ausgaben nacheinander gemacht werden, sollte man nicht unbedingt merken.
Die Reihenfolge innerhalb von loop() ist nur für lokale temporäre Variable ( Zwischenergebnisse etc. ) interessant.

Delays höchstens, um sich das Entprellen von Schaltern einfach zu machen.

Hallo,

vielen Dank für Deinen Beitrag.

Ich finde es sehr interessant, dass von den zwei Leuten die auf meine Fragen antworteten gleich Beide unterschiedlich vorgehen.

Du betrachtest ja auch die einzelnen Frames Deines "HD-Films" als Zeitachse.

Kannst Du mir blutigen Anfänger in kurzen Worten erklären, warum Delays das entprellen von Schaltern einfacher machen?

Fürs Entprellen gibt es doch div. feine Libraries. :slight_smile:

Gruß Chris

Beide unterschiedlich vorgehen

Ich hab Spass hier zu antworten, aber die gleiche Antwort zu wiederholen, kann ich mir -meist- verkneifen.

...warum Delays das entprellen von Schaltern einfacher machen?
Fürs Entprellen gibt es doch div. feine Libraries.

Wenn du dir es leisten kannst, nach einem Schalterzustandswechsel einfach (100µs ... 1 ms) zu warten, brauchst du keine Library, sondern bist schon fertig mit Entprellen. Wenn du mehrere Schalter hast, und alle pro loop nur einmal abfragst, brauchst du (z.B. am Ende der loop) nur einmal zu warten.
Falls die loop nach Taster-Lesen nicht sowieso noch 100 µs braucht.

"feine Libraries" sind sicher fein, bevor du die ganze Funktionalität nochmal neu erfindest, und gar alles in loop() unterbringst.
Aber

  • Arduino lädt schon genug Ballast mit, der "nie" gebraucht wird.
  • Im Zweifelsfall musst du doch wissen was und wie es gemacht wird, gerade wenn du viele Libraries kombinierst.

Da gab's gestern (?) erst eine Diskussion etwa "Why include <Button.h> ? What's wrong with digitalRead() ?"

Auf der anderen Seite, ob die 30kB Flash halb leer sind oder Sachen enthalten, auf die man auch verzichten könnte, die aber den Sketch eleganter aussehen lassen, was soll's ? Wir nehmen ja auch den Arduino und keinen ATTINY ohne Bootloader. So extrem minimalistisch wollen wir es doch nicht haben.

Erst einmal ist ja gut sich über sowas vorher Gedanken zu machen. Und die Denkrichtung ist auch richtig --> damit bist Du schon mal ein Fortgeschrittener. Echte Anfänger sind nicht einmal in der Lage die Frage zu verstehen bzw. zu stellen :wink:

Der Senso Clone macht mehrere Dinge gleichzeitig:

LEDs blinken,
Tasten abfragen,
Prüfen ob die Taten in gewissen Zeitintervallen gedrückt wurden
Töne ausgeben.

Ich würde sowas mit einer "Stateengine" aka. Zustandsmaschine / endlichem Automaten realisieren. Das ist wohl der Ansatz den Du mit "loop() ist sowas wie die Seite eines Buches" meinst.

Allerdings würde ich die Tasten nicht direkt in Loop abfragen sondern eher per Interrupt, aber es geht auch im Loop und ist am Anfang vieleicht einfacher.
Die Töne würde ich einfach per PWM ausgeben, damit wäre die erforderliche Parallelität eher gering (Tasten abfragen vs. Zustandsübergänge).

-Udo