Witam serdecznie
Moja znajomość bascoma jest na etapie początkującym, więc cały czas się uczę. Próbuję napisać program do obsługi dwóch czujników. zamieszczam program, niestety nie działa, może ktoś mi podpowie co źle robię.
Pozdrawiam
$regfile = "m8def.DAT"
$crystal = 8000000
$lib "I2C.LBX"
Config Lcdpin = Pind , Db4 = Portd.1 , Db5 = Portd.2 , Db6 = Portd.3 , Db7 = Portd.4 , E = Portd.0 , Rs = Portd.5
Config Lcd = 16 * 2
Config 1wire = Portd.7 'port 1wire czujnika temperatury ds18b20
Config Int1 = Low Level
Enable Interrupts
Dim Temp1 As Integer , Ss1 As String * 6
Dim Temp2 As Integer , Ss2 As String * 6
Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim T1 As Integer
Dim T2 As Integer
Dim W As Byte
Dim B As Byte
Dim X As Integer
Deflcdchar 0 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32 'znak stopnia Celcjusza
Declare Sub Poczatek
Declare Sub Sprawdzenie
Declare Sub Temp
Cls : Cursor Off
W = 1wirecount()
Lcd "Ilosc czujnikow:" 'Informuje ile czujników jest podpiętych do układu (pojawia się tylko podczas włączania urządzenia)
Waitms 200
Locate 2 , 8
Lcd W
Wait 2
Cls 'Znajdź pierwszy czujnik podpięty do portu
Dsid1(1) = 1wsearchfirst()
Dsid2(1) = 1wsearchnext() 'Znajdź kolejny czujnik podpięty do portu
If Dsid1(8) = Crc8(dsid1(1) , 7) Then 'ta opcja pojawia się tylko przy włączaniu urządzenia
Locate 1 , 1
Lcd "CRC OK Czujnik 1 ID"
Locate 2 , 1
For B = 1 To 8
Lcd Hex(dsid1(b))
Next
End If
Waitms 200
Cls
If Dsid2(8) = Crc8(dsid2(1) , 7) Then 'ta opcja pojawia się tylko przy włączaniu urządzenia
Locate 1 , 1
Lcd "CRC OK Czujnik 2 ID"
Locate 2 , 1
For B = 1 To 8
Lcd Hex(dsid2(b))
Next
End If
Waitms 200
Cls
Cursor Off
'-----------------PROGRAM GŁÓWNY---------------------------------------------------------------
Poczatek:
Cls
Do
Call Temp
Locate 1 , 11 : Lcd ; "in" ; Ss1 ; Chr(0)
Locate 2 , 11 : Lcd ; "out" ; Ss2 ; Chr(0)
Cls 'bez nie potrzebnego uzywania cls czyszczenia ekranu, :nie mrugal wyswietlacz
Loop
'--------------------------------------------------------------------------------
'odczyt temperatury
Temp:
1wreset
1wwrite &H55
1wverify Dsid1(1) 'wysyłamy adres pierwszego czujnika
1wwrite &HBE
Temp1 = 1wread(2)
1wreset
1wwrite &H55
1wverify Dsid2(1) 'wysylam adres drugiego czujnika
1wwrite &HBE
Temp2 = 1wread(2)
1wreset
1wwrite &HCC
1wwrite &H44
Waitms 750
Temp1 = Temp1 * 10
Temp1 = Temp1 / 16
T1 = Temp1 + 5
T1 = Temp1 - 5
Ss1 = Str(t1)
Ss1 = Format(ss1 , "0.0")
Temp2 = Temp2 * 10
Temp2 = Temp2 / 16
T2 = Temp2 + 5
T2 = Temp2 - 5
Ss2 = Str(t2)
Ss2 = Format(ss2 , "0.0")
Return
'--------------------------------------------------------------------------------
Odp. Termometr 2x DS18B20* Atmega 8
Zmieniłeś kod zanim zdażyłem odpowiedzieć.. teraz musze popatrzeć jeszcze raz bo się zmienił
...wiesz co. w obydwu sa takie błedy że dobrze będzie jak przeczytasz ten artykuł Mirleja http://mirley.firlej.org/obsluga_ds18x20
i połaczysz te wykrywanie adresów które miałes w poprzednik kodzie z tym kodem Mirleja na końcu. Po prostu zamiast na sztywno wpisanych danych dodaj te wykrywanie które miałeś
tylko tu się potem nazywaja dsid1 i dsid2 a w Mirlejowym kodzie DS1 i DS2 sobie pozmieniasz i się nauczysz czytając
Jeszcze jedno. Config 1wire mozesz mieć tylko jedno w kodzie jeśli wszystkie czujniki mają pracowac na jednej lini/magistrali. Wtedy jednak musisz znac ich adresy. Jesli jednak każdy czujnik jest na osobnej linii/pinie procesora to adresy sa niepotrzebne i Config 1wire, ale potrzebujesz dwóch pinów i musisz pisać którego ma uzyć w danym momencie ( który czujnik).
BARTek
Moja strona
termometr
Zmieniłem na poprzedni kod
oto kod po przeróbce:
z tym że wyskakuje mi błąd w dwóch linijkach
może przez to że zmienna tempa jest typu integer
Odp. Termometr
Nie bardzo chce mi się analizować cały kod ale napewno tempa musi być typu single. W instrukcji do polecenia Fusing pisze że musi to być Single.
Wszystko zależy od tego jak się podchodzi do sprawy przecinka. Zmienne typu single potrafi zapisac przecinek i to że zmienna jest ujemna. Integer potrafi tylko to że zmienna jest ujemna. Obliczenia na Single kosztują jednak więcej mocy i czasu. Dla małych projektów to nieistotne. W innych rozwiązaniach mnoży się przed obliczeniami na przykład x10 co powoduje że przecinka nie ma. zamiast 23,4 będzie 234. Na końcu wynik to odpowiednio wartość 234/10 dorysowany przecinek i wartośc reszty z dzielenia przez 10 czyli 234 MOD 10
Wiesz co... po namyśle troche posprzątałem
Musisz uważać i nie ustawiać portów jako wyjściowych jeśli to niepotrzebne bo można przypadkowo uszkodzić mikrokontroler.
Miłego dnia
BARTek
Moja strona
termometr
Wielkie dzieki Bartek, zaraz będę sprawdzał kod. Jeszcze jedno pytanie odnośnie minusowych tem. jaki będzie odczyt z DS?
Odp. Termometr
Prawdę powiedziawszy to nie wiem. Nie miałem czasu sprawdzić. Pracowałem nad zleconym projektem. Dekoduje sekwencje znaków jak SelCall (można o tym poczytać) Wykorzystywane w radio łączności morskiej i okazuje się w sterowaniu komputerami poprzez internet.
W tym Twoim termometrze to dużo jeszcze można by poprawić. Rzadko sie używa Cls w pętli. Lepiej było by przed pętlą
napisać IN i OUT.. a potem tylko odświeżać poprzez Locate wyniki..takiego migania można uniknąć.
Nie mówię że to działa. Może będziesz musiał coś poprawić.
Miłego testowania.
BARTek
Moja strona
Termometr
Witam
Przepraszam że dopiero się odzywam, ale chwilowo nie mogłem nic napisać.
Dzięki Bartek za pomoc. Ten kod wyżej nie działał prawidłowo i jeszcze te mruganie wyświetlacza. Zmieniłem trochę kod:
Ten kod wyżej nie działa mi jeszcze prawidłowo, mianowicie po podłączeniu 1 czujnika wyświetla mi tem. w 2-uch pozycjach
termometr
znalazłem błąd
jeszcze jedno pytanie jak zrobić żeby w momencie kiedy uszkodzi się któryś czujnik lub przewód od tego czujnika wyświetlał się komunikat np "err"?
Termometr 2xDS18B20
Prosze. Tym razem potestowany bo miałem pod ręką.
Wykrywa przerwy w obwodzie. Minus to to , że może ERROR pokazać przechodząc przez zero, ale to się zdarza rzadko by było równo 0.0 Jakoś nie chciało mi się tego sobie utrudniać :D
Można to też zapisać tak
Zmienna Err jest systemową i zbiera rezultat ostatniej wykonywanej operacji. Jeśli operacja zakończy się sukcesem ma wartość 0.
W obydwu przypadkach jednak jeśli przy włączaniu urządzenia mamy tylko jeden czujnik to jego adres będzie przypisany do dwóch rejestrów. Jak zawsze wszystko można rozwiązać. Zależy co kto potrzebuje :D
BARTek
Moja strona
Termometr
A jakby przypisał ID czujnika na stałe?
termometr
Ten post wyżej to ja pisałem.Mam jeszcze jedno pytanie. Jak to jest z czujnikami DS18B20 że program odczytuje ID pierwszego czujnika jako pierwszy, a drugiego jako drugi? Zapewne procek wysyła zapytanie i czeka na odpowiedz DS i ten który pierwszy się odezwie to jest pierwszy. Od czego to zależy który pierwszy sie odezwie?
Odp. Termometr 2x DS18B20* Atmega 8
Proszę. Zapisuje do pamięci jeśli zwarta jest zworka lub naciśnięty przy uruchamianiu przycisk. Wprowadzając coś więcej można uczyć po jednym czujniku. Te procedury szukania i zapamiętywania adresów były by niepotrzebne gdyby dla każdego z czujników użyć osobnego pinu mikrokontrolera. Zawsze należy to rozważyć w zalezności jaki jest rozkład przewodów i zajętość wyprowadzeń mikrokontrolera. Piszę to jednak tak dla wprawy bo Dallas produkuje nie tylko te termometry hahahaha :D
Jeszcze jedno. Jeśli korzystasz z pamieci EEprom to radze zmienić FuseBit`y BODEN i BODLEVEL odpowiedzialne za to żeby procesor nie pracował jeśli zasilanie nie może zagwarantować poprawnej pracy. Bez tego po czasie w pamięci mogą pojawić się śmieci i trzeba będzie na nowo przyuczać czujniki.
Denerwująca tez może być ciągła konieczność uczenia po programowaniu. Spowodowane jest to tym, że pamieć EE jest czyszczona przy programowaniu. Można to wyłączyć programując bit EESAVE.
BARTek
Moja strona
Termometr 4 x DS18B20
Witam.
Panowie widzę że kolega Bartek ma dużo wiedzy odnośnie bascoma. A ja chciałbym wykorzystać np 4 osobne porty do odczytu danych z DS...bo mam akurat dużo pinów na uC wolnych. Wiem że na początku nie piszę się config 1wire...
Myślałem o czymś takim, Jak na razie są tylko 2 ds
Tyle że przy takim programie będzie wyświetlana temperatura mrugała
Odp. Termometr 4xDS18B20 + foto :)
No tak nie za bardzo ten Twój kodzik, ale wszystko przed Tobą :P
Programuję w różnych językach. Bardzo jednak cenię sobie kody Mirleja bo uczą matematycznego podejścia do niektórych spraw. Zmienne mogą być parametrem dla innych, a na parametrach jeszcze możesz działać. Poniżej kod dla czterech czujników, który gdyby się dobrze rozejrzeć tu na stronie każdy mógłby napisać :P
Hahaha miałem tylko dwa DS`y luzem :P
BARTek
Moja strona
termometr 4xds18b20
Witam kolegę Bartka
Dobry kawałek roboty, wielkie dzięki, Nie wiem czy uda mi się sprawdzić kod jeszcze przed świętami, ale na pewno sprawdzę.
Wesołych świąt wszystkim życzę