Forum: Mikrocontroller und Digitale Elektronik I2C Interrupt beim PIC32MX795F512L


von Lukas H. (lukasrau)


Lesenswert?

Hi,

Ich versuche einen Sensor über I2C interruptgesteuert auszulesen.

Als Software benutze ich MPLAB v8.86 und der Debugger ist ein MPLAb ICD3

Mein Problem ist, dass der I2C1 Interrupt nicht auslöst (Breakpoint in 
der ISR)der Quelltext sieht wie folgt aus.

#include <p32mx795f512l.h>
#include <plib.h>
#pragma FPLLIDIV = DIV_2, FPLLMUL = MUL_20, FPLLODIV = DIV_1 // Stellt 
den Controller auf 80 MHz ein


void main (void)
{
IEC0bits.I2C1MIE = 1;  //Enable I2C1 Master Interrupt
IEC0bits.I2C1SIE = 1;
IEC0bits.I2C1BIE = 1;

IFS0bits.I2C1MIF = 0;  //Delete I2C1 Interrupt Flag

IPC6bits.I2C1IP = 1;   //I2C1 Interrupt Priorität
IPC6bits.I2C1IS = 0;   //I2C1 SUB Priorität

I2C1BRG = 98;  //Baud Register auf 400 khz (80000000 / (2 * 400000)) - 2

startI2C(0x68,0x01);



while(1);


}

void __ISR(25, ipl2) I2CInterrupt1(void) //I2CM1 Master interrupt
  {

  IFS0bits.I2C1MIF = 0;
  }

void startI2C(char adresse, char bus)
{
switch(bus)
  {
  case 0x01:

   //I2C1TRN = adresse;
   //TRISAbits.TRISA14 = 0;
  //TRISAbits.TRISA15 = 0;
   //I2C1CONbits.SCLREL = 1;
   //I2C1CONbits.A10M = 0;

   I2C1CONbits.DISSLW = 0;    //0 Slew Rate für 400 khz
   I2C1CONbits.SMEN = 0;    //SM Bus ausschalten
   I2C1CONbits.ON = 1;    //I2C1 Bus anschalten
   I2C1CONbits.SEN = 1;    //Startbedingung Senden

   break;


   }
}

Das Interrupt flag wird nach der Startbedingung gesetzt aber die ISR 
wird nicht ausgelöst.

Meine Frage wäre jetzt ob ich einen Fehler im Quelltext habe
(evtl gibt es ein Interrupt Enable bit, dass ich vergessen habe)

Oder ob es an Einstellungen von MPLAB liegen könnte

Gruß Lukas

von Lukas H. (lukasrau)


Lesenswert?

Hi,

Falls jemand das gleiche Problem hat,

Ich habe das Problem gelöst:

Im Datenblatt gibt es keinen Hinweis auf ein globales Interrupt Flag in 
einem Register aber über Assembler kann es gesetzt werden die Code Zeile 
lautet folgendermaßen:

asm volatile ("ei");

Des weiteren habe ich festgestellt, dass man den Interrupt multi 
vectored mode (MVEC) aktivieren muss um mit mehreren Interrupts agieren 
zu können.


INTCONbits.MVEC = 1 ;

Gruß

Lukas

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.