www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LPC2468: IRQ Problem


Autor: Nador Rif (rifman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

uC: LPC2468
Compiler: GNUARM
Wenn ich zwei Interrupts(IRQ) installiere, funktioniert nur einen von 
den beiden, und zwar der mit der höheren Priorität. Woran kann das denn 
liegen?

Autor: Nador Rif (rifman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.. es wird einen Interrupt vom Timer generiert und einen vom CAN, wenn 
eine Nachricht eintrifft.Das komische ist: wenn ich dem Timer-Interrupt 
eine höhere Priorität gebe als CAN funktioniert nur der Timer und wenn 
umgekehrt funktionieren die beiden nicht, ich komme nicht weiter und 
habe alles versucht, kann mir jemand vielleicht helfen?

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Code?

Kann es sein, dass du am Ende der ISR den VIC nicht freigibst?

Autor: MmVisual (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Haben Sie es so gemacht?
void XXX_ISR (void);

void XXX_ISR (void) __irq 
{
    : :
    : :
    VICVectAddr = 0;
}

Autor: Nador Rif (rifman)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe den Cade angehängt, hoffentlich findet ihr was.

Danke

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann es sein, dass man im CAN Controller (nicht nur im VIC) den 
Interrupt ausdrücklich quittieren muss, damit das Interrupt Flag 
gelöscht wird?

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich vermisse hier
void CAN_Handler(void) 

das Attribut __irq wie oben von MmVisual geschrieben.

Autor: Nador Rif (rifman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
laut die Beispiele von NXP, muss man den Receive-Puffer velassen und VIC 
freischalten;

CAN1CMR = 0x04; // release receive buffer
VICVectAddr = 0; /* Acknowledge Interrupt */

Autor: Nador Rif (rifman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ARM-Fan

ich kompiliere mit dem GNUARM, deswegen habe ich die ISR in can.h so 
definiert:

extern void CAN_Handler (void) _attribute_ ((interrupt));

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
CAN1CMR = 0x04; // release receive buffer
VICVectAddr = 0; /* Acknowledge Interrupt */

Kann, ich bestätigen. Mehr mache ich hier auch nicht.
Allerdings KEIL auf LPC2368.

Deswegen weiß ich auch nicht ob das Attribut __irq beim GNU
auch so in der Form notwendig ist.

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Etwas mehr könnte man helfen, wenn der komplette Code gezeigt wird, 
inkl. Linker-Script, Startup-Code und makefile bzw. Compiler-, 
Assembler-, Linkeroptionen.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist "install_irq"?

Autor: Nador Rif (rifman)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@Martin Thomas
du hast recht, deswegen habe ich auch alles was du erwähnt hast 
angehängt.

Autor: Nador Rif (rifman)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
es geht noch weiter..

Autor: Nador Rif (rifman)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
can.h

Autor: Nador Rif (rifman)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
linkerscript

Autor: Nador Rif (rifman)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
startup-code

sorry, geschikter machen können..

Autor: Nador Rif (rifman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Andreas Kaiser:

irq_install ist eine Funktion, die in irq.c (von NXP-Beispiele) 
implementiert ist.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann fehlt irq.c in der Liste.

Autor: Nador Rif (rifman)
Datum:
Angehängte Dateien:
  • irq.7z (1,87 KB, 104 Downloads)

Bewertung
0 lesenswert
nicht lesenswert
OK!

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was fange ich mit ".7z" an?

Autor: Nador Rif (rifman)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
sorry

Autor: Nador Rif (rifman)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
irq.h

Autor: Nador Rif (rifman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
es ist euch also nichts aufgefallen..Schade :-(

Autor: Nador Rif (rifman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Macht das vielleicht was aus, dass der Timer ,bevor die Interrupts 
freigeschaltet sind (im Startup-Code), initialisiert ist, und CAN 1 
danach?

Autor: MmVisual (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie kompillieren Sie mit dem GNUARM?
ARM oder Thumb Mode?

Autor: Nador Rif (rifman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich weiss ehrlich gesagt nicht, wo ist das denn zu finden?

Autor: Nador Rif (rifman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
..ich glaube aber in ARM Mode, da unter "Setup Stack" im Startup-code 
der Thumb-Bit nicht gesetzt wird, bin aber nicht sicher..

Autor: MmVisual (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt in der Regel eine Datei, die heisst "makefile", in der wird der 
Compiler aufgerufen. Wenn dort der Parameter "-mthumb" oder 
"-mthumb-interwork" mit drin steht, dann wird der ARM im Thumb Mode 
compilliert. Am einfachsten ist es die Console Ausgabe durchzuforsten 
und nach dem GCC Aufruf zu schauen, ob dort einer der vielen Parameter 
so heißt. Die "makefile" Datei enthält meistens diesen Parameter, man 
muss aber genau analysieren ob der auch aktiv ist. Denn meistens sind 
diese Dateien mit Parametern versehen.

Autor: Nador Rif (rifman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die CPU-Anweisungen im Makefile :

CC        =arm-elf-gcc
OBJCOPY   =arm-elf-objcopy

#
# CFLAGS
#
WARNINGS   =-Wall -Wshadow -Wpointer-arith -Wbad-function-cast 
-Wcast-align -Wsign-compare -Waggregate-return -Wstrict-prototypes 
-Wunused
CPU_TYPE   = -mlittle-endian -mcpu=arm7tdmi -marm -fpack-struct 
-DUART1_LPRINTF
DEBUGFLAGS = -gdwarf-2 -MD -O

Autor: mmvisual (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt brauche ich noch die Zeile aus der Datei in der "CC" auch 
aufgerufen wird, den darin stehen alle Parameter, auch die CFLAGS.

Autor: mmvisual (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Die Startup.s sieht bei mir anders aus...

Autor: Nador Rif (rifman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
es tut mir Leid Leute, es hatte nichts mit dem Interrupt zu tun, es lag 
CAN-Bitrate..
Danke für Eure Bemühungen, einen besonderen Dank an mmvisual.

Autor: mmvisual (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank.

... Ich brauch ja auch noch ein bischen Hilfe, wo ich was weis helf ich 
gerne.

Meine S*.s Datei brauchen Sie nur dann, wenn Sie den Prozessor im Thumb 
Mode betreiben wollen, dann funktionieren Ihre Interrupts 
"__attribute__((interrupt))" nicht mehr, weil der GNU die dann nicht 
mehr compillieren kann. (Siehe Code ab "IRQ_Handler:".)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.