Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Примеры применения в среде Баском » Исследование Ds18b20 (датчик температуры)


Исследование Ds18b20 (датчик температуры)

Сообщений 1 страница 20 из 20

1

Исследование Ds18b20 (датчик температуры)

0

2

Поиск ID большого количества Ds18b20 с последующей записью в EEPROM МК

Если кому поможет, буду рад!

Исходник

*******************************************************************************
'************************* ATMEGA32 и DS18B20 ********************************
'*******************************************************************************
'-------------------- Конфигурация программы и контроллера ---------------------
$regfile = "m32def.dat" : $crystal = 8000000 : $framesize = 120 : $hwstack = 120 : $swstack = 120 : $baud = 9600
'-------------------------------------------------------------------------------
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.1 , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5
Config Lcd = 20 * 4 : Initlcd : Cursor Off Noblink : Cls
'-------------------------------------------------------------------------------
'-------------------------- Дополнительные_символы------------------------------
'-------------------------------------------------------------------------------
Deflcdchar 0 , 2 , 5 , 5 , 5 , 2 , 32 , 32 , 32  ' знак градус, маленький
Deflcdchar 1 , 28 , 20 , 28 , 32 , 32 , 32 , 32 , 32       'знак градуса
Deflcdchar 2 , 14 , 10 , 10 , 10 , 14 , 31 , 31 , 14       'термометр
Deflcdchar 3 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32 'знак градуса
'  Deflcdchar 3 , 31 , 27 , 19 , 27 , 27 , 27 , 17 , 31        'инверсная 1
'  Deflcdchar 4 , 31 , 17 , 21 , 29 , 27 , 23 , 17 , 31        'инверсная 2
'  Deflcdchar 5 , 31 , 17 , 29 , 25 , 29 , 29 , 17 , 31        'инверсная 3
'  Deflcdchar 6 , 31 , 23 , 21 , 21 , 17 , 29 , 29 , 31        'инверсная 4
'  Deflcdchar 7 , 4 , 5 , 15 , 20 , 4 , 14 , 10 , 27           'человечек
'  Deflcdchar 4 , 232 , 244 , 232 , 227 , 228 , 228 , 227 , 224       'градус Цельсия
'-------------------------------------------------------------------------------
'----------------------- Конфигурация DS18B20 ----------------------------------
'-------------------------------------------------------------------------------
Config 1wire = Portb.4 : Ds18b20 Alias Pinb.4
'-------------------------------------------------------------------------------
'************************** Задаём перемнные ***********************************

Dim 1_id_ds18b20(8) As Byte
Dim 2_id_ds18b20(8) As Byte
Dim 3_id_ds18b20(8) As Byte
Dim 4_id_ds18b20(8) As Byte
Dim 5_id_ds18b20(8) As Byte
Dim 6_id_ds18b20(8) As Byte
Dim 7_id_ds18b20(8) As Byte
Dim 8_id_ds18b20(8) As Byte
Dim 9_id_ds18b20(8) As Byte
Dim 10_id_ds18b20(8) As Byte
Dim 11_id_ds18b20(8) As Byte
Dim 12_id_ds18b20(8) As Byte
Dim 13_id_ds18b20(8) As Byte
Dim 14_id_ds18b20(8) As Byte
Dim 15_id_ds18b20(8) As Byte
Dim 16_id_ds18b20(8) As Byte
Dim 17_id_ds18b20(8) As Byte
Dim 18_id_ds18b20(8) As Byte
Dim 19_id_ds18b20(8) As Byte
Dim 20_id_ds18b20(8) As Byte
Dim 21_id_ds18b20(8) As Byte
Dim 22_id_ds18b20(8) As Byte
Dim 23_id_ds18b20(8) As Byte
Dim 24_id_ds18b20(8) As Byte
Dim 25_id_ds18b20(8) As Byte
Dim 26_id_ds18b20(8) As Byte
Dim 27_id_ds18b20(8) As Byte
Dim 28_id_ds18b20(8) As Byte
Dim 29_id_ds18b20(8) As Byte
Dim 30_id_ds18b20(8) As Byte
Dim 31_id_ds18b20(8) As Byte
Dim 32_id_ds18b20(8) As Byte
Dim 33_id_ds18b20(8) As Byte
Dim 34_id_ds18b20(8) As Byte
Dim 35_id_ds18b20(8) As Byte
Dim 36_id_ds18b20(8) As Byte
Dim 37_id_ds18b20(8) As Byte
Dim 38_id_ds18b20(8) As Byte
Dim 39_id_ds18b20(8) As Byte
Dim 40_id_ds18b20(8) As Byte
Dim 41_id_ds18b20(8) As Byte
Dim 42_id_ds18b20(8) As Byte
Dim 43_id_ds18b20(8) As Byte
Dim 44_id_ds18b20(8) As Byte
Dim 45_id_ds18b20(8) As Byte
Dim 46_id_ds18b20(8) As Byte
Dim 47_id_ds18b20(8) As Byte
Dim 48_id_ds18b20(8) As Byte
Dim 49_id_ds18b20(8) As Byte
Dim 50_id_ds18b20(8) As Byte
Dim 51_id_ds18b20(8) As Byte
Dim 52_id_ds18b20(8) As Byte
Dim 53_id_ds18b20(8) As Byte
Dim 54_id_ds18b20(8) As Byte
Dim 55_id_ds18b20(8) As Byte
Dim 56_id_ds18b20(8) As Byte
Dim 57_id_ds18b20(8) As Byte
Dim 58_id_ds18b20(8) As Byte
Dim 59_id_ds18b20(8) As Byte
Dim 60_id_ds18b20(8) As Byte
'-------------------------------------------------------------------------------
Dim Adres_id_ds18b20 As Word

Declare Sub Displey_lcd()
Declare Sub Opros_id_ds18b20()

Declare Function Zapros_kolichestva_ds18b20() As Integer       'Функция запроса количества датчиков Ds18b20 на линии
Dim Kolichestvo_ds18b20 As Integer               'Word/Integer переменная для посчета количества датчиков на линии

Declare Sub Save_eeprom_id_ds18b20()
Dim Id_ds18b20(8) As Byte

Declare Sub Reading_eeprom_id_ds18b20()
'*******************************************************************************
Do
'-------
    'Toggle Led_norma : Waitms 300
    'Pulselednorma = 30 Then : Toggle Led_norma : Pulselednorma = 0 : End If

    rcall Zapros_kolichestva_ds18b20

    rcall Save_eeprom_id_ds18b20

    rcall Reading_eeprom_id_ds18b20

    'rcall Opros_id_ds18b20

'-------
Loop
'*******************************************************************************

'*******************************************************************************
'-------------------------------------------------------------------------------
Function Zapros_kolichestva_ds18b20() As Integer
'---------------------------------------------------
Local A As Byte
'-----------------
    For A = 1 To 3                                'моргаем в цикле, на LCD 3 раза
      Cls                                         'Очищаем LCD
        'Waitms 100
'=============================================
          Kolichestvo_ds18b20 = 1wirecount()      'Запрос количества датчиков Ds18b20 на линии
'=============================================
        Locate 1 , 1 : Lcd "    It is found     " 'Печатаем на LCD "Найдено"
        Locate 2 , 1 : Lcd " " ; Kolichestvo_ds18b20 ; " sensors DS18B20"       'Печатаем на экране количество датчиков на линии
      Waitms 1000                                 'Пауза ~ 750ms
    Next                                          'Повторить
      Wait 1                                      'Пауза ~ 2s
      Print Kolichestvo_ds18b20 ;                 'Печатаем в терминале количество датчиков Ds18b20 на линии
    Print : Cls
'---------------
  End Function
'-------------------------------------------------------------------------------
'*******************************************************************************

'*******************************************************************************
'********* Подпрограмма поиска и записи ID DS18B20 в EEPROM контроллера ********
'*******************************************************************************
'-------------------------------------------------------------------------------
  Sub Save_eeprom_id_ds18b20                      'Подпрограмма поиска и записи ID DS18B20 в EEPROM контроллера
'---------------------------
  Local A As Byte , B As Byte , C As Byte         'Заводим временные переменные, которые будут использоваться в этой подпрограмме
'--------------------------------------------
'========= Первый датчик ==========
  Id_ds18b20(1) = 1wsearchfirst()                 'Посылаем запрос и получаем ответ в виде 8-ми байтного адреса первому датчику
'==================================
      A = 1

      Print "     " ; A ; " Ds18b20"
      Print "   Write EEPROM    "
      Print "ID " ;

      Upperline                                   'Upperline  1 строка, Lowerline  2 строка, Thirdline  3 строка, Fourthline 4 строка
      Lcd "    " ; A ; " Ds18b20"
      Thirdline                                   'Upperline  1 строка, Lowerline  2 строка, Thirdline  3 строка, Fourthline 4 строка
      Lcd "   Write EEPROM    "
      Lowerline                                   'Upperline  1 строка, Lowerline  2 строка, Thirdline  3 строка, Fourthline 4 строка
      Lcd "ID "                                   'Печатаем на LCD, "ID"

    Adres_id_ds18b20 = 10                         'Начинаем с 10 адреса (просто для удобства (первый датчик - 10 адрес, второй датчик - 20 адрес и т.д. ))
      For B = 1 To 8                              'Работаем с 8 байтами первого, считанного ID DS18B20
        Print Hex(id_ds18b20(b)) ;                'Печатаем в терминале, побайтно, все 8 байт
        Lcd Hex(id_ds18b20(b))                    'Печатаем на LCD, побайтно, все 8 байт
          Writeeeprom Id_ds18b20(b) , Adres_id_ds18b20       'Записываем в установленную ранее ячейку памяти контроллера
         Waitms 5                                 'Пауза ~ 5ms
        Incr Adres_id_ds18b20                     'Увеличиваем адрес на 1
      Next B                                      'Повторяем для всего значения считанного ID  первого датчика
     Waitms 250                                   'Пауза ~ 500ms

    Print : Print "       READY" : Print          'Переходим в терминале на новую строку
    Fourthline                                    'Upperline  1 строка, Lowerline  2 строка, Thirdline  3 строка, Fourthline 4 строка
    Lcd "       READY"                            'Печатаем на LCD "Сохранено"
   'Waitms 500                                                   'Пауза ~ 1s
  'Cls                                                       'Очищаем LCD
'------- Следующие  датчики --------
  For A = 2 To Kolichestvo_ds18b20
'===================================
    Id_ds18b20(1) = 1wsearchnext()                'Посылаем запрос и получаем ответ в виде 8-ми байтного адреса следующему датчику
'===================================
      Adres_id_ds18b20 = Adres_id_ds18b20 + 2     'Увеличиваем адрес на 2, что-бы получить следующий, целый десяток(для удобства)

      Print "     " ; A ; " Ds18b20"
      Print "   Write EEPROM    "
      Print "ID " ;

      Upperline                                   'Upperline  1 строка, Lowerline  2 строка, Thirdline  3 строка, Fourthline 4 строка
      Lcd "    " ; A ; " Ds18b20"
      Thirdline                                   'Upperline  1 строка, Lowerline  2 строка, Thirdline  3 строка, Fourthline 4 строка
      Lcd "   Write EEPROM    "
      Lowerline                                   'Upperline  1 строка, Lowerline  2 строка, Thirdline  3 строка, Fourthline 4 строка
      Lcd "ID "                                   'Печатаем на LCD, "ID"

        For B = 1 To 8                            'Работаем с 8 байтами следующего, считанного ID DS18B20
          Lcd Hex(id_ds18b20(b))                  'Печатаем на LCD, побайтно, все 8 байт
          Print Hex(id_ds18b20(b)) ;              'Печатаем в терминале, побайтно, все 8 байт
          Writeeeprom Id_ds18b20(b) , Adres_id_ds18b20       'Записываем в установленную ранее ячейку памяти контроллера
            Waitms 5                              'Пауза ~ 5ms
          Incr Adres_id_ds18b20                   'Увеличиваем адрес на 1
        Next B                                    'Повторяем для всего значения считанного ID следующего датчика
      Waitms 250                                  'Пауза ~ 500ms

    Print : Print "       READY " : Print         'Переходим в терминале на новую строку
    Fourthline                                    'Upperline  1 строка, Lowerline  2 строка, Thirdline  3 строка, Fourthline 4 строка
    Lcd "       READY "                           'Печатаем на LCD "Сохранено"
      Waitms 250                                  'Пауза ~ 1s
    'Cls                                                     'Очищаем LCD
  Next A                                          'Переходим к поиску следующего датчика

'-------------------------------------------------------------------------------
'Выводим на LCD и в тераинал информацию, о завершении, чтения и записи в EEPROM, ID датчиков Ds18b20
'Id Sensors Ds18b20 Read And Written In The Eeprom
'id датчиков прочитаны и записаны в EEPROM
'-------------------------------------------------------------------------------
    For A = 1 To 5                                'моргаем в цикле, на LCD 3 раза
      Cls                                         'Очищаем LCD
        Waitms 500
          Upperline                               'Upperline  1 строка, Lowerline  2 строка, Thirdline  3 строка, Fourthline 4 строка
          Lcd " id sensors Ds18b20 "
          Lowerline
          Lcd "       read         "
          Thirdline
          Lcd "    and written     "
          Fourthline
          Lcd "   in the EEPROM    "
      Waitms 750                                  'Пауза ~ 750ms
    Next                                          'Повторить
          Print " id sensors Ds18b20 "
          Print "       read         "
          Print "    and written     "
          Print "   in the EEPROM    "
          Print
       Wait 5
'----------
  End Sub                                         'Выходим из подпрограммы поиска и записи ID DS18B20 в EEPROM контроллера
'-------------------------------------------------------------------------------
'*******************************************************************************

'*******************************************************************************
'********* Подпрограмма чтения ID DS18B20 из EEPROM контроллера ****************
'*******************************************************************************
'-------------------------------------------------------------------------------
  Sub Reading_eeprom_id_ds18b20
'------------------------------
  Local A As Byte , B As Byte
'-------------------------------
  Adres_id_ds18b20 = 10
