Bonsoir,
Je tente d'utiliser l'I2C avec un PIC18F4680, et j'ai un petit soucis d'interruption.. Dans mon programme de test, j'initialise mon module MSSP (je met SSPIF à 0 à ce moment), mais je ne l'utilise pas. Donc mon programme ne devrait pas rentrer dans mon fonction d'interruption dédié à l'I2C.
Mais chose encore plus étrange, le soft de test fait clignoter une diode, mais quand j'insère dans ma fonction d'interruption, la ligne pour l'I2C, le clignotement de ma diode est bcp plus lent... (mais tjs régulier), si je commente la ligne "i2c_interrupt()" tout redevient ok.
Je ne comprend pas pourquoi cela affecte l'horloge du système... Vous avez des idées ?
Merci
Fonction de l'interruption
i2c_interrupt()Code:void interrupt high_priority cpu_interrupt(void) { if(TMR0IE && TMR0IF) { clock_interrupt(); TMR0IF = 0; } else {} if(SSPIE && SSPIF) { i2c_interrupt(); SSPIF = 0; } else {} }
Code:void i2c_interrupt() { if(i2c.mode == 'M') { switch (i2c.state) { case 0 : { //On envoie l'adresse i2c_writebuffer(i2c.i2c.adress*2+i2c.i2c.read_bit); if(i2c.i2c.read_bit) i2c.state = 1; else i2c.state = 2; } break; case 1 : { //On recoit des données if(RCEN == 0) { if(i2c.i2c.size_indata == 0) { PEN = 1; i2c.state = 3; } else { RCEN = 1; } } else { *i2c.i2c.in_data = i2c_readbuffer(); i2c.i2c.in_data++; i2c.i2c.size_indata--; if(i2c.i2c.size_indata == 0) { ACKDT = 1; } else { ACKDT = 0; } ACKEN = 1; } } break; case 2 : { //On envoie des données if((i2c.i2c.size_outdata != 0) && (ACKSTAT == 0)) { i2c_writebuffer(*i2c.i2c.out_data); i2c.i2c.out_data++; i2c.i2c.size_outdata--; } else { PEN = 1; i2c.state = 3; } } break; default : {} break; } } if(i2c.mode == 'S') { switch (i2c.state) { case 0 : { //On attend une requette if( (SSPSTAT & 0x2C) == 0x0C ) { i2c.state = 1; i2c.i2c.adress = i2c_readbuffer(); } else { i2c.state = 2; i2c.i2c.adress = i2c_readbuffer(); i2c_writebuffer(*i2c.i2c.out_data); i2c.i2c.out_data++; i2c.i2c.size_outdata--; CKP = 1; } } break; case 1 : { //Read mode *i2c.i2c.in_data = i2c_readbuffer(); i2c.i2c.in_data++; i2c.i2c.size_indata++; } break; case 2 : { //Write mode if(i2c.i2c.size_outdata != 0) { i2c_writebuffer(*i2c.i2c.out_data); i2c.i2c.out_data++; i2c.i2c.size_outdata--; CKP = 1; } } break; default : {}; } } }
-----