Skocz do zawartości

Zmiana rozdzielczości termometru DS18B20


Pomocna odpowiedź

Napisano

Witam mam problem ze zmianą rozdzielczości termometru cyfrowego DS18B20 na Arduino nano programowane na rejestrach. Wyszukałem działający kod lecz pozwala on na odczytanie temperatury z dokładnością do 0.5 stopnia chciałbym jednak zmienić rozdzielczość ermomeru na 12 bitów jak można tego dokonać przerabiając poniższy kod, próboawłem wykorzystać funkcję OneWireWriteByte(); jednak się nie udało ponizej kod którego używam:


#include <stdio.h>
#include <avr/io.h>
#include <util/delay.h>
#define SET_ONEWIRE_PORT     PORTD  |=  _BV(7)
#define CLR_ONEWIRE_PORT     PORTD  &= ~_BV(7)
#define IS_SET_ONEWIRE_PIN   PIND   &   _BV(7)
#define SET_OUT_ONEWIRE_DDR  DDRD   |=  _BV(7)
#define SET_IN_ONEWIRE_DDR   DDRD   &= ~_BV(7)


int main(void)
{
 /* Zmienna przechowuje aktualną wartość temperatury */        
 double temp;
 /* W tablicy zapisywane będą dane odczytane z układu ds18b20 */
 unsigned char ds18b20_pad[12];


 Serial.begin(9600);

 while(1)
 {

   /* Funkcja 'ds18b20_ConvertT' wysyła do układu ds18b20 
      polecenie pomiaru */      
    if(ds18b20_ConvertT())
   {

      /* 750ms - czas konwersji */
      _delay_ms(1000);

     /* Odczyt z układu ds18b20, dane zapisywane są w tablicy ds18b20_pad. 
        Dwie pierwsze pozycje w tablicy to kolejno mniej znaczący bajt i bardziej 
    znaczący bajt wartość zmierzonej temperatury */           
      ds18b20_Read(ds18b20_pad);

     /* Składa dwa bajty wyniku pomiaru w całość. Cztery pierwsze bity mniej
        znaczącego bajtu to część ułamkowa wartości temperatury, więc całość
        dzielona jest przez 16 */       
      temp = ((ds18b20_pad[1] << 8) + ds18b20_pad[0]) / 16.0 ;

   }
   Serial.println(temp);
 }
}


unsigned char ds18b20_ConvertT(void)
{
 if (!OneWireReset()) return 0;

 OneWireWriteByte(0xcc); // SKIP ROM
 OneWireWriteByte(0x44); // CONVERT T

 return -1;
}

/***********************************************************/

int ds18b20_Read(unsigned char scratchpad[])
{
 unsigned char i;    

 if (!OneWireReset()) return 0;

 OneWireWriteByte(0xcc); // SKIP ROM
 OneWireWriteByte(0xbe); // READ SCRATCHPAD

 for(i=0; i<12; i++) scratchpad[i] = OneWireReadByte();

 return 1;
}

/***********************************************************/

unsigned char OneWireReset()
{
 CLR_ONEWIRE_PORT; 

 if (!(IS_SET_ONEWIRE_PIN)) return 0;  

 SET_OUT_ONEWIRE_DDR; 
 _delay_us(500);
 SET_IN_ONEWIRE_DDR; 
 _delay_us(70);

 if(!(IS_SET_ONEWIRE_PIN))
 {
   _delay_us(500);
   return(1);
 }

 _delay_us(500);

return(0);
}

/**********************************************************/

void OneWireWriteByte(unsigned char byte)
{
  unsigned char i;

  CLR_ONEWIRE_PORT; 

  for (i=0; i<8; i++)
  {
    SET_OUT_ONEWIRE_DDR; 

    if (byte & 0x01)
    {
      _delay_us(7);
      SET_IN_ONEWIRE_DDR; 
      _delay_us(70);
    }
    else
    {
       _delay_us(70);
       SET_IN_ONEWIRE_DDR; 
       _delay_us(7);
    }

    byte >>= 1;
  }
}

/***********************************************************/

unsigned char OneWireReadByte(void)
{
 unsigned char i, byte = 0;

 SET_IN_ONEWIRE_DDR; 

 for (i=0; i<8; i++)
 {
    SET_OUT_ONEWIRE_DDR; 
    _delay_us(7);
    SET_IN_ONEWIRE_DDR; 
    _delay_us(7);
    byte >>= 1;

    if(IS_SET_ONEWIRE_PIN) byte |= 0x80;

    _delay_us(70);
 }

 return byte;
}

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...