Sprung aus Interruptprogrammen KRC 2

  • Hallo,


    ich will folgendes anstellen: Roboter fährt bis Interrupt ausgelöst wird--> Wenn der Interrupt ausgelöst wird fährt der Robbi an bestimmte Koordinaten --> Wartet bis ein bestimmter Eingang TRUE wird.
    Sobald das der Fall ist, soll an einem bestimmten Punkt des Hauptprogramms weiter gemacht werden.


    Geht ja soweit ich das verstanden hab zu einem gewissen teil mit BREAK und RESUME nur dass er eben da mit dem Programm weiter macht wo er aufgehört hat.


    habe allerdings folgendes



    und


    Jetzt will ich, dass er, egal ob er gerade in unterprogramm 1,2,3,1_1,1_2 oder sonstwo ist, nachdem er den Interrupt abgearbeitet hat immer an "sprungmarke:" im hauptprogramm weiter macht (unabhängig davon ob das nun eine wirkliche Sprungmarke für "GOTO" wäre oder zum Beispiel gleich das unterprogramm 2 - allerdings mit der Bedingung, dass danach eben ptp und unterprogramm 3 folgen).


    Geht das überhaupt?
    Wenn ja, wie?


    Gruß thoms

  • Schritt für Schritt zum Roboterprofi!
  • Quick and dirty skizziert:



    Weiss nicht ob es auch eine slow and nice Version gibt.

  • Hmm, also danke erstmal für deine Antowrt, aber ist glaube ich nicht dass was ich meine - liegt sicher daran, dass ich mich auch nicht so deutlich ausgedrückt habe wie ich das vielleicht hätte tun sollen ;)


    Ich schreibs nochmal so auf wie ich weiß dass es nicht funktioniert aber das was ich will wohl besser ausdrückt.


    Er soll also immer das komplette Hauptprogramm ausführen, aber sobald der Interrupt geworfen wird zwei drei sachen machen und dann immer an sprungmarke weiter machen. Ich kann also auch nicht ne WHILE-Schleife mit dem BOOL Interrupted um das Hauptprogramm legen



    weil er ja dann erst, wenn Interrupt z.B. in unterprog3 aufgerufen wurde, noch unterprog4 abarbeitet, ehe er dann aus der While springt.
    noch dazu sind die unterprogramme eben geschachtelt, also in unterprogX kommen teilweise noch 2 weitere Ebenen und BREAK/RESUME bricht ja glaube ich nur eine Unterprogrammebene ab, oder?


    Vielleicht hab ich auch nen Denkfehler bei dem BREAK/RESUME und es funktioniert so?! :denk:


    Gruß
    Thoms

  • Weiss nicht, ob ich das richtig verstanden habe.
    Im unteren Beispiel ist es so:
    Wird der Interrupt im unterprog3 ausgelöst, springt der programmzeiger wieder ins Hauptprogramm zurück, ohne unterprog4 auszuführen.
    Über einen Merker (Integer) kannst du dir zusätzlich die weitere Ausführung setzen. (hab ich im Code noch nicht implementiert)

    Greetings, Irrer Polterer!

    Wie poste ich falsch? Nachdem ich die Suche und die FAQ erfolgreich ignoriert habe, erstelle ich das gleiche Thema in mehreren Unterforen, benutze einen sehr kreativen Titel wie "Hilfe", am Besten noch mit mehreren Ausrufezeichen, und veröffentliche einen so eindeutigen Text, dass sich jeder etwas Anderes darunter vorstellt.


    Life is a beta version. Full of bugs and no Manual.

  • Ok, aber ich will dass der das nicht nur macht wenn er aus unterprogramm3 kommt. Ich will, dass der IMMER egal ob aus unterprogram 1, 2, 3,4,1_1, 1_2, 2_1,2_2, etc. oder dem Hauptprogramm kommend bei auslösung des Interrupts an die Stelle "sprungmarke" (wo immer die sich auch befindet im Hauptprogramm) springt und dort ganz regulär mit dem Hauptprogrammablauf fortfährt.


    Folgendes vielleicht zur Problemherkunft:
    Messestand: Roboter macht verschiedene Logofahrten so lange bis ein Schalter betätigt (das ist der Interrupt--> Schalter betätigt) wird. Die Logofahrten werden zufällig ausgewählt und befinden sich jeweils in seperaten Unterprogrammen, genauso wie die Logofahrt auswahl ein Unterprogramm ist (Hauptprogramm --> UP_Logoauswahl --> UP_Logofahrt). Wenn der Schalter betätigt wird (interrupt anfang) soll er das Logo ablegen und an einen weiteren Schalter fahren. Ist er an dem Schalter wird eine Lichtschranke "deaktivert" (überbrückt), der Messerbesucher kann was in einem bestimmten bereich machen. Ist der Besucher aus der Lichtschranke wieder raus, dann fährt der Robbi auf ne HOME. (hier interrupt ende) Eine Kamera wird getriggert, Bild ausgewertet, der Robbi macht noch zwei drei andere sachen, holt sich entsprechend der Bildauswertung ein Goddie und legt das in ne Ausgabe. Dann wartet er ein bisschen und fängt wieder von vorne an mit den Logofahrten.


    Jetzt soll er immer wenn der Schalter betätigt wurde nach dem ablegen des gerade gegriffenen objektes wieder die Kamera triggern und von dort genauso fortfahren (triggern, auswerten, was machen, Goodie holen, goodie abgeben). Auch wenn er gerade ein Goodie abgeholt hat (und es noch gegriffen hat) soll er das Goodie erst ablegen, an den Schalter fahren, den Messebesucher was machen lassen, dann die Kamera wieder Triggern un auswertung, etc...
    Dabei ist es der Regelfall, dass der Schalter während einer der Logofahrten betätigt wird. Es ist allerdings auch möglich dass er nicht bei der Logofahrt sondern beim triggern, Goodie holen, Goodie ablegen betätigt wird. Dann soll er, je nach dem was er gegriffen hat das Objekt an einer anderen Stelle ablegen. Das Logo immer an der Position wo das Logo normalerweise auch abzulegen ist, das Goodie, wenn er es hält, aber nicht in der Regulären Goodie-Ablage sondern eben woanders.


    Ok.. Sry für so viel Text, aber weiß einfach nicht wie ich das Problem einfacher beschreiben soll. Es steht eigentlich soweit alles: Kameraprogramm, Logofahrten, Zufallsgenerator, Goodie holen, Goodie ablegen,.. nur eben das mit dem Interrupt funktioniert noch nicht so wie ich mir das vorstelle.


    Danke für eure bisherige und weitere Mühe!

  • Morgähn,


    einfach noch eine Ebene drüberlegen?


    z.B. im cell

    Code
    INTERRUPT DECL 10 WHEN $IN[40]==TRUE DO inter1()
    INTERRUPT ON 10
    
    
    Hauptprogramm()
    END


    und dann eben wieder


    So landest du per Interrupt immer ganz oben, springst eine Ebene tiefer ins Hauptprogramm und kannst dort entscheiden, ob du "normal" abarbeiten willst, oder ob du per Interrupt gekommen bist und bei deiner Sprungmarke weitermachen willst.


    Achja, keine Ahnung ob man in ein LOOP...ENDLOOP reinspringen kann. Falls er da motzt kannst du das ja schlimmstenfalls auch durch ein GOTO ersetzen :zwink:


    Gruß,
    Robotermann


  • Ok, aber ich will dass der das nicht nur macht wenn er aus unterprogramm3 kommt. Ich will, dass der IMufMER egal ob aus unterprogram 1, 2, 3,4,1_1, 1_2, 2_1,2_2, etc. oder dem Hauptprogramm kommend bei auslösung des Interrupts an die Stelle "sprungmarke"


    Dann musst du eben nach jedem UP-Aufruf prüfen, ob der Interrupt ausgelöst hat.



    Code
    DEF inter1()
    BREAK
    INTERRUPT OFF 10
    ptp
    WAIT FOR NOT $IN[40] ;Vor dem Einschalten des Interrupts pruefen,ob Auslöse-Bedingung inaktiv! 
    b_INTR_AUSGELOEST=TRUE
    INTERRUPT ON 10
    RESUME
    END


    b_INTR_AUSGELOEST natürlich global deklarieren. Oder aber die boolsche Variable gegen einne Integer austauschen und dort immer den letzten durchgeführten Schritt reinschreiben und im Hauptprogram per SWITCH...CASE...ENDSWITCH entscheiden, was nun zu tun ist.

    Greetings, Irrer Polterer!

    Wie poste ich falsch? Nachdem ich die Suche und die FAQ erfolgreich ignoriert habe, erstelle ich das gleiche Thema in mehreren Unterforen, benutze einen sehr kreativen Titel wie "Hilfe", am Besten noch mit mehreren Ausrufezeichen, und veröffentliche einen so eindeutigen Text, dass sich jeder etwas Anderes darunter vorstellt.


    Life is a beta version. Full of bugs and no Manual.

    Einmal editiert, zuletzt von IrrerPolterer ()

  • Ja, so geht es sicher auch. Daran hatte ich auch schon gedacht, wollte aber eine elegantere Lösung.
    Wirklich elegant ist das mit einem weitern Programm drum legen und dort den Intterrupt zu deklarieren zwar auch nicht aber gefällt mir etwas besser - wobei GOTO Anweisungen ja in keinem fall wirklich elegant sind :zwink:.


    Danke trotzdem.


    Gruß
    Thoms


  • Wirklich elegant ist das mit einem weitern Programm drum legen und dort den Intterrupt zu deklarieren zwar auch nicht


    Ich finde das total elegant und mache das ständig.


    Vielleicht solltest du in deinem Fall zusätzlich über eine andere Programmstruktur nachdenken.

    Greetings, Irrer Polterer!

    Wie poste ich falsch? Nachdem ich die Suche und die FAQ erfolgreich ignoriert habe, erstelle ich das gleiche Thema in mehreren Unterforen, benutze einen sehr kreativen Titel wie "Hilfe", am Besten noch mit mehreren Ausrufezeichen, und veröffentliche einen so eindeutigen Text, dass sich jeder etwas Anderes darunter vorstellt.


    Life is a beta version. Full of bugs and no Manual.


  • ..
    Wirklich elegant ist das mit einem weitern Programm drum legen und dort den Intterrupt zu deklarieren zwar auch nicht aber gefällt mir etwas besser - wobei GOTO Anweisungen ja in keinem fall wirklich elegant sind :zwink:.
    ...


    Eleganz ist eben ein dehnbarer Begriff.
    Und das mit dem GOTO: nimm die Lösung aus meinem Post, da sehe ich kein GOTO, die Unterschiede zu den nachfolgenden Posts sind marginal, und leicht zu integrieren.

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