Forum: Mikrocontroller und Digitale Elektronik LPC2138 EINT0 nur ein mal!


von wast (Gast)


Lesenswert?

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!

von Andreas K. (a-k)


Lesenswert?

Bischen mehr vom Code wäre nützlich. Der VIC will nämlich auch noch 
gestreichelt werden.

von wast (Gast)


Lesenswert?

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.

von Andreas K. (a-k)


Lesenswert?

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.

von wast (Gast)


Lesenswert?

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!

von Andreas K. (a-k)


Lesenswert?

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

von wast (Gast)


Lesenswert?

Hab mir beide errata sheets angeschaut, da steht nix drin, was relevant 
sein könnte.

Hat jemand am LPC2138 einen EINT0 verwendet, der funktioniert?

von wast (Gast)


Lesenswert?

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!

von wast (Gast)


Lesenswert?

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!

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.