Bonjour à tous,
Je rencontre un problème avec les interruptions du PIC 18F25k22 pour la liaison i2C. Mon problème est que mon programme n'entre jamais dans les routines d'interruptions.
Cela fait un petit moment que je bloque, j'espère qu'un œil nouveau pourra voir mon/mes erreur(s).Code:#include <p18f25k22.h> #include <delays.h> #include <i2c.h> #pragma config STVREN = ON #pragma config LVP = OFF #pragma config XINST = OFF // Extended Instruction Set #pragma config CP0 = OFF #pragma config CP1 = OFF #pragma config CP2 = OFF #pragma config CP3 = OFF #pragma config CPB = OFF #pragma config CPD = OFF #pragma config WRT0 = OFF #pragma config WRT1 = OFF #pragma config WRT2 = OFF #pragma config WRT3 = OFF #pragma config WRTB = ON // Boot Block Write Protection #pragma config WRTC = OFF #pragma config WRTD = OFF void high_isr(void); void low_isr(void); #define nbreg 12 //nombres de registre pour l'i2c 1< nbreg < 255 #define Slave_Address 0x40 volatile unsigned char buf; volatile unsigned char registre[nbreg]; #pragma code high_vector=0x08 void high_int(void) { _asm goto high_isr _endasm } #pragma code #pragma code low_vector=0x18 void interrupt_at_low_vector(void) { _asm goto low_isr _endasm } #pragma code void init(void) { int i; PORTA = 0x00; //init port A TRISA = 0x01; //porta 1 en entrée PORTB = 0x00; //init port b TRISB = 0x06; //rb1 et rb2 en entree pour i2c PORTC = 0x00; TRISC = 0x18; ADCON1 = 6; OSCCON = 0x40; // Fosc = 2MHz 0x40=> 0x70 pour Fosc = 16MHz => 0x70 RCONbits.IPEN = 0; INTCONbits.PEIE = 1; //validation int via péripheriques (dans reg INTCON) INTCONbits.GIE = 1; //validation toutes int (dans reg INTCON) PIR2 = 0; //Reset Flag IT PIR1 = 0; //Reset Flag IT IPR1 = 0; IPR2 = 0; PIE1 = 0; //On devalide toute les interruptions sur PIE1 PIE2 = 0; //desactivation des autres ITs SSP1ADD=Slave_Address<<1; //adresse du pic sur le bus i2c SSP1CON1 = 0b00110110; // bit 0-3 mode 7bits esclave // bit 4 valide horloge SSP1CON2 = 0x00; SSP1CON2bits.SEN = 1; SSP1STAT = 0b0000000; // raz registre status des ports serie PIE1bits.SSP1IE = 1; // validation interruption via port serie (dans registre PIE1) PIR1bits.SSP1IF = 0; //raz bit interruption i2c for(i=0;i<nbreg;i++) registre[i]=0; } #pragma interruptlow high_isr void high_isr(void) { PORTB =0x08; } #pragma code #pragma interruptlow low_isr void low_isr(void) { PORTB =0x08; } #pragma code void main (void) { unsigned char val1; unsigned char val2; unsigned char reg; unsigned char addr; int test; registre[5] = 0xEB; registre[3] = 0x0F; registre[4] = 0x70; val1 = 0x06; val2 = 0x0A; reg = 0x06; addr = 0x00; test = 0; init(); PORTB =0x01; while(1) { } }
-----