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 ---
Forum général sur le langage C !

Modérateur : Jérémy

Petit mystere sans boules de gomme
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3256
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#1 Message par paulfjujo » sam. 10 mai 2025 17:36

bonjour,


:sifflotte: 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...

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
Aide toi, le ciel ou FantasPic t'aidera

Petit mystere sans boules de gomme
satinas
Expert
Expert
Messages : 1486
Enregistré en : novembre 2015

#2 Message par satinas » sam. 10 mai 2025 18:19

A tout hasard car je n'ai jamais approfondi ça d'autant qu'il faudrait un test intensif à défaut d'exhaustivité. IT_Flag et CAPB sont des variables 8 bits. Si tu mets (int) IT_Flag et (int)CAPB dans les variables sprintf ? (MatouGPT dit que ce n'est pas nécessaire).

Petit mystere sans boules de gomme
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3256
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#3 Message par paulfjujo » sam. 10 mai 2025 19:08

bonsoir Satinas,


j'ai aussi testé avec un cas en int ..ça ne résoud pas le probleme
Aide toi, le ciel ou FantasPic t'aidera

Petit mystere sans boules de gomme
satinas
Expert
Expert
Messages : 1486
Enregistré en : novembre 2015

#4 Message par satinas » sam. 10 mai 2025 19:22

mcp_timestamp est un long, mcp_timestamp%1000 est un long, donc (int)(timestamp%1000) pour le "%03d"
Avec "%03ld" pas de problème

Petit mystere sans boules de gomme
venom
Avatar de l’utilisateur
Expert
Expert
Messages : 1614
Âge : 40
Enregistré en : avril 2016
Localisation : Klyntar
Contact :

#5 Message par venom » dim. 11 mai 2025 02:06

Réponse de GPT même si il a souvent faux... Peut être que ça peut t'aiguiller :sad:

Code : Tout sélectionner

unsigned int capb_tmp CAPB;
sprintf(CRam1," %lu.%03d mS CAPB= 0x%02X"mcp_timestamp/1000mcp_timestamp%1000capb_tmp); 







@++
Mon site web
Mon discord : venom#4888

Petit mystere sans boules de gomme
satinas
Expert
Expert
Messages : 1486
Enregistré en : novembre 2015

#6 Message par satinas » dim. 11 mai 2025 07:30

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.
sprintf_problem.png
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
Nurofen_flash_400.png
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 3 invités