mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem LPC2136 mit mehreren Interrupts


Autor: Thomas Kusch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich habe ein Problem mit meinem Code, sobald zwei Interrupts gehandelt 
werden sollen..
Hardware: LPC2136
Umgebung: Cross Works 1.6
OS: FreeRTOS

Ich verwende zwei Interrupts (Vectored IRQs): Timer mit 22kHz und I2C 
als Slave, der jede 50ms 3Byte empfaengt und 1Byte sendet. Beide 
Komponenten laufen einzeln problemlos, zusammen steigt jedoch I2C 
irgendwann aus. Der Flag SI (I2C Int-Flag) in I2C0STAT wird zwar 
gesetzt, der Handler aber nicht aufgerufen.

Hier die entsprechenden Codestueckchen:

//Part fuer Timer
static void Timer1_Isr(void) __attribute__((naked));

void InitIRQTimer()
{
  VICIntSelect &= ~(TIMER1_VIC_CHANNEL_BIT);
  VICIntEnable |= TIMER1_VIC_CHANNEL_BIT;
  VICVectAddr3 = (unsigned int) &Timer1_Isr;
  VICVectCntl3 = TIMER1_VIC_CHANNEL | TIMER1_VIC_ENABLE;
}

static void Timer1_Isr(void)
{

  portSAVE_CONTEXT();

  T1IR |= T1IR_MR0; // clear TI
  .
  .
  .
  VICVectAddr = CLEAR_VIC_INTERRUPT;
  portRESTORE_CONTEXT();
}

//Und jetzt I2C
void I2C0_Isr(void) _attribute_ ((naked));
static void I2C_Init(void)
{
    //I2C-Init
    PINSEL0 |= 0x50; // P0.3 = SDA, P0.2 = SCL
    I2C0ADR = I2C_SLAVE_ADDR<<1; // set I2C slave address
    I2C0CONSET = 0x44; // enable I2C hardwar and set AA (ack)
    VICVectAddr4 = (unsigned int) &I2C0_Isr;
    VICVectCntl4 = 0x29; // Channel1 on Source#9 ... enabled
    VICIntEnable |= 0x200; // 9th bit is the I2C
}

void I2C0_Isr(void)
{
  portSAVE_CONTEXT();
  I2C0CONCLR = 0x08; // clear SI
  .
  .
  .
  VICVectAddr = CLEAR_VIC_INTERRUPT;
  portRESTORE_CONTEXT();
}

Irgendwie habe ich das Gefuehl, dass etwas fehlt.. Ich gehe davon aus, 
dass sobald ein I2C-Int waehrend der Ausfuehrung des Timer-Ints 
auftritt, dieser vergessen wird..

Bin fuer jeden Hinweis dankbar!

Gruss,
Th.Kusch

Autor: Thomas Kusch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmal...

das koennte noch unklar sein:
#define CLEAR_VIC_INTERRUP 0

portRESTORE_CONTEXT() und portSAVECONTEXT() sind Makros von FreeRTOS:


Gruss,
Th

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.