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!
Bischen mehr vom Code wäre nützlich. Der VIC will nämlich auch noch gestreichelt werden.
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.
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.
Hab mir beide errata sheets angeschaut, da steht nix drin, was relevant sein könnte. Hat jemand am LPC2138 einen EINT0 verwendet, der funktioniert?
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.