'-----------------------
  Cls
    For A = 1 To Kolichestvo_ds18b20

      Print "     " ; A ; " Ds18b20"
      Print "Read from the EEPROM"
      Print "ID " ;

      Upperline                                   'Upperline  1 строка, Lowerline  2 строка, Thirdline  3 строка, Fourthline 4 строка
      Lcd "    " ; A ; " Ds18b20"
      Lowerline                                   'Upperline  1 строка, Lowerline  2 строка, Thirdline  3 строка, Fourthline 4 строка
      Lcd "Read from the EEPROM"
      Thirdline                                   'Upperline  1 строка, Lowerline  2 строка, Thirdline  3 строка, Fourthline 4 строка
      Lcd "ID ";                                  'Печатаем на LCD, "ID"

      For B = 1 To 8

        Readeeprom Id_ds18b20(b) , Adres_id_ds18b20

          Lcd Hex(id_ds18b20(b))                  'Печатаем на LCD, побайтно, все 8 байт
          Print Hex(id_ds18b20(b)) ;              'Печатаем в терминале, побайтно, все 8 байт

          Select Case Adres_id_ds18b20
            Case 10 To 19 : 1_id_ds18b20(b) = Id_ds18b20(b)
            Case 20 To 29 : 2_id_ds18b20(b) = Id_ds18b20(b)
            Case 30 To 39 : 3_id_ds18b20(b) = Id_ds18b20(b)
            Case 40 To 49 : 4_id_ds18b20(b) = Id_ds18b20(b)
            Case 50 To 59 : 5_id_ds18b20(b) = Id_ds18b20(b)
            Case 60 To 69 : 6_id_ds18b20(b) = Id_ds18b20(b)
            Case 70 To 79 : 7_id_ds18b20(b) = Id_ds18b20(b)
            Case 80 To 89 : 8_id_ds18b20(b) = Id_ds18b20(b)
            Case 90 To 99 : 9_id_ds18b20(b) = Id_ds18b20(b)
            Case 100 To 109 : 10_id_ds18b20(b) = Id_ds18b20(b)
            Case 110 To 119 : 11_id_ds18b20(b) = Id_ds18b20(b)
            Case 120 To 129 : 12_id_ds18b20(b) = Id_ds18b20(b)
            Case 130 To 139 : 13_id_ds18b20(b) = Id_ds18b20(b)
            Case 140 To 149 : 14_id_ds18b20(b) = Id_ds18b20(b)
            Case 150 To 159 : 15_id_ds18b20(b) = Id_ds18b20(b)
            Case 160 To 169 : 16_id_ds18b20(b) = Id_ds18b20(b)
            Case 170 To 179 : 17_id_ds18b20(b) = Id_ds18b20(b)
            Case 180 To 189 : 18_id_ds18b20(b) = Id_ds18b20(b)
            Case 190 To 199 : 19_id_ds18b20(b) = Id_ds18b20(b)
            Case 200 To 209 : 20_id_ds18b20(b) = Id_ds18b20(b)
            Case 210 To 219 : 21_id_ds18b20(b) = Id_ds18b20(b)
            Case 220 To 229 : 22_id_ds18b20(b) = Id_ds18b20(b)
            Case 230 To 239 : 23_id_ds18b20(b) = Id_ds18b20(b)
            Case 240 To 249 : 24_id_ds18b20(b) = Id_ds18b20(b)
            Case 250 To 259 : 25_id_ds18b20(b) = Id_ds18b20(b)
            Case 260 To 269 : 26_id_ds18b20(b) = Id_ds18b20(b)
            Case 270 To 279 : 27_id_ds18b20(b) = Id_ds18b20(b)
            Case 280 To 289 : 28_id_ds18b20(b) = Id_ds18b20(b)
            Case 290 To 299 : 29_id_ds18b20(b) = Id_ds18b20(b)
            Case 300 To 309 : 30_id_ds18b20(b) = Id_ds18b20(b)
            Case 310 To 319 : 31_id_ds18b20(b) = Id_ds18b20(b)
            Case 320 To 329 : 32_id_ds18b20(b) = Id_ds18b20(b)
            Case 330 To 339 : 33_id_ds18b20(b) = Id_ds18b20(b)
            Case 340 To 349 : 34_id_ds18b20(b) = Id_ds18b20(b)
            Case 350 To 359 : 35_id_ds18b20(b) = Id_ds18b20(b)
            Case 360 To 369 : 36_id_ds18b20(b) = Id_ds18b20(b)
            Case 370 To 379 : 37_id_ds18b20(b) = Id_ds18b20(b)
            Case 380 To 389 : 38_id_ds18b20(b) = Id_ds18b20(b)
            Case 390 To 399 : 39_id_ds18b20(b) = Id_ds18b20(b)
            Case 400 To 409 : 40_id_ds18b20(b) = Id_ds18b20(b)
            Case 410 To 419 : 41_id_ds18b20(b) = Id_ds18b20(b)
            Case 420 To 429 : 42_id_ds18b20(b) = Id_ds18b20(b)
            Case 430 To 439 : 43_id_ds18b20(b) = Id_ds18b20(b)
            Case 440 To 449 : 44_id_ds18b20(b) = Id_ds18b20(b)
            Case 450 To 459 : 45_id_ds18b20(b) = Id_ds18b20(b)
            Case 460 To 469 : 46_id_ds18b20(b) = Id_ds18b20(b)
            Case 470 To 479 : 47_id_ds18b20(b) = Id_ds18b20(b)
            Case 480 To 489 : 48_id_ds18b20(b) = Id_ds18b20(b)
            Case 490 To 499 : 49_id_ds18b20(b) = Id_ds18b20(b)
            Case 500 To 509 : 50_id_ds18b20(b) = Id_ds18b20(b)
            Case 510 To 519 : 51_id_ds18b20(b) = Id_ds18b20(b)
            Case 520 To 529 : 52_id_ds18b20(b) = Id_ds18b20(b)
            Case 530 To 539 : 53_id_ds18b20(b) = Id_ds18b20(b)
            Case 540 To 549 : 54_id_ds18b20(b) = Id_ds18b20(b)
            Case 550 To 559 : 55_id_ds18b20(b) = Id_ds18b20(b)
            Case 560 To 569 : 56_id_ds18b20(b) = Id_ds18b20(b)
            Case 570 To 579 : 57_id_ds18b20(b) = Id_ds18b20(b)
            Case 580 To 589 : 58_id_ds18b20(b) = Id_ds18b20(b)
            Case 590 To 599 : 59_id_ds18b20(b) = Id_ds18b20(b)
            Case 600 To 609 : 60_id_ds18b20(b) = Id_ds18b20(b)
            Case Else
          End Select

           Incr Adres_id_ds18b20
         Next B
       Adres_id_ds18b20 = Adres_id_ds18b20 + 2
      Waitms 250                                  'Пауза ~ 500ms

      Print : Print "       READY " : Print       'Переходим в терминале на новую строку
      Fourthline                                  'Upperline  1 строка, Lowerline  2 строка, Thirdline  3 строка, Fourthline 4 строка
      Lcd "       READY "                         'Печатаем на LCD "Сохранено"
        Waitms 250                                'Пауза ~ 500ms
      'Cls
    Next A
'-------------------------------------------------------------------------------
'Выводим на LCD и в тераинал информацию, о завершении чтения из EEPROM c последующей записью в оперативную память контроллера, ID датчиков Ds18b20
'id sensors Ds18b20 EEPROM read from and written to the RAM of the microcontroller
'id датчиков Ds18b20 прочитаны из ЕЕПРОМ и записаны в RАМ микроконтроллера
'-------------------------------------------------------------------------------
    For A = 1 To 5                                'моргаем в цикле, на LCD 3 раза
      Cls                                         'Очищаем LCD
        Waitms 500
          Upperline                               'Upperline  1 строка, Lowerline  2 строка, Thirdline  3 строка, Fourthline 4 строка
          Lcd " ID sensors Ds18b20 "
          Lowerline
          Lcd "EEPROM read from and"
          Thirdline
          Lcd " written to the RAM "
          Fourthline
          Lcd " of the controller! "
      Waitms 750                                  'Пауза ~ 750ms
    Next                                          'Повторить
          Print " ID sensors Ds18b20 "
          Print "EEPROM read from and"
          Print " written to the RAM "
          Print " of the controller! "
       Wait 5
'----------
  End Sub                                         'Выходим из подпрограммы поиска и записи ID DS18B20 в EEPROM контроллера
'-------------------------------------------------------------------------------
'*******************************************************************************
'*******************************************************************************
  Sub Displey_lcd():
'-------------------------------

'-------------------------------
  End Sub
'*******************************************************************************

http://s4.uploads.ru/t/sxvT7.jpg

В архиве все необходимое включая эмуляцию. На P4-800-3Ггц симуляция идет без проблем. В железе проверялось с 20 датчиками, больше не нашел.

Все, что необходимо    --  скачать

+4

3

40 x Ds18b20 + Atmega328P с проверкой в железе

Симуляция (Протеус 7.10) + исходники (Bascom 2.0.7.1) + Log File (работа в железе) - скачать
Измерения проводились в закрытой ёмкости с воздухом

Разброс значений, при одинаковых условиях замера

1 датчик: 25.6250
2 датчик: 25.7500
3 датчик: 25.9375
4 датчик: 25.6250
5 датчик: 25.6250
6 датчик: 25.6250
7 датчик: 25.9375
8 датчик: 25.8750
9 датчик: 25.7500
10 датчик: 25.8125
11 датчик: 25.6250
12 датчик: 25.6875
13 датчик: 25.8750
14 датчик: 25.8125
15 датчик: 25.8125
16 датчик: 25.8750
17 датчик: 25.6875
18 датчик: 25.6875
19 датчик: 25.9375
20 датчик: 26.0625
21 датчик: 25.8125
22 датчик: 25.6875
23 датчик: 25.8750
24 датчик: 26.0000
25 датчик: 26.0000
26 датчик: 25.6250
27 датчик: 25.8750
28 датчик: 25.9375
29 датчик: 25.6875
30 датчик: 25.7500

Min t°C: 25.6250°C
Max t°C: 26.0625°C

http://s6.uploads.ru/t/sQ0au.jpg

+1

4

Ds18b20 на разных выводах МК

6 Ds18b20 на разных выводах МК

Эмуляция (Протеус 7.10 рус.) + исходник (Bascom 2.0.7.1) + программа терминал (Windows7 x32 & x64) - скачать   обновлено 9.03.2015

Работа шести датчиков Ds18b20 проверена в реальном железе.

http://s4.uploads.ru/t/1Jcva.jpg

http://s5.uploads.ru/t/Ojrs1.jpg http://s4.uploads.ru/t/gvK3y.png

http://s5.uploads.ru/t/cyfuP.jpg http://s4.uploads.ru/t/X8mj9.jpg

+1

5

Исследование работы 8 датчиков Ds18b20, поиск ID, запись в EEPROM MK

Описаны, но не используются: "Программирование датчика ds18b20", "Запись_в_пзу_ds18b20"

Так, как присутствует работа с EEPROM, для полноценной эмуляции не забудьте скинуть сохранение в протеусе: ( верхнее меню => отладка => сброс постоянных данных модели ).

В железе проверено. 6 мес работает у человека. Так, как не планировалось выкладывать, фоток не делал.

http://s5.uploads.ru/t/EDnb1.jpg

Исходник

'*******************************************************************************
'************************* ATMEGA32 и DS18B20 ********************************
'*******************************************************************************

' Контроллер: ATMEGA32A или любой другой "AVR" с небольшими переделками исходника
' Версия компилятора: BASCOM-AVR 2.0.7.1
' Автор: sasha_1973

