Verständnissproblem millis()

OP #2724205
Lesenswert?

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();
            }

}
OP #2724269
Lesenswert?

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.
OP #2724276
Lesenswert?

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;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren