adrianxx Napisano Maj 15, 2023 Udostępnij Napisano Maj 15, 2023 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... Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Maj 16, 2023 Udostępnij Maj 16, 2023 @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? Link do komentarza Share on other sites More sharing options...
adrianxx Maj 16, 2023 Autor tematu Udostępnij Maj 16, 2023 (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! Edytowano Maj 16, 2023 przez adrianxx Link do komentarza Share on other sites More sharing options...
HTD Maj 16, 2023 Udostępnij Maj 16, 2023 @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... 1 Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
Treker (Damian Szymański) Maj 17, 2023 Udostępnij Maj 17, 2023 Pytanie zostało wydzielone z tematu (inny sprzęt niż ten, który jest używany w kursie): https://forbot.pl/forum/topic/20353-kurs-stm32l4---17---termometry-ds18b20-1-wire-uart/ Link do komentarza Share on other sites More sharing options...
Popularny post Eddy142 Czerwiec 22, 2023 Popularny post Udostępnij Czerwiec 22, 2023 (edytowany) @adrianxx Cześć, miałem ten sam problem. W pliku wire.c na końcu funkcji write_bit po wysłaniu bitu należy dodać odczyt danych z uarta static void write_bit(int value) { uint8_t dummy = 0x00; if (value) { uint8_t data_out = 0xff; HAL_UART_Transmit(&huart3, &data_out, 1, HAL_MAX_DELAY); } else { uint8_t data_out = 0x0; HAL_UART_Transmit(&huart3, &data_out, 1, HAL_MAX_DELAY); } HAL_UART_Receive(&huart3, &dummy, 1, HAL_MAX_DELAY); } Edytowano Czerwiec 22, 2023 przez Eddy142 2 1 Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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ę »