Go Down

Topic: Zeitmessung Interrupt gesteuert (Read 1 time) previous topic - next topic

michael_x

Quote from: combie
Warum sollte man das tun wollen?
Wenn man RAM und FLASH für etwas anderes braucht?

Nur um eine Zahl 0 .. 59 in einen Text "00" .. "59" zu wandeln, kann sprintf viel zu viel.

Aber, wenn der Speicherplatz es erlaubt, wäre es am falschen Ende gespart. Da gebe ich dir Recht.
Dann bliebe noch "sportlicher Ehrgeiz" als Grund.

noiasca

#16
Nov 13, 2019, 09:38 pm Last Edit: Nov 13, 2019, 09:41 pm by noiasca
sehe ich ähnlich.
Wenn man sprintf sonst nicht braucht ist es für eine zweistellige Ausgabe zu mächtig.

hab mal rasch die angesprochenen Varianten reingeklopft.
Ich finde meinen Ansatz nach Tommys Ausbesserung nicht so verkehrt
(außer es schlagt wieder irgend ein Optimierer zu).

Werte auf auf einem Uno-Bootloader mit 1.8.10

  v1_legacy();      // Flash 2590 / RAM 209
  v2_noiasca();     // Flash 2532 / RAM 209
  v3_michael();     // Flash 2548 / RAM 207
  v4_michael();     // Flash 2548 / RAM 207
  v5_sprintf();     // Flash 3836 / RAM 229

Code: [Select]

//https://forum.arduino.cc/index.php?topic=646046.0

#define tleer if(t<10)Serial.print(" ");Serial.print(t);
#define tnull if(t<10)Serial.print("0");Serial.print(t);

uint8_t tag = 0;
uint8_t monat = 0;
uint16_t jahr = 0;
uint8_t stunde = 0;
uint8_t minute = 0;
uint8_t sekunde = 0;

void setup()
{
  Serial.begin(115200);
  randomSeed(analogRead(A0));
  // Zeit simulieren
  tag = random(1,32);
  monat = random(1,12);
  jahr = random(1942, 2050);
  stunde = random(1,24);
  minute = random(1,60);
  sekunde = random(1,60);

  v1_legacy();      // Flash 2590 / RAM 209
  //v2_noiasca();     // Flash 2532 / RAM 209
  //v3_michael();     // Flash 2548 / RAM 207
  //v4_michael();     // Flash 2548 / RAM 207
  //v5_sprintf();     // Flash 3836 / RAM 229
}

void loop() {

}

void v1_legacy()                    // 9.08.1988   12:41:39
{
  int t;
  t = tag;            // Tag
  tleer
  Serial.print(".");
  t = monat;          // Monat
  tnull
  Serial.print(".");
  Serial.print(jahr, DEC); // Jahr
  Serial.print("   ");
  t = stunde;           // Stunde
  tleer
  Serial.print(":");
  t = minute;         // Minute
  tnull
  Serial.print(":");
  t = sekunde;         // Sekunde
  tnull
  Serial.println();
}

void printNo(byte myValue, byte option = 0)
{
  if (myValue < 10) // müsste für negative Zahlen erweitert werden
  {
    if (option == 0)
      Serial.print("0");
    else
      Serial.print(" ");
  }
  Serial.print(myValue);
}

void v2_noiasca()                    // 9.08.1988   12:41:39 //
{
  printNo(tag, 1);
  Serial.print(".");
  printNo(monat);
  Serial.print(".");
  Serial.print(jahr, DEC); // Jahr
  Serial.print("   ");
  printNo(stunde, 1);
  Serial.print(":");
  printNo(minute);
  Serial.print(":");
  printNo(sekunde);
  Serial.println();
}
//

inline void v3_tnull(byte val) {
  if (val < 10) Serial.write('0');
  Serial.print(val);
}

inline void v3_tleer(byte val) {
  if (val < 10) Serial.write(' ');
  Serial.print(val);
}

void v3_michael()
{
  v3_tleer(tag);
  Serial.print(".");
  v3_tnull(monat);
  Serial.print(".");
  Serial.print(jahr, DEC); // Jahr
  Serial.print("   ");
  v3_tleer(stunde);
  Serial.print(":");
  v3_tnull(minute);
  Serial.print(":");
  v3_tnull(sekunde);
  Serial.println();
}

void v4_printNo(int myValue, byte digits, char fuell = ' ')
{
  if (myValue >= 0)  { // müsste für negative Zahlen erweitert werden
    while (--digits >= 5) Serial.write(fuell);                             
    while (digits) {
      switch (digits) {
        case 4: if (myValue < 10000) Serial.write(fuell); break;
        case 3: if (myValue < 1000) Serial.write(fuell); break;
        case 2: if (myValue < 100) Serial.write(fuell); break;
        case 1: if (myValue < 10) Serial.write(fuell); break;
      }
      digits--;
    }
  }
  Serial.print(myValue);
}

void v4_michael()                    // 9.08.1988   12:41:39 //
{
  v4_printNo(tag, 2);
  Serial.print(".");
  v4_printNo(monat, 2, '0');
  Serial.print(".");
  Serial.print(jahr, DEC); // Jahr
  Serial.print("   ");
  v4_printNo(stunde, 2);
  Serial.print(":");
  v4_printNo(minute, 2, '0');
  Serial.print(":");
  v4_printNo(sekunde, 2, '0');
  Serial.println();
}

void v5_sprintf()
{
  char logString[22];
  sprintf(logString,"%2d.%02d.%02d   %2d:%02d:%02d",tag, monat, jahr, stunde, minute, sekunde);
  Serial.println(logString);
}
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

MicroBahner

