www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt ARM


Autor: Harry (Gast)
Datum:

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

Autor: peter dannegger (Gast)
Datum:

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

Autor: Harry (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es handelt sich um ein LPC2106.

Harry

Autor: Jürgen Eckert (sid)
Datum:

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

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.