www.mikrocontroller.net

Forum: GCC Verständnissproblem millis()


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Andreas Frauenstein (codecasa)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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();
            }

}

Autor: Joachim Drechsel (Firma: JDCC) (scheppertreiber)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Karl Heinz Buchegger (kbuchegg) (Moderator)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
> Serial.println("PMP");

Das braucht Zeit

Autor: Andreas Frauenstein (codecasa)
Datum:
Angehängte Dateien:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
- Code befindet sich im Anhang

Es handelt sich im ein Arduino UNO Board Atmega AVR 328

Autor: Andreas Frauenstein (codecasa)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Karl Heinz Buchegger schrieb:
>> Serial.println("PMP");
>
> Das braucht Zeit

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

Autor: Karl Heinz Buchegger (kbuchegg) (Moderator)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
> void aktStatus(){

Das braucht Zeit

Autor: Karl Heinz Buchegger (kbuchegg) (Moderator)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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?

Autor: Andreas Frauenstein (codecasa)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Andreas Frauenstein (codecasa)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.
pname=Programm 01;

zeit(5);
pmp(an);
zeit(10);
san(an);
zeit(5);
imp(1000,500);
zeit(30);
stop_imp();
zeit(10);
imp(500,200);
zeit(30);
stop_imp();
san(aus);
zeit(7);
pmp(aus);

end;


Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net