Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[atmega8][bascom] DS18b20 zwraca wynik -0.1

Regan_3000 18 Sty 2011 17:39 1682 5
  • #1 18 Sty 2011 17:39
    Regan_3000
    Poziom 15  

    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:

    Code:
    $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

    0 5
  • #2 18 Sty 2011 17:48
    Józef18
    Poziom 32  

    Linia I/O z DS18b20 podpięta przez rezystor podciągający 4,7 k ?

    Pozdrawiam
    Józef

    0
  • #3 18 Sty 2011 17:56
    Regan_3000
    Poziom 15  

    Jesli chodzi o hardware to wszystko połączone dobrze. tak linia I/O podciągnieta przez rezystor 4,7k. dodam tylko ze jak wgrałem prosty program który tylko pokazywal jedna temp z jednego czujnika to wszystko był w porządku.

    0
  • Pomocny post
    #4 18 Sty 2011 17:58
    WOBI
    Poziom 19  

    Ręce to opadają i masz rację ;)

    Masz błąd w definicji zmiennej do której wpisujesz ID czujników to nie jest jeden bajt tylko tablica 8x8bitów czyli 8 bajtów. Adresujesz nie istniejące czujniki bo ich adresy sa niepoprawne, wysyła procek ciagle ten sam bajt.

    Code:
    Dim Adres1 As Byte                                          'adres pierwszego 
    
    Dim Adres2 As Byte                                          'adres drugiego
    Dim Adres3 As Byte                                          'adres trzeciego


    na być

    Code:
    Dim Adres1(8) As Byte                                          'adres pierwszego 
    
    Dim Adres2(8) As Byte                                          'adres drugiego
    Dim Adres3(8) As Byte                                          'adres trzeciego


    a tu tesz kwiatek :) jak 8 bajtów chcesz wpisać do 1 bajta i to samo do Eepromu

    Code:
    Adres1= 1wsearchfirst() 


    ma być
    Code:
    Adres1(1)= 1wsearchfirst()
    


    popraw też to bo jest źle
    Code:
    Writeeeprom Adres1 , 1

    ale to juz sam pomyśl jak zmienić.

    to samo dotyczy odczytu 1wire bo źle napisałeś wszystkie funkcje które używają tych nieszczęsnych Adresów.
    Pamiętaj ID DS to tablica 8 bajtów a nie pojedyńczy bajt!!!

    0
  • #5 18 Sty 2011 18:06
    xury
    Poziom 38  

    Po pierwsze to zamiast polecenia Gosub do przełączania "ekranów" używaj flag, bo jeśli nawet już dojdziesz do ładu z tym 1wire, to za chwilę będzie koniec pamięci na stos i... po programie :)
    p.s.
    Moje ulubione:)

    Code:
    Gosub Ekran1 
    

    Do

    Ekran1:
    Do

    0
  • #6 18 Sty 2011 18:16
    Regan_3000
    Poziom 15  

    Ok dzięki WOBI już działa teraz zajmę się flagami i ukończeniem programu.

    0