Skip to content

delayMicroseconds() - crash #2240

@Gorkde

Description

@Gorkde

ESP12F

I'm working on a PWM Routine (not finished still in progress) which did crash for some reason (code#1).

unbenannt

Then I assumed it's too fast so I added delay(1) in the loop and no crash occured anymore (code#2).

Then I thought to make the delay smaller so I changed delay(1) to delayMicroseconds(100) and it did crash again.

So I changed delayMicroseconds(100) to delayMicroseconds(1000) which should be the same as delay(1) which didnt crash. But it does crash again with that! (code#3).

Code 1:

#include <ShiftRegister74HC595.h>

ShiftRegister74HC595 ShiftRegOut (1, 2, 4, 5); // Schieberegister Objekt erstellen (Anz. Register, Datenpin, Schiebetaktpin, Speichertaktpin (latch-pin)

void setup()
{
  Serial.begin(115200);
  ShiftRegOut.setAllLow();
}

void loop()
{
  FadeOutput(2, 0, 255, 4.16);
  delay(500);
  /*  FadeOutput(2, 255, 0, 1);
    delay(500);*/
}

int FadeOutput(int Pin, int StartWert, int EndWert, float Zeit)                                                 // Bei Fade 0-255 max. 4.195 Sek möglich
{
  if (StartWert < 0 || StartWert > 255 || EndWert < 0 || EndWert > 255 || StartWert == EndWert || Zeit > 4.195)  // Bei falscher Parameterübergabe Fehler zurückmelden
  {
    return (-1);
    Serial.print("ERROR!");
  }

  if (StartWert < EndWert)
  {
    long MillisZeit = millis();

    float Freq = (EndWert - StartWert) / Zeit;
    long Zyklus = 1000000 / Freq;

    Serial.print("Freq: ");
    Serial.println(Freq);
    Serial.print("Zykluslaenge[Microsecs]: ");
    Serial.println(Zyklus);

    for (int i = StartWert; i <= EndWert; i++)
    {
      PWMOutput(Pin, i, Freq);
      // NO DELAY HERE
    }

    MillisZeit = millis() - MillisZeit;
    Serial.print("Fade-Zeit[ms]: ");
    Serial.println(MillisZeit);
    Serial.print("\n");
  }
  /*
    else if (StartWert > EndWert)
    {
      for (int i = StartWert; i >= EndWert; i--)
      {
        PWMOutput(Pin, i, 300);
      }
    }
  */
}

void PWMOutput(int Pin, int PWM_Wert, float PWM_Freq)   // PWM_Wert 0-255 - Freq >61Hz sonst Probleme wegen max. Millis() Länge.
{
  long Zykluslaenge = 1000000 / PWM_Freq;
  float ProzentAN = PWM_Wert / 255.0;
  int AN_Zeit = ProzentAN * Zykluslaenge;
  int AUS_Zeit = Zykluslaenge - AN_Zeit;
  Serial.print("PWM_Freq ");
  Serial.println(PWM_Freq);
  Serial.print("PWM_Wert ");
  Serial.println(PWM_Wert);
  Serial.print("Zykluslaenge ");
  Serial.println(Zykluslaenge);
  Serial.print("ProzentAN ");
  Serial.println(ProzentAN);
  Serial.print("ON Time ");
  Serial.println(AN_Zeit);
  Serial.print("OFF Time ");
  Serial.println(AUS_Zeit);
  Serial.print("\n");

  if (AN_Zeit > 0)
  {
    ShiftRegOut.set(Pin, HIGH);
    delayMicroseconds(AN_Zeit);
  }
  ShiftRegOut.set(Pin, LOW);
  delayMicroseconds(AUS_Zeit);
}

Code 2:

#include <ShiftRegister74HC595.h>

ShiftRegister74HC595 ShiftRegOut (1, 2, 4, 5); // Schieberegister Objekt erstellen (Anz. Register, Datenpin, Schiebetaktpin, Speichertaktpin (latch-pin)

void setup()
{
  Serial.begin(115200);
  ShiftRegOut.setAllLow();
}

void loop()
{
  FadeOutput(2, 0, 255, 4.16);
  delay(500);
  /*  FadeOutput(2, 255, 0, 1);
    delay(500);*/
}

int FadeOutput(int Pin, int StartWert, int EndWert, float Zeit)                                                 // Bei Fade 0-255 max. 4.195 Sek möglich
{
  if (StartWert < 0 || StartWert > 255 || EndWert < 0 || EndWert > 255 || StartWert == EndWert || Zeit > 4.195)  // Bei falscher Parameterübergabe Fehler zurückmelden
  {
    return (-1);
    Serial.print("ERROR!");
  }

  if (StartWert < EndWert)
  {
    long MillisZeit = millis();

    float Freq = (EndWert - StartWert) / Zeit;
    long Zyklus = 1000000 / Freq;

    Serial.print("Freq: ");
    Serial.println(Freq);
    Serial.print("Zykluslaenge[Microsecs]: ");
    Serial.println(Zyklus);

    for (int i = StartWert; i <= EndWert; i++)
    {
      PWMOutput(Pin, i, Freq);
      delay(1);          // THIS DOESN'T CRASH FOR ME!
    }

    MillisZeit = millis() - MillisZeit;
    Serial.print("Fade-Zeit[ms]: ");
    Serial.println(MillisZeit);
    Serial.print("\n");
  }
  /*
    else if (StartWert > EndWert)
    {
      for (int i = StartWert; i >= EndWert; i--)
      {
        PWMOutput(Pin, i, 300);
      }
    }
  */
}

void PWMOutput(int Pin, int PWM_Wert, float PWM_Freq)   // PWM_Wert 0-255 - Freq >61Hz sonst Probleme wegen max. Millis() Länge.
{
  long Zykluslaenge = 1000000 / PWM_Freq;
  float ProzentAN = PWM_Wert / 255.0;
  int AN_Zeit = ProzentAN * Zykluslaenge;
  int AUS_Zeit = Zykluslaenge - AN_Zeit;
  Serial.print("PWM_Freq ");
  Serial.println(PWM_Freq);
  Serial.print("PWM_Wert ");
  Serial.println(PWM_Wert);
  Serial.print("Zykluslaenge ");
  Serial.println(Zykluslaenge);
  Serial.print("ProzentAN ");
  Serial.println(ProzentAN);
  Serial.print("ON Time ");
  Serial.println(AN_Zeit);
  Serial.print("OFF Time ");
  Serial.println(AUS_Zeit);
  Serial.print("\n");

  if (AN_Zeit > 0)
  {
    ShiftRegOut.set(Pin, HIGH);
    delayMicroseconds(AN_Zeit);
  }
  ShiftRegOut.set(Pin, LOW);
  delayMicroseconds(AUS_Zeit);
}

Code 3:

#include <ShiftRegister74HC595.h>

ShiftRegister74HC595 ShiftRegOut (1, 2, 4, 5); // Schieberegister Objekt erstellen (Anz. Register, Datenpin, Schiebetaktpin, Speichertaktpin (latch-pin)

void setup()
{
  Serial.begin(115200);
  ShiftRegOut.setAllLow();
}

void loop()
{
  FadeOutput(2, 0, 255, 4.16);
  delay(500);
  /*  FadeOutput(2, 255, 0, 1);
    delay(500);*/
}

int FadeOutput(int Pin, int StartWert, int EndWert, float Zeit)                                                 // Bei Fade 0-255 max. 4.195 Sek möglich
{
  if (StartWert < 0 || StartWert > 255 || EndWert < 0 || EndWert > 255 || StartWert == EndWert || Zeit > 4.195)  // Bei falscher Parameterübergabe Fehler zurückmelden
  {
    return (-1);
    Serial.print("ERROR!");
  }

  if (StartWert < EndWert)
  {
    long MillisZeit = millis();

    float Freq = (EndWert - StartWert) / Zeit;
    long Zyklus = 1000000 / Freq;

    Serial.print("Freq: ");
    Serial.println(Freq);
    Serial.print("Zykluslaenge[Microsecs]: ");
    Serial.println(Zyklus);

    for (int i = StartWert; i <= EndWert; i++)
    {
      PWMOutput(Pin, i, Freq);
      delayMicroseconds(1000);          // THIS DOES CRASH TOO!
    }

    MillisZeit = millis() - MillisZeit;
    Serial.print("Fade-Zeit[ms]: ");
    Serial.println(MillisZeit);
    Serial.print("\n");
  }
  /*
    else if (StartWert > EndWert)
    {
      for (int i = StartWert; i >= EndWert; i--)
      {
        PWMOutput(Pin, i, 300);
      }
    }
  */
}

void PWMOutput(int Pin, int PWM_Wert, float PWM_Freq)   // PWM_Wert 0-255 - Freq >61Hz sonst Probleme wegen max. Millis() Länge.
{
  long Zykluslaenge = 1000000 / PWM_Freq;
  float ProzentAN = PWM_Wert / 255.0;
  int AN_Zeit = ProzentAN * Zykluslaenge;
  int AUS_Zeit = Zykluslaenge - AN_Zeit;
  Serial.print("PWM_Freq ");
  Serial.println(PWM_Freq);
  Serial.print("PWM_Wert ");
  Serial.println(PWM_Wert);
  Serial.print("Zykluslaenge ");
  Serial.println(Zykluslaenge);
  Serial.print("ProzentAN ");
  Serial.println(ProzentAN);
  Serial.print("ON Time ");
  Serial.println(AN_Zeit);
  Serial.print("OFF Time ");
  Serial.println(AUS_Zeit);
  Serial.print("\n");

  if (AN_Zeit > 0)
  {
    ShiftRegOut.set(Pin, HIGH);
    delayMicroseconds(AN_Zeit);
  }
  ShiftRegOut.set(Pin, LOW);
  delayMicroseconds(AUS_Zeit);
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions