Timing Problem !

hi,

ich habe fogendes problem :

switchMux(15);
       digitalWrite(15, HIGH);
       delay(gatepoti_read);
       digitalWrite(15, LOW);
       delay(Clock_Delay);
       digitalWrite(15, HIGH); 
       delay(gatepoti_read);
       digitalWrite(15, LOW);
       delay(Clock_Delay);
       digitalWrite(15, HIGH); 
       delay(gatepoti_read);
       digitalWrite(15, LOW);
       delay(Clock_Delay);
       switchMux(14);
       digitalWrite(15, HIGH);
       delay(gatepoti_read);
       digitalWrite(15, LOW);
       delay(Clock_Delay);

ich habe hier Clock_Delay und gatepoti_read die als delay dienen. durch gatepoti_read wird die leuchtdauer der LED's bestimmt und durch Clock_Delay der abstand zwischen den lichtimpulsen. leider ist es ja so, das sich nun diese beiden delays addieren und ich ein timing problem habe. wie kann ich es hinbekommen, das ich das gatepoti_read delay nicht im zeitlichen ablauf habe ? ich hoffe, ihr versteht was ich meine. gibt es eine möglichkeit die leuchtdauer der LED anders zu bestimmen, so das sie nicht den zeitlichen ablauf des loops beeinflusst ?

Ich weiß nicht ob ich dich richtig verstehe aber millies ist auch hier dein Freund. http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

Merken wie der zustand der LED gerade ist und dementsprechend die Millies + LEDanZeit oder Millies + LEDausZeit mit der Aktuellen millies vergleichen und den zustand ändern.

Oder liege ich da falsch?

Du hast kein Timing Problem sondern du sagst deinem Controller immer das er an einer bestimmten stelle Warten soll (delay) iohne das es in dieser Zeit irgendwas machen kann.

  if(millis() - millis2 > gatepoti_read) {
       millis1 = millis();  
    digitalWrite(15, HIGH);
  }
if(millis() - millis1 > Clock_Delay) {
       millis2= millis();  
    digitalWrite(15, LOW);
  }

So etwas in der Richtung.

Gruß Daniel

MueThoS:
Ich weiß nicht ob ich dich richtig verstehe aber millies ist auch hier dein Freund.
http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

Merken wie der zustand der LED gerade ist und dementsprechend die Millies + LEDanZeit oder Millies + LEDausZeit mit der Aktuellen millies vergleichen und den zustand ändern.

Oder liege ich da falsch?

das geht schon in die richtige richtung !
ich werd mich mit der millis-geschichte noch etwas weiter beschäftigen müssen.
so ganz hab ich es noch nicht geschnallt.
millis() ist ja die verstrichene zeit seit dem das programm gestartet ist.
meine zeit, die ich als gate für die LED’s brauche, wird von einem poti ausgelesen.
wie das nun addiert/subtrahiert ist mir noch etwas schleierhaft.
ein reset nach jedem durchlauf des loops müsste ja auch noch sein, oder ?

volvodani: Du hast kein Timing Problem sondern du sagst deinem Controller immer das er an einer bestimmten stelle Warten soll (delay) iohne das es in dieser Zeit irgendwas machen kann.

  if(millis() - millis2 > gatepoti_read) {
       millis1 = millis();  
    digitalWrite(15, HIGH);
  }
if(millis() - millis1 > Clock_Delay) {
       millis2= millis();  
    digitalWrite(15, LOW);
  }

So etwas in der Richtung.

Gruß Daniel

ja, mit dem begriff "timing" lag ich etwas falsch ;) ich schnall noch nicht ganz, was du mit millis1 und millis2 meinst. kannst du mir bitte deine rechnung kurz erklären ! ?

am liebsten wäre es mir ja wenn ich den wert des auszulesenden potis direkt übernehmen könnte. gibt es nicht noch eine andere funktion, in der ich den zeitlichen ablauf des loops nicht beeinflusse ? oder komme ich da nur mit der millis() weiter ? naja, ich werd es schon mit eurer hilfe schnallen oder der des www's

danke euch beiden auf jeden fall schon mal !

Ich versuch das mal in Worte zu fassen!
Millies läft nach uC start los und zählt.
1,2,3,4,5,6,7,8 und das ganz schnell :slight_smile:

So nun kommt der moment wo du deine LED das erste mal anmachen willst.
millies steht jetzt bei x und dein poti hat den wert y ( so lang soll die led an sein )
jetzt merkst du dir die millies zeit an der du die led angemacht hast.
also eingeschaltetBei= millies
jetzt kommt irgendwas an code egal was…
dann kommt eine abfrage nicht DAS sondern OB deine LED wieder ausgehen soll
dies machst du indem du schaust ob eingeschaltetBEI + y < millies ist wenn ja led aus machen
wenn nein einfach nix machen.
zusätzlich würde ich mir den status merken mit LEDist aus oder an
wenn die LED an ist machste halt eine abfrage mit eingeschaltetBEI und mit dem einen potiwert
und wenn die LED ausnist machst du eine abfrage mit ausgeschlatetBEI und mit dem anderen Potiwert.

Ich denke die Spezies hier kennen noch kürzere und bessere Wege aber ich denke so könnte es gehen und du hast kein delay drinne

tut mir leid Jungs, ich schnall es immer noch nicht so ganz !

vielleicht ist meine Beschreibung oben auch etwas missverständlich gewesen. denn eure Beschreibung mit dem 2ten poti verwirrt mich.

ich versuch es noch mal :

 digitalWrite(LED, HIGH);    // es soll eine LED leuchten.
                             // vom einschalten der LED bis zum ausschalten der LED vergeht die zeit, 
                             // die durch ein poti (gatepoti_read) vorgegeben ist.
                             // also gatepoti_read ist die dauer der brennzeit.
                            
                           
 digitalWrite(LED, LOW);    // dann soll die LED wieder aus gehen

 delay(Clock_Delay);        // das zweite poti erfüllt seinen zweck als dealy richtig
                            // vom einschalten bis zum nächsten step soll genau die zeit (Clock_Delay) vergehen
                            // der nächste step könnte z.B so aussehen :
                            
                            
 digitalWrite(LED, LOW);   
                            
                           
 digitalWrite(LED, LOW);    
 delay(Clock_Delay);

bin ich zu böd, wo ist mein Denkfehler ? ich schnall nicht wie das delay (Clock_Delay) schon ab dem Zeitpunkt der LED_AN geht ohne das gatepoti_read/die brennzeit der LED zu beeinflussen. :~

Wenn Du das mit den Potis nicht verstehst dann schreib doch erstmal ein Progam welches ohne Poties die LED an und aus macht. Benutze dabei keine Delays und schaue bei dem Tutorial Blink without delay ab. Nimm erstmal feste Zeiten. z.B. An-Zeit = 1 Sekunde Aus-Zeit = 2 Sekunden

Das heißt: Definiere eine Variable in der Du immer schreiben willst ob die LED an oder aus ist. Setze diese zunächst mal auf aus, sollte ja am Anfang so sein. Definiere eine Variable milliesOld und setze sie auf 0

Jetzt schreibst du ne Abfrage die schaut ob sie aus ist. Ist sie ja also folgendes machen: Schaue ob millies - milliesOLD > 2 Sekunden ist Mache die LED an und setze den Status auf AN schreibe die aktuellen millies in millies old

Jetzt sollte nach 2 sekunden die led angehen Das selbe schreibst du um die LED aus zu machen. Schauen ob die LED an ist Schauen ob millies - milliesOld > 1 Sekunden ist Aktuelle millies merken LED aus machen Status ändern

Wenn ich mich nicht irre sollte das so gehen

Wenn das läuft machst du dir gedanken wie du die beiden Zeiten über die Poties verändern kannst.

bin ich zu böd, wo ist mein Denkfehler ?

Blöd ist nur der der Aufgibt würde ich sagen.

Hier mal ein Versuche mal dies mit Erklärung:

Anlassen=analogRead(A0);   //einlesen deines Zeitwertes an 
Auslassen=analogRead(A1);  //einlesen deines Teitwertes aus auf diese wiese ist es maximal 1024 ms hier noch ein multiplikator oder eine map

if(millis() - millisAus >= Auslassen && AUS==true) {    // Hier schaut er nach ob die vergangene Zeit  seit dem Ausschalten Größer bzw gleich der gewählten
                                                   // ist . Ist dass der Fall
 digitalWrite(15, HIGH);                    // Dann macht der deine LED an ansonsten läuft er hier vorbei in das Restlich Programm
 AUS=false;
  millisAn = millis();                             // Hier merkt er sich wann er die LED angemacht hat
}
if(millis() - millisAn >= Anlassen&& AUS==false) {     //  Hier schaut er nach wie lange er die LED anlassen soll er weiss ja wann er sie  angemacht hat                
                                                   // hat ist das der Fall 
digitalWrite(15, LOW);                    // macht er sie aus
AUS=true;
millisAus= millis();                           // und merkt sich wann er sie ausgemacht hat
  }

Bei so einem kleinen Program kannst du davon ausgehen das es diese Schleifen ca 2-3000 pro Sekunde prüft eher öfter (also wenn du keine delays benutzt). Er führt die Anweisung hinter dem If erst aus wenn die wahr (richtig sind). So wie es jetzt geschrieben ist kannst während des anlassen bzw auslassen die Zeit durch drehen am Poti ändern. Packst du aber dann jeweils die Analog read in die If-Schleife wird auch nur einmal gelesen bis der wieder an der Stelle ist.

Hoffe es ausreichen erklärt zu haben

edit: Fehler beseitigt

ich glaub, das ich es jetzt so einigermaßen verstanden habe. ich werd beide varianten mal ausprobieren und dann in meinen code einbinden. danke für eire hilfe ! wenn alles läuft, dann meld ich mich weider. jetzt hab ich aber erstmal urlaub und werd vor neujahr leider nicht dazu kommen =(

hab gerade schon mal geschaut, ob es sowas wie einen arduino emulator gibt, aber bis jetzt noch nix fürn mac gefunden. dann könnte ich unterwegs an dem code weiter arbeiten. hat jemand einen tip ?