Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 1 lip 2026, o 05:29


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 22 ] 
Autor Wiadomość
PostNapisane: 6 wrz 2013, o 08:50 
Offline
Użytkownik

Dołączył(a): 25 gru 2012
Posty: 128
Pomógł: 0

Witam,
ponieważ kiedyś na forum zostałem zrugany za podłączanie 2 DS-ów do osobnych pinów, to postanowiłem w obecnym zaawansowanym projekcie (termostat :-) ) podłączyć je pod jeden PIN. I mam problem, bo czujniki podłączone osobno (pojedynczo) działają bez zarzutów, a jak są razem, to obydwa pokazują nieszczęsne 85. Jest to związane z błędem konwersji. Tylko próbuje zmieniać czasy i nic to nie pomaga. Osobno podłączone działają prawidłowo, razem podłączone pokazują 85.
- DS-y podłączone są w trybie pasożytniczym z rezystorem 2,2kOhm
- Układ zasilany jest z programatora (próbowałem też z ładowarki do telefonów 5v)
- Wyniki prezentowane są na LCD graf.
- Atmega32 8MHz

Przedstawiam moim zdaniem kluczowe fragmenty kodu.
plik ds18b20.c
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


funkcja main()
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 wrz 2013, o 10:49 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Spróbuj dać większe podciąganie, też miałem problem z trybem parasite na 2,2 kohm. Daj 1,5 kohm.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 wrz 2013, o 21:52 
Offline
Użytkownik

Dołączył(a): 25 gru 2012
Posty: 128
Pomógł: 0

Strzał w 10 !
Kurcze ja podpinałem 1,5kOhm, a zadziałało dopiero z 1,2kOhm. Po prostu nie przypuszczałem, że można tak małą wartość oporu zastosować. Eh. te DS-y zawsze coś.
Dzięki serdreczne.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 wrz 2013, o 21:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Cytuj:
Strzał w 10 !


Mnie to kiedyś Mirek poradził :)
15 kohm i ds-y w trybie parasite latają na 100 metrowych kablach :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 wrz 2013, o 09:49 
Offline
Użytkownik

Dołączył(a): 04 paź 2011
Posty: 8631
Pomógł: 338

bo zasadniczo to pomimo iż DS18B20 może pracować w trybie parsite , to jednak maxim zaleca DS18B20 PAR ....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 wrz 2013, o 19:56 
Offline
Użytkownik

Dołączył(a): 25 gru 2012
Posty: 128
Pomógł: 0

Witam ponownie ;)
Na rezystorze podciągającym rzędu 1,5kOhm działają mi tylko 4 DS-y w trybie pasożytniczym. Niestety mój projekt zakłada wykorzystanie 15 DS-ów :D W związku z czym nie da się ciągle zmniejszać wartości rezystora podciągającego, muszę zastosować tranzystor. I tu moje pytanie czy znają Forumowicze jakiś konkretny MODEL tranzystora, który mógłbym zastosować do tego celu :?: W datasheet jest tylko informacja, że powinien być typu mosffet, bez podania konkretnego modelu. A ja w mosfetach biegły nie jestem :oops:



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 wrz 2013, o 21:20 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Poczytaj noty aplikacyjne, a tam polecają BSS84 (ze względu na niskie napięcie przełączania VGSth ~1...2V).

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2013, o 22:26 
Offline
Użytkownik

Dołączył(a): 25 gru 2012
Posty: 128
Pomógł: 0

Witam ponownie.
Więc rezystor 1,5kOHM działa poprawnie gdy ilość czujników jest mniejsza niż 5. Podłączenie kolejnego powoduję iż wszystkie wskazują domyślną wartość 85. Mój projekt zakłada wykorzystanie 14 DSów, więc siłą rzeczy musiałem zastosować pull-up wykorzystując dodatkowy tranzystor. Kupiłem (kilka sztuk, na wszelki wypadek) 2N2222A (gdzieś w necie znalazłem i taki był w sklepie), podłączyłem bazę poprzez 2kOhm do PB1. Zmieniłem rezystor podciągający na 4,7kOhm od DQ do VCC. Zmieniłem funkcję odpowiedzialne z tryb pasożytniczy na:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Podłączyłem diodę do PB1 i widać jak przygasa na czas konwersji i odczytu. Emiter tranzystora do do DQ. Jedna przy podłączeniu tylko dwóch DS-ów układ wyświetla 85. :|
Co może powodować takie zachowanie :?:



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 wrz 2013, o 10:49 
Offline
Użytkownik

Dołączył(a): 25 gru 2012
Posty: 128
Pomógł: 0

Proszę bardzo schemat:

Sugerowałem się tą stroną:

http://www.pic_examples.byethost3.com/DS18B20.html

Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 wrz 2013, o 11:39 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27462
Lokalizacja: Szczecin
Pomógł: 1045

ty lepiej powiedz jakim ty kablem łączysz te czujniki ? bo to też jest ważne ... polecam skrętkę Cat5

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 wrz 2013, o 11:47 
Offline
Użytkownik

Dołączył(a): 25 gru 2012
Posty: 128
Pomógł: 0

Na razie układ jest montowany na płytce testowej. Czyli kabelki miedziane o długości <10cm.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 wrz 2013, o 09:15 
Offline
Użytkownik

Dołączył(a): 25 gru 2012
Posty: 128
Pomógł: 0

Dla sprawdzenia podłączyłem DS-y za pomocą 3 przewodów i działają idealnie (10sztuk). Najpierw pojedynczo sczytuję kody ROM które umieszczane są w EEPROM. A następnie wpinam je wszystkie na płytkę testową i pięknie działają z rezystorem podciągającym 4k7 :)
Przy założeniu że powyższy schemat jest prawidłowy, to może ja nie w tym miejscu co trzeba umieszczam funkcję odpowiedzialne za sterowanie bazą tranzystora ? Poniżej zamieszczam kluczowe funkcje. Jak widać próbowałem już chyba wszystkich możliwości i nic to nie pomaga :|
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 wrz 2013, o 10:51 
Offline
Użytkownik

Dołączył(a): 25 gru 2012
Posty: 128
Pomógł: 0

Próbuję i próbuję i nadal nie mogę ogarnąć tego tematu z STRONG PULL-UP :cry: Wiem, że powinienem na czas konwersji i kopiowania do EEPROMU włączyć tranzystor ale jakoś nie chce mi to zadziałać.
Jeżeli powyższy schemat jest prawidłowy, to żeby zadziałał pull-up, to na bazę tranzystora podaję 5V a linia danych DQ do 0V :?: Wtenczas popłynie duży prąd przez tranzystor :?: Pytam bo nie chcę uwalić uC lub DSa, a już o tego wszystkiego, to nawet tego nie jestem pewien.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 wrz 2013, o 18:36 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

qutrit napisał(a):
Jeżeli powyższy schemat jest prawidłowy, to żeby zadziałał pull-up, to na bazę tranzystora podaję 5V a linia danych DQ do 0V
Nie. Linia DQ ma być wejściem w tym czasie, czyli mieć normalny stan jak dla czujników zasilanych zewnętrznie. Załączyć zasilanie czujników należy za CONWERT_TEMP(), a wyłączyć przed Read_DS18B20(DS) i to wszystko. Do analizy tego układu z tranzystorem zapomnij o tym, że emiter tranzystora idzie do PB0. Zbuduj sobie taki układ sterowania LED, który umieszczony jest w obwodzie emitera.
Inna sprawa to przeładowywanie pojemność linii dla dużej ilości czujników tzw. Active Pullup. Nie wiem dlaczego zwiększyłeś rezystor. Stosuje się nawet taki patent, że na gdy mikrokontroler nadaje 1 to tranzystor czas krótki czas jest załączany tylko po to, żeby przeładować pojemności, a potem wyłączany, bo układ 1-Wire po pewnym czasie może sprowadzić linie danych do masy.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 wrz 2013, o 20:07 
Offline
Użytkownik

