Millis() wird "rückgesetzt" bei mcp-Aufruf

Hallo Community,

für die Modellbahnsteuerung verwende ich einen MEGA 2560 mit drei Portextender MCP23017 über IIC für die Ansteuerung und Rückmeldung von Weichenantrieben.
Jeweils Port A0..A7 als Ausgänge/Ansteuerung und Port B0..B7 als Rückmeldung.
Gleichzeitig benötige ich die Modellzeit für diverse Steuerungen und für einen Watchdog.
Bei dem abgespeckten Code anbei (alles hab ich nicht rausgeschmissen) begibt es sich, dass jeweils nach ca. 30s der Wert für "Modellzeit = millis()" auf 0 zurückgesetzt wird!
(Hierfür lasse ich mir den Wert Probehalber auf den Seriellen Monitor anzeigen..)
Nach einigen Minuten (ca. 10 .. 15min) hängt sich das Progamm dann auf.
Ich verstehe nicht, wieso der millis()-Wert zurückgesetzt wird!?
Über den delay-Wert kann man die Sekunden, bis die Rücksetzung erfolgt, steuern... :angry:
Ich hoffe, ich habe alle wesentlichen Kriterien zum Problem reingeschrieben.
Vielleicht kann mir jemand helfen....

Grüße, Torsten.

// Test der Weichenansteuerung und -Rückmeldung über IIC für das Modul Bahnhof-West
// 3 Portextender und hex20  bis 22
// jeweils 2 WA5 angesteuert,
// Ports A0..A7 Ansteuerung Rotlage/Grünlage einzeln
// Ports B0..A7 Rückmedlung Rotlage/Grünlage einzeln

#include "Wire.h"
#include "Adafruit_MCP23X17.h"

Adafruit_MCP23X17 mcp1;
Adafruit_MCP23X17 mcp2;
Adafruit_MCP23X17 mcp3;

const int ledPin =  LED_BUILTIN;            // the number of the LED pin

// Variable für Stellungsmeldung der Weichen, initialisiert mit false = 0 
bool W1_RL = false;                         // Abfrage Weiche 1, Weiche 4 läuft immer mit
bool W1_GL = false;                         // 
bool W3_RL = false;                         // Abfrage Weiche 3, Weiche 2 läuft immer mit
bool W3_GL = false;                         // 
bool W5_RL = false;                         // Abfrage Weiche 5
bool W5_GL = false;                         // Abfrage Weiche 5
bool W6_RL = false;                         // Abfrage Weiche 6
bool W6_GL = false;                         // 
bool W7_RL = false;                         // Abfrage Weiche 7
bool W7_GL = false;                         // 
bool W8_RL = false;                         // Abfrage Weiche 5
bool W8_GL = false;                         // Abfrage Weiche 5
bool W9_RL = false;                         // Abfrage Weiche 5
bool W9_GL = false;                         // Abfrage Weiche 5
bool W10_RL = false;                        // Abfrage Weiche 1, Weiche 4 läuft immer mit
bool W10_GL = false;                        // 
bool W11_RL = false;                        // Abfrage Weiche 5
bool W11_GL = false;                        // Abfrage Weiche 5
bool W12_RL = false;                        // Abfrage Weiche 3, Weiche 2 läuft immer mit
bool W12_GL = false;                        // 
bool W13_RL = false;                        // Abfrage Weiche 6
bool W13_GL = false;                        // 
bool W14_RL = false;                        // Abfrage Weiche 14
bool W14_GL = false;                        // 

byte WA1_2 = 0b01010101;                    // Variable zum Senden an portexpander 0x20, WA1/2 sind Weichen 5, 8, 9 und 11, 1 bedeutet kein Ausgnagssignal
byte WA3_4 = 0b01010101;                    // Variable zum Senden an portexpander 0x21, WA3/4 sind Weichen 1-4, 7 und 7, 1 bedeutet kein Ausgnagssignal
byte WA5_6 = 0b01010101;                    // Variable zum Senden an portexpander 0x22, WA5/6 sind Weichen 10, 12, 13 und 14, 1 bedeutet kein Ausgnagssignal
byte RM_WA1_2;                              // Variable zur Rückmeldung der Weichenstellung
byte RM_WA3_4;
byte RM_WA5_6;

