LM92 capteur temperature I2C
Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 31

LM92 capteur temperature I2C



  1. #1
    ELECINTER

    Question LM92 capteur temperature I2C


    ------

    Bonjour,

    J'ai un soucis avec la programmation.
    Je dois lire la température sur un capteur LM92 en I2C avec un oscilloscope.

    Avant tout j'ai fais un STAMP PIC 16F690
    Stamp 16F690.PNG

    Puis après j'ai relier un affichage 3x12 LCD I2C. Je n'ai pas eu beaucoup de problème à le faire fonctionner.
    Avec l'aide d'un driver (fichier de fonctions), j'ai afficher des choses sur les 3 lignes.
    schéma display.PNG

    Après ce petit projet, j'essaie de programmer afin que je puisse lire la température sur de l'I2C (SCL,SDA)
    LM92 temperature I2C.PNG

    Code:
                                                    WIZARD
    #include <16F690.h>
    #device adc=8
    
    #FUSES NOWDT                    //No Watch Dog Timer
    #FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
    #FUSES NOPUT                      //NO Power Up Timer
    #FUSES NOMCLR                   //Master Clear pin used for I/O
    #FUSES NOBROWNOUT               //No brownout reset
    
    #use delay(clock=8000000)
    
    #define LED PIN_C6
    #define FLAG_CTRL_1 PIN_B5
    
    #use i2c(Master,Slow,sda=PIN_B4,scl=PIN_B6)
    
    
    
    
                                       FICHIER.C
    
    // --------------------------------------------------------------------
    //                          Include Files                         
    // --------------------------------------------------------------------
    #include "Temperature_I2C.h"
    #include "Fonction.c"
    //---------------------------------------------------------------------
    //                          Definitions & byte                  
    //---------------------------------------------------------------------
    #byte OSCCON = 0x8F
    #define  TEMPERATURE_ADD  0b10010001   //0x91
    //---------------------------------------------------------------------
    //                           Variable Globale                        
    //---------------------------------------------------------------------
    
    //---------------------------------------------------------------------
    //                           Programme principal                     
    //---------------------------------------------------------------------
    
    
    void main()
    {
       setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
       setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128|RTCC_8_bit);      //32.7 ms overflow
       setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
       disable_interrupts(INT_TIMER0);
       enable_interrupts(GLOBAL);
       
       bit_set(OSCCON,4);
       bit_set(OSCCON,5);
       bit_set(OSCCON,6);
       
       delay_ms(100);       //time for LCD power-up (see datasheet)
       LCD_I2C_Config ();   //LCD configuration
       
       while(TRUE)
       {
         
          i2c_start(); //Start
          i2c_write(TEMPERATURE_ADD ); //Address and R/W
          //i2c_write(0b00000000);//temperature (Read only)
             i2c_write(0b01101000);
             i2c_read(0);
    
             i2c_write(0b01001000);
         // i2c_read(0) >> 8;
          //i2c_read(1);
    
    /*
          i2c_read()<<8; //Read first byte <<8
          i2c_read();*/
          i2c_stop(); //End
    
          delay_us(200);
          
       }
    
    }
    Pouvez m'aider au niveau de la programmation??
    l'Adresse du LM 92 est 0X91 10010 A0 A1 X X-> read/write A1 et A0 => GND
    donc 0b10010001

    J'ai regarder la datasheet du LM92, il y a 12 bits que je dois gérer ! mais avec l'I2C on peut que 8 bits, comment on fait pour ne pas avoir un ACK entre 2 i2c_read() ?

    -----

  2. #2
    invite03481543

    Re : LM92 capteur temperature I2C

    Bonjour,

    apparemment tout est décrit en terme de protocole à la page 13 de la datasheet.
    Le registre TEMPERATURE REGISTER est sur 16 bits donc il faut transférer les 2 octets en respectant ce protocole en p13.
    Puis à réception reconstituer la trame complète et extraire la température codée sur 13 bits et séparer les bits de status (D0~D2).
    Ce n'est pas ce qui est fait dans ton programme.

  3. #3
    invite03481543

    Re : LM92 capteur temperature I2C

    Une piste non testée:

    Code:
    void LM92_RD_TEMP()  { 
        i2c_start(); // debut
        i2c_write(LM92_WR); // adresse du LM92 en écriture
        i2c_write(LM92_TEMP_PTR); //adresse du registre pointer
        i2c_start(); // re-start
        i2c_write(LM92_RD); // adresse du LM92 en lecture
        temp.msb = i2c_read(1); // stockage du msb temperature +ACK
        temp.lsb = i2c_read(0); // stockage du Lsb sans ACK 
        i2c_stop(); // fin
    }
    Il te faut évidemment créer les variables auparavant dans un struct par exemple (temp.msb,...)

    ensuite tu reconstitue la trame complète en extrayant l'info temp.
    @+
    Dernière modification par HULK28 ; 01/12/2011 à 11h06.

  4. #4
    invite03481543

    Re : LM92 capteur temperature I2C

    Citation Envoyé par RanaINTER Voir le message

    Pouvez m'aider au niveau de la programmation??
    l'Adresse du LM 92 est 0X91 10010 A0 A1 X X-> read/write A1 et A0 => GND
    donc 0b10010001
    Ajoute ça aussi c'est plus clair:
    Code:
    #define LM92_RD    0x91  // lm92 addresse de lecture 
    #define LM92_WR    0x90  // lm92 addresse d'écriture
    #define LM92_TEMP_PTR  0x00 //adresse du registre pointer

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

    Exclamation Re : LM92 capteur temperature I2C

    Merci beaucoup, votre explication m'a vraiment aider.
    Je comprend mieux maintenant. J'avais des doutes avec les bits...

  7. #6
    ELECINTER

    Re : LM92 capteur temperature I2C

    Pourquoi je dois déclarer par exemple temp_msb,... dans une fonction struct ?
    ça sert à quoi?

    Ci dessous en souligné j'ai essayé de lire la température.

    Code:
    //---------------------------------------------------------------------
    //                          Definitions & byte                  
    //---------------------------------------------------------------------
    #byte OSCCON = 0x8F
    
    #define LM92_RD    0x91  // lm92 addresse de lecture 
    #define LM92_WR    0x90  // lm92 addresse d'écriture
    #define LM92_TEMP_PTR  0x00 //adresse du registre pointer
    //---------------------------------------------------------------------
    //                           Variable Globale                        
    //---------------------------------------------------------------------
    int temp_msb , temp_lsb;
    signed long val;
    
    //---------------------------------------------------------------------
    //                           Fonction                       
    //---------------------------------------------------------------------
    
    void LM92_RD_TEMP()  
    {
        i2c_start(); // debut
        i2c_write(LM92_WR); // adresse du LM92 en écriture
        i2c_write(LM92_TEMP_PTR); //adresse du registre pointer
        i2c_start(); // re-start
        i2c_write(LM92_RD); // adresse du LM92 en lecture
        temp_msb = i2c_read(1); // stockage du msb temperature +ACK
        temp_lsb = i2c_read(0); // stockage du Lsb sans ACK 
        i2c_stop(); // fin 
    }
    //---------------------------------------------------------------------
    //                           Programme principal                     
    //---------------------------------------------------------------------
    
    void main()
    {
       setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
       setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128|RTCC_8_bit);      //32.7 ms overflow
       setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
       disable_interrupts(INT_TIMER0);
       enable_interrupts(GLOBAL);
       
       bit_set(OSCCON,4);
       bit_set(OSCCON,5);
       bit_set(OSCCON,6);
       
       delay_ms(100);
       
       while(TRUE)
       {  
         LM92_RD_TEMP();
    
         val=temp_msb;  
         val=val<<8; 
         val+=(temp_lsb&0b11111000); 
         val=val>>3; 
         val=(val&0b0001111111111111); 
        
         val = val * 0.0625;      
          
         i2c_start(); // debut
         i2c_write(LM92_WR); // adresse du LM92 en écriture
         i2c_write(LM92_TEMP_PTR); //adresse du registre pointer
         i2c_write(LM92_RD); // adresse du LM92 en lecture      
         i2c_read(val);    
         i2c_stop(); // fin
               
       }
    }

  8. #7
    ELECINTER

    Re : LM92 capteur temperature I2C

    Code:
    LM92_RD_TEMP();
    
         val=temp_msb;
         val=val<<8;//prendre les premiers 8 bits
         val+=(temp_lsb&0b11111000);//faire un masque sans utilisé les 3 premiers bits
         val=val>>3;// enlever les 3 premiers bits
         val=(val&0b0001111111111111);//utilisé 13 bits
        
         val = val * 0.0625;
          
          
         i2c_start(); // debut
         i2c_write(LM92_WR); // adresse du LM92 en écriture
         i2c_write(LM92_TEMP_PTR); //adresse du registre pointer
         i2c_write(LM92_RD); // adresse du LM92 en lecture      
         i2c_read(val);       
         i2c_stop(); // fin
               
       }

  9. #8
    invite03481543

    Re : LM92 capteur temperature I2C

    Ta manière de concaténer m'étonne un peu.
    Code:
    val=(val&0b0001111111111111);//utilisé 13 bits
    ne me semble pas utile.
    Qu'obtiens-tu comme résultat?

  10. #9
    ELECINTER

    Question Re : LM92 capteur temperature I2C

    Je n'arrive pas à dire le résultat, car à chaque fois que je fais read_i2C(); j'obtiens toujours FFA!
    Si je ne mets
    Code:
    temp_msb = i2c_read(1); // stockage du msb temperature +ACK
    temp_lsb = i2c_read(0); // stockage du Lsb sans ACK
    j'obtiens FFA et FF~A.

    Pourquoi je reçois toujours FF ? Est-ce normal?

  11. #10
    ELECINTER

    Re : LM92 capteur temperature I2C

    même si je connecte rien du tout je reçois toujours FFA

  12. #11
    ELECINTER

    Re : LM92 capteur temperature I2C

    les températures et les bits


    +25°C ---->0 0000 1001 0000 = 400
    +10°C ---->0 0000 1010 0000 = 160
    +2°C ---->0 0000 0010 0000 = 32
    +0.0625°C ---->0 0000 0000 0001 = 1
    0°C ---->0 0000 0000 0000 = 0
    température = 0.0625 * somme des bits
    somme des bits = température / 0.0625

    Alors on peut lire 8 bits dans une trame, donc je dois transformé 13 bits en 8 bits...

  13. #12
    ELECINTER

    Question Re : LM92 capteur temperature I2C

    Est-ce juste, cela sépare bien les bits?

    Code:
         val = temp_msb;
         val = val<<8;//prendre les premiers 8 bits
         val = val +(temp_lsb&0b11111000);//faire un masque sans utilisé les 3 premiers bits
         val = val>>3;// enlever les 3 premiers bits
         
         val = val * 0.0625;

  14. #13
    invite03481543

    Re : LM92 capteur temperature I2C

    Il y a des choses qui ne vont pas dans ton programme.
    Tu as une fonction qui lit le capteur, puis tu récupères val et ensuite tu relances une lecture aussitôt, je vois pas bien l'intérêt d'écrire ça comme ça.
    De plus tu utilises val en la déclarant en signed long , alors qu'un unsigned int te suffit.
    Il faut que tu récupères le bit de signe et qu'il soit donc extrait de val.

    Quand j'aurai 5mn je te posterai comment je vois le truc.
    Dernière modification par HULK28 ; 06/12/2011 à 12h59.

  15. #14
    ELECINTER

    Re : LM92 capteur temperature I2C

    merci d'avance

  16. #15
    ELECINTER

    Question Re : LM92 capteur temperature I2C

    à chaque fois que je fais read_i2C(); j'obtiens toujours FFA!

  17. #16
    ELECINTER

    Question Re : LM92 capteur temperature I2C

    Pourquoi?
    comment on lit à une adresse comme le LM92 ?


    Code:
    void LM92_RD_TEMP()  
    {
        i2c_start();              // debut
        i2c_write(LM92_WR);       // adresse du LM92 en écriture
        i2c_write(LM92_TEMP_PTR); // adresse du registre pointer
        //i2c_start();              // re-start
        i2c_write(LM92_RD);       // adresse du LM92 en lecture
        temp_msb = i2c_read(1);   // stockage du msb temperature +ACK
        temp_lsb = i2c_read(0);   // stockage du Lsb sans ACK 
        i2c_stop();               // fin 
    }
    Et-ce juste?

  18. #17
    ELECINTER

    Lightbulb Re : LM92 capteur temperature I2C

    Salut,

    Voici mon programme, il y a encore une erreur de température.
    Mon programme semble fonctionner sauf quand la température change, la lecture de température de temp_msb , temp_lsb ne changue jamais ! Cela m'a changé qu'une seul fois.

    Quelqu'un a une idée?





    Code:
    //---------------------------------------------------------------------
    //                          Definitions & byte                  
    //---------------------------------------------------------------------
    #byte OSCCON = 0x8F                       // OSCILLATOR CONTROL REGISTER
    
    #define ADDRESS_LM92_READ              0x91     // lm92 addresse de lecture 
    #define ADDRESS_LM92_WRITE             0x90     // lm92 addresse d'écriture
    #define SET_POINTER_REGISTER_TEMP      0x00     // adresse du pointeur register Temperature (Read only)
    #define SET_POINTER_REGISTER_CONFIG    0x01     // adresse du pointeur register Configuration(Read/Write)
    #define CONFIGURATION_STD              0x00     // configuration
    
    //---------------------------------------------------------------------
    //                           Variable Globale                        
    //---------------------------------------------------------------------
    int temp_msb , temp_lsb;
    //int val;
    
    //---------------------------------------------------------------------
    //                           Fonctions                       
    //---------------------------------------------------------------------
    
    // Fonction configuration
    void write_in_configuration_register(int config)
    {        
        i2c_start();                                // start
        i2c_write(ADDRESS_LM92_WRITE);              // adresse du LM92 en écriture
        i2c_write(SET_POINTER_REGISTER_CONFIG);     // pointeur register Configuration(Read/Write)
        i2c_write(config);                          // configuration 
        i2c_stop();                                 // stop
        
    }
    
    // Fonction lire température 
    void read_temp()  
    {        // Datasheet page 13
        i2c_start(); 
        i2c_write(ADDRESS_LM92_WRITE );       // adresse du LM92 en écriture
        i2c_write(SET_POINTER_REGISTER_TEMP); //  pointeur register Temperature (Read only)
        i2c_stop();
       
        output_high(FLAG_CTRL_1);
        i2c_start();                          // repeat-start
        i2c_write(ADDRESS_LM92_READ);         // adresse du LM92 en lecture 
        temp_msb = i2c_read(1);               // stockage du msb temperature +ACK  
        temp_lsb = i2c_read(0);               // stockage du Lsb sans ACK  
        i2c_stop();                           // stop
        output_low(FLAG_CTRL_1);
    }
    //---------------------------------------------------------------------
    //                           Programme principal                     
    //---------------------------------------------------------------------
    
    void main()
    {
       setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
       setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128|RTCC_8_bit);      //32.7 ms overflow
       setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
       
       disable_interrupts(GLOBAL);
       
       //Internal Oscillator Frequency Select bit 6-4 -> 111 => 8MHz
       bit_set(OSCCON,4);
       bit_set(OSCCON,5);
       bit_set(OSCCON,6);
    
       delay_ms(100);
    
       write_in_configuration_register(CONFIGURATION_STD);  //appel à la fonction en fonction de CONFIGURATION_STD
       
       while(TRUE)
       {       
          write_in_configuration_register(CONFIGURATION_STD);  
          delay_us(50);
          read_temp();
          delay_ms(1);
       } 
    }

  19. #18
    invite03481543

    Re : LM92 capteur temperature I2C

    Si tu n'as besoin que de lire la température il n'est pas nécessaire d'initialiser le pointer register, car il est pointé par défaut donc en read temp d'office.

    Par contre si tu l'initialises tu t'y prend mal car tu dois nécessairement (comme tout registre pointeur en I2C) refaire un restart après avoir adressé un registre interne pour l'utiliser.

    Code:
    //---------------------------------------------------------------------
    //                          Definitions & byte                  
    //---------------------------------------------------------------------
    #byte OSCCON = 0x8F                       // OSCILLATOR CONTROL REGISTER
    
    #define ADDRESS_LM92_READ              0x91     // lm92 addresse de lecture 
    #define ADDRESS_LM92_WRITE             0x90     // lm92 addresse d'écriture
    #define SET_POINTER_REGISTER_TEMP      0x00     // adresse du pointeur register Temperature (Read only)
    #define SET_POINTER_REGISTER_CONFIG    0x01     // adresse du pointeur register Configuration(Read/Write)
    #define CONFIGURATION_STD              0x00     // configuration
    
    //---------------------------------------------------------------------
    //                           Variable Globale      (mauvaise habitude !)                  
    //---------------------------------------------------------------------
    int temp_msb , temp_lsb;
    //int val;
    
    //---------------------------------------------------------------------
    //                           Fonctions                       
    //---------------------------------------------------------------------
    
    unsigned int LM92_read_register(unsigned char LM92_reg)
    {
     unsigned int LM92_temp_data=0; // variable locale -> bien meilleure habitude...
     
    
     while (I2C_Is_Idle() == 0) ;  // on attend que le bus soit libre
     I2c_start();
     while (i2c_Is_Idle() == 0) ;
     I2c_Wr(ADDRESS_LM92_WRITE);       // adresse en écriture du LM92
     while (i2c_Is_Idle() == 0) ;
     I2c_Wr(LM92_reg);             // registre à atteindre (par exemple: SET_POINTER_REGISTER_TEMP)
     while (I2C_Is_Idle() == 0) ;
     I2C_Repeated_Start();         // on relance un start         
     while (i2c_Is_Idle() == 0) ;
     I2c_Wr(ADDRESS_LM92_READ);       // adresse du LM92 en lecture (pointé cette fois sur SET_POINTER_REGISTER_TEMP par exemple)
     while (I2C_Is_Idle() == 0) ;
     LM92_temp_data = I2C_Rd(1);   // lecture du premier octet (MSB) avec ACK
     LM92_temp_data << 8;
     LM92_temp_data += I2C_Rd(0);   // lecture du 2eme octet (LSB) sans ACK
     while (I2C_Is_Idle() == 0) ;
    
     asm nop;
     I2c_stop();
     return(LM92_temp_data);
    }
    
    
    //---------------------------------------------------------------------
    //                           Programme principal                     
    //---------------------------------------------------------------------
    
    void main()
    {
    unsigned int temp=0; // variable locale encore
    
       setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
       setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128|RTCC_8_bit);      //32.7 ms overflow
       setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
       
       disable_interrupts(GLOBAL);
       
       //Internal Oscillator Frequency Select bit 6-4 -> 111 => 8MHz
       bit_set(OSCCON,4);
       bit_set(OSCCON,5);
       bit_set(OSCCON,6);
    
          
       while(TRUE)
       {       
          temp = LM92_read_register(SET_POINTER_REGISTER_TEMP);
          delay_ms(200);
           
       } 
    }


    J'ai rien testé et regardé vite fait la doc donc...
    Il faut commencer par surveiller la variable temp, tant que tu n'auras rien dedans qui bouge inutile d'aller plus loin.
    On fera un masque ensuite pour les 3 bits à gicler et formater mieux tout ça.
    J'ai pas vérifié tes config d'oscillateur non plus, je suppose que tu l'as fait
    Il faudrait faire une maquette et ajouter des leds pour le debuggage, c'est toujours préférable et plus efficace pour avancer vite.
    @+
    Dernière modification par HULK28 ; 08/12/2011 à 14h09.

  20. #19
    ELECINTER

    Question Re : LM92 capteur temperature I2C

    Est-ce nécessaire d'utilisé I2C_Is_Idle() ??

    Je ne connais pas I2C_Is_Idle() , Il n'y a pas sur mon compilateur PICC COMPILER! Mais je pense que c'est égal à i2c_isr_state( ) , je vais essayé de traduire ceci dans mon index !

    J'ai tout vérifier, il y a seulement un programme à la lecture des 2 I2C_Read();

    Ce qui concerne le déclaration je n'ai pas appris comme ça! J'ai appris à faire comme ce qui est dans mon programme. Surement que tes conseils sont meilleurs.

  21. #20
    invite03481543

    Re : LM92 capteur temperature I2C

    Savoir si le bus est libre est nécessaire mais dans l'immédiat tu peux t'en passer ça ne devrait pas être bloquant dans ton cas.
    Si tu as un scope ça serait bien de le brancher sur ton bus pour voir si quelque chose sort du tuyau.

  22. #21
    ELECINTER

    Re : LM92 capteur temperature I2C

    Je te redirais si j'arrive à avancer, j'ai pas trop le temps en fin de semaine.

    Pour l'oscilloscope, j'ai tout contrôler le bus, Il y a effectivement bien le transfert I2C! Exactement comme mon code, sauf pour mon lire la température qui reste constant, mais surement il y a p-t une configuration ou autre à faire.

    Merci beaucoup.

    Quand j'aurais finis je posterai tout mon projet sur cette discussion! Une première en I2C

  23. #22
    ELECINTER

    Question Re : LM92 capteur temperature I2C

    J'avais fait des variables dans des STUCT mais ça me donnait cela me changeait pas le fonctionnement du code.
    J'ai lu le Manufacurer's identification Register. Je tourve 0x80 et 0x01 donc c'est correct.

    Mais je ne comprend pas pourquoi ma température ne change pas !!

    A chaque fois que je compiles le programme, c'est que la que ça change.


    A l'aide de l'oscillo je trouve dans le code ci-dessous les valeurs suivantes:
    0x90WA 0x00 0x91RA 0x0D 0x08

    quand je place mon doigt devant le LM:
    0x90WA 0x00 0x91RA 0x0B 0xC0


    Code:
    // Fonction lire température 
    void read_temp()  
    {        // Datasheet page 13
        i2c_start(); 
        i2c_write(ADDRESS_LM92_WRITE );       // adresse du LM92 en écriture
        i2c_write(SET_POINTER_REGISTER_TEMP); //  pointeur register Temperature (Read only)  
        i2c_stop();  
      
        i2c_start();                          // repeat-start
        i2c_write(ADDRESS_LM92_READ);         // adresse du LM92 en lecture  
        temp_msb = i2c_read(1);               // stockage du msb temperature +ACK  
        temp_lsb = i2c_read(0);               // stockage du Lsb sans ACK  
        i2c_stop();                           // stop
    }
    Code:
    //---------------------------------------------------------------------
    //                          Definitions & byte                  
    //---------------------------------------------------------------------
    #byte OSCCON = 0x8F                       // OSCILLATOR CONTROL REGISTER
    
    #define ADDRESS_LM92_READ              0x91     // lm92 addresse de lecture 
    #define ADDRESS_LM92_WRITE             0x90     // lm92 addresse d'écriture
    #define SET_POINTER_REGISTER_TEMP      0x00     // adresse du pointeur register Temperature (Read only)
    #define SET_POINTER_REGISTER_CONFIG    0x01     // adresse du pointeur register Configuration(Read/Write)
    #define CONFIGURATION_STD              0x00     // configuration
    #define lm92_manufacturer_id           0x07     // ID manufacturer
    //---------------------------------------------------------------------
    //                           Variable Globale                        
    //---------------------------------------------------------------------
    int temp_msb , temp_lsb;
    int Manufacturer_ID_msb, Manufacturer_ID_lsb;
    //int val;
    
    //---------------------------------------------------------------------
    //                           Fonctions                       
    //---------------------------------------------------------------------
    
    // Fonction configuration
    void write_in_configuration_register(int config)
    {        
        i2c_start();                                // start
        i2c_write(ADDRESS_LM92_WRITE);              // adresse du LM92 en écriture
        i2c_write(SET_POINTER_REGISTER_CONFIG);     // pointeur register Configuration(Read/Write)
        i2c_write(config);                          // configuration 
        i2c_stop();                                 // stop  
    }
    
    // Fonction lire température 
    void read_temp()  
    {        // Datasheet page 13
        i2c_start(); 
        i2c_write(ADDRESS_LM92_WRITE );       // adresse du LM92 en écriture
        i2c_write(SET_POINTER_REGISTER_TEMP); //  pointeur register Temperature (Read only)
        
        i2c_stop();
       
        output_high(FLAG_CTRL_1);
        
        i2c_start();                          // repeat-start
        i2c_write(ADDRESS_LM92_READ);         // adresse du LM92 en lecture  
    
        temp_msb = i2c_read(1);               // stockage du msb temperature +ACK  
        temp_lsb = i2c_read(0);               // stockage du Lsb sans ACK  
       
        i2c_stop();                           // stop
        
        output_low(FLAG_CTRL_1);
    }
    void lm92_read_manufacturer_ID()  
    {
        i2c_start(); 
        i2c_write(ADDRESS_LM92_WRITE); 
        i2c_write(lm92_manufacturer_id); 
        i2c_start(); 
        i2c_write(ADDRESS_LM92_READ); 
        Manufacturer_ID_msb = i2c_read(1); // ack 
        Manufacturer_ID_lsb = i2c_read(0); // no ack 
        i2c_stop(); 
    } 
    //---------------------------------------------------------------------
    //                           Programme principal                     
    //---------------------------------------------------------------------
    
    void main()
    {
       setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
       setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128|RTCC_8_bit);      //32.7 ms overflow
       setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
       
       //Internal Oscillator Frequency Select bit 6-4 -> 111 => 8MHz
       bit_set(OSCCON,4);
       bit_set(OSCCON,5);
       bit_set(OSCCON,6);
    
       delay_ms(100);
    
       write_in_configuration_register(CONFIGURATION_STD);  //appel à la fonction en fonction de CONFIGURATION_STD
       
       while(TRUE)
       {       
          write_in_configuration_register(CONFIGURATION_STD);
          delay_us(10);
          lm92_read_manufacturer_ID();
          delay_us(10);
          read_temp();
          delay_ms(1);     
       } 
    }

  24. #23
    invite03481543

    Re : LM92 capteur temperature I2C

    Peux-tu poster ton schéma exact stp?

  25. #24
    invite03481543

    Re : LM92 capteur temperature I2C

    Le problème c'est que tu ne tiens aucun compte de ce que je t'écris, si tu relis ton prog il n'a rien à voir avec ce que je t'ai écrit avant....
    On avancera pas à ce rythme.

  26. #25
    ELECINTER

    Exclamation Re : LM92 capteur temperature I2C

    Salut,

    Voici ce que je trouve sur mon oscillo.

    Nom : Photo104.jpg
