-
Notifications
You must be signed in to change notification settings - Fork 13.3k
Closed
Description
ESP12F
I'm working on a PWM Routine (not finished still in progress) which did crash for some reason (code#1).
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);
}
Rr42
Metadata
Metadata
Assignees
Labels
No labels