www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ARM7: Interruptproblem


Autor: Hans Köhler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: ozo (Gast)
Datum:

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

Autor: Hans Köhler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antwort!

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

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht 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.

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.