'*******************************************************************************
'-------------------- Конфигурация программы и контроллера ---------------------
$regfile = "m32def.dat" : $crystal = 8000000 : $framesize = 120 : $hwstack = 120 : $swstack = 120 : $baud = 9600
'-------------------------------------------------------------------------------
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.1 , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5
Config Lcd = 20 * 4 : Cursor Off Noblink : Cls
'-------------------------------------------------------------------------------
'Upperline  1 строка, Lowerline  2 строка, Thirdline  3 строка, Fourthline 4 строка
'-------------------------------------------------------------------------------
'------------------- Конфигурация выхода для светодиодика ----------------------
'-------------------------------------------------------------------------------
Config Portc.7 = Output : Led_norma Alias Portc.7
'-------------------------------------------------------------------------------
'---------------------- Конфигурация подключенной кнопки -----------------------
Config Portd.7 = Input : Кнопка Alias Pind.7 : Set Кнопка
'-------------------------------------------------------------------------------
'-------------------------- Дополнительные_символы------------------------------
'-------------------------------------------------------------------------------
Deflcdchar 1 , 12 , 18 , 18 , 12 , 32 , 32 , 32 , 32       'значек градуса
Deflcdchar 5 , 14 , 10 , 10 , 10 , 14 , 31 , 31 , 14       'термометр
'  Deflcdchar 6 , 4 , 5 , 15 , 20 , 4 , 14 , 10 , 27           'человечек
'  Deflcdchar 7 , 232 , 244 , 232 , 227 , 228 , 228 , 227 , 224       'градус Цельсия
'  Deflcdchar 8 , 2 , 6 , 30 , 30 , 30 , 6 , 2 , 32            'динамик
'  Deflcdchar 9 , 32 , 25 , 11 , 4 , 26 , 19 , 32 , 32        'значек вентилятора
'  Deflcdchar 10 , 9 , 26 , 28 , 27 , 28 , 26 , 9 , 32         'пищалка или пъезик
'  Deflcdchar 1 , 31 , 27 , 19 , 27 , 27 , 17 , 31 , 31       'инверсная 1
'  Deflcdchar 2 , 31 , 17 , 29 , 27 , 23 , 17 , 31 , 31       'инверсная 2
'  Deflcdchar 3 , 31 , 17 , 29 , 27 , 29 , 17 , 31 , 31       'инверсная 3
'  Deflcdchar 4 , 31 , 21 , 21 , 17 , 29 , 29 , 31 , 31       'инверсная 4
'  Deflcdchar 5 , 31 , 17 , 23 , 17 , 29 , 17 , 31 , 31       'инверсная 5
'  Deflcdchar 6 , 31 , 17 , 23 , 17 , 21 , 17 , 31 , 31       'инверсная 6
'  Deflcdchar 7 , 31 , 17 , 29 , 27 , 23 , 23 , 31 , 31       'инверсная 7
'  Deflcdchar 8 , 31 , 17 , 21 , 17 , 21 , 17 , 31 , 31       'инверсная 8
'  Deflcdchar 9 , 31 , 17 , 21 , 17 , 29 , 17 , 31 , 31       'инверсная 9
'  Deflcdchar 0 , 31 , 17 , 21 , 21 , 21 , 17 , 31 , 31       'инверсная 0
'-------------------------------------------------------------------------------
'----------------------- Конфигурация DS18B20 ----------------------------------
'-------------------------------------------------------------------------------
Config 1wire = Portb.4 : Ds18b20 Alias Pinb.4
'-------------------------------------------------------------------------------
Dim Id_ds18b20(8) As Byte       'Переменная для временного хранения считанного ID Ds18b20
Dim 1_vklyuchenie As Byte
Dim Adres_id_ds18b20 As Word       'Переменная для хранения адреса считанного ID Ds18b20 в EEPROM контроллера
Dim Opros_ds18b20(8) As Byte
Dim Kolichestvo_ds18b20 As Word       'Word/Integer переменная для посчета количества датчиков на линии
Dim Number_saved_ds18b20 As Byte
Dim Temperatura_lcd As String * 8
Dim Flag_gotovnosti_temperatury As Bit
Dim Buffer_lcd_temperatura As String * 5
Dim T As Single , T0 As Single , T1 As Single       'Переменные для преобразования температуры
Dim Byte0 As Byte , Byte1 As Byte , T_celye As Byte , T_desyatye As Byte       'Переменные для преобразования температуры
Dim Zaderzhka_50_ms As Byte , Zaderzhka_100_ms As Byte , Zaderzhka_1000_ms As Word       'Постоянная переменная для хранения значений TIMER0
Dim Znak_temperatura As String * 2 , T_celye_lcd As String * 4 , T_desyatye_lcd As String * 2       'Temperatura As String * 10       'Переменные для преобразования температуры
Dim Zaderzhka As Word , Zaderzhka_1_ms As Byte , Zaderzhka_5_ms As Byte , Zaderzhka_10_ms As Byte       'Постоянная переменная для хранения значений TIMER0
'-------------------------------------------------------------------------------
Dim 1_id_ds18b20(8) As Byte , 2_id_ds18b20(8) As Byte       'Постоянная переменная для хранения считанного ID Ds18b20
Dim 3_id_ds18b20(8) As Byte , 4_id_ds18b20(8) As Byte       'Постоянная переменная для хранения считанного ID Ds18b20
Dim 5_id_ds18b20(8) As Byte , 6_id_ds18b20(8) As Byte       'Постоянная переменная для хранения считанного ID Ds18b20
Dim 7_id_ds18b20(8) As Byte , 8_id_ds18b20(8) As Byte       'Постоянная переменная для хранения считанного ID Ds18b20
'-------------------------------------------------------------------------------
Dim A As Byte , B As Byte , C As Byte , D As Byte , E As Byte , X As Byte , Y As Byte       'Постоянная переменная для хранения координат вывода сообщения на LCD
'-------------------------------------------------------------------------------
Declare Sub Bip_bip()
Declare Sub Displey_lcd()
Declare Sub Temperature()
Declare Sub Error_ds18b20()
Declare Sub Opros_id_ds18b20()
Declare Sub Poisk_id_ds18b20()
Declare Sub Init_temperatura()
Declare Sub Sensor_not_found()
Declare Sub Pervoe_vklyuchenie()
Declare Sub Запись_в_пзу_ds18b20()
Declare Sub Идентификация_ds18b20()
Declare Sub Save_eeprom_id_ds18b20()
Declare Sub Reading_eeprom_id_ds18b20()
Declare Sub Zapros_izmereniya_ds18b20()
Declare Sub Preobrazovanie_temperature()
Declare Function Zapros_kolichestva_ds18b20() As Integer       'Функция запроса количества датчиков Ds18b20 на линии
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'------------ Предварительный поиск и программирование ПЗУ Ds18b20 -------------
'-------------------------------------------------------------------------------
'  Call Poisk_id_ds18b20
'  Call Запись_в_пзу_ds18b20
'  Rcall Zapros_izmereniya_ds18b20
'-------------------------------------------------------------------------------
  Readeeprom 1_vklyuchenie , 1 : If 1_vklyuchenie <> 50 Then Rcall Pervoe_vklyuchenie
'-------------
  Readeeprom Number_saved_ds18b20 , 5 : Kolichestvo_ds18b20 = Number_saved_ds18b20
'--------------------------------------
  rcall Reading_eeprom_id_ds18b20

  rcall Init_temperatura
'*******************************************************************************
'*******************************************************************************
'*******************************************************************************
'*******************************************************************************
'*******************************************************************************
   Do
'---------
    Toggle Led_norma

    rcall Zapros_izmereniya_ds18b20

    rcall Opros_id_ds18b20

'    If Flag_gotovnosti_temperatury = 1 Then Rcall Displey_lcd

'---------
   Loop
  End
'-------------------------------------------------------------------------------
'*******************************************************************************
'*******************************************************************************
'*******************************************************************************
'*******************************************************************************
'*******************************************************************************
'-------------------------------------------------------------------------------
  Zapros_izmereniya_ds18b20:       'запускаем опрос всех датчиков
'-------------------------
    1wreset
    1wwrite &HCC       ' Выдаем команду чтения ПЗУ
    1wwrite &H44       ' Запуск измерения
'  Bitwait Ds18b20 , Set                                     'Ждем сигнала датчика об окончании преобразования
   Waitms 250       'Ждем окончания преобразования
'--------
  Return
'-------------------------------------------------------------------------------
'*******************************************************************************

'*******************************************************************************
'-------------------------------------------------------------------------------
  Sub Opros_id_ds18b20       'Подпрограмма опроса Ds18b20
'-------------------------------
    X = 1 : Y = 1 : 1wreset : 1wverify 1_id_ds18b20(1)       '1 ds18b20 выводим на первой(Х=1) строчке дисплея
    If Err = 0 Then
      Rcall Preobrazovanie_temperature
    Else
      Error_ds18b20
    End If
