Programmablauf mit Timer

Hallo,

ich habe diese Libary meinem Programm hinzugefügt: http://playground.arduino.cc/Deutsch/HalloWeltMitInterruptUndTimerlibrary Sie enthält einen Timer, der aller 200 Mikrosekunden nun überprüfen soll, ob eine boolean auf true ist. Falls diese true ist, startet er eine Funktion und setzt die boolean wieder auf false, sodass die Funktion nur einmal zur gleichen Zeit abläuft. Parallel dazu läuft in void loop eine Variable, die aller 5ms von 1 auf 0 hin und her schaltet.

In der Schleife wird aller 200 Mikrosekunden die Spannung an einem analog Pin ausgelesen sowie aller 200 Mikrosekunden geprüft, ob die in void loop geänderte Variable 1 oder 0 beträgt (ist eine globale Variable).

Nun meine Frage, ob dies grundsätzlich erstmal möglich ist. Läuft die eigen definierte Funktion parallel zu void loop oder hält sie diese an, bis die eigene Funktion fertig ist?

Danke. LG Tim

arduinodue: In der Schleife wird aller 200 Mikrosekunden die Spannung an einem analog Pin ausgelesen sowie aller 200 Mikrosekunden geprüft, ob die in void loop geänderte Variable 1 oder 0 beträgt (ist eine globale Variable).

"In der Schleife" verstehe ich nicht. Ich verstehe deinen Beitrag so, dass du ähnlich wie im verlinkten Playground Beispiel was mit der TimerOne Library machst. Zeig doch einfach deinen Code. Eine Interrupt-Routine die alle 200 µs drankommt und analogRead macht ( oi oi ;( )

Läuft die eigen definierte Funktion parallel zu void loop oder hält sie diese an, bis die eigene Funktion fertig ist?

Ein atmega ist kein multicore Prozessor. Eine Interrupt-Routine unterbricht den Code in loop, bis sie fertig ist. Sogar innerhalb einer c - Anweisung, wenn die mehr als einen Takt lang ist. Daher muss sogar loop kurzzeitig den Start der Interrupt-Routine verhindern ( noInterrupts(); ), wenn du in loop Variable liest, die von der Interrupt-Routine geschrieben werden (wenn diese Variablen größer als ein byte oder boolean sind).

Ok, also das sieht dann ungefähr so aus:

Das wird aller 200 Mikrosekunden von dem Timer aufgerufen und überprüft, ob die Funktion synchro gestartet werden kann:

void auslesen() {
if (start==true)
{
start=false;
verzoegerung=synchro();
}
}

Hier wird die Variable x aller 5ms geändert:

void loop() {
x=0;
delay(5);
x=1;
delay(5);
}

Die folgende Funktion soll eigentlich parallel zu void loop laufen und diese nicht beeinflussen:

int synchro () {
for (int n=0; n<=49; n++) {
t1=micros();
array_x[n]=x;
array_input[n]=analogRead(eingang);
t2=micros();
dt=t2-t1;
delayMicroseconds(200-dt);
}
}

Das heißt also, loop wartet so lange, bis synchro() fertig ist und letztenendes würde im array_x immer nur 0 bzw. nur 1 stehen?

Mit delay geht das gar nicht! Mit delay schickst du den Prozessor in erzungene Untätigkeit. delay(500) heißt: "mache 500ms nichts". Also auch keine anderen Funktionen.

Wenn ich das richtig verstehe, dann möchtest du alle 200µs einen AD-Wert lesen, wenn eine globale Variable true ist. Und die globale Variable wird alle 5ms getoggelt.

Das kann man doch ohne Lib machen:

boolean readAD;
unsigned long TS200, TS5m;
int AD_Werte[30];  // 5ms lang alle 200µ ein Wert, das sind 25 Werte; Array auf 30 anlegen um sicher zu gehen.
int No;

void loop(){
  if (readAD) {  // AD-Werte lesen und speichern
    if (micros() - TS200 > 200){
      TS200 = micros();
      AD_Werte[No++] = analogRead(A0);
    } 
  }else {  // Auswerten
      // gespeicherte Werte Verarbeiten
      No = 0;
  }
  if (micros() - TS5m > 5000){
    TS5m = micros();
    readAD = !readAD;
  }    
}

Wobei, wenn das wirklich das ist, was du willst, dann würde ich nicht alle 5ms toggeln, sondern 25 Werte aufzeichnen, diese dann auswerten, dann die nächsten 25 Werte aufzeichnen..

Ok, danke ich setze mich mal mit deinem Vorschlag auseinander :-)