Ich habe in der Loop ein aufruf zu einer gebastelten millis ISR Methode.
Das Problem ist das er bei den einzelnen Benutzer-Befehlen etwas länger
braucht un bei CMD_START_IMP garnicht oder total verspäted rauskommt.
Was mache ich falch ?
void prog_isr()
{
switch(CMD[prog_run].Befehl)
{
case CMD_ZEIT:
if(CMD[prog_run].Befehl == CMD_START_IMP) intervall_imp =
CMD[prog_run].param1; else intervall_imp = CMD[prog_run].param1 * 1000;
break;
case CMD_PMP:
Serial.println("PMP");
if(digitalRead(pumpe) == HIGH) {digitalWrite(pumpe, LOW);}
else{digitalWrite(pumpe, HIGH);};
aktStatus();
prog_run ++;
Root.goDown();
break;
case CMD_SAN:
Serial.println("SAN");
if(digitalRead(injektor) == HIGH) {digitalWrite(injektor,
LOW);} else{digitalWrite(injektor, HIGH);};
aktStatus();
prog_run ++;
Root.goDown();
break;
case CMD_START_IMP:
Serial.println("IMP");
p_imp_pause = CMD[prog_run].param1;
p_imp_dauer = CMD[prog_run].param2;
p_imp_status = true;
state_imp=true;
prog_run ++;
Root.goDown();
break;
case CMD_STOP_IMP:
Serial.println("STOP_IMP");
p_imp_status = false;
state_imp=false;
digitalWrite(v_pneumatik, LOW);
aktStatus();
prog_run ++;
Root.goDown();
break;
case CMD_END:
Serial.println("END");
prog_run = 0;
break;
}
if (prog_run > anzCMD)
{
prog_run = 0;
Serial.println("BEendet");
}
// ZeitBefehl abgelaufen
if (millis() - pMillis > intervall_imp) {
// aktuelle Zeit abspeichern
pMillis = millis();
prog_run ++;
Root.goDown();
}
}
Andreas Frauenstein schrieb: > Was mache ich falch ? Erstmal das "s". Dann verwende bitte die [c]-Tags damit man es besser lesen kann. Dann wäre die Angabe des OS bzw des Prozessors hilfreich, natürlich auch der (mit Sicherheit vorhandene) Rest des Codes.
Karl Heinz Buchegger schrieb: >> Serial.println("PMP"); > > Das braucht Zeit Machs jetzt wech aber ich denke auch mein ICR Aufbau ist nicht optimal
> Das Problem ist das er bei den einzelnen Benutzer-Befehlen etwas > länger braucht un bei CMD_START_IMP garnicht oder total verspäted > rauskommt. Über welche Zeiten reden wir?
Hab herausgefunden woran es lag :) Ich habe zwei ISR Davon ist ein Die für die Impulse. Also haben die beiden ISRs die selben Parameter benutzt: pMillis ist jetzt für die Programm-ISR p_pMillis und intervall_imp ist jetzt in der Programm-ISR p_intervall_imp daran leg es. Der Befehl CMD_START_IMP startet die Impuls ISR Die wird wiederum die gesetzten parameter pause und dauer lesen. Aber jetzt ist alles bestens trozdem danke Vielmals.
Karl Heinz Buchegger schrieb: >> Das Problem ist das er bei den einzelnen Benutzer-Befehlen etwas >> länger braucht un bei CMD_START_IMP garnicht oder total verspäted >> rauskommt. > > Über welche Zeiten reden wir? Die Zeiten werden aus einer Datei in den EEProm gfelanden und später in den RAM Die Datei sieht folgendermasen aus: vobei alles werte Sekunden sind und nur Die imp sprich impulsstart mit millisekunden referenziert werden.
1 | pname=Programm 01; |
2 | |
3 | zeit(5); |
4 | pmp(an); |
5 | zeit(10); |
6 | san(an); |
7 | zeit(5); |
8 | imp(1000,500); |
9 | zeit(30); |
10 | stop_imp(); |
11 | zeit(10); |
12 | imp(500,200); |
13 | zeit(30); |
14 | stop_imp(); |
15 | san(aus); |
16 | zeit(7); |
17 | pmp(aus); |
18 | |
19 | end; |
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.