Après plusieurs jours de blocage, je viens solliciter votre aide.
Je dois capturer la température d'un thermocouple, à partir d'un module commandé chez conrad THMOD-I2C-300, vers une carte PICDEM.NET 2, relié par in ICD2
Le circuit intégré du module est un ZSC31050
La liaison I2C est branchée correctement, deux résistances de rappel au +5V.
Il faut d'après la doc, lire 4 octets, pour ensuite reconstituer la température par une formule mathématique.
Après plusieurs essais, et arrive à générer des signaux I2C qui ont l'air normaux, mais les quatre octets lus
sont 7F FF FF FF.
unsigned char MSBThermovoltage=0, LSBThermovoltage=0,
MSBConnectorTemperature=0,LSBC onnectorTemperature=0;
Le code d'initialisation :
// Attente avant de démarrer :
DelayMs( 200 ) ;
OpenI2C1 (MASTER, SLEW_OFF);
// Delay1KTCYx(96);
StartI2C1();
while ( SSP1CON2bits.SEN ); // wait until start condition is over
val_ack=WriteI2C1( 0x78); // 0b 0111 100 0 . Le dernier bit à 0 pour indiquer une écriture.
IdleI2C1();
// while ( !SSP1CON2bits.ACKSTAT ); // Attente ack de l'esclave
AckI2C1() ;
IdleI2C1();
val_ack=WriteI2C1( 0x01); // Lancement acquisition
IdleI2C1();
// while ( !SSP1CON2bits.ACKSTAT ); // Attente ack de l'esclave
AckI2C1() ;
IdleI2C1();
val_ack=WriteI2C1( 0x30); // Lancement acquisition
IdleI2C1();
// while ( !SSP1CON2bits.ACKSTAT ); // Attente ack de l'esclave
AckI2C1() ;
IdleI2C1();
StopI2C1 () ;
DelayMs( 200 ) ;
Et puis le code dans la boucle infinie :
RestartI2C1();
val_ack=WriteI2C1( 0x79); // Lecture
IdleI2C();
AckI2C1() ;
IdleI2C();
val_ack=WriteI2C1( 0x30); // Lecture
IdleI2C();
AckI2C1() ;
IdleI2C();
MSBThermovoltage=ReadI2C1(); // Et on lit
AckI2C1();
IdleI2C();
// StartI2C1();
LSBThermovoltage=ReadI2C1(); // Et on lit
AckI2C1() ;
IdleI2C();
//StartI2C1();
MSBConnectorTemperature =ReadI2C1(); // Et on lit
AckI2C1() ;
IdleI2C();
// StartI2C1();
LSBConnectorTemperature =ReadI2C1(); // Et on lit
AckI2C1() ;
IdleI2C();
// StopI2C1 () ;
// Affichage des variables :
LCDInit();
DelayMs(200);
strcpypgm2ram(LCDText, " Temperature ");
miseAJourLCDText() ;
Je bloque toujours !
Ca doit être tout bête, sans doute...
-----