Interrupt während Interrupt auslösen

  • Hi,
    Danke mal wieder für die vielen Tipp und Hilfen im Forum.
    Leider finde ich auf meine aktuelle Frage keine Antwort.


    Ich möchte während ich in Interrupt_1 bin einen weiteren Interrupt_2 aktiverien und dann direkt oder nach Interrupt_1 in Interrupt_2 springen.


    Bsp.:
    Reset/Abort Interrupt 6 in Cell() soll mich dort immer wieder hinbringen, wenn i_bCmdAbort==True. Aber wenn im Unterprogramm Main() erst ein i_bCmdSuspend==true kommt, dann stehe ich in einem Interrupt. Kann ich dann Interrupt 6 aktivieren und in Cell() zurückkehren?


    DEF CELL ( )
    INTERRUPT DECL 6 WHEN i_bCmdAbort DO l_irAbort( )
    Main()
    END


    DEF l_irAbort ()
    brake
    INTERRUPT OFF 6
    RESUME
    END


    DEF Main ( )
    INTERRUPT with brake DECL 9 WHEN i_bCmdSuspend DO l_ir( )
    INTERRUPT ON 6
    INTERRUPT ON 9
    ...
    ...
    ...
    ...
    End


    DEF l_ir ()
    BRAKE
    Interrupt off 9
    ;Fehlernummer ausgeben
    ;Job angehalten
    og_iError_NR=10


    WAIT SEC 1
    ;Warten bis es weiter gehen kann oder reset kommt
    WAIT FOR i_bCmdSuspend==FALSE OR i_bCmdAbort==TRUE
    if i_bCmdAbort==False then
    Interrupt on 9
    endif
    END


    In der Doku findet man erst bei Interrupts
    "Wenn mehrere Interrupts gleichzeitig auftreten, wird zuerst der Interrupt mit der höchsten Priorität bearbeitet, dann die Interrupts niedrigerer Priorität. 1 = höchste Priorität"
    Kingt als würden alle anstehenden Interrupts abgearbeitet, aber später kann man bei "INTERRUPTS DISABLE/ENABLE Abweichendes Verhalten" etwas über den Merker lesen, bei dem steht, das wenn ein Interrupt abgearbeitet wurde dieser zurückgesetzt wird und Interrupts nur abgearbeitet werden, wenn dieser True ist.
    Ist der Merker nur für INTERRUPTS DISABLE/ENABLE wichtig?


    Gruß Thomas

    Einmal editiert, zuletzt von Wultrix ()

  • Schritt für Schritt zum Roboterprofi!
  • Hallo Wultrix,


    Wenn ein Interrupt eintrifft wird automatisch das Global Interrupt Enable Bit im Status Register SREG gelöscht und alle weiteren Interrupts unterbunden. Obwohl es möglich ist, zu diesem Zeitpunkt bereits wieder das I-bit zu setzen rate ich dringend davon ab. Dieses wird nämlich automatisch gesetzt, wenn die Interruptroutine beendet wird. Wenn in der Zwischenzeit weitere Interrupts eintreffen werden die zugehörigen Interrupt-Bits gesetzt und die Interrupts bei Beendigung der laufenden Interrupt-Routine in der Reihenfolge ihrer Priorität ausgeführt. Dies kann eigentlich nur dann zu Problemen führen, wenn ein hoch priorisierter Interrupt ständig und in kurzer Folge auftritt. Dieser sperrt dann womöglich alle anderen Interrupts mit niedrigerer Priorität. Ich rate daher davon ab da man in eine Schleife geraten kann aus der man nicht mehr rauskommt.
    Grüße Whitey

    Es gibt 10 Gruppen von Menschen: Die, die Binärcode verstehen und die, die ihn nicht verstehen.

  • Danke Whitey


    leider muss ich trotzdem nochmal nachfragen.


    Wenn in der Zwischenzeit weitere Interrupts eintreffen werden die zugehörigen Interrupt-Bits gesetzt und die Interrupts bei Beendigung der laufenden Interrupt-Routine in der Reihenfolge ihrer Priorität ausgeführt.


    Dies passiert aber nur, wenn ich im aktuell aufgerufenen Interrupt dieses I-bit selbst wieder setzte, sonst würden alle anderen Interrupts ignoriert und auch nach dem Interrupt nicht ausgelöst, oder?


    Ich möchte eben egal wo ich bin einen Stopp ermöglichen und wieder zurück ins Cell () kommen (nach Ende des Interrupts wäre auch okay). Leider sehen Interrupts ja nur Flanken und ich möchte diese nicht verpassen, sonst müsste ich eine selbst erzeugen.
    Hierfür würde ich ein Pulsen einer Boolischen(bStop) im SPS.sub nutzen, wenn i_bCmdAbort von der übergeordneten SPS gesetzt wird.
    Interrupt würde sich dann auf die Boolische beziehen.
    INTERRUPT DECL 6 WHEN bStop DO l_irAbort( )


    Gruß Wutrix


  • So richtig, ich selbst hab es noch nie ausprobiert aber normaler weise arbeitet er dann die Interrupts nach der Prio ab.


    Grüße Whitey

    Es gibt 10 Gruppen von Menschen: Die, die Binärcode verstehen und die, die ihn nicht verstehen.

  • Auftretende Interrupts mit höherer Prio unterbrechen auch schon laufende Interrupts niederer Prio. Siehe Attachment.


    In Deinem Falle sollte es auch mit einem Interrupt funken..




    Gruss SJX

Erstelle ein Benutzerkonto oder melde dich an um zu kommentieren

Du musst ein Benutzerkonto haben um einen Kommentar hinterlassen zu können

Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Geht einfach!
Neues Benutzerkonto erstellen
Anmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden