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
Petit mystere sans boules de gomme
- paulfjujo

Maître- Messages : 3256
- Âge : 75
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonjour,
Encore un mystere (ou un bug de ma part) que je n'arrive pas à élucider
Problemo NON résolu :
OK avec
sprintf(CRam1," %lu.%03d mS IT_Flag = 0x%02X CAPB= 0x%02X",mcp_timestamp/1000,mcp_timestamp%1000,IT_Flag,CAPB);
CAPB est bien vu à 0x02
(13:42:08.922) N= 21 PWM1= 0 PWM2= 0 4.99 V 0.001 A . Seuil=0.600 MCP_B = 0xFF
(13:42:09.561) N= 22 PWM1= 0 PWM2= 0 4.99 V 0.001 A . Seuil=0.600 MCP_B = 0xFF
(13:42:10.213) N= 23 PWM1= 0 PWM2= 0 4.99 V 0.001 A . Seuil=0.600 7231.436 mS IT_Flag = 0x00 CAPB= 0x02
(13:42:10.860) N= 24 PWM1= 0 PWM2= 0 4.99 V 0.001 A . Seuil=0.600 MCP_B = 0xFF
bad avec
sprintf(CRam1," %lu.%03d mS CAPB= 0x%02X",mcp_timestamp/1000,mcp_timestamp%1000,CAPB); // bad
CAPB est vu à 0x00 au lieu de 0x02
(13:45:07.669) N= 41 PWM1= 0 PWM2= 0 4.99 V 0.001 A . Seuil=0.600 MCP_B = 0xFD
(13:45:08.320) N= 42 PWM1= 0 PWM2= 0 4.99 V 0.001 A . Seuil=0.600 13507.815 mS CAPB= 0x00
(13:45:08.964) N= 43 PWM1= 0 PWM2= 0 4.99 V 0.001 A . Seuil=0.600 MCP_B = 0xFF
la capture des registres MCP23017 , se passe bien dans l'interrupt IOC , qui arme le flag mcp_flag...
extraits de code faisant partie
de Portail lourd motorisé 2 vantaux 24v #126
18F27K42_PMW_CCP1234_2025-0510.X.zip
Problemo NON résolu :
OK avec
sprintf(CRam1," %lu.%03d mS IT_Flag = 0x%02X CAPB= 0x%02X",mcp_timestamp/1000,mcp_timestamp%1000,IT_Flag,CAPB);
CAPB est bien vu à 0x02
(13:42:08.922) N= 21 PWM1= 0 PWM2= 0 4.99 V 0.001 A . Seuil=0.600 MCP_B = 0xFF
(13:42:09.561) N= 22 PWM1= 0 PWM2= 0 4.99 V 0.001 A . Seuil=0.600 MCP_B = 0xFF
(13:42:10.213) N= 23 PWM1= 0 PWM2= 0 4.99 V 0.001 A . Seuil=0.600 7231.436 mS IT_Flag = 0x00 CAPB= 0x02
(13:42:10.860) N= 24 PWM1= 0 PWM2= 0 4.99 V 0.001 A . Seuil=0.600 MCP_B = 0xFF
bad avec
sprintf(CRam1," %lu.%03d mS CAPB= 0x%02X",mcp_timestamp/1000,mcp_timestamp%1000,CAPB); // bad
CAPB est vu à 0x00 au lieu de 0x02
(13:45:07.669) N= 41 PWM1= 0 PWM2= 0 4.99 V 0.001 A . Seuil=0.600 MCP_B = 0xFD
(13:45:08.320) N= 42 PWM1= 0 PWM2= 0 4.99 V 0.001 A . Seuil=0.600 13507.815 mS CAPB= 0x00
(13:45:08.964) N= 43 PWM1= 0 PWM2= 0 4.99 V 0.001 A . Seuil=0.600 MCP_B = 0xFF
la capture des registres MCP23017 , se passe bien dans l'interrupt IOC , qui arme le flag mcp_flag...
Code : Tout sélectionner
void __interrupt(irq(IRQ_IOC),high_priority) IOC_ISR(void)
{
unsigned char i;
const char *p2="ALERT\r\n";
if ( (IOCCF & 0x01)==1) // RC0
{ U1TXB ='*';
__delay_ms(2);
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;
}
if ((IOCBF & 0x02)==2) // RB1 <-INTB du MCP23017
{
// INTCON0bits.GIE=0;
// MCP_B = I2C1_Read1ByteRegister(MCP23017_ADDR, MCP_GPIOB);
// MCP_B = MCP23017_ReadGPIOB();
// INTCON0bits.GIE=1;
mcp_timestamp = SMT1_GetTimeUs(); // Lecture "temps réel" dans l'ISR
mcp_flag = true;
IOCBF = 0;
}
}
Code : Tout sélectionner
if(mcp_flag)
{
mcp_flag = false;
IT_Flag=I2C1_Read1ByteRegister(MCP23017_ADDR,MCP_INTFB);
CAPB=I2C1_Read1ByteRegister(MCP23017_ADDR,MCP_INTCAPB);
MCP_B = MCP23017_ReadGPIOB();
} ;extraits de code faisant partie
de Portail lourd motorisé 2 vantaux 24v #126
18F27K42_PMW_CCP1234_2025-0510.X.zip
Petit mystere sans boules de gomme
Petit mystere sans boules de gomme
Petit mystere sans boules de gomme
Petit mystere sans boules de gomme
Réponse de GPT même si il a souvent faux... Peut être que ça peut t'aiguiller
@++
Code : Tout sélectionner
unsigned int capb_tmp = CAPB;
sprintf(CRam1," %lu.%03d mS CAPB= 0x%02X", mcp_timestamp/1000, mcp_timestamp%1000, capb_tmp); @++
Petit mystere sans boules de gomme
Bonjour Venom,
Je ne pense pas que cela pose problème, car CAPB est promu en int en raison du format %X, mais cela ne mange pas de pain
de caster CAPB en (unsigned int). En tout cas xc8 ne sort pas de warning à ce sujet.
Par contre Paul, il faut vraiment que tu tiennes compte des warnings, car après test un warning te dit que mcp_timestamp%1000 est un long et il n'est pas cohérent avec "%03d". il faut donc le caster en (int). C'est le même problème que l'autre fois, bien que je ne suis pas arrivé à faire apparaître un défaut dans mes tests rapides de ce matin. mcp_timestamp/1000 et mcp_timestamp%1000 sont des unsigned long, c'est expliqué là viewtopic.php?p=19846#p19846, tous les opérateurs suivent la même règle que la multiplication. 1000 est un int dans les calculs, si on spécifie 1000L ou (long)1000 il devient un long, 100000 est un long dans xc8. Comme mcp_timestamp est un unsigned long, / et % passent 1000 en long (ou unsigned long je sais pas trop) et l'opération se fait entre 2 longs, avec éventuellement un résultat tronqué si on explose le long (multiplication).
Bon dimanche
Je ne pense pas que cela pose problème, car CAPB est promu en int en raison du format %X, mais cela ne mange pas de pain
Par contre Paul, il faut vraiment que tu tiennes compte des warnings, car après test un warning te dit que mcp_timestamp%1000 est un long et il n'est pas cohérent avec "%03d". il faut donc le caster en (int). C'est le même problème que l'autre fois, bien que je ne suis pas arrivé à faire apparaître un défaut dans mes tests rapides de ce matin. mcp_timestamp/1000 et mcp_timestamp%1000 sont des unsigned long, c'est expliqué là viewtopic.php?p=19846#p19846, tous les opérateurs suivent la même règle que la multiplication. 1000 est un int dans les calculs, si on spécifie 1000L ou (long)1000 il devient un long, 100000 est un long dans xc8. Comme mcp_timestamp est un unsigned long, / et % passent 1000 en long (ou unsigned long je sais pas trop) et l'opération se fait entre 2 longs, avec éventuellement un résultat tronqué si on explose le long (multiplication).
Bon dimanche
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 2 invités

