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

[Bascom]Atmega + kilka DS18B20 - optymalizacja kodu

05 Kwi 2017 15:26 840 10
  • Poziom 18  
    Chciałem uprościć kod programu obsługującego trzy czujniki DS18B20. Na razie mam cztery podprogramy ( jeden wywołuje pomiar, a trzy obliczają dane dla każdego DS18B20 ). Mam taki pomysł, żeby tak skonstruować podprogram do obliczeń, aby na wejściu podawać adres DS, a podprogram ( wspólny dla wszystkich ) poda wynik.
    Coś takiego próbuję zrobić:

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Kompilator zgłasza błąd
    Error : 248 Line : 433 BYVAL should be used in declaration [[ 1]] ,
    Error : 248 Line : 437 BYVAL should be used in declaration [[ 1]] ,

    Moderowany przez tmf:

    Jeśli temat dotyczy Bascoma proszę umieścić stosowny znacznik w tytule posta. Tytuł poprawiłem.

  • Użytkownik usunął konto  
  • Poziom 18  
    Tzn. mam tablicę 24 bajty ( na razie do testów). I teraz podaje adres początkowy z tablicy, od którego zaczyna się ID układu DS18B20.
    Podprogram ma załadować ID, odczytać, sprawdzić CRC i w odpowiedzi podać mi LSB, MSB, status czujnika, histereze ( poprzednią muszę mu jakoś podać ) i wynik w postaci zmiennej typu string.

    Wzorowałem się na czymś takim:
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    wywoływanym przez Call Get_wenshidu(i , J)
    Czyli to sub wie tylko jaki jest adres ID czujnika DS18B20, a to on ma dać wynik obliczeń do zmiennych

    Na razie dla każdego DS mam osobny program:

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod
  • Użytkownik usunął konto  
  • Poziom 18  
    Niestety byref nie pasuje kompilatorowi.
    Error : 248 Line : 434 BYVAL should be used in declaration [[ 1]]
  • Użytkownik usunął konto  
  • Poziom 18  
    Przygotowałem specjalnie do testu

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Błąd przy kompilacji jest przy:
    Call Pomiar_ds(ds1_lsb , Ds1_msb , Ds1_brak , H1_ds_i1 , T1 ) - Error : 248 Line : 112 BYVAL should be used in declaration [[ 1]]
    i
    Call Pomiar_ds(ds2_lsb , Ds2_msb , Ds2_brak , H1_ds_i2 , T2 ) - Error : 248 Line : 117 BYVAL should be used in declaration [[ 1]]
  • Użytkownik usunął konto  
  • Poziom 18  
    Dziękuje za odpowiedź. Z tym, że nie nie można użyć zmiennej typu Bit doszedłem w nocy przeglądając help'a odnośnie Byval i Byref.

    Wstawiłem to trochę z automatu, bo te dane będą wysłane przez RFM12, a w ramach oszczędności zmienna bit stanu czujnika wysyłam jako bajt i mieści mi się osiem czujników w jednym zamiast ośmiu.



    Do Admina: Trochę popuściłem sobie dyscyplinę pisania :) Postaram się poprawić
    Dodano po 3 [godziny] 42 [minuty]:
    Ostatecznie zrobiłem to tak:
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Ale cały czas wynik histerezy jest 43 ( czyli cały czas rośnie ). Założenie było takie, że podaje adres startowy, no i jeszcze poprzednią wartość temperatury w zmiennej typu Integer i po odczytaniu wartości z DS18B20 obliczy histerezę. Niby się zgadza, przed wywołaniem podaję adres ID i poprzednią wartość, czyli
    H1_ds_i = H1_ds_i1

    ale wygląda, jakby tego nie wczytywał

    OK mój błąd - nigdzie nie było warunku zapisu zmierzonej temperatury w Integer do zmiennej ją przechowującej.
  • Poziom 18  
    Jeszcze się zastanawiam, czy nie lepiej będzie zamiast Lsb i Msb odczytanej temperatury pobierać obliczoną wartość przed przecinkiem i po przecinku ?
    Tzn. wynik pomiaru temperatury będzie przesyłany przez RFM12 - chyba prościej będzie mieć gotowe,
    czyli wysyłam:
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    a składam w odbiornikach:
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Tylko będzie problem z ujemną temperaturą.
    Może zrobić to tak, że stan czujnika, ujemną temperaturę i histerezę dać w jednej zmiennej - zmieniać poszczególne bity, a zamiast LSB i MSB podawać wynik od razu w stopniach ?
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    W odbiorniku można to wyświetlić tak:
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    Dodano po 4 [godziny] 25 [minuty]:
    Jednak coś nie tak jest.
    Zrobiłem to tak:
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    i wyniki pomiarów "w bajtach" są dziwne. Wyniki pomiarów w "string", histereza, statusy są OK.
    Poniżej logi z UART:
    Data: 9/4/17
    Czas: 17:17:32
    (-)3,7 °C 0 29.3
    (=)23,6 °C 0 23.6
    (=)0,1 °C 0 25.7
    (+)17,5 °C 0 17.5

    Data: 9/4/17
    Czas: 17:18:14
    (-)3,5 °C 0 29.1
    (=)23,6 °C 0 23.6
    (=)0,1 °C 0 25.7
    (-)17,4 °C 0 17.4

    Data: 9/4/17
    Czas: 17:18:57
    (-)3,4 °C 0 29.0
    (=)23,6 °C 0 23.6
    (=)0,1 °C 0 25.7
    (+)17,5 °C 0 17.5

    I od lewej
    w nawiasie wzrost/spadek temperatury w "string"
    wartość dziesiątek i jedności temperatury w "byte"
    przecinek
    wartość po przecinku temperatury w "byte"
    symbol stopnia
    status czujnika - 0 = OK
    wartość temperatury w zmiennej w "string"

    Najgorsze, że te błędy występują losowo, na początku pierwszy i czwarty czujnik był OK, teraz, drugi i czwarty jest OK
    Dodano po 2 [godziny]:
    Nie rozumiem. Po dwóch godzinach pracy:
    Data: 9/4/17
    Czas: 19:23:8
    (=)23,5 °C 0 23.5
    (=)23,3 °C 0 23.3
    (=)25,5 °C 0 25.5
    (=)13,0 °C 0 13.0


    Data: 9/4/17
    Czas: 19:23:49
    (=)23,5 °C 0 23.5
    (=)23,3 °C 0 23.3
    (=)25,5 °C 0 25.5
    (-)12,9 °C 0 12.9

    Pokazuje jak trzeba.

    Po resecie znowu kicha

    No tak, zapomniałem, że operując na zmiennej typu Integer, zmienne wynikowe MOD i dzielenie też muszą być typu Integer, później można sobie przyrównać do Byte
  • Poziom 16  
    a może po prostu :
    1wiresearchfirst,
    a kolejnym czujniku: 1wiresearchnext.