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
Quellcode? Globale interrupts aktiviert? INT1 aktiviert? Vorher ein evtl. gesetztes Interruptflag gelöscht?
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ß
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.
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ß
Nachdem ich
1 | IO2_INT_EN_F = 0x00000800; |
eingestellt habe, hängt sich der µC direkt auf.
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
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
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
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
Noch ein Verdacht, auf jeden Fall vorher im EXTINT Register das entsprechende Flag löschen und dann erst deine Interrupts konfigurieren.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.