Ads_700x200

tme

czwartek, 8 września 2011

Fakty i mity n/t rzekomych problemów z obsługą DS18B20

Ostatnio coraz częściej (nie wiedzieć czemu) spotykam się z wrogimi opiniami sugerującymi katastrofalne wręcz problemy gdy zechcemy zrobić obsługę czujników temperatury lub innych urządzeń pracujących na magistrali 1wire a jednocześnie potrzebujemy np obsługiwać multipleksowany wyświetlacz 7-segmentowy LED !!! Ponoć wg tych wszystkich czarnowidzących ludzi, jest tylko jedna metoda, która może wręcz zbawić świat i jednocześnie umożliwić bezproblemową współpracę tych czujników z innymi modułami. Jest nią obsługa 1wire za pomocą sprzętowego modułu UART mikrokontrolera. Owszem, przyznaję, jest to jakaś alternatywa, ale jak dla mnie to tylko alternatywa i tak na prawdę często kiepska. Dlaczego? 




Ano dlatego, że bardzo często obsługę 1wire wplatamy w mikrokontrolerze, który posiada TYLKO jeden moduł UART. Najczęściej bywa tak, że ten moduł bywa też najważniejszy z punktu widzenia wszystkich innych celów i zastosowań. I nawet jeśli miałby leżeć odłogiem nieużywany - to przynajmniej do debugowania programu własnego się przyda. Dlatego gdybym już miał się pokusić o obsługę 1wire przez UART to ew tylko wtedy gdybym akurat używał procka, posiadającego niechcąco 2 UART'y !!!.... Tyle że gdy już biorę taki procek, przeważnie spory to także dwa UART'y przydają się do wszystkiego innego niżby marnotrawić je na obsługę 1wire jeśli nie jest to z jakichś względów konieczne.

Tymczasem owi przeciwnicy obsługi 1wire zarzucają przede wszystkim, że: rzekomo podczas obsługi 1wire na dowolnym pinie mikrokontrolera trzeba wciąż zatrzymywać działanie przerwań rozkazem CLI co powoduje np z marszu poważne zakłócenia w multipleksowanej obsłudze wyświetlaczy LED. Zresztą podobnie marudzą te osoby gdy chodzi o obsługę pilotów w podczerwieni, ona ponoć też takie zakłócenia wprowadza.

A ja na to wszystko mówię BZDURA !!!


  1. jeśli mam procek tylko z jednym UART'em to marnowanie go na 1wire jest jak dla mnie totalną porażką. Zwykle UART jest dla mnie ważniejszy jak nie do debugowania to do jakiejkolwiek komunikacji z otoczeniem, z innym prockiem, z terminalem - przez Bluetooth czy przez kabel - obojętnie 
  2. obsługa za pomocą UART'a i tak wymaga DELAY'ów więc ktoś tu sam sobie zaprzecza 
  3. bo można wykorzystać dowolny pin dowolnego procesora, nawet tego, który nie ma UART'a !!! 
  4. WCALE ANI W ZĄB TYPOWA obsługa 1wire nie koliduje z OBSŁUGĄ WYŚWIETLACZY 7-SEGMENTOWYCH, które są multipleksowane ani z żadnymi innymi przerwaniami w zdecydowanej większości przypadków. 

Tylko trzeba sobie porządnie tą obsługę 1wire napisać i korzystać umiejętnie z cli oraz sei a w zasadzie to nie sei tylko przywracania ustawień rejestru SREG. Przede wszystkim CLI można wykonywać tylko na czas najbardziej krytycznych opóźnień, które są w obsłudze 1wire na tyle krótkie że wręcz pomijalne. Proszę bardzo poniżej film z działania na jednym procku AVR


  • obsługi 1wire - akurat tylko 1 czujnik DS18B20 miałem pod ręką 
  • wyświetlacza 4 pozycyjnego 7segm (odświeżanie 200Hz) 
  • obsługa LCD 
  • Nie widać na filmie ale działa w tle także BEZ PROBLEMÓW, komunikacja przez UART z terminalem na PC 

czy coś migocze na wyświetlaczu LED ???
czy są jakieś błędne odczyty temperatury?
czy zakłóca się praca LCD?
czy zakłóca się działanie UART ??? tego nie widzicie ale podpowiadam że NIE

dodam, że jednocześnie jeszcze obsługuję odbiornik podczerwieni TFMS i też nadal NIC A NIC się nie kłóci.

więc o czym w tych tematach np na elektrodzie ostatnio wszystkim chodzi? bo wciąż widzę, że obsługa 1wire bez udziału UART'a jest już prawie odżegnana od wiary.

