interupt aber wann?

Gast #1252279
Lesenswert?

Es gibt mehrere Fälle (Liste unvollständig):

- wenn sofortige Reaktion nötig ist (Aktion mit möglichst
  kurzer Verzögerung für z.B. Registersicherung)

- wenn Aktionen unabhängig vom Hauptprogramm ablaufen sollen
  z.B. RS232 senden/empfangen mit Buffer, Timeranwendungen

- Ereignisse erkannt werden sollen, die man im Hauptprogramm
  nicht pollen kann, z.B. Signalwechsel

- zum Aufwecken aus Stromsparmodi wie PowerDown

Oft wird in einem Interrupt auch nur ein Flag für das
Hauptprogramm gesetzt und dann in der Main reagiert.

gruß hans
Gast #1252444
Lesenswert?

Eine oder mehrere Timer-ISR im Hintergrund laufen zu haben, die sich um 
eingehende Ereignisse kümmern, und das Hauptprogramm über Flags 
informieren, wenn es etwas zu tun gibt, ist ein erprobtes Konzept für 
übliche Mikrocontroller-Anwendungen.

Oliver
#1252839
Lesenswert?

Hi
Ich glaube, am Timer kann man sehr gut ein Beispiel Pollen- Interrupt 
setzen.
Es gibt im MC ein Zählregister, welches unabhängig vom Programm 
incrementiert oder decrementiert wird. Es hängt einfach am Takt.
Mit diesem Zählregister lassen sich nun Timer programmieren, da der Takt 
bekannt ist und man nun einfach ein paar Takte abwarten muß, um nun 1 ms 
oder ein paar Takte mehr Minuten oder Stunden zu setzen.
Nun wissen wir, das ein Programm für die Bearbeitung eine Anzahl an 
Takten benötigt. Je nach Umfang und Verzweigungen innerhalb der 
Programmstruktur dauert ein Zyklus nun unterschiedlich lange, bis ein 
Programm wieder eine bestimmte Stelle erreicht. Anfang, Mitte, Ende, 
egal, den Aufruf, den ich bräuchte, um eine Anzahl an Zählimpulsen zu 
erkennen und die ms oder Stunde entsprechend zu erhöhen. Meine "Uhr" 
würde relativ schnell aus dem Ruder laufen.
Nun kommen wir zum Interrupt. Es ist eine Unterbrechung des laufenden 
Programmes, um einen bestimmten Programmabschnitt zu bearbeiten. In 
unserem Fall würden wir einen Zähler vorbesetzen und ihm sagen laufe 
mal rückwärts gegen Null. Wenn der Zählerstand 0 ist, löse einen 
Interrupt aus. Dies geschieht, indem innerhalb des Prozessors ein Flag 
gesetzt wird und den Prozessor zwingt, eine bestimmte Stelle im Programm 
anzuspringen. Die sogenannte Interruptvektoradresse. Dort steht dann 
meist ein Reti oder eben ein Sprung zur Serviceroutine, also meinem 
eigentlichen zeitkritischen Programmteil.
Im Interrupt wird folgendes getan:
Zuerst werden die Register die innerhalb der Interruptroutine benötigt 
werden zwischengespeichert. Also Push Register.
Dies ist notwändig, weil niemand sagen kann, ob der Wert innerhalb des 
Registers im Programm nicht noch benötigt wird.
Anschließend aktualisiere ich die Zeitwerte und schreibe in den Zähler 
erneut den Startwert, ab welchem wieder heruntergezählt wird.
Ist meine Bearbeitung beendet, werden über Pop die Registerwerte 
zurückgeschrieben, in umgekehrter Reihenfolge, wie Push diese abgelegt 
hat . Stichwort "FILO" First in - last Out.
Zuletzt erfolgt der Rücksprung RetI zurück vom Interrupt. Dieses I ist 
wichtig, weil es das Interruptflag löscht.
So könnte eine solche Routine aussehen:
Zähler mittels Vorteiler so einstellen, das alle ms ein Interrupt 
erfolgt.
My_Clock: Push R18    ;Register 18 Wert auf Stack ablegen 1. Wert
          Push R19    ;                                   2.Wert
          LDS  R18, ms0; Speicherzelle ms*1
          Inc  R18
          CPI  R18, 10
          BREQ ms0_Next
          STS ms0, R18
          RJMP ende
ms0_Next: CLR R18
          STS ms0, R18
          LDS R18, ms1; Speicherzelle ms*10
          INC R18
          CPI  R18, 10
          BREQ ms1_Next
          STS ms1,R18
          RJMP ende
ms1_Next: CLR R18
          STS ms1, R18
          LDS R18, ms2; Speicherzelle ms*100
          INC R18
          ....
ende:     POP R19     ; 2. Wert vom Stack holen
          POP R18     ; 1. Wert vom Stack holen
          RETI        ; zurück vom Interrupt zum Hauptprogramm

Ich hoffe, das machts deutlich.

Gruß oldmax
#1252873
Lesenswert?

Oder um mal ein anderes, nicht µC-bezogenes, Beispiel zu bringen.

Da gibt es einen Arzt. Der ist viel unterwegs.
So alle 2 Stunden, plus minus ein paar Zerquetsche, kommt er wieder in 
seiner Praxis vorbei und hört den Anrufbeantworter ab, ob irgendetwas 
vorgefallen ist.
-> Er betreibt Polling.
Jetzt kann es natürlich sein, dass 5 Minuten nachdem er seine Praxis 
verlässt, einen Hilferuf auf den Anrufbeantworter bekommt, dass seine 
Hilfe bei einem Herzinfarkt notwendig wäre.
Folge: Da er erst 2 Stunden später den Hilferuf mitbekommt, wird es wohl 
zu spät sein, darauf zu reagieren.

Jetzt ist der Artzt aber ein Schlauer. Er hat auch einen Pieper dabei. 
Der Patient ruft auf seinem Pieper an, er interrupted (unterbricht) also 
den Artzt in seiner momentanen Tätigkeit und der Arzt eilt dem Patienten 
sofort zu Hilfe.

Weder das eine, noch das andere ist ein Allheilmittel.
Nur Polling würde bei Notfällen zu spät kommen oder aber er müsste alle 
2 Minuten in seiner Praxis vorbeischauen um nur ja nichts Wichtiges zu 
verpassen. Und wenn auf der anderen Seite der Arzt ständig wegen jeder 
Kleinigkeit unterbrochen würde, so hat das auch keinen Sinn.
Gast #1253084
Lesenswert?

>Sehr schön, Karl Heinz!

Das sage ich auch. Er kann Vorgänge so schön plastisch darstellen.

@Karl-Heinz
Ich glaube, es ist schon einmal gesagt worden: Gib ein Buch über
Mikrocontrollerprogrammierung in diesem Stil heraus und die
Leute reißen es Dir aus den Händen.

MfG Paul

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren