logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Termometr cyfr. problem z obsługą DS18B20 przez Atinny2313

mobby777mj 02 Wrz 2010 04:19 1845 2
REKLAMA
  • #1 8466814
    mobby777mj
    Poziom 10  
    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
    


    Termometr cyfr. problem z obsługą DS18B20 przez Atinny2313 Termometr cyfr. problem z obsługą DS18B20 przez Atinny2313
  • REKLAMA
  • #2 8466876
    Wojtek75
    Poziom 24  
    Fusy masz źle ustawione dla wewnętrznego RC 4MHz powinieneś mieć jeszcze włączony (zaptaszkowany) bit CKSEL0.
  • #3 8470097
    mobby777mj
    Poziom 10  
    Ustawiłem fuse bits CKSEL3..0 na 0010 i dalej bez zmian. Zmieniałem również SUT1..0 (01 lub 10) i dalej to samo. Nawet podłączenie wyjścia DQ z term. na inny wolny pin attiny (PD1) nie rozwiązało sprawy.

    OK, znalazłem błąd - zła kolejność wczytywania bajtów do tablicy. Termometr działa dobrze. Temat można zamknąć.
REKLAMA