'-------------------------------
    X = 2 : Y = 1 : 1wreset : 1wverify 2_id_ds18b20(1)       '2 ds18b20 выводим на первой(Х=1) строчке дисплея
    If Err = 0 Then
      Rcall Preobrazovanie_temperature
    Else
      Error_ds18b20
    End If
'-------------------------------
    X = 3 : Y = 1 : 1wreset : 1wverify 3_id_ds18b20(1)       '3 ds18b20 выводим на первой(Х=1) строчке дисплея
    If Err = 0 Then
      Rcall Preobrazovanie_temperature
    Else
      Error_ds18b20
    End If
'-------------------------------
    X = 4 : Y = 1 : 1wreset : 1wverify 4_id_ds18b20(1)       '4 ds18b20 выводим на первой(Х=1) строчке дисплея
    If Err = 0 Then
      Rcall Preobrazovanie_temperature
    Else
      Error_ds18b20
    End If
'-------------------------------
    X = 1 : Y = 12 : 1wreset : 1wverify 5_id_ds18b20(1)       '5 ds18b20 выводим на первой(Х=1) строчке дисплея
    If Err = 0 Then
      Rcall Preobrazovanie_temperature
    Else
      Error_ds18b20
    End If
'-------------------------------
    X = 2 : Y = 12 : 1wreset : 1wverify 6_id_ds18b20(1)       '6 ds18b20 выводим на первой(Х=1) строчке дисплея
    If Err = 0 Then
      Rcall Preobrazovanie_temperature
    Else
      Error_ds18b20
    End If
'-------------------------------
    X = 3 : Y = 12 : 1wreset : 1wverify 7_id_ds18b20(1)       '7 ds18b20 выводим на первой(Х=1) строчке дисплея
    If Err = 0 Then
      Rcall Preobrazovanie_temperature
    Else
      Error_ds18b20
    End If
'-------------------------------
    X = 4 : Y = 12 : 1wreset : 1wverify 8_id_ds18b20(1)       '8 ds18b20 выводим на первой(Х=1) строчке дисплея
    If Err = 0 Then
      Rcall Preobrazovanie_temperature
    Else
      Error_ds18b20
    End If
'-------------------------------
  End Sub       'Выходим из подпрограммы опроса Ds18b20
'-------------------------------------------------------------------------------
'*******************************************************************************

'*******************************************************************************
'-------------------------------------------------------------------------------
  Sub Preobrazovanie_temperature:       'Подпрограмма считывания температуры
'--------------------------------
    1wwrite &HBE       'Запрос на чтение памяти

    Byte0 = 1wread()       'Читаем нулевой байт
    Byte1 = 1wread()       'Читаем первый байт

  If Byte1 > 248 Then       'Проверка на отрицательность температуры
    Byte0 = &H101 - Byte0
    Byte1 = &HFF - Byte1

    Znak_temperatura = "-"       'Знак "-"
  Else
    Znak_temperatura = " "       'Вместо знака "+", ставим пробел
  End If

    T0 = Byte0 * 0.0625       ' Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16)

    T1 = Byte1 * 16       ' Сдвигаем первый байт влево на 4 бита (2*2*2*2=16)

    T0 = T0 + T1       ' Формируем результат для вывода на дисплей

    T_celye = T0       'Убираем дробну часть(все после запятой)

    T_celye_lcd = Str(t_celye)       'Делаем строковую переменную, для форматирования вывода на LCD

    T_celye_lcd = Format(t_celye_lcd , " 0")       'Форматирование вывода на LCD

    T0 = T0 - T_celye       'Убираем все до запятой

    T0 = T0 * 10       'Делаем десятые градуса

    T_desyatye = T0       'Убираем дробну часть(все после запятой)

    T_desyatye_lcd = Str(t_desyatye)

    If T_celye > 99 Then Znak_temperatura = ""       'Если больше 99 градусов, сдвигаем в лево на 1 знак(для выравнивания показаний)
'--------------------------------

    Temperatura_lcd = Chr(5) + " " + Znak_temperatura + T_celye_lcd + "." + T_desyatye_lcd + Chr(1) + "C"
   rcall Displey_lcd
  End Sub
'-------------------------------------------------------------------------------
'*******************************************************************************

'*******************************************************************************
'-------------------------------------------------------------------------------
  Sub Displey_lcd:
'-----------------
    Locate X , Y : Lcd Temperatura_lcd
'---------
End Sub
'-------------------------------------------------------------------------------
'*******************************************************************************

'*******************************************************************************
'-------------------------------------------------------------------------------
  Error_ds18b20:
'-------------------------------
'    For A = 1 To
     Locate X , Y : Lcd Chr(5) ; "        "
      Waitms 100
       Locate X , Y : Lcd Chr(5) ; "  Error "
'      Waitms 250
'     Next
'-------------------------------
  Return
'-------------------------------------------------------------------------------
'*******************************************************************************

'*******************************************************************************
'-------------------------------------------------------------------------------
  Sensor_not_found:
'-------------------------------
     For A = 1 To 3
       Locate X , Y : Lcd "                    "
         Waitms 500
           Locate X , Y : Lcd " " ; D ; " Sensor not found "
         Waitms 500
     Next A
'-------------------------------
  Return
'-------------------------------------------------------------------------------
'*******************************************************************************

'*******************************************************************************
'-------------------------------------------------------------------------------
  Init_temperatura:
'------------------
     E = 0 : X = 1 : Y = 1
     1wreset : 1wverify 1_id_ds18b20(1)       ' Сброс линии  ' Обращаемся именно к этому датчику
   If Err = 0 Then
     E = E + 1
     Locate X , Y : Lcd " 1 Sensor CRC Ok "
   Else
     D = 1
     Sensor_not_found
   End If
'---------------------------------------------------
     X = 2 : Y = 1
     1wreset : 1wverify 2_id_ds18b20(1)       ' Сброс линии  ' Обращаемся именно к этому датчику
   If Err = 0 Then
     E = E + 1
     Locate X , Y : Lcd " 2 Sensor CRC Ok "
   Else
     D = 2
     Sensor_not_found
   End If
'---------------------------------------------------
     X = 3 : Y = 1
     1wreset : 1wverify 3_id_ds18b20(1)       ' Сброс линии  ' Обращаемся именно к этому датчику
   If Err = 0 Then
     E = E + 1
     Locate X , Y : Lcd " 3 Sensor CRC Ok "
   Else
     D = 3
     Sensor_not_found
   End If
'---------------------------------------------------
     X = 4 : Y = 1
     1wreset : 1wverify 4_id_ds18b20(1)       ' Сброс линии  ' Обращаемся именно к этому датчику
   If Err = 0 Then
     E = E + 1
     Locate X , Y : Lcd " 4 Sensor CRC Ok "
   Else
     D = 4
     Sensor_not_found
   End If
'---------------------------------------------------
   rcall Bip_bip : rcall Bip_bip : Wait 1 : Cls
'---------------------------------------------------
     X = 1 : Y = 1
     1wreset : 1wverify 5_id_ds18b20(1)       ' Сброс линии  ' Обращаемся именно к этому датчику
   If Err = 0 Then
     E = E + 1
     Locate X , Y : Lcd " 5 Sensor CRC Ok "
   Else
     D = 5
     Sensor_not_found
   End If
'---------------------------------------------------
     X = 2 : Y = 1
     1wreset : 1wverify 6_id_ds18b20(1)       ' Сброс линии  ' Обращаемся именно к этому датчику
   If Err = 0 Then
     E = E + 1
     Locate X , Y : Lcd " 6 Sensor CRC Ok "
   Else
     D = 6
     Sensor_not_found
   End If
'---------------------------------------------------
    X = 3 : Y = 1
     1wreset : 1wverify 7_id_ds18b20(1)       ' Сброс линии  ' Обращаемся именно к этому датчику
   If Err = 0 Then
     E = E + 1
     Locate X , Y : Lcd " 7 Sensor CRC Ok "
   Else
     D = 7
     Sensor_not_found
   End If
'---------------------------------------------------
     X = 4 : Y = 1
     1wreset : 1wverify 8_id_ds18b20(1)       ' Сброс линии  ' Обращаемся именно к этому датчику
   If Err = 0 Then
     E = E + 1
     Locate X , Y : Lcd " 8 Sensor CRC Ok "
   Else
     D = 8
     Sensor_not_found
   End If
'---------------------------------------------------

   rcall Bip_bip : rcall Bip_bip : Wait 1 : cls

