Forum: Mikrocontroller und Digitale Elektronik Interrupts unterbrechen


von Steffen (Gast)


Lesenswert?

Moin Moin!

Ich hab da ein kleines Problem mit den Interrupts.
Habe hier und im RN schon gesucht, aber nichts sinnvolles gefunden.
Im Datenblatt hab ichs auch nicht gefunden.

Details:
- Programmiere in C
- ATmega16
- Am INT0 und INT1 hängt jeweils ein Taster nach Masse, interne Pullups 
gesetzt.
- HW ist getestet und tut.

Funktion:
- main initialisiert die HW und wartet dann auf ISR
- Taste 1 startet ISR(INT0_vect) -> Notaus
- Taste 2 startet ISR(INT1_vect) -> Messung


Nun das Problem:

Ich will durch auslösen von INT 0 die Messung (ISR INT 1) abbrechen und 
nach Ausführung der Notausroutine ins hauptprogramm zurückspringen.
Es soll also nicht wieder zurück an die Stelle des Aufrufs springen und 
den Rest ausführen.

Ist sowas möglich?
Da INT0 stärker ist als INT1, müsste das doch gehn, oder?


Dank und Grüßle
    Steffen

von 6636 (Gast)


Lesenswert?

Tasten sind es meist nicht Wert auf Interrupts gelegt zu werden. Zudem 
sollten ISRs kurz sein. Da gibt es eignetlich nie was zu Unterbrechen.

von STK500-Besitzer (Gast)


Lesenswert?

Warum packst du die Messugn nicht einfach in eine normale Funktion, die 
durch INT0 unterbrochen werden kann?
Wie wird die Messung ausgelöst? Durch einen Tastendruck womöglich?

von STK500-Besitzer (Gast)


Lesenswert?

Man sollte alles lesen.
Pack die Tastenabfrage in eine Polling-Schleife. Dann kann dein NOT-AUS 
jederzeit zuschlagen.

von Falk B. (falk)


Lesenswert?

@ Steffen (Gast)

>- main initialisiert die HW und wartet dann auf ISR
>- Taste 1 startet ISR(INT0_vect) -> Notaus
>- Taste 2 startet ISR(INT1_vect) -> Messung

Notaus über Software? Naja . . .

>Ich will durch auslösen von INT 0 die Messung (ISR INT 1) abbrechen und
>nach Ausführung der Notausroutine ins hauptprogramm zurückspringen.
>Es soll also nicht wieder zurück an die Stelle des Aufrufs springen und
>den Rest ausführen.
>Ist sowas möglich?

Ja, Goto 0 oder einen Watchdog Reset provozieren.

>Da INT0 stärker ist als INT1, müsste das doch gehn, oder?

Nee, der AVR hat keine echten Interruptprioritäten

Interrupt

Wie STK500-Besitzer schon schrieb, mach die Messung im Hauptprogramm, 
gestartet über ein Flag im Interrupt.

MfG
Falk

von Steffen (Gast)


Lesenswert?

@6636
dein Post ist wie Taster auf Interrupts setzen: Nichts wert!


@STK500-Besitzer
Ja, wie beschrieben wird die Messung über Tastendruck gestartet.
Muss so sein, da der User quitieren muss.


@Falk
Hab ich schon probiert.
Der Abbruch kommt auch, aber am Schluss der Abbruchroutine springt er 
wieder mitten in den Code der Messung zurück.

Wie kann ich das verhindern?
Rücksprungadress ist ja im Stack drin, und da will er nach der ISR 
wieder hin.

Grüßle

von Oliver (Gast)


Lesenswert?

Häng den Notaustaster als Öffner in die Spannungsversorgung des Mega16. 
Das gibt genau deinen oben gewünschten Effekt :-)

Oliver

von Rolf Magnus (Gast)


Lesenswert?

> @6636
> dein Post ist wie Taster auf Interrupts setzen: Nichts wert!

wie wäre es, wenn du Leute, die versuchen, dir zu helfen, nicht 
anscheißt? Er hat recht. ISRs sollten immer kurz sein, und Tasten fragt 
man nicht per Interrupt ab, schon alleine weil die prellen.

> Rücksprungadress ist ja im Stack drin, und da will er nach der ISR
> wieder hin.

Natürlich.
Du hast bisher nur unzureichend dein Programm beschrieben. Wie sieht 
denn so eine Messung überhaupt aus? Was macht deine Software? Wartet sie 
da in einer Schleife auf etwas? Dann kannst du einfach in dieser 
Schleife ein Flag zum Abbrechen verwenden. Dieses Flag wird dann in der 
ISR gesetzt.

von Falk B. (falk)


Lesenswert?

@ Steffen (Gast)

>Der Abbruch kommt auch, aber am Schluss der Abbruchroutine springt er
>wieder mitten in den Code der Messung zurück.

>Wie kann ich das verhindern?

