logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

AT89C2051 i DS18B20 - wykrywa tylko 2 z 7 termometrów na 1-Wire, co robić?

Marcin J. 01 Sie 2007 15:36 10176 22
REKLAMA
  • #1 4135850
    Marcin J.
    Poziom 11  
    Posty: 32
    Ocena: 1
    Witam wszystkich na forum.
    Buduje układ który miałby sprawdzić ile urządzeń podłączonych jest do magistrali 1wire (termometry ds18b20) i wyświetlałby kolejno odczytane temperatury.

    Do rzeczy, problem tkwi w tym ze mój atmel po wykonaniu instrukcji :

    1wreset
    Il = 1wirecount()

    zawsze znajduje max. 2 termometry nie zależnie od tego ile jest podłączonych. Każdy sprawdzony z osobna jest sprawny.

    To może sie przydać :
    at89c2051 , ds18b20 , kwarc 12MHz , bascom 2.0.12.0 Serial DEMO

    Czy ktoś spotkał sie z czymś podobnym?
    Chciałbym podłączyć około 7 ds-ów do jednej nóżki portu.
  • REKLAMA
  • #2 4137985
    Paweł Es.
    VIP Zasłużony dla elektroda
    Posty: 6981
    Pomógł: 1236
    Ocena: 692
    A te termometry jak są podłączone: z własnym zasilaniem (+5V na Vdd) czy też zasilanie z linii danych ?
  • #3 4138089
    Marcin J.
    Poziom 11  
    Posty: 32
    Ocena: 1
    Termometry podłączone 3 przewodami czyli +5V, GND oraz magistrala 1wire.
  • #4 4140040
    Michał_z1
    Poziom 16  
    Posty: 190
    Pomógł: 13
    Ocena: 2
    Witam.
    A czy podciągnołeś linię danych o VCC przez opornik 2,2k.....4.7k ??
    pozdrawiam.
  • #5 4141822
    Marcin J.
    Poziom 11  
    Posty: 32
    Ocena: 1
    Witam, linia danych podciągnięta przez rezystor 4,7k do +5V.

    Wszystko zmontowałem na nowej płytce i dalej ten sam efekt. Dwa termometry działają bez problemu większej ilości nie widzi.

    Czy ktoś próbował podłączyć więcej niż 2 ds-sy do AT89C2051?
    Jakie były efekty?
    Może jest potrzebna jakaś dodatkowa elektronika?
    Czy ten układ obsłuży 30 metrowy kabel?

    Poniżej krótki program jaki napisałem do sprawdzania:

    'program obslugujacy sondy
    $crystal = 12000000
    'konfiguracja sprzetu
    Config 1wire = P1.4
    'zmienne
    Dim Il As Byte , I As Byte
    'program glowny
    Waitms 100
    'sprawdza ile podlaczonych czujnikow
    1wreset
    Il = 1wirecount()
    Waitms 100

    If Err = 0 Then
    For I = 1 To Il
    P3.0 = 0
    Waitms 500
    P3.0 = 1
    Waitms 500
    Next
    Else
    Wait 2
    P3.0 = 0
    End If

    Wait 2
    P3.0 = 0

    End

    Zawsze mruga 2 razy chyba, że podłączony jest 1 to raz.

    Dziękuje za odpowiedzi na moje pytania.
  • #6 4143559
    Michał_z1
    Poziom 16  
    Posty: 190
    Pomógł: 13
    Ocena: 2
    Witam ponownie.
    W bascom-owskim helpie jest wzmianka iż zmienna (w Twoim przypadku Il) była typu INTEGER lub WORD.
    pozdrawiam.
  • REKLAMA
  • #7 4144725
    Marcin J.
    Poziom 11  
    Posty: 32
    Ocena: 1
    Zmiana typu zmiennej na word również nie pomogła.

    Ma ktoś jakieś inne pomysły?
  • #8 4248313
    equus
    Poziom 1  
    Posty: 1
    Sprobuj na bascomie wersja2.11 lub wyzej bo tylko takie obsluguja poprawnie 1wirecount() oraz 1wsearchfirst() 1wsearchnext()
  • #10 4248854
    franyo_z
    Poziom 19  
    Posty: 309
    Pomógł: 22
    Ocena: 6
    Witam.
    Budowałem kiedyś sterowniki wentylatorów do kurnika na 89C2051, jeden obsługiwał 3 termometry DS, oddzielnie zasilane. Najdalszy czujnik był oddalony ok. 100m., najbliższy ok.10m. Za chiny nie mogłem odczytać wartości temperatur, ani nawet sygnatur czujek, jakby ich nie było. Oscyloskop pokazywał małą stromość zboczy impulsów na 1-wire. Dopiero zmiejszenie wartości rezystorów podciągających do 220 om rozwiązało problem - do dzisiaj wszystkie sterowniki działają (ok.pół roku).
    pzdr.
  • #11 4249836
    Jdsoul
    Poziom 23  
    Posty: 501
    Pomógł: 47
    Ocena: 10
    Zbyt duże zmniejszanie rezystora nie ma sensu, bo może prowadzić do dalszych zniekształceń transmisji, a nawet do padu DS-ów, mają określony prąd do zabrania i potem mogą się grzać.

    Rzuć okiem na magistralę czy aby nie ma zbyt dużych pojemności jeśli to jakiś kabel dwuparowy czy skretka UTP to spróbuj na 2 drutach.

    Najlepiej weź jakiś oscyloskop i zobacz co się dzieje na magistrali czy masz poprawne stany wysoki i niski.

    Dodano po 56 [sekundy]:

    Zbocza też powinny być możliwie zgodne z wymaganiami
  • #12 4250397
    Marcin J.
    Poziom 11  
    Posty: 32
    Ocena: 1
    Witam, teraz ds-y są podłączone na drutach. Na skrętce zdarzyło się raz że znalazł 3 ale temp. i tak nie mierzył. Jutro spróbuje z inna wersją kompilatora oraz ze zmniejszeniem rezystora obecnie 2,2k, wcześniej było 4,7k.

    Pozdrawiam
  • #13 4251784
    franyo_z
    Poziom 19  
    Posty: 309
    Pomógł: 22
    Ocena: 6
    Jdsoul -> też myślałem, że przy tych wartościach rezystorów DS-y padną, ale wszystko działa i się nie grzeje - ani DS-y, ani uP - i, jak pisałem, do dzisiaj działa. Sprawdzałem też różne przewody i ich pojemności, największy zasięg osiągnąłem na zwykłym przewodzie 'energetycznym' 3x1mm (najmniejsza pojemność), jednak tu były przekłamania transmisji (mała odporność na zakłócenia). Łączenie równolegle przewodów w skrętce też odpadło - zwiększenie pojemności. Pozostałem przy pojedynczej skrętce dla masy i sygnału oraz podwójnej dla zasilania, rezystory 220om.
    Co do kompilatora - nie wiem, czy Bascom ma obsługę błędów 1-wire, ja pisałem wszystko w asm, znalazłem algorytm obsługi błędów ale nie zrozumiałem jego zasady. Zrobiłem inaczej - jeżeli z czujnika przyjdą po sobie pomiary różniące się o ponad 1st. to odrzucam ten drugi (próbkowanie czujników jest co ok. 2 sek).
    pzdr.
  • REKLAMA
  • #14 4251994
    Jdsoul
    Poziom 23  
    Posty: 501
    Pomógł: 47
    Ocena: 10
    Cześć!!!

    Mam kilka uwag czysto teoretycznych i z praktycznymi efektami nie polemizuje.

    Z tego co podałeś dajesz rezystor 220 Ohm do 5 V - wg karty AT89C2051 bez problemu wyda powstający prąd 20 mA i ściągnie do 0,4V co dla DS jest stanem niskim,

    ale w karcie DS18B20 podają już tylko prąd ściągnięcia 4mA / przy 0,4 V stanu niskiego, nie wiem z czego to wynika ?!?.

    To daje spadek rzędu 220 * 4 mA = 0,88 V czy stan wysoki 5V i stan niski 5-0,88V = 3,12V (a to dla Atmel za dużo).

    Atmel żeby potraktować coś jako stan niski potrzebuje około 1/3 napięcia zasialania. Może tu być problem.

    Marcin J. a spróbuj małej, "dziwnej" sztuczki przenieś 1 Wire na pin 1.0 lub 1.1 :) może coś się zmieni :) [patrz karta katalogowa ATMELA:)].

    Dodano po 4 [minuty]:

    Może pozostały spadek powstał na drutach :) a może karta katalogowa DS18B20 kłamie nie wiem :)
  • #15 4252305
    franyo_z
    Poziom 19  
    Posty: 309
    Pomógł: 22
    Ocena: 6
    Witam.
    Zauważ,że ten, podany w specyfikacji DS-a, prąd 4mA to jest minimum. Maksymalnego nie ma podanego. U mnie na pewno przez rezystor płynie prąd większy, nie podam, bo nie mierzyłem. Myślę, że taka mała wartość rezystancji wynika z czasu ładowania/rozładowania pojemności skrętki. Procesor próbkuje magistralę w czasie ok.10us od podania stanu L (zasada działania 1-wire), a więc jeżeli pojemność nie zdąży się naładować to uC odczyta bit=0. I u mnie tak było - DS-y wpisałem bezpośrednio podłączone do uP i wtedy odczyty były prawidłowe, po podpięciu ich przez 100m skrętki i rezystor 2k2 wszystkie temperatury=0.
    Marcin J. -> nie znam możliwości Bascoma, ale spróbuj odczytać po kolei sygnatury DS-ów, podpinaj je bezpośrednio i pojedynczo, wpisz je na stałe do programu i wtedy zobacz jak czyta ich temperatury (po wpięciu wszystkich na raz).
  • #16 4252394
    Jdsoul
    Poziom 23  
    Posty: 501
    Pomógł: 47
    Ocena: 10
    Z tymi pinami P1.0 i P1.1 w 89C2051 chodzi mi o brak rezystorów Pullup w strukturze układu może pomóc.
  • REKLAMA
  • #17 4254099
    Marcin J.
    Poziom 11  
    Posty: 32
    Ocena: 1
    Witam, dziękuję za zainteresowanie...

    Po zmianie rezystora na około 180 ohm efekt jest ten sam - tylko 2 urządzenia.

    Obecnie poszukuje tej wersji bascoma 2.11...bez efektu. Może to rozwiąże problem.

    A może pisał ktoś w asm procedurę sprawdzającą ilość urządzeń na 1wire?

    Myśle,że poczekam z tym wszystkim do soboty, będę miał więcej czasu i wtedy napisze o postępach, bez pośpiechu.

    Z tą zmianą końcówki poru postaram się jak najszybciej i zaraz dam znać.

    Pozdrawiam
  • #18 4254263
    Jdsoul
    Poziom 23  
    Posty: 501
    Pomógł: 47
    Ocena: 10
    Tylko nie korzystaj jednocześnie z komparatora w AT89C2051 :)
  • #19 4258869
    franyo_z
    Poziom 19  
    Posty: 309
    Pomógł: 22
    Ocena: 6
    Witam.
    Podzielę się kilkoma moimi uwagami na temat automatycznego rozpoznawania urządzeń 1-wire. W moim sterowniku zrezygnowałem z tego z 2 powodów:
    - algorytm rozpoznawania jest dość skomplikowany i trudny do napisania w asm, może jakoś bym sobie poradził, ale zaważył powód drugi
    - bardzo upraszczając ten algorytm, czujki zgłaszają się w/g ich niepowtarzalnych numerów ID, od najmniejszego do największego. Czyli dla danego zestawu czujek można na stałe przypisać im wartości: czujka1 -> temp1, czujka2 -> temp2 itd. Problem wystąpi, gdy zajdzie potrzeba wymiany którejś czujki. Nowa będzie miała inny ID, czyli uC rozpozna ją na innej pozycji. Spowoduje to całkowite 'rozjechanie się' przypisania, np: czujka_nowa -> temp1, czujka1 -> temp2, czujka2 -> temp3 itd. (czujka_nowa ma najniższy numer ID) Zmienne temp1, temp2 ... dostaną wartości od innych czujników, niż powinny.
    Do głowy mi przyszły dwa rozwiązania. Wspólna ich część to dodatkowa pamięć EEPROM (np. i2c 24c04).
    - nie rezygnować z automatycznego rozpoznawania czujek, ich numery na stałe wpisać do pamięci EEPROM (w trybie serwisowym) i podczas inicjacji sterownika sprawdzać, czy zaszły zmiany w numerach ID odczytanych i tych w EEPROM. Jeżeli tak, to odpowiedni, niezgodny wpis w pamięci podmienić nowym.
    - zrezygnować z automatu, czujki wpisywać do EEPROM po kolei (w specjalnym trybie serwisowym). Jeżeli zaistnieje potrzeba wymiany czujki, wchodzimy w tryb serwisowy i programujemy odpowiednie komórki EEPROM nowym ID wymienionej czujki. To rozwiązanie zastosowałem w moim sterowniku.
    W obu przypadkach, aby odczytać temperaturę z danej czujki, najpierw z odpowiednich dla niej komórek EEPROM-u zczytuje jej ID, potem wysyłam zapytanie do tej czujki.
    Jeżeli opis nie jest zbyt jasny, to proszę pytać.
    pzdr.
  • #20 4270270
    Marcin J.
    Poziom 11  
    Posty: 32
    Ocena: 1
    Witam, opis jest bardzo jasny. Ale ja potrzebuje urządzenie do którego będę podłączał za każdym razem inny zestaw czujników ds18b20, nie znając ich numerów id. Więc to odpada. Chyba, że będę korzystał z funkcji 1wsearchfirst(),1wsearchnext() ale to może komplikować program.

    1wire przeniosłem na p1.0 i nic zmieniłem tez wersje kompilatora na nową dostępną na stronie mcs(demo) - bez efektu.

    Proszę o dalsze wskazówki, pozdrawiam
  • #21 4271866
    Jdsoul
    Poziom 23  
    Posty: 501
    Pomógł: 47
    Ocena: 10
    Zostaje ci jeszcze jedna możliwość, opomiarowanie sieci dla mnie uważam podstawowa.

    Zawsze chcę mieć pewność, że peryferia są ok zanim obarczę problemem soft w procku.

    Zrób emulację działąnia sieci 1 Wire na PC tzn.
    Przetestuj całą sięć segmentami , ściągnij z netu soft do

    http://www.grzesiek21.republika.pl/termo.htm
    { niestety program pozwala na komunikację tylko z jednym DS1820 na raz}

    Jest to program, który pozwoli ci sprawdzić koncepcje toru od strony działąnia DS-ów oraz ich wymagania co do interface, jest zresztą opisany na tej stronce "schemat zastępczy interface 1 Wire- RS-232".

    Później podłącz pod magistralę jakiś prosty rejestrator cyfrowych przebiegów, najlepiej w kilku miejscach sieci przy kilku DS1820 po kolei.

    Oscyloskop cyfrowy służący do rejestrowania i prezentacji przebiegów cyfrowych odczytywanych z wejść portu szeregowego. http://www.grzesiek21.republika.pl/download/osccyfr.zip

    Mając w ręce specyfikację DS 1820 będziesz mógł przeanalizować czy rzeczywiście komunikacja ma miejsce na graficznym zapisie przebiegu w komputerze, czy przebiegi w kilku miejscach sieci spełniają wymagania 1 wire itd. itd.

    Na koniec tą samą sieć wysteruj w AT89C2051 i sprawdź co tym razem się wydarzy, czy rzeczywiście mikroprocek realizuje swoje zadania, może czasowo wprowadź duże opóżnienia lub jakieś znaczniki żeby debugować zaproponowaną przez siebie procedurkę.

    Być może problemem są zbyt szybko po sobie następujące zapytania lub obciążenie magistrali wogóle, powyższy zestaw wiele ci wyjaśni.

    Jeśli twoim problemem jest brak oscyloskopu to proponuje prosty oscyloskop oparty na karcie dźwiękowej, zawsze możesz go szybko przeskalować stosując sygnal prostokątny TTL 0-5 V lub jakiś inny znany ci przebieg.

    http://free.of.pl/z/zlabs/design/download.htm

    I zobaczycz to czego nie widzisz :)
    w końcu przecież to tylko protokół komunikacyjny i to 1 parowy.
    Wieć przebiegi w funkcji czasu wiele mogą wyjaśnić, szczególnie czy masz odpowiedzi od poszczególnych DS .

    Stosowałem ten rejestrator do "rozgryzania" kodów pilotów podczerwieni i był całkiem spoko :)

    Dodano po 6 [minuty]:

    Oscyloskop przyda ci się aby sprawdzić zgodność poziomów na magistrali.

    A pętle warto wstawić oczekiwanie na przyciśniecie przycisku to łatwiej będzie ci zsynchronizować rejestrację z generowanymi przebiegami - np. uruchamiasz rejestrator i naciskasz przycisk "puszczając" pakiety 1-wire.

    Dodano po 1 [minuty]:

    Przycisk w sensie wejście w AT89C2051 Oczywiście :)
  • #23 4314921
    Jdsoul
    Poziom 23  
    Posty: 501
    Pomógł: 47
    Ocena: 10
    Hallo Marcin J. jak tam efekty badania sieci 1-wire :) właśnie będę się przymierzał do podobnego urządzenia i chętnie poznałbym efekty twojej pracy i osiągnięcia. Może próbowałeś już opomiarować sieć :)

    Planuję również zbudować tester sieci 1Wire, wprawdzie mam na myśli procesor klasy C51 , ale same możliwości techniczne bardzo by mi się przydały :)

