Forum: Mikrocontroller und Digitale Elektronik ARM7: Interruptproblem


von Hans Köhler (Gast)


Lesenswert?

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?

von ozo (Gast)


Lesenswert?

Absoluter Schuss ins Blaue:
Könnte es vielleicht sein, das ein kombinierter Lese-Schreibzugriff 
nötig ist?
Also
T0IR|=0xFF;
statt
T0IR=0xFF;

von Hans Köhler (Gast)


Lesenswert?

Danke für die Antwort!

Wie kann man sicher feststellen, welche Interruptquelle
den Spurious interrupt ausgelöst hat?

von Andreas K. (a-k)


Lesenswert?

> 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.

von Andreas K. (a-k)


Lesenswert?

> 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
Noch kein Account? Hier anmelden.