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; }
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.