- Was sind Interrupts?
- Wozu benötigt man Interrupts?
- Was ist der Unterschied zum Polling-Verfahren
Interrupts versus Polling
Beim Polling fragt man Signale regelmäßig innerhalb der while-Schleife ab und wertet diese Signale aus.
Ein großer Nachteil beim Polling ist allerdings, dass auf Signale nicht sofort reagiert werden kann, sondern erst mit einer Verzögerung.
So kann es im schlechtesten Fall passieren, dass man ein Signale gerade abgefragt hat und kurz nach dieser Abfrage das externe Signal am enstpechenden Potrt anliegt.
In dieser Situation kann es relativ lange dauern, bis der Port wieder abgefragt wird, je nach dem wie lange die Verarbeitung der Befehle in der while-Schleife dauert.
Bei kritischen Signalen, beispielsweise einer kritischen Fehlersituation, bei der sofort reagiert werden muss, kann das untragbar sein.
In solchen Fällen nimmt man besser Interrupts.
Bei Interrupts wird sofort reagiert. Wenn ein Interrupts-Signal auftritt, wird der aktuelle Befehl des Hauptprogramms beendet, die nötigen Register auf den Stack gerettet und dann anschließend sofort die ISR aufgerufen.
Man hat in diesem Fall also kaum Zeitverzug zwischen der Ausführung der ISR und dem Auftreten des Signals.
Den Unterschied zwischen dem Polling-Verfahren und Interrupts zeige ich im folgenden Video.
In der heutigen Folge sollte es lediglich um den Unterschied zwsichen Polling und Interrupts gehen. Die Feinheiten von Interrupts werden wir in den folgenden Folgen behandeln.
Der Vollständigkeit halbe kopiere ich hier noch die beiden Quellcodes hinein.
Polling
#include<REG515.H>
sbit Fehler=P2^0;
sbit Alarm=P2^1;void alarmauswertung(void)
{
Alarm = Fehler;
}void main(void)
{
unsigned long int i=0;
P1 = 0;
P2 = 0;Fehler = 1;
Alarm = Fehler;while(1)
{
for (i=0; i<100000;i++)
{
P1=i;
}
alarmauswertung();}
}
Interrupt
#include<REG515.H>
sbit Alarm=P2^1;
void ISR_alarmauswertung(void) interrupt 0
{
Alarm = 1;
}void main(void)
{
unsigned long int i=0;
P1 = 0;
P2 = 0;EAL = 1;
EX0 = 1;while(1)
{
for (i=0; i<100000;i++)
{
P1=i;
}}
;
}
Bis zum nächsten Mal!
Dieser Artikel ist Teil des Mikrocontrollerkurs auf ET-Tutorials.de.
Hier geht es zurück zur Übersichtsseite des Mikrocontroller-Kurses .
Hat Dir der Artikel geholfen? - Dann hilf dem Artikel ;-)
|
Ähnliche Artikel
Folgende Artikel aus der gleichen Kategorie könnten Dich ebenfalls interessieren:Externe Interrupts beim 8051 Heute geht es nun um die Programmierung eines externen Interrupts. Die Programmierung eines externen...
Lösung der Aufgabe zu den externen Interrupts Heute geht es nun um die Lösung aus dem Artikel der vergangenen Woche, in dem ich die Mechansmen des...
Bits, Bytes und Nibbles Der Mikrocontroller rechnet digital, also mit binären Werten. Um in diesen Wust von Nullen und Eins...
Funktionen in C, Definition und Deklaration Durch die Verwendung von Funktionen kann man Programme strukturieren und effizienter machen. In unse...





{ 6 Kommentare… sie unten lesen oder einen hinzufügen }
Habe ich da etwas falsch verstanden ? 100000 reicht doch ein int32 aufgrund des Zahlenbereiches :
int32 Bits / 4 Bytes-2147483648 bis 2147483647-(2 hoch 31) bis (2 hoch 31) ganze Zahl mit Vorzeichen
Ich meine kann ja sein das ich mich da vertue habe zumindest den Zahlenbereich im Kopf!!!
Genau, man benötigt 32 bit, also long.
Ein Vorzeichen benötigen wir nicht.
Hallo,
wie kommt eigentlich der Zusammenhang zwischen Port 3 Pin 2 und dem Interrupt zustande (damit der Alarm auch gesetzt wird)? Die einzige Verbindung steckt doch im Kommentar, der ja vom Compiler nicht berücksichtigt wird. Hat es vielleicht etwas mit Hardwarkonfiguration des gewählten Mikrocontrollers zu tun?
Vielen Dank schon einmal.
Hallo Fabian,
genau: Um Pins zu sparen, bzw. um mit den verfügbaren Pins auszukommen, sind manche Pins mit mehreren Funktionen belegt.
P3.2 liegt also am gleichen pgysikalischen Pin wie /INT0.
P3.3 liegt also am gleichen pgysikalischen Pin wie /INT1.
Bei den meisten 8051ern ist das so festgelegt, bei anderen kann die Zuordnug per Software festgelegt werden. (z.B. bei Silicon Laboratories mittels CrossBars)
Hallo,
kann mir irgendeiner weiterhelfen mit folgender Fehlermeldung:
Build target ‘Target 1′
compiling test.c…
linking…
*** ERROR L121: IMPROPER FIXUP
MODULE: test.obj (TEST)
SEGMENT: ABSOLUTE
OFFSET: 0003H
Program Size: data=13.0 xdata=0 code=110
Target not created
Habe den Code oben aus dem Fenster kopiert. Verstehe nicht warum er die Einsprungadresse des Interrupt 0 anmekert???
Danke und Gruß
Roman
Hallo Roman,
ich habe eben noch einmal beide Programme compiliert.
Funktionieren bei mir einwandfrei.
Überprüfe bitte noch einmal, ob wirklich alles kopiert worden ist.