mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik lpc2294 interrupt problem


Autor: Iduard Bel (belhoibl)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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;
}

Autor: ARM7 - er lebt! (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

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.