// sonstige Variable
int ledState = LOW;                         // ledState used to set the LED for watchdog
unsigned long previousMillis = 0;           // will store last time LED was updated
int interval = 1000;                        // interval at which to blink (milliseconds) the watchdog
unsigned long Modellzeit;
int gesendeterWert = 0;

void setup() {

  pinMode(ledPin, OUTPUT);

// I2C-Bus aktivieren und Ports definieren
  mcp1.begin_I2C(0x20);                     // definiere bei Portexpander mit Adresse hex20 Ports A0 bis A7 als Ausgänge und B0 bis B7 als Eingänge
    for (int i=0;i<8;i++)              
    mcp1.pinMode(i, OUTPUT);
    mcp1.writeGPIOA(WA1_2);                 // Vorbelegung für die Ausgänge, 1 bedeutet Ausgang nicht gesetzt
    WA1_2 = 0b11111111;
    for (int i=8;i<16;i++)              
    mcp1.pinMode(i, INPUT_PULLUP);

  mcp2.begin_I2C(0x21);                     // definiere bei Portexpander mit Adresse hex20 Ports A0 bis A7 als Ausgänge und B0 bis B7 als Eingänge
    for (int i=0;i<8;i++)              
    mcp2.pinMode(i, OUTPUT);
    mcp2.writeGPIOA(WA3_4);
    WA3_4 = 0b11111111;
    for (int i=8;i<16;i++)              
    mcp2.pinMode(i, INPUT_PULLUP);

  mcp3.begin_I2C(0x22);                     // definiere bei Portexpander mit Adresse hex20 Ports A0 bis A7 als Ausgänge und B0 bis B7 als Eingänge
    for (int i=0;i<8;i++)              
    mcp3.pinMode(i, OUTPUT);
    mcp3.writeGPIOA(WA5_6);
    WA5_6 = 0b11111111;
    for (int i=8;i<16;i++)              
    mcp3.pinMode(i, INPUT_PULLUP);

  Serial.begin(9600);  
}

// Ansteuerung Weichen erster Portexpander, Beispiel
void set_W5_RL(){
  bitClear(WA1_2, 0);                       // ursprünglich auf 1 --> kein Ausgangssignal
  mcp1.begin_I2C(0x20);                     // Kommunikation mit hex20
  mcp1.writeGPIOA(WA1_2);                   // Schreibe die aktuelle Belegung für die Ausgänge Bank A, O bedeutet Ausgang gesetzt
  delay(200);
  bitSet(WA1_2, 0);                         // wieder auf 1 setzen --> kein Ausgnagssignal
  mcp1.writeGPIOA(WA1_2);                   // Schreibe die aktuelle Belegung für die Ausgänge Bank A, O bedeutet Ausgang gesetzt
}
void set_W5_GL(){
  bitClear(WA1_2, 1);                       // ursprünglich auf 1 --> kein Ausgangssignal
  mcp1.begin_I2C(0x20);                     // Kommunikation mit hex20
  mcp1.writeGPIOA(WA1_2);                   // Schreibe die aktuelle Belegung für die Ausgänge Bank A, O bedeutet Ausgang gesetzt
  delay(200);
  bitSet(WA1_2, 1);                         // wieder auf 1 setzen --> kein Ausgnagssignal
  mcp1.writeGPIOA(WA1_2);                   // Schreibe die aktuelle Belegung für die Ausgänge Bank A, O bedeutet Ausgang gesetzt
}

