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.