Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Termometr DS18B20+Atemega8+Bascom - próba zrozumienia kodu

heyka 17 Feb 2011 11:46 5151 9
  • #1
    heyka
    Level 17  
    Witam

    Wykonalem termometr na czujniku DS18B20, zaprogramowałem procesor wg kodu znalezionego w sieci, podaje kod:
    
    $regfile = "m8def.dat"
    $crystal = 8000000
    Config Lcd = 16 * 2
    
    
    Config Pinb.1 = Output
    Config Portc = Output
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
    
    Config 1wire = Portb.0
    Dim Bd(2) As Byte
    
    Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32           'wykoanie znaku "stopni"
    Cursor Off
    Dim T As Integer
    Dim Ulamek As Integer
    Cls
    
    
    Do
    Gosub Ds1820
    
    Cls
    Lcd "temp: " ; T ; "," ; Ulamek ; Chr(0)
    
    
    Loop
    
    End
    
    Ds1820:
    1wreset
    1wwrite &HCC
    1wwrite &H44
    
    Waitms 250
    Waitms 250
    
    1wreset
    1wwrite &HCC
    1wwrite &HBE
    
    
    
    
    Bd(1) = 1wread(9)
    1wreset
    T = Makeint(bd(1) , Bd(2))
    T = T * 10
    T = T / 16
    Ulamek = T Mod 10
    T = T / 10
    
    If T > 19 Then
    Portb.1 = 0
    Else
    Portb.1 = 1
    End If
    
    1wreset
    If Err = 1 Then
    Cls
    Lcd "brak odczytu"
    Wait 2
    
    
    End If
    Return 
    

    Nie mogę zrozumiec pewnej rzeczy:
    
    1. Dim Bd(2) As Byte - definicja tablicy do przechowywania dwóch bajtów
    2. Bd(1) = 1wread(9) - zapisanie do pierwszego elementu tablicy
    
    T = Makeint(bd(1) , Bd(2)) - łaczy dwa bajty w zmienną ( ale skąd jest wziety ten drugi bajt, drugi element tablicy skoro w całym programie nie był nigdzie zapisany?)
    T = T * 10
    T = T / 16 - skąd ten wzór ta cyfra 16?
    

    Proszę poprawić treść wiadomości - regulamin p.15
    Kod umieszczamy w znacznikach [code] - poprawiłem.
    [zumek]
  • #2
    mordeto
    Level 13  
    ściągnij sobie polskiego HELP-a do bascoma i poczytaj o Dim, As Byte itd
    a co do 2 pytania polecam DATASHEET
  • #3
    heyka
    Level 17  
    mordeto wrote:
    ściągnij sobie polskiego HELP-a do bascoma i poczytaj o Dim, As Byte itd
    a co do 2 pytania polecam DATASHEET


    Nie za bardzo o taką odpowiedź mi chodziło, chciałem żeby mi ktoś to w prosty sposób wytłumaczył, tak trudno to napisań, próbowałem to zrozumiec z polskim helpem ale mi się nie udało.
  • Helpful post
    #4
    otapi
    Level 25  
    16 (liczba nie cyfra) ponieważ temperatura odczytywana jest z dokładnością do 4 cyfr po przecinku, dlatego odczytaną wartość trzeba podzielić przez 16 (przesunąć o 4)

    Bd(1) = 1wread(9) tu do Bd jest wpisanych 9 bajtów ( liczba bajtów w nawiasie) odczytanych przez 1wread(9) z czego 2 pierwsze to temperatura
  • #5
    heyka
    Level 17  
    otapi wrote:
    16 (liczba nie cyfra) ponieważ temperatura odczytywana jest z dokładnością do 4 cyfr po przecinku, dlatego odczytaną wartość trzeba podzielić przez 16 (przesunąć o 4)

    Bd(1) = 1wread(9) tu do Bd jest wpisanych 9 bajtów ( liczba bajtów w nawiasie) odczytanych przez 1wread(9) z czego 2 pierwsze to temperatura


    OK pierwszą rzecz rozumiem

    Co do drugiej, zdefiniowana tablica posiada 2 elementy typu Byte, zapis Bd(1)=.... zapisuje jakąś wartość do pierwszego elementu tablicy? Jeżeli tak to jak w Bd(1) ma sie zmieścić 9 bajtów? Własnie tego nie moge pojąć.

    powinno być jakoś tak:
    Bd(1)= pierwszy bajt definjujacy temperaturę
    Bd(2)= drugi bajt definjujacy temperaturę
  • Helpful post
    #6
    piotrva
    VIP Meritorious for electroda.pl
    tablica jest odpowiedni zadeklarowana, a bascom automatycznie inkrementuje wzkaźnik w tablicy, więc polecenie:
    Bd(1) = 1wread(9)
    powoduje, ze pierwszy odczytany bajt ląduje w Bd(1), kolejny w Bd(2), aż ostatni (dziewiąty) w Bd(9)
  • #7
    heyka
    Level 17  
    piotrva wrote:
    tablica jest odpowiedni zadeklarowana, a bascom automatycznie inkrementuje wzkaźnik w tablicy, więc polecenie:
    Bd(1) = 1wread(9)
    powoduje, ze pierwszy odczytany bajt ląduje w Bd(1), kolejny w Bd(2), aż ostatni (dziewiąty) w Bd(10)


    Czyli to że na samym początku definjuje tablice z dwoma elementami typu Byte w niczym nie przeszkadza aby wpisać do tej tablicy 9 elementów?
  • #8
    piotrva
    VIP Meritorious for electroda.pl
    trochę się pomyliłem, wybacz niedopatrzenie, oczywiście tablica jest ŹLE zadeklarowana, skoro pobierasz 9 bajtów, to taki rozmiar musi mieć też tablica. w tym przypadku kompilator nie zgłasza błędu, ale co się dzieje po odpaleniu programu:
    1. pierwsze 2 bajty lądują w tablicy
    2. kolejne 7 bajtów ląduje w kolejnych komórkach pamięci ram za tablicą (o ile bascom zapełnia komórki po kolei to zniszczeniu mogą ulec poprzednie wartości w kolejnych zmiennych zadeklarowanych po tablicy, czyli np.: T i Ulamek, oczywiście Ty potem dopiero obliczasz i zapisujesz wartości do tych zmiennych stąd nie widać problemu.
  • #9
    otapi
    Level 25  
    tablica powinna mieć 9 elementów, ewentualnie powinno być :

    Bd(1) = 1wread(2)

    skoro nie używasz pozostałych danych odczytanych z czujnika
  • #10
    heyka
    Level 17  
    No waśnie to mnie bolało ( i dobrze, że bolało :), cos jednak myślę ) bo mimo że program się kompiluje i pracuje, jest w nim błąd. Dzieki za wyjasnienie sprawy.
    Wątpliwości rozwiane. Zamykam temat.