pwm mit millis() irgendwie hört er irgendwann auf.

hi

folgender Code:

#include <LiquidCrystal.h>

#define dimmtime 1 //Zeit in Millisekunden die gewartet wird bis zur nächsten Stufe (1/255) gedimmt wird

LiquidCrystal lcd(8, 7, 14, 15, 16, 17);
int pwm1 = 0;
int pwm2 = 0;
int start1 = 0;
int start2 = 0;
unsigned long timestartup;
unsigned long timestartup2;
unsigned long timestartdown;
unsigned long timestartdown2;



void setup()  
{
  lcd.begin(16, 2);
  pinMode(3, OUTPUT);
  pinMode(4, INPUT);
  pinMode(5, OUTPUT);
} 

void loop()  
{ 
  if(digitalRead(4)) //wenn Eingang Zeitschaltuhr HIGH
  {
    if(start1 == 0)
    {
      timestartup = millis(); //kopiere startzeit in timestartup
      pwm1 = pwm1+1; //dimme um 1 hoch
      analogWrite(3, pwm1); //schreibe wert in Ausgang    
      start1 = 1;  
    }
    if (timestartup+dimmtime <= millis()) //nach + anzahl der Millisekunden nach der um 1 hochgedimmt werden soll
    {
      if (pwm1 < 255) //nur hochdimmen solang pwm unter 255
      {
        pwm1 = pwm1+1; //dimme um 1 hoch
        analogWrite(3, pwm1); //schreibe wert in Ausgang
        timestartup = timestartup + 1;  
      }          
      if (pwm1 > 127) //wenn erste LEDs 50% starte 2. PWM
      {
        if (pwm2 < 255) //nur hochdimmen solang pwm unter 255
        {
          pwm2 = pwm2+1; //dimme um 1 hoch
          analogWrite(5, pwm2);   //schreibe wert in Ausgang  
          timestartup2 = timestartup2 + 1;  
        }
      }
    }
  }
  lcd.setCursor(0, 0);
  lcd.print("blau ");
  lcd.print(pwm1);
  lcd.setCursor(0, 1);
  lcd.print("weiss ");
  lcd.print(pwm2);
  lcd.print(" ");
  lcd.print(millis());
}

(sind noch ein paar Beispielvariablen angelegt die ich aktuell nicht brauche bitte nicht beachten auch ist der Code noch nicht fertig ich weiss das nach dem hochdimmen eigentlich nix mehr geht :D)

Ich nutze den Simulator:
http://www.arduino.com.au/Arduino%20Shields%20products.html

Anfangs klappt der Code auch wunderbar er fängt an jede Millisekunde pwm1 um 1 hochzudimmen. Irgendwann (manchmal bei pwm1 = 20 manchmal erst bei 100) hört er einfach auf weiter zu dimmen ohne erkennbaren Grund. Genaues steppen hat ergeben das er in folgende IF Anweisung nicht hineinspringt:

http://www.chrisi01.de/di-YHCP.jpg

Wenn ich bei dem Bild jetzt F7 drück im genau diesem Zustand lande ich in der Zeile:

//.....
          timestartup2 = timestartup2 + 1;  
        }
      }
    }
  } // <-----hier lande ich dann
  lcd.setCursor(0, 0);
//.....

obwohl eigentlich alles gegeben ist damit
if (timestartup+dimmtime <= millis())
true wäre. timestartup ist 99 dimmtime 1 und millis beträgt wie im Bild zu sehen 104 d.h. 99+1<=104 sollte eigentlich true ergeben und er sollte in die IF Anweisung springen. Macht er aber aus irgendeinen Grund nicht.

weiss jemand wo mein Fehler liegt? Sieht mir irgendwie nach einen Überlauf oder so aus. Wobei millis() auf dem Display ausgegeben auf jeden Fall 104 beträgt.

mfg

Chris

Hallo Chris,
ich hab den Code jetzt so mal über einen Arduino Uno laufen lassen.
Bei mir läuft er aber jedesmal bis pwm1 und pwm2 = 255 hoch und die LEDs leuchten auch.
Hab die Werte über Serial.print ausgeben lassen und laufen immer bis 255.
Hb das "if(digitalRead(4)) //wenn Eingang Zeitschaltuhr HIGH" einfach durch ein delay(100) ersetzt um
simulieren zu können, aber wie gesagt läuft problemlos.
Eine Frage aber noch wofür hast du die Abfrage mit dem start1==0 ???
die wird ja nur einmal durchlaufen und eigentlich gar nicht gebraucht, geht auch ohne.
gruß
Bernward

hi

danke dir dachte mir schon fast das es am simulator liegt :wink:

Das start1 == 0 war nur ein test :wink: hab den Code eh noch mal ein Stück optimiert :grin:

Werde den Simulator dann mal in die Tonne treten und es live auf dem arduino probieren :grin:

mfg

Chris