I2C Interrupt beim PIC32MX795F512L

OP #2844519
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
OP #2847599
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

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.