Witam
Używam Attiny2313 do pomiaru dwóch temperatur z DS18B20. Wynik ( Integer ) przesyłam bez żadnej obróbki przez UART przewodem 40 cm do Atmega328.
Atmega rozbija odebrane dane i jest obróbka
Kod Attiny2313
Kod Atmega328
W sumie problemów jest klika:
występują czasem przekłamania i Atmega odbiera jakieś dziwne znaki, np. z minusem ( gdzie nie powinno go być ), nie wiem ,czy wynika to z długości kabelka UART
Kod obliczający temperaturę dobrze się sprawdzał na innym układzie Atmega, gdy temperatura była od razu wyświetlana na LCD - oczywiście minusowa również.
Natomiast tutaj jeden z czujników jest za oknem i pomimo ujemnej temperatury zatrzymuje się na 0.0 ( sprawdzałem też na mrożonce )
Używam Attiny2313 do pomiaru dwóch temperatur z DS18B20. Wynik ( Integer ) przesyłam bez żadnej obróbki przez UART przewodem 40 cm do Atmega328.
Atmega rozbija odebrane dane i jest obróbka
Kod Attiny2313
$regfile = "attiny2313.dat"
$crystal = 8000000
$baud = 4800
'********************* Konfiguracja magistrali 1-Wire
Config 1wire = Portd.5
'********************* Konfiguracja wejść i wyjść
Config Portb.0 = Output
Set Portb.0
'********** Konfiguracja Timer0 500 x 2 ms = 1 sekunda - Timer2 załaduj 6 do Timer2 - 250 dla Kwarc = 8 MHz
Config Timer0 = Timer , Prescale = 256 ' Dla Prescale 64 - 1 sekunda = 500
On Timer0 Czas
Enable Interrupts
Load Timer0 , 6
Enable Timer0
'********************* Deklaracje zmiennych
Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim I1 As Integer
Dim I2 As Integer
Dim Licznik1 As Integer
Dim Licznik2 As Integer
Dim Flaga_led As Bit
Declare Sub Odczytaj
Led Alias Portb.0
Flaga_led = 0
Cursor Off
'********************* Adres pierwszego DS18B20
Dsid1(1) = &H28
Dsid1(2) = &H9F
Dsid1(3) = &H79
Dsid1(4) = &H25
Dsid1(5) = &H03
Dsid1(6) = &H00
Dsid1(7) = &H00
Dsid1(8) = &H00
'********************* Adres drugiego DS18B20
Dsid2(1) = &H28
Dsid2(2) = &H24
Dsid2(3) = &H47
Dsid2(4) = &H25
Dsid2(5) = &H03
Dsid2(6) = &H00
Dsid2(7) = &H00
Dsid2(8) = &HD9
Cls
Do
'********************* odczyt pierwszego DS18B20
1wreset
1wwrite &H55
1wverify Dsid1(1)
1wwrite &HBE
I1 = 1wread(2)
'********************* odczyt drugiego DS18B20
1wreset
1wwrite &H55
1wverify Dsid2(1)
1wwrite &HBE
I2 = 1wread(2)
'********************* konwersja dla wsaystkich DS18B20
1wreset
1wwrite &HCC
1wwrite &H44
Wait 1
Loop
End
Sub Odczytaj
Licznik2 = 0
Reset Led
Print I1 ; "," ; I2 ; Chr(13);
Licznik1 = 0
Set Led
Flaga_led = 0
End Sub
'********************* Timer2 - 2 ms x 500 = 1 sekunda
Czas:
Timer0 = Timer0 + 6
Incr Licznik1
Incr Licznik2
If Licznik1 = 2000 Then
Gosub Odczytaj
Flaga_led = 1
End If
If Licznik2 = 400 Then
Flaga_led = 0
End If
Return
Kod Atmega328
$regfile = "m328pdef.dat"
$crystal = 8000000
$baud = 4800 ' predkość transmisji
$hwstack = 128 ' rozmiar stosu sprzętowego
$swstack = 128 ' rozmiar stosu programowego
$framesize = 128 ' rozmiar ramki
'*********************
'Enable Interrupts
Config Serialin = Buffered , Size = 8 , Bytematch = 13
Enable Serial
Dim Flaga_rs As Bit
Dim Ss1 As String * 6
Dim Ss2 As String * 6
'********************* Deklaracje zmiennych temperatury
Dim Tmp As Byte
Dim Tmp1 As Integer
Dim Tmp2 As Integer
Dim Tmp11 As String * 3
Dim Tmp22 As String * 3
Dim Przecinek1 As Byte
Dim Przecinek2 As Byte
Dim Ttt As String * 10
Do
If Flaga_rs = 1 Then
Ttt = ""
Input Ttt
Flaga_rs = 0
End If
'***************************** Wyciągniecie ze stringu
Tmp = Instr(ttt , "," )
Przecinek1 = Tmp - 1
Przecinek2 = Tmp + 1
Tmp11 = Mid(ttt , 1 , Przecinek1)
Tmp1 = Val(tmp11)
Tmp22 = Mid(ttt , Przecinek2 , 3 )
Tmp2 = Val(tmp22)
'***************************** Obliczanie temperatury
'********************* Obliczenia dla pierwszego
Tmp1 = Tmp1 * 10
Tmp1 = Tmp1 / 16
'If I1 > 0 Then Cls
Ss1 = Str(tmp1)
Ss1 = Format(ss1 , " 0.0")
'********************* Obliczenia dla drugiego
Tmp2 = Tmp2 * 10
Tmp2 = Tmp2 / 16
'If I2 > 0 Then Cls
Ss2 = Str(tmp2)
Ss2 = Format(ss2 , " 0.0")
Loop
End
'*********************** Obsługa bufora UART
Serial0charmatch:
Flaga_rs = 1
Return
W sumie problemów jest klika:
występują czasem przekłamania i Atmega odbiera jakieś dziwne znaki, np. z minusem ( gdzie nie powinno go być ), nie wiem ,czy wynika to z długości kabelka UART
Kod obliczający temperaturę dobrze się sprawdzał na innym układzie Atmega, gdy temperatura była od razu wyświetlana na LCD - oczywiście minusowa również.
Natomiast tutaj jeden z czujników jest za oknem i pomimo ujemnej temperatury zatrzymuje się na 0.0 ( sprawdzałem też na mrożonce )