Pages: [1]   Go Down
Author Topic: Überlaufprobleme umgehen  (Read 1008 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
God Member
*****
Karma: 11
Posts: 599
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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. smiley

Gruß Chris
Logged


Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21879
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Überlauf von was?
Grüße Uwe
Logged

Hamburg, Germany
Offline Offline
Sr. Member
****
Karma: 6
Posts: 291
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Offline Offline
God Member
*****
Karma: 11
Posts: 599
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged


Germany, Osnabrück
Offline Offline
God Member
*****
Karma: 30
Posts: 659
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
//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);
}
« Last Edit: January 11, 2013, 04:01:45 am by Jomelo » Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21879
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
God Member
*****
Karma: 11
Posts: 599
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sorry. Es geht mir um den zeitlichen Überlauf.

Danke, Jomelo.

Gruß Chris
Logged


Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21879
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
God Member
*****
Karma: 11
Posts: 599
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged


Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21879
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: January 12, 2013, 11:50:52 am by uwefed » Logged

Offline Offline
God Member
*****
Karma: 11
Posts: 599
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Super! Danke. smiley

Gruß Chris
Logged


Pages: [1]   Go Up
Jump to: