Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Jezyk C - DS18b20+RFM73+at8

Morcinek92 09 Feb 2014 16:01 2148 22
Computer Controls
  • #1
    Morcinek92
    Level 14  
    Witam
    Robię właśnie bezprzewodowy czujnik temperatury:
    Mam problem z funkcja wysyłającą wartości odczytane przez czujnik do odbiornika..

    na razie wygląda u mnie tak:

    Code: c
    Log in, to see the code


    Code: c
    Log in, to see the code


    Natomiast w odbiorniku:

    Code: c
    Log in, to see the code



    Niby się coś pokazuje na wyświetlaczu, no ale sa to jakieś "chinskie znaki " :P jak podgrzeje czujnik to tez sie cos tam zmienia... czy jest ktos w stanie mi pomoc w tym probelemie? moze ktos robil juz taki czujnik bezprzewodowy ;>
  • Computer Controls
  • #2
    Morcinek92
    Level 14  
    Nikt nie jest w stanie udzielić odpowiedzi :(?
  • Computer Controls
  • #3
    User removed account
    Level 1  
  • #4
    BlueDraco
    MCUs specialist
    A co to ma być?

    TTemp = display_temp;

    Skąd pomysł, że wartość temperatury jest równa adresowi procedury? ;)

    Masz takich kwiatków więcej - zrozum i usuń powody, dla których kompilator generuje ostrzeżenia, bo zapewne parę ich masz.
  • #5
    Morcinek92
    Level 14  
    Cały kod nadajnika:

    Code: c
    Log in, to see the code


    A więc tak :

    A ja muszę wysłać pomiar z DS18B20 - 16bit'owy a przekazać mogę tylko wartość do wysłania 8 bitową. dane muszą być zorganizowane w tablicę elementów 8-bitowych. Więc zostało stworzone.

    hmm..
    TTemp = display_temp;
    Wartość temperatury ma być równa, tym dwóm tablica.. nie wiem czy jest to poprawne, tak sobie wymyśliłem. Dlatego was proszę o pomoc aby wspólnie to uruchomic :)
  • #6
    BlueDraco
    MCUs specialist
    display_temp - to adres procedury. Obawiam się, że nie ma on wiele wspólnego z wartością temperatury.
  • #7
    Morcinek92
    Level 14  
    Ale do tej procedury zostaje przekazana wartość temperatury która następnie ma byc wyswietlona.
  • #8
    BlueDraco
    MCUs specialist
    Przeczytaj jeszcze raz to, co napisałem już dwa razy.
  • #9
    Eagle
    Level 24  
    A dlaczego nie działa Ci debuger/symulator ?
    Nigdy nie rozumiałem takich postów na forum, gdzie ktoś oczekuje, że ktoś inny poprawi jego kod. W czasie oczekiwania na posty zrobił byś z 100 testów i poprawił buga. A sprawa jest banalna, jeśli w tym przypadku masz co najmniej takie bloki jak odczyt temp, transmisja, wyświetlenie na LCD. Sprawdź czy jak wyślesz jaką znaną wartość to wyświetla się na LCD, tak/nie. Jeśli nie to za hardkoduj jakąś wartość po stronie odbiornika nadpisującą odebrane dane i sprawdź czy je wyświetli itd I takim sposobem znajdziesz błąd w ciągu kilku minut.
  • #10
    User removed account
    Level 1  
  • #11
    Morcinek92
    Level 14  
    Witam,
    Dziękuję za podpowiedzi.
    Więc tak :
    Komunikacja między modułami jest sprawna (miganie dioda czy wysyłanie ustalonej wartości, działa).

    Kolego Eagle...nie oczekuję, że ktoś poprawi mi kod i da gotowca, chce się tego nauczyć, by następnym razem nie mieć takich problemów.

    Pozmieniałęm troszkę (nadal nie działa) , wydaje mi się że jest lepiej, bardziej czytelniej.

    Code: c
    Log in, to see the code



    -Odczyt temperatury jest dobrze zrobiony, kiedy wstawie sam ten fragment i wyswietle na LCD to pokazuje prawidłowo.
    - Transmisja między dwoma modułami jest sprawna (miganie, przesyłanie ustalonej wartości)

    Na odbiorniku wyskakują mi tylko jakieś krzaczki
  • #12
    Eagle
    Level 24  
    Code: cpp
    Log in, to see the code


    Możesz opisać co robi ten if w/g ciebie ?


    Code: cpp
    Log in, to see the code


    Wysyłanie adresu procedury zamiast zmierzonej wartości to bardzo zły pomysł.

    Skoro jak domyślam się po nazwach zmiennych piszesz program z książki "Mikrokontrolery AVR Język C Podstawy programowania”, może warto przerobić nieco wcześniejsze rozdziały abyś bardziej świadomie programował. Piszę to nie dla tego aby cię obrazić, ale od początku tego wątku wszyscy wskazują gdzie jest błąd ale nie jesteś w stanie go poprawić, ponieważ nie rozumiesz czym jest adres procedury, jak zwraca się wartości itd.
  • #13
    Morcinek92
    Level 14  
    Code: c
    Log in, to see the code


    Według mnie:
    Dokonujemy odczytu temperatury, jeśli czujnik został wykryty
    (Id czujnika, znak minus (0 badz 1) , dzisietna czesc temperatury, dzisietna czesc stopna.

    Tak wiem , ze mówiono mi ze dispaly_temp jest adresem procedury a nie wartośćia temperatury..
    Dokładnie korzystam z tej książki. Przerabiałem bardzo dokladnie ją.. ciężko wchodzi mi wiedza programistyczna ale się staram...

    DS18x20 - czyli funkcja która dokonuje odczytu poszczególnych czujników wyników pomiaru.
    Czyli ciągle myślę ze ta funkcja daje już mi wynik który ja potrzebuję, teraz tylko mam go przesłać do odbiornika a on ma wyświetlić go na LCD. A jako że wynik jest 12 bitowy a ja maksymalnie mogę przesłać tymi modułami 32 bity ale uszeregowane w paczki po 8 bitów to rozbijam TTemp na dwie tab

    [/film]

    Dodano po 13 [minuty]:

    Rozumiem chyba co masz na myśli ze funkcja DS18X20_read_meas
    Ona nam daje wynik ale nie zupełnie, ponieważ funkcja daje wskaznik do trzech jednobajtowych zmiennych typu uint8_t tj. subzero, cel, cel_frac_bits... i dopiero te 3 bajty to jest wynik...

    tylko jak teraz zrobić zeby te 3 bity wyslac i zeby zostaly wyswietlone prawidlowo :OO Moze jakieś podpowiedzi??
  • #14
    BlueDraco
    MCUs specialist
    "Ona nam daje wynik ale nie zupełnie, ponieważ funkcja daje wskaznik do trzech jednobajtowych zmiennych typu uint8_t tj. subzero, cel, cel_frac_bits... i dopiero te 3 bajty to jest wynik... "

    Kolego, najpierw musisz zrozumieć składnię języka, w którym programujesz. Bez tego nikt Ci nie pomoże, bo nie wiesz, co robią instrukcje programu, który piszesz. Ta funkcja nie "daje wskaźnika".
    Przeanalizuj program linijka po linijce i zrozum go.
  • #15
    Morcinek92
    Level 14  
    TU jest tak napisane...

    Jezyk C - DS18b20+RFM73+at8
  • #16
    BlueDraco
    MCUs specialist
    W książce jest napisane "do funkcji przekazujemy wskaźniki".
    Ty piszesz: "funkcja daje wskaźnik do trzech jednobajtowych zmiennych".

    I z takich właśnie powodów nie wiesz, co się dzieje w programie i nie wiesz, co oznaczają instrukcje, które piszesz.
  • #17
    User removed account
    Level 1  
  • #18
    Eagle
    Level 24  
    Code: c
    Log in, to see the code


    Nie wiem jak wyświetlasz dane, ale powinno cokolwiek się zmieniać ze zmianą temp. Idzie wiosna, więc zmiennej ze znakiem temp. do czasu nadejścia zimy nie potrzebujesz i mam nadzieje, że do tego czasu przyswoisz wiedzę o wskaźnikach, funkcjach itp.
  • #19
    Morcinek92
    Level 14  
    @Eagle

    Zastosowałem Twoją wskazówkę
    Code: c
    Log in, to see the code


    Odbiór danych tak mam zeralizowany:

    Code: c
    Log in, to see the code
  • #20
    BlueDraco
    MCUs specialist
    A w jakim celu każesz kompilatorowi obliczyć adres procedury i go zapomnieć?
    my_receive_packet;

    Cały kod wokolicach tej linii wygląda dość podejrzanie.
  • #21
    Morcinek92
    Level 14  
    Code: c
    Log in, to see the code


    Teraz chyba lepiej.. ale nadal cisza na wyswietlaczu...:(
  • #23
    Morcinek92
    Level 14  
    problem jest teraz z funkcja do odebranych pakietów... bo na wyświetlaczu nic się nie wyświetla...