/** * Point d'entrée des interruptions pour l'esclave. */ void esclaveInterruptions() { unsigned char p1, p3; if (PIR1bits.TMR1IF) { TMR1 = 3035; ADCON0bits.GO = 1; PIR1bits.TMR1IF = 0; } if (PIR1bits.ADIF) { i2cExposeValeur(0, ADRESH); PIR1bits.ADIF = 0; } if (PIR1bits.TMR2IF) { if (pwmEspacement()) { p1 = pwmValeur(0); p3 = pwmValeur(1); CCPR3L = p3; CCPR1L = p1; } else { CCPR3L = 0; CCPR1L = 0; } PIR1bits.TMR2IF = 0; } if (PIR1bits.SSP1IF) { i2cEsclave(); } }
/** * Gère les interruptions de basse priorité. */ void interrupt low_priority bassePriorite() { static SourceAD sourceAD = ACCUMULATEUR; Energie *energie; unsigned char conversion; // Lance une conversion Analogique / Digitale: if (INTCONbits.T0IF) { INTCONbits.T0IF = 0; TMR0H = 0xFC; TMR0L = 0x18; ADCON0bits.CHS = sourceAD; ADCON0bits.GODONE = 1; } // Reçoit le résultat de la conversion Analogique / Digitale. if (PIR1bits.ADIF) { PIR1bits.ADIF = 0; if (!ADCON0bits.GODONE) { conversion = ADRESH; switch (sourceAD) { case ACCUMULATEUR: i2cExposeValeur(LECTURE_ACCUMULATEUR, conversion); energie = mesureAccumulateur(conversion); sourceAD = BOOST; break; case BOOST: i2cExposeValeur(LECTURE_BOOST, conversion); energie = mesureBoost(conversion); sourceAD = ALIMENTATION; break; case ALIMENTATION: default: i2cExposeValeur(LECTURE_ALIMENTATION, conversion); energie = mesureAlimentation(conversion); sourceAD = ACCUMULATEUR; break; } configureCircuit(energie); } else { i2cExposeValeur(LECTURE_ERREUR, 255); } } // Interruptions I2C if (PIR1bits.SSP1IF) { i2cEsclave(); PIR1bits.SSP1IF = 0; } }