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

[atmega8][bascom] DS18b20 zwraca wynik -0.1

Regan_3000 18 Sty 2011 17:39 1961 5
  • #1 9023310
    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:
    $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
  • #3 9023385
    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.
  • Pomocny post
    #4 9023410
    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.

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


    na być

    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

    Adres1= 1wsearchfirst() 


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


    popraw też to bo jest źle
    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!!!
  • #5 9023472
    xury
    Specjalista automatyka domowa
    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:)
    Gosub Ekran1 
    
    Do 
    
    Ekran1: 
    Do
  • #6 9023524
    Regan_3000
    Poziom 15  
    Ok dzięki WOBI już działa teraz zajmę się flagami i ukończeniem programu.
REKLAMA