Forum: Mikrocontroller und Digitale Elektronik LPC2478 (NXP) EINT Probleme


von Florian K. (f_klemt)


Lesenswert?

Hallo miteinander,

Ich suche jemanden, der auch den LPC24xx von NXP benutzt und einen 
externen Interrupt (EINT) konfiguriert hat.
Aus irgendeinem Grund funktioniert das bei mir nämlich nicht.
Ich habe schon einige mögliche Fehlerquellen ausgeschlossen:
- Der Pin ist richtig konfiguriert (EINT1)
- Das externe Signal wurde mit Oszilloskop überprüft.
- Bei einer zyklischen Abfrage (alle 250ms) des Pins werden die 
richtigen Pegel erkannt.
- Für das Initialisieren der ISR steht eine Funktion bereit, die auf 
jeden Fall funktioniert.

Trotzdem wird die ISR niemals aufgerufen, wenn ein entsprechender Taster 
betätigt wird.

Es gibt noch 4 weitere Register, die den Betriebsmodus der EINTs 
beeinflussen: EXTINT, INTWAKE, EXTMODE, EXTPOLAR.
Deren Konfiguration sollte aber eigentlich optional sein (soweit ich das 
verstanden habe). Lediglich das EXTINT Register muss zurückgesetzt 
werden um einen erneuten Interrupt zuzulassen (wenn ich das richtig 
verstanden habe).
Trotzdem sollte zumindest der erste Interrupt auf jeden Fall die ISR 
ausführen.

Für einen hilfreichen Tipp wäre ich sehr dankbar.

Gruß, Florian

von Paulchen Panther (Gast)


Lesenswert?

Quellcode?

Globale interrupts aktiviert?
INT1 aktiviert?
Vorher ein evtl. gesetztes Interruptflag gelöscht?

von Florian K. (f_klemt)


Lesenswert?

1
__irq void my_test_isr(void) {  
2
printf("Test isr\n");  
3
VICVectAddr = 0;   
4
}
5
6
//set P2.11 as EINT1
7
PINSEL4 &= ~0x00C00000;
8
PINSEL4 |=  0x00400000;
9
10
//register isr for EINT1
11
install_irq(EINT1_INT, (void *)my_test_isr, HIGHEST_PRIORITY);

Interrupts an anderer Stelle im Code funktionieren problemlos.

Gruß

von Stefan (Gast)


Lesenswert?

Ich setze noch das interrupt enable register (IntEnF oder IntEnR).

von Florian K. (f_klemt)


Lesenswert?

Ja, das macht die Funktion 'install_irq()' für mich.
Dort wird die Adresse der ISR bekannt gemacht, die Priorität gesetzt und 
am Ende mit
1
VICIntEnable = 1 << IntNumber; //Hier EINT1_INT (=15)
der Interrupt aktiviert.

von Stefan (Gast)


Lesenswert?

Nein ich meine die Register auf seite 199 im user manual (Rev. 04).

von Florian K. (f_klemt)


Lesenswert?

Hmm, eigentlich möchte ich ja keinen GPIO Interrupt verwenden, sondern 
einen externen. Die GPIO Interrupts sind ja auch mit EINT3 'verbunden' 
(Ich möchte/muss EINT1 benutzen).

Ich werde mal ausprobieren, ob ich mit dem Register etwas erreiche.

Schon mal Danke für den Hinweis,
Gruß

von Florian K. (f_klemt)


Lesenswert?

Nachdem ich
1
IO2_INT_EN_F = 0x00000800;
eingestellt habe, hängt sich der µC direkt auf.

von Florian K. (f_klemt)


Lesenswert?

Wie ich schon vermutet habe, sind der GPIO Interrupt und der externe 
Interrupt zwei verschiedene Geschichten.
Dadurch, dass ich mit
1
IO2_INT_EN_F = 0x00000800;
den GPIO für P2.11 aktiviert habe, führt er die isr aus, die mit EINT3 
registriert wurde (EINT3 handelt alle GPIOs).
Da ich da den Interrupt nicht gelöscht habe, wurde er in einer 
Endlosschleife ausgeführt, was den µC zum Absturz brachte.

Immerhin kann ich das jetzt als GPIO realisieren und alles ist gut.
Nochmal Danke für den Hinweis an Stefan.

Trotzdem würde ich gerne wissen warum das als externer Interrupt nicht 
funktioniert. Wenn da jemand noch einen heißen Tipp hat wäre das super.

Danke und Gruß,
Florian

von Stefan (Gast)


Lesenswert?

So, hab es soeben nochmal ausprobiert. Für den EINT0 am LPC2478 setze 
ich nur das PINSEL4, EXTMODE und EXTPOLAR Register (edge sensitive, 
falling edge). War mein Irrtum mit dem oben genannten Register.

Danach noch den Interrupt richtig einhängen (was du ja machst) und dann 
sollte es klappen.

Stefan

von Florian K. (f_klemt)


Lesenswert?

Danke für die Antwort. Ich war auch der Meinung, dass ich das eigentlich 
richtig gemacht habe.
Kann es vielleicht sein, dass der EINT1 ein Fast Interrupt ist? Dafür 
müsste man ja ein anderes Interrupt register beschreiben.

Gruß,
Florian

von Stefan (Gast)


Lesenswert?

Nein, du kannst jeden beliebigen Interrupt als Fast Interrupt einhängen. 
Poste sonst nochmal den genauen Code wo es nicht funktioniert, ich kanns 
ja auch mal ausprobieren.

Stefan

von Stefan (Gast)


Lesenswert?

Noch ein Verdacht, auf jeden Fall vorher im EXTINT Register das 
entsprechende Flag löschen und dann erst deine Interrupts konfigurieren.

von Stefan (Gast)


Lesenswert?

Vielleicht noch ein kleiner Hinweis (passt aber ned zu Thema). Mir hat 
der Insider´s Guide von Hitex sehr geholfen die Dinge besser zu 
verstehen. Ist wirklich gut geschrieben und manchmal erspart man sich 
das lange wälzen der Datenblätter.

http://www.hitex.com/index.php?id=download-insiders-guides

Stefan

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.