'---------------------------------------------------
   1wreset       ' Сброс линии
   1wwrite &HCC       ' Обращение к всем датчикам на линии
   1wwrite &H44       ' Запуск холостого измерения
'---------------------------------------------------
If E = Kolichestvo_ds18b20 Then
   Upperline : Lcd "   All registered   "       'Upperline  1 строка, Lowerline  2 строка, Thirdline  3 строка, Fourthline 4 строка
   Lowerline : Lcd "  sensors  Ds18b20  "       'Upperline  1 строка, Lowerline  2 строка, Thirdline  3 строка, Fourthline 4 строка
   Thirdline : Lcd "       found        "       'Upperline  1 строка, Lowerline  2 строка, Thirdline  3 строка, Fourthline 4 строка
Else
   Upperline : Lcd "         " ; E ; "         "       'Upperline  1 строка, Lowerline  2 строка, Thirdline  3 строка, Fourthline 4 строка
   Lowerline : Lcd "  sensors  Ds18b20  "       'Upperline  1 строка, Lowerline  2 строка, Thirdline  3 строка, Fourthline 4 строка
   Thirdline : Lcd "       found        "       'Upperline  1 строка, Lowerline  2 строка, Thirdline  3 строка, Fourthline 4 строка
End If
'---------------------------------------------------
   rcall Bip_bip : rcall Bip_bip : rcall Bip_bip : rcall Bip_bip : rcall Bip_bip : rcall Bip_bip
   Waitms 500
   rcall Bip_bip : rcall Bip_bip : rcall Bip_bip : rcall Bip_bip : rcall Bip_bip : rcall Bip_bip
   Waitms 500
   rcall Bip_bip : rcall Bip_bip : rcall Bip_bip : rcall Bip_bip : rcall Bip_bip : rcall Bip_bip
'---------------
  Wait 3 : Cls
'---------------
  Return
'-------------------------------------------------------------------------------
'*******************************************************************************

'*******************************************************************************
'********* Подпрограмма поиска и записи ID DS18B20 в EEPROM контроллера ********
'*******************************************************************************
'-------------------------------------------------------------------------------
  Sub Save_eeprom_id_ds18b20       'Подпрограмма поиска и записи ID DS18B20 в EEPROM контроллера
'----------------------------
'========= Первый датчик ==========
  Id_ds18b20(1) = 1wsearchfirst()       'Посылаем запрос и получаем ответ в виде 8-ми байтного адреса первому датчику
'==================================
    Adres_id_ds18b20 = 10       'Начинаем с 10 адреса (просто для удобства (первый датчик - 10 адрес, второй датчик - 20 адрес и т.д. ))
      For B = 1 To 8       'Работаем с 8 байтами первого, считанного ID DS18B20
        Writeeeprom Id_ds18b20(b) , Adres_id_ds18b20       'Записываем в установленную ранее ячейку памяти контроллера
          Waitms 5       'Пауза ~ 5ms
        Incr Adres_id_ds18b20       'Увеличиваем адрес на 1
      Next B       'Повторяем для всего значения считанного ID  первого датчика

    rcall Идентификация_ds18b20

'------- Следующие  датчики --------
  For A = 2 To Kolichestvo_ds18b20
'===================================
    Id_ds18b20(1) = 1wsearchnext()       'Посылаем запрос и получаем ответ в виде 8-ми байтного адреса следующему датчику
'===================================
      Adres_id_ds18b20 = Adres_id_ds18b20 + 2       'Увеличиваем адрес на 2, что-бы получить следующий, целый десяток(для удобства)
        For B = 1 To 8       'Работаем с 8 байтами следующего, считанного ID DS18B20
          Writeeeprom Id_ds18b20(b) , Adres_id_ds18b20       'Записываем в установленную ранее ячейку памяти контроллера
            Waitms 5       'Пауза ~ 5ms
          Incr Adres_id_ds18b20       'Увеличиваем адрес на 1
        Next B       'Повторяем для всего значения считанного ID следующего датчика

    rcall Идентификация_ds18b20

      Next A       'Переходим к поиску следующего датчика
     A = A - 1
    Number_saved_ds18b20 = A
   Writeeeprom Number_saved_ds18b20 , 5

  rcall Bip_bip
'----------
  End Sub       'Выходим из подпрограммы поиска и записи ID DS18B20 в EEPROM контроллера
'-------------------------------------------------------------------------------
'*******************************************************************************

'*******************************************************************************
'-------------------------------------------------------------------------------
Function Zapros_kolichestva_ds18b20() As Integer
'---------------------------------------------------
' Local A As Byte
'-----------------
    For A = 1 To 5       'моргаем в цикле, на LCD 3 раза
      Cls       'Очищаем LCD
        Waitms 250
'=============================================
          Kolichestvo_ds18b20 = 1wirecount()       'Запрос количества датчиков Ds18b20 на линии
'=============================================
        Locate 1 , 1 : Lcd "    It is found     "       'Печатаем на LCD "Найдено"
        Locate 2 , 1 : Lcd " " ; Kolichestvo_ds18b20 ; " sensors DS18B20"       'Печатаем на экране количество датчиков на линии
      Waitms 500       'Пауза ~ 750ms
    Next       'Повторить
      Wait 1       'Пауза ~ 2s
      Print Kolichestvo_ds18b20 ;       'Печатаем в терминале количество датчиков Ds18b20 на линии
    Print : Cls

  rcall Bip_bip
'---------------
  End Function
'-------------------------------------------------------------------------------
'*******************************************************************************

'*******************************************************************************
  Sub Pervoe_vklyuchenie:
'-------------------------------
    rcall Zapros_kolichestva_ds18b20

    rcall Save_eeprom_id_ds18b20

    For B = 1 To 3
      Cls
        Waitms 500
          Locate 1 , 1 : Lcd "         " ; A
          Locate 2 , 1 : Lcd " ID Sensors Ds18b20 "
          Locate 3 , 1 : Lcd "       saved        "
        Waitms 500
    Next B

  Waitms 1000

    rcall Reading_eeprom_id_ds18b20 : rcall Bip_bip

    For B = 1 To 3
      Cls
        Waitms 500
          Locate 1 , 1 : Lcd "         " ; A
          Locate 2 , 1 : Lcd " ID Sensors Ds18b20 "
          Locate 3 , 1 : Lcd "        Read        "
        Waitms 500
    Next B

  Waitms 1000
    1_vklyuchenie = 50
      Writeeeprom 1_vklyuchenie , 1
        Waitms 10

   rcall Bip_bip : Cls
'----------
  End Sub
'*******************************************************************************

'*******************************************************************************
'********* Подпрограмма чтения ID DS18B20 из EEPROM контроллера ****************
'*******************************************************************************
'-------------------------------------------------------------------------------
  Sub Reading_eeprom_id_ds18b20
'-------------------------------
'  Local A As Byte , B As Byte
'-------------------------------
  Adres_id_ds18b20 = 10
'-----------------------
    For A = 1 To Kolichestvo_ds18b20       'Kolichestvo_ds18b20
      For B = 1 To 8
        Readeeprom Id_ds18b20(b) , Adres_id_ds18b20
          Select Case Adres_id_ds18b20
            Case 10 To 19 : 1_id_ds18b20(b) = Id_ds18b20(b)
            Case 20 To 29 : 2_id_ds18b20(b) = Id_ds18b20(b)
            Case 30 To 39 : 3_id_ds18b20(b) = Id_ds18b20(b)
            Case 40 To 49 : 4_id_ds18b20(b) = Id_ds18b20(b)
            Case 50 To 59 : 5_id_ds18b20(b) = Id_ds18b20(b)
            Case 60 To 69 : 6_id_ds18b20(b) = Id_ds18b20(b)
            Case 70 To 79 : 7_id_ds18b20(b) = Id_ds18b20(b)
            Case 80 To 89 : 8_id_ds18b20(b) = Id_ds18b20(b)
            Case Else
          End Select
        Adres_id_ds18b20 = Adres_id_ds18b20 + 1
      Next B
     Adres_id_ds18b20 = Adres_id_ds18b20 + 2
    Next A
   A = A - 1
'----------
  End Sub       'Выходим из подпрограммы поиска и записи ID DS18B20 в EEPROM контроллера
'-------------------------------------------------------------------------------
'*******************************************************************************

'*******************************************************************************
'------------------- Подпрограмма прерывания от TIMER0 -------------------------
'-------------------------------------------------------------------------------
  Pauza:
'-------
    Zaderzhka = Zaderzhka + 1       ': If Zaderzhka = 4 Then Zaderzhka = 0
