www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Wird ein gesperrter Interrupt später bearbeitet


Autor: DirkF (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich hätte mal eine grundsätzliche Frage, verwende zwar den 
PIC18F4580, sollte aber eine anderen MCUs die gleiche Problematik sein.

Frage:  Wenn ich das GIE = 0 setze, also alle Interrupts sperre, und es 
später wieder freigebe, wird dann eine Interruptanforderung, die während 
der gesperrten Zeit auftrat, nach der Freigabe automatisch bearbeitet ?

Hintergrund:
Ich erzeuge jede 1 ms einen Timer Interrupt, um so mehrere Softwaretimer 
mit einer Auflösung von 1 ms zu erzeugen.
Machmal, wenn z.B. das EEPROM beschrieben wird, dann werden alle 
Interrupts kurz gesprerrt.
Effekt:  Die Timer laufen ca. 50 % zu langsam !

Danke im Voraus.  Dirk

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DirkF schrieb:
> Hallo, ich hätte mal eine grundsätzliche Frage, verwende zwar den
> PIC18F4580, sollte aber eine anderen MCUs die gleiche Problematik sein.
>
> Frage:  Wenn ich das GIE = 0 setze, also alle Interrupts sperre, und es
> später wieder freigebe, wird dann eine Interruptanforderung, die während
> der gesperrten Zeit auftrat, nach der Freigabe automatisch bearbeitet ?

Das steht im Datenblatt.
Aber üblicherweise ist es so. Ansonsten wären Interrupts Systeme nämlich 
wenig sinnvoll.

Autor: Joachim K. (minifloat)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DirkF schrieb:
> Wenn ich das GIE = 0 setze, also alle Interrupts sperre, und es
> später wieder freigebe, wird dann eine Interruptanforderung, die während
> der gesperrten Zeit auftrat, nach der Freigabe automatisch bearbeitet ?

Das Interrupt-Flag wird gesetzt und bei Ausführen der Interrupt-Routine 
entweder automatisch vom Prozessor oder bei Gammel-Prozessoren 
"händisch" wieder rausgenommen.
Wenn du nun die Interrupts abschaltest, werden nur die Routinen nicht 
abgearbeitet, die Flags werden aber gesetzt. Machst du jetzt die 
Interrupts wieder an, werden die Interrupts nach Priorität abgearbeitet, 
da die Flags noch gesetzt sind.
Problem ist, wenn in der abgeschalteten Zeit mehrere gleiche Interrupts 
auftreten. Hier wird nicht gezählt oder sowas! Bei mehreren 
verschiedenen gehts aber.

mfg mf

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DirkF schrieb:
> sollte aber eine anderen MCUs die gleiche Problematik sein.

Ein Interrupt muß auf jeden Fall gemerkt werden, sonst würde man 
Interrupts verlieren und damit wären Interrupts völlig nutzlos.


Trotzdem gab es Leute, die so verrückt waren, dieses eherne Gesetz zu 
brechen.
Z.B. der Scenix SX18 hatte weder Interruptflag noch getrennte 
Interruptvektoren für den Timer. Es gab somit keine Möglichkeit, zu 
entscheiden, ob man nun im Timerinterrupt oder im externen Interrupt 
ist.
Resultat: Der Chip ist schnell wieder in der Versenkung verschwunden, 
obwohl er damals mit 100MHz sauschnell war.


Peter

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DirkF schrieb:
> Machmal, wenn z.B. das EEPROM beschrieben wird, dann werden alle
> Interrupts kurz gesprerrt.
Das würde ich ändern, denn es ist nicht nötig. Du kannst ja einfach das 
Busy-Flag abfragen. Oder findet die EEPROM Schreiberei gar in einem 
Interrupt statt?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe Interrupt.

Autor: Dirk F (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
An Lothar Miller:

Aber im Datenblatt des PIC 18F4680 wird strensgtens empfohlen, die 
Interrupts zu deaktivieren, wenn man ins EEPROM schreibt.

Das EEPROM schreiben ist im normalen Programm, nicht im Interrupt.

Gruß Dirk.

Autor: Reinhard Kern (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dirk F schrieb:
> Aber im Datenblatt des PIC 18F4680 wird strensgtens empfohlen, die
> Interrupts zu deaktivieren, wenn man ins EEPROM schreibt.

Hallo,

das ist zwar sicher für das EEPROM, kann aber anderweitige 
Nebenwirkungen haben wie verlorene IRQs. Lässt du andrerseits Interrupts 
zu, musst du selbst sorgfältig drauf achten, dass der Schreibvorgang 
durch nichts gestört wird, z.B. dürfen die ISRs nichts aus dem EEPROM 
lesen.

Interrupts sollte man immer nur für wenige, linear ablaufende 
Maschinenbefehle abschalten, um Auswirkungen auf die 
Interruptbearbeitung von vornherein zu vermeiden. Keinesfalls darf es 
Abschaltungen unbekannter zeitlicher Länge geben, also Vorsicht mit 
Schleifen.

Gruss Reinhard

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dirk F schrieb:
> An Lothar Miller:
>
> Aber im Datenblatt des PIC 18F4680 wird strensgtens empfohlen, die
> Interrupts zu deaktivieren, wenn man ins EEPROM schreibt.

Du willst die Interrupts aber wahrscheinlich ja auch nur während des 
tatsächlichen Schreibvorgangs sperren.
Und ich kann mir nicht vorstellen, dass auf besagtem µC das Schreiben 
eines Bytes länger als 1ms dauert.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dirk F schrieb:
> Aber im Datenblatt des PIC 18F4680 wird strensgtens empfohlen, die
> Interrupts zu deaktivieren, wenn man ins EEPROM schreibt.
Jetzt fällt mir wieder ein, warum ich diese PIC-Dinger nicht mag...  ;-)
Oder soll damit nur ein Doppelzugriff auf das EEPROM-Datenregister 
während des Schreibens verhindert werden?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Dirk F (Gast)

>Aber im Datenblatt des PIC 18F4680 wird strensgtens empfohlen, die
>Interrupts zu deaktivieren, wenn man ins EEPROM schreibt.

Wirklich? Mal schauen.

Nö, du musst mall RICHTIG lesen.

"The write will not begin if this sequence is not exactly
followed (write 55h to EECON2, write 0AAh to
EECON2, then set WR bit) for each byte. It is strongly
recommended that interrupts be disabled during this code  segment."

Die Interrupts werden für eine Handvoll Assemblerbefehle gesperrt, nicht 
für mehrere Millisekunden. Siehe Datenblatt Seite 109. Da kommt kein 
Timer aus dem Tritt.

MfG
Falk

P S Das ist praktisch genauso beim AVR.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner schrieb:
> Die Interrupts werden für eine Handvoll Assemblerbefehle gesperrt
Falk, du hast mein Weltbild wieder gerade gerückt... ;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.