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). 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.
Gdy projekt będzie skończony to chętnie podzielę się wszystkim z szanownymi forumowiczami.
Poniżej kod programu (fragmenty) na ATmega 16, 8MHz:
Bardzo proszę o jakieś praktyczne rozwiązania.
Pozdrawiam
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). 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.
Gdy projekt będzie skończony to chętnie podzielę się wszystkim z szanownymi forumowiczami.
Poniżej kod programu (fragmenty) na ATmega 16, 8MHz:
$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.
Pozdrawiam