Danke,
wenn die Sache so ausfändig ist werd ich es über ein Flag realisieren. Hab nur gehofft dass es (über einen mir noch unbekannten Befehl) eleganter gehen würde.
Robtec
Druckbare Version
Danke,
wenn die Sache so ausfändig ist werd ich es über ein Flag realisieren. Hab nur gehofft dass es (über einen mir noch unbekannten Befehl) eleganter gehen würde.
Robtec
Hallo Robtec,
ich kann zwar nicht zur Lösung beitragen. Trotzdem ein Tip.
"Automatisches Regalsystem" hört sich nach gewerblicher Nutzung einer Anlage aus dem Maschinenbau an. Und da würde ich aus Erfahrung ganz genau die Vorschriften beachten. Not-Aus ist klar definiert bzw. wird nach SIL eingestuft und muss entsprechend realisiert werden.
Vielleicht kannst du es in deiner Anwendung als "Anlagen-Aus" einstufen; dann wird das ganze technisch und rechtlich viel einfacher.
Nicht falsch verstehen. Aber da bewegt man sich im Schadensfall mit einem Fuss im Kerker und der Staatsanwalt/TÜV zerfleischt dich.
gruss,
wassermann
Hallo Robtec,
beim Thema Notaus würde ich keine Kompromisse machen. Ein Schütz sollte die Stromversorgung der Motoren trennen, außerdem kannst du den MCU auf Reset ziehen. Das würde auch Überraschungen beim wiedereinschalten vorbeugen, da ein definierter Zustand eintritt.
Günter
Hi,
Zur Info: Ich studiere Maschinenbau an der Uni Stuttgart und das System ist im Rahmen einer Studienarbeit entstanden. Es ist ein kleines System, an dem die Funktionweise von Sensoren und Aktoren gezeigt werden soll, sowie deren Verknüpfung zu einem mechatronischen System. Bei dem Notaus geht es rein um die Funktion dass ich im alles jederzeit anhalten kann. Sonst müsste ich noch ganz andere Sicherheitsvorschriften beachten. Evtl. kann dies eine Folgearbeit leisten.
Ich finde aber wirklich gut wie eindringlich hier auch vor möglichen Folgen gewarnt wird, es gibt sicher den ein oder anderen der sich was zusammenschustert ohne die rechtliche Seite zu beachten.
Gruß
Robtec
War auch mein erster Gedanke.Zitat:
Zitat von wassermann
@Robotec: Poste uns doch bitte mal ein Bild von diesem Regalsystem, damit wir alle wissen womit wir es überhaupt hier zu tun haben.
TurboBusen
Wie schon gesagt wurde, ist es durchaus möglich während eines Interrupts einen weiteren Interrupt zu bedienen. Dafür muss das I-bit im SREG gesetzt werden. Zu Stack-Problemen sollte sowas eigentlich nicht führen, wenn dieser Not-Aus-Interrupt nicht sehr häufig hintereinander ausgeführt wird (=> Taste entprellen!!!).
Gruß, Yaro
Hallo
Das RETI am Ende einer ISR ist eigentlich ein normales Return das zusätzlich noch das betreffende Interruptflag löscht. Und da ein Return nur den Programmcounter mit dem obersten Wert des Stacks lädt, würde es ausreichen, wenn man in der ISR die orginale Rücksprungadresse vom Stack entfernt und durch die Adresse des Befehls ersetzt, bei dem das Programm nach dem Return fortgesetzt werden soll. Die ISR sollte wohl am Besten mit NOSAVE aufgerufen werden...
Wie man das umsetzt kann ich als Bascomlaie im Moment auch nicht sagen. Der Ansatz wird u.A. hier diskutiert:
http://robotikportal.de/phpBB2/viewt...=425913#425913
Gruß
mic
Das mit dem RETI ist glaub ich nicht ganz richtig....
Soweit ich weiß, wird das Flag von der Hardware gelöscht, sobald die ISR ausgeführt wird.
Das RETI unterscheidet sich von einem normalen RET dadurch, dass das I-bit im SREG gesetzt wird.
Nichtsdestotrotz sollte das mit dem Austauschen der Rücksprungadresse theoretisch möglich sein. Die Frage ist nur, ob das mit dem Bascom Compiler so einfach funktioniert, denn es könnte sein, dass dann irgendwelche Daten, verloren gehen (z.B. die, die sich während des Aufrufs der ISR gerade in Arbeitsregistern befanden).... da müsste man sich eingehend mit dem Compiler beschäftigen und ggf. nötige Daten zwischenspeichern.
Außerdem könnte sowas zu Problemen mit dem Speicher führen, weil Variablen, die auf dem Stack oder sonstwo vom normalen Programm zwischengespeichert wurden nicht wieder freigegeben werden, da das Programm an einer anderen Stelle weiterläuft, als geplant.
Gruß, Yaro
Die Hardware löscht das Flag zum Signaliseren des Interrupts und das I.Flag im SREG damit kein weiterer Interrupt angesprungen wird.
Ein Austauschen der Rücksprung adresse ist nicht gut. Dann kann man nicht mehr zurück zum Hauptprogramm und kann den rest des Stacks, was immer da noch von Unterprogrammen USW drauf ist nicht nutzen.
Wenn man nicht zurück will, sollte man den Stack gleich ganz neu initialisieren, da sammelt sich nur Müll.
Zum sprung nach der ISR könnte man die Sprungadresse auf den Stack tun und dann per RETI springen, oder man macht es übersichtlicher per SEI und eien normalen Sprung.
Wenn man später noch zurück zu der Stelle will, wo der Interrupt auftrat, kann man das auch: dann bleibt aber die alte Rücksprungadresse auf dem Stack und wird dann, wenn man wietermachen will mit einem RET genutzt.
Ist so nicht richtig, das ist möglich indem man sich die Adresse merkt, an der vom Interrupt unterbrochen wurde.Zitat:
Dann kann man nicht mehr zurück zum Hauptprogramm...
Mit einem bisserl ASM tut es das ohne Weiteres. :)Zitat:
Die Frage ist nur, ob das mit dem Bascom Compiler so einfach funktioniert, ...