Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Atmega328 / Bascom - DS18B20 - 7 x czujnik

maximus22_kr 26 Cze 2013 13:35 2274 10
  • #1 26 Cze 2013 13:35
    maximus22_kr
    Poziom 18  

    Witam
    Chciałem zapytać, czy właściwie obsługuję siedem czujników DS18B20 na jednej linii.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0 10
  • #2 26 Cze 2013 13:44
    piotrva
    Moderator na urlopie...

    1. Niepotrzebnie wysyłasz &H55 (Match Rom) - 1wverify robi to automatycznie
    2. Po co dwa razy zczytujesz dane z każdego termometru? Połącz raz odczytane dane z zmienną 16 bit.
    3. Nie wiem do czego wykorzystujesz potem zmienne, ale czy na pewno potrzebujesz przechowywać dane aż w 3 miejscach (tablica, zmienne LsbN i MsbN oraz Ds_iN)?
    4. Nie wiem jaka jest struktura reszty programu, ale Waitms750 wygląda nieelegancko - powinieneś zrobić to na maszynie stanów i przerwaniach
    5. Nie liczysz CRC każdej transmisji i tym samym nie wykryjesz błędów

    0
  • #3 26 Cze 2013 14:12
    maximus22_kr
    Poziom 18  

    piotrva napisał:
    1. Niepotrzebnie wysyłasz &H55 (Match Rom) - 1wverify robi to automatycznie

    Czyli w dwóch miejscach ( dla każdego czujnika ) mogę to usunąć ?

    piotrva napisał:

    2. Po co dwa razy zczytujesz dane z każdego termometru? Połącz raz odczytane dane z zmienną 16 bit.
    3. Nie wiem do czego wykorzystujesz potem zmienne, ale czy na pewno potrzebujesz przechowywać dane aż w 3 miejscach (tablica, zmienne LsbN i MsbN oraz Ds_iN)?

    Pierwszy raz to odczytuje dla RFM12, bo wysyła tylko typu Byte, drugi raz dla obliczeń histerezy ( akurat mam już gotowy kod, ale operujący na zmiennej typu Integer ). Chyba, żeby zrobić:
    Ds_i7 =MAKEINT( Lsb7 , Msb7 )
    Odczytanie obydwu typów zmiennych za jednym razem nie udało mi się - zawsze odczytywał tylko te, które były pierwsze w kolejności.
    piotrva napisał:

    4. Nie wiem jaka jest struktura reszty programu, ale Waitms750 wygląda nieelegancko - powinieneś zrobić to na maszynie stanów i przerwaniach
    5. Nie liczysz CRC każdej transmisji i tym samym nie wykryjesz błędów


    Jak do tej pory nie korzystałem z CRC, może czas zacząć? :) Mam jeszcze 40% wolngo miejsca w Atmaega328

    0
  • #4 26 Cze 2013 14:27
    piotrva
    Moderator na urlopie...

    1. Możesz usunąć

    2. 3. Tak, usuń drugi odczyt i dodaj tę komendę - powinno zadziałać. Poza tym skoro zmienne LsbN i MsbN nie są nigdzie wykorzystywane to możesz zamiast tworzyć 7 par zmiennych używać ciągle jednej i tej samej pary

    4. Przemyśl ten punkt.

    5. Najwyższy czas - bez tego błędne odczyty (spowodowane błędem komunikacji) też polecą w eter.

    0
  • #5 26 Cze 2013 16:23
    maximus22_kr
    Poziom 18  

    tzn. lepiej będzie tak:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Mam jeszcze dwa pytania.
    Czy nie powinno być tak ?
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    czy może lepiej byłoby rozłożyć odczyt na podprogramy, osobno dla każdego czujnika
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Dodano po 1 [godziny] 34 [minuty]:

    Czy używając MakeInt( ) nie będzie problemu z ujemnymi temperaturami ?
    Bo przy histerezie to jest istotne

    0
  • #7 26 Cze 2013 18:12
    maximus22_kr
    Poziom 18  

    piotrva napisał:
    Ale komendy CC i 44 wysyłaj tylko raz - zareagują na nie wszystkie czujniki. I tak samo czekaj tylko raz te 750ms.


    Chyba, że każdy czujnik zrobię w oddzielnym podprogramie, to wtedy za każdym razem trzeba.

    0
  • #9 27 Cze 2013 11:17
    maximus22_kr
    Poziom 18  

    Co do rezygnacji z Waitms 750, to miałem kiedyś taki pomysł:

    - przerwanie od Timer0 wywołuje

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    reset licznika
    reset flagi

    - przerwanie od Timer0 wywołuje
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    reset licznika
    reset flagi

    - przerwanie od Timer0 wywołuje
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    reset licznika
    reset flagi

    - przerwanie od Timer0 wywołuje
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    reset licznika
    reset flagi

    Jeśli, jak pisał Kolega wcześniej wystarczy tylko raz wywołać czujniki przez, to chyba raz na początku cyklu wystarczy
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    przerwanie można dać co 1 sekundę

    0
  • #11 28 Cze 2013 11:36
    maximus22_kr
    Poziom 18  

    piotrva napisał:
    Tylko nie wywołuj w przerwaniach tak długich bloków instrukcji - lepiej ustaw flagę, która wskaże pętli głównej programu wykonać te instrukcje.
    Ale co tu możemy mówić, jak widać tylko wycinek programu.


    Zgadza się, dlatego wklejam nieco więcej

    Flaga_wybor jest co 10 sekund, Blokada zatrzymuje odczytywanie czujników na czas odbioru DCF77, zwłaszcza DS18B20 bo tam trzeba blokować przerwania, a bez tego sygnał DCF77 nie będzie odkodowany
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Poszedłem nieco na łatwiznę i aby uniknąć kolizji pomiędzy odczytem kolejnych czujników, każdy odczyt ma swój numer - po skończeniu listy kolejka idzie od nowa.
    I tutaj pytanie, czy jeśli za pierwszym razem dam
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    a później co kilka sekund będę wywoływał po kolei każdy z czujników to ( tak długi czas ) nie będzie to miało wpływ na odczytane wskazania, można przyjąć, że do momentu wystąpienia kolejnego CC i 44 czujniki będą pamiętały ostatnie wyniki pomiarów ?

    0