PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupt? Was is das.



Robin1508
13.05.2008, 15:09
Hi, ich hab den Artikel im RN-Wissen Artikelbereich durchgelesen, dort steht zwar dass ein Interrupt eine Unterbrechung der Routine ist und so weiter, aber was bringt mir das ? Wozu soll ich mein Programm anhalten?
Ich steig da einfach nicht durch. Hab ich das komplett falsch Verstanden?

Gruß, Robin

BASTIUniversal
13.05.2008, 15:42
Hi!
Dein Programm hält bei einem Interrupt nicht einfach an, sondern springt zu einem Programmteil, der nur dann ausgeführt wird, wenn der Interrupt erfolgt ist.
Stell dir vor, du musst mit deinem Mikrocontroller einen Pin immer zu einer bestimmten Zeit an- und ausschalten. Um nicht dauernd im Hauptprogramm nur warten zu müssen, bis die Zeit rum ist, kannst du dir einen Timer stellen. Der Timer läuft dann automatisch im Hintergrund und erzeugt nach der von dir eingestellten Zeit einen Interrupt. Das Programm springt dann zu deiner Ein-Aus-Routine.
Im Hauptprogramm bleibt also genug Zeit, andere Dinge zu machen.

MfG
Basti

P.S.: Im Mikrocontroller-Forum passts besser -> Verschoben!

SIGINT
13.05.2008, 15:46
Na, das ist wie beim Coitus interruptus... du unterbrichst die eigentliche Tätigkeit um was wichtigeres zu machen. :cheesy:
Wenn z.B. deine Bude brennt ist das ja auch wichtiger, als für Nachwuchs zu sorgen.

Gruß,
SIGINT

P.S.: Mist, war jemand schneller...

Robin1508
14.05.2008, 13:00
Achso, ok, aber wie Benutz ich dann so ein interrupt? Gibts warscheinlich keine "interrupt befehls palette" oder, man muss es eben über Timer oder so machen, und das ganze nennt sich dann einfach >Interrupt< .. ?


Gruß

Jaecko
14.05.2008, 13:19
Naja, ne Tabelle, welche Interrupts möglich sind, gibts sicher irgendwo.
Bei einigen µCs gibts ne extra Seite im Datenblatt, auf der alle möglichen Interrupt-Vektoren drinstehen.

Aber nicht jeder Interrupt muss über nen Timer ausgelöst werden. Es gibt z.B. auch die, bei denen einfach der Pegel an nem Pin überwacht wird. Ändert sich dieser, wird der Interrupt ausgelöst.
Ebenso für die serielle Schnittstelle; wenn z.B. neue Daten vorliegen oder die Übertragung beendet ist.
Da packt jeder µC-Hersteller verschiedenste Typen rein.

Robin1508
14.05.2008, 13:24
Also an nem Beispiel festgelegt:

Ich hab irgentwo ne Sprungmarke in meinem µC, und irgentwo ne "If" Abfrage. Wenn ich jetzt innerhalb der If Abfrage zu der Sprungmarke spring, weil z.B. PinC1 = 1 ist, dann bezeichnet man das als Interrupt?

Jaecko
14.05.2008, 13:46
Ne, das nennt sich "Polling"... d.h. der Sprung wird nur ausgeführt, wenn die Bedingung wahr ist und das Programm zufällig gerade an dieser If-Abfrage ist. Ist das Programm woanders, wird die Sprungmarke nicht angesprungen.

Der Interrupt wird definiert (auch mit einer Sprungmarke) und unterbricht ("interrupt") das Programm an der aktuellen Stelle, d.h. die aktuelle Anweisung wird noch beendet, danach wird die Sprungmarke angesprungen. Unabhängig davon, wo das Programm gerade ist.
Vorteil: Extrem schnelles reagieren auf Ereignisse.
Wobei ein Interrupt selbst nochmal durch einen Interrupt mit höherer Priorität unterbrochen werden kann.
Der, der sich z.B. immer durchsetzt, ist RESET.

Also Polling: Dauert ein Durchlauf der Main-Loop 1 Sekunde, wird der Pin nur 1x pro Sekunde abgefragt. Wenn das Programm halt gerade mal vorbeischaut.

Interrupt: Die Pin-Änderung wird innerhalb weniger CPU-Zyklen erkannt und "verarbeitet". Je nach CPU-Takt sind dies wenige µs oder sogar nur ns.

Andree-HB
14.05.2008, 13:48
...wie hat hier mal Jemand so schön beschrieben :

Ein Postbote teilt seine Briefe in einer Strasse aus, zwischendurch ruft Jemand von ein paar Häusern vorher "Hey, Du hast hier einen Beutel mit Briefen liegengelassen"...der Postbote latscht dort hin, holt den Beutel und fängt an der gleichen Stelle wieder an, die Briefe zu verteilen, wo er kurz zuvor aufgehört hat.

