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.

Wybor urzadzenia 1wire za pomoca tranzystora

Kelas 06 Wrz 2007 21:38 1650 17
  • #1 06 Wrz 2007 21:38
    Kelas
    Poziom 18  

    Czesc

    Projektuje uklad w ktorym wazna role odgrywaja czujniki temperatury dallasa DS1820. Procesor ktory je obsluguje to at89c2051 lecz ze wzgledu na brak pamieci nie moglem uzyc programu ktory wybieralby dany czujnik po adresie ROM. Zdecydowalem sie wiec na wlaczanie wybranego czujnika za pomoca tranzystora.

    http://img114.imageshack.us/img114/2821/1wirenu7.jpg
    Konektory usb sluza do podlaczania czujnikow.
    Diody LED to diody zielone i znajduja sie poza plytka.
    R4 = 4,7k


    Narysowalem taki schemat, zlozylem na plytce uniwersalnej i wszystko bylo w porzadku. Proby byly prowadzone bez diod led.
    Gdy podlaczona jest jedna dioda, uklad dziala bez zarzutu. Gdy wiecej przestaje dzialac - tranzystor ktory jest "wybrany" na kolektorze ma 1,5v a pozostale zamiast 5v - 3,8v. "Wybrana" dioda swieci lecz czujnik nie dziala, pozostale diody zamiast byc zgaszone - błyskaja co ok 1s.

    0 17
  • #2 06 Wrz 2007 22:04
    aster11
    Poziom 19  

    Trochę to szaleństwo jakieś, to Twoje rozwiązanie.
    Z tego co rozumiem, wyprowadzenia kolektorów są liniami zasilania układów DS1820 ?
    W ten sposób nie zrealizujesz wyboru czujnika! Jeżeli linia ta jest pod napięciem (powiedzmy ok. 5V), to czujnik jest "wybrany", jeżeli jest zwarta do masy (stan wysoki na wyjściu sterującym bazy tranzystora), to czujnik jest też "wybrany", w trybie zasilania pasożytniczego :D
    Może bez diod jakoś działało, bo przy zatkanym tranzystorze linia zasilania "niewybranych" czujników wisiała w powietrzu. Ale tak tego nie zrobisz, bo dostaniesz tylko "grę przypadków".

    Jeżeli chcesz programowo wybierać czujniki, bez funkcji przeszukiwania adresów, podepnij po prostu linię danych każdego z nich do oddzielnego pinu - jest to standardowe rozwiązanie.

    0
  • #3 06 Wrz 2007 22:11
    Kelas
    Poziom 18  

    Hm, moim zdaniem zeby wlaczyc tryb zasilania pasozytniczego trzeba podlaczyc zasilanie czujnika do szyny 1wire i gnd.
    Tutaj zasilanie jest podlaczone w kazdym wypadku do Vcc, tylko mase zwiera tranzystor gdy na linii sterujacej baze jest stan wysoki.

    Gdy uklad dziala (bez podlaczonych diod) nie zauwazylem nic przypadkowego w jego dzialaniu. Odczyty temperatury sa poprawne i zawsze "wybrany" jest odpowiedni czujnik.

    edit:
    Oczywiscie probowalem kazdy czujnik podlaczyc do osobnego pinu lecz program napisalem w bascomie a tam do kazdego trzeba napisac oddzielne funkcje obslugujace 1wire - a na to tez nie starczylo pamieci.

    Code:
    pin1w alias P1.0
    
    1wreset pin1w
    ...

    Tutaj nalezaloby zmienic port ktory aliasuje pin1w ale nie znalazlem na to sposobu mimo ze niektore czesci helpa znam chyba na pamiec.

    0
  • #4 06 Wrz 2007 22:22
    aster11
    Poziom 19  

    Cytat:
    Hm, moim zdaniem zeby wlaczyc tryb zasilania pasozytniczego trzeba podlaczyc zasilanie czujnika do szyny 1wire i gnd.

    Kolego, co Ty w ogóle wygadujesz !!!!!!!!!!
    Skoro masz takie genialne "zdanie", to czego "dziwnie" Ci to działa. Gdy staram się wyjaśnić, spróbuj trochę przeanalizować!

    Dlaczego układ działał bez diod, to napisałem. Z diodami - loteria lub porażka. Ogólnie - projekt błędny.

    Podłącz jak radzę, bo Twoje kombinacje w bieżącym wydaniu nie zadziałają!

    Jeżeli chcesz sterować czujnikami przez tranzystory, jeżeli chcesz, aby diody wskazywały aktywny czujnik, nie wykorzystując zbyt wielu pinów - na pewno da się to jakoś zrobić - ale nie tak jak to zaprojektowałeś.

    Pozdrawiam

    PS:
    Skoro Bascom, to programowo Ci nie pomogę. Może ktoś coś takiego robił i będzie wiedział czy da się "przełączać piny". W C byłoby to proste.

    Jednak jeszcze raz powtarzam. Czy linię zasilania podłączysz do masy czy do Vcc, DS1820 będzie zawsze zasilony! Zawieszać ją w powietrzu, to strasznie "podejrzane" - raczej niedopuszczalne. Bardziej trzeba kombinować ewentualnie jakoś z odcinaniem linii danych poprzez tranzystory :)

    PS2:
    Hmm, ...
    Nie taki banalny Twój problemik, zwłaszcza sprzętowo. Czujnika nie da się po prostu "wyłączyć" przez odcięcie zasilania. Na linii danych też trudno go jakoś odcinać, gdyż linia jest dwukierunkowa i potrzeba dwukierunkowego "przekazywania iloczynu montażowego" i nie da się chyba zrobić tego przez jakiś prosty układzik z diodą i tranzystorem ... ale może się mylę ...
    Osobiście pokombinowałbym bardziej coś programowo, żeby czytać z różnych pinów.
    Narazie się poddaję ... :D, powodzenia:!:

    0
  • #5 06 Wrz 2007 22:51
    Kelas
    Poziom 18  

    Mimo to nadal twierdze ze uklad ma prawo dzialac - wcale nie przypadkowo. W nocie katalogowej nie widzialem nic o rozwiazaniu zasilania bez podlaczonej masy a taki wlasnie byl moj pomysl na wylaczanie czujnika. Po za tym gdy przestaje byc "wybrany", natychmiastowo przestaje reagowac i nie da sie nic zrobic na 1w z udzialem tego czujnika.

    aster11:
    Fakt, masz racje co do trybu parasite ale zapadl mi w pamiec jakis schemat na ktorym linia zasilania byla podlaczona do linii danych.
    Nie prosilem o kwestionowanie mojego rozwiazania (ktore nie wiem dlaczego wzbudzilo w tobie takie oburzenie) tylko o pomoc w kwestii led'ow.

    edit: Co do odlaczania linii danych bralem pod uwage przekazniki ale zajmuje on zbyt duzo miejsca na pcb.

    0
  • #6 06 Wrz 2007 23:20
    aster11
    Poziom 19  

    Aaaa ...
    Więc Ty odłączasz masę czujników. Na rysunku jest to podpisane jako VBUS. Myślałem, że chcesz sterować linią zasilania czujnika. Jeżeli odcinasz masę, to "jakoś tam" odcinasz zasilanie danego czujnika - powinno to działać od biedy (zwłaszcza jeśli "przetestowałeś":) ), jednak na pewno nie jest to eleganckie rozwiązanie!

    Cytat:
    Nie prosilem o kwestionowanie mojego rozwiazania (ktore nie wiem dlaczego wzbudzilo w tobie takie oburzenie) tylko o pomoc w kwestii led'ow.

    Cóż nie chciałem rozmawiać o malowaniu ścian, gdy dach jeszcze nie położony.

    Jeżeli idzie o diody, to ich zachowanie jest wynikiem tego "podejrzanego" podłączenia. W trakcie transmisji, na linii danych występują chwilowo stany niskie. Wtedy każdy czujnik jest "jakoś tam :)" zasilany, bo na VCC ma 5V, a na DATA masę. Ze względu na strukturę wewnętrzną układu, masa ta "przechodzi" jakoś do pinów GND czujników i powoduje świecenie diod.

    Cytat:
    pozostale zamiast 5v - 3,8v

    A sprawdź ile będzie bez niczego - sama dioda, podłączona do 5V ?? :D - podstawy elektroniki się kłaniają. Nie ma pomiaru napięcia (nie do końca prawda :) ) bez przepływu prądu i nie ma przepływu prądu bez odłożenia się napięcia przewodzenia na półprzewodniku.

    Jeszcze wyjaśnienie, dlaczego wybrany czujnik nie działa, gdy diody są podłączone ...
    Masa, podana przez tranzystor jest "za słaba" (jak sam piszesz: 1,5V), aby odwzorować poziom logicznego zera. Masa podnosi się tak, ze względu na poziom dość znacznego prądu pobieranego poprzez diody. Tranzystor NPN, sterowany bezpośrednio stanem wysokim układu '51 (bardzo mała wydajność prądowa) nie może niestety zapewnić zbyt dużego prądu kolektora.

    Może na upartego będzie to jakoś działać bez tych diod. Jeżeli chcesz pozostawić diody, musisz zastosować darlingtony (albo zmienić procek :) ) - ale i tak nie jestem pewny, czy nie wyskoczą jakieś inne zakłócenia transmisji - możesz to sprawdzić, wybierając czujnik "sprzętowo", przez zwarcie emitera i kolektora danego tranzystora.

    0
  • #7 07 Wrz 2007 01:12
    Kelas
    Poziom 18  

    Co do elegancji nie bede sie spieral ;p

    Gwoli poznania wkoncu zasad podstaw elektroniki bede drazyl temat ;p
    Jesli dobrze zrozumialem, tranzystor nie przewodzi pradu potrzebnego do dzialania diody i czujnika - ale pozwole sobie sie z tym nie zgodzic. Na diodzie odlozy sie 2,2v wiec poplynie przez nia prad 10mA ustalony przez rezystor 270ohm. Do dzialania ds1820 w stanie active pobiera max 1,5mA a wiec razem potrzebne jest 11,5mA.
    Maksymalny prad kolektora wg. noty katalogowej to 100mA wiec pobierany przez diode i ds'a prad miesci sie w granicach.
    Prad bazy jesli dobrze policzylem(I=U/R=5/10000) wynosi 0,5mA a wg. noty przy Ic = 10mA wzmocnienie wynosi 240. Jesli ten wzor mozna tutaj zastosowac to Ic=Ib*β to prad bazy jest wystarczajacy zeby przez tranzystor poplynal wymagany prad.
    Nie opieram sie zbytnio na tych obliczeniach bo nie jestem pewien ich poprawnosci ale mimo to mozna chyba zwiekszyc Ib bo wydajnosc jednego pinu w tym kontrolerze to 20mA.
    Jednak wtedy pozostaje problem "przedostawania sie masy" z linii danych ktory chociaz wg. datasheet (fig. 1) nie powinien miec tu miejsca wydaje sie prawdopodobnym wytlumaczeniem.

    Jesli to co napisalem wyzej to totalne bzdury prosze o zwrocenie uwagi i ewentualne poprawienie mnie.

    Rozwijajac moj nieelegancki pomysl narysowalem taki schemat:
    http://img152.imageshack.us/img152/4030/1wire1xs1.jpg
    Czy taki uklad mialby prawo dzialac? Jesli nie to czy moznabyloby wysterowac tranzystory sterujace diodami za pomoca pradu plynacego przez kolektor-emiter "odblokowanego" tranzystora T5 T6 lub T7?
    http://img515.imageshack.us/img515/5863/1wire2lg8.jpg

    0
  • #8 07 Wrz 2007 09:59
    Mad Bekon
    Poziom 23  

    Ja sie zastanawiam ile ty masz tych czujników w ty układzie, że nie możesz sobie pozwolić na Match ROM.
    10 czyjników? 60 bajtów pamięci. Aż tak dużo? Nie wydaje mi się.

    Kelas napisał:

    Oczywiscie probowalem kazdy czujnik podlaczyc do osobnego pinu lecz program napisalem w bascomie a tam do kazdego trzeba napisac oddzielne funkcje obslugujace 1wire - a na to tez nie starczylo pamieci.
    Code:
    pin1w alias P1.0
    
    1wreset pin1w
    ...

    Tutaj nalezaloby zmienic port ktory aliasuje pin1w ale nie znalazlem na to sposobu mimo ze niektore czesci helpa znam chyba na pamiec.


    Wiesz, nigdy nie pisałem w BASCOMie, ale jakoś nie wydaje mi się żeby NIE DAŁO SIĘ napisać JEDNEJ funkcji, gdzie parametrem wywałania byłby port i pin z którym ma działać.

    A jeśli faktycznie tak jest, to może pora przejść na bardziej elastyczny język, bardziej oszczędny, skoro ten BASCOM tyle pamięci Ci pożera

    0
  • #9 07 Wrz 2007 10:21
    aster11
    Poziom 19  

    Cytat:
    Jesli dobrze zrozumialem, tranzystor nie przewodzi pradu potrzebnego do dzialania diody i czujnika - ale pozwole sobie sie z tym nie zgodzic.

    Jesteś dogłębnym filozofem, dość fajnie sobie wszystko liczysz - jednak wyżyny sztuki wymagają umiejętności połączenia teorii i praktyki. Jeżeli stwierdziłeś, że napięcie kolektor-emiter wynosi 1,5V, to znaczy, że prąd kolektora nie jest taki, jakbyś chciał, a tranzystor nie otwiera się "całkowicie" (nie wchodzi w nasycenie). Zasugerowałem Ci w poprzednim poście ten problem i napisałem z czego wynika. Jeszcze raz podpowiadam, że chodzi o typ mikrokontorlera - rodzina '51. Dobrze zastanów się nad tym:
    Cytat:
    Prad bazy jesli dobrze policzylem(I=U/R=5/10000) wynosi 0,5mA

    Czasem nie wystarczy policzyć, ale trzeba albo coś wiedzieć z doświadczenia, albo coś zmierzyć.

    "Rozwijajac moj nieelegancki pomysl narysowalem taki schemat"
    Trochę drwisz chyba sobie ze mnie, a ja po prostu staram Ci się pomóc.

    Pierwszy Twój schemat jest błędny (podstawy elektroniki). Nie uzyskasz pracy dwóch tranzystorów jako kluczy, łącząc bazy bezpośrednio. Każda musi mieć rezystor indywidualnie. Tak czy owak, równoległe łączenie baz nie wchodzi tu w grę, bo prąd mamy lichy nawet dla jednej bazy.

    Drugi schemat jest lepszy. Jeszcze trzeba dodać podciąganie baz tranzystorów dla diod do Vcc (ok 10k), jakieś tam podciąganie może będzie występowało przez strukturę wewnętrzną czujników, ale jakie - tego najstarsi indianie nie wywróżą. Czujniki powinny działać. Diody - to chyba rozumiesz - będą w takim układzie świeciły dla czujników niewybranych. No i dalej będzie występował problem "migania" diod w trakcie transmisji.

    Osobiście, jeśli się już upierasz, proponowałbym pozostanie przy schemacie pierwotnym (z pierwszego postu) i wykorzystanie tranzystorów MOSFET.

    Tak naprawdę to jest jednak dziwactwo (nie śmiej się ze mnie) i nie może się kwalifikować jako profesjonalny projekt. Potencjał masy jest w elektronice "świętością". Jest to punkt odniesienia dla wartości poszczególnych napięć, a w układach cyfrowych jest poziomem odniesienia do wyznaczania stanu logicznego. Zauważ, że tzw. "margines zakłóceń" (TTL) dla poziomu niskiego jest wąski dlatego, iż przyjmuje się, że potencjał masy nie odskoczy zbyt wiele pomiędzy różnymi układami - ma on być na stałe "przybity" do układów. Jeżeli robisz wyłączanie zasilania układu cyfrowego przez odcinanie masy tranzystorem, to uprawiasz elektronikę "w krzywym zwierciadle".

    ---------------

    MadBekon: Nie chodzi zapewne o zapisanie w pamięci adresów czujników, tylko o to, że kompilator dołącza wtedy dodatkowe procedury, związane z obsługą funkcji MATCH ROM. 2kB to trochę mało, żeby coś wielkiego zwojować, zwłaszcza na Bascomie.

    Ja też ciągle usilnie proponuję Zainteresowanemu rozwiązać to programowo. Może przesiadka na C, to przewaga formy nad treścią - ale może spróbować by tak AT89C4051 - może pamięci wystarczyłoby do MATCH ROM? Układy kompatybilne, cena praktycznie "żadna".

    0
  • #10 07 Wrz 2007 11:05
    Mad Bekon
    Poziom 23  

    No fakt, może i faktycznie zasugerowałem się tym, że sam piszę w C a nie w BASCOMie.
    Nie mniej jednak, pisząc pod Atmegę8, obsługa 4 DSów, wyświetlacza HD44780 i jeszcze kilku innych mniej znacznych bajerów zajęła mi ok 1kB kodu, gdzie Mega ma go 8kB. Myślę, że wszystko to kwestia odpowiednich wyborów, nie mniej jednak, ja bym się nie posuwał w tym kierunku co autor tematu, bo moim zdaniem lepiej zmienić kod, czyniąc go optymalniejszym, niż nie dość, że marnotrawić pamięć procka, to przez to jeszcze powiększać układ i to nie o mało.

    0
  • #11 07 Wrz 2007 11:51
    Kelas
    Poziom 18  

    aster11: W zadnym wypadku nie chcialem z ciebie zadrwic - mam swiadomosc tego ze moje rozwiazanie jest nietypowe i dlatego poprosilem o pomoc na forum.

    Cytat:
    Wiesz, nigdy nie pisałem w BASCOMie, ale jakoś nie wydaje mi się żeby NIE DAŁO SIĘ napisać JEDNEJ funkcji, gdzie parametrem wywałania byłby port i pin z którym ma działać.

    Uwierz ze myslalem tak samo jak ty, poki nie sprobowalem tego zrobic. Bascom AVR chyba na to pozwala ale nie '51.
    Co do przesiadki na C - programowac zaczalem wlasnie w tym jezyku ale nie dalem rady nawet odczytac RC5 wiec zrezygnowalem.

    Mad Bekon: Program osbluguje tylko 3 czujniki. Oczywiscie mozna zapisac ich identyfikatory jako stałe w pamieci programu i wcale taka obsluga nie zajmowala by duzo miejsca. Problem w tym ze czujniki maja byc dowolnie zmieniane z puli okolo 15 innych. Adresy aktualnie podlaczonych musialyby byc trzymane w RAM a bascom stwierdzil ze to juz za duzo.





    [/quote]

    0
  • #12 07 Wrz 2007 12:07
    zumek
    Poziom 39  

    Kelas napisał:
    aster11:... Adresy aktualnie podlaczonych musialyby byc trzymane w RAM a bascom stwierdzil ze to juz za duzo.

    To co Ty trzymasz w tym RAM-ie :?:
    Pokaż wszystkie DIM-y , albo sprawdź w raporcie , jaki najwyższy adres zajmują zmienne.

    Piotrek

    0
  • #13 07 Wrz 2007 12:17
    aster11
    Poziom 19  

    Może napisz coś dokładniej o Twoich problemach programowych lub / i wklej kod programu. Jest tu dużo ludzi, którzy znają się na Bascomie, ktoś coś może wymyśli. Dziwie się, że nie da się jakoś upchać adresów trzech czujników (24 bajty) do pamięci RAM - na pewno w tym jest sedno problemu? Czy nie można ewentualnie zapisać do RAM jakichś indeksów tablicy z tymi adresami, zamiast samych adresów?

    0
  • #14 07 Wrz 2007 13:41
    Kelas
    Poziom 18  

    Code:
    Dim Bd(9) As Byte
    
    Dim I As Byte , Tmp As Byte
    Dim Crc As Byte
    Dim T As Integer , T1 As Integer
    Dim Temp As String * 3
    Dim Dzies As String * 1
    Dim Numer As Byte
    Dim Zmiana As Bit

    Oto wszystkie zmienne ktore wykorzystuje w programie, ostatni adres w raporcie to 47h.
    Gdy dopisze chocby jedna tablice potrzebna do przechowywania adresu:
    Code:

    dim rom(8) as byte

    Kompilator zglasza blad nr 8: Out of internal memory

    edit:
    aster11: Adresy musza byc trzymane w ramie z koniecznosci "dynamicznej" zmiany czujnikow podczas pracy urzadzenia. Gdybym chcial umiescic je w pamieci programu musialbym tam zapisac "na sztywno" 15 roznych adresow a to i tak nie pozwala na podpiecie dowolnego czujnika - gdy jeden ulegnie uszkodzeniu potrzebna bedzie zmiana programu by moznabylo go obsluzyc.

    0
  • #15 07 Wrz 2007 14:11
    aster11
    Poziom 19  

    Cytat:
    Adresy musza byc trzymane w ramie z koniecznosci "dynamicznej" zmiany czujnikow podczas pracy urzadzenia.

    Tak, faktycznie w takim przypadku muszą być przechowywane w RAM pełne adresy. Twój wcześniejszy opis sugerował, że chcesz używać czujników spośród zamkniętej grupy 15 egzemplarzy. Jeżeli nie zależy Ci na szybkości odczytów, można by pewnie coś pokombinować z ciągłym przeszukiwaniem magistrali za pomocą SEARCH ROM, ale chyba nie tędy droga.
    Co do problemów z pamięcią, to dyskutuj ze specjalistami od Bascoma :)
    Na upartego nie trzeba pamiętać 3 x 8 bajtów, bo FAMILY CODE jest wspólny i znany, a CRC można wyznaczać dynamicznie, dostajemy wtedy 3 x 6 = 18 bajtów, no ale to niewielka oszczędność, a dochodzą kombinacje, które mogą "pożreć" więcej RAM'u niż zaoszczędzimy.

    0
  • #16 07 Wrz 2007 15:32
    zumek
    Poziom 39  

    Kelas napisał:
    ...Kompilator zglasza blad nr 8: Out of internal memory .

    To dlaczego nie sprawdzisz w Helpie łaskawco , co oznacza ten błąd i jak ewentualnie temu zaradzić :?: ;) Wybierz z menu:Options->Compiler->Misc , znjdź w tej zakładce Byte End (hex) i ustaw na 7F , bo zapewne masz dużo mniej .

    Piotrek

    0
  • #17 07 Wrz 2007 16:02
    Kelas
    Poziom 18  

    Dzieki, nie interesowalem sie opcjami bascoma bo myslalem ze wszystko mozna skonfigurowac w programie a ta wartosc konfiguruje sie automatycznie z pliku .dat :]

    Obsluga z MATCH ROM zajmuje wiecej miejsca w pamieci programu(zostaje tylko 5 bajtow wolnych a planowana jest zmiana programu w przyszlosci) i jest nieco wolniejsza niz moje "brutalne" odcinanie czujnikow co ma wplyw(niewielki) na komfort pracy z urzadzeniem. Ze wzgledu na koniecznosc ponownego wykonania pcb pozostaje przy rozwiazaniu z pierwszego postu - choc wcale nie twierdze ze jest lepsze, ale dziala bez zarzutu.

    Prosze o nie zamykanie tematu, moze ktos wkoncu wyjawi tajemnice jak "dynamicznie" zmieniac w programie pin zdefiniowany przez:

    Code:
    config 1wire = P1.7

    Lub wywolywac funkcje obslugi 1wire ze zmienna zawierajaca dane o danym pinie:
    Code:
    sub odczyt(pin1w)
    
    1wreset pin1w
    end sub


    Dziekuje za pomoc i pozdrawiam
    Igor

    0
  • #18 07 Wrz 2007 16:24
    aster11
    Poziom 19  

    Ostatni raz piszę, że odcinanie masy czujników to "przykre rozwiązanie". Chyba spodobał Ci się ten pomysł, dlatego, że jest krytykowany. :P Oczywiście, że stół z nogą podpartą książką nie chwieje się, ale czy tak powinno być? Teraz widzisz, że to nie konieczność nakierowała Cię ku takiemu rozwiązaniu, tylko niewiedza w pewnej dziedzinie.

    Użyj sobie AT89C4051, masz tam dwa razy więcej pamięci. Na początku startu programu mikrokontroler niech wyszukuje dostępne czujniki poprzez SEARCH ROM. Liczbę czujników, które będzie próbował wyszukać, możesz ustawić na sztywno lub konfigurowalnie. Potem układ będzie odpytywał tylko wyszukane czujniki, poprzez MATCH ROM. Jeśli zauważy, że jakiegoś czujnika brak, może powtórzyć szukanie.

    0