Forum: Mikrocontroller und Digitale Elektronik lpc2294 interrupt problem


von Iduard B. (belhoibl)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen

ich benutze seit kurzem ein LPC2294.
Alles was ich will ist es wenn ein CAN Nachricht ankommt ein interrupt 
sich auslöst und die LED zum leuchten anfängt, und dass wenn kein 
nachrichten mehr ankommen die LED mit dem leuchten aufhört. es klappt 
mit dem senden und empfangen der CAN nahcrichten es liegt jetzt nicht 
dran. Das Problem ist dass das interrupt nicht ausgeführt wird, sobald 
ich die letzten Zeilen wo das LED befehl zum leuchten gebe, aus der 
irq_routine rausnehme und es in die main Methode einfüge leuchtet die 
LED aber so wie hier im Beispiel unten da passiert nichts. Habe ich mein 
interrupt routine schlecht inisializiert??? ich bitte um jede Hilfe 
vielen Dank Im  voraus

Ich habe dazu folgenden Code geschrieben:

void IRQ_Routine (void) _attribute_ ((interrupt("IRQ")));

#include "LPC22xx.h"


int main(void)
{

while (1){


VPBDIV = 0x00000001; //Set PClk to 60MHz
IODIR1 = 0x00FF0000; // set all ports to output
PINSEL1|= 0x00040000; //Enable Pin 0.25 as CAN1 RX
C1MOD = 0x00000001;
C1BTR = 0x001C001D; //Set bit timing to 125k
C1IER =0x00000001; //Enable the Receive interrupt
 //select a priority slot for a given interrupt
VICVectAddr0 = (unsigned)IRQ_Routine; //pass the address of the IRQ
VICVectCntl0 = 0x0000003A;
//into the VIC slot
VICIntEnable = 0x04000000; //enable interrupt
AFMR = 0x00000001; //Disable the Acceptance filters


 C1MOD = 0x00000000; //Release CAN controller




}

}
void IRQ_Routine (void) {

IOCLR1 = ~C1RDA<<8;
IOSET1 = C1RDA<<8; //set output pins
C1CMR = 0x00000004; //release the receive buffer
VICVectAddr = 0x00000000; //Signal the end of interrupt

IODIR0 |= 0x40000000;  // P0.30 output
IOSET0 =  0x00000000;

IOCLR0 = 0x40000000;
}

von ARM7 - er lebt! (Gast)


Lesenswert?

Hallo!

Interrupts sind in dem Code nicht aktiv. Du hast zwar den
VIC konfiguriert, das I-Bit im Status Register wird im Startcode
aber gesetzt. Damit ignoriert die CPU ankommende Interrupts an
Ihrem IRQ Eingang.
Ich bin mir nicht sicher ob es eine gute Idee ist die VIC/CAN
Initialisierung in einer Endlosschleife vorzunehmen. Mach das
einmal und gehe dann in eine Schleife.

Vorschlag: Gehe drei Schritte zurück und lasse
1. die LED erstmal per delay-loop blinken.
2. Konfiguriere und polle dann einen Timer zum Blinken.
3. Benutze einen Timer Interrupt zum Blinken.

Wenn das klappt kannst du dich auf den CAN Bus einlassen.
So wie du es jetzt machst muß es schon auf anhieb klappen.
Wenn nicht, weist du nicht was los ist und wo du den oder die
Fehler suchen mußt. Interrupts durch externe Ereignisse bergen
mehrere Fehlerquellen.

Noch ein Vorschlag: Bringe den UART zum Laufen. TX reicht.
Dafür braucht man keine Interrupts. Dann kannst du dir Meldungen
an den PC schicken.

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.