Somit hat er gerade einen externen Interrupt durchgemacht

....wenn er hingegen immer alle 30 Minuten neue Briefe aus einem Verteilerkasten holen muss, dann macht er einen timergesteuerten Interrupt durch.

Robin1508
14.05.2008, 14:01
ok, gutes Beispiel, danke. Aber wie programmier ich dann so ne Interrupt Abfrage, ob der Pin jetzt nun 1 ist oder 0 ? Das muss ja quasi auch in meinem Programmcode sein und dann wird es ja wieder nur an der bestimmten Stelle abgefragt. Gut, das eine ist ein Timer, der (zumindest Hardware) Timer läuft ja unabhängig zum Programmcode.
Aber was gibts sonst für Methoden?

Jaecko
14.05.2008, 14:06
Wie die Interrupt-Konfigurationen aussehen müssen kommt halt drauf an.
Bei Bascom mit nem Pin wärs z.B.
CONFIG INT0 = x.
Wobei INT0 der Pin mit der Funktion "INT0" ist;
x kann sein:
- LOW LEVEL: Interrupt wird solange ausgeführt, solange der Pin auf Masse liegt.
- FALLING: Interrupt wird beim Wechsel von 5V => 0V ausgelöst.
- RISING: ausgelöst von 0V => 5V
- CHANGE: Bei jedem Pegelwechsel auslösen.

mit "ON INT0 ISR_INT0" wird festgelegt, dass der Interrupt 0 beim Auftreten an die Sprungmarke ISR_INT0 springen soll.

Danach noch mit ENABLE INT0 einschalten.

Robin1508
14.05.2008, 14:53
alles klar, Danke :)

askazo
14.05.2008, 15:03
Ich versuche mal, das hier alles ein wenig zusammenzufassen:

Bei einem Interrupt wird die aktuell laufende Befehlskette unterbrochen, um einen anderen Programmabschnitt auszuführen. Nach der Ausführung dieses Programnmabschnitts kehrt der Controller wieder zu seiner vorherigen Position zurück.

Ein Interrupt wird verwendet, um
a) zeitkritische Funktionen zu erledigen
b) den Prozessor zu entlasten

Ein Beispiel zu a)
Du willst ein Signal abfragen, das aber sehr kurz ist, z.B. einen Impuls mit der Dauer 1µs. Die Durchlaufzeit Deiner Hauptschleife beträgt aber z.B. 10µs. Wenn Du in der Hauptschleife eine if-Abfrage ausführst, um den Impuls zu erfassen, ist es sehr wahrscheinlich, dass Du den Impuls verpasst. Benutzt Du einen Interrupt, erkennt der Prozessor den Impuls sofort und kann in der Interruptroutine entsprechend darauf reagieren. Somit wird kein Impuls verpasst.

Diese Hardware-Interrupts werden auch zum Auslesen von Kommunikationsleitungen verwendet, damit keine Übertragungen verloren gehen.

Ein Beispiel zu b)
Du willst einige Taster abfragen. Fragst Du die Taster per if in Deiner Hauptschleife ab, muss der Prozessor diese Abfrage bei jedem Durchlauf abarbeiten, auch wenn kein Taster gedrückt wurde. Das kostet Rechenzeit.
Hier kann man dann per Timer einen Interrupt z.B. alle 100 Millisekunden erzeugen lassen, durch den dann die Taster abgefragt werden. Dadurch wird der Controller entlastet.

Wichtig ist, dass Interruptroutinen möglichst kurz gehalten werden, vor allem dann, wenn mehrere Interruptroutinen benutzt werden.

Gruß,
askazo

Felix G
14.05.2008, 19:04
Das muss ja quasi auch in meinem Programmcode sein und dann wird es ja wieder nur an der bestimmten Stelle abgefragt.Dazu vielleicht noch ein paar Worte, da es bisher nicht explizit erwähnt wurde:

Ja, um Interrupts zu nutzen müssen gewisse Dinge in deinem Programmcode stehen...

1. die ISR (also die Funktion welche bei einem bestimmten Interrupt aufgerufen werden soll)

2. die Konfiguration der Interrupts


Du programmierst also nicht "so, jetzt schau mal nach ob Pin X von LOW auf HIGH gesprungen ist, und falls ja springe zur ISR Y" sondern "hey, falls irgendwann mal PIN X von LOW auf HIGH springt, bitte geh zur ISR Y"

anders ausgedrückt:
der Sprung in die ISR (als Reaktion auf ein bestimmtes vorher eingestelltes Ereignis), erfolgt rein hardwaremäßig. Nicht du musst dich darum kümmern, sondern der Mikrocontroller.

