Bienvenue aux nouveaux arrivants sur FantasPic !
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
Modérateur : Jérémy
Insertion fonctions dans une interruption XC8 18F27K42
- paulfjujo

Maître- Messages : 3256
- Âge : 75
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
Bonjour à tous,
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
No problemo..hormis l'intervale de temps de traitement NON rigoureux en mode pooling.
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
//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 RC0
qui 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
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
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Insertion fonctions dans une interruption XC8 18F27K42
Bonjour, si tu veux faire de l'i2c à la fois dans le main et dans une interruption, il y aura forcément du grabuge.
On s'en sort en mettant T6IE à 0 durant les transferts i2c du main, et sans toucher à T6IF.
Les lectures régulières i2c toutes les 100ms par l'interruption seront garanties uniquement si aucune activité i2c du main ne dure plus de 100ms.
Ce test est inutile, je sais que tu vas me dire que cela ne mange pas de pain, mais cela bouffe du temps cpu
if ( (PIR3bits.U1RXIF==1) && (PIE3bits.U1RXIE ==1) ) {
On s'en sort en mettant T6IE à 0 durant les transferts i2c du main, et sans toucher à T6IF.
Les lectures régulières i2c toutes les 100ms par l'interruption seront garanties uniquement si aucune activité i2c du main ne dure plus de 100ms.
Ce test est inutile, je sais que tu vas me dire que cela ne mange pas de pain, mais cela bouffe du temps cpu
if ( (PIR3bits.U1RXIF==1) && (PIE3bits.U1RXIE ==1) ) {
Insertion fonctions dans une interruption XC8 18F27K42
- paulfjujo

Maître- Messages : 3256
- Âge : 75
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
satinas a écrit :....
Les lectures régulières i2c toutes les 100ms par l'interruption seront garanties uniquement si aucune activité i2c du main ne dure plus de 100ms.
si la boucle main dure <100mS , plus besoin d(interrupt à 100mS !
satinas a écrit :Ce test est inutile, je sais que tu vas me dire que cela ne mange pas de pain, mais cela bouffe du temps cpu
if ( (PIR3bits.U1RXIF==1) && (PIE3bits.U1RXIE ==1) ) {
et je ne suis pas un Ogre, je ne vais pas devorer Temps X.
c'est vrai , sauf si on a besoin, dans le main, qu'une commande terminal ne vienne pas
interferer ,et dans ce cas precis je mets donc PIE3bits.U1RXIE =0;
sachant que l'humain peut intervenir n'importe quand ...
mais tu remarquera que je m'améliore ici, la solution au probleme via l'interrpt RC0 (sans traiter le flag IOCIE !)
Code : Tout sélectionner
void __interrupt(irq(IRQ_IOC),high_priority) IOC_ISR(void)
{
unsigned char i;
const char *p2="ALERT\r\n";
U1TXB ='*';__delay_ms(2);
if ( (IOCCF & 0x01)==1) // RC0
{
for (i=0; i<6; i++)
{
while (!U1TXIF) { };
U1TXB = *(p2+i);
}
Led_Rouge=0; // allume led
k1_PWM=0;
k2_PWM=0;
PWM1_LoadDutyValue(k1_PWM); // plus de cde PWM sur le PONT H
PWM2_LoadDutyValue(k2_PWM);
}
IOCCF = 0x00;
}
mes 1er test ne marchais qu'une seule fois ????
because j'avais armé le LEN (Latch Enable de l'ALERT INA226 ) , il faut couper l'alium 5V de l'INA pour le faire tomber
ou refaire une int entiere ...
j'ai donc enlevé le LATCH avec LEN=0 ...
Tout est OK .. sauf que
si je fais un demarrage à vitesse max PWM=1000 (100%) , je n'ai meme pas le temps de voir le moteur tourner car ALART et arret PWM.
Par contre un demarrage à 75% passe sans probleme .. il faudra donc jouer sur les seuils INA , suivant qu'on demarre
ou qu'on est en regime etablit.
un demarrage moteur à PWM1=100% => depassement seuil
detecté via RC0 interrupt ... donc ne demarre pas !
(19:05:32.866) PWM1=1000
(19:05:32.988) NbB= 1656 Cpt6=10064 PWM1= 0 PWM2= 0 15.66 V 0.003 A . Seuil=0.600
(19:05:33.049) Recu :PWM1=1000
(19:05:33.049) Saisie OK PWM1-RC2 1000 98.0%
(19:05:33.102) *ALERT<CR>NbB= 1657 Cpt6=10071 PWM1= 0 PWM2= 0 15.61 V 0.018 A . Seuil=0.600
(19:05:34.303) NbB= 1658 Cpt6=10077 PWM1= 0 PWM2= 0 15.66 V 0.003 A . Seuil=0.600
(19:05:34.964) NbB= 1659 Cpt6=10083 PWM1= 0 PWM2= 0 15.66 V 0.003 A . Seuil=0.600
(19:05:35.625) NbB= 1660 Cpt6=10089 PWM1= 0 PWM2= 0 15.66 V 0.003 A . Seuil=0.600
(19:05:36.286) NbB= 1661 Cpt6=10095 PWM1= 0 PWM2= 0 15.66 V 0.003 A . Seuil=0.600
(19:05:50.821) MA=1
(19:05:50.936) NbB= 1683 Cpt6=10228 PWM1= 0 PWM2= 0 15.66 V 0.001 A . Seuil=0.600
(19:05:51.016) Recu :MA=1
(19:05:51.016) ITB2 Enabled
(19:05:51.553) NbB= 1684 Cpt6=10234 PWM1= 0 PWM2= 0 15.66 V 0.003 A . Seuil=0.600
(19:05:52.214) NbB= 1685 Cpt6=10240 PWM1= 0 PWM2= 0 15.66 V 0.003 A . Seuil=0.600
(19:05:52.874) NbB= 1686 Cpt6=10247 PWM1= 0 PWM2= 0 15.66 V 0.003 A . Seuil=0.600
(19:05:53.535) NbB= 1687 Cpt6=10253 PWM1= 0 PWM2= 0 15.66 V 0.003 A . Seuil=0.600
(19:05:54.197) NbB= 1688 Cpt6=10259 PWM1= 0 PWM2= 0 15.66 V 0.003 A . Seuil=0.600
(19:05:54.839) PWM1=0750
(19:05:54.965) NbB= 1689 Cpt6=10265 PWM1= 0 PWM2= 0 15.66 V 0.003 A . Seuil=0.600
(19:05:55.009) Recu :PWM1=0750
(19:05:55.009) Saisie OK PWM1-RC2 750 73.5%
(19:05:55.573) NbB= 1690 Cpt6=10271 PWM1= 750 PWM2= 0 15.55 V 0.037 A . Seuil=0.600
(19:05:56.235) NbB= 1691 Cpt6=10277 PWM1= 750 PWM2= 0 15.60 V 0.058 A . Seuil=0.600
(19:05:56.897) NbB= 1692 Cpt6=10283 PWM1= 750 PWM2= 0 15.60 V 0.058 A . Seuil=0.600
Insertion fonctions dans une interruption XC8 18F27K42
si la boucle main dure <100mS , plus besoin d(interrupt à 100mS !
Je parlais des activités i2c du main, aucune ne soit dépasser 100ms, il peut aussi y avoir dans le main par exemple des calculs longuets qui ne posent pas de problème car ne touchant pas à l'i2c.
c'est vrai, sauf si on a besoin dans le main qu'une commande terminal ne vienne pas interferer, dans ce cas précis je mets donc PIE3bits.U1RXIE =0;
Si tu mets PIE3bits.U1RXIE à 0, la routine d'interruption n'est pas exécutée. Le fait d'avoir avec l'IVT des routines spécifiques permet justement d'éviter tous ces tests, alors qu'avec les pics avec une seule routine ils étaient souvent indispensables.
Insertion fonctions dans une interruption XC8 18F27K42
- paulfjujo

Maître- Messages : 3256
- Âge : 75
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
satinas a écrit :........
si tu mets PIE3bits.U1RXIE à 0, la routine d'interruption n'est pas exécutée.
.....
OUI, c'est bien le but que je recherche ...
sachant que je le reactive dans une autre zone moins sensible du main.
J'ai maintenant adopté/ preféré le choix interrupt IVT !
chaque interrupt ayant son propre vecteur d'interrupt
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 2 invités

