Forum: Mikrocontroller und Digitale Elektronik interupt aber wann?


von joe (Gast)


Lesenswert?

hallo zusammen,
kann mir jemand die Frage beantworten:
bei welchen Fällen sollte Interupt unbedingt gebrauchen ??

danke euch

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

wenn zeitkritsche Dinge ablaufen sollen. In der Interupt-Routine wird 
das notwendigste hineingepackt, und außerhalb der Interupt-Routine 
weitere Folgeaktivitäten

von hans (Gast)


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

von Michael U. (amiga)


Lesenswert?

Hallo,

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

Wie meinst Du das???

Gruß aus Berlin
Michael

von Random .. (thorstendb) Benutzerseite


Lesenswert?

- wenn Ereignisse von aussen "every now and then" eintreten, würde das 
ständige Pollen zu viel Zeit kosten, z.B. der UART in einer Applikation 
(Kommunikation, Terminal IO).

VG,
/th.

von Oliver (Gast)


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

von STK500-Besitzer (Gast)


Lesenswert?

>Eine oder mehrere Timer-ISR

Das gilt nicht nur für Timer...

von Martin V. (oldmax)


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

von Karl H. (kbuchegg)


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.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Sehr schön, Karl Heinz!

von Paul Baumann (Gast)


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

von Karl H. (kbuchegg)


Lesenswert?

Paul Baumann schrieb:

> 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.

Da bin ich zu faul dazu:-)
Aber danke für die Blumen.

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.