rideyourstyle
14.05.2008, 20:14
Der Interrupt wird definiert (auch mit einer Sprungmarke) und unterbricht ("interrupt") das Programm an der aktuellen Stelle, d.h. die aktuelle Anweisung wird noch beendet, danach wird die Sprungmarke angesprungen.

Nicht ganz. Bei einem Interrupt (gut Deutsch Unterbruch) wird das aktuelle Programm SOFORT unterbrochen. Darum ist es auch wichtig, die Variablen in einem Programm, die vom Interrupt tangiert werden könnten, am Anfang es Interruptes zu sichern und kurz vor Ende der Intertuptroutine diese wieder herstellen, damit das unterbrochene Programm mit den korrekten Werten weiteraufgeführt werden kann.


Naja, ne Tabelle, welche Interrupts möglich sind, gibts sicher irgendwo.

Steht im jeweiligen Datenblatt des Controllers...

Sonst ist eignetlich alles gesagt worden.

Felix G
14.05.2008, 20:27
Bei einem Interrupt (gut Deutsch Unterbruch) wird das aktuelle Programm SOFORT unterbrochen.Sofort geht nicht, der AVR kann schließlich nicht einfach einen Maschinenbefehl abbrechen, den er gerade abarbeiten soll. Auf den Interrupt reagiert er also erst, wenn er mit seinem aktuellen Befehl fertig ist.



Darum ist es auch wichtig, die Variablen in einem Programm, die vom Interrupt tangiert werden könnten, am Anfang es Interruptes zu sichern und kurz vor Ende der Intertuptroutine diese wieder herstellen, damit das unterbrochene Programm mit den korrekten Werten weiteraufgeführt werden kann.Das würde ich so jetzt nicht sagen...

Bei Assembler muss man die im Interrupt genutzten Register erstmal sichern, damit das Programm später fehlerfrei fortgesetzt werden kann, bei C hingegen nimmt einem der Compiler diese Arbeit ab, es sei denn man verbietet es ihm explizit.

Und Variablen muss man im Normalfall sowieso nicht sichern, denn wenn ein Programm die Änderung einer Variable durch eine ISR nicht verkraftet, dann ist es meiner Meinung nach schlecht programmiert. Meist ist es ja sogar die einzige Aufgabe einer ISR irgendeinen Wert in irgendeine Variable zu schreiben, würde man diese dann vor dem Rücksprung wiederherstellen, hätte man sich den kompletten Interrupt sparen können.

McJenso
14.05.2008, 21:10
Bei einem Interrupt (gut Deutsch Unterbruch) wird das aktuelle Programm SOFORT unterbrochen.Sofort geht nicht, der AVR kann schließlich nicht einfach einen Maschinenbefehl abbrechen, den er gerade abarbeiten soll. Auf den Interrupt reagiert er also erst, wenn er mit seinem aktuellen Befehl fertig ist.

Entscheident hierbei ist das Verständnis des Wortes Anweisung/Befehl. Beim einem AtMega kann eine Anweisung die mehrere Takte dauert sehr wohl von einem Interrupt unterbrochen werden. Das kann zu sehr hässlichen Effekte führen. In solchen Fälle verbietet man die Interrupts vor dem Befehl und erlaubt sie danach wieder. Außerdem nennt sich das Critical Section und hört sich wichtig an. :-s
Eine Anweisung die nur einen Takt benötigt kann allerdings wirklich nicht unterbrochen werden :-)


Es gibt Programme die nur auf Ereignisse reagieren, die Interrupts auslösen. Man könnte fast sagen, die ereignisgesteuert sind. Die "Hauptschleife" bei diesen Programmen ist leer.

Gruß

Jens

Felix G
14.05.2008, 21:27
Beim einem AtMega kann eine Anweisung die mehrere Takte dauert sehr wohl von einem Interrupt unterbrochen werden.


If an interrupt occurs during execution of a multi-cycle
instruction, this instruction is completed before the interrupt is served.Alles andere wäre auch sinnlos...
stell dir mal vor der AVR würde mitten in einem CALL (4 Zyklen) her gehen, und irgendwas anderes tun ... wo soll er dann nach der ISR hin springen?



Es gibt Programme die nur auf Ereignisse reagieren, die Interrupts auslösen. Man könnte fast sagen, die ereignisgesteuert sind. Die "Hauptschleife" bei diesen Programmen ist leer.Man könnte ein Programm so schreiben, aber empfehlen würde ich es nicht, da die ISRs sonst zu groß werden. Man stelle sich nur mal ein Programm mit 4 oder 5 Interrupts vor, bei denen die Routinen derart lang sind, daß sie sich ständig gegenseitig unterbrechen ... viel Spaß beim debuggen.

