Исследование Ds18b20 (датчик температуры)
Исследование Ds18b20 (датчик температуры)
Сообщений 1 страница 20 из 20
Поделиться22014-01-18 05:48:07
Поиск 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 WordDeclare 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 ByteDeclare Sub Reading_eeprom_id_ds18b20()
'*******************************************************************************
Do
'-------
'Toggle Led_norma : Waitms 300
'Pulselednorma = 30 Then : Toggle Led_norma : Pulselednorma = 0 : End Ifrcall 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 = 1Print " " ; 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 'Пауза ~ 500msPrint : 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 'Пауза ~ 500msPrint : 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 "
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_ds18b20Print " " ; 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 SelectIncr Adres_id_ds18b20
Next B
Adres_id_ds18b20 = Adres_id_ds18b20 + 2
Waitms 250 'Пауза ~ 500msPrint : 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
'*******************************************************************************
В архиве все необходимое включая эмуляцию. На P4-800-3Ггц симуляция идет без проблем. В железе проверялось с 20 датчиками, больше не нашел.
Все, что необходимо -- скачать
Поделиться32014-01-18 05:49:44
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.7500Min t°C: 25.6250°C
Max t°C: 26.0625°C
Поделиться42014-01-18 05:51:02
Ds18b20 на разных выводах МК
6 Ds18b20 на разных выводах МК
Эмуляция (Протеус 7.10 рус.) + исходник (Bascom 2.0.7.1) + программа терминал (Windows7 x32 & x64) - скачать обновлено 9.03.2015
Работа шести датчиков Ds18b20 проверена в реальном железе.
Поделиться52014-01-18 05:52:38
Исследование работы 8 датчиков Ds18b20, поиск ID, запись в EEPROM MK
Описаны, но не используются: "Программирование датчика ds18b20", "Запись_в_пзу_ds18b20"
Так, как присутствует работа с EEPROM, для полноценной эмуляции не забудьте скинуть сохранение в протеусе: ( верхнее меню => отладка => сброс постоянных данных модели ).
В железе проверено. 6 мес работает у человека. Так, как не планировалось выкладывать, фоток не делал.
'*******************************************************************************
'************************* 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_ds18b20rcall Init_temperatura
'*******************************************************************************
'*******************************************************************************
'*******************************************************************************
'*******************************************************************************
'*******************************************************************************
Do
'---------
Toggle Led_normarcall 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 - Byte1Znak_temperatura = "-" 'Знак "-"
Else
Znak_temperatura = " " 'Вместо знака "+", ставим пробел
End IfT0 = 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 , 5rcall 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 : Clsrcall Bip_bip
'---------------
End Function
'-------------------------------------------------------------------------------
'*******************************************************************************'*******************************************************************************
Sub Pervoe_vklyuchenie:
'-------------------------------
rcall Zapros_kolichestva_ds18b20rcall 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 BWaitms 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 BWaitms 1000
1_vklyuchenie = 50
Writeeeprom 1_vklyuchenie , 1
Waitms 10rcall 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_ds18b20Select 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
Всё, что необходимо для эмуляции скачать
Поделиться72014-01-18 05:53:21
Как выяснилось!!!
В протеусе версии 7.7, глючат датчики DS18B20 !!!
Поделиться82014-01-18 05:54:21
Atmega328P-DIP28=18.432 Мгц + 20 шт. Ds18b20 + TIMER0=0.5 ms (7-seg LED индикация) + USART=230400 . Проверено в железе с скоростю USART 230400, Протеус работает с скоростью 57600.
Эмуляция в Протеус - скачать
Поделиться102014-04-24 20:55:07
Attiny45A_85A + 4 x Ds18b20 + USART + короткий вариант работы с Ds18b20
Симуляция (Proteus 7.10) + исходник (Bascom 2.0.7.1) - скачать
Поделиться122014-09-10 11:03:32
Attiny85A + 4 x Ds18_S_20 + 4 x Ds18_B_20 + USART
Симуляция (Proteus 7.10) + исходник (Bascom 2.0.7.1) - скачать
Поделиться132014-09-10 17:26:12
Atmega328P + 4 x Ds18_S_20 + 4 x Ds18_B_20 + 4 x 7-seg LED
Симуляция (Proteus 7.10) + исходник (Bascom 2.0.7.1) - скачать
Поделиться142014-11-22 19:25:49
Варант работы с Ds18b20 через USART, так сказать аппаратная реализация шины 1Wire.
В качестве помехи работе шины 1Wire, запущены 2 таймера с делителем = 1
Всё работает чётко и без глюков
Симуляция + исходник -- скачать
Дебаггер для Протеуса можно скачать -- здесь , ОГРОМНОЕ СПАСИБО Петру за выложенную модель.
Таблица семейств 1wire -- здесь
Документация производителя по этому вопросу -- здесь , как ни странно, датируется 2002 годом.
Поделиться152015-03-10 15:53:57
Убрано всё лишнее!
2 Ds18b20 на разных выводах МК
Симуляция (Протеус 7.10) + исходник (Bascom 2.0.7.1) - скачать
Поделиться162017-02-06 05:32:39
Изменение настроек в ОЗУ Ds18b20 и последующей записью в ПЗУ
Симуляция (Протеус 7.10) + исходник (Bascom 2.0.7.1) - скачать
Поделиться172017-10-09 13:12:20
Из-за использование большого количества прерываний, совсем порушилась работа 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.
Поделиться182017-10-11 19:31:18
Готовый вариант работы с шиной 1Wire через USART. Так сказать аппаратный 1Wire. Появится время, сделаю в фоне, на прерываниях.
Работают все функции, которые есть в Bascom.
Симуляция (Протеус 7.10) + исходник (Bascom 2.0.7.1) + Log + фото + видео + документация Maxim - скачать для форумчан из Украины надо качать через VPN или пишите, закину на mail.
Поделиться192017-10-15 10:16:25
Библиотека для работы с шиной 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) + библиотека - скачать
Все вопросы, пожелания, предложения пишите:
здесь
здесь
на mail
или в ЛС
Поделиться202018-05-11 17:21:24
'-------------------------------------------------------------------------------
' Работа с датчиком температуры 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 IfWaitms 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
'===============================================================================



























