Überlaufprobleme umgehen

Hallo,

ich programmiere momentan eine Art Mediensteuerung und habe diverse zeitkritische Komponenten im Code. Da das Ganze am Ende fest installiert und praktisch ununterbrochen laufen soll, stellt sich mir die Frage, was ich gegen sog. Überlaufprobleme machen kann.

Gerne einfach nur evtl. passende Links posten. Ich wühl mich dann durch. :slight_smile:

Gruß Chris

Überlauf von was?
Grüße Uwe

Wenn Du hardwarenah programmierst dürfte bei richtiger Strukturierung kein ungewollter Überlauf erfolgen.
Wenn Du allerdings bestimmte Arduino-Funktionen wie delay(), digitalWrite() benutzt, kannst Du sehr schnell Probleme bekommen, da diese im Gegensatz zur direkten Programmierung viele Taktzyklen verbrauchen.
Für zeitkritische Abläufe empfiehlt sich i.d.R. die Benutzung von Interrupts - generell würde ich die Register der MCU direkt beschreiben und auf den Arduino-Layer verzichten.
Ein Blick ins Atmel-Datenblatt ist da vielleicht ein erster Ansatzpunkt.

Hallo,

was meinst Du mit "direkter Programmierung". Bin Anfänger und arbeite bisher ausschließlich mit der Arduino IDE. Kann man mit ihr auch "direkt" programmieren. Hast Du mir evtl. eine Buchempfehlung?

Interrupts kann ich laut dem was ich darüber gelesen habe nicht nutzen, da mein Arduino nur zwei InterrupteingÄnge hat, ich jedoch mehr als zwei "Eingabekomponenten" (Taster) verbauen werde.

Gruß Chris

Direkte Programmierung => arbeiten mit Registern ohne das Arduino Framework.

Taster sollten nicht unbedingt an Interrupts angeschlossen werden, da die Interrupts dafür viel zu schade sind. (Der Interrupt Kontroller würde sich langweilen ;-))

So programmiert man Mikrocontroller allgemein/direkt, ohne Framework:

//2 Pins als Ausgang deklarieren und einen als Eingang 
DDRA = 0b00000011; // 6 Eingänge 2 Ausgänge

//den ersten Pin auf "High" setzen
PORTA |= (1 << PA0);
//den gleichen Pin auf "Low" setzen
PORTA &= ~(1 << PA0);

//überprüfen ob der Eingang gesetzt ist
if(PINA2) {
  //Ausgang setzen
  PORTA |= (1 << PA1);
} else {
  PORTA &= ~(1 << PA1);
}

Ich wiederhole meine Frage:
Von welchen Überlaufproblemen redest Du?
Grüße Uwe

Sorry. Es geht mir um den zeitlichen Überlauf.

Danke, Jomelo.

Gruß Chris

Chris72622:
Sorry. Es geht mir um den zeitlichen Überlauf.

Meinst Du damit das der millis() Zähler nach 59 Tagen überläuft? Das ist unkritisch, wenn man "richtig" herum rechnet:
Siehe hier: http://arduino.cc/forum/index.php/topic,85706.0.html
Die Frage, bzw. mit diesem Problem hab ich mich vor einiger Zeit auch schon beschäftigt.
Mario.

mkl0815:

Chris72622:
Sorry. Es geht mir um den zeitlichen Überlauf.

Meinst Du damit das der millis() Zähler nach 59 Tagen überläuft? Das ist unkritisch, wenn man "richtig" herum rechnet:
Siehe hier: http://arduino.cc/forum/index.php/topic,85706.0.html
Die Frage, bzw. mit diesem Problem hab ich mich vor einiger Zeit auch schon beschäftigt.
Mario.

Kleine Korrektur: millis() läuft nach ca 49,5 Tagen über (genaugesagt nach 4294967,295 Sekunden).
Wie Maio bereits sagte ist der Überlauf bei richtiger Differenzzeitberechnung unkritisch, solange nur 1 Überlauf stattfindet. Wenn mehr als ein Überlauf stattfindet (also der Zeitinterwall größer als ca 49,5 Tage ist) kann der Arduino nicht feststellen wieviele Überläufe stattgefunden haben und somit den Intervall nicht bestimmen.

Grüße Uwe

Danke für die Erklärungung.

Was kann man also unternehmen, damit es (auch nach über 50 Tagen) nicht zu solchen Problemen kommt?

Gruß Chris

Probleme hast Du nur wenn Du Intervalle haben willst, die länger als 49,5 Tage sind. Und falls das der Fall ist nimm eine RTC oder http://www.faludi.com/2007/12/18/arduino-millis-rollover-handling/.
Grüße Uwe

Super! Danke. :slight_smile:

Gruß Chris