ds18b20 toujours 0°c
Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

ds18b20 toujours 0°c



  1. #1
    sinatra

    ds18b20 toujours 0°c


    ------

    salut,

    jai trouver un code sur ce forum pour le ds1820 le voici ds1wire.c
    Code:
    //////////////////////////////////////////////////////////////////////
    //                                           J.Oinonen 2005-09-29   //
    //                                                                  //
    //                                                                  //
    // Dallas 1 wire routines interfacing with the DS1820 temperature   //
    // sensor.                                                          //
    //                                                                  //
    // Possible future improvements:                                    //
    // -One universal delay routine. (to get rid of all do while        // 
    //  statements)                                                     //
    // -Support for multiple sensors (currently only one allowed)       //
    // -Support for sensor addressing                                   //
    //                                                                  //
    // Compiles with B. Knudsen CC5X(Trial version/without optimization)//
    // Timings are critical!                                            //
    //////////////////////////////////////////////////////////////////////
    
    
    #define DQ_TRI TRISA.0		//Tristate register of  DQ pin
    #define DQ_PIN  PORTA.0		//Pin connected to DQ on DS1820
    
    //////////////////////////////////////////////////////////////////////
    // Main delay routine. Delays the uprocessor for 5 us.              //
    //    2   +   1  +    2   = 5                                       //
    //   GOTO +  NOP + RETURN = 5us                                     //
    //////////////////////////////////////////////////////////////////////
    
    void Delay5us()  
    {
    	nop();
    }
    
    /*void delay( char millisec)
    {
    do{
    	char t=200;
    	do
    	{
    		Delay5us();
    	}while(--t);
    }
    while(--millisec);
    
    }
    */
    
    //////////////////////////////////////////////////////////////////////
    // This function Resets the 1 wire bus and checks for presence of a //
    // 1 Wire device. If no device is detected, Led on Portb.2 is lit   //
    //////////////////////////////////////////////////////////////////////
    
    void Reset(void)
    {
     char count;
     bit  present;
     DQ_TRI=1;			// Set the Correct port pin settings
     DQ_PIN=0;
    
     DQ_TRI=0;	          		// Pull Line Low to start reset pulse
    
     count=40; 
     do
    	Delay5us();		//200 uS Delay
     while (-- count > 0);
    
     DQ_TRI=1;      		// Release the line
    
     count=12;
     do		    	//  = 60us delay to middle of presence pulse
    	Delay5us();
     while (-- count > 0);
    
     present=DQ_PIN;  		// Get Presence on pin, DS1820 pulls it low if there
    
     count=34;
     do
    	Delay5us();		// 170 us delay to finish reset
     while (-- count > 0);
    
     if(present==1)      
     {
      PORTB.2=1;			// If no device, Indicate error on LED
     }
    
    
    Delay5us();
    Delay5us();			// Rise + Min Space = 10 us
    
    }
    
    //////////////////////////////////////////////////////////////////////
    // This function Writes a byte to the 1 wire bus.                   //
    //                                                                  //
    //////////////////////////////////////////////////////////////////////
    
    void Write(char Data)
    {
     char count=8,n;
     bit  DQdata;
    
     for(;count>0;count--)  
     {
    
      DQdata= Data.0;		// Put the bit to be written in the right place
    
      DQ_PIN=0;
      DQ_TRI=0;			//  Lower the port
    
      nop();			// Time slot start time
    			// 5us according to datasheet
    			// If statements below create some more delay
    
      if(DQdata== 1)		// Output data to the port
    	DQ_TRI = 1;
      else
    	DQ_TRI = 0;
    
      n=10;
      do
    	Delay5us();		//50us to finish timeslot
      while (-- n > 0);
    
      DQ_TRI=1;       	        	// Make sure port is released
    
      nop();		  	// Some Delay Between Bits
      nop();
     
      Data=Data>>1;		// Shift next bit into place
    			// Future improvement using rr(Data)
     }
    
    Delay5us();			// Rise + Min Space = 5 us
    }
    
     
    
    //////////////////////////////////////////////////////////////////////
    // This function Reads a byte from the 1 Wire bus and returns the   //
    // byte read.                                                       //
    //////////////////////////////////////////////////////////////////////
    
    char Read(void)
    {
     char count=8,data=0,n;
     bit  DQdata;
     for(;count>0;count--)
     {
    
      DQ_PIN=0;
      DQ_TRI=0;               		// Lower port
      Delay5us();			// Timeslot start time
    
      DQ_TRI=1;			// Set port for reading
      Delay5us();			// Wait until center of timeslot
    
      DQdata=DQ_PIN;		// Read the bit on the bus
    
      n=11;
      do
    	Delay5us();		//55us to finish timeslot
      while (-- n > 0);
    
      			// Put data into the byte
      data = data >> 1;        		// Shift previous bits (future improvement rr..)
    
      if(DQdata==1)            		// Add 1 if the data on the bus was 1
       	data +=0x80;
      
      Delay5us();  		//-- Delay Between Bits
     }
    
    Delay5us();			// Rise + Min Space = 5 us
    return(data);
    }
    j'utulise le ds18b20 connecté a RA0 une une resistane de 4.7k connecté a 5v, pour cet example il utilise l'afficheur lcd donc j'ai une petite modification dans mon main pour afficher sur 4 digit 7 segment
    une partie de mon main pour remplir le tableau digits des 2 numero (10 par example) suivi de ° et C :
    Code:
       
    char buffer[9];		// Used to store 9 bytes read from DS1820
    char temperature;		// Same as above, only need one of these global. Future imrovement.
    char s[11];	
    uns8 bb,cc;
    int digits[4];
        while(1)
    {  
                readtemp();
                temperature=buffer[0]>>1;
                chartoa(temperature);
    
                bb=((uns8)dd/10);
                cc=((uns8)dd%10);
    
              digits[0]=bb; //dizaine
              digits[1]=cc;//unité
              digits[2]=11; //° , 11 corespond a portb=0b0b01110001 pour afficher le signe °
              digits[3]=13;//C
     }
    et la fonction read temp
    Code:
    void readtemp()
    {
    char i,n;
        	Reset();		// Reset is required before any command is issued
    	Write(0xCC);  	// Skip Rom
    	Write(0x44);		// Tell DS1829 to Start Temp. Conv
    
      RBIE     = 1;   		// Turn on interrupts while waiting
      GIE      = 1;   			
    	delay(250);		//
    	delay(250);     	// 700ms delay required
    	delay(100);		// for temperature conversion
    	delay(100);		//
    
      RBIE     = 0;   /* local Disble  */	// Turn of interrupts before speaking to 1 wire device
      GIE      = 0;   /* global disable */
    	Reset();
    	Write(0xCC);		// Skip Rom
    	Write(0xBE);		// Read the result of the temp. Conversion
    
    	for(i=0; i<9 ;i++){	// Read 9 bytes, only the first two bytes
    		n=Read();	// Are needed.
    		buffer[i]=n;
    	}
    
    }
    mais malheureusement je vois toujours 00°c
    est ce que ca peut être la variable température parce que c'est une chaine de caractère ??

    -----

  2. #2
    sinatra

    Re : ds18b20 toujours 0°c

    SVP quelqu'un peut m'aider

  3. #3
    Jack
    Modérateur

    Re : ds18b20 toujours 0°c

    Je n'ai pas trop d'idée, mais le problème vient-il de l'acquisition ou de la conversion pour l'affichage. Bref, la valeur issue du DS1820 est-elle nulle ou pas?

    A+

  4. #4
    invite7a49d0d5

    Cool Re : ds18b20 toujours 0°c

    Bonsoir,

    la sonde DS1820 n'est pas exactement identique à la DS18B20...

    notamment :
    - la DS18B20 envoie la température encodée sur 12 bits... par défaut...
    la DS1820 envoie la température encodée sur 9 bits...

    il faut "demander" à la DS18B20 de "travailler" sur 9 bits...
    pour commencer à rendre ton code compatible...

    et il faut ajouter, aprés la commande de "demande de conversion" ($44)
    une demande de "lecture" de la temperature ($BE)...

    exemples du codage de l'initialisation de la DS18B20
    pour qu'elle "travaille" en 9 bits...
    http://vede.free.fr/electronique/ds18b20/
    http://vede.free.fr/electronique/ds18b20/basic.html

    un plus récent:
    http://soj.mesdiscussions.net/soj/El...jet_5555_2.htm

    en Basic, mais on s'en fout...
    car les lignes importantes sont l'utilisation de la sonde...
    et à ce propos je te conseille de jeter un coup d'oeil à sa datasheet...

    vede
    ;O]

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

    Cool Re : ds18b20 toujours 0°c

    re ;O]

    le codage de la température est aussi assez "machiavélique"...
    notamment pour décoder les t. négatives et les décimales...

    donc un exemple de base, qui met une valeur de 0 à +125, selon
    la t. ambiante ;O] dans l'octet/variable temperature :

    Code:
    Ow_Reset();
    Ow_Write(0xCC);
    Ow_Write(0x44);
    Delay_us(120);
    Ow_Reset();
    Ow_Write(0xCC);
    Ow_Write(0xBE)
    oct1 = Ow_Read();
    oct2 = Ow_Read();
    
    // LE DECODAGE
    oct1 = oct1 >> 4 ;
    oct2 = oct2 << 4 ;
    temperature = oct1 + oct2 ;
    enfin...machiavélique... quand on le connait pas...
    et qu'on est seul devant la datasheet...

  7. #6
    invite7a49d0d5

    Cool Re : ds18b20 toujours 0°c

    Citation Envoyé par vede Voir le message
    Bonsoir,

    la sonde DS1820 n'est pas exactement identique à la DS18B20...

    notamment :
    - la DS18B20 envoie la température encodée sur 12 bits... par défaut...
    la DS1820 envoie la température encodée sur 9 bits...

    il faut "demander" à la DS18B20 de "travailler" sur 9 bits...
    pour commencer à rendre ton code compatible...

    et il faut ajouter, aprés la commande de "demande de conversion" ($44)
    une demande de "lecture" de la temperature ($BE)...

    exemples du codage de l'initialisation de la DS18B20
    pour qu'elle "travaille" en 9 bits...
    http://vede.free.fr/electronique/ds18b20/
    http://vede.free.fr/electronique/ds18b20/basic.html

    un plus récent:
    http://soj.mesdiscussions.net/soj/El...jet_5555_2.htm

    en Basic, mais on s'en fout...
    car les lignes importantes sont l'utilisation de la sonde...
    et à ce propos je te conseille de jeter un coup d'oeil à sa datasheet...

    vede
    ;O]
    rere ;O]

    là j'ai dit des conneries... j'ai relu le code....
    il y a le $BE, et 12 ou 9 bits c'est peut-être pas si important...
    la valeur devrait au moins "bouger"... et pas rester à 0...

  8. #7
    sinatra

    Re : ds18b20 toujours 0°c

    Citation Envoyé par vede Voir le message
    rere ;O]

    là j'ai dit des conneries... j'ai relu le code....
    il y a le $BE, et 12 ou 9 bits c'est peut-être pas si important...
    la valeur devrait au moins "bouger"... et pas rester à 0...
    j'ai lu le datasheet du ds18b20 le resigtre LSB contient 4 bit du chiffre apès le virgule example :
    +25.0625 0000 0001 1001 0001
    MSB LSB

    donc cette ligne est fausse :
    Code:
    readtemp();
                temperature=buffer[0]>>1;
    il faut decaler de 4 comme ca :
    Code:
    readtemp();
                temperature=buffer[0]>>4;
    est meme j'ai pas inclus le resistre MSB qui contient 3 le signe et 3 bit de la valeur il faut que la temperature bouge comme meme mais malheuresement pour moi c'est toujours 00°c

    est ce que ca peut venit du tableau buffer et de la variable temperature declaré en char ????

  9. #8
    sinatra

    Re : ds18b20 toujours 0°c

    Citation Envoyé par Jack Voir le message
    Je n'ai pas trop d'idée, mais le problème vient-il de l'acquisition ou de la conversion pour l'affichage. Bref, la valeur issue du DS1820 est-elle nulle ou pas?

    A+
    je peux pas savoir car j'en ai pas un simulateur en temps réel, merci.

Discussions similaires

  1. DS18B20 : ordre d'identification
    Par Paintitblack dans le forum Électronique
    Réponses: 14
    Dernier message: 05/11/2009, 21h00
  2. par quoi remplacer un DS18B20
    Par invite2faad6dd dans le forum Électronique
    Réponses: 11
    Dernier message: 30/10/2009, 11h08
  3. adresser des composant ds18b20
    Par invite74119562 dans le forum Électronique
    Réponses: 3
    Dernier message: 13/07/2008, 14h13
  4. ds18b20
    Par invite74119562 dans le forum Électronique
    Réponses: 7
    Dernier message: 06/06/2008, 14h54
  5. capteur de temperature dallas ds18b20
    Par Ryback08 dans le forum Électronique
    Réponses: 1
    Dernier message: 21/02/2006, 00h06
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...