logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Termometr bezprzewodowy 433 MHz - UART nie działa, odbiornik nie odczytuje danych

Osator90 28 Sty 2016 22:03 1857 20
  • #1 15380929
    Osator90
    Poziom 10  
    Witam. Chciałem zrobić termometr bezprzewodowy. Na razie mam problem z komunikacją UART. Nadajnik działa na 100 % odczytywałem temperaturę na komputerze prze ft232. Ale odbiornik nie odczytuje temperatury. W tej chwili obydwa mikrokontrolery są spięte przewodem TX ->RX

    Kod Nadajnik
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod Odbiornik
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #2 15381020
    Eagle
    Poziom 24  
    Te odbiorniczki na 433Mhz gdy nie odbierają sygnału, podają na wyjściu "szum" cyfrowy, zgaduję że nie masz oscyloskopu, podłącz jakiś piezo albo jakiś wzmacniacz audio, wówczas się przekonasz. Jak to zrobisz, zacznij coś nadawać, wówczas zobaczysz, że odbiornik przekazuje odebraną informację. Typowo aby przesłać coś z kluczowaniem amplitudy https://pl.wikipedia.org/wiki/ASK powinieneś zastosować pakiet z nagłówkiem, a w odbiorniku oczekiwać nagłówka, dobrym choć nie jedynym źródłem może być dokumentacja do http://ww1.microchip.com/downloads/en/DeviceDoc/40138c.pdf strona 8.
  • #3 15381163
    Osator90
    Poziom 10  
    Na chwilę obecną mam problem z komunikacją po przewodzie TX->RX. Jeszcze nie podłączałem układów RF 433 do komunikacji bezprzewodowej. Chciałem wiedzieć czy w kodzie programu nie ma błędów
  • #4 15382465
    Eagle
    Poziom 24  
    Jeśli nie masz podstawowej komunikacji po kablu, to dlaczego temat jest 433Mhz - brak komunikacji.
    Bez urazy ale transmisja szeregowa jest tak szeroko opisywana, łącznie z działającymi przykładami ... że aż nie wiem co doradzić, może warto przenieść temat do początkujących.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Znasz na pamięć, który bit jest odpowiedzialny za co ? Wykorzystaj operator << i wbudowane definicje.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Nic mi to nie mówi, bo nie znam z jaką prędkością taktujesz uC, wykorzystaj odpowiednie makro do liczenia bitrate.
  • #5 15393577
    Osator90
    Poziom 10  
    Bo jak już uda mi się skomunikować po przewodzie będę próbował transmisji bezprzewodowej 433.
    Zmieniłem kod i odbiornik teraz wykorzystuje przerwania. Niby już transmisja działa ale nie odbieram tego co bym chciał czyli temperatury, a raczej jej wartość jest nie prawidłowa. Podejrzewam że porąbałem coś z typami zmiennych
    Termometr bezprzewodowy 433 MHz - UART nie działa, odbiornik nie odczytuje danych
    Kod nadajnika

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod odbiornika



    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #6 15394479
    Samuraj
    Poziom 35  
    Masz źle napisaną obsługę odbioru transmisji.
    Po pierwsze, jak odbierasz dane to ich nie wysyłaj na wyświetlacz oraz nie używaj funkcji ustalających pozycję rysowania. Przerwanie ma tylko zbierać znaki i jak zbierze całość ustawiać flagę. W pętli głównej sprawdzaj flagę i gdy ustawiona wyświetlaj wynik.
    Po drugie zrezygnował bym z funkcji printf oraz sprintf.
    Czyż nie łatwiej było by wysłać zawartość ds18b20_pad[1] oraz ds18b20_pad[0]
    To tylko 2 * po 8 bitów a Ty wysyłasz 6 znaków.
    Pozostaje problem rozpoznania początku danych gdyż może dojść do zamiany miejscami danych jeśli będziemy wysyłać tylko po 2 bajty.
  • #7 15395054
    Osator90
    Poziom 10  
    Jak wrzucę funkcję wyświetlającą wynik na wyświetlaczu wracam do punktu wyjścia. Układ nie odbiera danych z drugiego mikro kontrolera. Bynajmniej tak to wygląda.

    Nie wiem czy o to Ci chodziło

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #8 15395255
    Samuraj
    Poziom 35  
    Nie zrobiłeś nic z tego co pisałem.
    Dalej masz źle napisaną funkcję odbioru danych.
    To po winno wyglądać mniej więcej tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Nie wiem w jakiej formie wysyłane są dane i to trzeba poprawić. Gotowca nie będę dawał na tacy :D
    To jest tylko szablon nad którym trzeba popracować.
    Chciałem bardziej pokazać jak przekazać flagę odbioru danych do pętli głównej.
  • Pomocny post
    #9 15395406
    dondu
    Moderator na urlopie...
    Niestety pokazałeś zły kod - jak wpłynie na poprawność działania pokazanego przez Ciebie kodu:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    umieszczone w pętli głównej?

    Prawidłowo powinno być na przykład tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #10 15395492
    Samuraj
    Poziom 35  
    No dobrze a jaką mają różnice powyższe programy.
    Bo jak dla mnie to dodana jest kolejna zmienna.
    Różnicy w działaniu nie zauważam żadnej - pomroczność czy jak :)

    I jeszcze jedno:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Widziałem już parę razy podobną deklarację i wydawała mnie się dziwactwem.
    Zawsze wydawał mi się iż taka deklaracja zmiennej w ciele funkcji za każdym razem po wywołaniu tej funkcji będzie miała wartość równą 0, inaczej po co ją za każdym razem deklarować.
    Zdaje sobie sprawę iż większość niuansów wynika z tego iż jest to AVR-GCC stąd przy deklaracji zmiennej static.
    Ja wychodzę z założenia iż jeśli zmienna ma być użyta w przerwaniach i w pętli głównej to deklaruje ją zaraz pod includami jako zmienną globalną.
    Zmienne zadeklarowane w ciele funkcji mają zakres lokalny, tylko w tej funkcji.

    dondu napisał:
    Niestety pokazałeś zły kod - jak wpłynie na poprawność działania pokazanego przez Ciebie kodu:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    umieszczone w pętli głównej?

    Ustawi indeks tablicy odebranych danych na początek, co tym samym dane będą nadpisywane. Jak osiągnie 2 to będą obrabiane. Zerowanie powinno nastąpić po obróbce danych.
  • #11 15395543
    dondu
    Moderator na urlopie...
    Samuraj napisał:
    I jeszcze jedno:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Widziałem już parę razy podobną deklarację i wydawała mnie się dziwactwem.
    Zawsze wydawał mi się iż taka deklaracja zmiennej w ciele funkcji za każdym razem po wywołaniu tej funkcji będzie miała wartość równą 0, inaczej po co ją za każdym razem deklarować.

    Static jest tutaj kluczem i wreszcie trzeba go poznać :) : http://mikrokontrolery.blogspot.com/2011/02/kurs-jezyka-c-zmienne-lokalne-statyczne.html

    Samuraj napisał:
    Ja wychodzę z założenia iż jeśli zmienna ma być użyta w przerwaniach i w pętli głównej to deklaruje ją zaraz pod includami jako zmienną globalną.
    Zmienne zadeklarowane w ciele funkcji mają zakres lokalny, tylko w tej funkcji.

    W mojej propozycji zmienna RxCount jest używana tylko w funkcji przerwania. Poza przerwaniem używana jest zmienna flaga i jest odpowiednio zadeklarowana.


    Samuraj napisał:
    Ustawi indeks tablicy odebranych danych na początek, co tym samym dane będą nadpisywane. Jak osiągnie 2 to będą obrabiane. Zerowanie powinno nastąpić po obróbce danych.

    Zastanów się, czy w Twoim programie zmienna ta ma szansę osiągnąć wartość 2 skoro none stop jest zerowana w pętli głównej, a przerwanie wykonuje się rzadko.
  • #12 15395600
    Samuraj
    Poziom 35  
    No tak teraz to widzę, zerowanie zmiennej powinno być na samym końcu warunku a nie za klamrą jak napisałem.
    Jest:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    A powinno być:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Teraz pytanie zasadnicze, jeśli przeniesiemy zerowanie zmiennej jak być powinno czy to coś zmieni w funkcjonowaniu programu ?
    I jeszcze jedno mi się rzuca na oczy, użyjemy takiej składni:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    A w pętli głównej co często się zdarza ktoś użyje sobie bardzo popularnego przez początkujących delaya, i w tym czasie nadejdą kolejne dane.
    Oczywiście dane nie zostaną obrobione. Mało tego zmienna RxCount zostanie wyzerowana i dane będą nadpisywane. Przy tak krótkiej zmiennej to nie stanowi problemu ale przy dłuższej.
    Idą dane:
    "Ala ma kota"
    Mamy delaya, nie obrabiamy danych, bufor ustawiany jest na początek i nadchodzą nowe dane. A my dalej jesteśmy w delayu.
    Delay się skończył i dane powinny powinny mieć postać.
    "Ona je zupe"
    Całość jeszcze nie doszła, my akurat obsłużyliśmy delaya w połowie dancy, mamy ustawiona flagę więc obrabiamy dane.
    A tam:
    "Ona je kota"
  • #13 15414823
    Osator90
    Poziom 10  
    Transmisja po przewodach działa.

    Program nadajnika:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Program odbiornika

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Ale teraz jest kolejny problem. Podłączyłem moduły rf do transmisji bezprzewodowej i niestety nie odbieram poprawnej wartości temperatury. Wygląda na jakieś śmieci. temperatura skacze z 10 na 1000, -270 itd
    W odbiorniku i nadajniku dolutowane są dodatkowe antenki w postaci przewodów 15 cm
  • #14 15415058
    Eagle
    Poziom 24  
    Te odbiorniczki gdy nie odbierają sygnału, generują cyfrowy szum, coś w rodzaju jak ustawisz się na niedostrojonej stacji słyszysz szum. Jeśli nie zaimplementujesz nadawania nagłówka a w odbiorniku jego detekcji, nie odbierzesz danych. Kolejne podłączenie bezpośrednio sygnału z TX do nadajnika, powoduje że gdy przesyłasz bajt o wartości zero, to przez czas trwania bajtu nic nie jest nadawane i analogicznie przy wysyłaniu 0xFF nadajesz przez 8 bit. Typowo stosuje się różne długości kluczowania nośnej dla wartości bitu. Patrz drugi post tego wątku, masz tam przykład jak to jest robione w pilotach do centralnego.
  • #15 15415171
    Osator90
    Poziom 10  
    Nie wiele mi to mówi, jakiś przykłąd by się przydał. Ale przecierz te moduły mają za zadanie tylko przetworzenie i przesyłanie danych za pośrednictwem fal radiowych. Więc skoro transmisja po przewodach działa poprawnie to dlaczegu tu miał by być inaczej.
  • #16 15415245
    Eagle
    Poziom 24  
    Jaki masz moduł AM czy FM ? Jeśli AM to masz tylko kluczowanie nośnej i wysyłanie bezpośrednio sygnału z linii TX UART to zły pomysł. Na linkowanym pdf masz obwiednie wraz z czasami i podobną musisz wytworzyć aby coś sensownego nadać.

    Cytat:
    skoro transmisja po przewodach działa poprawnie to dlaczegu tu miał by być inaczej.

    Ponieważ przy bezpośrednim połączeniu gdy nic nie nadajesz masz ustalony stan linii, w radiu przy braku nadawania odbiornik odbiera szum, który nie niesie danych, musisz zrobić detekcję początku nadawania.
  • #17 15415385
    Osator90
    Poziom 10  
    Czyli oprócz samej temperatury wysyłam jakis bait startowy np:

    unsigned char temp[2] = {0xEE,ds18b20_pad[1],ds18b20_pad[0]};

    i w odbiorniku zaczynam odbiur tylko i wyłącznie gdy nadedzie 0xEE ?
  • #18 15415559
    Eagle
    Poziom 24  
    Prawie dobrze, ponieważ przesunięcie 0xEE o jeden bit spowoduje, że otrzymasz np 0x77 którego się nie spodziewasz. MicroChip wysyła 12 "impulsów" a następnie ustaloną przerwę, po których rozpoczyna się nadawanie właściwych danych. Odbiornik czeka na impulsy gdy się pojawią, czeka na przerwę, która powoduje, że może się z synchronizować. Dodatkowo niezależnie od wartości każdego bitu nadawany jest "impuls" pozwalający się synchronizować odbiornikowi po każdym bicie. Koniecznie zobacz FIGURE 4-1: http://ww1.microchip.com/downloads/en/DeviceDoc/40138c.pdf
  • #19 15416498
    Osator90
    Poziom 10  
    Chętnie bym się pobawił w zabawę ciepło zimno i trochę po edukował ale goni mnie czas i muszę to uruchomić jak najszybciej. Więc jeżeli ktoś jest w stanie to prosiłbym o pomoc ewentualnie konkretną podpowiedź.
  • Pomocny post
    #20 15416652
    Piotr Piechota
    Poziom 22  
    Wyślij przed danymi kilka bajtów 0x55 (1010101 bin), które ustawią obwód automatycznej regulacji wzmocnienia i będzie dobrze. Lepiej byłoby cały komunikat zakodować kodem Manchester ale przy krótkiej ramce 0x55 powinno wystarczyć.
  • #21 15416935
    Osator90
    Poziom 10  
    Wszystko działa :) Jako bit kontrolny ustawiłem 0xAA zamiast 0x55 i śmiga aż miło.
    Poniżej działający kod odbiornika i nadajnika. Temat do zamknięcia.


    Nadajnik

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Odbiornik

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
REKLAMA