hängt denn dein MotorTreiber an Pin 5 oder 9 ?
(oder an beiden ?)
Meine Kristallkugel ist zwar gut poliert, aber deine Beschreibung
Wenn ich
analogWrite(5,250);
weglasse, läuft der Motor nicht
klingt nicht nach einem Fehler, sondern nach einem Hinweis, dass da ein Zusammenhang besteht
Ok, das ist nicht im sketch, aber mittels einer Lichtschranke sollen x und x_alt verglichen werden. Habe eine ISR, die bei jeder Umdrehung des Motors ein x zählt.
Versteh ich nicht.
Ich kann mir vorstellen, -sinnloserweise- einen Arduino schlafen zu lassen, wenn nichts los ist.
Würde ich aber -bei deinen Problemen- erstmal weglassen.
Ich kann mir vorstellen, einen Motor laufen zu lassen solange ein Taster gedrückt ist, auch mit PWM.
Ich kann mir vorstellen, mit einer Lichtschanke Motorumdrehungen zu zählen; wenn's denn als Übung so sein soll, auch in einer ISR.
Jetzt ist aber so, dass x_alt aber immer 0 bleibt, x wird dann auch 0
Das ist schön zu sehen in deinem Beispiel: x_alt wird nie auf was anderes als 0 gesetzt
x=x_alt;
setzt x auf 0
Wie formuliere ich dass nach einer Sekunde x und x_alt verglichen werden sollen, aber dass x_alt aktualisiert wird immer?
Was meinst du mit* immer* ?
Vergleichen geht mit
if (x == x_alt) // beachte die zwei Gleichheitszeichen !
Dein
if (x=x_alt)
ist leider formal richtig:
setzt x auf den Wert von x_alt und prüft den Wert. Wenn x und x_alt 0 ist, ist das false, sonst true.
Was ist falsch?
Die wesentlichen Sachen ( Variablendefinition, wo ist setup() und was macht es, was ist überhaupt wo und wie angeschlossen )
fehlen.
Ich rate mal, dass count() deine ISR ist.
Wann x_Zustand jemals den Wert 1 kriegt, seh ich nicht, und was das Ganze soll, ist mir auch nicht so klar.
Jede Sekunde willst du die Anzahl Impulse der letzten Sekunde in z aktualisieren, richtig ?
x soll die Anzahl der Impulse seit Motor - Start sein ?
Und x_alt kann man dafür nehmen, um z auszurechnen ?
volatile unsigend long x; // Impulse seit Start
volatile unsigend long z; // Impulse je Sekunde
void count()
{
// Hilfsvariable für Sekundenwechsel
// nur hier gebraucht, muss aber nach Ende der ISR erhalten bleiben
static unsigned long previousMillis;
static unsigned long x_alt;
x++; // Zählung der Impulse seit Start
if (x==1) { // Start
previousMillis=millis(); //
x_alt=0;
}
if (millis()-previousMillis>1000){ // Jedes mal nach Ablauf von einer Sekunde
z = x - x_alt; // Pulse je Sekunde
x_alt = x;
previousMillis=millis();
}
}
Ausserhalb der ISR musst du nur x auf 0 setzen, um einen Start zu signalisieren...
Wenn du es richtig machen willst, musst du zum Auswerten von x und z kurzzeitig noInterrupts(); setzen !