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
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.
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
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
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?
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.
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
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.
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?
@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.
Falk Brunner schrieb: > Die Interrupts werden für eine Handvoll Assemblerbefehle gesperrt Falk, du hast mein Weltbild wieder gerade gerückt... ;-)
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.