Ich bin mir nicht sicher wo das Problem liegt. Ich habe heute Vormittag den Durchlauf der Funktion mal per
Code:
micros_durchlauf_start = micros();
.....
jede menge Code
.....
micros_durchlauf = micros() - micros_durchlauf_start;
Serial.println(micros_durchlauf);
gemessen. Dabei werden mir pro Durchlauf 20-28 Microsekunden ausgegeben. Was mich aber stutzig macht ist ein Wert nach ca. 100 Durchläufen aus der Reihe schlägt und mit rund -15500µs angegeben wird. Es ist bei jeden Aufruf der Funktion nur ein einzelner Wert nach ca 100 Durchläufen.
Ich bin mir nicht sicher, ob ein Timer-Interrupt mein Problem lösen wird. Die Funktion scheint ja (meistens) schnell genug zu sein, um sogar mehrmals pro Millisekunde auf ein evtl. auszuführendes Event zu überprüfen. Die ISR müsste ja ähnlich aussehen wie meine bisher verwendete (nachfolgende) Funktion.
Code:
void ausloesen(void)
{
int millis_start = millis();
int millis_aktuell = millis();
int status_ventil_open[3] = {0,0,0};
int status_ventil_closed[3] = {0,0,0};
int status_blitz = 0;
int status_sva = 0;
int status_trigger = 0;
int timer_blitz = 500;
int kamera_delay = 82;
int micros_durchlauf = 0;
int micros_durchlauf_start = 0;
lcd.clear();
lcd.home();
lcd.print(valve_delay[1]);
sva();
while(tmp == 0)
{
millis_aktuell = millis() - millis_start;
micros_durchlauf_start = micros();
// lcd.setCursor(0,2);
// lcd.print(millis_aktuell);
// Ventile öffnen
for(int i = 0; i<valve_amount;i++)
{
if((millis_aktuell > valve_delay[i]) && (status_ventil_open[i] == 0) && (valve_active[i] == 1))
{
digitalWrite(+i,HIGH);
status_ventil_open[i] = 1;
}
}
// Ventile schließen
for(int i=0;i<valve_amount;i++)
{
if((millis_aktuell > (valve_delay[i]+valve_size[i])) && status_ventil_closed[i] == 0)
{
digitalWrite(+i,LOW);
status_ventil_closed[i] = 1;
}
}
// Kamera auslösen
if((millis_aktuell > (timer_blitz - kamera_delay) && (status_trigger == 0)))
{
digitalWrite(13,HIGH);
status_trigger = 1;
}
// Blitze auslösen
if((millis_aktuell > timer_blitz) && (status_blitz == 0))
{
trigger_blitze();
status_blitz = 1;
}
micros_durchlauf = micros() - micros_durchlauf_start;
Serial.println(micros_durchlauf);
if(millis_aktuell > 2000)
{
tmp=1;
digitalWrite(13,LOW);
display_setup_valve_delay();
}
}
}
Lesezeichen