Meiner Meinung nach sollte man in den ISRs nur jeweils einzelne Flags setzen, und vielleicht noch einige Variablen ändern. Die eigentliche Arbeit, also komplexe Berechnungen etc. erledigt man dann sinnvollerweise woanders, nämlich in der Hauptschleife ("Flag XY gesetzt? gut, dann führe Funktion Z aus")

McJenso
14.05.2008, 21:38
Hallo,

oh sorry, ich war so sehr in C. Es gibt in C Befehle die z.B. je nach Variablengröße in einen oder mehrere asm-Befehle übersetzt werden.
Da gilt das von mir geschriebene. Ansonsten hast du recht und was da steht ist so Quatsch. :oops:

Da schreib ich noch, dass es auf die def. von Befehl ankommt ...

Gruß

Jens

Felix G
14.05.2008, 22:14
Ach so war das gemeint, dann ist alles klar...

bei C weiß man natürlich erst dann genau wieviel Assemblercode letztendlich entsteht, wenn man im Listing nachschaut.


Also: je weniger Variablen man in einer ISR ändert, desto besser. Denn in C kann sogar das setzen eines einzelnen Bits in einer Variable unter Umständen von einem Interrupt unterbrochen werden (je nachdem was der Compiler draus macht). Dennoch sollte das nicht zu Problemen führen, wenn man diesen Fall beim Programmieren im Hinterkopf behält, und das Programm entsprechend strukturiert.

Setzt man in einer ISR z.B. tatsächlich nur ein Flag, und erledigt die eigentliche Arbeit in der Hauptschleife, braucht man sich wegen solchen Dingen keine Sorgen machen (Ausnahme: der ADC, da kann es durchaus sinnvoll/notwendig sein den Interrupt abzuschalten, bevor man den aktuellen Wert ausliest).

rideyourstyle
14.05.2008, 22:41
...Darum ist es auch wichtig, die Variablen in einem Programm, die vom Interrupt tangiert werden könnten...

Bei Assembler muss man die im Interrupt genutzten Register erstmal sichern, damit das Programm später fehlerfrei fortgesetzt werden kann, bei C hingegen nimmt einem der Compiler diese Arbeit ab, es sei denn man verbietet es ihm explizit.

Register meinte ich eigentlich. Anderseits kann man bei Assembler die Register umbenennen. Klassiches Beispiel temp1. Also kann man temp1 wie eine Variable anschauen...

Robin1508
15.05.2008, 19:24
Ok, danke für die Theorie. Doch ich habs irgentwie immernoch nich so gecheckt wie ich das jetzt meinem Bascom beibringe..
Kann mir bitte jemand nen ganz einfachen Code geben, in dem ein Interrupt vorkommt?

wkrug
15.05.2008, 20:28
Doch ich habs irgentwie immernoch nich so gecheckt wie ich das jetzt meinem Bascom beibringe.
Wie wärs mit:


Partial Example

Enable Interrupts

Enable Int0 'enable the interrupt

On Int0 Label2 Nosave 'jump to label2 on INT0

Do'endless loop

nop

Loop

End



Label2:

Dim A AsByte

If A > 1 Then

Return 'generates a RET because it is inside a condition

EndIf

Return 'generates a RETI because it is the first RETURN

Return 'generates a RET because it is the second RETURN




Steht so übrigens 1:1 in der BASCOM Hilfe !?

Robin1508
15.05.2008, 20:41
Ja, auf meinem Werkstatt-Laptop funktioniert die Bascom Hilfe merkwürdigerweise nicht. Und auf dem anderen PC hab ich (bequemlicherweise) kein Bascom drauf ^^

Aber danke!

taximan
15.05.2008, 22:03
"Ja, auf meinem Werkstatt-Laptop funktioniert die Bascom Hilfe merkwürdigerweise nicht. Und auf dem anderen PC hab ich (bequemlicherweise) kein Bascom drauf ^^ "

is da evtl Vista drauf? Ich meine die Hilfedateien wären leicht unterschiedlich.

Robin1508
15.05.2008, 23:56
ne kein Vista, sondern Win95 auf 333mhz.
Abundzu schaltet sich auch mal die Festplatte ab ... ^^
Aber man kauft sich halt doch lieber Sensoren wie nen neuen (alten) Laptop :P

rideyourstyle
16.05.2008, 07:10
Hey ich hatte auch so ne alte Kiste. Versuchs mal mit Windows2000. Mit dem stürtzte die Kiste nicht jede halbe Stunde ab und die Programme liefen auch alle. Ok ist auch wieder drei Jahre her ;-)