Strona 1 z 1

HAL DS18B20 problem z odbiorem danych

: środa 14 gru 2016, 19:59
autor: StaryAnoda
Hej

Mam problem
Mam zestaw z mikrokontroler F103R8T6
Napisałem bibliotekę do odbioru temperatury z czujnika DS18B20 przy taktowaniu 64MHz wszystko działa poprawnie:

Widok z programu STM32Cube:
Screenshot (54).png


Widok z analizatora stanów logicznych:
Screenshot (55).png

Screenshot (56).png


Przy taktowaniu 8MHz otrzymuję same zera czyli temperaturę: 4095.938
Widok z programu STM32Cube:
Screenshot (57).png


Widok z analizatora stanów logicznych:
Screenshot (59).png


Funkcja odbierająca dane wygląda tak w programie z taktowaniem 64MHz

Kod: Zaznacz cały

uint8_t One_Wire_Read_Bit(void)
{
   uint8_t Bit = 0;

   ONE_WIRE_OUTPUT();
   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_RESET);
   Delay_us(1);
   ONE_WIRE_INPUT();
   Delay_us(1);

   if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_10) == GPIO_PIN_SET)
   {
      Bit = 1;
   }
   else
   {
      Bit = 0;
   }
   Delay_us(35);

   return Bit;
}


Czy może mi ktoś podpowiedzieć w jaki sposób dopasować czasy dla 8MHz ?

Re: HAL DS18B20 problem z odbiorem danych

: czwartek 15 gru 2016, 19:42
autor: Antystatyczny
Domyślam się, że Delay_us() to funkcja. w związku z tym proponuję przez chwilke pomyśleć w taki sposób, w jaki działa typowy MPU. Wykonuje się jakiś kawałek kodu i nagle natrafia na skok do funkcji Delay_us(1). Należy porzucić obecne zadanie, skoczyć do funkcji oraz przekazać parametr (pewnie przez rejestr), następnie wyłączyć przerwania, ustawić timer oraz włączyć odliczanie. Następnie jest sprawdzanie, czy timer skończył liczyć do zera. Wyjście z funkcji i przywrócenie poprzedniego "ładu". Mniej więcej się zgadza, prawda? A teraz zmieść to wszystko w 8 cyklach maszynowych.... Dlaczego w ośmiu? Przy 8MHz opóźnienie 1us to właśnie 8 nopów.