Hab ich das nicht geschrieben? In deiner Notaus-ISR kommt entweder ein 
Sprung an Adress Null hin oder du schaltest den Watchdog ein und gehst 
in eine Endlosschleife. Der Watchdog macht dann einen Reset.

MfG
Falk

von STK500-Besitzer (Gast)


Lesenswert?

Richtige Notaus darf man eh nicht an Software koppeln.
Redundant sollte die Notaus-Schaltung dann auch noch sein.

In der Notaus-ISR müsste man die Steuerung in einen stabilen Zustand 
bringen (alle Motoren aus etc) und dann auf das Eintreffen des Watchdog 
waren.
Eine andere Möglichkeit hat man bei AVR nicht.

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Sobald Du in eine ISR eintrittst, sind die Interrupts global 
deaktiviert, man kann sie aber explizit wieder einschalten, das nennt 
sich "nested interrupts", was auch im Datenblatt steht. Das ist aber 
keine so gute Idee, sieh lieber zu das besser zu loesen.

Gruss,
Michael

von Peter D. (peda)


Lesenswert?

STK500-Besitzer wrote:
> Richtige Notaus darf man eh nicht an Software koppeln.

Das fällt aber unter die Rubrik "Sagen und Gerüchte".

Es gibt industrielle Notaus-Taster am CAN-Bus.
Diese senden ständig ein Wohlfühl-Telegramm.
Und der Motorkontroller stoppt, wenn dieses Telegramm ausbleibt oder ein 
Stop-Telegramm kommt.


Peter

von Sebastian (Gast)


Lesenswert?

Sind das dann nicht nur Not-Stop bzw. Maschine-Stop/Maschine-Aus Taster? 
Ich dachte auch, dass sich nur das Notaus nennen darf, was wirklich 
hardwaremäßig schluss macht. Der Controller darf natürlich auch was 
davon mitbekommen und reagieren, aber hardwarmäßig muss halt schluss 
sein. So wurde mir das erklärt.


Zum eigentlichen Problem wurde ja eigentlich schon alles gesagt. 
Interrupts kurz halten. Polls ins normale Programm verlegen. Und im 
"Not-Aus"-Interrupt entweder von Hand am Interrupt-flag und Stack 
pfuschen und dann zum Anfang springen, oder halt auf den Wachhund 
warten, was ich persönlich als sinvoller empfinde.

Sebastian

von Tubie (Gast)


Lesenswert?

Notaus muß nicht immer auf Hardware beruhen, kann auch Software sein.

Wir haben Maschinen bei uns in der Firma Schleifmaschinen stehen, die 
15kW antriebsleistung haben. Wenn ich da auf den Notaus drücke, sorgt 
die Steuerung dafür, das erst die Antriebe abgebremst werden und 
anschließend werden diese Stromlos geschaltet. Ohne den Bremsvorgang 
läuft solch ein Antrieb gut und gerne noch 60 sec nach. Dies passiert, 
wenn man die Steuerung vor den Schleifscheiben ausschaltet.

Gruß,
Tubie

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Wenn man das ganze dann noch mit einer Krone aus Laecherlichkeit zieren 
will,  verbaut man Notaus-Taster mit Schloss, wie bei uns in den 
Rechnerlaboren. So dass, sollte der Notaus benoetigt werden, dieser 
nicht benutzt werden kann, da er abgeschlossen ist. Absperrbare 
Notausgaenge fehlen uns auch schon lange.

von Falk B. (falk)


Lesenswert?

@  Tubie (Gast)

>Notaus muß nicht immer auf Hardware beruhen, kann auch Software sein.

Naja, wird man aber nur ungern wählen

>die Steuerung dafür, das erst die Antriebe abgebremst werden und
>anschließend werden diese Stromlos geschaltet. Ohne den Bremsvorgang

Wer sagt denn, dass das per Software passiert?

MfG
falk

von STK500-Besitzer (Gast)


Lesenswert?

>Das fällt aber unter die Rubrik "Sagen und Gerüchte".

Wenn man den Notaus in Software als Totmannschalter (periodische 
Triggerung eines Monoflops) realisiert, ist das noch in Ordnung. Wobei 
die Maschine bei einem Ausbleiben des Triggers in einen sicheren Zustand 
übergehen muß.
Eine solche Schaltung (mit Redundanz) habe ich bei einer Steuerung für 
eine Druckmaschine "erleben" dürfen.
In den Schaltplänen wurde sie speziell markiert und durfte nur in der 
dargestellten Form verwendet werden (irgendeine Sicherheitsbehörde hatte 
die Schaltung so abgenommen).

Zur Schleifmaschine: Die Bremse dürfte eigentlich nur so geschaltet 
sein, dass sie im stromlosen Zustand zupackt".
LKW-Bremsen sind ja auch nur gelöst, wenn Luftdruck anliegt...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.