Dołączył(a): 25 gru 2012
Posty: 128
Pomógł: 0

Dzięki za odpowiedź.
Powyższy schemat znalazłem w necie ale też mi się nie podobał. Poniższy wygląda chyba lepiej.

Obrazek
Pochodzi ze strony http://www.pjrc.com/tech/8051/board5/temperature.html

Pokombinuję może coś mi wyjdzie. A jak nie, to poprowadzę komunikację 3 przewodami i już. Tym bardziej, że i tak będę musiał puścić skrętkę 8-żyłową.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lis 2015, o 22:23 
Offline
Użytkownik

Dołączył(a): 25 gru 2012
Posty: 128
Pomógł: 0

Witam,
odświeżany kotlet, ale do tej pory nie umiem sobie poradzić z tym trybem pasożytniczym.
Mam termometr (LCD 2x16) z 3x DS18b20 podłączonymi w trybie pasożytniczym linią DQ do portu PA1.
Gdy zastosuję rezystor podciągający 1,2kOhm (bez tranzystora) układ działa poprawnie.
Natomiast chciałem zrobić to zgodnie z dokumentacją tzn. wykorzystać tranzystor do strong pull-up którego baza podłączona jest do PA0, oraz rezystor 4,7kOhm, tak jak na poniższym schemacie. Oczywiście VDD też do masy.
Obrazek

Dla jednego czujnika działa poprawnie. Podłączając drugi czujnik na LCD pojawiają się wartości 85, czyli błąd w jakiejś komunikacji.

Teraz główne funkcje programu:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Convert:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Read DS:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


PULL-UP ENABLE/DISENABLE
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Tranzystor 2N3906 działa poprawnie, testowałem na diodzie LED.
Nie wiem co może być źle. Może ktoś z forumowiczów ma jakiś pomysł/sugestię co może być nie tak ?
Swoją drogą szukałem w internecie jak rozwiązany jest ten problem i artykułów jak na lekarstwo.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lis 2015, o 23:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Odczytanie 85 stopni oznacza stan początkowy. Więc albo nie zleciłeś żadnej konwersji albo nastąpił reset układu (np. napięcie spadło poniżej wymaganego poziomu).
Dlatego zrób zasilanie dokładnie jak jest w datasheetcie:
Obrazek

--
Pozdrawiam,
Robert


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 lis 2015, o 23:48 
Offline
Użytkownik

Dołączył(a): 25 gru 2012
Posty: 128
Pomógł: 0

