Hallo! Wer kann mir bei folgendem Problem mit einem NXP LPC2148 helfen: In meinem Programm tritt in sehr seltenen Fällen ein "Spurious interrupt" auf. Dafür habe ich eine Interruptroutine geschrieben, die die Interruptanforderung löschen soll. Der Interrupt wird durch Timer 1 ausgelöst. Jetzt tritt das Problem auf, dass das Löschen der Interruptanforderung nicht gelingt. Sofort nach dem Verlassen der Int.routine wird sie neu aufgerufen. Damit hängt sich mein Programm auf. Hier die Interruptroutine: __irq __arm void default_ISR() { //Interruptflags der Interruptquellen löschen EXTINT|=1<<2; //Interruptflag EINT2 löschen T0IR=0xFF; //Interruptflag T0 löschen T1IR=0xFF; //Interruptflag T1 löschen I2C0CONCLR=0x00000008; //I2C-Interrupt-Flag löschen VICVectAddr = 0; //VICVectAddr löschen } Laut Register VICIRQSTATUS liegt nur der Timer1-Interrupt an. Er sollte mit T1IR=0xFF eigenlich gelöscht werden. Wo liegt der Fehler?
Absoluter Schuss ins Blaue: Könnte es vielleicht sein, das ein kombinierter Lese-Schreibzugriff nötig ist? Also T0IR|=0xFF; statt T0IR=0xFF;
Danke für die Antwort! Wie kann man sicher feststellen, welche Interruptquelle den Spurious interrupt ausgelöst hat?
> Könnte es vielleicht sein, das ein kombinierter Lese-Schreibzugriff > nötig ist? Daneben geschossen. 1 löscht den Interrupt, 0 macht nix. Folglich löscht T0IR |= 0x01 alle Interrupts, nicht nur den zu Bit 0.
> Wie kann man sicher feststellen, welche Interruptquelle > den Spurious interrupt ausgelöst hat? Kann es per Definition eigentlich nicht geben. Der schlägt ja genau dann zu, wenn der VIC schon keine Ahnung mehr hat, was den Interrupt auslöste. Wenn es überhaupt ein "spurious interrupt" war. Nicht alles was im default Vector aufläuft ist zwangsläufig ein solcher. Allerdings ist mir nicht klar, wieso du im Handler alle Interrupts löschst. Ein gesetztes Interrupt-Flag führt m.E. zum regulären Handler, nur wenn es zum Zeitpunkt der Vektorermittlung schon nicht mehr gesetzt war, dann gibt's den berüchtigten "spurious interrupt". Vorausgesetzt natürlich, der VIC ist korrekt programmiert und alle eingeschalteten Interrupts sind vektoriert (?). Wenn der Handler dauernd aufgerufen wird und das Timer-Interruptflag gesetzt ist, dann scheint dem Timer kein Interrupt-Vektor zugewiesen zu sein. Für einem "spurious interrupt" gilt nämlich per Definition (VICIRQStatus & VicIntEnable) == 0 jedenfalls zu dem Zeitpunkt zu dem VICVectAddr gelesen wurde.
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.