Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Atmega 8 i 4 ds18b20

wojno 06 Apr 2008 19:55 3675 10
  • #1
    wojno
    Level 12  
    Witam

    Jak powinna wyglądać procedura odczytu temperatury z 4 czujników, ale żeby id brało z eeprom i pomiar z odpowiedniego czujnika zapisywał do zmiennych t1,t2,t3,t4.

    Procedurę do zapisywania id do eeprom juz mam.

    Program pisze w bascomie.

    Dodano po 53 [minuty]:



    Code:


    Sub Odcz_temp(czujnik As Byte)

       If Czujnik = 1 Then
          For I = 1 To 8
             Readeeprom Id(i) , I
          Next I

       End If

       If Czujnik = 2 Then
          J = 0
          For I = 9 To 16
             Incr J
             Readeeprom Id(j) , I
          Next I



       End If

       1wreset
       Call Zapisz_id

       1wwrite &H44
       Waitms 750
       1wreset
       Call Zapisz_id

       1wwrite &HBE

       Temperatura(1) = 1wread(2)

       1wreset
       If Err = 1 Then
          Cls
          Lcd "brak układu"

          Do
          Loop
       End If

       T = Makeint(temperatura(1) , Temperatura(2))
    T = T * 10
    T = T / 16
    Temp_str = Str(t)
    Temp_str = Format(temp_str , "0.0" )


    Locate 1 , 1
    Lcd "T1 " ; Temp_str ; " " ; Chr(2)




    procedura odczytuje ale ciagle wyswietla mi na lcd t1 jak zrobic zeby z jednego czujnika wyswietlał t1 a z drugiego t2 i aktualny pomiar

    pozdrawiam
  • #2
    JmL(TM)
    Level 24  
    Tutaj masz wszystko...

    Code:
    'Program  sterowania dwoma układami DS1820 dołączonymi
    
    'do tej samej magistrali 1-Wire

    $regfile = "m8def.dat"                                      'informuje kompilator o pliku
          'dyrektyw mikrokontrolera
    $crystal = 8000000                                          'informuje kompilator
          'o częstotliwości oscylatora
          'taktującego mikrokontroler
    Config Pinb.1 = Input                                       'linia PB1 jako wejściowa
    Config Lcd = 16 * 2                                         'konfigurowanie typu
          'wyświetlacza LCD
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5       'konfigurowanie linii
          'mikrokontrolera, do których
          'jest dołączony wyświetlacz LCD
    Config 1wire = Portb.0                                      'konfigurowanie linii magistrali
          '1-Wire
    Declare Sub Odcz_temp(czujnik As Byte)                      'procedura odczytu temperatury
          'z układu DS1820 z parametrem,
          'który wskazuje numer czujnika
          'temperatury
    Declare Sub Zapisz_id                                       'procedura zapisu numeru ID do
          'układu DS1820
    Dim Temperatura(2) As Byte                                  'tablica dwóch zmiennych typu
          'Byte na zmierzoną temperaturę
    Dim Id(8) As Byte                                           '8-elementowa tablica na numer
          'ID
    Dim I As Byte                                               'zmienna licznikowa
    Dim J As Byte                                               'zmienna licznikowa
    Dim K As Byte                                               'zmienna licznikowa
    Dim Liczba_ukl As Byte                                      'zmienna, do której wpisywana
          'jest liczba układów dołączonych
          'do magistrali 1-Wire
    S1 Alias Pinb.1                                             'przypisanie nazwie Pinb.1
          'nazwy S1

          'definicja znaku stopnia
    Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32

    Set Portb.1                                                 'dołączenie do linii PB1
          'rezystora podciągającego
    Cls                                                         'czyszczenie LCD
    Liczba_ukl = 1wirecount()                                   'odczytanie liczby układów
          'dołączonych do magistrali
          '1-Wire
    If S1 = 0 Then                                              'jeśli przycisk S1 naciśniety,
          'to
     Lcd "Liczba ukladow: " ; Liczba_ukl
          'wyświetlenie na LCD liczby
          'układów dołączonych do
          'magistrali
     If Liczba_ukl > 0 Then                                     'jeśli liczba układów większa od
          '0‚ to
      Id(1) = 1wsearchfirst()                                   'odczytanie numeru seryjnego
          'pierwszego dołączonego do
          'magistrali układu
      For I = 1 To 8                                            'pętla wykonywana 8 razy
       Writeeeprom Id(i) , I                                    'zapisanie odczytanego ID do
          'pamięci EEPROM w słowach 1...8
      Next I                                                    'zwiększenie wartości I o jeden
     End If
     If Liczba_ukl > 1 Then                                     'jeśli liczba układów jest
          'większa od 1, to
      Id(1) = 1wsearchnext()                                    'odczytanie numeru seryjnego
          'kolejnego układu (drugiego
          'DS1820)
      J = 0                                                     'wartość początkowa zmiennej
          'J = 0
      For I = 9 To 16                                           'pętla wykonywana 8 razy od
          'I = 9 do I = 16
       Incr J                                                   'zwiększenie wartości J o jeden
       Writeeeprom Id(j) , I                                    'zapisanie numeru ID drugiego
          'układu do pamięci EEPROM
          'w słowach 9...16
      Next I                                                    'zwiększenie o jeden wartości I
     End If
     Lowerline                                                  'kursor do drugiej linii LCD
     Lcd "Prog ok"                                              'wyświetlenie komunikatu
          'o zakończeniu odczytu numerów
          'ID
     Do                                                         'pętla nieskończona Do...Loop
     Loop
    End If

    Do                                                          'początek pętli programu
          'głównego
     Home                                                       'kursor na początek pierwszej
          'linii
     For K = 1 To Liczba_ukl                                    'pętla wykonywana od K = 1 do
          'liczby układów dołączonych do
          '1-Wire
      Call Odcz_temp(k)                                         'wywołanie procedury pomiaru
          'temperatury z parametrem K
      If Temperatura(2) = 0 Then                                'jeśli wartość Temperatura(2)
          '= 0 to temperatura dodatnia
          'wyświetlenie temperatury
          'dodatniej
       Lcd "Temp" ; K ; ": " ; Temperatura(1) ; Chr(0) ; "C"
      Else                                                      'w przeciwnym razie wyświetlenie
          'temperatury ujemnej
       Lcd "Temp" ; K ; ": -" ; Temperatura(1) ; Chr(0) ; "C"
      End If
      Lowerline                                                 'kursor w drugiej linii LCD
     Next K                                                     'zwiększenie o 1 wartości K
    Loop                                                        'koniec pętli Do...Loop
    End                                                         'koniec programu

    Sub Odcz_temp(czujnik As Byte)                              'procedura pomiaru temperatury
          '- parametr Czujnik określa
          'numer czujnika
     If Czujnik = 1 Then                                        'jeśli Czujnik = 1 to
          'odczytywany jest z pamięci
          'EEPROM numer ID czujnika 1
      For I = 1 To 8                                            'pętla wykonywana od I = 1 do
          'I = 8
       Readeeprom Id(i) , I                                     'odczyt ID z pamięci EEPROM
          'czujnika pierwszego
      Next I                                                    'zwiększenie o 1 wartości I
     End If
     If Czujnik = 2 Then                                        'jeśli Czujnik = 2 to
          'odczytywany jest z pamięci
          'EEPROM numer ID czujnika 2
      J = 0                                                     'wartość początkowa zmiennej
          'J = 0
      For I = 9 To 16                                           'pętla wykonywana 8 razy od
          'I = 9 do I = 16
       Incr J                                                   'zwiększenie wartości J o jeden
       Readeeprom Id(j) , I                                     'odczyt numeru ID z pamięci
          'EEPROM z słów 9...16 dla
          'czujnika 2
      Next I                                                    'zwiększenie o 1 wartości I
     End If

     1wreset                                                    'reset magistrali 1-Wire
     Call Zapisz_id                                             'wybranie czujnika poprzez zapis
          'do niego numeru ID aktualnie
          'obsługiwanego układu DS1820
     1wwrite &H44                                               'start pomiaru przez układ
          'DS1820
     Waitms 750                                                 'opóźnienie na czas pomiaru
     1wreset                                                    'reset magistrali 1-Wire
     Call Zapisz_id                                             'wybranie czujnika poprzez zapis
          'do niego numeru ID aktualnie
          'obsługiwanego układu DS1820
     1wwrite &HBE                                               'komenda odczytu układu DS1820
          'zmierzonej temperatury
     Temperatura(1) = 1wread(2)                                 'odczyt zmierzonej temperatury
          'do tablicy Temperatura
     1wreset                                                    'reset magistrali 1-Wire
     If Err = 1 Then                                            'jeśli brak układu DS1820
          'dołączonego do 1-Wire, to
      Cls                                                       'czyszczenie LCD
      Lcd "Brak ukladu"                                         'wyświetlenie komunikatu o braku
          'układu
      Do                                                        'nieskończona pętla Do...Loop
          'w celu wstrzymania działania
          'programu
      Loop
     End If
     If Temperatura(2) > 0 Then                                 'jeśli zmienna Temperatura(2)
          '> 0, to temperatura ujemna
          'przeliczenie temperatury
          'ujemnej
      Temperatura(1) = 256 - Temperatura(1)
     End If                                                     'koniec warunku
     Temperatura(1) = Temperatura(1) / 2
          'dalsze przeliczenie odczytanej
          'temperatury dodatniej jak
          'i ujemnej
    End Sub                                                     'koniec procedury pomiaru

    Sub Zapisz_id                                               'definicja procedury zapisu
          'numeru ID do układów DS1820
     1wwrite &H55                                               'wysłanie komendy zapisu numeru
          'ID do układów
     For I = 1 To 8                                             'pętla wykonywana od I = 1 do
          'I = 8
      1wwrite Id(i)                                             'wysłanie do czujników numeru ID
          'z tablicy Id
     Next I                                                     'zwiększenie o 1 wartości I
    End Sub                                                     'koniec procedury
  • #3
    wojno
    Level 12  
    Dzięki

    A jak mierzyć różnicę między nimi

    np.
    Jeżeli różnica miedzy t1 a t2 jest większa lub równa 5 wtedy zapal diodę
  • #4
    JmL(TM)
    Level 24  
    wojno wrote:
    Dzięki

    A jak mierzyć różnicę między nimi

    np.
    Jeżeli różnica miedzy t1 a t2 jest większa lub równa 5 wtedy zapal diodę


    Code:
    Dim Tx As Byte
    

    Tx = t1 - t2

    If Tx >= 5 Then
        Call Zapal_diode()
    End If
  • #5
    wojno
    Level 12  
    A jak zrobić zeby te 50 wpisywać z klawiatury czyli zeby było nastawialne.

    Pozdrawiam i dziekuje
  • #6
    JmL(TM)
    Level 24  
    wojno wrote:
    A jak zrobić zeby te 50 wpisywać z klawiatury czyli zeby było nastawialne.

    Pozdrawiam i dziekuje


    Chyba masz na mysli 5 ;)

    Deklarujesz zmienna np. X, do ukladu dodajesz 2 przyciski i jak wcisniesz 1 z nich zwiekszasz wartosc zmiennej X a jak ten drugi to zmniejszasz....

    O to chodzi?
  • #7
    wojno
    Level 12  
    Tak dokładnie.

    Zeby to zapisał do zmiennej, jak to zrobic programowo.
  • Helpful post
    #8
    JmL(TM)
    Level 24  
    Tutaj masz przyklad w ktorym po kazdorazowym wcisnieciu przycisku zmienna zwieksza sie o 1:

    Code:
    Config Pinb.3 = Input
    

    S1 Alias Pinb.3
    Set Portb.3

    If S1 = 0 Then
       Waitms 25

       If S1 = 0 Then
          'np. Incr twoja_zmienna
       End If
    End If


    A tutaj wcisniecie przycisku i jego przytrzymanie powoduje zmniejszanie sie zmiennej o 1 co 200 ms:

    Code:
    Config Pinb.3 = Input
    

    If S1 = 0 Then
       Waitms 25

       If S1 = 0 Then
          Do
             ' np. Decr twoja_zmienna

             Waitms 200
          Loop Until S1 = 1
       End If
    End If


    Pozdrawiam!
  • #9
    189183
    Level 10  
    JmL(TM) wrote:
    wojno wrote:
    Dzięki

    A jak mierzyć różnicę między nimi

    np.
    Jeżeli różnica miedzy t1 a t2 jest większa lub równa 5 wtedy zapal diodę


    Code:
    Dim Tx As Byte
    

    Tx = t1 - t2

    If Tx >= 5 Then
        Call Zapal_diode()
    End If



    wszystko byloby ok gdyby nie fakt ze jezeli t1 bedzie mniejsze od t2 i tak zostanie zapalona dioda.
    zrobilem tak jak pokazales i jednak jak t2 jest wieksze to zapala diode.
    czy mozna jakos zrobic ze jezeli tylko t1 jest wieksze od t2 o 5 zapali diode?
  • #10
    JmL(TM)
    Level 24  
    No problem! - jak mawiaja rosjanie :D

    Code:
    Dim Tx As Byte
    

    If t1 > t2 Then
       Tx = t1 - t2

       If Tx >= 5 Then
          Call Zapal_diode()
       End If
    End If
  • #11
    189183
    Level 10  
    juz wczesniej tak zrobilem.i mialem wykasowac posta ale juz byla odpowiedz :)

    mimo wszystko dzieki.

    jak sie siedzi kilka godzin przed kompem to bezmozgowia sie dostaje.

    Pozdrawiam