LPC2138 EINT0 nur ein mal!

Gast #624468
Hallo,

ich hoffe, ihr könnt mir helfen, da ich ein Problem mit dem LPC2138 
habe.
Der LPC2138 soll bei JEDER negativen Flanke an GPIO0.16 (EINT0) einen 
Interrupt auslösen. Es war soweit kein Problem, alle Register 
entsprechend zu konfigurieren. Ein einzges mal funktioniert es ja.
Natürlich setzt ich das Interrupt-Flag in der ISR zurück, mittles:

EXTINT = 0x1;

Weiß jemand, warum dies nur ein mal funktioniert?

Schon mal DANKE!
Gast
ok, ich dachte, das ich prinzipiell was vergessen hätte!

ISR:
====
void canIntHandler(void)
{
  EXTINT = 0x1;

  gpioToggle(GPIO_LED);
  canInterrputFlag = flagSet;

  VIC_VECTADDR = 0x00000000;  /* reset VIC */
}

Init-Teil:
==========

...
  /* register interrupt handler and enable the interrupt source */
  EXTINT = 0x1;
  vicSetIRQSlot(IRQ_SLOT_CAN, IRQ_SOURCE_CAN, canIntHandler);
  vicIntEnable(IRQ_SOURCE_CAN);

  EXTINT = 0x1;
  EXTMODE = 0x1;
  EXTPOLAR = 0x0;
  EXTINT = 0x1;

--> Die Funktionen mit vic... funktionieren in allen anderen Fällen 
(andere IRQs)
--> Bei einem Timer funktioniert alles wunderbar! Es muss also etwas mit 
dem EINT0 zu tun haben.
Sind in deiner Umgebung Interrupt-Handler normale C-Funktionen?

Errata-Sheet gelesen? Es gibt irgendwelche LPCs, bei denen sich die 
Konfiguration externer Interrupts und irgendwelche Systemsteuerungen ins 
Gehege kommen.
Gast
Was meinst du mit: "Sind in deiner Umgebung Interrupt-Handler normale 
C-Funktionen?"
Ja, ich rufe C-Funktionen in der ISR auf. (Entfernen hat nichts 
gebracht)
Ja, die ISR steht mitten in einem C-File?!?

Hab dur das errata zum LPC2138 gelesen. Gibt es auch noch eins generell 
für LPCs`?

-> DANKE für die schnelle Hilfe!
> Was meinst du mit: "Sind in deiner Umgebung Interrupt-Handler normale
> C-Funktionen?"

Je nach Library/HAL sind Interrupt-Handler normale C-Funktionen oder 
müssen speziell als Interrupt-Handler gekennzeichnet werden.

> Hab dur das errata zum LPC2138 gelesen.

Dieses meinte ich. Vorzugsweise das zu richtigen Version. Original und 
/01 sind zwei sehr verschiedene Hardware-Versionen.
Gast
So, jetzt funktioniert es!

Folgender Tipp war wichtig: "Je nach Library/HAL sind Interrupt-Handler 
normale C-Funktionen oder
müssen speziell als Interrupt-Handler gekennzeichnet werden."

--> Also nochmal DANKE an Andreas Kaiser

Ich verwende winIDEA als IDE mit gcc-Compiler.

Die IRQ-Funktion muss folgendermaßen definiert sein:
1
void canIntHandler(void) __attribute__ ((interrupt("IRQ")))

Super Forum!
Gast
Ich frage mich aber immer noch, warum es ansonsten immer funktioniert 
hat?!?

--> Wie dem auch sei, jetzt ist es Korrekt geschrieben und funktioniert 
dementsprechend auch!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.