[Programmation] Probleme capteur de température ds1631 + PIC18F45K22 - Page 2
Répondre à la discussion
Page 2 sur 2 PremièrePremière 2
Affichage des résultats 31 à 39 sur 39

Probleme capteur de température ds1631 + PIC18F45K22



  1. #31
    ussmag

    Re : Probleme capteur de température ds1631 + PIC18F45K22


    ------

    je parle de ce calcul là , datah et datal contient les bonne valeurs en hexa mais temp_c=0°C ce qui est pas noramal et si la température du capteur est négative temp_c=-4096.

    Code:
               datah=i2c_Read(0);
               datal==i2c_Read(1);
          StopI2C2();
    if(datah>=0x80)
    {//if sign bit is set, then temp is negative
    temp_c = (float)((datah<<8 + datal) - 65536) * 0.0625;
    return(temp_c);
    }
    else
    {
    temp_c = (float)((datah<<8) + (datal)) * 0.0625;
             return(temp_c);
    }
    }

    -----

  2. #32
    invite03481543

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    temp_c est déclaré en int comment veux-tu avoir une valeur négative? (0-65535)

    Il faut déclarer tout en char et temp_c en int, et tu extraits le signe en testant le 8eme bit de datah.
    Tu crées une variable signe (0 -> positif et 1 négatif) et tu retournes la valeur absolue en faisant un masque sur le bit 16 de temp_c.
    Tu verras ça fonctionnera beaucoup mieux

  3. #33
    ussmag

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    ce que tu viens de dire c'est du chinois pour moi j'en ai jamais fait

    Temp_c est déclaré en float je lavait changé en int juste pour essayer , (Par contre cette fonction est utilisée par le fabricant du capteur dans son driver.)

  4. #34
    invite03481543

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    ou si tu veux garder la fonction,
    déclare:
    Code:
     unsigned int read_int_temp() // comme déjà dit
    et

    Code:
    if(datah>=0x80) 
    {//if sign bit is set, then temp is negative
    
    temp_c = (float)((datah<<8 + datal) - 65536) * 0.0625;
    return(temp_c); // décla
    }
    else
    {
    temp_c = (float)((datah<<8) + (datal)) * 0.0625;
    return(temp_c);
    }
    }

  5. #35
    invite03481543

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    Citation Envoyé par ussmag Voir le message
    ce que tu viens de dire c'est du chinois pour moi j'en ai jamais fait

    Temp_c est déclaré en float je lavait changé en int juste pour essayer , (Par contre cette fonction est utilisée par le fabricant du capteur dans son driver.)
    Non c'est impossible qu'il l'utilise comme tu l'as écrite, sans quoi il faut déclarer

    Code:
    float read_int_temp()
    et déclarer temp_c en float.

  6. #36
    invite03481543

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    La valeur retournée doit être compatible avec la valeur de retour déclarée dans la fonction:

    Code:
    float read_int_temp()
    {
    float temp_c;
    
    .....
    ......
    
    return(temp_c);
    }

  7. #37
    invite03481543

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    Dans mon post #34 ça ne peut fonctionner puisque je décalre une valeur de retour en int alors que temp_c est forcément en float à cause du casting qui est déclaré:
    Code:
    temp_c = (float)((datah<<8) + (datal)) * 0.0625;
    Cette façon de faire est digne d'un développeur arduino, mieux vaut travailler avec des int que des floats sur un 8 bits et ici c'est possible.
    Il suffit de remarquer que 0.0625 est l'inverse de 16... et 16 c'est 2^4 soit 4 décalages tout simplement.
    Enfin, pas trop dans une seule journée.
    @+

  8. #38
    invite03481543

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    Pour terminer sur le sujet, tu verras que manipuler des floats (puisque tu seras obligé pour manipuler la valeur retournée) s'avèrera très lourd derrière en tâche de fond (en RAM et en temps de traitement).

    Si tu déclares 2 variables:

    Code:
    char signe;  // variable globale
    int temp_c; // variable locale à la fonction unsigned int read_int_temp()
    et que tu déclares simplement:

    Code:
    unsigned int read_int_temp()
    {
    unsigned int temp_c;
    
    if(datah >= 0x80) signe = 1;  // signe étant une variable globale elle sera récupérable dans tout le programme
    else signe = 0;
    
    temp_c = (datah << 8) + datal; // concaténation de datah et datal sur 16 bits
    temp_c = temp_c & 0x7FFF; // masque sur le 16eme bit
    
    temp_c = temp_c >> 4; // pour diviser par 2^4=16
    
    return(temp_c); // temp_c retrourne la valeur absolue de la température
    }
    A vérifier je n'ai pas testé, à priori ça doit fonctionner.
    Dernière modification par HULK28 ; 15/09/2016 à 11h04.

  9. #39
    ussmag

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    d'acoord merci beaucoup HULK pour ton aide je vais essayer ta fonction. merci encore une fois

Page 2 sur 2 PremièrePremière 2

Discussions similaires

  1. Petit Projet de Domotique (Capteur de Courant, Capteur de Température)
    Par invitef7bb6cd7 dans le forum Électronique
    Réponses: 3
    Dernier message: 20/05/2015, 11h46
  2. Problème capteur temperature base LM335
    Par Patrice68000 dans le forum Électronique
    Réponses: 10
    Dernier message: 01/04/2015, 21h26
  3. Réponses: 6
    Dernier message: 13/06/2012, 16h41
  4. Problème CAN PIC18F45K22
    Par denver60 dans le forum Électronique
    Réponses: 4
    Dernier message: 09/06/2012, 14h59
Découvrez nos comparatifs produits sur l'informatique et les technologies.