'    Zaderzhka_1_ms = Zaderzhka + 1 : If Zaderzhka = 4 Then Zaderzhka = 0
'    Zaderzhka_5_ms = Zaderzhka_1_ms + 1 : If Zaderzhka_5_ms = 20 Then Zaderzhka_5_ms = 0
'    Zaderzhka_10_ms = Zaderzhka_5_ms + 1 : If Zaderzhka_10_ms = 40 Then Zaderzhka_5_ms = 0
'    Zaderzhka_50_ms = Zaderzhka_10_ms + 1 : If Zaderzhka_50_ms = 200 Then Zaderzhka_50_ms = 0
'    Zaderzhka_100_ms = Zaderzhka_50_ms + 1 : If Zaderzhka_100_ms = 4 Then Zaderzhka_100_ms = 0 : Rcall Opros_id_ds18b20
'    Zaderzhka_1000_ms = Zaderzhka_100_ms + 1 : If Zaderzhka_1000_ms = 4 Then Zaderzhka_1000_ms = 0 : Rcall Zapros_izmereniya_ds18b20

      Select Case Zaderzhka       'Zaderzhka = 1=250мкс; 250*4=1mc
       Case Is = 4 : Rcall Zapros_izmereniya_ds18b20
       'Case Is = 40 : Rcall Displey_lcd                     'Обновляем показания на LCD? с интервалом 10 ms
       Case Is = 3000 : Rcall Opros_id_ds18b20       'Переходим на подпрограмму подачи запросов в датчики температуры
       Case Is = 3001 :
            Toggle Led_norma
                   Zaderzhka = 0
       Case Else
      End Select
'-------
  Return
'-------------------------------------------------------------------------------
'*******************************************************************************

'*******************************************************************************
'-------------------------------------------------------------------------------
   Bip_bip:
'----------
  Sound Portd.6 , 100 , 500       'BEEP
   'Sound Portc.7 , 400 , 450                                'BEEP
'----------
  Return
'-------------------------------------------------------------------------------
'*******************************************************************************

'*******************************************************************************
'-------------------------------------------------------------------------------
  Идентификация_ds18b20:
'-----------------------
    Upperline : Lcd "      Nazhmite      "       'Upperline  1 строка, Lowerline  2 строка, Thirdline  3 строка, Fourthline 4 строка
    Lowerline : Lcd "       knopku       "       'Upperline  1 строка, Lowerline  2 строка, Thirdline  3 строка, Fourthline 4 строка

    Bitwait Кнопка , Reset

    Waitms 50
'----------
  Return
'-------------------------------------------------------------------------------
'*******************************************************************************

'###############################################################################
'###############################################################################
'###############################################################################

'*******************************************************************************
  Sub Poisk_id_ds18b20:
'-------------------------------
   1_id_ds18b20(1) = 1wsearchfirst()
'   For A = 1 To 8
'     Id_ds18b20(a) = 1_id_ds18b20(a)
'   Next A
'     rcall Запись_в_пзу_ds18b20
'--------------------------------------
   2_id_ds18b20(1) = 1wsearchnext()
'   For A = 1 To 8
'     Id_ds18b20(a) = 2_id_ds18b20(a)
'   Next A
'   rcall Запись_в_пзу_ds18b20
'--------------------------------------
   3_id_ds18b20(1) = 1wsearchnext()
'   For A = 1 To 8
'     Id_ds18b20(a) = 3_id_ds18b20(a)
'   Next A
'   rcall Запись_в_пзу_ds18b20
'--------------------------------------
   4_id_ds18b20(1) = 1wsearchnext()
'   For A = 1 To 8
'     Id_ds18b20(a) = 4_id_ds18b20(a)
'   Next A
'   rcall Запись_в_пзу_ds18b20
'--------------------------------------
   5_id_ds18b20(1) = 1wsearchnext()
'   For A = 1 To 8
'     Id_ds18b20(a) = 5_id_ds18b20(a)
'   Next A
'   rcall Запись_в_пзу_ds18b20
'--------------------------------------
   6_id_ds18b20(1) = 1wsearchnext()
'   For A = 1 To 8
'     Id_ds18b20(a) = 6_id_ds18b20(a)
'   Next A
'   rcall Запись_в_пзу_ds18b20
'--------------------------------------
   7_id_ds18b20(1) = 1wsearchnext()
'   For A = 1 To 8
'     Id_ds18b20(a) = 7_id_ds18b20(a)
'   Next A
'   rcall Запись_в_пзу_ds18b20
'--------------------------------------
   8_id_ds18b20(1) = 1wsearchnext()
'   For A = 1 To 8
'     Id_ds18b20(a) = 8_id_ds18b20(a)
'   Next A
'   rcall Запись_в_пзу_ds18b20
'----------
  End Sub
'*******************************************************************************



'   все зарегистрированные датчики найдены - all registered sensors found

'   Не Соответствует - Does Not Match

'   Не Найден - Not Found

'   Тест Пройден - Test Passed

'   Тест Не Пройден - test Fails

'   Инициализация - Initialization

'**************************************************************************************************
'*                              Программирование датчика ds18b20                                  *
'* Запись разрядности (7F - 12 бит, 5F - 11 бит , 3F - 10 бит , 1F - 9 бит) в ПЗУ датчика Ds18b20 *
'*                         Запись значений Alarm search в ПЗУ Ds18b20                             *
'**************************************************************************************************
'===============================================================================
'====================== Запись значений в ПЗУ Ds18b20 ==========================
'===============================================================================
'    1wreset                                                 ' Сброс линии
'    1wverify 1_id_ds18b20(1)                                ' Обращаемся именно к этому датчику
'   ==============
'    1wwrite &H4E                                            ' Команда записи данных в ОЗУ датчика
'   ==============
'    1wwrite &H78                                            ' Максимальная температура (для сигнала аварии  "120°C")
'    1wwrite &HCE                                            ' Минимальная температура (для сигнала аварии "-50°C")
'    1wwrite &H7F                                            ' Устанавливаем разрешающую способность (7F - 12 бит, 5F - 11 бит , 3F - 10 бит , 1F - 9 бит)
'   ==============
'    1wverify 1_id_ds18b20(1)                                ' Обращаемся именно к этому датчику
'    1wwrite &H48                                            ' Команда записи данных из ОЗУ в ПЗУ датчика, для последующего использования
'    1wreset                                                 ' Сброс линии
'   ==============
'     Waitms 20
'===============================================================================
'**************************************************************************************************
'**************************************************************************************************

'**************************************************************************************************
'*******************************************************************************
'  Sub Запись_в_пзу_ds18b20:
'-------------------------------
'===============================================================================
'====================== Запись значений в ПЗУ Ds18b20 ==========================
'===============================================================================
'    1wreset                                                 ' Сброс линии
'    1wverify Id_ds18b20(1)                                  ' Обращаемся именно к этому датчику
  '==============
'    1wwrite &H4E                                            ' Команда записи данных в ОЗУ датчика
  '==============
'    1wwrite &H78                                            ' Максимальная температура (для сигнала аварии  "120°C")
'    1wwrite &HCE                                            ' Минимальная температура (для сигнала аварии "-50°C")
'    1wwrite &H7F                                            ' Устанавливаем разрешающую способность (7F - 12 бит, 5F - 11 бит , 3F - 10 бит , 1F - 9 бит)
  '==============
'    1wverify Id_ds18b20(1)                                  ' Обращаемся именно к этому датчику
'    1wwrite &H48                                            ' Команда записи данных из ОЗУ в ПЗУ датчика, для последующего использования
'    1wreset                                                 ' Сброс линии
  '==============
'     Waitms 20
'===============================================================================
'----------
'  End Sub
'*******************************************************************************
'**************************************************************************************************
'   1wreset                                                  ' Сброс линии
'   1wwrite &HCC                                             ' Обращение к датчику на линии
'   1wwrite &H4E                                             ' Команда записи данных в датчик
'   1wwrite &H78                                             ' Максимальная температура (для сигнала аварии)
'   1wwrite &HCE                                             ' Минимальная температура (для сигнала аварии)
'   1wwrite &H7F                                             ' Устанавливаем разрешающую способность (7F - 12 бит, 5F - 11 бит , 3F - 10 бит , 1F - 9 бит)
'   1wwrite &H48                                             ' Запись в ОЗУ Ds18b20

Всё, что необходимо для эмуляции      скачать

+1

6

Ещё вариант.

Скачать   обновлено  9.03.2015

http://s5.uploads.ru/t/IGp6a.jpg

0

7

Как выяснилось!!!

В протеусе версии 7.7, глючат датчики DS18B20 !!!

0

8

Atmega328P-DIP28=18.432 Мгц + 20 шт. Ds18b20 + TIMER0=0.5 ms (7-seg LED индикация) + USART=230400 . Проверено в железе с скоростю USART 230400, Протеус работает с скоростью 57600.

Эмуляция в Протеус - скачать

