Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Pomiar temp. Ds18b20 -jak skrócić program?

04 Mar 2012 00:03 2983 24
  • Level 17  
    Witam. Posiadam Atmege644p i pisze program do sterowania domem. Potrzebuję 12 czujników temp. Z powodu braku miejsca w pamięci musiałem się ograniczyć już do 11.
    Aby poprawnie to wszystko działało napisałem to w ten sposób. Może ktoś ma pomysł rozwiązać to w inny dużo krótszy sposób.
    Code: basic4gl
    Log in, to see the code

    ' w tym miejscu jest najwiekszy problem z ilością pamięci...
  • Level 42  
    ATmega644p (64kB Flash!) i brak pamięci programu ???? A rozważał kolega tak na poważnie przejście na język C ? w którym taką obsługę i to większej ilości czujników można byłoby zmieścić w ATmega16. (Bo to na 100% będzie jeden ze sposobów żeby napisać dużo krótszy program i mieć obsługę nawet 30 czujników)

    Jeśli zaś zamierzasz dalej męczyć się w Bascomie to pierwsze co zrób to od razu zrezygnuj z tych readeeprom i zobacz w helpie jak stosuje się DIM zmienna AS ERAM .....

    Zastosuj pętle programowe a nie takie pisanie programu linia po linii bo tym sposobem to nawet jeśli powstanie procek ATmega1280000 który będzie miał 1MB Flash - to też nie wiadomo czy zmieścisz program :(
  • Level 31  
    64kb brakło na 12 DS-ów ? Ja zrobiłem termometr na 8 DS-ów z wykresami , liczeniem średniej na liczbach "single" , zapisem do eproma i kilkoma drobiazgami wszystko to na lcd graficznym i zajęło mi 7,38kb w Bascomie .
    Czy wykorzystujesz wszystkie nogi procka ? Ja podłączyłem DS-y do osobnych wyjść , procedurę pomiaru temperatury mam jedną , zmieniam tylko porty . Dla każdego DS-a powtarzasz :

    If Ilosc_ds >= 3 Then

    1wwrite Read_scratchpad
    Lsb = 1wread()
    Msb = 1wread()
    T = Msb * 256
    T = T + Lsb
    T = T / 16
    If Msb.7 = 1 Then T = T - 4096
    Ss = Fusing(t , "#.#") 's-string
    Ss = Format(ss , "+00000")

    to naprawdę zajmuje kupę miejsca !!!
  • Level 17  
    Panowie zamuje się bascomem od 2 miesięcy. Z pamięcią jest krucho ponieważ obsługuje też elektrownie wiatrową itd. Podam menu jakie mam w ustawieniach:
    Code: jezyk_programowania
    Log in, to see the code


    Na dzień dzisiejszy wyrzuciłem 1 czujnik i pozostało 11 a pamięci zajęte 86%.
    Pozostało mi jeszcze zrobić cały zapis na SD.:(Masakra
    Koledzy z tym odchudzeniem to ciężko mi idzie. Kolega mi podpowiedział że mógłbym zamiast readeeprom sastosować dim xxx as eram ale jest problem ponieważ na eram nie mogę obsługiwać zmiennych i musiałbym dokładać kolejne. No nie wiem może coś źle robię.
  • Level 31  
    Czy wykorzystujesz wszystkie wyjścia uP ?
  • Level 42  
    seba_x wrote:
    Czy wykorzystujesz wszystkie wyjścia uP ?


    Przecież wykorzystywanie wszystkich wyjść procesora do obsługi iluś tam czujników 1wire to po prosu totalnie nieporozumienie. To po co jest magistrala 1wire ? Takie podejście marnuje nie tylko piny procesora, wypacza ideę 1wire ale też wcale nie uczy programowania i na dodatek zajmuje więcej miejsca.

    O wiele prościej i wygodniej korzysta się programowo gdy wiele czujników obsługiwanych jest tak jak się należy przy 1wire na 1 pinie mikrokontrolera.
  • Level 31  
    Niby tak , ale jak padnie jeden czujnik to podmieniam u siebie i po kłopocie a u niego bez ingerencji w program się nie obejdzie.
    Jeśli jednak nie wykorzystuje wszystkich pinów to może spróbować zrobić tak jak proponowałem , jest to jedno z rozwiązań , czy dobre ? to pawelec5 sam zdecyduje .
  • Level 37  
    Sztuka polega na tym ,żeby z programu wyciągać części powtarzające się i wywoływać je ze zmiennymi parametrami . Tworząc takie uniwersale makra skracamy kod wynikowy czym dłuższe jest makro i wielokrotność jego powtarzania w kodzie programu tym większa oszczędność pamięci mikrokontrolera . W Twoim kodzie można takich wspólnych kawałków znaleźć wiele. Kolejną rzeczą jest wybór języka w którym pisany jest program języki "wyższego poziomu" pozwalają szybciej pisać program mniej zaawansowanemu programiście używając bardziej uniwersalnych poleceń lecz w konsekwencji otrzymujemy dłuższy i wolniejszy kod wynikowy.
  • Level 17  
    Koledzy miałem ochotę zrobić te DS na kilku kanałach ale okazało się że na 1wire jest możliwość podłączenia sporo więcej czujników.
    Działa to w następujący sposób.

    Po podłączeniu 1 Ds zapisuje go w pamięci pod wskazaną nazwą
    Po podłączeniu kolejnych sprawdza poprzednie gdzie już były zapisane a nowy jeżeli nie podporządkuje do żadnej to zapisuje jako nową itd.

    Utworzyłem ten temat ponieważ szukam pomocy jak skrócić program. Najwiecej zajmuje uporządkowanie Ds.

    Ktoś polecał mi eram zamiast readeeprom ale musiałbym dokładać kolejne zmienne a program tak czy tak byłby długi. Chyba że się mylę.

    kolega kamyczek napisał

    Quote:

    Tworząc takie uniwersale makra skracamy kod wynikowy czym dłuższe jest makro i wielokrotność jego powtarzania w kodzie programu tym większa oszczędność pamięci mikrokontrolera. W Twoim kodzie można takich wspólnych kawałków znaleźć wiele.


    Nie proszę nikogo o gotowca tylko ewentualny przykład lub wzór jak to krócej zrobić. Dzięki
  • Level 42  
    pawelec5 wrote:

    Ktoś polecał mi eram zamiast readeeprom ale musiałbym dokładać kolejne zmienne a program tak czy tak byłby długi. Chyba że się mylę.


    Masz rację mocno się mylisz, tym bardziej że to co robisz za pomocą readeeprom czy writeeeprom to to samo co dim as eram tyle że w sposób na piechotę i pod górkę i to mocną górkę.

    pawelec5 wrote:
    Koledzy miałem ochotę zrobić te DS na kilku kanałach ale okazało się że na 1wire jest możliwość podłączenia sporo więcej czujników.


    To się nagle nie okazało, to jest podstawa i ja od początku ci o tym piszę....
  • Level 17  
    Kolego mirek36 podaj jakiś przykład jak to wykonać na dim eram. Próbowałem ale... coś mi nie poszło.

    Po pierwsze to wyskakiwał błąd gdy zmienna eram chciałem jakoś wykorzystać. Doczytałem że nie można z niej korzystać jak z innej zmiennej.

    eram
    dołożone nowe zmienne:
    Code: jezyk_programowania
    Log in, to see the code

    zmieniony program z dołożonymi zmiennymi i usuniętym readeeprom ,writeeeprom. Czy o to chodzi?
    Code: jezyk_programowania
    Log in, to see the code

    Dużo roboty przy zmianie a nie wiem jakie korzyści. Dodam że ustawienie 11 Ds zajmuje 270 wierszy:(
  • Level 42  
    pawelec5 wrote:
    Kolego mirek36 podaj jakiś przykład jak to wykonać na dim eram. Próbowałem ale... coś mi nie poszło.


    A co to znaczy "coś mi nie poszło" ??? - no jak można tak opisywać swój problem i oczekiwać podpowiedzi? zupełnie nie rozumiem takiego podejścia na forum.


    pawelec5 wrote:
    Po pierwsze to wyskakiwał błąd gdy zmienna eram chciałem jakoś wykorzystać.


    No pewnie pisz tak dalej to wszyscy rzucą ci się na pomoc, "próbowałem to jakoś wykorzystać" SUPER określenie - ale już przykład podać - aaa tam, po co?

    pawelec5 wrote:
    Doczytałem że nie można z niej korzystać jak z innej zmiennej.


    Wiesz co ? ja się zastanawiam gdzie ty czytasz o tym Bascomie ? bo coś chyba jest mocno nieteges, skoro nie wiesz co znaczy słówko DIM w Bascomie (Basicu) - szok!

    To myślisz, że jak można z tego skorzystać jeśli nie jako ze zmiennej ?

    pawelec5 wrote:
    Dużo roboty przy zmianie a nie wiem jakie korzyści.


    No to może lepiej nic nie robić i będą pewne korzyści - np poszukiwanie procka z 1MB FLASH!

    pawelec5 wrote:
    Dodam że ustawienie 11 Ds zajmuje 270 wierszy:(


    A zastanawiałeś się kiedyś ile wierszy zajmie ci cały program ? Ciekawy jestem po ilu do ciebie dotrze, że z pewnymi projektami to jednak warto pomyśleć o innym języku niż Bascom. Chociaż z drugiej strony - jeśli ty korzystasz z Bascoma, masz do niego HELP'a gdzie opisane i podane są przykłady z DIM AS ERAM - a ty czytasz hmmm gdzieś nie wiadomo gdzie, to w zasadzie to żadna różnica jaki język programowania.
  • Level 37  
    Proponuje temat przemyśleć od nowa narysować schemat blokowy programu i dokonać analizy ,jak każdy blok rozwiązać tak ,żeby zajmował mało pamięci i był uniwersalny. Może w przypadku kolegi warto się zastanowić nad przesiadką na magistralę RS485 i realizację czujnika jako inteligentnego modułu ,który zawiera taki czy inny czujnik temperatury i mikrokontroler przetwarzający wynik jego działania na bardziej wygodny przekaz. Kolega Mirekk36 sprowadza wszystko do C i swojej książki moje zdanie jest takie jeśli kolega Pawelec5 nie radzi sobie z napisaniem tego programu w bascomie będzie miał taki sam kłopot w napisaniu go w C o asemblerze już nie wspomnę . Mikrokontroler którego kolega używa ma 64KB flash ,4KB sram i 2kB eeprom to sporo , ale zawsze może zrobić przesiadkę na atmegę 1284 ,która ma 128kB flash , 16kB sram i 4kB eeprom do tego oba układy są zgodne wyprowadzeniami i obudową . Problem wielu początkujących programistów używających języków "wysokiego poziomu" jest pisanie programu w sposób humanistyczny i opisowy wynika to braku znajomości architektury układów i dzialania wielu rozkazów i bibliotek i realizację projektu o całkowicie błędne założenia.
  • Level 42  
    kamyczek wrote:
    Kolega Mirekk36 sprowadza wszystko do C i swojej książki .


    Te, kolego, a białych myszek (nie mówię o tych komputerowych) to ty czasem nie widujesz ? ;) Piszę tu o rozwiązaniach w Bascomie: DIM AS ERAM - więc puk puuuk - obudź się chłopie i zacznij trzeźwo myśleć.
  • Level 17  
    Kolego mirekk36!!!

    Przestań pisać w sposób obraźliwy. Nic konkretnego się od Ciebie nie dowiedziałem oprócz przechwalań. Założyłem post by się czegoś dowiedzieć a nie wyczytywać Twoich przechwalań. Jestem początkującym i chciałbym się czegoś nowego dowiedzieć a Ty wcale nie pomagasz. Jeżeli nie masz ochoty pomóc to prosze nie pisz takich postów.

    Kolega kamyczek bardzo mądrze napisał a Ty Go od razu skrytykowałeś.

    Kolego kamyczek.
    Oczywiście że zastanawiałem się nad Atmegą 1284p tylko od razu wystąpił problem z bootloaderem. Akurat ta firma co się z nią skontaktowałem posiada 1284p ale bez bootloadera. Może jak posiedzę trochę nad tym wszystkim to będzie lepiej. Jak narazie to trochę posiędzę po pracy i tyle.
    Czy sobie radzę czy nie? Hmmm... Mój program liczy 5600 wierszy w bascomie i działa według oczekiwań. Tylko musiałem zlikwidować jeden czujnik żeby zaoszczędzić trochę miejsca na dokończenie programu. Jeszcze rodzą się nowe pomysły ale juz nie bardzo mam gdzie je upchnąć. Dlatego chciałem się dowiedzieć czy jest jakaś możliwość skrócić program odnośnie Ds pokazany na początku.
  • Level 38  
    Musisz się przyzwyczaić.

    Nie czytałem całego wątku, ale puszczenie 12 termometrów + wyświetlacza (o ile takowy jest) i nie zmieszczenie tego w 64kb naprawdę źle świadczy o napisanym programie. Taki program można zmieścić w 4kb albo nawet i mniej. Jeżeli termometry są wpięte szeregowo, to nie wiem naprawdę w czym tkwi problem, jeżeli są na różnych portach to trzeba napisać jedną procedurę/funkcję, czy co to tam jest w bascomie (nigdy nie pisałem w nim, ale programowanie nie ogranicza się do języka), która przyjmuje parametry z numerami pinów/portów na których się znajdują i program się skróci 10 razy.
  • Level 17  
    Program obsługuje całą kotłownię, solara, elektrownie wiatrową i zapis na SD.
    Czujniki DS są na 1wire. Program się niesamowicie wydłużył przez to żeby konkretny czujnik odpowiadał konkretnemu urządzeniu. Tu mnie boli.

    Code: jezyk_programowania
    Log in, to see the code
  • Level 37  
    Kolego pawelec5 proszę zwrócić uwagę że w programie masz kilkanaście jednakowych bloków zaczynając od bloków takich jak ten :

    Code:
    Select Case Ds_10
    
                        Case Ds_eeprom_solar                     ': Print #1 , " Ds_10 jako solar"
                       Case Ds_eeprom_bojler                    ': Print #1 , " Ds_10 jako bojler"
                       Case Ds_eeprom_salon_podl1               ': Print #1 , " Ds_10 jako salon_podlogowka"
                       Case Ds_eeprom_salon                     ': Print #1 , " Ds_10 jako salon"
                       Case Ds_eeprom_piec                      ': Print #1 , " Ds_10 jako piec"
                       Case Ds_eeprom_temp_zew                  ': Print #1 , " ds_10 jako temp. zew"
                       Case Ds_eeprom_zas_podl                  ': Print #1 , " ds_10 jako zas-podl"
                       Case Ds_eeprom_kuch_podl                 ': Print #1 , " ds_10 jako kuch-podl"
                       Case Ds_eeprom_laz_1_podl                ': Print #1 , " ds_10 jako laz_1-podl"
                 Case Else : Ds_eeprom_laz_2_podl = Ds_10
    '                              Print #1 , "ds_10 jako laz_2-podl."
                                  Writeeeprom Ds_eeprom_laz_2_podl , 200


    Można z niego zrobić procedurę wywoływaną z różnymi parametrami . Kolejną rzeczą jest cały program odczytu i konwersji wskazań czujnika 1wire ,który można też zapisać tylko raz i wywołać z różnymi parametrami ( adresem czujnika ) następnie wynik konwersji zwrócić i zapisać tam gdzie trzeba .
  • Level 17  
    I udało się. skróciłem jak narazie sam odczyt temp.

    Tak było:

    Code: jezyk_programowania
    Log in, to see the code


    A teraz:

    Code: jezyk_programowania
    Log in, to see the code


    Będę walczył z dalszymi pętlami.

    Dodano po 1 [godziny] 45 [minuty]:

    Kolejny udany skrót:

    Code: jezyk_programowania
    Log in, to see the code


    Dzięki koledzy.
  • Helpful post
    Level 37  
    Ten listing wygląda znacznie lepiej, nie jest to może arcydzieło, ale działa i mieści się w mikrokontrolerze, który kolega wybrał, więc gratuluję . Można jeszcze popracować i coś tam wyciąć dla własnej satysfakcji, ale nie zmienia to faktu, że kolega samodzielnie na podstawie wskazówek kolegów dokonał udanej modyfikacji kodu programu, więc gratuluję ;)
  • Level 17  
    Koledzy kontynuując temat chciałem prosić o pomoc w zapisie temperatur na karcie SD.


    Źródło programu mam ze strony producenta płytki testowej

    Wyskakuje mi jakiś błąd i nie wiem co on oznacza.
    Nie mogę znaleźć kodów tych błędów.
    Pomiar temp. Ds18b20 -jak skrócić program?

    Może teraz po koleji:

    Po sformatowaniu karty w formacie fat i uruchomieniu programu do sprawdzania karty jest ok
    Pomiar temp. Ds18b20 -jak skrócić program?

    Ale po wgraniu programu do dopisywania pliku:
    Pomiar temp. Ds18b20 -jak skrócić program?

    treść karty wygląda następująco:
    Pomiar temp. Ds18b20 -jak skrócić program?

    Czyli zapis był wykonany tylko raz:(

    Po kolejnym włożeniu karty do Atmegi i próbie zapisania pojawia się znowu komunikat błędu:(
    Pomiar temp. Ds18b20 -jak skrócić program?
  • Level 17  
    Problem rozwiązany. Okazało się że był problem ze stosem. Podprogram do zapisu musiałem wrzucić do głównej pętli. Dzięki za pomoc.