odczyt z ds18b20 i sterowanie fazowe


Witam serdecznie.
Szukałem już chyba wszędzie, próbowałem kilkunastu innych programów i problem ciągle zostaje nie rozwiązany.
Otóż piszę program do sterownika pieca. Posiada on 3 czujniki DS18B20, 3 przekaźniki i 1 triak do sterowania pompki kolektorów. Wszystko działa bez zarzutu. Problem pojawia się dopiero po włączeniu przerwania od INT0 (regulacja fazowa pompki kolektora). Co jakiś czas wynik pomiaru z obojętnie, którego czujnika wyświetlany jest w postaci 0.0 st.C. Jest to problematyczne, gdyż np. pompka załączy się i wyłączy, podobnie jest z klapką, elektrozaworem lub pompką o obwodzie grzewczym pieca.
Dotychczas próbowałem wyłączać przerwania na czas pomiaru, czy ustalać dodatkowe czasy, wgrywałem inne programy, ale wynik końcowy był ciągle taki sam , tzn: 0.0 st.C co jakiś czas, bądź brak odczytu.
Gdy projekt będzie skończony to chętnie podzielę się wszystkim z szanownymi forumowiczami.

Poniżej kod programu (fragmenty) na ATmega 16, 8MHz:
Kod:

$regfile = "m16def.DAT"
$crystal = 8000000
 
Dim Tp As Integer , Ss1 As String * 6
Dim Tb As Integer , Ss2 As String * 6
Dim Tk As Integer , Ss3 As String * 6
 
Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim Dsid3(8) As Byte
 
Dim B As Byte 'deklaracja zmiennej do odczytu kodów ID
Dim W As Byte
 
'*************************konfiguracja przerwania INT0**************************
Config Int0 = Falling ' INT0 wyzwalane zboczem opadającym
On Int0 Zero_cross 'skocz do Zero_cross - przejście przez zero
 
'*************************konfiguracja TIMER1***********************************
Config Timer1 = Timer , Prescale = 64 'Timer1 jako licznik, dzielnik = 64(przepełnienie co 4us)
On Timer1 Tim1_isr 'skocz do Tim_isr - załaczenie triaków
 
'*************************odblokowanie systemu przerwań*************************
Enable Int0 'odblokowanie przerwania
Enable Interrupts 'odblokowanie globalnego systemu przerwań
 
'**************************zmienne w programie*********************************
Dim Moc As Byte ' zmienna przechowująca poziom
Dim K As Word
Moc = 0
 
'program główny
 
do
 
1wreset
1wwrite &H55
1wverify Dsid1(1) 'wysyłamy adres pierwszego czujnika
If Err <> 1 Then
1wwrite &HBE
Tp = 1wread(2)
 
Tp = Tp * 10
Tp = Tp / 16
Ss1 = Str(tp)
Ss1 = Format(ss1 , " 0.0")
Locate 1 , 1 'Pozycja wyświetlania nazwy i temperatury (1.1 -> 1 linia 1 kolumna, 2.10 -> 2 linia 10 kolumna itd)
Lcd "Piec: " ; Ss1 ; Chr(0) ; Chr(1)
Else
Locate 1 , 1
Lcd "ERROR Piec "
End If
 
'---------------------------------
 
1wreset
1wwrite &H55
1wverify Dsid2(1) 'wysylam adres drugiego czujnika
If Err <> 1 Then
1wwrite &HBE
Tb = 1wread(2)
 
Tb = Tb * 10
Tb = Tb / 16
Ss2 = Str(tb)
Ss2 = Format(ss2 , " 0.0")
Locate 2 , 1
Lcd "Bojler: " ; Ss2 ; Chr(0) ; Chr(1)
Else
Locate 2 , 1
Lcd "ERROR Bojler "
End If
 
 
'---------------------------------
 
 
1wreset
1wwrite &H55
1wverify Dsid3(1) 'wysylam adres trzeciego czujnika
If Err <> 1 Then
1wwrite &HBE
Tk = 1wread(2)
 
Tk = Tk * 10
Tk = Tk / 16
Ss3 = Str(tk)
Ss3 = Format(ss3 , " 0.0")
Locate 3 , 1
Lcd "Kolektor:" ; Ss3 ; Chr(0) ; Chr(1)
Else
Locate 3 , 1
Lcd "ERROR Kolektor "
End If
 
'--------konwersja temp dla wszystkich dsow
 
1wreset
1wwrite &HCC
1wwrite &H44
Wait 3
 
Tna = E_tna
Tn = Tna / 10
Locate 4 , 1
Lcd "Nastawa: " ; Tn ; ".0" ; Chr(0) ; Chr(1)
 
loop
 
Tim1_isr:
 
Set K_pompa 'załącz triak2
Disable Timer1 'wyłącz Timer1
Return 'powrót
 
'*****************podprogram odmierzajacy czas od przerwania********************
Zero_cross:
 
Reset K_pompa ' wył. Triaka w ZERO sieci 230V
K = Lookup(moc , Obroty) ' pobranie z tablicy wartości Timera1
Load Timer1 , K ' załadowanie pobranej wartości do Timera1
Enable Timer1 ' załączenie Timera1 - odliczanie czasu
Return 'powrót
 
 
Obroty: 'podprogram prędkości
Data 0% ,
Data 915% , 760% , 625% , 490% , 335% , 100%

Bardzo proszę o jakieś praktyczne rozwiązania tego problemu lub przykłady.
Pozdrawiam




Portret użytkownika martineztel

Witam. Nie jestem być może

Witam.
Nie jestem być może eksperkem w dziedzinie programowania avr'ów,(dopiero zaczynam), ale mia
łem podobny problem gdy bawiłem się procesorami serii '8051 (at89c4051)
Musisz na czas pomiaru (dla magistrali 1-wire) wyłączyć przerwania inaczej pomiar nie będzie
możliwy. Spotkałem się z tym podczas pracy z projektem sterownika do pieca co na '4051.
Wentylator był sterowany przebiegiem PWM(programowym w timerze), ale gdy chciałem uzyskać
odczyt temperatury to musiałem wyłączyć przerwanie co powodowało nierównomierną pracę wentylatora,
szarpanie.Dlatego też przesiadam się na avr one mają pwm sprzętowy ale gdy to nie pomorze ,
zamiast czujnika na magistrale 1-wire zastosuje czujnik lm35.
Rzdzę to samo lub przebudowę programu. Przerwania i 1-wire trochę się ze sobą gryzą.
Pozdrawiam.

Portret użytkownika mirley

Re: pomiar temp

Jeśli pomiar z ds jest prawidłowy a czasami tylko pojawia się 0 stopni to najprościej będzie chyba dodać warunek w programie i odczytywać do zmiennej tymczasowej a przepisywać do zmiennej właściwej jak pomiar jest prawidłowy i nie różni się np od poprzedniego wskazania nagle o 20 stopni (bo to spewnością oznaka błędu).

Poza tym sprawdź na krótkim kablu do czujnika ds jak to działa

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika gosc

Re:

Fakt faktem, jest to też jakieś wyjście z sytuacji i chyba będzie najwłaściwsze i być może najprostsze. Dziś już niestety ni zdążę nic poprawić, ale jutro dam znać co i jak.
Pozdrawiam:)