Skocz do zawartości

[C] DS18b20


piter_kula

Pomocna odpowiedź

Mam pytanie odnośnie kodu napisanego do czujnika DS18b20 z kursu AVR-GCC.

/*
  Plik ds18b20.c
  (minimum kodu do odczytu temperatury z ds18b20)

  xyz.isgreat.org
*/

#include <avr/io.h>
#include <util/delay.h>
#include "ds18b20.h"


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

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<9; i++) scratchpad[i] = OneWireReadByte();

 return 1;
}

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

void OneWireStrong(char s)
{
 if (s)
 {
    SET_ONEWIRE_PORT; 
    SET_OUT_ONEWIRE_DDR; 
 }
 else
 {
    SET_IN_ONEWIRE_DDR; 
 }
}

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

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;
}

A dokładnie chodzi mi o to:

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);

}

Według zasadny działania 1 Wire każda komunikacja na magistrali 1-Wire rozpoczyna się od zainicjowania podłączonych do niej urządzeń. RESET PULSE, czyli master wymusza stan niski przez 480-960 us i po tym czasie master (uc) zwalnia magistralę, czyli ustawia Porty na wej tak? Później czeka na odpowiedź od slave który rozpoczyna się po 15-60 us po zakończeniu RESET PULSE. Slave wysyła stan niski o długości 60-240us (Present Pulse) i wtedy wiemy że jakieś urządzenie jest podłączone.

Zasadę rozumiem ale trochę gorzej mi idzie z zrozumieniem tego kodu. Mógłby ktoś opisać dlaczego na samym początku funkcji Port jest ustawiany na 0? Domyślam się że bierzemy pod uwagę czy Porty są wej czy wy. Także co oznacza return 0 i return 1, w sensie czy 0 to znaczy ze jest urządzenie podłączone czy nie.

Pozdrawiam

Link do komentarza
Share on other sites

Polecenie ds18b20_ConvertT(void) powoduje wykonywanie wszystkich poleceń w tym OneWireReset()

Mimo że powinno być tylko konwertowanie.

Pełną konfigurację masz podaną w pliku ds18b20.h warto tam zobaczyć. Tam jest pełna konfiguracja pinów ( portów ) do których ów czujnik jest podłączony

Pozdrawiam

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.