http://s4.uploads.ru/t/JMjfP.jpg

0

9

Attiny2313A + Ds18b20

Симуляция (Proteus 7.10) + исходник (Bascom 2.0.7.1) - скачать

http://s7.uploads.ru/t/9gBhR.jpg

+2

10

Attiny45A_85A + 4 x Ds18b20 + USART + короткий вариант работы с Ds18b20

Симуляция (Proteus 7.10) + исходник (Bascom 2.0.7.1) - скачать

http://se.uploads.ru/t/o9Lr0.jpg

+2

11

Attiny85A + 4 x Ds18 S 20 + USART

Симуляция (Proteus 7.10) + исходник (Bascom 2.0.7.1) - скачать

http://se.uploads.ru/t/M8yLC.jpg

+2

12

Attiny85A + 4 x Ds18_S_20 + 4 x Ds18_B_20 + USART

Симуляция (Proteus 7.10) + исходник (Bascom 2.0.7.1) - скачать

http://se.uploads.ru/t/Ugblf.jpg http://se.uploads.ru/t/hnRKN.jpg

+1

13

Atmega328P + 4 x Ds18_S_20 + 4 x Ds18_B_20 + 4 x 7-seg LED

Симуляция (Proteus 7.10) + исходник (Bascom 2.0.7.1) - скачать

http://se.uploads.ru/t/nefFh.jpg http://se.uploads.ru/t/Lm0xH.jpg

+2

14

Варант работы с Ds18b20 через USART, так сказать аппаратная реализация шины 1Wire.

В качестве помехи работе шины 1Wire, запущены 2 таймера с делителем = 1

Всё работает чётко и без глюков

Симуляция + исходник  --  скачать

Дебаггер для Протеуса можно скачать  --  здесь   , ОГРОМНОЕ СПАСИБО Петру за выложенную модель.

Таблица семейств 1wire  --  здесь

Документация производителя по этому вопросу  --  здесь  , как ни странно, датируется 2002 годом.

http://sa.uploads.ru/t/WRAJq.jpg http://sa.uploads.ru/t/EXJtA.jpg

+4

15

Убрано всё лишнее!

2 Ds18b20 на разных выводах МК

Симуляция (Протеус 7.10) + исходник (Bascom 2.0.7.1) - скачать

http://se.uploads.ru/t/6D8Ie.jpg

+2

16

Изменение настроек в ОЗУ Ds18b20 и последующей записью в ПЗУ

Симуляция (Протеус 7.10) + исходник (Bascom 2.0.7.1)  -  скачать

http://s6.uploads.ru/t/xNMg9.jpg

+2

17

Продолжение этого

Из-за использование большого количества прерываний, совсем порушилась работа Ds18b20. Точнее работает, но много ошибок, не кошерно смотрится.

Реализована адресная работа с шиной 1Wire с помощью USART, можно сказать, аппаратная реализация.

Пока осилил поиск только 3 датчика. Предполагаемое количество выставляется здесь "Const Max_amount_device = 3 "

Реализованы стандартные функции:
Reset 1Wire
Read byte
Write byte
Поиск id

Симуляция (Протеус 7.10) + исходник (Bascom 2.0.7.1)  -  скачать     для форумчан из Украины надо качать через VPN или пишите, закину на mail.
http://se.uploads.ru/t/7d9Ot.jpg

+4

18

Готовый вариант работы с шиной 1Wire через USART. Так сказать аппаратный 1Wire. Появится время, сделаю в фоне, на прерываниях.

Работают все функции, которые есть в Bascom.

Симуляция (Протеус 7.10) + исходник (Bascom 2.0.7.1) + Log + фото + видео + документация Maxim  -  скачать     для форумчан из Украины надо качать через VPN или пишите, закину на mail.

Фотки

http://s2.uploads.ru/t/aVgvd.jpg http://s6.uploads.ru/t/0VXnc.jpg
http://se.uploads.ru/t/ekBCF.jpg http://sd.uploads.ru/t/rBiCq.jpg

+3

19

Библиотека для работы с шиной 1Wire через USART (симуляция аппаратного 1Wite)

Неоценимую помощь в написании библиотеки оказал АКСАКАЛ нашего форума Сергей Шилов

Библиотека обкатана в железе на МК:  Atmega328P; Atmega2561; Atmega2560

Таймера с делителями = 1, запущены в качестве помехи, для работы библиотеки не требуются.

Подключение и настройка библиотеки

'===============================================================================
' Подключение библиотеки, для работы с шиной 1Wire через USART (аппаратная симуляция шины)
'===============================================================================
  Config Submode = New

'Настройка USART для работы с шиной 1Wire
  'Выбор аппаратного USART для эмуляции шины 1Wire, варианты: 0; 1; 2; 3. Соответственно USART0; USART1; USART2; USART3

  'если в контроллере только один USART, константа не обязательна
  Const _1wire_used_usart = 1       'Выбор аппаратного USART для эмуляции шины 1Wire, варианты: 0; 1; 2; 3

  $include "1Wire_USART.inc"

Симуляции (Протеус 7.10) + исходники (Bascom 2.0.7.1) + библиотека  -  скачать

Работа в Протеусе

http://s8.uploads.ru/t/EjvhY.jpg http://se.uploads.ru/t/HCETc.jpg
http://sa.uploads.ru/t/cFDvp.jpg

Все вопросы, пожелания, предложения пишите:
здесь
здесь
на mail
или в ЛС

+5

20

Короткий вариант работы с одним Ds18b20

'-------------------------------------------------------------------------------

'               Работа с датчиком температуры Ds18b20

'---------------------------  конфигурация МК-----------------------------------
  $map       ' Получаем карту распределения памяти компилятором Bascom
  $regfile = "m328pdef.dat"       ' Используемый контроллер
  $crystal = 1000000       ' Значение используемое компилятором для расчёта задержек
  $framesize = 32       'размер области используемой и необходимой для преобразований
  $hwstack = 40       ' Размер аппаратного стека
  $swstack = 16       ' Размер программного стека
'----------------------------  Настройка USART  --------------------------------
  $baud = 4800       ' 4800     '9600     '19200     '38400     '57600     '115000
  Ucsr0a.1 = 1       ' Скорость трансляции = $baud * 2
'------------------------  Настраиваем шину 1Ware  -----------------------------
  Config 1wire = Portb.0       ' Ножка МК для подключения датчика Ds18b20
'-----------------------  Используемые переменные  -----------------------------
  Dim Temp_ds18b20 As Integer       'Температура*16 в HEX формате
  Dim Data_ds18b20(2) As Byte At Temp_ds18b20 Overlay       'массив данных от DS18B20
  Dim Температура As Single

'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
'    З А П У С К    И    П Р Е Д В А Р И Т Е Л Ь Н Ы Е    Н А С Т Р О Й К И
'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  Gosub Запуск_измер_датчиков_ds18b20       ' Запускаем первое измерение
  Waitms 750       'Ждем первого результата
'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
'--------------  Разрешаем работу необходимых прерываний  ----------------------

'------------  Разрешаем работу всех включенных прерываний  --------------------

'===============================================================================
'                   Г Л А В Н Ы Й         Ц И К Л
'===============================================================================
  Главный_цикл:

     Gosub Опрос_ds18b20

     If Err = 0 Then
         If Температура < 0 Then
             Print Fusing(температура , "#.####") ; "°C"
           Else
             Print Fusing(температура , "#.####") ; "°C"
         End If
       Else
         Print "Датчик отключен"
     End If

     Waitms 750

  Goto Главный_цикл
End
'===============================================================================

'===============================================================================
'  Подпрограмма расчета и вывода температур
'===============================================================================
  Опрос_ds18b20:
'-------------------------------------------------------------------------------

    1wreset       ' Сброс линии 1Ware
    1wwrite &HCC       ' Обращение к датчику
    1wwrite &HBE       ' Команда чтения ОЗУ датчика
    Data_ds18b20(1) = 1wread(2)       ' Принимаем данные
    Температура = Temp_ds18b20       ' Забираем сырое значение температуры
    Shift Температура , Right , 4       ' Получаем готовую температуру с знаком

'===============================================================================
'  Запуск измерения температур датчиками Ds18b20
'===============================================================================
  Запуск_измер_датчиков_ds18b20:
'-------------------------------------------------------------------------------
   1wreset       ' Сброс линии 1Ware
   1wwrite &HCC       ' Обращение к датчику
   1wwrite &H44       ' Запуск измерения датчика
'-------------------------------------------------------------------------------
  Return
'===============================================================================

+5


Вы здесь » Программирование ATMEL в BASCOM. » Примеры применения в среде Баском » Исследование Ds18b20 (датчик температуры)