// Ansteuerung Weichen zweiter Portexpander, Beispiel
void set_W1_RL(){
  bitClear(WA3_4, 0);                       // ursprünglich auf 1 --> kein Ausgangssignal
  mcp2.begin_I2C(0x21);                     // Kommunikation mit hex21
  mcp2.writeGPIOA(WA3_4);                   // Schreibe die aktuelle Belegung für die Ausgänge Bank A, O bedeutet Ausgang gesetzt
  delay(200);
  bitSet(WA3_4, 0);                         // wieder auf 1 setzen --> kein Ausgnagssignal
  mcp2.writeGPIOA(WA3_4);                   // Schreibe die aktuelle Belegung für die Ausgänge Bank A, O bedeutet Ausgang gesetzt
}
void set_W1_GL(){
  bitClear(WA3_4, 1);                       // ursprünglich auf 1 --> kein Ausgangssignal
  mcp2.begin_I2C(0x21);                     // Kommunikation mit hex21
  mcp2.writeGPIOA(WA3_4);                   // Schreibe die aktuelle Belegung für die Ausgänge Bank A, O bedeutet Ausgang gesetzt
  delay(200);
  bitSet(WA3_4, 1);                         // wieder auf 1 setzen --> kein Ausgnagssignal
  mcp2.writeGPIOA(WA3_4);                   // Schreibe die aktuelle Belegung für die Ausgänge Bank A, O bedeutet Ausgang gesetzt
}
void set_W3_RL(){
  bitClear(WA3_4, 2);                       // ursprünglich auf 1 --> kein Ausgangssignal
  mcp2.begin_I2C(0x21);                     // Kommunikation mit hex21
  mcp2.writeGPIOA(WA3_4);                   // Schreibe die aktuelle Belegung für die Ausgänge Bank A, O bedeutet Ausgang gesetzt
  delay(200);
  bitSet(WA3_4, 2);                         // wieder auf 1 setzen --> kein Ausgnagssignal
  mcp2.writeGPIOA(WA3_4);                   // Schreibe die aktuelle Belegung für die Ausgänge Bank A, O bedeutet Ausgang gesetzt
}
void set_W3_GL(){
  bitClear(WA3_4, 3);                       // ursprünglich auf 1 --> kein Ausgangssignal
  mcp2.begin_I2C(0x21);                     // Kommunikation mit hex21
  mcp2.writeGPIOA(WA3_4);                   // Schreibe die aktuelle Belegung für die Ausgänge Bank A, O bedeutet Ausgang gesetzt
  delay(200);
  bitSet(WA3_4, 3);                         // wieder auf 1 setzen --> kein Ausgnagssignal
  mcp2.writeGPIOA(WA3_4);                   // Schreibe die aktuelle Belegung für die Ausgänge Bank A, O bedeutet Ausgang gesetzt
}

// Ansteuerung Weichen dritter Portexpander, Beispiel
void set_W10_RL(){
  bitClear(WA5_6, 0);                       // ursprünglich auf 1 --> kein Ausgangssignal
  mcp3.begin_I2C(0x22);                     // Kommunikation mit hex22
  mcp3.writeGPIOA(WA5_6);                   // Schreibe die aktuelle Belegung für die Ausgänge Bank A, O bedeutet Ausgang gesetzt
  delay(200);
  bitSet(WA5_6, 0);                         // wieder auf 1 setzen --> kein Ausgnagssignal
  mcp3.writeGPIOA(WA5_6);                   // Schreibe die aktuelle Belegung für die Ausgänge Bank A, O bedeutet Ausgang gesetzt
}
void set_W10_GL(){
  bitClear(WA5_6, 1);                       // ursprünglich auf 1 --> kein Ausgangssignal
  mcp3.begin_I2C(0x22);                     // Kommunikation mit hex22
  mcp3.writeGPIOA(WA5_6);                   // Schreibe die aktuelle Belegung für die Ausgänge Bank A, O bedeutet Ausgang gesetzt
  delay(200);
  bitSet(WA5_6, 1);                         // wieder auf 1 setzen --> kein Ausgnagssignal
  mcp3.writeGPIOA(WA5_6);                   // Schreibe die aktuelle Belegung für die Ausgänge Bank A, O bedeutet Ausgang gesetzt
}

// Stellen der Weichenstraßen, Beispiel
void set_G1_NS(){
  if (W1_RL){
    set_W1_GL();
    delay(500);                             // kurzen Zeitversatz bis zur nächsten Weiche
  }
  if (W3_RL){
    set_W3_GL();
    delay(500);
  }
}

void loop() {

//Watchdog
  Modellzeit = millis();
  if (Modellzeit - previousMillis >= interval) {
    previousMillis = Modellzeit;
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }
    digitalWrite(ledPin, ledState);
    Serial.print("aktuelle Zeit:   ");
    Serial.println(Modellzeit);
  }
  delay(100);
