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