Affichages : 115
Taille : 134,2 Ko

    Pour la programmation j'ai fait comme tu me l'as dis, mais while (I2C_Is_Idle() == 0) ; il n'y a pas dans mon compilateur.

  27. #26
    ELECINTER

    Re : LM92 capteur temperature I2C

    concernant les schémas, ils se trouvent au début de la discussion, (1er message)

  28. #27
    invite03481543

    Re : LM92 capteur temperature I2C

    Pour la programmation j'ai fait comme tu me l'as dis
    Ben non:

    Code:
    void read_temp()   {
    i2c_start();
    i2c_write(ADDRESS_LM92_WRITE );       // adresse du LM92 en écriture
    i2c_write(SET_POINTER_REGISTER_TEMP); //  pointeur register Temperature (Read only)
    i2c_stop(); // Qu'est-ce que ça fout là !
    output_high(FLAG_CTRL_1); // Et ça?
    i2c_start();                          // repeat-start
    i2c_write(ADDRESS_LM92_READ);         // adresse du LM92 en lecture
    temp_msb = i2c_read(1);               // stockage du msb temperature +ACK
    temp_lsb = i2c_read(0);               // stockage du Lsb sans ACK
    i2c_stop();                           // stop
    output_low(FLAG_CTRL_1); // Et ça?
    }
    Dernière modification par HULK28 ; 13/12/2011 à 08h13.

  29. #28
    invite03481543

    Re : LM92 capteur temperature I2C

    Code:
    while(TRUE)    {
    write_in_configuration_register(CONFIGURATION_STD); doit être appelée UNE SEULE FOIS avant le while
    delay_us(10); inutile !!
    lm92_read_manufacturer_ID();
    delay_us(10); inutile
    read_temp();       delay_ms(1);  insuffisant, inutile de mesurer la température toute les ms... mettre 100ms minimum       }
    @+

  30. #29
    invite03481543

    Re : LM92 capteur temperature I2C

    Quand ça fonctionnera, il faudra utiliser une interruption pour déclencher la lecture de la température, une fois par seconde me parait largement suffisant, mais faire un Delay de 1s n'est pas envisageable, en tout cas on ne procède jamais comme ça en bloquant l'appli sur une boucle de temps.
    En régle générale l'usage de Delay() est une mauvaise habitude, même si elle semble pratique.

  31. #30
    invite03481543

    Re : LM92 capteur temperature I2C

    Citation Envoyé par RanaINTER Voir le message
    mais while (I2C_Is_Idle() == 0) ; il n'y a pas dans mon compilateur.
    Il suffit de créer ce test:

    Code:
    asm{
    
    ; Routine I2C Idle
    
    I2C_idle	
    	bank1
    I2C_idle0
    	btfsc SSPCON2 , ACKEN
    	goto I2C_idle0 ; le bit ACKEN n'est pas nul	on recommence le test depuis le début
    	btfsc SSPCON2 , RCEN
    	goto I2C_idle0 ; le bit RCEN n'est pas nul	on recommence le test depuis le début
    	btfsc SSPCON2 , PEN
    	goto I2C_idle0 ; le bit PEN n'est pas nul	on recommence le test depuis le début
    	btfsc SSPCON2 , RSEN
    	goto I2C_idle0 ; le bit RSEN n'est pas nul	on recommence le test depuis le début
    	btfsc SSPCON2 , SEN
    	goto I2C_idle0 ; le bit SEN n'est pas nul	on recommence le test depuis le début
    	btfsc SSPSTAT , R_W
    	goto I2C_idle0 ; le bit R_W n'est pas nul      on recommence le test depuis le début
    	bank0
    	return
    end
    }
    A voir avec ton compilateur C pour la syntaxe d'insertion d'une routine assembleur.
    Pour le moment comme je te l'avais dit plus haut tu peux te passer de faire ce test, MAIS il faut avoir à l'esprit que là encore ce n'est pas une bonne habitude à prendre que de ne pas le faire, car si un jour tu as d'autres périphériques sur ton bus tu auras inévitablement des problèmes...
    Dernière modification par HULK28 ; 13/12/2011 à 08h53.

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. Mes capteurs de température en I2C ne fonctionnent plus ...
    Par invite3570b5f7 dans le forum Électronique
    Réponses: 8
    Dernier message: 03/09/2011, 14h57
  2. Thermomètre LM92
    Par invited6fe8dd5 dans le forum Électronique
    Réponses: 2
    Dernier message: 07/02/2011, 19h54
  3. Capteur de température
    Par invite6abefa4f dans le forum Électronique
    Réponses: 4
    Dernier message: 20/11/2010, 11h12
  4. Sonde de température et PIC en I2C
    Par blacksword dans le forum Électronique
    Réponses: 8
    Dernier message: 08/12/2009, 23h26
  5. horloge + temperature I2C afficheur 7 segment
    Par invited02d59f3 dans le forum Électronique
    Réponses: 20
    Dernier message: 23/06/2009, 10h44
Découvrez nos comparatifs produits sur l'informatique et les technologies.