Hallo ihr beiden,
also erstmal: ich meinte natürlich blockieren und nicht "verzögern".
Mein Programm hatte einfach 8 pulseIn funktionen, die auf unterschiedliche Eingänge gelauscht haben.
Da in der Beschreibung zu pulseIn steht, dass es per default eine Sekunde als timeout hat.
Wenn an einem Eingang was anliegt und an den anderen 7 nicht, dann kommt das ja so einigermaßen mit der langsamen Ausgabe hin.
Zu meinem Vorhaben:
WENN an einem Eingang ein PWM Signal angkommt, dann kontinuierlich, also nicht mit 5 Sekunden verzögerung oder so.
Ich habe momentan beim Testen noch nicht alle 8 Eingänge in Benutzung sondern nur einen.
Was ich letztendlich versuche ist, dass ich meine 8 Kanal Fernbedienung, dessen Empfänger 8 PWM Signale generiert, dazu bringe, mehrere Kanäle auf einen Kanal zu modulieren.
Es werden aktuell also 5 einfache On/Off switches auf einem Kanal moduliert.
Das ganze könnte man mit Multiplexing sogar noch bis ins unendliche erweitern, aber das wird jetzt erstmal zu viel.
Ich nutze also einen Kanal um 5 "Schalter-Kanäle" darauf zu modulieren.
Somit habe ich 7 echte und 5 Schalter Kanäle = 12 Kanäle.
Das reicht mir.
Problem ist nur, dass meine Flugsteuerung (Pixhawk) keine PWM Signale als Eingang akzeptiert.
Bisher habe ich daher PPM genutzt über einen Sketch, den ich kaum verstehe (umfanreich und vor allem mit Interrupts).
Das Problem an PPM ist, dass es ein 22ms gepulstes Signal ist und daher nur Platz für bis zu 8 Kanäle hat.
Daher steige ich nun auf SBUS von Futaba um.
Ich habe es hin bekommen ein SBUS-Signal zu generieren, allerdings habe ich noch 2 Probleme:
-
Das einlesen der PWM Signale ist zu langsam.
-
Ich hab es noch nicht hinbekommen das Arduino mit dessem SBUS Signal mit dem Pixhawk zu koppeln.
Danke für den Link ElCaron.
Ich werde mich mal an den "Pin Change Interrupts" mit dessen library versuchen.
Ohne library wäre mir zwar lieber, aber "External Interrupts" scheinen ja nur auf 2 Pins zu funktionieren.
Und selbst schreiben schaff ich nicht
EDIT:
Vielen Dank!
Die library funktioniert wunderbar!
was genau macht denn "latest_interrupted_pin"? ich habe den jetzt überall drinne:
[...]
void PWM_1_rising()
{
latest_interrupted_pin=PCintPort::arduinoPin;
PCintPort::attachInterrupt(latest_interrupted_pin, &PWM_1_falling, FALLING);
PWM_Channel_1_prev_time = micros();
}
void PWM_1_falling() {
latest_interrupted_pin=PCintPort::arduinoPin;
PCintPort::attachInterrupt(latest_interrupted_pin, &PWM_1_rising, RISING);
PWM_Channel_1_Value = micros()-PWM_Channel_1_prev_time;
}
void PWM_2_rising()
{
latest_interrupted_pin=PCintPort::arduinoPin;
PCintPort::attachInterrupt(latest_interrupted_pin, &PWM_2_falling, FALLING);
PWM_Channel_2_prev_time = micros();
}
void PWM_2_falling() {
latest_interrupted_pin=PCintPort::arduinoPin;
PCintPort::attachInterrupt(latest_interrupted_pin, &PWM_2_rising, RISING);
PWM_Channel_2_Value = micros()-PWM_Channel_2_prev_time;
}
[...]