Go Down

Topic: Überlaufprobleme umgehen (Read 1 time) previous topic - next topic

Chris72622

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

Gruß Chris
https://github.com/jeffThompson/DarkArduinoTheme

uwefed

Überlauf von was?
Grüße Uwe

markbee

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.
XBee blog: http://lookmanowire.blogspot.com/

Chris72622

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
https://github.com/jeffThompson/DarkArduinoTheme

Jomelo

#4
Jan 11, 2013, 09:44 am Last Edit: Jan 11, 2013, 10:01 am by Jomelo Reason: 1
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:

Code: [Select]

//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);
}

uwefed

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

Chris72622

Sorry. Es geht mir um den zeitlichen Überlauf.

Danke, Jomelo.

Gruß Chris
https://github.com/jeffThompson/DarkArduinoTheme

mkl0815


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.

uwefed



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

Chris72622

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
https://github.com/jeffThompson/DarkArduinoTheme

uwefed

#10
Jan 11, 2013, 11:00 pm Last Edit: Jan 12, 2013, 05:50 pm by uwefed Reason: 1
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

Chris72622

https://github.com/jeffThompson/DarkArduinoTheme

Go Up