Interruption qui s'éxécute "bizarrement" !
Répondre à la discussion
Affichage des résultats 1 à 2 sur 2

Interruption qui s'éxécute "bizarrement" !



  1. #1
    petitnul12

    Interruption qui s'éxécute "bizarrement" !


    ------

    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
    Code:
    void interrupt high_priority cpu_interrupt(void) {
        if(TMR0IE && TMR0IF) {
            clock_interrupt();
            TMR0IF = 0;
        } else {}
        if(SSPIE && SSPIF) {
            i2c_interrupt();
            SSPIF = 0;
        } else {}
    }
    i2c_interrupt()
    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 : {};
            }
        }
    }

    -----

  2. #2
    petitnul12

    Re : Interruption qui s'éxécute "bizzarement"

    En réalité, même si le µC n’exécute pas le bout de code correspondant, cela fait fonctionner le µC de manière bizarre. Je vais réduire mon interruption.

Discussions similaires

  1. logiciel ne s'execute pas
    Par mya_0000 dans le forum Logiciel - Software - Open Source
    Réponses: 6
    Dernier message: 30/03/2013, 14h14
  2. PIC : interruption externe et interruption on change ?
    Par jlg_47 dans le forum Électronique
    Réponses: 10
    Dernier message: 09/04/2012, 12h41
  3. programme qui ne part pas en interruption
    Par ABN84 dans le forum Électronique
    Réponses: 15
    Dernier message: 18/08/2009, 23h04
  4. Disjoncteur câblé bizarrement.
    Par abracadabra75 dans le forum Électronique
    Réponses: 3
    Dernier message: 15/12/2008, 08h42
  5. [Brun] Télé réglées bizarrement...
    Par invitee4a10cd4 dans le forum Dépannage
    Réponses: 1
    Dernier message: 15/12/2007, 21h30
Découvrez nos comparatifs produits sur l'informatique et les technologies.