Podsumowanie tematu

✨ Problem dotyczy układu opartego na mikrokontrolerze AT89C2051, który ma odczytywać temperatury z magistrali 1-Wire z podłączonymi termometrami DS18B20. Pomimo podłączenia około 7 czujników, mikrokontroler wykrywa tylko maksymalnie 2 urządzenia. Termometry są zasilane z osobnego źródła +5V, a linia danych jest podciągnięta rezystorem 4,7kΩ do +5V. Próby zmiany rezystora podciągającego na niższą wartość (około 180Ω) nie przyniosły poprawy. Użytkownik testował różne wersje kompilatora Bascom (2.0.12.0, 2.11), zmieniał piny portu (z P1.4 na P1.0 lub P1.1) bez efektu. Dyskusja wskazuje na możliwe problemy z pojemnością magistrali, długością kabla (nawet do 30 m), oraz odpowiednim doborem rezystora podciągającego, gdzie zbyt duża wartość powoduje wolne zbocza sygnału, a zbyt mała może prowadzić do przeciążenia czujników. Zalecane jest użycie oscyloskopu do analizy sygnału na magistrali, testowanie sieci segmentami oraz ewentualne zmniejszenie rezystora do około 220Ω. Wskazano także, że algorytm wykrywania urządzeń 1-Wire jest skomplikowany i może wymagać aktualizacji oprogramowania lub implementacji w asemblerze. Proponowano także testowanie pojedynczych czujników i ich sygnatur oraz rozważenie dodatkowej pamięci EEPROM do mapowania czujników. Ostatecznie problem może wynikać z fizycznych właściwości magistrali, konfiguracji sprzętowej i oprogramowania, a nie z uszkodzenia czujników.
Wygenerowane przez model językowy.
REKLAMA