hallo zusammen, kann mir jemand die Frage beantworten: bei welchen Fällen sollte Interupt unbedingt gebrauchen ?? danke euch
wenn zeitkritsche Dinge ablaufen sollen. In der Interupt-Routine wird das notwendigste hineingepackt, und außerhalb der Interupt-Routine weitere Folgeaktivitäten
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
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
- 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.
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
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
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.
>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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.