Sketch lässt Setup immer wieder neu starten [gelöst]

Hi zusammen :slight_smile:

Ich bin gerade ein wenig ratlos: folgender Sketch, den ich stückchenweise aufgebaut habe und bei dem ich mich nun an die finale Zusammensetzung aller Programm-Komponenten machen wollte, zeigt auf einmal ein komisches Verhalten:

  • das Setup wird nicht verlassen, sondern immer wieder neu gestartet
  • die Loop-Hauptschleife wird nicht erreicht

Das Ganze soll auf einem Nano (Mega328P) laufen.
Angeschlossen ist zu Testzwecken im Moment nichts, nur Nano am PC .

hier der Sketch:

const byte HALL[2]  =  { 3, 2};             // Hallsensoren an Interrupt-Pins
volatile unsigned long RPM_Count[2];        // Hallsense-Count
volatile unsigned long RPM_T2[2];           // Timer2 für RPM - hall detection
unsigned long RPM_T1[2];                    // Timer1 für RPM
unsigned int RPM[0];                       // Drehzahl U/min

const byte PUMP[2] = { 9, 10};              // PWM-Pins (Timer 0) für Pumpen (via D4184) 
const byte VALVE[2] = { 7, 8};              // Ventile zum Ablassen (HIGH = geschlossen)
const byte LED[2] = { 6, 5};                // Output-Pins für LEDs (FR120N)

const byte CTRL[2] = { A0, A1};             // Control-Pins für START/DRAIN
const byte LEVEL[2] = { A5, A4};            // Pins für Pegelschalter

byte index;
byte pumpval[2];                            // PWM-Variablen für die Pumpen
unsigned int rpmupdate = 250;               // alle X ms neue RPM bestimmen
unsigned long rpmupdatetimer;


void setup() {
  Serial.begin(9600);
  Serial.println("SETUP...");
  // Setup Inputs & Outputs
  TCCR1B = TCCR1B & 0b11111000 | 0x01;        // PWM-Frequenz für Timer1
  for (index = 0; index < 2; index++) {
    pinMode(HALL[index],  INPUT);
    pinMode(CTRL[index],  INPUT_PULLUP);
    pinMode(LEVEL[index], INPUT_PULLUP);
    pinMode(PUMP[index],  OUTPUT);
    digitalWrite(PUMP[index], LOW);
    pinMode(VALVE[index],  OUTPUT);
    digitalWrite(VALVE[index], LOW);
    pinMode(LED[index],   OUTPUT);
    digitalWrite(LED[index],  LOW);
  }
  attachInterrupt(digitalPinToInterrupt(HALL[0]), RPM_Meter_A, FALLING);    // Interrupt0 bei fallender Flanke auf Pin3
  attachInterrupt(digitalPinToInterrupt(HALL[1]), RPM_Meter_B, FALLING);    // Interrupt0 bei fallender Flanke auf Pin2

  rpmupdatetimer = millis();
  Serial.println("START...");
}

void loop() {
  getRpm();
  for (index = 0; index < 2; index++) {
    if (RPM[index] > 100) {
      digitalWrite(LED[index], HIGH);
    } else {
      digitalWrite(LED[index], LOW);
    }
  }
}


void getRpm() {
  // ermittle Drehzahlen U/min
  if ((millis()-rpmupdatetimer) > rpmupdate) {
    for (index = 0; index < 2; index++) {
      if (RPM_T2[index] > RPM_T1[index]) {
        RPM[index] = (unsigned)(long)(30000 * RPM_Count[index] / (RPM_T2[index] - RPM_T1[index]));
        RPM_T1[index] = RPM_T2[index];
        RPM_Count[index] = 0;
      }
      else {
        RPM[index] = 0;
      }
      Serial.print  ("Drehzahl[");
      Serial.print  (index);
      Serial.print  ("]: ");
      Serial.print  (RPM[index]);
      Serial.print  (" U/min");
      Serial.print  ("\t");
    }
    Serial.println();
    rpmupdatetimer = millis();
  }
}



void RPM_Meter_A () {
  RPM_Count[0]++;
  RPM_T2[0] = millis();
}

void RPM_Meter_B () {
  RPM_Count[1]++;
  RPM_T2[1] = millis();
}

und die Fehlermeldung vom Compiler:

Der Sketch verwendet 3062 Bytes (9%) des Programmspeicherplatzes. Das Maximum sind 30720 Bytes.
Globale Variablen verwenden 273 Bytes (13%) des dynamischen Speichers, 1775 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.