//Rücklesen der Weichenstellung
  mcp1.begin_I2C(0x20);                     // Kommunikation mit hex20
  RM_WA1_2 = mcp1.readGPIOB();              // lies die Belegung der Eingänge der Bank B
  W5_GL = !bitRead(RM_WA1_2, 0);            // bitweise Zuordnung
  W5_RL = !bitRead(RM_WA1_2, 1);
  W8_GL = !bitRead(RM_WA1_2, 2);
  W8_RL = !bitRead(RM_WA1_2, 3);
  W9_GL = !bitRead(RM_WA1_2, 4);
  W9_RL = !bitRead(RM_WA1_2, 5);
  W11_GL = !bitRead(RM_WA1_2, 6);
  W11_RL = !bitRead(RM_WA1_2, 7);

  mcp2.begin_I2C(0x21);                     // Kommunikation mit hex21
  RM_WA3_4 = mcp2.readGPIOB();              // lies die Belegung der Eingänge der Bank B
  W1_GL = !bitRead(RM_WA3_4, 0);            // bitweiese Zuordnung
  W1_RL = !bitRead(RM_WA3_4, 1);
  W3_GL = !bitRead(RM_WA3_4, 2);
  W3_RL = !bitRead(RM_WA3_4, 3);
  W6_GL = !bitRead(RM_WA3_4, 4);
  W6_RL = !bitRead(RM_WA3_4, 5);
  W7_GL = !bitRead(RM_WA3_4, 6);
  W7_RL = !bitRead(RM_WA3_4, 7);

  mcp3.begin_I2C(0x22);                     // Kommunikation mit hex22
  RM_WA5_6 = mcp3.readGPIOB();              // lies die Belegung der Eingänge der Bank B
  W10_GL = !bitRead(RM_WA5_6, 0);           // bitweiese Zuordnung
  W10_RL = !bitRead(RM_WA5_6, 1);
  W12_GL = !bitRead(RM_WA5_6, 2);
  W12_RL = !bitRead(RM_WA5_6, 3);
  W13_GL = !bitRead(RM_WA5_6, 4);
  W13_RL = !bitRead(RM_WA5_6, 5);
  W14_GL = !bitRead(RM_WA5_6, 6);
  W14_RL = !bitRead(RM_WA5_6, 7);

}

eher unwahrscheinlich.
Gib mal in dein Setup eine Printausgabe hinein, ob es eventuell zu einem Restart kommt.

ansonsten deuten "ca 30" Sekunden manchmal auch auf die falsche Verwendung von einer int Variable hin, ... sehe ich aber momentan nicht.

Verstehe ich leider nicht.
Wie erstelle ich eine zusätzliche Printausgabe, die mir einen Restart anzeigt?
Mit dem seriellen Print der Modellzeit sehe ich das sekundenweise hochzählen bis 30000ms und dann geht es bei ca. 1000ms wieder los....

Ähmm..
Vielleicht: Hinschreiben!