Uważam, wprawdzie, że obsługa 1wire przez UART może się przydać ale jeśli mam akurat dwa UARTY w procku i drugi leży odłogiem - to z nudów bym może tak zrobił albo wtedy gdyby mi rzeczywiście zaczęło przeszkadzać coś w projekcie. Tylko nie wiem jak on by musiał być rozbudowany. 





Jeśli chcecie się dowiedzieć jak to zrobić i nie namęczyć się jeśli chodzi o pisanie kodu ??? pytaj - "kto pyta nie błądzi" ;)



25 komentarzy:

  1. "Jeśli chcecie się dowiedzieć jak to zrobić i nie namęczyć się jeśli chodzi o pisanie kodu ??? pytaj - "kto pyta nie błądzi" ;)"

    Chętnie na Pańskim blogu zobaczył bym taki kod z profesjonalnym komentarzem najlepiej z 2 czujnikami, bo te czujniki są bardzo popularne.

    Pozdrawiam

    OdpowiedzUsuń
  2. Ale ja już to już raz i to bardzo obszernie, wraz bogatymi komentarzami do kodu a także wyjaśnieniami na kilkunastu stronach, opisałem.

    Nie chciałbym tego teraz powielać, ale w książce "mikrokontrolery AVR Język C Podstawy programowania" znaleźć można rozdział:

    8.4 Wstęp do systemów czasu rzeczywistego, który zajmuje strony od 395 do 417 (jest więc tego trochę)

    W rozdziale tym jest bardzo ale to bardzo dokładnie opisane jak w jednym procesorze połączyć pracę następujących modułów:

    1. Wyświetlacz LED - czas - godziny i minuty
    2. Obsługa RTC (PCF8583) po I2C
    3. Pomiar temperatury na DS18B20
    4. Obsługa wyświetlacza LCD
    5. Łączność RS232 z terminalem na PC
    6. Obsługa pilota podczerwieni !!! (RC5)
    7. Obsługa kilku klawiszy microswitch (super)
    8. Niezależne migotanie 2 diod LED 2Hz oraz 5Hz

    czy można oczekiwać jeszcze czegoś więcej ???

    Dodam, że absolutnie cały i gotowy kod do tego ćwiczenia można znaleźć na dołączonej do książki płycie DVD, żeby nie trzeba było tego przepisywać.

    Ale to nie jedyny ciekawy rozdział w tej książce, proponuję poczytać opinie czytelników o niej na dole strony:

    www.atnel.pl/wydawnictwo

    Gorąco polecam !

    OdpowiedzUsuń
  3. Właśnie zawsze mnie dziwiło ze tak wiele ludzi ma problemy z 1Wire i multiplexem LED. Jakoś nigdy nie miałem problemu z obsługą i nigdy nic nie kolidowało ze sobą i też uważam ze marnowanie uarta to totalna porażka w przypadku gdy mozna go przecież lepiej użyć. Jak wiesz Mirku ja uarta zawsze mam luźnego w swoich projektach bo sie przydaje do wielu rzeczy. Ale myslę ze takie właśnie stereotypy o obsłudze 1Wire biorą się z braku wiedzy i umiejetnosci programowania oraz braku znajomości protokołów transmisji i portów mikrokontrolera, chyba to sie bierze z bascoma gdzie mało kto zaprząta sobie głowę jak to działa poprostu sciaga kod z neta i nieudolnie go przerabia :) nie Bascom zdecydowanie wprowadza wiele złych nawyków, a z kolei w C trzeba już pomysleć jak rozwiazac obsługę samemu:)

    OdpowiedzUsuń
  4. No właśnie, ja podobnie zwykle trzymam UART'a zawsze na wszelki wypadek, ale ten cały mój wpis tutaj powstał ze względu na jakąś nową modę ostatnio na elektrodzie. Gdzie sporo osób zaczyna płakać jakoby obsługa 1wire przez UART była JEDYNIE SŁUSZNĄ DROGĄ ;) ... jak dla mnie bzdura jakich mało. A argumentem tych ludzi zwykle jest to, że przecież są procki, które posiadają więcej UART'ów - zatem jeśli mam wg nich robić obsługę 1wire to kurczę powinienem sobie od razu planować zamiast jakiegoś małego ATtiny - dużą ATmegę z 2 UART'ami. To jest dopiero bzdura ;) .... Zastanawiam się skąd ta nowo-moda się wzięła? Bo ja osobiście nie mam nic przeciwko zorganizowaniu 1wire przez UART gdy rzeczywiście leży jakiś odłogiem. Ale tak jak ty właśnie piszesz - bardzo często UART leży u wielu osób odłogiem bo nie wiedzą po prostu jak go zagospodarować ....

    OdpowiedzUsuń
  5. Może trzeba będzie napisać coś porównawczego.
    Porównać protokoły transmisji, opisać co i dlaczego działa tak a nie inaczej. Tak by po prostu zwłaszcza młodzi czytacze elektrody i nie tylko przestali wpadać w paranoję UARtowania 1-Wire , aż strach pomyśleć co będzie jak zaczną używać 2-wire - pewnie 2 uarty będą potrzebne :)

    OdpowiedzUsuń
  6. Użycie UART'u jako możliwości obsługi transmisji 1-wire, wzięło się z noty aplikacyjnej Dallas'a. I to opublikowanej juz w latach 90'tych. A głównie chodziło tam o możliwość komunikacji pomiędzy DS1820, a komputerem PC - za pomocą portu szeregowego PC'ta.
    Przy okazji okazało się, że można takiej komunikacji użyć w przypadku mikrokontrolera wyposażonego w UART i tym samym przerzucić obsługę czasów potrzebnych w tej transmisji na "sprzętówkę" UART'u.
    Jednakże - jak kolega wyżej wspomniał sam protokół transmisji 1-wire jest dosyć elastyczny (podobnie zresztą jak i niektóre inne protokoły). Posiada bardzo sympatyczną cechę - a mianowicie to, że czasy wstrzymania pomiędzy poszczególnymi bitami transmisji mogą być dowolnie długie. To daje możliwość przeplatania czasu procesora z innymi zadaniami równolegle.

    OdpowiedzUsuń
  7. mirekk36, mogę zapytać gdzie ten obszerny opis kodu się znajduje?

    OdpowiedzUsuń
    Odpowiedzi
    1. Oczywiście że możesz zapytać - już podaję gdzie można znaleźć nie tylko kody ale dokładne opisy jak sobie z tym radzić, tutaj:

      http://atnel.pl/mikrokontrolery-avr-jezyk-c.html

      Usuń
  8. Witam.
    Ja chciałbym zapytać, czy ustawienie 2 pinów mikrokontrolera do pracy 1wire na podstawie bibliotek z książki byłoby dużym problemem? Sam niestety niezbyt widzę jak to zrobić bez kopiowania ich, a może Pan już próby takie podejmował.
    pozdrawiam
    M.

    OdpowiedzUsuń
    Odpowiedzi
    1. ale po co takie kombinacje ? przecież magistrala 1wire została stworzona właśnie po to aby działać na jednym pinie procka i to się sprawdza znakomicie. Proszę mi podać cel - żebym mógł to zrozumieć albo podpowiedzieć dlaczego tak nie warto.

      Usuń
    2. może dla tego aby bez problemu wymienić czujnik , jak mamy 1 czujnik na 1 pine to proste . Nie trzeba zapamiętywać id itd

      Usuń
    3. To jest także proste dla wielu czujników na 1 magistrali ;) jak ukaże się mój poradnik video na ten temat to zobaczysz ;) to tylko kwestia odpowiedniego podejścia

      Usuń
    4. Witam.
      też mam problem z odczytem w odpowiedniej kolejności po 1-wire
      oraz z wymianą konkretnego czujnika na inny tak aby zostały przypisane wedle wyboru przez użytkownika do urządzeń
      piszę na Arduino ale odczytanie kodu z Eclipsa nie powinno sprawić mi kłopotu
      pomocy

      Usuń
    5. Jak masz problem to zajrzyj do książki:

      http://atnel.pl/mikrokontrolery-avr-jezyk-c.html

      zostaw zabawę w arduino i zacznij normalnie programować w C, wtedy zaczniesz dużo więcej rozumieć. A z książką o której mówię na pewno dasz radę ;)

      Usuń
    6. przepraszam Mirku ale to mój jednorazowy projekt
      nie mam zamiaru z tego względu kupować książki, chociaż ??
      dużo oglądam Twoich filmików na youtubie i jestem pod wrażeniem Twoich umiejątności
      szukam w necie już jakiś czas i nic myślałem , że Ty coś pomożesz

      Usuń
    7. Ja ciebie nie namawiam na siłę do kupowania książki. Tym bardziej jeśli to jednorazowy projekt. To przestań w ogóle o niej nawet myśleć ;) Po co ci to ? Im mniej człowiek wie tym mniej pomysłów na nowe projekty przychodzi do głowy ... tak to już jest. Więc po co sobie głowę pomysłami zawracać gdybyś przypadkowo dzięki książce nauczył się porządnie programować prawda ? ;)

      Tymczasem jakiej pomocy ode mnie oczekiwałeś ? w Arduino ? a co ja mam wspólnego z Arduino hmmm ? Nie znam KOMPLETNIE arduino, nigdy - uwierz mi nawet jednej linijki kodu nie napisałem w arduino i nigdy nie miałem okazji kupić żadnej płytki andruino. Nie wiem dlaczego ludzie czasem (podobnie kak ty) ... piszą do mnie z prośbą o pomoc w arduino - a jak polecam książkę to się złoszczą ;) ... Ja też mógłbym się zezłościć że zadają mi dziwne pytania o andruino ... ale się nie złoszczę.

      Dlatego odpowiedź jest krótka interesuje cię Arduino to proszę popytaj kogoś innego bo ja uczę języka C ok ? A jak kiedyś zrozumiesz, że warto jednak uczyć się C i że straciłeś niepotrzebnie sporo czasu na Arduino - to wtedy zapraszam - nie ma sprawy. Ale też nie myśl, że z moich poradników wideo można się wprost nauczyć programować w C. Nie - a to dlatego, że ja tworzę poradniki jako uzupełnienie do moich książek, dopiero wtedy to łącznie - daje rewelacyjne rezultaty i to nie jest moja opinia tylko setki opinii czytelników i widzów.

      Jeśli zaś nie lubisz książek - no to sorki ale już kompletnie nie mam jak tobie pomóc. Bo np w tej książce do której link podałem znalazłbyś od razu odpowiedzi nie tylko na to jedno swoje pytanie które tu zadałeś ... ale także na wiele innych

      Usuń
    8. ///////////////////////////////////////////////////////////////////////////////////////

      for (int8_t i = val1 * 10; i < (val1 * 10 + 10); i++) {
      if (i >= il_czuj_znal) break;
      if (znacznik == i) FTImpl.ColorRGB(0xFFFF00);
      else FTImpl.ColorRGB(0x00FFFF);
      FTImpl.Cmd_Text(5, (i - val1 * 10) * 15, 18, 0, address_char[i]);
      }
      FTImpl.ColorRGB(0x00FFFF); // Ustawiamy kolor (R,G,B)
      for (int8_t i = val2 * 10; i < (val2 * 10 + 10); i++) {
      if (i >= il_czuj_znal) break;
      FTImpl.Cmd_Text(255, (i - val2 * 10) * 15 , 18, 0, address_char_zap[i]);
      }




      to mój kod w Arduino
      Powiedz chociaż czy zmierzam w dobrym kieunku

      Usuń
    9. Aleś ty uparty jak .... nie powiem kto. I co jak ci po raz ENTY odpowiem, że nie znam się na arduino i na tym co tu popisałeś to obrazisz się ? ... hmmm a może i dobrze jak się obrazisz ;) to w końcu będę miał spokój z takimi pytaniami o arduino i to jeszcze kod źródłowy na blogu - jakaś masakra. Idź ty zwróć się do kogoś kto zna arduino ok ? Proszę cię.

      Usuń
    10. ok
      nie miałem zamiaru prosić o pomoc w arduino tylko o naświetlenie sprawy odczytu i przypisania konkretnego czujnika do konkretnego urządzenia , a jest ich około 30, czy wymiany takiego czujnika
      bez uprzedniego sczytywania adresów po 1 sztuce.
      Panie Mirku, chociaż tak jak się Pan zna. proszę.
      P.S.
      Mało kiedy się obrażam o coś.

      Usuń
    11. //mirekk363 grudnia 2013 20:27
      //
      //To jest także proste dla wielu czujników na 1 magistrali ;) jak ukaże się mój poradnik //video na ten temat to zobaczysz ;) to tylko kwestia odpowiedniego podejścia

      Kurcze, no nawet tego video nie mogę znaleźć

      Usuń
    12. Dziękuję Malkontentom

      Usuń
    13. piszesz tak, ale do enkodera kod potrafiłeś zgolić z arduino

      powodzenia życzę w plagiacie

      tak w ogóle to dzięki za pomoc

      Usuń
    14. hahahaha ;) plagiacie ;) a znasz ty w ogóle znaczenie słów którymi się posługujesz ? Widzę, że masz z tym poważne problemy a przecież wystarczyłoby gdybyś sobie w googlu wpisał słowo "plagiat" .... Ale spokojnie na tym się znam ... podpowiem ci, że jest sobie taka stronka:

      https://pl.wikipedia.org/wiki/Plagiat

      a na niej sam początek definicji, cytuję:

      "Plagiat (łac. plagium, kradzież) – pojęcie z zakresu prawa autorskiego oznaczające skopiowanie cudzego utworu (lub jego części) wraz z przypisaniem sobie prawa do autorstwa poprzez ukrycie pochodzenia splagiatowanego utworu"

      Więc posłuchaj baranku boży ;) ... ponieważ ja sam tworzę wiele swoich własnych kodów czy innych prac to zależy mi na przestrzeganiu praw autorskich, dlatego sam ich BEZWZGLĘDNIE przestrzegam ...

      Gdy w swoich poradnikach omawiam jak przerabiać biblioteki z arduino a widzę, że tylko na jeden z kilku przykładów trafiłeś ominęły cię widzę poradniki o wyświetlaczach OLED gdzie pokazywałem również jak rozpruwać biblioteki z Arduino żeby w czystym C sobie je napisać ...

      Tyle że dla ciebie to jedno i to samo. Jakby ci ktoś pokazał cep i młocarnię to pewnie też byś powiedział, że to samo ;)

      No i dokładnie na tej samej zasadzie w nerwach bredzisz o plagiacie ;) Gdybym baranku boży ukrywał to że robię coś w oparciu o biblioteki arduino, gdybym podpisywał się pod takim kodem i mówił że to moje i go sprzedawał czy rościł sobie prawa do niego to wtedy mógłbyś użyć takiego słowa gdybyś znalazł chociażby podobieństwa w kodzie.....

      Ale ja baranku boży - mam taki cel aby pokazać tym, którzy chcą się nauczyć języka C (w przeciwieństwie do ciebie) ... że można korzystać z wiedzy społeczności Arduino którą cenię za to, że tworzy tyle i to otwartych kodów ... dzięki temu inni mogą się uczyć - a ja im pomagam - pokazując jak łatwo przenieść się z Arduino na C .... Tylko ty jakiegoś zatwardzenia dostałeś ;) a teraz proszę jeszcze focha, nerwa i zaczynasz bredzić o plagiatach



      Usuń
  9. Pomocy - właśnie zaczynam zabawę z AVR i mam problem właśnie z miganiem 3-pozycyjnego wys LED - WK :). Używam Atmegi8 (8MHz) wszystko zapakowałem do przerwania dobrze działa tylko mruga ~/1s :D.
    Mój kod:
    ISR(TIMER2_COMP_vect)
    {
    //tykniecia co 5ms -> 200 tykniec = 1s

    cnt++;
    if(cnt==1) DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL);
    static uint8_t licznik=1;
    KATODY_PORT=licznik;
    if(licznik==1) {DATA_PORT=tablica[cy3];}//PC0 //dziesietne czesci
    else if(licznik==2) {DATA_PORT=tablica[cy2]|(1<4) licznik=1; //jesli wiekszy niz 4 to wraca na poczatek zeby krazylo 001 -> 010 -> 100 itd
    if(cnt==199)
    {
    if(DS18X20_OK==DS18X20_read_meas_single(DS18B20_ID, &subzero, &cel, &cel_frac))
    {
    cy1=cel/10;//dziesiatki
    cy2=cel%10;//jednosci
    cy3=cel_frac;//ulamek
    cnt=0;//zeruj licznik tykniec
    }
    else
    {
    cy1=cy2=cy3=0;//jako blad
    }

    }
    }
    Nie mogę na razie wpaść na nic sensownego co by to mogło powodować, przy Int Osc 1MHz było tak samo stwierdziłem, że może odczyt z DS'a za długo zajmuje i stąd miganie, ale przy 8Mhz jest tak samo. Jakieś pomysły?

    OdpowiedzUsuń
    Odpowiedzi
    1. Wszystko do przerwania ???

      Myślę że zacznij od Bluebooka

      http://atnel.pl/mikrokontrolery-avr-jezyk-c.html

      ale nie zatrzymuj się w nim w jednym miejscu tylko przeczytaj do końca a SZCZEGÓLNIE rozdział

      "Wstęp do systemów czasu rzeczywistego"

      poczytaj - poćwicz a zobaczysz że zrobisz - bo to co tu wymyśliłeś ... hmmm no jest delikatnie mówiąc mocno nieteges

      ... timery programowe panie, zainteresuj się tym w książce

      Usuń