PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupt



amal
21.07.2011, 09:03
einen schönen morgen,
eine Frage habe ich und zwar: ich arbeite mit 2 INTERRUPT INT0 und INT1, in INT0 habe ich eine Fct0"START" und in INT1 habe ich die Fct1 "RESET", ich möchte gern das die Fct1 die Fct0 unterbrechen muss. moment wenn Fct0 läuft, passiert nicht wenn ich INT1 auslöse, der wartet ab bis Fct1 durch ist.
danke

Kampi
21.07.2011, 09:24
Wenn ich das richtig verstanden habe besteht dein Problem darin das der Controllert den INT1 ignoriert sobald der INT0 ausgelöst wurde?
Wenn das so ist liegt das daran das der INT0 von der Priorität höher liegt als der INT1.
Das kannst du hier nochmal nachlesen:
http://www.tschallener.net/AVR/InterrupttechnikATmega32.pdf

Hubert.G
21.07.2011, 09:59
Ich nehme mal an das du mit ATmega oder ATtiny arbeitetst. Bei diesen haben die Interrupts gleiche Priorität. Es wird der nächste Interrupt erst abgearbeitet wenn der Vorhergehende beendet ist.
Die einzige Möglichkeit ist, den generellen Interrupt wieder mit (sei); freizugeben. Dies gilt allerdings für alle Interrupts und ist sehr gefährlich wenn man nicht genau weiss was man tut. Es könnte bei dir z.B. der INT0 wieder auslösen wenn der vorhergehende noch nicht abgearbeitet ist. Es kann sehr schnell zu Stacküberlauf und undefinierten Verhalten führen.

Kampi
21.07.2011, 10:26
Wie ist das den dann in dem PDF mit den unterschiedlichen Prioritäten gemeint wenn alle die gleiche Prio haben sollen?
BIn gerade etwas verwirrt :(

sternst
21.07.2011, 10:37
Wie ist das den dann in dem PDF mit den unterschiedlichen Prioritäten gemeint wenn alle die gleiche Prio haben sollen?
BIn gerade etwas verwirrt :(Die Priorität entscheidet nur darüber, in welcher Reihenfolge die Interrupts bedient werden, wenn mehrere anliegen.

amal
21.07.2011, 10:40
Ich nehme mal an das du mit ATmega oder ATtiny arbeitetst. Bei diesen haben die Interrupts gleiche Priorität. Es wird der nächste Interrupt erst abgearbeitet wenn der Vorhergehende beendet ist.
Die einzige Möglichkeit ist, den generellen Interrupt wieder mit (sei); freizugeben. Dies gilt allerdings für alle Interrupts und ist sehr gefährlich wenn man nicht genau weiss was man tut. Es könnte bei dir z.B. der INT0 wieder auslösen wenn der vorhergehende noch nicht abgearbeitet ist. Es kann sehr schnell zu Stacküberlauf und undefinierten Verhalten führen.

ja ich arbeite mit Atmega88, und ich habe jetzt in Interrupt 0 sei(), eingfügt, und der hat Int1 untergebrochen, aber nach dem Ablauf des INT1 hat er weiter INT0 ausgeführt, das wöllte ich auch nicht, der sollte INT0 unterbrechen und raus von der Int0 und nicht wieder zurück

Kampi
21.07.2011, 10:50
Die Priorität entscheidet nur darüber, in welcher Reihenfolge die Interrupts bedient werden, wenn mehrere anliegen.

Ah ok. Danke!

Hubert.G
21.07.2011, 11:40
Wenn der INT0 unterbrochen wird und nach Ende des INT1 nicht mehr weiter bearbeitet werden soll, dann musst du dir dafür eine Routine in Assembler selbst schreiben. Du musst sämtliche Registersicherungen die bei Beginn eines Interrupt geschehen wieder Rückgängig machen.

amal
21.07.2011, 11:51
dann musst du dir dafür eine Routine in Assembler selbst schreiben.
ich kann leider nicht in Assembler programmieren.

amal
21.07.2011, 13:26
wie wäre es mit dem Watchdog

Hubert.G
21.07.2011, 13:52
Mit dem Watchdog kannst du nur einen Reset auslösen.

amal
21.07.2011, 16:32
ich habe den Interrupt mit Reti() gestoppt, und das hat funktioniert.

Felix G
21.07.2011, 23:09
Schön wenn es jetzt funktioniert, aber das ist so eigentlich nicht gedacht...

ich habe zwar keine Ahnung was du eigentlich erreichen willst, bin mir aber sicher daß sich das Problem auch auf einem wesentlich einfacheren Weg lösen lässt.
Wie dieser Weg aussieht kann ich dir allerdings nicht sagen, da ich das eigentliche Problem nicht kenne.


Eine Lösung, die das "Abbrechen" von Interrupts (oder ähnliche Verrenkungen) erfordert, ist eigentlich keine echte Lösung.

BurningWave
22.07.2011, 23:38
Im Prinzip könntest du in deinen Interrupts je ein Flag setzen und in der Hauptschleife dementsprechend Aktionen durchführen und/oder das eine Flag ignorieren, wenn das andere gesetzt ist.