- fchao-Sinus-Wechselrichter AliExpress         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 26

Thema: Interrupt? Was is das.

  1. #11
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.01.2007
    Ort
    Bodenseeregion
    Alter
    34
    Beiträge
    135
    Anzeige

    Praxistest und DIY Projekte
    alles klar, Danke

  2. #12
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    49
    Beiträge
    1.146
    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

  3. #13
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    41
    Beiträge
    1.780
    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.
    So viele Treppen und so wenig Zeit!

  4. #14
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    15.03.2005
    Ort
    gerne in den Bergen
    Alter
    40
    Beiträge
    429
    Zitat Zitat von Jaecko
    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.

    Zitat Zitat von Jaecko
    Naja, ne Tabelle, welche Interrupts möglich sind, gibts sicher irgendwo.
    Steht im jeweiligen Datenblatt des Controllers...

    Sonst ist eignetlich alles gesagt worden.
    ...wer nicht findet hat nicht gesucht...

  5. #15
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    41
    Beiträge
    1.780
    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.
    So viele Treppen und so wenig Zeit!

  6. #16
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    20.05.2006
    Ort
    Lippe
    Alter
    55
    Beiträge
    524
    Zitat Zitat von Felix G
    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.
    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

  7. #17
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    41
    Beiträge
    1.780
    Beim einem AtMega kann eine Anweisung die mehrere Takte dauert sehr wohl von einem Interrupt unterbrochen werden.
    Zitat Zitat von ATmega32 Datenblatt, Seite 13
    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")
    So viele Treppen und so wenig Zeit!

  8. #18
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    20.05.2006
    Ort
    Lippe
    Alter
    55
    Beiträge
    524
    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.

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

    Gruß

    Jens

  9. #19
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    41
    Beiträge
    1.780
    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).
    So viele Treppen und so wenig Zeit!

  10. #20
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    15.03.2005
    Ort
    gerne in den Bergen
    Alter
    40
    Beiträge
    429
    ...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...
    ...wer nicht findet hat nicht gesucht...

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress