[Programmation] Probleme capteur de température ds1631 + PIC18F45K22
Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 39

Probleme capteur de température ds1631 + PIC18F45K22



  1. #1
    ussmag

    Probleme capteur de température ds1631 + PIC18F45K22


    ------

    Bonjour,

    j'essais de mettre en route un capteur de température en I2C avec un PIC18F45K22 (XC8, MPLAB V3.26) , mais je n'arrive pas à mesurer la température, sachant que simule le systeme sous Proteus.

    j'ai essayé une fonction pour detecter la présence du capteur sur le bus I2C, le capteur est bien présent mais la valeur mesurée est (-1634..) et ne change pas quand je chage la température du capteur. Pourrez-vous m'aider à trouver la boulette svp ? Merci D'avance.

    voici mon code
    Code:
    #include <pic18f45k22.h>
    #include <xc.h>
    #include"DS1631CHEK.h"
    // CONFIG1H
    #pragma config FOSC = HSMP      // Oscillator Selection bits (HS oscillator (medium power 4-16 MHz))
    #pragma config PLLCFG = OFF     // 4X PLL Enable (Oscillator used directly)
    #pragma config PRICLKEN = ON    // Primary clock enable bit (Primary clock is always enabled)
    #pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
    #pragma config IESO = OFF       // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)
    
    // CONFIG2L
    #pragma config PWRTEN = OFF     // Power-up Timer Enable bit (Power up timer disabled)
    #pragma config BOREN = SBORDIS  // Brown-out Reset Enable bits (Brown-out Reset enabled in hardware only (SBOREN is disabled))
    #pragma config BORV = 190       // Brown Out Reset Voltage bits (VBOR set to 1.90 V nominal)
    
    // CONFIG2H
    #pragma config WDTEN = ON       // Watchdog Timer Enable bits (WDT is always enabled. SWDTEN bit has no effect)
    #pragma config WDTPS = 32768    // Watchdog Timer Postscale Select bits (1:32768)
    
    // CONFIG3H
    #pragma config CCP2MX = PORTC1  // CCP2 MUX bit (CCP2 input/output is multiplexed with RC1)
    #pragma config PBADEN = OFF     // PORTB A/D Enable bit (PORTB<5:0> pins are configured as analog input channels on Reset)
    #pragma config CCP3MX = PORTB5  // P3A/CCP3 Mux bit (P3A/CCP3 input/output is multiplexed with RB5)
    #pragma config HFOFST = ON      // HFINTOSC Fast Start-up (HFINTOSC output and ready status are not delayed by the oscillator stable status)
    #pragma config T3CMX = PORTC0   // Timer3 Clock input mux bit (T3CKI is on RC0)
    #pragma config P2BMX = PORTD2   // ECCP2 B output mux bit (P2B is on RD2)
    #pragma config MCLRE = EXTMCLR  // MCLR Pin Enable bit (MCLR pin enabled, RE3 input pin disabled)
    
    // CONFIG4L
    #pragma config STVREN = ON      // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
    #pragma config LVP = ON         // Single-Supply ICSP Enable bit (Single-Supply ICSP enabled if MCLRE is also 1)
    #pragma config XINST = OFF      // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))
    
    // CONFIG5L
    #pragma config CP0 = OFF        // Code Protection Block 0 (Block 0 (000800-001FFFh) not code-protected)
    #pragma config CP1 = OFF        // Code Protection Block 1 (Block 1 (002000-003FFFh) not code-protected)
    #pragma config CP2 = OFF        // Code Protection Block 2 (Block 2 (004000-005FFFh) not code-protected)
    #pragma config CP3 = OFF        // Code Protection Block 3 (Block 3 (006000-007FFFh) not code-protected)
    
    // CONFIG5H
    #pragma config CPB = OFF        // Boot Block Code Protection bit (Boot block (000000-0007FFh) not code-protected)
    #pragma config CPD = OFF        // Data EEPROM Code Protection bit (Data EEPROM not code-protected)
    
    // CONFIG6L
    #pragma config WRT0 = OFF       // Write Protection Block 0 (Block 0 (000800-001FFFh) not write-protected)
    #pragma config WRT1 = OFF       // Write Protection Block 1 (Block 1 (002000-003FFFh) not write-protected)
    #pragma config WRT2 = OFF       // Write Protection Block 2 (Block 2 (004000-005FFFh) not write-protected)
    #pragma config WRT3 = OFF       // Write Protection Block 3 (Block 3 (006000-007FFFh) not write-protected)
    
    // CONFIG6H
    #pragma config WRTC = OFF       // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) not write-protected)
    #pragma config WRTB = OFF       // Boot Block Write Protection bit (Boot Block (000000-0007FFh) not write-protected)
    #pragma config WRTD = OFF       // Data EEPROM Write Protection bit (Data EEPROM not write-protected)
    
    // CONFIG7L
    #pragma config EBTR0 = OFF      // Table Read Protection Block 0 (Block 0 (000800-001FFFh) not protected from table reads executed in other blocks)
    #pragma config EBTR1 = OFF      // Table Read Protection Block 1 (Block 1 (002000-003FFFh) not protected from table reads executed in other blocks)
    #pragma config EBTR2 = OFF      // Table Read Protection Block 2 (Block 2 (004000-005FFFh) not protected from table reads executed in other blocks)
    #pragma config EBTR3 = OFF      // Table Read Protection Block 3 (Block 3 (006000-007FFFh) not protected from table reads executed in other blocks)
    
    // CONFIG7H
    #pragma config EBTRB = OFF      // Boot Block Table Read Protection bit (Boot Block (000000-0007FFh) not protected from table reads executed in other blocks)
    void i2c_Init(void){ 
     
        // Initialise I2C MSSP 
        // Master 100KHz 
        TRISDbits.TRISD0=1;             // set SCL and SDA pins as inputs 
        TRISDbits.TRISD1=1; 
        OpenI2C2(MASTER, SLEW_OFF);  // Initialize I2C module 
              SSP2ADD=0x13;     // 100khz = 8Mhz / ( ( 0x13+1) * 4 ) 
     } 
     
    void temp_config( char data) {
      
        
        StartI2C2();
        WriteI2C2(0x90);
        WriteI2C2(0xAC);
        WriteI2C2(data);
        IdleI2C2();
        StopI2C2();
     
     
        
        
    }
    void init_temp(){
    
        PORTDbits.RD0=1;
        PORTDbits.RD1=1;
         StartI2C2();
        WriteI2C2(0x90);
        WriteI2C2(0x51);
        StopI2C2();
        temp_config(0xc);
    
    
    }
    
    
    signed int read_int_temp(char Address){
      signed int  datah, datal;
       signed long data;
        StartI2C2();
        WriteI2C2(Address);
        WriteI2C2(0xAA);
        StartI2C2();
        WriteI2C2(0x91);
        
        datah=ReadI2C2();
        //datal=ReadI2C2();
        IdleI2C2();
        StopI2C2();
    
    
    data=(signed long)datah*100;
       data=data+(((datal >> 4 )*(long)50)/16);
       data=data*9;
       data = (data / 5) + 3200;
    
       return(data);
    
    /*if(datah>=0x80) datah = datah - 256;//if sign bit is set, then temp is negative    
       return(datah);*/
    
    
    }
    
    unsigned char Init_DS1631(unsigned char dev_address) // Returns 0xff on error , 0 on success 
         { 
              unsigned char Idata=0xc; // Config=12bit / 1shot 
              OpenI2C2(MASTER, SLEW_OFF);  // Initialize I2C module 
              SSP2ADD=19;     // 100khz = 8Mhz / ( ( 0x13+1) * 4 ) 
              IdleI2C2();  
              StartI2C2();     // Generate I2C2 start condition 
              IdleI2C2();  
              if(WriteI2C2(dev_address)!=0)    // 
               { 
               StopI2C2();      
               CloseI2C2(); 
               return 0xff;    // Error :no reaction from sensor 
              } 
          else  
               { 
               IdleI2C2(); 
               WriteI2C2(0xAC);   // Send config command 
               IdleI2C2(); 
               WriteI2C2(Idata);   // Send our configuration 
               IdleI2C2(); 
               StopI2C2();  
                 
    
               return 0;     // All went well  
               } 
         }
    void main(void) {
        
    float test;
        
    ANSELD=0;
              OSCCONbits.IRCF     =0b110;
              OSCCONbits.SCS      =0b01;
         //     OSCTUNEbits.PLLEN   =0b1;}
            i2c_Init();
        while(1) 
        {
            
                     
       init_temp();
        test=read_int_temp(0x90);
        
            
       // test= Init_DS1631(0x90);
        }
    
        
    }
    Nom : Capture.PNG