Próbowałem na wszystkie sposoby i nic :-(
Dla jednego Dsa - działa, dołączam drugiego, to otrzymuję wartości 85. Ale zauważyłem taką rzecz.
Jeżeli podłączam jednego Ds i zwykły miernik prądu, to widzę oscylacje prądu 0,4 - 0,8mA i poprawną wartość temperatury na LCD. Dołączam kolejnego DS i wartość prądu ani drgnie (no może czasami wskoczy na 0,01mA).
Więc tak jakby dla 2. DSów nie zostało poprawnie wydane polecenie CONVERT();
Dodam, że w funkcji CONVERT, warunek if(RESET_PULSE) (gdy DS lub DSy są podłączone) jest spełniony, bo sprawdzałem to, umieszczając tak wł/wył diodę LED.
Moja funkcja CONVERT();
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


send_byte
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


send_bit
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lis 2015, o 18:46 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Jak podciągasz linię danych na czas konwersji, to zachowujesz odpowiedni czas jej podtrzymania - przy 12 bitowej rozdzielczości konwersja trwa do 750 ms i przez tyle musisz podawać na nią zasilanie? Sprawdź czy twój timer na pewno dobrze liczy czas.

Czy testowałeś kilka układów w trybie z podłączeniem 3 liniami? Bo ja na twoim miejscu zacząłbym od tego. I jak w tym trybie będzie Ci komunikacja działać poprawnie, to wtedy można zacząć przechodzić w tryb parasite, który wymaga trochę więcej "zabawy".

--
Pozdrawiam,
Robert


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lis 2015, o 21:02 
Offline
Użytkownik

Dołączył(a): 25 gru 2012
Posty: 128
Pomógł: 0

Witam,
Układ 3 x DS w trybie parasite działa poprawnie z rezystorem podciągającym o wartości dopiero 1kOhm.
Zasilanie 3 przewodami (3 x DS) działa prawidłowo dla 4,7kOhm.
Ale skoro jest możliwość podłączenia stron pull-up, to chciałem z niego skorzystać, tym bardziej, że czujniki docelowo będą podłączane do różnej długości przewodów.
Niby sprawa prosta włączam strong pull-up przed konwersją a wyłączam przed odczytaniem temperatury a jednak coś jest nie tak ????

Dziwi mnie fakt (tak jak pisałem wcześniej), pomiar prądu (tryb parasite opornik 3kOhm) dla jednego Dsa dochodzi do 0,8mA (wartość temp. na LCD poprawna), natomiast w momencie dołączenia drugiego DSa prąd jest bliski zero (na LCD wartość 85). Dioda led podłączona (na krótko w celach testu) równolegle do Dsa wyraźnie miga, więc strong pull-up działa. Czyli tak jakby dla 2 DSów nie została poprawnie wydana komenda CONVERT ? Tylko dlaczego te same funkcje działają poprawnie bez stron pull-up a z rezystorem 1kOhm ?

Podciągnięcie realizowałem też wykorzystując wolną nóżkę procesora, która teoretycznie ma wydajność chyba z 10mA ? i też nie działa.
Może jakieś opóźnienia trzeba poustawiać ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lis 2015, o 21:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

To ja stawiam na to, że za późno uruchamiasz podciągnięcie.
I patrząc się na twój kod masz po procedurze wysłania bajtu
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
a zgodnie z specyfikacją musisz:
Cytuj:
The 1-Wire bus must be switched to the strong pullup within 10μs (max) after a Convert T [44h] or Copy Scratchpad [48h] command is issued, and the bus must be held high by the pullup for the duration of the conversion (tCONV) or data transfer (tWR = 10ms).

Czyli robisz to za późno i to jest przyczyna resetowania się układów i nie wykonywania konwersji :)

Edit:
Tak popatrzyłem się na swoje procedury - po co dajesz te 100us po wysłaniu bajtu?

--
Pozdrawiam,
Robert


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lis 2015, o 23:13 
Offline
Użytkownik

Dołączył(a): 25 gru 2012
Posty: 128
Pomógł: 0

I tak to jest jak się chce coś na 'siłę' zrobić, to się popełnia takie babole.
Sam wspominałem, że dla 2 DSów tak jakby nie została wysłana komenda CONVERT czyli nie został poprawnie wysłany bajt danych. Tak naprawdę to komenda została wysłana, tylko ten nieszczęsny _delay_us(); rozwalił system. Nie wiem skąd on się tam wziął.
Teraz działa poprawnie nawet dla 6 Dsów (tylko tyle miałem pod ręką).
Pull-up 'brałem' bezpośrednio' z nóżki procesora i tak się zastanawiam czy jest sens stosowania dodatkowego tranzystora jeżeli 3 Dsy (tyle planuje w swoim termometrze) w czasie jednoczesnej konwersji pobierają tylko ~2mA prądu ?

Oczywiście WIELKIE 'Pomógł' i poproszę adres (na priv.) 4-pak czeka na nadanie :-)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 22 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO