Verhalten von Interrupts

  • Hallo!


    Ich habe folgenden Code im Hauptprogramm:
    $CYCFLAG[10] = ($TIMER[1] > 100)
    INTERRUPT DECL 7 WHEN $CYCFLAG[10] DO tell_pos()
    INTERRUPT ON 7
    INTERRUPT ENABLE


    Im tell_pos() programm wird nach getaner Arbeit der $TIMER[1] wieder auf null gesetzt, so dass das Unterprogramm etwa alle 100ms ausgeführt wird. Das klappt auch ganz super, allerdings nur so lange, wie der Roboter eine Bewegung ausführt.
    Steht gerade keine Bewegung an, zählt nut der Timer 1 munter nach oben, der Cycflag reagiert dann erst wieder, wenn der Roboter anfährt.
    Weiss irgendwer, woran das liegt?
    Laut Doku ist das so:


    Die Voraussetzungen für das Auslösen eines Interrupts sind:
    - Der Interrupt muß deklariert sein (INTERRUPT DECL )
    - Der Interrupt muß eingeschaltet sein (INTERRUPT ON)
    - Der Interrupt darf nicht gesperrt sein
    - Das zugehörige Ereignis muß eingetreten sein (flankengetriggert)


    Schlimm ist das in meinem Fall nicht, aber es wäre angenehm das Verhalten zu verstehen...


    Schon mal danke,


    Kai

    If you and DEAD people can read Hex, how many people can read Hex?

  • Schritt für Schritt zum Roboterprofi!
  • Interrupts wirken nur in dem Programm wo sie deklariert wurden und in den Unterprogrammen die von ab diesem Programm ausgefürt werden.


    Lösung: den Interrupt Global deklarieren.

    Code
    GLOBAL INTERRUPT DECL 7 WHEN $CYCFLAG[10] DO tell_pos()



    Anwerkung:
    Benutze doch einfach $TIMER_FLAG[1]. Dieser wird TRUE wenn der Timer positiv ist.
    Setzte dazu $TIMER[1] = -100

    Code
    INTERRUPT DECL 7 WHEN $TIMER_FLAG[1] DO tell_pos()


    So kannst du dir den $CYCFLAG sparen.


    mfg notime

    Kontrolle ist eine Illusion, denn niemand weiss was als nächstes passiert.

  • Der TIMER_FLAG ist schon mal ne prima Idee, danke.
    Ich deklariere den Interrupt allerdings in meinem Hauptprogramm, das erklärt es also leider nicht. Aber ich versuche gleich mal, wie er sich verhält, wenn ich ihn GLOBAL deklariere.

    If you and DEAD people can read Hex, how many people can read Hex?

  • Das globale Deklarieren des Interrupts änderte nichts am Verhalten des Programms, aber der TIMER_FLAG Vorschlag funktioniert wunderbar.
    Macht auch den Code leichter nachvollziebar, das ist ja immer gut.
    :danke:

    If you and DEAD people can read Hex, how many people can read Hex?

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