Skocz do zawartości

Pomocna odpowiedź

Napisano

Miał ktoś może problem przy wykorzystaniu UART z wartością CRC i w konsekwecji błędny odczyt temperatury z czujnika(85 *C)? Dodatkowo zauważyłem błędy odczyt pierwszego bajtu w adresie czujnika...

@adrianxx witam na forum 🙂 Niestety nie masz zarejestrowanego zestawu do tego kursu, więc nie wiem czym dokładnie dysponujesz. Czy korzystasz z tego samego sprzętu, który opisany jest w kursie i uruchamiasz takie same kody programów?

(edytowany)

@Treker niestety posiadam inne MCU - STM32F446RE, jednak jedyną różnicę przy UART jaką zauważyłem to funkcja Overrun, której nie posiadam... uważasz że to może powodować taki błąd? Kod oczywiście jest 1:1 z kursu, dodam że wykorzystując delay_us nie było problemów. W załączniku dodałem jak to mniej wiecej wygląda. PS. bardzo fajny kurs! 

ds18b20 uart.png

Edytowano przez adrianxx

@adrianxx Naturalnie, zawsze się na początku ma ten problem 😉 Generalnie jest wynikiem jednej z dwóch rzeczy: albo parametry transmisji (timing) jest nieprawidłowy, i nie do końca czytamy prawidłowo dane, albo, dużo częściej - czujnik jest w niewłaściwym stanie, żeby wykonać polecenie przesłania danych (odczytu lub zapisu rejestru). Polecam zapoznać się z dokumentacją gdzie jest taki rysunek jaka jest kolejność wysyłania rozkazów do DS-a. Ona jest bardzo ważna, jeśli nie wykona się poleceń w kolejności czujnik odmówi współpracy. Żeby zagwarantować właściwą kolejność przesyłania poleceń chyba najlepiej użyć FSM (maszyny stanowej), czyli zrobić sobie gdzieś w kodzie listę możliwych stanów komunikacji i upewnić się, że nasz kod jest zawsze jednoznacznie w jednym z nich. Upraszcza to później debugowanie kodu. Dodatkowy plus jest taki, że można wtedy korzystać z przerwań i nie blokować głównego wątku czekaniem na zmianę stanu czujnika.

Co do timingu, na UART udało mi się na nim uzyskać troszkę szybszą transmisję niż 115200, ale niedużo szybszą. Jeśli jest ustawiona wyższa wartość, to przynajmniej u mnie to działać nie chciało.

Taka podpowiedź - jeśli CRC się nie zgadza, warto zerknąć co jest w buforze. Jak się go wcześniej wyczyściło, i CRC się nie zgadza, tam są najczęściej zera, czyli nic nie odczytaliśmy, bo czujnik nic nie wysłał, a nie wysłał, bo odmówił wykonania z jakiegoś powodu. Chyba najpierw trzeba go zaadresować, żeby wiedział że to o niego chodzi (bo można mieć na tej samej linii więcej niż 1 czujnik).

15 godzin temu, adrianxx napisał:

Miał ktoś może problem przy wykorzystaniu UART z wartością CRC i w konsekwecji błędny odczyt temperatury z czujnika(85 *C)? Dodatkowo zauważyłem błędy odczyt pierwszego bajtu w adresie czujnika...

 

  • Lubię! 1
  • 1 miesiąc później...

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