Interrupts nach Servo-Lib gesperrt

Hallo zusammen,

ich habe bei einem Nano an den Eingängen 2 und 3 einen Modellbauempfänger angeschlossen. Immer wenn das PPM High oder Low wird, wird ein Interrupt ausgelöst und ich merke mir den Wert von micros() und errechne mir die Pulslänge.

Ich muss aber auch zwei Servos ansteuern und dazu verwende ich die Servo-Lib. Immer wenn ich ein Servo bewegt habe bekomme ich danach keine Interrupts mehr.

Ich habe gesehen das die Servo-Lib die Funktion cli() aufruft und dann sind doch alle Interrupts gesperrt. Ich kann nicht sehen das die wieder frei gegeben werden.

Was kann ich machen damit ich wieder Interrupts bekomme?

Viele Grüße

Robi

Ich habe gesehen das die Servo-Lib die Funktion cli() aufruft und dann sind doch alle Interrupts gesperrt. Ich kann nicht sehen das die wieder frei gegeben werden.

Du meinst wahrscheinlich folgenden Code:

    uint8_t oldSREG = SREG;
    cli();
    servos[channel].ticks = value;
    SREG = oldSREG;

Wie Du sehen kannst, wird der Inhalt von SREG gespeichert und danach wieder auf den alten Wert gesetzt. Im Register SREG ist das globale Interrupt-Bit enthalten, das von cli() gelöscht wird. Somit werden die Interrupts wieder aktiviert.

Poste Deinen Code, womöglich ist der Fehler an einem anderen Ort.

Hi

Wie pylon schon schrieb, wird das I-Flag mit dem Zurückschreiben von SREG wieder in Ur-Zustand gebracht - wenn's vorher gelöscht war, bleibt's gelöscht, wenn's vorher gesetzt war, ist's danach wieder gesetzt.
Somit verhält sich dieser 'Hack' völlig neutral zum Interrupt-Handling des eigentlichen Sketch.

MfG