Forum: Mikrocontroller und Digitale Elektronik Problem LPC2136 mit mehreren Interrupts


von Thomas Kusch (Gast)


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

von Thomas Kusch (Gast)


Lesenswert?

Hallo nochmal...

das koennte noch unklar sein:
#define CLEAR_VIC_INTERRUP 0

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


Gruss,
Th

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.