Affichages : 180
Taille : 34,2 Ko

    -----

  2. #2
    paulfjujo

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    bonjour,


    essi de mettre un delay apres l'adressage registre

    Code:
    void temp_config( char data)
     {
      
        StartI2C2();
        WriteI2C2(0x90);
        WriteI2C2(0xAC);
    Delay_ms(5);
        WriteI2C2(data);
        IdleI2C2();
        StopI2C2();
     }
    de meme, en mettre un peu partout ... quite à les reduire ou eliminer ensuite

    exemple mikroc
    j'ai eu un probleme particulié lié à la consigne du thermostat ... qui fait que j'ai laissé tomber Circuit (neuf) HS sic "vendeur" !
    pourtant la mesure était OK

    Code:
    void DS1631_read_temp()
    {
     // -67 a 257 °C
     I2C1_Start();
     I2C1_Wr(DS1631_ADR);
     I2C1_Wr(READ_TEMP);
     Delay_ms(5);
     I2C1_Repeated_Start();
     I2C1_Wr(DS1631_ADR+1);
     Delay_ms(5);
     dH=I2C1_Rd(1);
     Delay_ms(5);
     dL=I2C1_Rd(0);
     Delay_ms(5);
     // for calculus tests
     // dL=0x10;dH=0x19;
     I2C1_Stop();
     if (dH>127) Signe=1;
     dH=dH & 0x7F;
     // 25,0625°C
     //dH=0x19;
     //dL=0x10;
     //sprintf(txt,"Raw Temper DS1631 dH=%02X  dL=%02X \t",(int)dH,(int)dL);
     //UART1_Write_Text(txt);
    }

  3. #3
    invite03481543

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    Bonsoir,

    ici ça me semble suspect:

    Code:
    datah=ReadI2C2();
        //datal=ReadI2C2();
        IdleI2C2();
    1/Si tu mets datal en commentaire, ça marchera pas c'est sur.
    2/et que viens faire ici ce IdleI2C2();? Normalement c'est le maitre qui envoie un NACK.

    Cette fonction ReadI2C2() me semble tordue car normalement elle devrait faire apparaitre en argument la valeur 0 ou 1 (selon si c'est un ACK ou un NACK qui est prévu).

    Par exemple:
    Code:
    void Read_Temp(unsigned char Address)
    {
    I2CSendAddr(Address,WRITE); // control byte
    I2CSendByte(0x51); // command byte start conversion
    I2CSendStop(); // send stop
    I2CBitDly(); // wait
    I2CSendAddr(Address,WRITE); // control byte
    I2CSendByte(0xAA); // command byte read temp
    I2CSendAddr(Address,READ); // restart control byte and device address
    MSB = I2C_Read_Byte(0); // Temp MSB
    LSB = I2C_Read_Byte(1); // Temp LSB
    I2CSendStop(); // send stop
    // Calculate Temp
    if(MSB>=0x80) //if sign bit is set, then temp is negative
    temp_c = (float)((MSB<<8 + LSB) - 65536) * 0.0625;
    else
    temp_c = (float)(MSB<<8 + LSB) * 0.0625;
    temp_f =( temp_c * 9/5) + 32;
    Dernière modification par HULK28 ; 07/09/2016 à 23h59.

  4. #4
    ussmag

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    Bonjour, Merci pour vos réponses.

    HULK j'ai déjà utilisé ce code mais ca marche pas non plus (j'ai essayé le driver du fabricant aussi )....depuis ce matin après quelques modif j'ai eu un autre problème c'est que le programme ne sort jamais de IdleI2C2() .
    est ce que le problème vient du compilateur XC8 et que les fonctions que j'utilise ne font pas leu job... voilà les fonctions que j'utilise en détails

    Code:
    void init_temp(){
       
     I2CStart();
     i2c_Address(0x90,WRITE);
     i2c_Write (0x51);
     Tempo_ms(5);
      STopI2C();
       IdleI2C2();
     temp_config(0xc);
    
    }
    
    
    void temp_config(char Data){
    
     i2c_Address(0x90,WRITE);
     i2c_Write (0xAC);
     Tempo_ms(5);
     i2c_Write (Data);
      IdleI2C2();
      STopI2C();
    }
    
    signed int read_int_temp(char Address){ //read the high byte
      signed int  datah, datal;
      signed long data;
      
        I2CStart();
        i2c_Address(Address,WRITE);
        i2c_Write (0xAA);
        Tempo_ms(5);
        i2c_Address(Address,READ);
        datah=i2c_Read(1);
         Tempo_ms(5);
        datal=i2c_Read(0);
         STopI2C(); // send stop
    // Calculate Temp
    if(datah>=0x80){ //if sign bit is set, then temp is negative
                        temp_c = (float)((datah<<8 + LSB) - 65536) * 0.0625;
                   }
    else {
        
                temp_c = (float)(datah<<8 + datal) * 0.0625;
                temp_f =( temp_c * 9/5) + 32;
          }
     
       return(temp_c);
       
    }

    et voilà les fonctions qui permettent de lire et écrire (je les ai mis pour remplacer les fonctions qui existent dans I2C.h question d'essayer d'autres fonction quand ca na pas marché )


    Code:
    void i2c_Address(unsigned char address, unsigned char mode)
    {
    	unsigned char l_address;
    
    	l_address=address<<1;
    	l_address+=mode;
     	i2c_Wait();
     	SSP2BUF = l_address;
    }
    
    
    void i2c_Write(unsigned char data)
    {
     	i2c_Wait();
     	SSP2BUF = data;
    }
    
    
    
    void i2c_Wait(void){
        while ( ( SSP2CON2 & 0x1F ) || ( SSP2STAT & 0x04 ) );
     // IdleI2C2();
    
    
    void I2CStart() {
    
        StartI2C2();
    SSP2CON2bits.SEN=1;
    while(SSP2CON2bits.SEN);
    }
    
    void I2C_Init(void){
    
        OpenI2C2(MASTER, SLEW_OFF);
    	// Initialise I2C MSSP
    	// Master 100KHz
    	//TRISDbits.RD0=1;           	// set SCL and SDA pins as inputs
    	//TRISDbits.RD1=1;
       // SSP2CON1bits.SSPEN = 1;
    	//SSP2CON1 = 0b00101000; 	// I2C enabled, Master mode
    	//SSP2CON2 = 0x00;
        // I2C Master mode, clock = FOSC/(4 * (SSPADD + 1)) 
        SSP2ADD = 19;    		// 100Khz @ 8Mhz Fosc
    
    	//SSP2STAT = 0b10000000; 	// Slew rate disabled
    
    }

    le main :



    Code:
    void main(void) {
      
    
          
               OSCCON = 0b11101100;
              OSCCON2 = 0b00000111; // fréquence 
              I2C_Init();                                        
      
    
                             while(1)
                               {
                                  
                                 
                                  init_temp();
                              temperature=read_int_temp(0x90);
    }
    
    }



    Merci ;
    Dernière modification par ussmag ; 08/09/2016 à 09h04.

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

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    Tempo_ms(5) est à proscrire en I2C, le fait que le µC attende va faire avorter le dialogue.
    Ce sont les acteurs qui doivent cadencer le transfert (le maitre qui doit rester prioritaire et l'esclave).

    La fonction IdleI2C2 bloque car une condition ne permet pas de sortir, il faut toujours prévoir un timing out pour ne pas être bloquant et renvoyer un drapeau d'erreur si la fonction n'est pas sortie proprement.
    Je n'utilise pas XC8 qui est une vraie daube.
    Je vais regarder tes fonctions quand j'aurai un peu de temps.
    @+

  7. #6
    invite03481543

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    Tu ne devrais pas utiliser des nombres signés, non seulement ça ne sert à rien ici mais il faut bien vérifier que ce format ne sera pas bloquant quelque part.

  8. #7
    invite03481543

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    Le problème est que tu ne prends pas en compte ce que je t'écris:

    Code:
    signed int read_int_temp(char Address)
    { 
    //read the high byte
      signed int  datah, datal;
      signed long data;
    
          I2CStart();
        i2c_Address(Address,WRITE);
        i2c_Write (0xAA);
        Tempo_ms(5);
        i2c_Address(Address,READ);
        datah=i2c_Read(1);  // c'est l'inverse il faut mettre 0 en argument (ACK)
         Tempo_ms(5);         // à enlever (max 5µs)
        datal=i2c_Read(0);  // c'est l'inverse il faut mettre 1 en argument (NACK) ->voir mon exemple
         STopI2C(); // send stop
    // Calculate Temp
    if(datah>=0x80)
      {  //if sign bit is set, then temp is negative
                        temp_c = (float)((datah<<8 + LSB) - 65536) * 0.0625;
      }
    else 
      { 
      temp_c = (float)(datah<<8 + datal) * 0.0625;
      temp_f =( temp_c * 9/5) + 32; 
      }    return(temp_c);
    
    }
    Quand on développe un soft il faut y aller par étape, là tu mets tout et tu modifies sans rigueur de-ci de-là au petit bonheur la chance.
    Les copié-collé marchent à 0.0001% du temps si ce que tu développes n'est pas identique à 100% de ce que tu copies.
    Sur le net cette probabilité est même vraie quand tu copies à l'identique, c'est peu dire de la fiabilité de ce qu'on y trouve...
    Si tu n'as pas d'oscilloscope tu es aveugle sur ce qui se passe réellement sur ta carte et ta tache va donc nécessiter davantage de rigueur.
    Je te conseille d'utiliser des leds que tu allumeras lorsque telle ou telle fonction sera traitée avec succès en avançant pas à pas, au minimum ça te permettra de visualiser là où ça bloque.
    Au delà de ça, tu dois bien avoir compris comment l'I2C fonctionne, je te conseille de mettre les adresses R/W en dur pour le moment si tu n'as qu'un seul circuit I2C, histoire que déjà tu élimines des fonctions qui me paraissent peu fiables vu comment elles sont écrites.
    Et vire moi cette fonction de lecture avec des nombres signés, c'est une source d'erreur que tu dois éviter.

  9. #8
    ussmag

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    Bonjour HULK,

    j'ai essayé tout ce que t'as dis, et quand ca marche pas je modifie encore histoire d'essayer, j'ai débugué le programme en visualisant les signaux de la fonction read_temp tout fonctionne bien sauf la lecture de la temperature, ci-joint la fonction à jour + une image des signaux.

    Merci encore une fois pour le temps accordé.
    Code:
    signed int read_int_temp() { //read the high byte
       signed int  datah;
       unsigned long datal;
       float temp_c;
      
        StartI2C2();
         WriteI2C2(0x90);
         IdleI2C2();
        WriteI2C2(0x51); 
    
                          
        IdleI2C2();
           StopI2C2();
         //Delay1KTCYx( 20000);
          
        RestartI2C2();
         WriteI2C2(0x90);
         IdleI2C2();
        WriteI2C2(0xAA);
       // Delay1KTCYx( 20000);
        IdleI2C2();
        RestartI2C2();
        WriteI2C2(0x91);
        
        IdleI2C2();        
       // Delay1KTCYx( 2000000);
        datah=i2c_Read(0);
        AckI2C2();
       // Delay1KTCYx( 20000);
        datal=i2c_Read(1);
        IdleI2C2();
        StopI2C2();
         // Calculate Temp
    if(datah>=0x80) //if sign bit is set, then temp is negative
    temp_c = (float)((datah<<8 + datal) - 65536) * 0.0625;
    else
    temp_c = (float)(datah<<8 + datal) * 0.0625;
    //temp_f =( temp_c * 9/5) + 32;  
             return(temp_c);
    }Nom : Capture.PNG
    Affichages : 148
    Taille : 91,6 Ko

  10. #9
    ussmag

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    pour la fonction read je ne sais pas comment la ramplacé par une autre, les fonctions de la bibliotèque I2C.h ne prend pas en consédiration des arguments pour lire 2 bytes.

  11. #10
    invite03481543

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    Code:
    signed int read_int_temp() { //read the high byte
       signed int  datah;
       unsigned long datal;
       float temp_c;
      
        StartI2C2();
         WriteI2C2(0x90);
         IdleI2C2();
        WriteI2C2(0x51); 
    
                          
        IdleI2C2();
           StopI2C2(); // non! pas de stop ici.
         //Delay1KTCYx( 20000);
          
        RestartI2C2();
         WriteI2C2(0x90);
         IdleI2C2();
        WriteI2C2(0xAA);
       // Delay1KTCYx( 20000);
        IdleI2C2();
        RestartI2C2();
        WriteI2C2(0x91);
        
        IdleI2C2();        
       // Delay1KTCYx( 2000000);
        datah=i2c_Read(0);
        AckI2C2();
       // Delay1KTCYx( 20000);
        datal=i2c_Read(1);
        IdleI2C2();
        StopI2C2();
         // Calculate Temp
    if(datah>=0x80) //if sign bit is set, then temp is negative
    temp_c = (float)((datah<<8 + datal) - 65536) * 0.0625;
    else
    temp_c = (float)(datah<<8 + datal) * 0.0625;
    //temp_f =( temp_c * 9/5) + 32;  
             return(temp_c);
    }
    Tu retournes encore un signé , donc tu ne suis pas ce que je t'ai dit...

  12. #11
    Fantas-Pic

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    Bonjour,

    Pour faire une simulation sous proteus avec de l'I2C tu doit rajouté le debugger I2C .

    regarde ce lien : http://www.fantaspic.fr/memberlist.p...wprofile&u=199

  13. #12
    invite03481543

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    La meilleure simulation reste de loin la platine d'essai et la datasheet, le scope et le fer à souder surtout quand on débute.
    Une chose que le simulateur ne montrera pas ce sont les temps de montés et de descente des signaux, s'ils sont mauvais ça ne fonctionnera qu'en simulation, ce qui n'a strictement aucun intérêt.

  14. #13
    Fantas-Pic

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    La meilleure simulation reste de loin la platine d'essai et la datasheet, le scope et le fer à souder surtout quand on débute.
    Completement d'accord ! .

    Mais j'essaye de coller à sa problématique du #1.
    A moins que notre ami soit passer en mode "fer à souder"

    j'essais de mettre en route un capteur de température en I2C avec un PIC18F45K22 (XC8, MPLAB V3.26) , mais je n'arrive pas à mesurer la température, sachant que simule le systeme sous Proteus.

  15. #14
    ussmag

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    je suis tout a fait d'accord avec toi, la simule ce n'est pas la réalité mais ça aide a debuguer, j'ai enlevé le stopI2C selon ta remarque, mais ca marche pas, mais là au moins je sais d'ou vient le problème, si tu permets de regarder les signaux sur les images, après l'envoie de l'adresse au capteur ya le SCL qui passe à 0 et ça ce n'est pas du tout normal, je sais pas d'ou ca vient surtt j'utilise des fonction de la librairie de microship pour écrire.

  16. #15
    ussmag

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    je vais essayer de debugger sur un vrai circuit avec un fer a souder comme vous dites mais j'ai des doutes surtout que la forme d'ondes de SCL n'est pas correcte

  17. #16
    invite03481543

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    Le problème est que ton image est illisible, on ne devine que quelques octets quand ils sont par exemple à 0x90.
    Tu aurais fait une copie d'écran d'oscilloscope on aurait déjà résolu le problème.
    Ce qui aide à debugguer c'est de bien comprendre ce qu'on fait pas à pas, la simu est un faux ami quand on commence parce qu'elle te masque des choses cruciales en idéalisant par exemple les temps de montées et les temps inter-trames, ce qui en I2C est juste essentiel.
    Essaye de poster une image zoomée de chaque octet envoyé (SCL+SDA) histoire déjà de voir où ça pourrait être bloquant.

  18. #17
    invite03481543

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    Essaye avec ces changements:

    Code:
    signed int read_int_temp() { //read the high byte
       signed int  datah;
       unsigned long datal;
       float temp_c;
      
        StartI2C2();
         WriteI2C2(0x90);
         IdleI2C2();
        WriteI2C2(0xAA); 
    
                          
        IdleI2C2();  
          
        RestartI2C2();
         WriteI2C2(0x91); // il faut se mettre en lecture ici
         IdleI2C2();
        
        datah=i2c_Read(0);   
    
        datal=i2c_Read(1);
        IdleI2C2();
        StopI2C2();
         // Calculate Temp
    if(datah>=0x80) //if sign bit is set, then temp is negative
    temp_c = (float)((datah<<8 + datal) - 65536) * 0.0625;
    else
    temp_c = (float)(datah<<8 + datal) * 0.0625;
    //temp_f =( temp_c * 9/5) + 32;  
             return(temp_c);
    }

  19. #18
    invite03481543

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    Si tu n'as pas d'autres circuits I2C sur ta carte les Idle ne sont pas nécessaires, dans un premier temps tu peux les enlever.

  20. #19
    ussmag

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    c'est ce que je fais d'ailleurs, je fais la simule pas à pas pour voir chaque fonction et sa forme d'ondes. je commence a en avoir marre quoi
    je pense que mon problème vient de la fonction ReadI2C car sur la simule (ci-joint la photo ) montre bien que le capteur recois bien les commandes de configuration et startconversion, et dans le registre du capteur ya bien la valeur de la temperature, par contre ce que je ne comprends pas c'est que MSB contient la valeur 25°C et LSB =0 ca devrait etre le contraire non ?

    je vais mettre les formes d'ondes par la suite plus propre avec des zooms. (merci beaucoup pour votr aide )

    pour rappel voici la fonction readi2c que j'utilise:


    Code:
    unsigned char i2c_Read(unsigned char ack)
    {
    	// Read data from slave
    	// ack should be 1 if there is going to be more data read
    	// ack should be 0 if this is the last byte of data read
     	unsigned char i2cReadData;
     
     	IdleI2C2();
      //    SSP2CON2bits.RCEN = 1;           // Enable master for 1 byte reception
    
    	SSP2CON2bits.SEN=1;
        Wait_I2C();
     	//IdleI2C2();
     	i2cReadData = SSP2BUF;
       // IdleI2C2();
         
     	Wait_I2C();
     if ( ack )
        {
            
            SSP2CON2bits.ACKDT=0;	// Ack
    
        }		
    	else 
        {
            SSP2CON2bits.ACKDT=1 ;			// NAck
        }
        	     SSP2CON2bits.ACKEN=1; 
    
        // SSP2CON2bits.ACKEN=1;   		         // send acknowledge sequence
    	return( i2cReadData );
    }
    [Nom : SIMULE1.jpg
Affichages : 152
Taille : 134,7 Ko

  21. #20
    invite03481543

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    Tu déclares datal en signé et ta fonction read te retourne une valeur NON signée.
    Depuis le début je te dis de rester sur des valeurs non signées!

    Code:
    unsigned char i2c_read(char ack)
    {
        unsigned char temp;
    
        SSP2CON2bits.ACKDT = ack;
        PIR4bits.SSP2IF = 0;
        SSP2CON2bits.RCEN = 1;
        while(!PIR4bits.SSP2IF);
        temp = SSP2BUF;
        PIR4bits.SSP2IF = 0;
        SSP2CON2bits.ACKEN = 1;
        while(!PIR4bits.SSP2IF);
        return temp;
    }
    
    Ta fonction read est mal foutue, tu as des Idle, des Wait, des commentaires aux mauvais endroits, bref pas facile d'y voir bien clair dans tout ce charabia.
    Essaye avec cette fonction et les modifs précédentes que je t'ai posté.
    Reposte le code exact que tu essayes, sinon c'est pas facile à suivre.

  22. #21
    invite03481543

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    Elimine systématiquement tes Wait et Idle qu'on y voit plus clair, ça ne sert à rien.

  23. #22
    ussmag

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    Bonjour HULK,
    voilà le programme au propre, par contre la fonction que tu ma filé ne fonctionne pas non plus, le programme reste dans la boucle while de l'interruption et le Registre SSPBUF contient 0xFF. Merci

    Code:
    #include <p18cxxx.h>
    #include <i2c.h>
    #include <p18f45k22.h>
    #include  <delays.h>
    
    
    
    #pragma config FOSC=INTIO67     
    #pragma config LVP=OFF
     
    unsigned char i2c_Read(unsigned char ack)
    {
    	
    
       unsigned char temp;
    
        SSP2CON2bits.ACKDT = ack;
        PIR3bits.SSP2IF = 0;                          ==>PIR4 ne contient pas SSP2IF , il esr dans PIR3
        SSP2CON2bits.RCEN = 1;
       while(!PIR3bits.SSP2IF);
        temp = SSP2BUF;
        PIR3bits.SSP2IF = 0;
        SSP2CON2bits.ACKEN = 1;
       while(!PIR3bits.SSP2IF);                         LE PROGRAMME RESTE BLOQUE ICI 
        return temp;
    
    }
    
    
    
    void I2CBitDly(void) 
    { 
    unsigned int time_end = 8;
    unsigned int index;
    for (index = 0; index < time_end; index++);
    return;
    }
    
    void temp_config(char data) {
     
        StartI2C2();
        WriteI2C2(0x90);
        WriteI2C2(0xAC);
        WriteI2C2(data);
         StopI2C2();
         I2CBitDly();
     
    }
    
    
    void init_temp() {
         StartI2C2();
         WriteI2C2(0x90);
         WriteI2C2(0x51);
         StopI2C2();
         I2CBitDly();
    }
    
    signed int read_int_temp() { //read the high byte
       unsigned char  datah=0;
       unsigned char datal=0;
       float temp_c;
      
         StartI2C2();
         WriteI2C2(0x90);
          WriteI2C2(0xAA);
         WriteI2C2(0x91);
                datah=i2c_Read(0);
               datal==i2c_Read(1);
          StopI2C2();
         // Calculate Temp
    if(datah>=0x80) //if sign bit is set, then temp is negative
    temp_c = (float)((datah<<8 + datal) - 65536) * 0.0625;
    else
    temp_c = (float)(datah<<8 + datal) * 0.0625;
             return(temp_c);
    }
     void setupI2C(void)
     {
     	 	 	 	OpenI2C2(MASTER,SLEW_OFF);
     	SSP2ADD=19;
      	TRISDbits.TRISD0=1;
            TRISDbits.TRISD1=1;  // set up ports
     	SSP2CON1bits.CKP=1; 
    
     }
     
    
    void main(void) {
        float temp;
        ANSELD=0;
        ANSELC=0;
        ANSELA=0;
        ADCON1=0;
        
       
        TRISD = 0b11111111;
        OSCCON=0b01101100;         //internal ocsillateur 8Mhz
        OSCCON2=0x00;;
                                    setupI2C();
                                    temp_config(0x00);
                                     init_temp();
                                                       while(1)
                                                            {
                                                         PORTBbits.RB3=0;
                                                          LATBbits.LATB3=1;
    
                                                         temp=read_int_temp();
    
                                                                          }
    }

  24. #23
    ussmag

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    voilà une capture d'écran pendant la phase de débuguage



    debug.jpg
    Images attachées Images attachées  
    Dernière modification par ussmag ; 14/09/2016 à 09h32.

  25. #24
    invite03481543

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    Enlève le while qui bloque.

  26. #25
    ussmag

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    déjà fait, mais ca marche pas non plus le SSP2BUF contient toujours 0xFF

  27. #26
    invite03481543

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    Dans les 2 cas? datah et datal?

    Change 0xAA par 0xA1.

  28. #27
    ussmag

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    A1 ne change rien, oui dans les deux cas il contient 0xff ...je vais le maquetter pour voir si ca vient de la simule

  29. #28
    invite03481543

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    Il faut regarder la DS du circuit, peut-être un problème de config pour atteindre le registre température.

  30. #29
    ussmag

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    Bonjour HULK

    c'est bon ça marche. Javais pas l'acces à la memoire du capteur, il fallait rajouter un RESTART apres avoir envoyé 0xAA. par contre j'ai encore un problem avec la convertion elle me renvoie 0.
    Code:
    #include <p18cxxx.h>
    #include <i2c.h>
    #include <p18f45k22.h>
    #include  <delays.h>
    
    
    
    #pragma config FOSC=INTIO67    
    #pragma config LVP=OFF
     
    unsigned char i2c_Read(unsigned char ack)
    {
    	
    
    	// Read data from slave
    	// ack should be 1 if there is going to be more data read
    	// ack should be 0 if this is the last byte of data read
    
     
     
     unsigned char temp;
    
        SSP2CON2bits.ACKDT = ack;
       PIR3bits.SSP2IF = 0;
      SSP2CON2bits.RCEN = 1;
        
      while(!PIR3bits.SSP2IF);
        temp = SSP2BUF;
       PIR3bits.SSP2IF = 0;
        SSP2CON2bits.ACKEN = 1;
      while(!PIR3bits.SSP2IF);      //       <<<<<<=========    bloqué ici 
        return temp;
    
    }
    
    
    
    void I2CBitDly(void) 
    { 
    unsigned int time_end = 8;
    unsigned int index;
    for (index = 0; index < time_end; index++);
    return;
    }
    
    void temp_config(char data) {
     
        StartI2C2();
        WriteI2C2(0x90);
        WriteI2C2(0xAC);
        WriteI2C2(data);
         StopI2C2();
         I2CBitDly();
     
    }
    
    
    void init_temp() {
         StartI2C2();
         WriteI2C2(0x90);
         WriteI2C2(0x51);
         StopI2C2();
         I2CBitDly();
    }
    
    signed int read_int_temp() { //read the high byte
       unsigned char  datah=0;
       unsigned char datal=0;
       int temp_c;
      
        StartI2C2();
         WriteI2C2(0x90);
              WriteI2C2(0xAA);
         RestartI2C2();
         WriteI2C2(0x91);
                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);
    }
    }
     void setupI2C(void)
     {
     	 	 	 	OpenI2C2(MASTER,SLEW_OFF);
     	SSP2ADD=19;
      	TRISDbits.TRISD0=1;
        TRISDbits.TRISD1=1;  // set up ports
     	SSP2CON1bits.CKP=1; 
     
     }
     
    
    void main(void) {
        float temp;
        ANSELD=0;
        ANSELC=0;
        ANSELA=0;
        ADCON1=0;
        
        TRISE = 0;
        TRISD = 0b11111111;
        OSCCON=0b01101100;
        OSCCON2=0x00;;
                                    setupI2C();
                                    temp_config(0x00);
                                     init_temp();
                                                       while(1)
                                                            {
                                                         PORTEbits.RE2=0;
                                                          LATEbits.LATE2=1;
    
                                                         temp=read_int_temp();
    
                                                                          }
    }

  31. #30
    invite03481543

    Re : Probleme capteur de température ds1631 + PIC18F45K22

    Hello,

    le restart était présent dans mon post #17

    Quand tu dis je n'ai rien après conversion je présume que tu veux parler de ta fonction qui est sensée extraire la valeur des buffers dataH et dataL?
    Dernière modification par HULK28 ; 15/09/2016 à 09h14.

Page 1 sur 2 1 DernièreDernière

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, 10h46
  2. Problème capteur temperature base LM335
    Par Patrice68000 dans le forum Électronique
    Réponses: 10
    Dernier message: 01/04/2015, 20h26
  3. Réponses: 6
    Dernier message: 13/06/2012, 15h41
  4. Problème CAN PIC18F45K22
    Par denver60 dans le forum Électronique
    Réponses: 4
    Dernier message: 09/06/2012, 13h59
Découvrez nos comparatifs produits sur l'informatique et les technologies.