Witam, zbudowałem sobie prosty termometr cyfrowy oparty na Atinny2313, czujniku DS18B20 i 4 lampach nixie. Wyjscia PB0-PB7 i PD3-PD6 obsługują lampy (poprzez 74141) PD0 to znak "-".Syg DQ (podciagnięty przez rezystor 4,7k do Vcc)z DS18B20 podłączony do PA0. Układ generalnie prosty tak że nie mam nawet schematu. Problem w tym że nie działa poprawnie. Wyswietlany wynik jest bez sensu - są to zmieniające się liczby 16, 32, 64, 80, 96, 04. Problem leży chyba w komunikacji między procesorem a czujnikiem temp ale nie mogę go znależć. Gdy na sztywno wpiszę w programie wartości bajtów T(1) i T(2) wyświetlany wynik jest w porządku więc część programu odpowiedzialna za obliczenie i wyświetlenie pomiaru jest ok. Do programowania używam PonyProga. Attiny ma pracować z częst. 4MHz na wewnętrznym RC. Sposób podłączenia DS18B20 do mikroprocesora jest taki jak na rysunku poniżej. Dodatkowo dałem zrzut z fuse bitów i kod programu. Wiem, że obsługa 1wire DS18B20 byla wałkowana tysiąc razy i nie jest jakaś zawiła ale nie mogę znaleźć rozwiązania na forum. W ramach testu program sprawdzałem na dwóch uP i dwóch DS-ach i ciągle to samo. Może ktoś cos doradzi albo naprowadzi mnie na rozwiązanie tego problemu. Z góry dziękuję. PS jestem początkujący w tym temacie.

$regfile = "attiny2313.dat"
$crystal = 4000000
'Config Porta = &B111
Config Portb = &B11111111
Config Portd = &B1111111
Config 1wire = Porta.0
Dim C1 As Byte , C2 As Byte , K As Byte , Temp As Byte
Dim Pom As Integer , R As Integer , C3 As Integer
Dim T(2) As Byte , C As Byte
'Porta = &B111
Portb = &B11111111
Portd = &B1111111
Do
1wreset
If Err = 1 Then 'sprawdzenie czy jest termometr
Set Portd.0
Do
1wreset
Loop Until Err = 0
End If
1wreset
1wwrite &HCC
1wwrite &H44
Waitms 750
1wreset
1wwrite &HCC
1wwrite &HBE
T(1) = 1wread()
T(2) = 1wread()
1wreset
'T(1) = &B11111110 'przykladowe bajty dla np. -25,1
'T(2) = &B01101111
R = Makeint(t(2) , T(1)) 'laczenie bajtow
For C = 4 To 7
Reset T(2).c 'zerowanie najstarszych bitow T(2)
Next C 'przy pomocy zm c
Shift R , Right , 4 'pozbycie sie czesci ulamkowej
Temp = Low(r)
C3 = T(2) * 625
C3 = C3 / 1000
If T(1) => 248 Then 'jesli temperatura jest ujemna
C3 = 10 - C3
'If C3 = 10 Then
'C3 = 0
'End If
Temp = 255 - Temp
If T(2) = 0 Then
Temp = Temp + 1
C3 = 0
End If
End If
C1 = Temp / 10 'oblicza cyfre 1
C2 = Temp Mod 10 'oblicza cyfre 2
Shift C1 , Left , 4
Pom = Makeint(c1 , C2) 'laczy obie cyfry w jeden bajt
'zamienione zostaly cyfry c1 i c2
'bo plytka tego wymagala
Shift Pom , Left , 4 'obcina niepotrzebne "0"
K = High(pom)
Shift C3 , Left , 3 '3 liczba na koncowkach p3-p6
If T(1) => 248 Then 'dla ujemnych temp
Set C3.0 'zapala najmlodszy bit w portd
End If
Portb = K
Portd = C3
Wait 1
Loop
End