Witam.
Ręce opadają. Od wczoraj próbuje zaprogramować uC by badał temp na poszczególnych czujnikach ale w różnych podprogramach. To znaczy włączam uC pokazuje mi czas naciskam przycisk przechodzi do innego ekranu gdzie widnieje temp. i pomiar napięcia. Następnie znów naciskam przycisk i przechodzi do kolejnego ekranu z wynikami pomiaru z dwóch innych czujników Ds18B20. Problem jest taki u mnie ze w takim programie wynik pomiaru temp to -0.1. I tak na każdym ekranie.
o to kod:
Ręce opadają. Od wczoraj próbuje zaprogramować uC by badał temp na poszczególnych czujnikach ale w różnych podprogramach. To znaczy włączam uC pokazuje mi czas naciskam przycisk przechodzi do innego ekranu gdzie widnieje temp. i pomiar napięcia. Następnie znów naciskam przycisk i przechodzi do kolejnego ekranu z wynikami pomiaru z dwóch innych czujników Ds18B20. Problem jest taki u mnie ze w takim programie wynik pomiaru temp to -0.1. I tak na każdym ekranie.
o to kod:
$regfile = "m8def.dat"
$crystal = 8000000
'konfiguracja wyswietlacza
Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5 , E = Portd.1 , Rs = Portd.0
Config Lcd = 16 * 1a
'zapalanie i gaszenie podswietlania LCD
Config Portb.1 = Output
Reset Portb.1
'konfiguracja portu na termometr
Config 1wire = Portc.0
Config Adc = Single , Prescaler = Auto , Reference = Avcc,
Config Sda = Portc.4 'konfiguracja pord.7 jako I2C
Config Scl = Portc.5
'konfiguracja przyciskow
Config Pind.6 = Input
Config Pind.7 = Input
Config Pinb.0 = Input
Set Portd.6
Set Portd.7
Set Portb.0
P1 Alias Pind.6
P2 Alias Pind.7
P3 Alias Pinb.0
'zmienne:
Dim Ekran As Byte
Dim Odczyt(2) As Byte , 'zmienne dla czujnika temp. '.
Dim T As Integer '.
Dim T1 As Single '.
Dim Napis As String * 5
Dim Odczyt2(2) As Byte , 'zmienne dla czujnika temp. '.
Dim T2 As Integer '.
Dim T12 As Single '.
Dim Napis2 As String * 5
Dim Odczyt3(2) As Byte , 'zmienne dla czujnika temp. '.
Dim T3 As Integer '.
Dim T13 As Single '.
Dim Napis3 As String * 5
Dim A As Word 'zmienne dla pomaru nap.
Dim C As String * 3 '.
Dim B As Single '.
Dim Ilosc_czujnikow As Byte 'ilosc podpietych czujnikow
Dim Adres1 As Byte 'adres pierwszego
Dim Adres2 As Byte 'adres drugiego
Dim Adres3 As Byte 'adres trzeciego
'Zmienne dla zegara
Dim M As Byte 'minuty
Dim S As Byte 'sekundy
Dim H As Byte 'godziny
Dim Dzien As Byte
Dim M_bcd As Byte 'minuty
Dim S_bcd As Byte 'sekundy
Dim H_bcd As Byte
'znaki specialne:
Deflcdchar 2 , 4 , 10 , 10 , 10 , 10 , 17 , 17 , 14 ' fiolka
Deflcdchar 3 , 8 , 20 , 8 , 3 , 4 , 4 , 4 , 3 ' stopnie C
Deflcdchar 4 , 9 , 29 , 9 , 32 , 10 , 31 , 17 , 31 'akumulator
Enable Interrupts 'właczenie globalnych przerwań
Start Adc 'włączenie przetwornika A/C
Cursor Off 'wyłączenie podświetlania kursora
I2cinit
Cls
S_bcd = Makebcd(s)
M_bcd = Makebcd(m)
H_bcd = Makebcd(h)
Dzien = Makebcd(dzien)
I2cstart
I2cwbyte 162
I2cwbyte 0
I2cwbyte 8
I2cstop
I2cstart
I2cwbyte 162
I2cwbyte 2
I2cwbyte S_bcd
I2cwbyte M_bcd
I2cwbyte H_bcd
I2cwbyte Dzien
I2cstop
Waitms 100
Ilosc_czujnikow = 1wirecount()
Adres1 = 1wsearchfirst()
Writeeeprom Adres1 , 1
Waitms 100
Adres2 = 1wsearchnext()
Writeeeprom Adres2 , 2
Waitms 100
Adres3 = 1wsearchnext()
Writeeeprom Adres3 , 2
Cls
Lcd "witam"
Locate 1 , 1
Wait 1
Lowerline
Lcd "DS=" ; Ilosc_czujnikow
Waitms 500
Cls
Gosub Ekran1
Do
Ekran1:
Do
I2cstart
I2cwbyte 162
I2cwbyte 2
I2cstart
I2cwbyte 163
I2crbyte S_bcd , Ack
I2crbyte M_bcd , Ack
I2crbyte H_bcd , Ack
I2crbyte Dzien , Nack
I2cstop
S = Makedec(s_bcd)
M = Makedec(m_bcd)
H = Makedec(h_bcd)
Locate 1 , 1
Lcd H ; ":" ; M ; ":" ; S
If P3 = 0 Then Gosub Ekran2
Waitms 100
If P3 = 0 Then Gosub Ekran2
Loop
Ekran2:
Do
'pomiar napiecia
Waitms 50
Start Adc
A = Getadc(1)
B = A * 0.015
C = Fusing(b , "##.#")
Stop Adc
'pomiar temp
Readeeprom Adres1 , 1
1wreset 'reset
1wwrite &H55 'wiele kostek, więc wykorzystujemy rozkaz MATCH ROM
1wwrite Adres1 , 8 '
1wwrite &H44 'dokonaju konwersji
Waitms 750 'przeczekaj czas konwersji
1wreset 'reset
1wwrite &H55 'rozkaz adresowy MATCH ROM
1wwrite Adres1 , 8
1wwrite &HBE 'odczytaj dwa pierwsze bajty
Odczyt(1) = 1wread(2) 'rozkaz funkcyjny - polecenie odczytu DS18x20
T = Odczyt(2) 'przepisz starszy bajt do zmiennej typu Integer
Shift T , Left , 8 'przesuń ten bajt w lewo na wyższe pozycje
T = T + Odczyt(1) 'przepisz - dodaj młodszy bajt
T1 = T * 0.0625
Napis = Fusing(t1 , "#.#")
Locate 1 , 1
Lcd Chr(2) ; "=" ; Napis ; Chr(3); 'wyswietla temp
Lowerline
Lcd Chr(4) ; "=" ; C ; "V" 'wysietla nap.
Locate 2 , 1
If P3 = 0 Then Gosub Ekran3
Waitms 100
If P3 = 0 Then Gosub Ekran3
Loop
Ekran3:
Do
'pomiar temp
Waitms 50
Readeeprom Adres2 , 3
1wreset 'reset
1wwrite &H55 'wiele kostek, więc wykorzystujemy rozkaz MATCH ROM
1wwrite Adres2 , 8 '
1wwrite &H44 'dokonaju konwersji
Waitms 750 'przeczekaj czas konwersji
1wreset 'reset
1wwrite &H55 'rozkaz adresowy MATCH ROM
1wwrite Adres2 , 8
1wwrite &HBE
Odczyt2(1) = 1wread(2)
T2 = Odczyt2(2) 'przepisz starszy bajt do zmiennej typu Integer
Shift T2 , Left , 8 'przesuń ten bajt w lewo na wyższe pozycje
T2 = T2 + Odczyt2(1) 'przepisz - dodaj młodszy bajt
T12 = T2 * 0.0625
Napis2 = Fusing(t1 , "#.#")
'pomiar tem
Waitms 50
Readeeprom Adres3 , 4
1wreset 'reset
1wwrite &H55 'wiele kostek, więc wykorzystujemy rozkaz MATCH ROM
1wwrite Adres3 , 8 '
1wwrite &H44 'dokonaju konwersji
Waitms 750 'przeczekaj czas konwersji
1wreset 'reset
1wwrite &H55 'rozkaz adresowy MATCH ROM
1wwrite Adres3 , 8
1wwrite &HBE
Odczyt3(1) = 1wread(2)
T3 = Odczyt3(2) 'przepisz starszy bajt do zmiennej typu Integer
Shift T3 , Left , 8 'przesuń ten bajt w lewo na wyższe pozycje
T3 = T3 + Odczyt3(1) 'przepisz - dodaj młodszy bajt
T13 = T3 * 0.0625
Napis3 = Fusing(t1 , "#.#")
Locate 1 , 1
Lcd "To" ; "=" ; Napis2 ; Chr(3);
Lowerline
Lcd "Ti" ; "=" ; Napis3 ; Chr(3)
Locate 2 , 1
If P3 = 0 Then Gosub Ekran1
Waitms 100
If P3 = 0 Then Gosub Ekran1
Loop
Loop
End