void setup() {
  Serial.begin(9600);// am Anfang - dafür am Ende löschen
  Serial.println(F("Programmstart")); // irgend was eindeutiges
  pinMode(ledPin, OUTPUT);

mach mal aus

int interval = 1000; 

ein

unsigned long interval  = 1000; 
1 Like

außerdem meldet der Kompiler:

C:\Daten\myrepository\Arduino\Forum no SVN\sketch_oct06a\sketch_oct06a.ino: In function 'void loop()':
C:\Daten\myrepository\Arduino\Forum no SVN\sketch_oct06a\sketch_oct06a.ino:174:35: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if (Modellzeit - previousMillis >= interval) {
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~

mach aus deinem interval ein unsigned!
Und schalte die Kompiler Warnings ein.

1 Like

naja, am Interval hatte ich schon geschraubt. Bringt keine Änderung/Lösung.
Ist ja auch nur eine "Differenz".

Aber der Hinweis mit dem Serial.Println(Progammstart) ist gut! Danke schon mal. Alle ca. 30 Sekunden ein Programmstart.... ?

Wodurch wird der ausgelöst????

Kurzschuß? oder Überlastung des Netzteils. = Spannungseinbruch und dadurch automatischer Reset.

Schaltest Du was nach 30 Sekunden Ein / Aus?

Grüße Uwe

Mein Rat:
Unbedingt auf bessere Einrückungen konzentrieren!

Netzteil oder Kurzschluss ist es nicht, Schalten tue ich nichts.
Ist auch egal, ob MEGA in der Anlage mit externer Spannungsversorgung oder ein anderer MEGA am Schreibtisch direkt am USB-Port. Immer das selbe nachvollziehbare Verhalten!
Ja, Einrückungen fehlen hier. Ist aber leider nicht das Problem...
Immerhin seit über einer Stunde kein Totalabsturz...

Schaut im seriellen Monitor übrigens so aus:

Also wird nicht millis() zurückgesetzt sondern das gesamte Programm!
(sorry, ich wusste nicht, dass ich im Setup schon was ausgeben kann...)

Soll/muss man die Überschrift ändern?

Hallo,

ohne alles zu kennen, wenn sich millis nullt, dann resetet sich dein Controller. Das liegt zu 99,9% an der Spannungsversorgung. 0,1% kann falsche Programmierung sein. Fehlende Interrupt Routine (ISR) für eine die mittels einem Bit in einem Register enabled wurde. Oder solche Scherze. Bist du dir sicher das du mit deinen Ausgängen nichts schaltest? Relais? Servos? Irgendwas muss ja passieren. Sonst gebe es keinen Reset.

Übrigens, die mcp Initialisierung mittels begin/init macht man einmalig im setup(). Das muss man nicht immer wieder neu aufrufen.

Dir geht der Speicher aus.

Dein Sketch unverändert:

aktuelle Zeit:   1044
aktuelle Zeit:   2054
aktuelle Zeit:   3064
aktuelle Zeit:   4074
aktuelle Zeit:   5085
aktuelle Zeit:   6094
aktuelle Zeit:   7105
aktuelle Zeit:   8115
aktuelle Zeit:   9125
aktuelle Zeit:   10135
aktuelle Zeit:   11146
aktuelle Zeit:   12155
aktuelle Zeit:   13166
aktuelle Zeit:   14176
aktuelle Zeit:   15186
aktuelle Zeit:   16196
aktuelle Zeit:   17207
aktuelle Zeit:   18216
aktuelle Zeit:   19227
aktuelle Zeit:   20237
aktuelle Zeit:   21248
aktuelle Zeit:   22257
aktuelle Zeit:   23268
aktuelle Zeit:   24278
aktuelle Zeit:   25288
aktuelle Zeit:   26298
aktuelle Zeit:   27309
aktuelle Zeit:   28318
aktuelle Zeit:   29328
aktuelle Zeit:   30339
aktuelle Zeit:   31349
Start....

Meine Änderung:

void loop()
{
  //Watchdog
  Modellzeit = millis();
  if (Modellzeit - previousMillis >= interval)
  {
    previousMillis = Modellzeit;

    if (ledState == LOW)
    {
      ledState = HIGH;
    }
    else
    {
      ledState = LOW;
    }
    digitalWrite(ledPin, ledState);
    Serial.print("aktuelle Zeit:   ");
    Serial.println(Modellzeit);
  }

  //** delay(100);
  //Rücklesen der Weichenstellung
  RM_WA1_2 = mcp1.readGPIOB();              // lies die Belegung der Eingänge der Bank B
  W5_GL = !bitRead(RM_WA1_2, 0);            // bitweise Zuordnung
  W5_RL = !bitRead(RM_WA1_2, 1);
  W8_GL = !bitRead(RM_WA1_2, 2);
  W8_RL = !bitRead(RM_WA1_2, 3);
  W9_GL = !bitRead(RM_WA1_2, 4);
  W9_RL = !bitRead(RM_WA1_2, 5);
  W11_GL = !bitRead(RM_WA1_2, 6);
  W11_RL = !bitRead(RM_WA1_2, 7);
  RM_WA3_4 = mcp2.readGPIOB();              // lies die Belegung der Eingänge der Bank B
  W1_GL = !bitRead(RM_WA3_4, 0);            // bitweiese Zuordnung
  W1_RL = !bitRead(RM_WA3_4, 1);
  W3_GL = !bitRead(RM_WA3_4, 2);
  W3_RL = !bitRead(RM_WA3_4, 3);
  W6_GL = !bitRead(RM_WA3_4, 4);
  W6_RL = !bitRead(RM_WA3_4, 5);
  W7_GL = !bitRead(RM_WA3_4, 6);
  W7_RL = !bitRead(RM_WA3_4, 7);
  RM_WA5_6 = mcp3.readGPIOB();              // lies die Belegung der Eingänge der Bank B
  W10_GL = !bitRead(RM_WA5_6, 0);           // bitweiese Zuordnung
  W10_RL = !bitRead(RM_WA5_6, 1);
  W12_GL = !bitRead(RM_WA5_6, 2);
  W12_RL = !bitRead(RM_WA5_6, 3);
  W13_GL = !bitRead(RM_WA5_6, 4);
  W13_RL = !bitRead(RM_WA5_6, 5);
  W14_GL = !bitRead(RM_WA5_6, 6);
  W14_RL = !bitRead(RM_WA5_6, 7);
}

Die Ausgabe....

Start....
aktuelle Zeit:   1000
aktuelle Zeit:   2000
aktuelle Zeit:   3000
aktuelle Zeit:   4000
aktuelle Zeit:   5000
aktuelle Zeit:   6000
aktuelle Zeit:   7000
aktuelle Zeit:   8000
aktuelle Zeit:   9000
aktuelle Zeit:   10000
aktuelle Zeit:   11000
aktuelle Zeit:   12000
aktuelle Zeit:   13000
aktuelle Zeit:   14000
aktuelle Zeit:   15000
aktuelle Zeit:   16000
aktuelle Zeit:   17000
aktuelle Zeit:   18000
aktuelle Zeit:   19000
aktuelle Zeit:   20000
aktuelle Zeit:   21000
aktuelle Zeit:   22000
aktuelle Zeit:   23000
aktuelle Zeit:   24000
aktuelle Zeit:   25000
aktuelle Zeit:   26000
aktuelle Zeit:   27000
aktuelle Zeit:   28000
aktuelle Zeit:   29000
aktuelle Zeit:   30000
aktuelle Zeit:   31000
aktuelle Zeit:   32000
aktuelle Zeit:   33000
aktuelle Zeit:   34000
aktuelle Zeit:   35000
aktuelle Zeit:   36000
aktuelle Zeit:   37000
aktuelle Zeit:   38000
aktuelle Zeit:   39000
aktuelle Zeit:   40000
aktuelle Zeit:   41000
aktuelle Zeit:   42000
aktuelle Zeit:   43000
aktuelle Zeit:   44000
aktuelle Zeit:   45000
aktuelle Zeit:   46000
aktuelle Zeit:   47000
aktuelle Zeit:   48000
aktuelle Zeit:   49000
aktuelle Zeit:   50000
aktuelle Zeit:   51000
aktuelle Zeit:   52000
aktuelle Zeit:   53000
aktuelle Zeit:   54000
aktuelle Zeit:   55000
aktuelle Zeit:   56000
aktuelle Zeit:   57000
aktuelle Zeit:   58000
aktuelle Zeit:   59000
aktuelle Zeit:   60000
aktuelle Zeit:   61000
aktuelle Zeit:   62000
aktuelle Zeit:   63000
aktuelle Zeit:   64000
aktuelle Zeit:   65000
aktuelle Zeit:   66000
aktuelle Zeit:   67000
aktuelle Zeit:   68000
aktuelle Zeit:   69000
aktuelle Zeit:   70000
aktuelle Zeit:   71000
aktuelle Zeit:   72000
aktuelle Zeit:   73000
aktuelle Zeit:   74000
aktuelle Zeit:   75000
aktuelle Zeit:   76000
aktuelle Zeit:   77000
aktuelle Zeit:   78000
aktuelle Zeit:   79000
aktuelle Zeit:   80000
aktuelle Zeit:   81000
aktuelle Zeit:   82000
aktuelle Zeit:   83000
aktuelle Zeit:   84000
aktuelle Zeit:   85000
aktuelle Zeit:   86000
aktuelle Zeit:   87000
aktuelle Zeit:   88000
aktuelle Zeit:   89000
aktuelle Zeit:   90000
aktuelle Zeit:   91000
aktuelle Zeit:   92000
aktuelle Zeit:   93000
aktuelle Zeit:   94000
aktuelle Zeit:   95000
aktuelle Zeit:   96000
aktuelle Zeit:   97000
aktuelle Zeit:   98000
aktuelle Zeit:   99000
aktuelle Zeit:   100000
aktuelle Zeit:   101000
aktuelle Zeit:   102000
aktuelle Zeit:   103000
aktuelle Zeit:   104000
aktuelle Zeit:   105000
aktuelle Zeit:   106000
aktuelle Zeit:   107000
aktuelle Zeit:   108000
aktuelle Zeit:   109000
aktuelle Zeit:   110000
aktuelle Zeit:   111000
aktuelle Zeit:   112000
aktuelle Zeit:   113000
aktuelle Zeit:   114000
aktuelle Zeit:   115000
aktuelle Zeit:   116000
aktuelle Zeit:   117000
aktuelle Zeit:   118000
aktuelle Zeit:   119000
aktuelle Zeit:   120000
aktuelle Zeit:   121000
aktuelle Zeit:   122000
aktuelle Zeit:   123000
aktuelle Zeit:   124000
aktuelle Zeit:   125000
aktuelle Zeit:   126000
aktuelle Zeit:   127000
aktuelle Zeit:   128000
aktuelle Zeit:   129000
aktuelle Zeit:   130000
aktuelle Zeit:   131000
aktuelle Zeit:   132000
aktuelle Zeit:   133000
aktuelle Zeit:   134000
aktuelle Zeit:   135000
aktuelle Zeit:   136000
aktuelle Zeit:   137000
aktuelle Zeit:   138000
aktuelle Zeit:   139000
aktuelle Zeit:   140000
aktuelle Zeit:   141000
aktuelle Zeit:   142000
aktuelle Zeit:   143000
aktuelle Zeit:   144000
aktuelle Zeit:   145000
aktuelle Zeit:   146000
aktuelle Zeit:   147000
aktuelle Zeit:   148000
aktuelle Zeit:   149000
aktuelle Zeit:   150000
aktuelle Zeit:   151000
aktuelle Zeit:   152000
aktuelle Zeit:   153000
aktuelle Zeit:   154000
aktuelle Zeit:   155000
aktuelle Zeit:   156000
aktuelle Zeit:   157000
aktuelle Zeit:   158000
aktuelle Zeit:   159000
aktuelle Zeit:   160000

Den int für das intervall solltest Du auf unsigned int stellen und vor allem ein const draus machen. Dann geht auch die Warnung weg.

//Edit:
Noch als Nachtrag: Du hast das selbe Problem bei deinen Weichenansteuerungen! Nach einigen 1000 Schaltungen läuft Dir der Speicher voll.
Leider reicht mir die Zeit nicht mehr, aber Dein Code gehört dringend überarbeitet um die ganzen Codekopien zu entfernen.

2 Likes

Hallo,
@my_xy_projekt
Danke für den Hinweis auf den Speicher! Bisher hatte ich nach dem kompilieren/übertragen immer genügend Platz (3%, 5%). Muss ich mir aber mal genauer anschauen!
Denn ganz verstehe ich Deinen Einwurf nicht. Ich habe Variable definiert (bool), die ich immer wieder neu einlese oder belege. Das erhöht doch den Speicherbedarf nicht, oder doch?
Das Thema mit dem "Interval" ist klar und geändert (war am Anfang ein const long). Somit ist die Warnung weg! (lasse ich mir jetzt auch anzeigen :wink:)
@Doc_Arduino
Mit der mcp-Initialisierung arbeite ich das erste Mal in diesem Umfang. Ich dachte, ich muss den entsprechenden IIC-Teilnehmer immer neu ansprechen mit mcp.begin ....
Bzgl. Spannungsversorgung: wie schon geschrieben, schalte ich derzeit noch gar nichts. Und auch wenn ein MEGA ohne jede externe Beschaltung am PC hängt, zeigt das Programm das gleiche Verhalten. Aber vielleicht liegt es wirklich an der mehrmalige mcp-Initialisierung!
Kenn ich leider erst heute Abend testen...

Ja, liegt daran. Jedesmal wird weiterer Speicher reserviert. Und irgendwann ist kein Speicher mehr vorhanden. -> Reset

Mit jedem mcpX.begin(y) wird neuer Speicher für die Klasse belegt!

Tausche den loop einfach aus. Und lösche die anderen mcp.begin() aus den anderen Funktionen.
Nur einmal im setup() aufrufen!

Und bis heute abend kürze ich Dir das mal ein :slight_smile:

1 Like

Danke!!!
Das klingt sehr (!!) logisch. Habe nicht gewusst, dass ich mit jedem mcp.begin einen neuen Speicher belege! Ich dachte, ich spreche den Teilnehmer nur an... Aber das sind auch Rudimente meiner etwas erratischen Herangehensweise...
Wieder was gelernt! (hoffe ich...)

1 Like

Der Weg in die Hölle ist mit falschen Annahmen gepflastert!

Einfach mal "hineinschauen" kann solche Fallen vermeiden helfen: Adafruit-MCP23017-Arduino-Library/src/Adafruit_MCP23XXX.cpp at master · adafruit/Adafruit-MCP23017-Arduino-Library · GitHub

reingeschaut und gelesen sehr wohl, verstanden wohl eher nicht...