Skocz do zawartości

Zmiana rozdzielczości termometru DS18B20


Daniel_1995

Pomocna odpowiedź

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;
}
Link do komentarza
Share on other sites

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.