Bonjour à tous! Je souhaite réaliser une petite station de chauffage pour chez moi et j'ai donc besoin de sondes de température pour connaitre la température de la pièce. J'ai donc choisi des sondes de température en I2C, les TMP100 et TMP101. Comme pic j'utilise le 18F4550. Je programme en C dans l'environnement HI-TIDE sur mac (avec le compilateur C18) et j'utilise le programmateur PICKit2. J'utilise donc les librairies données avec le compilateur pour gérer l'I2C et mon écran LCD.
Le problème que j'ai c'est que lorsque je souhaite lire la température je lis deux fois le même nombre (21) et la température qui en découle est incohérente(-39°C). C'est mon premier programme en I2C donc il y a certainement des choses que je ne fais pas bien. Je vous met donc mon code en espérant que vous y trouverez ce qui cloche. la datasheet des TMP100/101 est ici. En ce moment j'utilise la TMP101 avec la patte adresse en l'air. J'ai mis 2 résistances de pull-up de 4k7 sur les 2 lignes. Normalement j'ai bien commenté mon code, ça sera plus simple pour sa compréhension. Merci d'avance!
Code:#ifndef _XTAL_FREQ #define _XTAL_FREQ 8000000 #endif #define TEMP_REGISTER 0 #define CONFIG_REGISTER 1 #define TLOW_REGISTER 2 #define THIGH_REGISTER 3 #define READ 0b10010011 #define WRITE 0b10010010 #include "init.h" // included by C-Wiz #include <htc.h> #include <stdlib.h> #include "lcd.h" #include "i2c.h" #include "delay.h" void config(void); void main(void) { int adresse=146,signe=1,partie1=0,partie2=0,temp=0,ack=1,i=1; unsigned char temperature[4],p1[9],p2[9],test[3]; init(); // Function call inserted by C-Wiz config(); TRISA=0; TRISB=0; TRISD=0; lcd_init(0); lcd_home(); lcd_goto(0); lcd_puts("I2C "); DelayMs(250); lcd_goto(0); OpenI2C(MASTER,SLEW_OFF); //ouverture port I2C SSPADD=4; IdleI2C(); StartI2C(); //envoi de Start IdleI2C(); while(SSPCON2bits.RSEN); //attente fin start WriteI2C(WRITE); //envoi de l'adresse en écriture IdleI2C(); while(SSPCON2bits.ACKSTAT); //attente ack WriteI2C(CONFIG_REGISTER); //envoi de l'adresse du registre de configuration IdleI2C(); while(SSPCON2bits.ACKSTAT); //attente ack WriteI2C(64); //envoi de la config IdleI2C(); while(SSPCON2bits.ACKSTAT); //attente ack IdleI2C(); RestartI2C(); //envoi restart IdleI2C(); while(SSPCON2bits.RSEN); //attente fin restart WriteI2C(WRITE); //envoi de l'adresse en écriture IdleI2C(); while(SSPCON2bits.ACKSTAT); //attente ack WriteI2C(TEMP_REGISTER); //envoi de l'adresse du registre de température IdleI2C(); StopI2C(); //envoi de stop while(1) { IdleI2C(); while(SSPCON2bits.PEN); //attente fin stop StartI2C(); //envoi de start IdleI2C(); while(SSPCON2bits.RSEN); //attente fin start WriteI2C(READ); //envoi de l'adresse en lecture IdleI2C(); while(SSPCON2bits.ACKSTAT); //attente ack partie1=ReadI2C(); //lecture du premier octet itoa(p1,partie1,10); lcd_goto(64); lcd_puts(p1); IdleI2C(); AckI2C(); //envoi ack IdleI2C(); partie2=ReadI2C(); //lecture du deuxième octet itoa(p2,partie1,10); lcd_goto(72); lcd_puts(p2); IdleI2C(); AckI2C(); //envoi ack IdleI2C(); StopI2C(); //envoi de Stop while(SSPCON2bits.PEN); //attente fin stop temp=partie1+256*partie2; if(temp<=4096) { temp=(25*temp)/400; } else { temp=-(25*(4096-temp))/400; } itoa(temperature,temp,10); lcd_goto(0); lcd_puts(" "); lcd_goto(0); lcd_puts(temperature); lcd_putch(' '); itoa(test,i,10); lcd_puts(test); i++; DelayMs(250); DelayMs(250); DelayMs(250); DelayMs(250); } } void config(void){ IRCF2=1; IRCF1=1; IRCF0=1; ADCON1 = 15; //toutes les entrées en digital I/O CM2=1; CM1=1; CM0=1; }
-----