Forum: Mikrocontroller und Digitale Elektronik Interrupt ARM


von Harry (Gast)


Lesenswert?

Hallo,

ich möchte mal kurz Nachfragen, ob der ARM mehrere Interrupte
verarbeiten kann: Ich habe folgendes Problem, dass, wenn ich nur einen
Interrupt für I2C benutze läuft alles. Benutze ich alleine nur Timer0
Interrupt, dann geht auch alles, aber wenn ich beide benutze, dann
kommt nur noch einer.

I2C init:
VICIntSelect &= ~( 1 << VIC_I2C_POS );  // I2C ist ein IRQ
VICIntEnable |= ( 1 << VIC_I2C_POS ); // Interrupt freigaben.
VICVectCntl1 = 0x20 | VIC_I2C_POS;// Slot 3 für I2C Interrupt
festlegen.
VICVectAddr1 = (unsigned)I2CISR; //Interruptroutine eintragen

I2C Interrupt - Routine:
I2CONCLR = 0x08; // Interrupt zurücksetzen
VICVectAddr = 0;

Timer0 Init:
VICIntSelect &= ~( 1 << VIC_T0_POS );  // Timer 0 ist ein IRQ
VICIntEnable |= ( 1 << VIC_T0_POS );  // Timer 0 Interrupt freigeben
VICVectCntl0 = 0x20 | VIC_T0_POS; //Diesen auf Slot 2 legen und
freigeben.
VICVectAddr0 = (unsigned int)timer0ISR;  // Interruptroutine eintragen.


/* Reset timer 0 */
T0TCR = FALSE;  // Timer 0 löschen
T0PR = PCLK / 2000; // Setze den Vorteiler auf 1 ms
T0MR0 = ms;  // Benutze das Match 0 Register
T0MCR = 3;  // Lade Timer 0 neu und resete diesen
T0TCR = TRUE;  // Timer 0 starten.
T0IR = 0xFF;  // Lösche alle Interrupt anforderungen.

Timer0 Interruptroutine:
taskmain();    // Haupttaskroutine
T0IR = 0xFF;          // Timer 0 Interrupt löschen
VICVectAddr = 0;



static void timer0ISR(void) _attribute_ ((interrupt ("IRQ")));
void I2CISR (void) _attribute_ ((interrupt ("IRQ")));

Danke und gruss
Harry

von peter dannegger (Gast)


Lesenswert?

Kommt drauf an, von welchem ARM7TDMI Du sprichst.

Die Philipser habe 2 Prioritätsstufen, die von ST haben 17.


Eine Besonderheit der ARM ist auch, daß sie zwischen 2 Interrupts keine
Instruktion des Main (oder niederpriorisierten Interrupts) ausführen.


Peter

von Harry (Gast)


Lesenswert?

Es handelt sich um ein LPC2106.

Harry

von Jürgen E. (sid)


Lesenswert?

Hallo Harry,

ich weiß nicht, ob dein Problem noch aktuell ist, aber der LPC2106 kann
definitiv mehr als einen Interrupt.

Dafür gib es ja die VICVectCntlX und VICVectAddrX Register...

Ich habe z.b. gerade einen TIMER und UART (beide als IRQ) laufen...

Sollte das Problem noch bestehen, dann schreib einfach mal zurück und
dann bekommen wir das Problem schon gelößt G

SID

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.