Fragen zum Interrupt

  • Hallo,


    mal eine Frage zum Thema Interrupt: Löst nur ein Flankenwechsel von 0 -> 1 (pos. Flanke) einen Interrupt aus?


    Ich würde gerne einen Interrupt mit einer negative Flanke starten und einen zweiten Interrupt mit dem selben Sensor und eine positiven Flanke. Mit pos. Flanke geht das ohne Probleme. Nur wenn ich die negative Flanke auswerten möchte geht das nicht.


    Verwende als Interrupt Signal zwei Eingänge der Funktion "schnelles Messen". Hatte schon überlegt den einen Eingang mit einer Bool Variable in Sub.sps zu invertieren. Diese wird aber meines wissen zyklisch alle 20ms abgearbeitet. Daher würde ich dann meine Funktion "schnelles Messen" doch wohl verlieren.


    Vorab Vielen Dank für Eure Antworten !!!


    Gruß,
    King of drums

  • Schritt für Schritt zum Roboterprofi!
  • Ein logischer Ausdruck sollte es halt sein. Es funktioniert auch:


    INTERRUPT DECL 15 WHEN $POS_ACT.Z > 1000.0 DO XYZ()


    Alternativ kann man sich ja nauch noch ein $CYCFLAG[] mit seiner logischen Operation beschreiben und im Interrupt die Flanke des $CYCFLAG abfragen.


  • Ein logischer Ausdruck sollte es halt sein. Es funktioniert auch:


    INTERRUPT DECL 15 WHEN $POS_ACT.Z > 1000.0 DO XYZ()


    Alternativ kann man sich ja nauch noch ein $CYCFLAG[] mit seiner logischen Operation beschreiben und im Interrupt die Flanke des $CYCFLAG abfragen.


    Oje, da wankt mein Modell vom Interpreter jetzt ein wenig...


    Ich nehme an, der Interpreter unterbricht seine regulaere Ausfuehrung von Zeit zu Zeit, um die angeschalteten Interrupts zu testen, resp. deren Ausdruecke auszuwerten, damit die entsprechenden Interrupt-Routinen bei Bedarf angesprungen werden. Das koennte in einem eigenstaendigem Thread passieren (Gab's eigentlich unter Windows95/ME auch schon Threads?), oder aber als Teil der Interpreter-Hauptschleife.
    Ist diese Vorgehensweise dann schnell genug, um die "schnellen" Messeingaenge (resp. Pulse oder Puls-Flanken) zu testen?

  • Seltsam... bei mir funzt es...


    Dir ist aber klar das der Interrupt erst bei der Flanke schaltet, also wenn der Zustand bei dem "Interrupt On" Befehl schon False ist, dann tut sich natürlich nichts...


    Alternative: Deklariere dir ein

    Code
    $CYCFLAG[x]=NOT $MEAS_PULSE[x]

    . Im Interrupt nimmst du als Ereignis dann das

    Code
    INTERRUPT DECL 15 WHEN $CYCFLAG[x] DO XYZ()

    .

  • Hallo Schmidt,


    $CYCFLAG oder sub.sps (wie von King of drums ueberlegt), macht das in Bezug auf Abarbeitungsgeschwindigkeit einen Unterschied?
    Soll heissen: Werden die $CYCFLAGs oefter aktualisiert, als die sub.sps abgearbeitet wird?


    Das Handbuch sagt ueber die $CYCFLAGs nur "stetige Aktualisierung", schweigt sich aber zu den Wiederholzeiten beharrlich aus.


    Uebrigens habe ich dort auch gelesen:
    "In der Anweisung zur Interrupt-Deklaration sind keine logischen Verknuepfungen zulaessig."
    Womoeglich ist das inzwischen etwas erweitert worden... (seit KR C1 R2.2)


    Gruss, Dirk.

  • Das ist richtig, logische Verknüpfungen sind nicht erlaubt (and,or,exor), aber logische Vergleiche sind erlaubt (==,>,<).
    Wenn Verknüpfungen benötigt werden dann eben nur über $CYCFLAG.
    $CYCFLAG's werden im Ipo-Takt abgearbeitet also genauso schnell wie die INTERRUPT-auslösenden-Ereignisse. Auf keinen Fall den Submit verwenden... Die Zykluszeit ist ja sonst wo...

  • Also geht das anscheinend doch mit Cyclflag. Werde das heute oder morgen mal ausprobieren und Euch das Ergebnis mitteilen.


    Schon mal Vielen Dank für die vielen Antworten.


    Gruß,
    King of Drums

  • Hallo
    Wenn du mit 2 Cycflags und 2 Interrupts arbeitest wird das funktionieren. Wichtig ist aber der Hinweis von Schmidt: Zustand der Signale beim aktivieren des Interrupts beachten. Um sicher zu gehen kannst du die Cycflags erst mit true oder false vorbelegen und dann später mit dem Eingangssignal beschalten.


    $cycflag[1]=true
    interrupt decl 30 when $cycflag[1]== false do ...
    interrupt on 30
    $cycflag[1]=$in[10]


    Damit lassen sich mit nur einem Interrupt auch abwechselnd mehrere Zustände überwachen.


    mfg
    Olaf

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