habe ich meine Pins falsch deklariert? Habe ich dadurch Speicherprobleme bekommen?
Irgendein blöder Fauxpas, den ich übersehe? :sweat_smile:

Kannst Du mal erklären, was das sein soll? Du greifst auf dieses Array ja auch zu ( mit Index 0 und 1 ). Damit schreibst Du ins undefinierte -> Absturz möglich.

Welche?

Bei mir eine Warnung:

C:\Users\User\AppData\Local\Temp\arduino_modified_sketch_55780\Test_Forum.ino: In function 'void setup()':
C:\Users\User\AppData\Local\Temp\arduino_modified_sketch_55780\Test_Forum.ino:24:19: warning: suggest parentheses around arithmetic in operand of '|' [-Wparentheses]
   TCCR1B = TCCR1B & 0b11111000 | 0x01;        // PWM-Frequenz für Timer1
                   ^
Der Sketch verwendet 3062 Bytes (9%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.
Globale Variablen verwenden 273 Bytes (13%) des dynamischen Speichers, 1775 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.

Das sieht merkwürdig aus:

unsigned int RPM[0];                       // Drehzahl U/min

Nur Zweiter :roll_eyes:

OMG.. der Wald und die Bäume! :see_no_evil:

Ihr habt natürlich vollkommen Recht... da muss ne 2 rein! :scream:

Geht auch sofort schon wieder! Vielen Dank dafür!

Was bedeutet die Warnung? Sollte ich da etwas anders machen?

..aber genauso wertvoll :wink:

Bei mir noch eine zweite:
E:\Programme\arduino\portable\sketchbook\sketch_mar29c\sketch_mar29c.ino:14:6:

E:\Programme\arduino\portable\sketchbook\sketch_mar29c\sketch_mar29c.ino:14:6: 
 warning: built-in function 'index' declared as non-function [-Wbuiltin-declaration-mismatch]
   14 | byte index;
      |      ^~~~~

Warum sind magische Zahlen als böse anzusehen?
Darum!

Du sollst dich eindeutig ausdrücken!
Die Meldung sagt nur: Dass der Kompiler evtl. was anderes macht, als du erwartest.
Selbst eine mögliche Lösung steht schon in der Warnung mit drin.
Einfach mal lesen, das Ding.

void RPM_Meter_A () {
  RPM_Count[0]++;
  RPM_T2[0] = millis();
}

heißt das dass du einige Count hast aber die Zeit nur seit letzten? macht das Sinn? wenn du sowieso eine Verzögerung eingebaut hast, kannst du dort die Zeit abtasten und durch Count teilen.

Ok, die Vorschläge bei den Warnung verstehe ich nur bedingt bzw gar nicht:

Hier möchte er wohl nur eine Klammer um eine der beiden bitwise-operationen?

diese Warnung bekomme ich gar nicht.. fehlt mir noch ein Häkchen bei den Voreinstellungen in der IDE?

Der Schnipsel zur Drehzahlermittlung ist aus dem Netz und hat für mich gut funktioniert.
..Bei genauerer Betrachtung nach deinem Hinweis, verstehe ich aber hoffentlich worauf du hinauswillst und glaube, ich werde das überarbeiten. Auf die Weise könnte ich 4 long-variablen (RPM_T2[2] und RPM_T1[2]) einsparen, richtig?

In der ide 1.8.19 und 1.8.15 gibts da keine Meldung. Und es sind ale Haken gesetzt. :wink:

das besprechen wir im anderen Tread, falls es Probleme gibt.

Ich nutze eine modernere Tool Chain.
Und habe dazu noch weitere Warnungen aktiviert.

Und trotzdem ist sie (die Warnung) leicht zu vermeiden.
Wenn man(hier du) sich an die gewöhnliche for Schleifen Schreibweise anpassen würdest.
Selbst ein einfaches umbenennen würde helfen, aber nicht den Stil "verbessern"

Dank für den Trost.

Du kennst doch "Punkt- vor Strichrechnung", das ist die Thematik. Die Reihenfolge ist hier ja durchaus wichtig.

Nein.

Mich stört die globale Festlegung von index, wo Du diese Variable doch nur lokal verwendest, wenn ich es richtig überblicke. Besser fände ich dies, aber mit einem anderen Variablennamen:

for (byte index = 0; index < 2; index++) {

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.