Elektroda.pl
Elektroda.pl
X
Arrow Multisolution Day
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[ATMega32][Bascom]DS18B20 po pewnym czasie świruje.

Futrzaczek 20 Sie 2009 21:39 5934 43
  • #1 20 Sie 2009 21:39
    Futrzaczek
    Admin Grupy Retro

    Witam wszystkich :idea: Z góry proszę o odrobinę wyrozumiałości, mikroprocesory nie są obiektem moich codziennych zainteresowań :?
    Zatem do rzeczy. Wykonałem coś w stylu domowego termometru. Pomiar temperatury z małego pieca, dużego pieca, bojlera i wody wracającej do dużego pieca. Jako, że mały piec (przedwojenne zduńskie cacuszko) lubi się czasem zagotować, dodałem odpowiednie systemy sterujące pompą obiegową.
    Zatem program:

    Code:
    Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
    
    Config Porta = Output                                       'wyświetlacze LED
    Config 1wire = Portd.6
    Config Pinb.0 = Input                                       'przycisk odejmowania
    Config Pinb.1 = Input                                       ' przycisk dodawania i górnej linii
    Config Pinb.2 = Input                                       'przycisk kalibracji
    Config Portb.3 = Output                                     'dioda alarmowa
    Config Portc.0 = Output                                     'stałe mieszanie wody
    Config Portc.1 = Output                                     'okresowe mieszanie wody
    Dim Led As Integer                                          'temperatura rzucana na LEDa
    Dim Twoda As Integer                                        'temperatura wody
    Dim Tpco As Integer                                         'temperatura pieco co
    Dim Tmpiec As Integer                                       'temperatura małego pieca
    Dim Tpowrot As Integer                                      'temperatura powrotu
    Dim Bwoda(9) As Byte                                        'surowy odczyt z czujki wody




    Dim Bpco(9) As Byte                                         'surowy odczyt z pieca co
    Dim Bmpiec(9) As Byte                                       'surowy odczyt z małego pieca
    Dim Bpowrot(9) As Byte                                      'surowy odczyt z powrotu
    Dim Lgr As Byte                                             'licznik naciśnięć dla górnej linii
    Dim Awoda(8) As Byte                                        'ID czujki bojlera, numer 1
    Dim Apco(8) As Byte                                         'ID czujki na dużym piecu, numer 2
    Dim Ampiec(8) As Byte                                       'ID czujki na małym piecu, numer 0
    Dim Apowrot(8) As Byte                                      'ID czujki powrotu
    Dim Kalwoda As Eram Integer                                 'wartość kalibracji dla bojlera, adres 1
    Dim Kalpco As Eram Integer                                  'wartość kalibracji dla pieca co, adres 3
    Dim Kalmpiec As Eram Integer                                'wartość kalibracji dla małego pieca, adres 5
    Dim Kalpowrot As Eram Integer                               'wartość kalibracji dla wody powrotnej
    Dim Kwoda As Integer
    Dim Kpco As Integer
    Dim Kmpiec As Integer
    Dim Kpowrot As Integer                                      '
    Deflcdchar 4 , 31 , 17 , 31 , 17 , 17 , 31 , 17 , 31        ' znak małego pieca
    Deflcdchar 3 , 32 , 14 , 4 , 4 , 31 , 1 , 32 , 1            ' znak bojlera
    Deflcdchar 5 , 4 , 4 , 31 , 17 , 17 , 29 , 17 , 31          ' znak pieca CO
    Deflcdchar 6 , 31 , 1 , 1 , 5 , 13 , 31 , 12 , 4            ' znak temperatury powrotu
    Deflcdchar 2 , 16 , 16 , 20 , 24 , 16 , 16 , 31 , 32        ' znak Ł
    Deflcdchar 1 , 4 , 31 , 1 , 6 , 12 , 16 , 31 , 32           ' znak Ż
    Cls
    Declare Sub Odczyt
    Declare Sub Kalibracja
    Declare Sub Zmiana_gorna_linia
    Declare Sub Sterowanie
    Readeeprom Kwoda , 1
    Readeeprom Kpco , 3
    Readeeprom Kmpiec , 5
    Readeeprom Kpowrot , 7
    Awoda(1) = 40
    Awoda(2) = 91
    Awoda(3) = 94
    Awoda(4) = 174
    Awoda(5) = 0
    Awoda(6) = 0
    Awoda(7) = 0
    Awoda(8) = 67
    Apco(1) = 40
    Apco(2) = 49
    Apco(3) = 79
    Apco(4) = 202
    Apco(5) = 0
    Apco(6) = 0
    Apco(7) = 0
    Apco(8) = 96
    Ampiec(1) = 40
    Ampiec(2) = 19
    Ampiec(3) = 118
    Ampiec(4) = 174
    Ampiec(5) = 0
    Ampiec(6) = 0
    Ampiec(7) = 0
    Ampiec(8) = 81
    Apowrot(1) = 40
    Apowrot(2) = 9
    Apowrot(3) = 105
    Apowrot(4) = 215
    Apowrot(5) = 0
    Apowrot(6) = 0
    Apowrot(7) = 0
    Apowrot(8) = 237
    Set Portb.3
    Set Portc.0
    Set Portc.1
    Lgr = 0
    1wreset
    Upperline
    Lcd "TERMOMIARKA"
    Lowerline
    Lcd "FUTRZAK INC 2009"
    Cursor Off
    Wait 5
    Do
    Odczyt
    If Pinb.2 = 0 Then
    Kalibracja
    Else
    Zmiana_gorna_linia
    End If
    Sterowanie
    Loop
    End

    Sub Odczyt
    1wreset                                                     'temp. wody
    1wwrite &HCC
    1wwrite &H44
    Waitms 800
    1wreset
    1wwrite &H55
    1wwrite Awoda(1) , 8
    1wwrite &HBE
    Bwoda(1) = 1wread(9)
    Twoda = Makeint(bwoda(1) , Bwoda(2))
    Twoda = Twoda / 16
    Twoda = Twoda + Kwoda
    Waitms 40
    1wreset                                                     'temp. pieca co
    1wwrite &HCC
    1wwrite &H44
    Waitms 800
    1wreset
    1wwrite &H55
    1wwrite Apco(1) , 8
    1wwrite &HBE
    Bpco(1) = 1wread(9)
    Tpco = Makeint(bpco(1) , Bpco(2))
    Tpco = Tpco / 16
    Tpco = Tpco + Kpco
    Waitms 40
    1wreset                                                     'temp. małego pieca
    1wwrite &HCC
    1wwrite &H44
    Waitms 800
    1wreset
    1wwrite &H55
    1wwrite Ampiec(1) , 8
    1wwrite &HBE
    Bmpiec(1) = 1wread(9)
    Tmpiec = Makeint(bmpiec(1) , Bmpiec(2))
    Tmpiec = Tmpiec / 16
    Tmpiec = Tmpiec + Kmpiec
    Waitms 40
    1wreset                                                     'temp. wody powrotu
    1wwrite &HCC
    1wwrite &H44
    Waitms 800
    1wreset
    1wwrite &H55
    1wwrite Apowrot(1) , 8
    1wwrite &HBE
    Bpowrot(1) = 1wread(9)
    Tpowrot = Makeint(bpowrot(1) , Bpowrot(2))
    Tpowrot = Tpowrot / 16
    Tpowrot = Tpowrot + Kpowrot
    Waitms 40
    End Sub


    Sub Kalibracja
    Cls
    Upperline
    Lcd "Kalibracja"
    Lowerline
    Lcd Chr(5 ) ; Tmpiec ; " " ; Chr(4 ) ; Tpco ; " " ; Chr(3 ) ; Twoda ; " " ; Chr(6) ; Tpowrot
    Cursor Off
    If Pinb.1 = 0 Then
    Select Case Lgr
    Case 0 :
    Incr Kmpiec
    Writeeeprom Kmpiec , 5
    Case 1 :
    Incr Kwoda
    Writeeeprom Kwoda , 1
    Case 2 :
    Incr Kpco
    Writeeeprom Kpco , 3
    Case 3:
    Incr Kpowrot
    Writeeeprom Kpowrot , 7
    End Select
    End If

    If Pinb.0 = 0 Then
    Select Case Lgr
    Case 0 :
    Decr Kmpiec
    Writeeeprom Kmpiec , 5
    Case 1 :
    Decr Kwoda
    Writeeeprom Kwoda , 1
    Case 2 :
    Decr Kpco
    Writeeeprom Kpco , 3
    Case 3:
    Decr Kpowrot
    Writeeeprom Kpowrot , 7
    End Select
    End If
    End Sub


    Sub Zmiana_gorna_linia
    If Pinb.0 = 0 Then
    Decr Lgr
    End If

    If Pinb.1 = 0 Then
    Incr Lgr
    End If

    If Lgr >= 4 Then
    Lgr = 0
    End If

    If Lgr >= 4 Then
    Lgr = 0
    End If

    Select Case Lgr
    Case 0:
    Cls
    Upperline
    Lcd "MA" ; Chr(2 ) ; "Y PIEC"
    Lowerline
    Lcd Chr(5 ) ; Tmpiec ; " " ; Chr(4 ) ; Tpco ; " " ; Chr(3 ) ; Twoda ; " " ; Chr(6) ; Tpowrot
    Cursor Off
    Led = Makebcd(tmpiec)
    Porta = Led
    Case 2:
    Cls
    Upperline
    Lcd "DU" ; Chr(1 ) ; "Y PIEC"
    Lowerline
    Lcd Chr(5 ) ; Tmpiec ; " " ; Chr(4 ) ; Tpco ; " " ; Chr(3 ) ; Twoda ; " " ; Chr(6) ; Tpowrot
    Cursor Off
    Led = Makebcd(tpco)
    Porta = Led
    Case 1:
    Cls
    Upperline
    Lcd "BOJLER"
    Lowerline
    Lcd Chr(5 ) ; Tmpiec ; " " ; Chr(4 ) ; Tpco ; " " ; Chr(3 ) ; Twoda ; " " ; Chr(6) ; Tpowrot
    Cursor Off
    Led = Makebcd(twoda)
    Porta = Led
    Case 3:
    Cls
    Upperline
    Lcd "WODA POWROTNA"
    Lowerline
    Lcd Chr(5 ) ; Tmpiec ; " " ; Chr(4 ) ; Tpco ; " " ; Chr(3 ) ; Twoda ; " " ; Chr(6) ; Tpowrot
    Cursor Off
    Led = Makebcd(tpowrot)
    Porta = Led
    End Select
    End Sub

    Sub Sterowanie
    If Tmpiec >= 55 Then
    If Twoda < Tmpiec Then
    Reset Portc.1
    Else
    Set Portc.1
    End If
    End If

    If Tmpiec >= 85 Then
    Reset Portc.0
    Else
    Set Portc.0
    End If

    If Tmpiec >= 92 Then
    Reset Portb.3
    Lgr = 0
    Else
    Set Portb.3
    End If

    End Sub

    Jedna z wybranych temperatur prezentowana jest na wyświetlaczu LED (CD4543 sztuk dwa i komenda Makebcd). Wszystkie natomiast są widoczne w dolnej linii wyświetlacza LCD - wraz z odpowiednim znaczkiem, dla łatwiejszej identyfikacji. Możliwe jest skalibrowanie każdej z temperatur poprzez przytrzymanie przycisku Pinb.2 i Pinb.0 lub Pinb.1. Przyciskami Pinb.0 i Pinb.1 (przy wyciśniętym Pinb.2) zmienia się temperaturę pokazywaną na LEDach oraz opis w górnej linii LCDeka.
    Połączenie między procesorem a czujnikami jest dość długie - ok. 10 metrów, stamtąd się rozgałęzia (każda gałąź 2-4 metry) na poszczególne czujki. Wszystkie przewody są ekranowane. Zasilanie mikroprocesora jest odsprzęgnięte kondensatorami 1000uF, 47nF, 470uF. Dodatkowo, przy samych nóżkach procesora są dwa kondensatory 47nF. AVCC, VCC i AREF spięte razem do zasilania, GDN i AGND idą do masy. Zasilanie stabilizowane przez układ 7805, około 20cm od procesora.

    Problem:
    Po uruchomieniu urządzenia wszystko jest w porządku, temperatury wskazywane są poprawnie (nie ma czujnika wody powrotnej, więc tam pokazuje stale -1.)
    Po kwadransie temperatury te zaczynają żyć własnym życiem, od zera do tysiąca ponad stopni. Wydłużyłem opóźnienie na konwersję z 500ms do 800ms - bez skutku.

    Proszę o radę :cry:

    0 29
  • Arrow Multisolution Day
  • #2 20 Sie 2009 21:45
    kulmar
    Poziom 25  

    A jak zasilasz czujniki ?

    Pozdrawiam

    Mariusz

    0
  • #3 20 Sie 2009 21:47
    Futrzaczek
    Admin Grupy Retro

    Z tego samego 7805. Zasilanie do nich idzie tym długaśnym kablem. Napięcie na rozwidleniu wynosi 4,99V. Nie ma tam żadnego filtru.

    Dodam jeszcze, że na te wariactwa nie pomaga reset procesora.

    0
  • Pomocny post
    #4 20 Sie 2009 21:49
    kulmar
    Poziom 25  

    To na początek dolutuj do czujników minimum 100nF na każdy. Możliwie blisko nóżek.

    Pozdrawiam

    Mariusz

    0
  • Arrow Multisolution Day
  • #5 20 Sie 2009 21:54
    Futrzaczek
    Admin Grupy Retro

    Czy możliwe jest, by brak tych kondensatorów wpływał także na wskazania fizycznie nieistniejączej czujki? - chodzi tu o powrót wody do pieca CO.

    Aczkolwiek, po wydłużeniu czasu przeznaczonego na konwersję, w tym polu stale i niezmiennie jest -1.

    0
  • #6 20 Sie 2009 21:58
    kulmar
    Poziom 25  

    Futrzaczek napisał:
    Czy możliwe jest, by brak tych kondensatorów wpływał także na wskazania fizycznie nieistniejączej czujki? - chodzi tu o powrót wody do pieca CO.

    Aczkolwiek, po wydłużeniu czasu przeznaczonego na konwersję, w tym polu stale i niezmiennie jest -1.


    Nie rozumiem. Czy mamy przeanalizować zachowanie procesora przy odczycie z nieistniejącej czujki, czy też interesują Cię poprawne wskazania tych podłączonych ?

    Pozdrawiam

    Mariusz

    0
  • #7 20 Sie 2009 22:11
    Futrzaczek
    Admin Grupy Retro

    Jasne, że to drugie :) Po prostu zwróciło to moją uwagę.

    Jutro dam znać o wynikach.


    EDIT://
    Temperatura na małym piecu spadła do 58°C, cały układ zachowuje się wzorowo.
    Z moich obserwacji wynika, że głupawka zaczyna się powyżej około 70°C.

    0
  • #8 21 Sie 2009 07:55
    flapo213
    Poziom 21  

    Hmmm z tego co piszesz wynika jasno że coś jest raczej nie tak z programem. Jeśli chodzi o Bascoma nie pomogę ja programuję w C. Ale zadam Ci kilka pytań i może się coś wyjaśni. Czy Ty badasz CRC odczytywanych temperatur? Nie wiem jak Ty konwertujesz wynik pomiaru ale przychodzące dane i konstrukcja ramki raczej nie pozwala na 1000C przekazanie temperatury !. 10m dla Dallasowej magistrali 1Wire to trochę za dużo ale to kwestia prób, przy błędnej transmisji CRC Ci powinno wywalić, a program powinieneś mieć tak skonstruowany żeby np po powiedzmy 100 próbie zablokował Ci sterownik tzn wprowadził go w tryb bezpiecznej pracy (aby Ci pieca nie rozsadziło). Pamiętaj że są 3 rodzaje czujników DS18x20 każdy ma inną dokładność co w praktyce oznacza inny sposób konwersji wyniku.

    0
  • #9 21 Sie 2009 08:31
    kulmar
    Poziom 25  

    Futrzaczek napisał:
    Temperatura na małym piecu spadła do 58°C, cały układ zachowuje się wzorowo.
    Z moich obserwacji wynika, że głupawka zaczyna się powyżej około 70°C.


    Czy to oznacza, ze już dolutowałeś kondensatory ?

    Pozdrawiam

    Mariusz

    0
  • #10 21 Sie 2009 10:28
    Futrzaczek
    Admin Grupy Retro

    kulmar napisał:
    Czy to oznacza, ze już dolutowałeś kondensatory ?

    Nie, absolutnie nic przy układzie nie ruszałem, sam zaczął poprawnie działać po ostygnięciu pieca. Kondensatorami postaram się dziś zająć, aczkolwiek nie jest to prosta sprawa - mało miejsca.
    Zostawiłem to urządzenie włączone na noc, rano odczyty również były poprawne. Zakłócenia EM (lutownica transformatorowa i świetlówka kompaktowa w odgległości kilku cm od czujników i procesora) nie mają nań żadnego wpływu.
    Czy wpływ na taki stan rzeczy może mieć fakt, iż czujnik od pieca został przypadkowo włączony odwrotnie podczas prób na stole? Zagrzał się porządnie przez kilka sekund, ale po odwróceniu wróciło wszystko do normy. Zatem uznałem, że ten wypadek nie ma żadnego znaczenia.

    Zanim jednak wezmę się za rozgrzebywanie pancernie zalepionych czujników, chciałbym przeprowadzić mały test. Otóż, odkleję od rury czujkę pieca i przyłożę ją do garnka z wrzątkiem. Odczyty powinny oszaleć. Potem zrobię to samo z czujką na bojlerze - jeśli odczyty będą poprawne, winny będzie czujnik na piecu. lub fragment programu z nim związany.

    flapo213 napisał:
    Czy Ty badasz CRC odczytywanych temperatur?

    Yyyy... Taką komendę odczytu temperatury znalazłem na forum, przekabaciłem jedynie nazwy zmiennych i skonfrontowałem powstały twór z książką "Programowanie mikrokontrolerów AVR w języku BASCOM".

    flapo213 napisał:
    10m dla Dallasowej magistrali 1Wire to trochę za dużo ale to kwestia prób

    Wygrzebałem gdzieś zalecenie, by dla takich odległości wartość rezystora podciągającego wynosiła 2,2kΩ - co też zrobiłem.

    0
  • #11 21 Sie 2009 10:47
    kulmar
    Poziom 25  

    Futrzaczek napisał:
    kulmar napisał:
    Czy to oznacza, ze już dolutowałeś kondensatory ?

    Nie, absolutnie nic przy układzie nie ruszałem, sam zaczął poprawnie działać po ostygnięciu pieca.


    Kolego ! Napisałeś jak pięknie zblokowałeś zasilanie procesora, a uważasz, ze czujniki z magistralą 1-WIRE, które są po prostu specjalizowanymi procesorami będą pracowały poprawnie na 10m kawałku drutu ? Mozesz oczywiscie dalej eksperymentować, ale bez zablokowania zasilania tych czujników wartość tych badań jest zerowa.

    Pozdrawiam

    Mariusz

    0
  • #12 21 Sie 2009 11:29
    flapo213
    Poziom 21  

    Suchaj na nic kombinacje, naturalnie kondziora musisz dodać ale ja proponuję abyś zrobił sobie taki mały rejestrator z zapisem do eeproma wewnętrznego przecież to chwilę roboty a może Ci się przydać.

    1. Koniecznie przy błędnym CRC zapisuj datę i godzinę zdarzenia.

    2. Sprawdzaj tzw. timeout z czujnika jeśli masz 12 bitowca to max czas chyba jest coś około 800ms, to tym czasie wiesz że jeśli układ nie odpowiedział to coś z nim nie halo albo zasilanie kicha albo błąd transmisji czyli nie odebrałeś należytej liczby danych.

    Po analizie tych danych będziesz miał jakiś pogląd co się dzieje z twoim czujnikiem, bez tego to jest gdybanie.

    PS. Jak rozumiem wykonuje Pan sterownik do pieca CO, ja wykonałem dokładnie taki sterownik z 2 dallasami i znam dobrze problem o którym opowiada ten post. Nie należy ignorować tych błędów bo może się czasami to źle skończyć bez dodatkowych zabezpieczń (bimetalicznych czujników np na 90 stopni).

    0
  • #13 21 Sie 2009 12:01
    Futrzaczek
    Admin Grupy Retro

    Kondensatory zostały dodane. 2x47nF przy każdym czujniku - były mniejsze gabarytowo, a pojemność prawie ta sama. Po tym wykonałem test z garnuszkiem, o którym pisałem wcześniej. Wyniki są takie: jeśli czujkę pieca rozgrzeję do ok. 80*C, pomiary skaczą, aczkolwiek w mniejszym już stopniu. Po ostudzeniu jej i rozgrzaniu czujki bojlera (84*C i powoli opada) reszta jest stabilna.

    Nie wiem jak dla Was, ale dla mnie to niezawodny znak, że trzeba wymienić czujkę pieca na nową. Najwyraźniej zaszkodziła jej ta "chwilowa zamiana miejsc". Na szczęście mam jeszcze trzy DSy z opisanym na papierku ID, więc to żaden kłopot :)

    Jaki jest Wasz werdykt?

    :arrow: flapo213
    Prosiłem - jam jest jest zieloniusi jak trawka w kwietniu... :|

    Cytat:
    PS. Jak rozumiem wykonuje Pan sterownik do pieca CO, ja wykonałem dokładnie taki sterownik z 2 dallasami i znam dobrze problem o którym opowiada ten post.

    Niedobrze mnie rozumiesz. Jest to urządzenie pozwalające bez wychodzenia z domu sprawdzić temperaturę na trzech najważniejszych miejscach. Pierwotnie owe urządzonko miało wyłącznie odczytywać temperaturę, jednakowoż dodałem kilka linijek pozwalających na zgrubną kontrolę nad małym piecem (w lato wystarczą trzy szczapki drewna i garść śmieci by 160 litrów wody w bojlerze było gorące - niestety, piec ten lubi się "rozhajcować", stąd konieczność stałej kontroli)

    0
  • Pomocny post
    #14 21 Sie 2009 15:03
    flapo213
    Poziom 21  

    Jeśli Ci temperatura skacze to no wskazuje na uszkodzonego dallasa, spróbuj wymianić na nowy jak napisałeś. Co do bezpieczeństwa to ok napisałeś że cudów tam nie będzie więc jest ok. Wymień i powinno być dobrze ja miałem podobny problem ze skaczącym pomiarem. Pozdrawiam

    0
  • #15 21 Sie 2009 15:19
    fiskusmati
    Użytkownik obserwowany

    Nie wiem co wy sie tago zasilania czepiacie tak ja mam ładowarke chyba impulsową do se 450mA 4,9V Pod obciązeniem na procku jest 4,6V a na układzie ds1820 ktory jest pociagniaty 4 zylowym kablem (dane, zasilanie i gnd wszytko oddzielnie) 30m i zadnego kondensatora nie ma ani przy układach ani na płytce (na płytce są tylko 100nF do filtracji ADC) i 2x 33 lub 27pF przy kwarcu. Wszytko działa nigdy sie nie wieszało ;-)

    0
  • #17 21 Sie 2009 22:06
    Futrzaczek
    Admin Grupy Retro

    Prawieprzewodnika wymieniłem dwie godziny temu. Katowałem go wrzątkiem, wszystko okazało się w porząsiu. Przy okazji poprawiłem kilka byków w programie. Układ działa rewelacyjnie! :D

    Z mojej strony temat zakończony, dziękuję za wszystkie wpisy :)

    PS. Na odsprzęganie zasilania jestem wyczulony - praktyka z układów lampowych. Lecz na te 100nF w życiu bym nie wpadł :)

    Dodano po 5 [godziny] 49 [minuty]:

    Lipa w krzaki, że tak się wyrażę...
    Znowu to samo - na rozgrzanym piecu temperatura pokazywana na LCD waha się między 7 a 8. Inne temperatury są zaniżane o kilka - kilkanaście stopni. Nie występują już tak drastyczne wahania.
    Załączam uaktualniony kod programu. Czy jakiś znawca BASCOMa może się na jego temat wypowiedzieć?
    EDIT: Nowe obserwacje. Niekiedy układ "zaskakuje" i odczytuje poprawnie wszystkie temperatury. Czyżby trefna była komunikacja z DS18B20?

    Do wtorku włącznie nie mam dostępu do internetu.

    Code:
    Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
    
    Config Porta = Output                                       'wyświetlacze LED
    Config 1wire = Portd.6
    Config Pinb.0 = Input                                       'przycisk odejmowania i dolnej linii
    Config Pinb.1 = Input                                       ' przycisk dodawania i górnej linii
    Config Pinb.2 = Input                                       'przycisk kalibracji
    Config Portb.3 = Output                                     'dioda alarmowa
    Config Portc.0 = Output                                     'stałe mieszanie wody
    Config Portc.1 = Output                                     'okresowe mieszanie wody
    Dim Led As Integer                                          'temperatura rzucana na LEDa
    Dim Twoda As Integer                                        'temperatura wody
    Dim Tpco As Integer                                         'temperatura pieco co
    Dim Tmpiec As Integer                                       'temperatura małego pieca
    Dim Tpowrot As Integer                                      'temperatura powrotu
    Dim Bwoda(9) As Byte                                        'surowy odczyt z czujki wody
    Dim Bpco(9) As Byte                                         'surowy odczyt z pieca co
    Dim Bmpiec(9) As Byte                                       'surowy odczyt z małego pieca
    Dim Bpowrot(9) As Byte                                      'surowy odczyt z powrotu
    Dim Lgr As Byte                                             'licznik naciśnięć dla górnej linii
    Dim Awoda(8) As Byte                                        'ID czujki bojlera, numer 1
    Dim Apco(8) As Byte                                         'ID czujki na dużym piecu, numer 2
    Dim Ampiec(8) As Byte                                       'ID czujki na małym piecu, numer 0
    Dim Apowrot(8) As Byte                                      'ID czujki powrotu
    Dim Kalwoda As Eram Integer                                 'wartość kalibracji dla bojlera, adres 1
    Dim Kalpco As Eram Integer                                  'wartość kalibracji dla pieca co, adres 3
    Dim Kalmpiec As Eram Integer                                'wartość kalibracji dla małego pieca, adres 5
    Dim Kalpowrot As Eram Integer                               'wartość kalibracji dla wody powrotnej
    Dim Kwoda As Integer
    Dim Kpco As Integer
    Dim Kmpiec As Integer
    Dim Kpowrot As Integer                                      '
    Deflcdchar 4 , 31 , 17 , 31 , 17 , 17 , 31 , 17 , 31        ' znak małego pieca
    Deflcdchar 3 , 32 , 14 , 4 , 4 , 31 , 1 , 32 , 1            ' znak bojlera
    Deflcdchar 5 , 4 , 4 , 31 , 17 , 17 , 29 , 17 , 31          ' znak pieca CO
    Deflcdchar 6 , 31 , 1 , 1 , 5 , 13 , 31 , 12 , 4            ' znak temperatury powrotu
    Deflcdchar 2 , 16 , 16 , 20 , 24 , 16 , 16 , 31 , 32        ' znak Ł
    Deflcdchar 1 , 4 , 31 , 1 , 6 , 12 , 16 , 31 , 32           ' znak Ż
    Cls
    Declare Sub Odczyt
    Declare Sub Kalibracja
    Declare Sub Zmiana_gorna_linia
    Declare Sub Sterowanie
    Readeeprom Kwoda , 1
    Readeeprom Kpco , 3
    Readeeprom Kmpiec , 5
    Readeeprom Kpowrot , 7
    Awoda(1) = 40
    Awoda(2) = 91
    Awoda(3) = 94
    Awoda(4) = 174
    Awoda(5) = 0
    Awoda(6) = 0
    Awoda(7) = 0
    Awoda(8) = 67
    Apco(1) = 40
    Apco(2) = 49
    Apco(3) = 79
    Apco(4) = 202
    Apco(5) = 0
    Apco(6) = 0
    Apco(7) = 0
    Apco(8) = 96
    Ampiec(1) = 40                                              '40
    Ampiec(2) = 88                                              '19
    Ampiec(3) = 231                                             '118
    Ampiec(4) = 200                                             '174
    Ampiec(5) = 0
    Ampiec(6) = 0
    Ampiec(7) = 0
    Ampiec(8) = 63                                              '81
    Apowrot(1) = 40
    Apowrot(2) = 9
    Apowrot(3) = 105
    Apowrot(4) = 215
    Apowrot(5) = 0
    Apowrot(6) = 0
    Apowrot(7) = 0
    Apowrot(8) = 237
    Set Portb.3
    Set Portc.0
    Set Portc.1
    Lgr = 0
    1wreset
    Upperline
    Lcd "TERMOMIARKA"
    Lowerline
    Lcd "FUTRZAK INC 2009"
    Cursor Off
    Wait 5
    Do
    Odczyt
    If Pinb.2 = 0 Then
    Kalibracja
    Else
    Zmiana_gorna_linia
    End If
    Sterowanie
    Loop
    End

    Sub Odczyt
    1wreset                                                     'temp. wody
    1wwrite &HCC
    1wwrite &H44
    Waitms 800
    1wreset
    1wwrite &H55
    1wwrite Awoda(1) , 8
    1wwrite &HBE
    Bwoda(1) = 1wread(9)
    Twoda = Makeint(bwoda(1) , Bwoda(2))
    Twoda = Twoda / 16
    Twoda = Twoda + Kwoda
    Waitms 40
    1wreset                                                     'temp. pieca co
    1wwrite &HCC
    1wwrite &H44
    Waitms 800
    1wreset
    1wwrite &H55
    1wwrite Apco(1) , 8
    1wwrite &HBE
    Bpco(1) = 1wread(9)
    Tpco = Makeint(bpco(1) , Bpco(2))
    Tpco = Tpco / 16
    Tpco = Tpco + Kpco
    Waitms 40
    1wreset                                                     'temp. małego pieca
    1wwrite &HCC
    1wwrite &H44
    Waitms 800
    1wreset
    1wwrite &H55
    1wwrite Ampiec(1) , 8
    1wwrite &HBE
    Bmpiec(1) = 1wread(9)
    Tmpiec = Makeint(bmpiec(1) , Bmpiec(2))
    Tmpiec = Tmpiec / 16
    Tmpiec = Tmpiec + Kmpiec
    Waitms 40
    1wreset                                                     'temp. wody powrotu
    1wwrite &HCC
    1wwrite &H44
    Waitms 800
    1wreset
    1wwrite &H55
    1wwrite Apowrot(1) , 8
    1wwrite &HBE
    Bpowrot(1) = 1wread(9)
    Tpowrot = Makeint(bpowrot(1) , Bpowrot(2))
    Tpowrot = Tpowrot / 16
    Tpowrot = Tpowrot + Kpowrot
    Waitms 40
    End Sub


    Sub Kalibracja
    Cls
    Upperline
    Lcd "Kalibracja"
    Lowerline
    Lcd Chr(5 ) ; Tmpiec ; " " ; Chr(4 ) ; Tpco ; " " ; Chr(3 ) ; Twoda ; " " ; Chr(6) ; Tpowrot
    Cursor Off
    If Pinb.1 = 0 Then
    Select Case Lgr
    Case 0 :
    Incr Kmpiec
    Writeeeprom Kmpiec , 5
    Case 1 :
    Incr Kwoda
    Writeeeprom Kwoda , 1
    Case 2 :
    Incr Kpco
    Writeeeprom Kpco , 3
    Case 3:
    Incr Kpowrot
    Writeeeprom Kpowrot , 7
    End Select
    End If

    If Pinb.0 = 0 Then
    Select Case Lgr
    Case 0 :
    Decr Kmpiec
    Writeeeprom Kmpiec , 5
    Case 1 :
    Decr Kwoda
    Writeeeprom Kwoda , 1
    Case 2 :
    Decr Kpco
    Writeeeprom Kpco , 3
    Case 3:
    Decr Kpowrot
    Writeeeprom Kpowrot , 7
    End Select
    End If
    End Sub


    Sub Zmiana_gorna_linia
    If Pinb.0 = 0 Then
    Decr Lgr
    End If

    If Pinb.1 = 0 Then
    Incr Lgr
    End If

    If Lgr >= 4 Then
    Lgr = 0
    End If

    If Lgr >= 4 Then
    Lgr = 0
    End If

    Select Case Lgr
    Case 0:
    Cls
    Upperline
    Lcd "MA" ; Chr(2 ) ; "Y PIEC"
    Lowerline
    Lcd Chr(5 ) ; Tmpiec ; " " ; Chr(4 ) ; Tpco ; " " ; Chr(3 ) ; Twoda ; " " ; Chr(6) ; Tpowrot
    Cursor Off
    Led = Makebcd(tmpiec)
    Porta = Led
    Case 2:
    Cls
    Upperline
    Lcd "DU" ; Chr(1 ) ; "Y PIEC"
    Lowerline
    Lcd Chr(5 ) ; Tmpiec ; " " ; Chr(4 ) ; Tpco ; " " ; Chr(3 ) ; Twoda ; " " ; Chr(6) ; Tpowrot
    Cursor Off
    Led = Makebcd(tpco)
    Porta = Led
    Case 1:
    Cls
    Upperline
    Lcd "BOJLER"
    Lowerline
    Lcd Chr(5 ) ; Tmpiec ; " " ; Chr(4 ) ; Tpco ; " " ; Chr(3 ) ; Twoda ; " " ; Chr(6) ; Tpowrot
    Cursor Off
    Led = Makebcd(twoda)
    Porta = Led
    Case 3:
    Cls
    Upperline
    Lcd "WODA POWROTNA"
    Lowerline
    Lcd Chr(5 ) ; Tmpiec ; " " ; Chr(4 ) ; Tpco ; " " ; Chr(3 ) ; Twoda ; " " ; Chr(6) ; Tpowrot
    Cursor Off
    Led = Makebcd(tpowrot)
    Porta = Led
    End Select
    End Sub

    Sub Sterowanie
    If Tmpiec >= 50 Then
    Reset Portc.1
    Else
    Set Portc.1
    End If

    If Tmpiec >= 80 Then
    Reset Portc.0
    Else
    Set Portc.0
    End If

    If Tmpiec >= 91 Then
    Reset Portb.3
    Else
    Set Portb.3
    End If

    End Sub

    0
  • #18 25 Sie 2009 20:16
    Futrzaczek
    Admin Grupy Retro

    Już przybyłem, temat niestety nadal aktualny. Czy komendy odczytu są poprawne?
    Kolejne obserwacje:
    Układ świrować zaczyna po przekroczeniu temperatury ok. 70°C - to już wiadome. Jednakowoż, im wartość ta rośnie, tym pozostałe pomiary mniej odpowiadają rzeczywistości. Przy 99°C na piecu (w rzeczywistości), pozostałe odczyty wynosiły -1.

    EDIT: //
    Czy znaczenie może mieć fakt, iż stosuję wewnętrzny oscylator RC?

    0
  • Pomocny post
    #19 26 Sie 2009 08:03
    flapo213
    Poziom 21  

    Trochę masz to dziwnie napisane jeśli chodzi o odczyt temperatury. Co jak czas masz odświeżanie pętli głównej ?. Używanie rozkazu Skip Rom to lipa trochę. Jeśli masz ochotę to popraw to trochę tzn. warto odczytać przy starcie numery seryjne termometrów jak masz dwa i nie chce Ci się implementować procedury automatycznego przeszukania to poprostu odczytaj po jednym i zapisz do eeproma numery. Zrób zgodnie z procedurą zaadresuj układ, wydaj komendę konwertuj i odczytaj i tak w kółko bez delayów typu waitms800 to kapucha trochę. Teraz tak pomyślisz pewnie że no jak wydałem komende konwertuj i od razu odczyt w tym momencie to nie przeszkadza poprostu zrzuci Ci ostatni przekonwertowany pomiar. Podejrzewam że Twój problem nie jest w sprzęcie tylko w sofcie tak na 90%. Ja niestety nie znam Bascoma ale kod w miarę czytelny jest jak znajdę chwilę to spróbuję coś popatrzeć. Spróbuj poprawić odczyt temperatury wg. moich zaleceń.

    0
  • #20 26 Sie 2009 10:33
    Futrzaczek
    Admin Grupy Retro

    Czujniki są cztery i - co łatwo zauważyć - ich numery seryjne są wpisane na stałe.
    Po każdym poleceniu konwersji temperatury mam waitms800 - zalecasz, abym owe opóźnienie wyrzucił?

    EDIT: //
    Jest jeszcze fajniej :| Próbowałem zastosować kwarc - nie udało się. Powróciłem zatem do oryginalnego ustawienia fusebitów oraz kodu programu i... wszystko wykonuje się dwukrotnie dłużej.
    Chciałem zastosować kwarc 4MHz, niestety - program wykonywał się za długo albo dużo za długo...

    0
  • Pomocny post
    #21 26 Sie 2009 11:02
    kulmar
    Poziom 25  

    Futrzaczek napisał:
    Czy znaczenie może mieć fakt, iż stosuję wewnętrzny oscylator RC?


    Tego nie wiem, bo nie znam sposobu kalibracji Twojego procesora przy pracy z takim oscylatorem. Ale na wszelki wypadek wydłużyłbym opóźnienia w programie z 800ms na np. 1500ms, aby wykluczyć tą przyczynę.

    Pozdrawiam

    Mariusz

    0
  • Pomocny post
    #22 26 Sie 2009 11:21
    Wojtek75
    Poziom 23  

    Futrzaczek czy ten kod, który pokazałeś to cały kod czy po prostu uznałeś że początek jest nieistotny i dlatego go nie wkleiłeś.

    Futrzaczek napisał:
    .....
    EDIT: //
    Jest jeszcze fajniej :| Próbowałem zastosować kwarc - nie udało się. Powróciłem zatem do oryginalnego ustawienia fusebitów oraz kodu programu i... wszystko wykonuje się dwukrotnie dłużej.
    Chciałem zastosować kwarc 4MHz, niestety - program wykonywał się za długo albo dużo za długo...

    Takie objawy mogą byś spowodowane brakiem lub niewłaściwym zadeklarowaniem prędkości rezonatora napędzającego mikrokontroler. Tak w zasadzie to przez coś takiego cały program może nie działać prawidłowo.

    0
  • #23 26 Sie 2009 11:55
    flapo213
    Poziom 21  

    No tak ale gdbyby zegar był zły to pewnie nic byś nie odczytał z DS18B20. Jeśli masz numery seryjne termometrów to super adresuj je wydawaj komendy i odczytuj temperaturę na bieżąco, ja tak robię przez co nie mam tych ogromnych opóźnień związanych z konwersją u mnie działa podzieliłbym się chętnie kodem ale ja mam to w C. Tak jak mówię nie wiem jak działa Bascom dokładnie ale chyba coś takiego jak pętla główna to jest bo chyba nie wątkuje więc dawanie takich mega opóźniej sprawi iż twój program będzie okropnie mułowaty, tak się nie robi. Z mojej praktyki wynika iż nie żaden task nie powinien zajmować dłużej czasu niż 10ms.


    Acha wprowadź jedno usprawnienie mianowicie zrób tak wyślij skip rom dla wszystkich i wyślisz konwert dla wszystkich dallasów a później odczytuj każdy z osobna, bo teraz robisz za każdym razem konwert, nie ma takiej potrzeby.

    0
  • #24 26 Sie 2009 13:14
    Futrzaczek
    Admin Grupy Retro

    Cytat:
    Futrzaczek czy ten kod, który pokazałeś to cały kod czy po prostu uznałeś że początek jest nieistotny i dlatego go nie wkleiłeś.

    Cały. Nigdy wcześniej nie dawałem deklaracji $CRYSTAL i programy działały poprawnie. W Bascomie od zawsze ustawione było 4MHz (domyślnie). Nie pytać się jak, ale działało. Aż przestało.

    Grzebałem natomiast w fusebitach, mając pod ręką datasheet i różaniec. Podczas tych grzebanek zarówno w programie, jak i Bascomie, ustawiłem kwarc 4MHz, skompilowałem i wrzuciłem do Flasha. Niejako przy okazji przestawiłem fusebita od kasowania EEPROMu, nie sądzę jednak by miał on jakiś wpływ na zachowanie procesora w czasie wykonywania programu. Ponieważ nic sensownego z tego nie wynikło, wróciłem do pozycji default, która jest zaznaczona na liście (poza fusebitem od EEPROMu) - muszę jednak powiedzieć, że procesor ani razu się nie zablokował.
    Wywaliłem deklarację $CRYSTAL z programu i zmieniałem opcje w Compiler/Communication - bez rezultatu. Przy 1 i 4MHz wydłużenie jest dwukrotne, przy większych częstotliwościach następuje dwukrotne przyspieszenie wykonywania programu. Z deklaracją $CRYSTAL = 1000000 program również był zbyt wolny. Przy ustawieniu wewnętrznego oscylatora 2MHz i $CRYSTAL = 1000000 opóźnienia są mniej więcej poprawne, ale odczyt z Dallasów nie działa.

    Kwarc, jaki zastosowałem, nabyłem 4 lata temu wraz z innymi o tych samych parametrach - działa jak złoto w AT90S2313. Zastosowane tu kondensatory mają 39pF. Odległość kwarcu od procesora wynosi ok. 15mm.

    Cytat:
    Acha wprowadź jedno usprawnienie mianowicie zrób tak wyślij skip rom dla wszystkich i wyślisz konwert dla wszystkich dallasów a później odczytuj każdy z osobna, bo teraz robisz za każdym razem konwert, nie ma takiej potrzeby.

    Dobrze, jednakowoż na razie trwa walka o uratowanie procesora ;)
    Czy one przechowują to w sobie po zresetowaniu linii 1wire?

    0
  • #25 26 Sie 2009 13:58
    flapo213
    Poziom 21  

    Nie no reset to reset ja już nie pamiętam ale reset przetrzymywał go doś długo. Nie rób resetu. Słuchaj gdyb chcieć resetować odczytywać to sam wiesz 800ms to sporawo. Możesz jak chcesz to sflagować czyli po wydaniu komendy konwert ustawiasz flagę że rozpocząłeś proces i robisz coś innego Timer Ci odmierza te 800 ms i wiesz że masz dobry odczyt. Ja Ci powiem szczerze że nie robię resetu dallasa i śmiga mi to bez błędu, reset robię tylko raz na początku po włączeniu zasilania. Ale spróbuj nic Cię to nie kosztuje zobaczysz efekt (wyrzuć reset).

    Daj znać co i jak

    Pozdrawiam

    0
  • #26 26 Sie 2009 17:30
    Futrzaczek
    Admin Grupy Retro

    Z pomocą Kolegi flapo213 rozgryzłem fusebity. Teraz mikrokontroler działa na wewnętrznym oscylatorze 1MHz. Jednak pokazany wyżej program wykonuje się ok. trzykrotnie(!) wolniej niż powinien. Dyrektywa $Crystal = 1000000 i $regfile = "m32def.dat" obecna.
    Zrobiłem też prościutki test: w nowym pliku utworzyłem coś takiego

    Code:
    $regfile = "m32def.dat"
    
    $crystal = 1000000
    Config Porta = Output
    Do
    Wait 1
    Porta = 255
    Wait 1
    Porta = 0
    Loop

    I wiecie co... działa poprawnie!
    Wynika z tego, że diabeł tkwi w Bascomie... Tylko gdzie???
    Przekleiłem kod programu do nowego pliku (w razie gdyby gdzieś głęboko zagnieździł się bug) - bez skutku.

    EDIT: //
    Problem z opóźnieniem rozwiązany. Komendy wait i waitms się wydłużyły, natomiast polecenia odczytu z 1wire działają. Co jest oczywiste :( termometr wariuje w temperaturze pow. 70°C... Wydłużyłem czas przeznaczony na konwersję do 1500ms - bezskutecznie. Skorzystałem też z rady flapo213 - nie nawiązałem łączności ze wszystkimi dallasami, tylko z pierwszym.

    0
  • Pomocny post
    #27 26 Sie 2009 21:04
    flapo213
    Poziom 21  

    Ok skoro nie nawiązałeś komunikacji ze wszystkimi dallasami to wykonaj kolejny krok tzn. pozostaw jedynie jedenego dallasa i zrób to po kolei sprawdzisz czy numery Ci grają. Jak już tak pojedynczo sprawdzisz to podłącz kolejnego tak żeby były 2 na jednej linii i tak pokolei do przodu. Spokojnie do wszystkiego się dojdzie.

    Pozdrawiam.

    PS. Z Bascomem poradziłeś już sobie ?

    0
  • #28 27 Sie 2009 11:20
    Futrzaczek
    Admin Grupy Retro

    No i lipa w krzaki...
    Teraz kod odpowiedzialny za odczyt wygląda tak:

    Code:
    Do
    
    Incr Cykl
    If Cykl >= 3 Then
    Cykl = 0
    End If
    Waitms 1500
    Odczyt
    Waitms 3000
    If Pinb.2 = 0 Then
    Kalibracja
    Else
    Zmiana_gorna_linia
    End If
    Sterowanie
    Loop
    End

    Sub Odczyt
    Select Case Cykl

    Case 0:
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Waitms 2500
    1wreset
    1wwrite &H55
    1wwrite Ampiec(1) , 8
    1wwrite &HBE
    Bmpiec(1) = 1wread(9)
    Tmpiec = Makeint(bmpiec(1) , Bmpiec(2))
    Tmpiec = Tmpiec / 16
    Tmpiec = Tmpiec + Kmpiec

    Case 1:
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Waitms 1500
    1wreset
    1wwrite &H55
    1wwrite Awoda(1) , 8
    1wwrite &HBE
    Bwoda(1) = 1wread(9)
    Twoda = Makeint(bwoda(1) , Bwoda(2))
    Twoda = Twoda / 16
    Twoda = Twoda + Kwoda

    Case 2:
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Waitms 1500
    1wreset
    1wwrite &H55
    1wwrite Apco(1) , 8
    1wwrite &HBE
    Bpco(1) = 1wread(9)
    Tpco = Makeint(bpco(1) , Bpco(2))
    Tpco = Tpco / 16
    Tpco = Tpco + Kpco
    End Select

    End Sub

    W temperaturze ok. 80°C zrywa transmisję z czujnikiem...
    Gdzie robię błąd? Przecież opóźnienia wykraczają już poza spotykane granice.
    Natomiast podczas obsługi TYLKO czujnika pieca - wszystko w porządku.
    Chyba będę zmuszony się z tym pogodzić i odczytywac tylko jeden, wybrany czujniczek.
    Ale czemu tak się dzieje?!

    0
  • #29 27 Sie 2009 11:33
    kulmar
    Poziom 25  

    Futrzaczek napisał:
    Natomiast podczas obsługi TYLKO czujnika pieca - wszystko w porządku.
    Ale czemu tak się dzieje?!


    Akurat przy odczycie pieca masz opóznienie 2500ms, w pozostałych przypadkach - 1500ms (jeśli dobrze odczytałem kod). Moze to jest jakis trop ?

    Pozdrawiam

    Mariusz

    0
  • #30 27 Sie 2009 11:36
    Futrzaczek
    Admin Grupy Retro

    Racja. Ale też to sprawdziłem - nic nie wyszło.
    Wykastrowałem kod i zostawiłem jedynie obsługę czujnika pieca. Czas przeznaczony na konwersję temperatury wyciągnąłem do 5 sekund. I co? G&&no :(
    Czy błąd tkwić może w rezystorze podciągającym o wartości 2,2kΩ?

    0