Sous mikroC on peut insérer un appel de fonction dans une interruption moyennent
#pragma ReentrancyCheck ON
mais je suis maintenent avec MPLABX XC8 C99 ...
J'ai initialisé le Timer6 pour générer une interruption chaque 100mS..
de ce coté là ...no problemo
Sous XC8 , je veux introduire /lancer une routine faisant la lecture des données
d'un capteur I2C INA226 , en particulier l'info mesure de courant et status contenant l'info ALERT
toute les 100mS ..pour garantir un temps de reponse independant du temps de boucle principale
(temps inconnu à ce jour) mais nécessitant une reactivité de traitement..
exemple : portail en butée => over load en courant ,mais de duree < 100mS !
J'ai déja testé OK , ce traitement de dépassement seuil de courant ....dans la boucle principale
Pas de soucis avec la prodcedure complete que je veux inserer...
void Mesures_INA226(void)
si appelée depuis le main.c (boucle principale)
mais blocage si elle est incluse, meme partiellement , dans l'IT Timer6
Code : Tout sélectionner
void __interrupt(irq(IRQ_TMR6),low_priority) TMR6_ISR(void)
{ //... evry 100mS ....
Cpt6++; // affiché sur YAT terminal
Flag_Timer6=1;
if (Init_INA226_Done==1)
{ //lecture shunt
Addr= INA226_ADDR;
tmp[0]=0;
tmp[1]=0;
p1=&tmp[0];
I2C1_ReadDataBlock(Addr,INA226_SHUNT_REG,p1,3);
mvA=(tmp[0]<<8) + tmp[1];//lecture Status
Addr=INA226_ADDR;
tmp[0]=0; tmp[1]=0;
p1=&tmp[0]; // pointeur sur debut de table
I2C1_ReadDataBlock(Addr,INA226_MASK_EN_REG,p1,2);
ALERTE_STATUS= (tmp[0]<<8) + tmp[1];
AFF_Flag=(ALERTE_STATUS & 0x00F0)>>4;[/code]
T6PR=244; // pour 100mS
PIR9bits.TMR6IF=0;// clear the TMR6 interrupt flag
}
}
[/code]
j'ai quand meme une solution de secours, avec le traitement interrupt IOC sur RC0qui reçoit le signal ALERT (en hardware)
pour couper les cde PWM1 et PWM2 , via interrupt IOCCN=0x01
.. test (réels) en cours ...
package du projet ci joint

