Forum: Compiler & IDEs Verständnissproblem millis()


von Andreas F. (codecasa)


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

}

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

> Serial.println("PMP");

Das braucht Zeit

von Andreas F. (codecasa)


Angehängte Dateien:

Lesenswert?

- Code befindet sich im Anhang

Es handelt sich im ein Arduino UNO Board Atmega AVR 328

von Andreas F. (codecasa)


Lesenswert?

Karl Heinz Buchegger schrieb:
>> Serial.println("PMP");
>
> Das braucht Zeit

Machs jetzt wech aber ich denke auch mein ICR Aufbau ist nicht optimal

von Karl H. (kbuchegg)


Lesenswert?

> void aktStatus(){

Das braucht Zeit

von Karl H. (kbuchegg)


Lesenswert?

> 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?

von Andreas F. (codecasa)


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.

von Andreas F. (codecasa)


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;

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
Noch kein Account? Hier anmelden.