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

[Atmega32] [Bascom] DS18b20 - dwie linie po dwa DS18B20

maximus22_kr 07 Sty 2011 01:11 5776 5
REKLAMA
  • #1 8969934
    maximus22_kr
    Poziom 18  
    Witam
    Próbuje przerobić kod obsługujący kilka DS18B20 na jednej linii i drugi obsługujący kilka DS18B20 na kilku liniach. Niestety jak na razie efekt jest taki, że działa tylko pierwsza linia, czyli dwa DS18B20. Jeśli chodzi o konfiguracje, to celowo nie ma Config 1wire = Porta.1 gdyż wpisanie tego portu, jako 1WIRE powoduje wyświetlanie 0.0 dla pierwszego portu ( czyli dwóch DS18B20 ) i wyświetlanie wskazań tylko jednego czujnika DS18B20 z drugiego portu. Przy wersji, jeden DS18B na jednej linii korzystałem z &HCC, przy wersji z kilkoma DS18B20 na jednej linii korzystałem z &H55, a teraz nie za bardzo wiem jak to połączyć.

    
    $regfile = "m32def.dat"
    $crystal = 16000000
    
    Config Lcdbus = 4
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Pb.4 , Db5 = Pb.5 , Db6 = Pb.6 , Db7 = Pb.7 , E = Pb.3 , Rs = Pb.2
    
    
    Config 1wire = Porta.0
    
    
    
    
    
    Dim Ds1(8) As Byte                                          'zmienna określająca numer układu
    Dim Ds2(8) As Byte                                          'zmienna określająca numer układu
    Dim Ds3(8) As Byte
    Dim Ds4(8) As Byte
    
    Dim Ss1 As String * 6
    Dim Ss2 As String * 6
    Dim T1 As Integer
    Dim T2 As Integer
    Dim T3 As Integer
    Dim T4 As Integer
                                             'zmienna odczytu dwóch bajtów z DS18B20
                                                                                                                              'zmienna odczytu dwóch bajtów z DS18B20
    Dim W As Byte
    Dim B As Byte
    
    Deflcdchar 0 , 6 , 9 , 6 , 32 , 32 , 32 , 32 , 32           ' znak stopnia celcjusza
    
    Cursor Off
    Cls
    
    
    Ds1(1) = 1wsearchfirst()
    Ds2(1) = 1wsearchnext()
    Ds3(1) = 1wsearchnext()
    Ds4(1) = 1wsearchnext()
    
    
    
    '*************************** pomiar temp. na termometrze ds18b20
    Do
    
    
    '********** magistrala 1-wire 1 czujnik 1
    
    
    1wreset Pina , 0                                                    'reset magistrali 1-wire
    1wwrite &H55 , 1 , Pina , 0                                 'rozkaz adresowy MATCH ROM
    1wverify Ds1(1)                                             'sprawdź adres
    1wwrite &HBE , 1 , Pina , 0                                 'rozkaz funkcyjny polecenie odczytu DS18B20
    T1 = 1wread(2)                                              'odczytaj dwa pierwsze bajty
                                                      'czekaj 750 ms
    
    
    '********** magistrala 1-wire 1 czujnik 2
    
    
    1wreset Pina , 0                                            'reset magistrali 1-wire
    1wwrite &H55 , 1 , Pina , 0                                 'rozkaz adresowy MATCH ROM
    1wverify Ds2(1)                                             'sprawdź adres
    1wwrite &HBE , 1 , Pina , 0                                 'rozkaz funkcyjny polecenie odczytu DS18B20
    T2 = 1wread(2)                                              'odczytaj dwa pierwsze bajty
                                                     'czekaj 750 ms
    
    
    
    '********** magistrala 1-wire 2 czujnik 1
    
    1wreset Pina , 1                                            'reset magistrali 1-wire
    1wwrite &H55 , 1 , Pina , 1                                 'rozkaz adresowy MATCH ROM
    1wverify Ds3(1)                                             'sprawdź adres
    1wwrite &HBE , 1 , Pina , 1                                 'rozkaz funkcyjny polecenie odczytu DS18B20
    T3 = 1wread(2)                                              'odczytaj dwa pierwsze bajty
                                                     'czekaj 750 ms
    
    '********** magistrala 1-wire 2 czujnik 2
    
    1wreset Pina , 1                                            'reset magistrali 1-wire
    1wwrite &H55 , 1 , Pina , 1                                 'rozkaz adresowy SKIP ROM
    1wverify Ds4(1)                                             'sprawdź adres
    1wwrite &HBE , 1 , Pina , 1                                 'rozkaz funkcyjny polecenie odczytu DS18B20
    T4 = 1wread(2)                                              'odczytaj dwa pierwsze bajty
                                                     'czekaj 750 ms
    
    '********** konwersja temperatury dla wszystkich DS18B20
    
     1wreset Pina , 0
        1wwrite &HCC , 1 , Pina , 0
       1wwrite &H44 , 1 , Pina , 0
    
    
       1wreset Pina , 1
        1wwrite &HCC , 1 , Pina , 1
       1wwrite &H44 , 1 , Pina , 1
    Wait 1
    
    '**************** pierwsze wejście - pierwszy DS18B20 obliczenia + wyświetlanie **********
    
    T1 = T1 * 10
       T1 = T1 / 16
       'If Tc1 > 0 Then Cls                                       'korekta przesuniecia znaku st C przy przejściu z temp ujemnej na dodatnią
       Ss1 = Str(t1)
       Ss1 = Format(ss1 , " 0.0")                               'formatuj według wzorca - jedno miejsce po przecinku
    
    Locate 1 , 1                                                'wyświetl w pozycji
    Lcd Ss1 ; Chr(0) ; "C "                                     'wyświetl wynik formatowania + znak specjalny + C
    
    '**************** pierwsze wejście - drugi DS18B20 obliczenia + wyświetlanie **********
    
    T2 = T2 * 10
       T2 = T2 / 16
       'If Tc2 > 0 Then Cls                                       'korekta przesuniecia znaku st C przy przejściu z temp ujemnej na dodatnią
       Ss1 = Str(t2)
       Ss1 = Format(ss1 , " 0.0")                               'formatuj według wzorca - jedno miejsce po przecinku
    
    
    Locate 1 , 10                                               'wyświetl w pozycji
    Lcd Ss1 ; Chr(0) ; "C "                                     'wyświetl wynik formatowania + znak specjalny + C
    
    
    '**************** pierwsze wejście - drugi DS18B20 obliczenia + wyświetlanie **********
    
     T3 = T3 * 10
       T3 = T3 / 16
       'If Tc2 > 0 Then Cls                                       'korekta przesuniecia znaku st C przy przejściu z temp ujemnej na dodatnią
       Ss2 = Str(t3)
       Ss2 = Format(ss2 , " 0.0")                               'formatuj według wzorca - jedno miejsce po przecinku
    
    
    Locate 2 , 1                                                'wyświetl w pozycji
    Lcd Ss2 ; Chr(0) ; "C "
    
    
    '**************** pierwsze wejście - drugi DS18B20 obliczenia + wyświetlanie **********
    
    T4 = T4 * 10
       T4 = T4 / 16
       'If Tc2 > 0 Then Cls                                       'korekta przesuniecia znaku st C przy przejściu z temp ujemnej na dodatnią
       Ss2 = Str(t4)
       Ss2 = Format(ss2 , " 0.0")                               'formatuj według wzorca - jedno miejsce po przecinku
    
    
    Locate 2 , 10                                               'wyświetl w pozycji
    Lcd Ss2 ; Chr(0) ; "C "                                     'wyświetl wynik formatowania + znak specjalny + C
    
    
    Loop
    End
    
    Pozdrawiam
    Piotr
  • REKLAMA
  • #2 8970332
    gothye
    Poziom 33  
    W Bascom ,będzie trudno ,a C szybciej zmusisz proca do tego , ale z drugej strony po co tak kombinować , 4 DS'y z rezystorem 1.5k podciągnięte do +U ,pracują na skrętce u mnie na dystansie 70mb bez problemu
  • REKLAMA
  • #3 8971002
    piotr5000
    Poziom 21  
    Oczywiście , że wpisując :
    Config 1wire = Porta.1
    zablokujesz odczyt z Porta.0

    Musisz przed odczytem z Porta0 , wpisać w programie Config 1wire = Porta.0
    a następnie gdy będziesz odczytywał z Porta.1 wpisujesz linie Config 1wire = Porta.1

    Czyli , najpierw konfiguracja z której linii potem odczyt.
  • REKLAMA
  • #4 8971355
    piotrva
    VIP Zasłużony dla elektroda
    nie, nie, nie,
    nikomu nie chciało się zajrzeć do dokumentacji BASCOMA?
    wszystkie polecenia obsługi 1wire można przeprowadzać na DOWOLNEJ LINII:
    
    1WREAD
     Top  Previous  Next  
    Action
    
    This statement reads data from the 1wire bus into a variable.
    
     
    
     
    
    Syntax
    
    var2 = 1WREAD( [ bytes] )
    
    var2 = 1WREAD( bytes , port , pin)
    
     
    
     
    
    Remarks
    
    var2
     Reads a byte from the bus and places it into variable var2.
    
     
    
    Optional the number of bytes to read can be specified.
     
    Port
     The PIN port name like PINB or PIND.
     
    Pin
     The pin number of the port. In the range from 0-7. Maybe a numeric constant or variable.
     
    
     
    
     
    
    Multi 1-wire devices on different pins are supported.
    
    To use this you must specify the port pin that is used for the communication.
    
     
    
    The 1wreset, 1wwrite and 1wread statements will work together when used with the old syntax. And the pin can be configured from the compiler options or with the CONFIG 1WIRE statement.
    
     
    
     
    
    The syntax for additional 1-wire devices is :
    
    1WRESET port, pin
    
    1WWRITE var/constant , bytes, port, pin
    
    var = 1WREAD(bytes, port, pin) for reading multiple bytes
    
     
    
     
    
    See also
    
    1WWRITE , 1WRESET
    
     
    
     
    
     
    
    Example
    
    '--------------------------------------------------------------------------------
    
    'name                     : 1wire.bas
    
    'copyright                : (c) 1995-2005, MCS Electronics
    
    'purpose                  : demonstrates 1wreset, 1wwrite and 1wread()
    
    'micro                    : Mega48
    
    'suited for demo          : yes
    
    'commercial addon needed  : no
    
    ' pull-up of 4K7 required to VCC from Portb.2
    
    ' DS2401 serial button connected to Portb.2
    
    '--------------------------------------------------------------------------------
    
     
    
    $regfile = "m48def.dat"
    
    $crystal = 4000000
    
     
    
    $hwstack = 32                                               ' default use 32 for the hardware stack
    
    $swstack = 10                                               'default use 10 for the SW stack
    
    $framesize = 40                                             'default use 40 for the frame space
    
     
    
    'when only bytes are used, use the following lib for smaller code
    
    $lib "mcsbyte.lib"
    
     
    
     
    
    Config 1wire = Portb.0                                     'use this pin
    
    'On the STK200 jumper B.0 must be inserted
    
    Dim Ar(8) As Byte , A As Byte , I As Byte
    
     
    
     
    
    Do
    
    Wait 1
    
     1wreset                                                   'reset the device
    
    Print Err                                                 'print error 1 if error
    
     1wwrite &H33                                             'read ROM command
    
    For I = 1 To 8
    
       Ar(i) = 1wread()                                       'place into array
    
    Next
    
     
    
    'You could also read 8 bytes a time by unremarking the next line
    
    'and by deleting the for next above
    
    'Ar(1) = 1wread(8)                                           'read 8 bytes
    
     
    
    For I = 1 To 8
    
        Print Hex(ar(i));                                     'print output
    
    Next
    
    Print                                                     'linefeed
    
    Loop
    
     
    
     
    
    'NOTE THAT WHEN YOU COMPILE THIS SAMPLE THE CODE WILL RUN TO THIS POINT
    
    'THIS because of the DO LOOP that is never terminated!!!
    
     
    
    'New is the possibility to use more than one 1 wire bus
    
    'The following syntax must be used:
    
    For I = 1 To 8
    
     Ar(i) = 0                                                 'clear array to see that it works
    
    Next
    
     
    
    1wreset Pinb , 2                                           'use this port and  pin for the second device
    
    1wwrite &H33 , 1 , Pinb , 2                                 'note that now the number of bytes must be specified!
    
    '1wwrite Ar(1) , 5,pinb,2
    
     
    
    'reading is also different
    
    Ar(1) = 1wread(8 , Pinb , 2)                               'read 8 bytes from portB on pin 2
    
     
    
    For I = 1 To 8
    
    Print Hex(ar(i));
    
    Next
    
     
    
    'you could create a loop with a variable for the bit number !
    
    For I = 0 To 3                                             'for pin 0-3
    
     1wreset Pinb , I
    
     1wwrite &H33 , 1 , Pinb , I
    
     Ar(1) = 1wread(8 , Pinb , I)
    
    For A = 1 To 8
    
      Print Hex(ar(a));
    
    Next
    
    Print
    
    Next
    
    End
    
    

    (kod z hepla bascoma)
  • REKLAMA
  • #5 9058945
    grubas3oo
    Poziom 2  
    było by miło jak by jakiś z kolegów pod pomógł bo ja nie za bardzo rozumiem tą dokumentację a chciałbym 4 ds 18b20 czytać atmega8 na osobnych pinach
REKLAMA