Witam wszystkich
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:
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ę

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:
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ę
