-
        

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 25

Thema: Sprung aus ISR?

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    16.11.2008
    Beiträge
    8

    Sprung aus ISR?

    Anzeige

    Hallo,

    Für ein automatisches Regalsystem wird ein Notausschalter über einen Interrupteingang ausgewertet (INT2, ATMega32). Tritt der Interrupt auf, möchte ich sämtliche Motoren anhalten, danach Referenzfahrten durchführen. Damit die Auswertung der Gabellichtschranke (Int0 und Int1) sowie der Regelkreis (Zeitmessung über Timer0) funktionieren muss aber erst die ISR des Notaus beendet werden, damit die anderen ISR wieder funktionieren (wenn ich das so richtig verstanden hab).

    Nun die Frage: wie kann ich in der Notaus-ISR eine Subroutine aufrufen, die abgehandelt wird nachdem die ISR beendet ist?

    Eine Variable setzen wäre eine Möglichkeit, doch dann müsste ich in jede Programmschleife in der das Programm verweilt einen verweis auf die sub einbauen.

    Vielen dank schon mal für eure Antworten

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.02.2005
    Beiträge
    102
    Wenn ich das richtig in Erinnerung habe muss ein NOT-Aus tatsächlich alles lahm legen auf der Energieführenden Seite.

    Also müsste nach dem Not Aus der Atmel wieder gestartet werden. Da wird doch sicher eine Startroutine den Startzustand herstellen oder?
    ---------------o00o----' (_)' ----o00o----------------
    Wer Rechtschreibfehler findet darf sie behalten.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    16.11.2008
    Beiträge
    8
    Hallo,

    mein Notaus schaltet nicht den Strom aus, sondern leitet bei den Motoren eine Vollbremsung ein. Alles ist weiterhin mit Strom versorgt.

  4. #4
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Wenn es möglich ist, sollte beim Notaus der Strom direkt unterbrochen werden, also ohne einen µC.

    Es kann aber auch sein, dass man den Motor noch Bremsen muß oder sonstige nicht so einfache Aktionen (z.B. Licht an, Türen entriegeln, Lüftung noch ein paar Sekunden weiterlaufenlassen) ausführen muß, dann ist es OK das auch per µC zu machen. Der µC sollte dann in aller Regel aber auch einen Watchdogteimer und ähnliches haben.

    Man wird deshalb vermutlich von der ISR mehr oder weniger einen Klatstart ausführen müssen, fast so als wäre ein Reset ausgeführt. Das Wäre z.B: ein Sprung an die Addresse 0.
    Allerdings kann man dann kaum das normale Programm weiterführen - bei einem Notaus auch kaum sinnvoll.

  5. #5
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    66
    Beiträge
    10.969
    Hallo!

    Am einfachsten ist es in der ISR ein Flag setzen und dem Hauptprogramm das Flag überwachen lassen. Wenn das Flag gesetzt wird, sollte bestimmtes Unterprogramm aufgerufen werden. Das Flag muss während der Ausführung des Unterprogramms gelöscht werden.

    MfG

  6. #6
    TurboBusen
    Gast
    Besserwessi hat Recht!
    Ein NOTAUS hat eine Anlage in einen gefahrlosen Zustand zu versetzen. Wie das zu geschehen hat - aktiv oder passiv - hängt von der Anlage ab, und ist von einer verantwortlichen Person festzulegen, also z.B. der Projektingenieur.

    Ein Notaus per Software wird auch durch Verwendung eines ext. Interrupts nicht sicherer.

    TurboBusen

  7. #7
    TurboBusen
    Gast
    Zitat Zitat von PICture
    Hallo!

    Am einfachsten ist es in der ISR ein Flag setzen und dem Hauptprogramm das Flag überwachen lassen. Wenn das Flag gesetzt wird, sollte bestimmtes Unterprogramm aufgerufen werden. Das Flag muss während der Ausführung des Unterprogramms gelöscht werden.

    MfG
    Na dann könnte ich mir ja gleich den Interrupt sparen und den Eingangspin im Hauptprogramm abfragen.

    Ein NOTAUS ist in Hardware zu realisieren, ggf. durch eine spezielle redundante Steuerungen auch in Software. Der AVR darf allenfalls mitbekommen, dass ein NOTAUS betätigt wurde und die Wiedereinschaltung nach einem Bedienereingriff einleiten.

    TurboBusen

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    16.11.2008
    Beiträge
    8
    Hallo,

    Na dann könnte ich mir ja gleich den Interrupt sparen und den Eingangspin im Hauptprogramm abfragen.
    Genau das ist mein Problem. Ich wollte über einen Interrupt gehen, um nicht überall in den verschiedenen Schleifen des Hauptprogramms den Pin bzw. Flag überprüfen lassen zu müssen (ca. 15 verschiedene Schleifen in denen das Programm verweilen kann).

    Ein Sprung an Zeile 0 wäre eine Option, ich möchte aber eher eine Subroutine "Notaus" aufrufen, welche die Motoren bremst und bestimmte Stellungen anfährt. Damit dies möglich ist müssen aber meine anderen ISR wieder funktionieren. Also entweder muss ich meine ISR ohne Return verlassen oder die anderen ISR müssen weiterarbeiten obwohl ich mich noch in der ISR "Notaus" befinde.
    Geht das irgendwie?

    Danke für eure Hilfe
    Robtec

  9. #9
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Du kannst in der ISR die Interrupts auch wieder enablen
    "enable interrupts"
    und dann die Not-Sub normal "gosubben"

    CAVE: es kann dann aber auch die gegenständliche ISR nochmals aufgerufen werden. also aufpassen
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  10. #10
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Man kann zur Not ISRs wieder Zulassen in einer ISR. Das ist schon in C nicht einfach, bei Bascom hat man da zusätzliche Probleme mit sehr hohem Stackverbrauch. Auch muß man sicher gehen das der gleiche Interrupt nichtnochmal auftritt. Gerade für eine Sache die zuverlässig sein soll, sollte man nicht eine solch fehlerträchtige Methode wählen.

    Der bessere Weg wäre wohl der Kaltsstart.
    Das Programm muß dazu am Anfang klären, was den Reset ausgelöst hat und ggf. über Werte im IO Registern klären ob es ein echter Reset, oder der Sprung nach 0 war. Dann fängt das Programm sozusagen mit einem Notaus an, wenn kein echter Reset die Ursache war.
    Wenn da was schief geht, hat man am ehesten einen versehentlichen Notaus. Denn kann man über Störungen am Int Pin aber auch so bekommen.

    Wenn der Notaus sicherheitsrelevant ist, dann muß / sollte man das aber schon direkter in Hardware haben - Je einfacher desto besser, also eher Relais als Halbleiter. Vermutlich so, daß die Hardware die Motoren ausschaltet und die Software sich die Postionen usw. merkt damit danach wieder kontrolliert angefahren werden kann und ggf. ein Notbetreib möglich ist.

    Die Referenzfahrten usw. sollte man ohnehin erst wieder beim Einschalten danach durchführen.

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •