Sonde de température et PIC en I2C
Répondre à la discussion
Affichage des résultats 1 à 9 sur 9

Sonde de température et PIC en I2C



  1. #1
    blacksword

    Sonde de température et PIC en I2C


    ------

    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;
    }

    -----

  2. #2
    invite7a49d0d5

    Cool Re : Sonde de température et PIC en I2C

    Bonjour,

    tu mets les 2 pattes d'adresses "en l'air"...

    je ne vois pas la correspondance adresse dans la datasheet...
    (avec les 2 pattes en "float")...

    essaie plutôt en les mettant à 0, ou au moins une,
    comme décrit dans la datasheet, page 8...

    vede
    ;O]

  3. #3
    blacksword

    Re : Sonde de température et PIC en I2C

    j'utilise le TMP101 qui ne possède qu'une patte d'adresse. Le tableau correspondant est le 12, page 8. L'adresse est donc 1001001(0/1).

  4. #4
    invite7a49d0d5

    Cool Re : Sonde de température et PIC en I2C

    Bonsoir,

    ok, est ce que le -39°C varie si tu chauffes la sonde?
    entre tes doigts par exemple???

    si oui, c'est peut-être une mauvaise/erreur de "conversion"
    au niveau de ton programme...

    je connais pas ces sondes, mais je connais bien les DSxxxx
    (DS18B20, DS18S21, DS1822...)... qui paraissent ressembler...
    au niveau de l'encodage de la température...

    car vite fait, en regardant la datasheet, on dirait que
    pour les temperatures négatives, c'est un calcul/
    une conversion avec complément à 1+1...

    comme j'ai pas le temps de tout lire et décoder, dis moi :

    - quelle résolution (9 à 12 bits) à tu configurés/choisis?
    - où est le bit de signe dans les registres?
    - pour -39°C, quelles sont les valeurs lues dans les registres?
    (exemple octet 1 = 0001 1000, octet 2 = 1111 0111...
    exemple au hasard...)

    delà je regarderais ton code...

    vede
    ;O]

  5. A voir en vidéo sur Futura
  6. #5
    blacksword

    Re : Sonde de température et PIC en I2C

    j'avais marqué dans mon premier post que je recevais deux fois la même chose pour les deux octets concernants la température, je les affiche sur mon écran LCD. Je suis en config 11bits pour pouvoir lire une tempétaure négative. Je m'explique, sur ces sondes c'est le 12ème bit (en mode 11bits) qui donne le signe. Si il vaut 1, la température est négative, sinon elle est positive. j'ai testé à la main plusieurs fois ma méthode de conversion et elle marche. Ce qui il y c'est que la sonde m'envoi, ou devrais-je dire mon pic lis parce que je sais pas trop ce qui se passe là, deux fois le même octet, soit 21. Le problème c'est que techniquement, le deuxième octet qui correspond aux bits 9 à 12 ne peut pas valoir 21 car au maximum il peut valoir 15 parce que les bits 13 à 16 vallent 0.

    Si j'ai bien compris la datasheet la séquence d'envoi de donné dois être la suivante :
    1)envoi de l'adresse avec r/w à 0
    2)envoi de la valeur du pointeur de registre (ici configuration register au début)
    3)envoi des données de configuration (ici '64' pour une résolution de 11bits)
    4)envoi restart
    5)envoi adresse avec r/w à 0
    6)envoi de la valeur du pointeur de registre (ici temperature register)
    7)stop
    8)start
    9)envoi de l'adresse avec r/w à 1
    10)reception du premier octet
    11)reception du deuxième octet
    12)stop

  7. #6
    blacksword

    Re : Sonde de température et PIC en I2C

    Bon je viens de voir une très grosse erreur de ma part! C'est normal que ça me donnait deux fois la même chose car j'ai du faire un copié collé de la ligne sans changer ce que je devais affiché! donc maintenant j'ai deux nombres différents qui s'affichent sauf que c'est toujours pas normal. le premier vaut 21 à 25 selon si j'y met le doigt dessus ou pas et le deuxième lui varie de 0 à 254 à ce que je vois. ça à l'air cohérent comme ça mais déjà apparemment c'est le deuxième octet qui est envoyé avant le premier et en plus celui ci dépasse la valeur de 15 donc ya un problème. Je continue à plancher là dessus, dois bien y avoir une solution!

  8. #7
    Qristoff
    Animateur Électronique

    Re : Sonde de température et PIC en I2C

    Bonsoir
    le deuxième octet corresponds aux bits T3..T0 (sur les 4 msb) et doit être traité pour obtenir la résolution voulue...en 8 bits !
    Tout existe, il suffit de le trouver...!

  9. #8
    blacksword

    Re : Sonde de température et PIC en I2C

    désolé mais j'ai pas bien compris... le deuxième octet correspond d'après le §slave transmitter mode de la page 8 à l'octet de poids le plus faible du registre de température soit une valeur sur 8bits...

  10. #9
    blacksword

    Re : Sonde de température et PIC en I2C

    c'est bon ça marche! Désolé Qristoff de pas avoir bien saisi ce que tu as dit mais tu avais parfaitement raison! Je voyais pas les choses de la bonne façon en fait. Je pensais que le premier octet était du genre (pour 9bits) 0000000x et le deuxième xxxxxxxx alors qu'en fait le premier est du type xxxxxxxx et le deuxième x0000000. Du coup ça marche super bien et pour afficher la virgule en 9bits c'est super simple vu que c'est le deuxième octet qui dit si c'est X.0°C ou X.5°C. Si ça peut aider quelqu'un, si la valeur du premier octet est supérieure à 128 ça veut dire que la température est négative et du coup elle vaut 128-octet1. Merci à tous pour votre aide!

Discussions similaires

  1. PIC et I2C vs UART
    Par invite220a379c dans le forum Électronique
    Réponses: 3
    Dernier message: 15/07/2009, 11h36
  2. horloge + temperature I2C afficheur 7 segment
    Par invited02d59f3 dans le forum Électronique
    Réponses: 20
    Dernier message: 23/06/2009, 10h44
  3. PIC et I2C HArd
    Par pseudoblogeus dans le forum Électronique
    Réponses: 4
    Dernier message: 26/10/2008, 22h41
  4. PIC F876A et i2c
    Par noisyboxes dans le forum Électronique
    Réponses: 2
    Dernier message: 16/03/2007, 07h44
  5. Choix sonde i2c, lm35,..
    Par invite1ea6bfdc dans le forum Électronique
    Réponses: 14
    Dernier message: 01/01/2007, 11h33
Découvrez nos comparatifs produits sur l'informatique et les technologies.