Wenn man sprintf sonst nicht braucht ist es für eine zweistellige Ausgabe zu mächtig.
Und wo ist das Problem? Die meisten Lib's können viel mehr, als man davon braucht. Trotzdem schreibt man nicht alles selbst.
Ich würde sowas immer zuerst mit sprintf machen. Erst wenn der Sketch an die Grenzen von Flash und/oder Ram kommt, muss man ans Optimieren denken. Und bei den meisten Programmen, die ich hier so sehe, kann man da erstmal an anderen Stellen anfangen.
Was bringt es mir, wenn mein fertiger Sketch nur 60% oder 70% des Flash braucht? Wegen dem ungenutzten Flash wird nichts besser.
Gruß, Franz-Peter

WZ1

Leute, große Klasse, wie Ihr Euch um mich bemüht !! Ganz herzlichen Dank dafür.
Muss allerdings gestehen, dass ich ein bisschen verwirrt bin von den ganz spezifischen Vorschlägen. Da bin ich einfach noch nicht tief genug drin um das alles zu verstehen.
So wie´s grad aussiht, hab ich eine funktionierende Zeitmessung hinbekommen. Ist an dieser Lösung was dabei, was irgendwann irgendwelche Störungen oder Probleme verursachen könnte ?

Dann war ja noch die Sache mit der schon vorhandenen Temperaturmessung, in die ich eigentlich die Zeitmessung einbauen wollte. Allerdings taktet die Temperaturmessung mit einem delay von 15 Sekunden, da passt jetzt meine Zeitmessung nicht so recht dazu. Sehr Ihr einen Lösungsansatz, den ich verfolgen könnte ? Oder wird´s darauf hinauslaufen, die Zeitmessung mit einem zweiten Arduino ganz unabhängig von der Temperaturmessung zu machen ?
Viele Grüße

postmaster-ino

Hi
Quote
Ist an dieser Lösung was dabei, was irgendwann irgendwelche Störungen oder Probleme verursachen könnte ?
Könnte?? Und dann noch IRGENDWANN??
... dann ist die Antwort: Ja

Dabei ist's egal, wie toll der Aufbau wird ... irgendwann ist lang und können kann immer passieren.

MfG
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

combie

#20
Nov 13, 2019, 10:35 pm Last Edit: Nov 13, 2019, 10:35 pm by combie
Das, was du suchst nennt sich wohl "Multitasking".
Wobei dann jede Task einen endlicher Automaten abbildet.

Ablaufsteuerung
Meine Standardantwort zu Ablaufsteuerungen:
Quote
Eine Stichworte Sammlung für Google Suchen:
Endlicher Automat,
State Machine,
Multitasking,
Coroutinen,
Ablaufsteuerung,
Schrittkette,
BlinkWithoutDelay, 
--
Blink Without Delay
Der Wachmann
--
Intervall Macro
Multitasking Macros
INTERVAL Ersatzstoff
CooperativeTask
Gefährlich, was Theorien aus Menschen machen können.
Schlimmer, was Menschen aus Theorien machen.

WZ1

Combie der Hinweis mit dem Wachmann war genial. Ich hab´s hinbekommen. Ganz herzlichen Dank auch an all die anderen und Eure Unterstützung.
Hier der betreffende Codeausschnitt:

Code: [Select]
void Zeitmessung() {
  taskBegin();
  //Zeitmessung
  state = digitalRead(2);
  if (state == HIGH && laststate == LOW)  // Pegelwechsel LOW => HIGH
  {
    SystemTimeStart = millis();
    Serial.print("Start ");
    DateTime now = rtc.now(); // RTC einlesen
    t = now.day();            // Tag
    tleer
    Serial.print(".");
    t = now.month();          // Monat
    tnull
    Serial.print(".");
    Serial.print(now.year(), DEC); // Jahr
    Serial.print("   ");
    t = now.hour();           // Stunde
    tleer
    Serial.print(":");
    t = now.minute();         // Minute
    tnull
    Serial.print(":");
    t = now.second();         // Sekunde
    tnull
    Serial.println();
  } else if (state == LOW && laststate == HIGH)    // Pegelwechsel HIGH => LOW
  {
    Time = (millis() - SystemTimeStart) / 1000;
    DateTime now = rtc.now(); // RTC einlesen
    Serial.print("Ende  ");
    t = now.day();            // Tag
    tleer
    Serial.print(".");
    t = now.month();          // Monat
    tnull
    Serial.print(".");
    Serial.print(now.year(), DEC); // Jahr
    Serial.print("   ");
    t = now.hour();           // Stunde
    tleer
    Serial.print(":");
    t = now.minute();         // Minute
    tnull
    Serial.print(":");
    t = now.second();         // Sekunde
    tnull
    Serial.println();

    //Ausgabe der Übertragungsdauer bei fallender Taktflanke
    Serial.print("Laufzeit: ");
    Serial.print(Time, 2);
    Serial.println(" s");
    Verbrauch = Time * 2.2 / 3600; // spezfischer Verbrauch 2.2 l/h
    Serial.print("Verbrauch: ");
    Serial.print(Verbrauch, 6);
    Serial.println(" l");
  }
  laststate = state;
  taskEnd();
}

void loop() {
  //Serial.println("Start Temperaturmessung");
  ii = 0;
  milltempo = millis();
  if (millis() > Pause * 1000) {
    for (int i = 0; i < AMOUNT_OF_ONEWIRE_INSTANCES; i++)
      setupSensorTemperature(sensors[i], totalDevs[i], allAddrses[i], i + 1, &ii);
    Zeitmessung();
  } else {
    Zeitmessung();
  }

}                     // void loop() - end



Viele grüße

Go Up