Главная » Статьи » Как подключить

Опрос большого количества датчиков DS18B20 в Bascom-AVR
  Датчики 18B20 от фирмы Dallas хороши тем, что подключаются по шине 1-Wire и занимая всего один вывод микроконтроллера, можно обработать большое количество устройств. Bascom-AVR тоже имеет в своем инструментарии команды, позволяющие легко работать с большим числом устройств 1-wire. В этом примере будет приведен опрос 4 датчиков 18B20, висящих на одной линии.  

 Каждому устройству протокола 1-wire при производстве присваивается уникальный идентификационный код, который позволяет определять устройство на шине. Ведущее устройство (микроконтроллер в нашем случае) при сканировании шины записывает номера найденных устройств и при опросе начинает опрос в порядке очереди начиная с наименьшего адреса устройства. 

 В Bascom-AVR поиск устройств ведется по командам

Dsid1(1) = 1wsearchfirst()
Dsid2(1) = 1wsearchnext()
Dsid3(1) = 1wsearchnext()

 Переменным  Dsid1, Dsid2,  Dsid3  присвоятся значения адреса найденных устройств. Затем по этим адресам будут опрашиваться устройства. 

        


$regfile = "m8def.dat"
$crystal = 1000000

Config Lcdpin=Pin, Rs=Portb.7,E=Portb.6,Db4=Portb.5,Db5=Portb.4,Db6=Portb.3,Db7=Portb.2
Config Lcd = 16 * 2
Cursor Off
Cls

Config 1wire = Portc.2

Dim Ss As String * 6
Dim I1 As Integer
Dim I2 As Integer
Dim I3 As Integer
Dim I4 As Integer
Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim Dsid3(8) As Byte
Dim Dsid4(8) As Byte


Deflcdchar 0 , 232 , 244 , 232 , 227 , 228 , 228 , 227 , 224
  'градус Цельсия      
Deflcdchar 1 , 31 , 27 , 19 , 27 , 27 , 27 , 17 , 31
          'символ 1 
Deflcdchar 2 , 31 , 17 , 21 , 29 , 27 , 23 , 17 , 31        
  'символ 2
Deflcdchar 3 , 31 , 17 , 29 , 25 , 29 , 29 , 17 , 31    
       'символ 3 
Deflcdchar 4 , 31 , 23 , 21 , 21 , 17 , 29 , 29 , 31  
         'символ 4

'считываем адреса устройств на шине 1-Wire 
Dsid1(1) = 1wsearchfirst()
Dsid2(1) = 1wsearchnext()
Dsid3(1) = 1wsearchnext()
Dsid4(1) = 1wsearchnext()


Do
   1wreset                                             'запускаем опрос всех датчиков
   1wwrite &HCC
   1wwrite &H44

Waitms 750

'после ожидания начинаем считывать датчики
'---------------------------------
   1wreset
   1wwrite &H55
   1wverify Dsid1(1)
                   'адрес первого датчика 
   1wwrite &HBE
   I1 = 1wread(2)
'---------------------------------
   1wreset
   1wwrite &H55
   1wverify Dsid2(1)
                     'адрес второго датчика 
   1wwrite &HBE
   I2 = 1wread(2)
   '------------------------------
   1wreset
   1wwrite &H55
   1wverify Dsid3(1)
                     'адрес третьего датчика
   1wwrite &HBE
   I3 = 1wread(2)
'---------------------------------
   1wreset
   1wwrite &H55
   1wverify Dsid4(1)
                  'адрес четвертого датчика
   1wwrite &HBE
   I4 = 1wread(2)

   Gosub conversion

   Cls
   Locate 1 , 1
   Lcd Chr(1) ; Ss ; Chr(0)

   I1 = I2

   Gosub Conversion

   Locate 2 , 1
   Lcd Chr(2) ; Ss ; Chr(0)

   I1 = I3

   Gosub Conversion

   Locate 1 , 9
   Lcd Chr(3) ; Ss ; Chr(0)

   I1 = I4

   Gosub Conversion

   Locate 2 , 9
   Lcd Chr(4) ; Ss ; Chr(0)

Loop

End

Conversion:
 I1 = I1 * 10
 I1 = I1 \ 16
 Ss = Str(i1)
 Ss = Format(ss , "0.0")
Return


  Очередь по которой будут сканироваться датчики и выводится показания, зависят только от уникального номера устройства.  Но если потребуется опрашивать датчики только в определенном порядке, тогда нужно будет узнать уникальные номера, и отправлять их в нужном порядке. 




 

 Скачать проект в Proteus

 А здесь представляем вашему вниманию двухканальный термометр с возможностью фиксировать максимумы/минимумы температур, которым с нами поделился товарищ 4ester


Категория: Как подключить | Добавлено: 27.05.2012
Просмотров: 26733 | Комментарии: 49 | Рейтинг: 5.0/12
Всего комментариев: 491 2 »
49 T1nK   (19.01.2014 18:14)
Ну, я понимаю, что все не должно быть все уж очень сложно, но тем не менее первый раз собрав схему, что называется, "в железе" и не увидев ничего кроме горящего светодиода Power на FT232RL становится как-то грустно. Тем более что два дня плясок с бубном вокруг макетной платы и COM порта ничего не дали.

48 exersizze   (19.01.2014 17:39)
Все доступно, кнопка создания новой темы форума располагается сверху справа.
Создайте например вот здесь http://avrproject.ru/forum/15
Ну если начнете вникать то разберетесь помаленьку, там ничего сверхестественного нет)

47 T1nK   (19.01.2014 16:35)
Хотел на форуме вопрос задать, но создание темы мне почему-то недоступно.
В какую тему мне лучше написать что комментарии тут не забивать?..

46 T1nK   (19.01.2014 16:14)
Прочитал обе статьи, но первую вообще не понял, как впрочем и вторую (дыры в описании действий).
Возможно для электронщика и понятно что как делать, а для меня, как человека о электронике мало что знающего, в них ничего не понятно.
А описание действий с софтом слишком расплывчато с пропуском шагом - в общем то же ни о чем.
Буду дальше гуглить, может через недельку-другу чего нагуглится :((((

45 exersizze   (19.01.2014 14:07)
Судя по описанию у вас не программатор, а простой конвертер USB в последовательный RS232. Но по большому счету разница между программатором на FT232 и преобразователем несущественные. Рекомендую ознакомится вот с этим http://easyelectronics.ru/skorost....ra.html

у меня есть материал на использование такого преобразователя, но с использованием загрузчика (бутлоадера) http://avrproject.ru/publ....1-0-109

44 T1nK   (19.01.2014 00:37)
Есть ли на сайте статья по настройку BASCOM для программирования через FT232RL и подключению последнего в МК (к тому же ATmega8, например) ?

43 T1nK   (18.01.2014 20:16)
Наконец проект собран и отлажен, по крайней мере в ISIS все работает.
На днях пришла и посылка с программатором FT232RL. Искал схему подключения в интернете, но видимо плохо, потому что ничего не нашел...

Ссылку на ebay не кидаю, на случай если это запрещено, но называется он там "FT232RL USB to Serial adapter module USB TO 232 for Arduino"). Контакты в порядке следования - GDN, CTS, 5V, TXD, RXD, DTR.

Подскажите пожалуйста как подключить FT232RL к ATmega8A-PU?
У схемы пока не будет своего питания (чуть позже определюсь - 3V или 5V), так что пока запитывать буду от FT232RL - понятно что GDN к GDN, а 5V к VCC.

42 max   (12.01.2014 10:31)
Bascom-AVR 1.11.9.8

41 T1nK   (12.01.2014 02:27)
При использование всех файлов из прикрепленного архива все прекрасно работает.

Попробовал сделать свой проект с нуля - не работает.
Попытался проект и код повторить - не работает.
Долго не мог понять в чем косяк пока не попытался запустить проект пересобрав HEX в своем BASCOM 2.0.7.5 после чего и в исходном проекте температура стала отображаться 0.0 со всех датчиков не зависимо от их показаний.
Увидел что исходный HEX и пересобранный отличаются - мой меньше на 307 байт.

В какой версии BASCOM собирался проект ?
Или BASCOM нужно как-то настроить для сборки проекта ?

40 Vitek1977   (04.01.2014 14:38)
более менее запустил по варварски.
do
Config 1wire = Portd.3
1wreset
1wwrite &HCC
1wwrite &HBE
Tx = 1wread(2)
Tx = Tx * 10
Tx = Tx \ 160
1wreset
1wwrite &HCC
1wwrite &H44
Config 1wire = Portd.4
1wreset
1wwrite &HCC
1wwrite &HBE
Ty = 1wread(2)
Ty = Ty * 10
Ty = Ty \ 160
1wreset
1wwrite &HCC
1wwrite &H44
Config 1wire = Portd.5
1wreset
1wwrite &HCC
1wwrite &HBE
Tz = 1wread(2)
Tz = Tz * 10
Tz = Tz \ 160
1wreset
1wwrite &HCC
1wwrite &H44
End If
..........
loop
но есть другой правильный вариант, толком не могу найти, все вокруг да около.

39 Vitek1977   (03.01.2014 20:28)
всем привет. а есть ли возможность подключение датчиков на разные пины, как их опрашивать? то есть организовать 2-3 канала 1wire.

38 sivan   (27.09.2013 19:16)
1wverify Dsid1(1) 'адрес первого датчика

Я вот думаю, насколько такая проверка надежна. Уникальный код по даташиту 48-битный. А сравниваем лишь 8 бит. Иными словами, какова вероятность, что попадутся датчики с одинаковым этим байтом?

37 exersizze   (31.03.2013 12:53)
Он получается при преобразовании, в общем остаток от деления на 16
Код
I1 = I1 * 10
I1 = I1 \ 16

36 Антошин   (31.03.2013 10:56)
Подскажите пожалуйста,каким образом программа вычисляет десятую долю градуса?Просто
мне встречалась программа с очень хитрой и формулой вычисления.Как это
реализовано здесь?

35 exersizze   (27.01.2013 22:41)
С дисплея данные не читаются,  поэтому думаю что такое вполне возможно

34 ssql   (27.01.2013 13:37)
Уважаемые товарищи, такой вопрос - а можно параллельно 1-му экрану подключить еще один? Просветите))

33 Vitek1977   (19.12.2012 16:11)
в том та и дело что нет переменных под такой адрес. максимум же 4 байта. туда же скинул файл. http://avrproject.ru/forum/5-31-1 несудите строго, эт первый проект у меня, занимает 98% в меге8, пришлось настройку гистерезиса котла убрать чтоб влезла, оставил постоянное значение. аппарат работает две недели, нареканий не было, выдерживает в помещение температуру +-0.3 градуса. на улице температура за это время -20...-40 была

32 pchela5   (19.12.2012 10:53)
Если мне не изменяет память - так адрес датчика не является переменной byte - размерность у него поболее. Посему у тебя и получилось только таким образом. PS В даташите указано, что уникальный адрес - 64 разряда. Кинь программку то в форум - поделись.

31 Vitek1977   (18.12.2012 19:36)
победил я это дело, но увеличением программы. нормально работает только если ,без исключения весь массив датчика записать в eeprom
Dim Ram31 As Eram Byte
Dim Ram32 As Eram Byte
Dim Ram33 As Eram Byte
Dim Ram34 As Eram Byte
Dim Ram35 As Eram Byte
Dim Ram36 As Eram Byte
Dim Ram37 As Eram Byte
Dim Ram38 As Eram Byte
.
.
Nomdat3(1) = Ram31
Nomdat3(2) = Ram32
Nomdat3(3) = Ram33
Nomdat3(4) = Ram34
Nomdat3(5) = Ram35
Nomdat3(6) = Ram36
Nomdat3(7) = Ram37
Nomdat3(8) = Ram38
DO
.
.
If Pinb.3 = 0 Then
'считываем адреса устройств на шине 1-Wire
Nomdat1(1) = 1wsearchfirst() '1
Nomdat2(1) = 1wsearchnext()
Nomdat3(1) = 1wsearchnext()
Ram31 = Nomdat3(1)
Ram32 = Nomdat3(2)
Ram33 = Nomdat3(3)
Ram34 = Nomdat3(4)
Ram35 = Nomdat3(5)
Ram36 = Nomdat3(6)
Ram37 = Nomdat3(7)
Ram38 = Nomdat3(8)
и так для каждого датчика :( массив eeprom создать не дает
Dim Ram3 As Eram Byte(8)
может кто подскажет как можно упростить этот вариант программы.
за то добился чего хотел, при повторном включение я сигнал с датчиков могу вообще прервать, после подключаю все работает все показания на месте, в программе я реализовал выбор датчиков по назначению так же с записью в eeprom

30 Vitek1977   (18.12.2012 17:17)
спасибо за прогу, там все понятно, но как сохранить адреса датчиков так я и не пойму, пробовал всяко, я так понимаю адреса при считывании пишутся в первую ячейку массива, даю команду на запись этих ячеек в eeprom. сразу через bascom проверяю ячейки без изменения. буду дальше колдовать. инфы в нете нормальной нет, сандартное описание двух видов обращения к eeprom с простой переменной,

29 pchela5   (18.12.2012 10:42)
Файл с программой разместил тут: http://avrproject.ru/forum/5-31-1

28 Vitek1977   (17.12.2012 17:30)
и так пробовал, эфект тот же, при перезапуске err по датчикам.
без записи в eeprom как в программе указанной на этой странице, все работает нормально, че не так не пойму. вроде что та массивом не то делаю, с простыми переменными сохраняюсь в eeprom без проблем и читаю.
Dim Nomdat1(8) As Byte
Dim Nomdat2(8) As Byte
Dim Nomdat3(8) As Byte
$eeprom
Nomdat1default:
Data 100%
$data
Readeeprom Nomdat1(1) , Nomdat1default
$eeprom
Nomdat2default:
Data 100%
$data
Readeeprom Nomdat2(1) , Nomdat2default
$eeprom
Nomdat3default:
Data 100%
$data
Readeeprom Nomdat3(1) , Nomdat3default
.
.
1wreset
1wwrite &H55
1wverify Nomdat1(1) '1
1wwrite &HBE
Dd = 1wread(2)
.
.
.

If Pinb.3 = 0 Then
'считываем адреса устройств на шине 1-Wire
Nomdat1(1) = 1wsearchfirst() '1
Nomdat2(1) = 1wsearchnext()
Nomdat3(1) = 1wsearchnext()
Writeeeprom Nomdat1(1) , Nomdat1default
Writeeeprom Nomdat2(1) , Nomdat2default
Writeeeprom Nomdat3(1) , Nomdat3default

27 Vitek1977   (17.12.2012 17:17)
если есть исходник на bascom было бы любопытно посмотреть, почерпнуть информацию. так как планирую тоже многоцелевое устройство разработать. в своем доме место есть где развернуть идеи. у меня есть в наличие меги 16,32,128. скоре буду на последнем, из за колличества пинов и большой памяти. ичение свет :)vasykevih@inbox.ru

26 pchela5   (17.12.2012 16:54)
Могу скинуть программу, скомпилированную из двух проектов, размещенных на данном сайте: четыре датчика + четыре исполнительных реле + детектор присутствия человека. Использую на данный момент у себя дома на утепленном балконе - два ящика для хранения + теплый пол (режимы постоянный / сработал датчик PIR) + еще один нагреватель для оптимальной работы компрессора морозильной камеры. Добавлены следующие функции - вотчдог от зависания, включен порог срабатывания по падению напряжения, постоянно опрашивается количество датчиков - при некорректом числе - сигнализация, + периодическая инициализация дисплея - в процессе эксплуатации выяснилось данная необходимость.

25 Vitek1977   (17.12.2012 15:11)
очепятку скинул, сори
Nomdat1_eep = Nomdat1(8)
Nomdat2_eep = Nomdat2(8)
Nomdat3_eep = Nomdat3(8)

24 Vitek1977   (17.12.2012 15:01)
сбой вероятен, так как до дальнего датчика 40 метров, в случае отключения электричества и повторном включение если произойдет сбой при опросе адресов, в моем случае который на улице от которого идет основной расчет температуры для котла, делов наделает, если все на работе. вот я и решил чтоб из меню давать команду на опрос датчиков с записью в память, при первом запуске и смене датчика, а при последующем запуске считывались адреса из памяти и с ними работать. вы уж не ругайте меня сильно, это первый мой проект, тяжело все понять сразу.

Dim Nomdat1_eep As Eram Byte
Dim Nomdat2_eep As Eram Byte
Dim Nomdat3_eep As Eram Byte
.
.
Nomdat1(8) = Nomdat1_eep
Nomdat2(8) = Nomdat2_eep
Nomdat3(8) = Nomdat3_eep

do
.
.
' работа в меню
If Pinb.3 = 0 Then
'считываем адреса устройств на шине 1-Wire
Nomdat1(1) = 1wsearchfirst()
Nomdat2(1) = 1wsearchnext()
Nomdat3(1) = 1wsearchnext()

Nomdat1_eep = Nomdat1(8)
Nomdat1_eep = Nomdat1(8)
Nomdat1_eep = Nomdat1(8)
End If
так не работает, включаю первый раз, как положенно err по датчикам, запускаю опрос адресов, работает, перезапускаю ...err по датчикам.

23 exersizze   (16.12.2012 21:24)
Интересно, часто дает сбой при запуске? Адреса датчиков как уже тут писали хранятся в переменных Dsid1(8)...Dsid4(8) Записать в еепром их можно, предварительно создав подходящие переменные типа Eram Byte
Например
Code
Dim Dsid1_eep As Eram Byte
Dim Dsid2_eep As Eram Byte
Dim Dsid3_eep As Eram Byte
Dim Dsid4_eep As Eram Byte

Dsid1_eep = Dsid1(8)
Dsid2_eep = Dsid2(8)
Dsid3_eep = Dsid3(8)
Dsid4_eep = Dsid4(8)


по какому условию будут записываться адреса? кнопкой?

22 Vitek1977   (16.12.2012 18:23)
Помогите разобраться! мне надо записать адреса датчиков в eeprom по команде и при включении устройства поисходило чтение из памяти на примере этой программы. иначе при включении если какой датчик даст сбой то прийдется перезапускать. я новичек. разработал программу погодозависимого регулятора котла с частью этого кода, работает,но довожу до ума, нужна надежная система.

21 exersizze   (08.12.2012 22:29)
Тут я с вами полностью согласен, необходимость как-то идентифицировать датчики убивает единственный плюс этого интерфейса. Но сама по себе возможность цеплять несколько устройств на одну ногу микроконтроллер очень даже полезна

20 serg_52   (08.12.2012 21:23)
Не вижу больших преимуществ подключения кучи датчиков на одну шину.
Плюс только один - нужна всего одна ножка контроллера.
Минусы - более сложный код по идентификации датчиков и их количества. Но самое неприятное - как физически идентифицировать датчик? Они все одинаково черные :) Серийника на них нет - писАть негде. Нужна предварительная инвентаризация датчиков с последующей покраской в разные цвета в зависимости от серийного номера :)
Поэтому мне больше нравится вариант - каждому датчику по пину. В этом случае я точно буду знать, какой датчик что показывает. Благо, в Баскоме есть команды для работы с несколькими датчиками, подключенных к разным пинам.

Например:
1WRESET , PORT , PIN
var2 = 1WREAD( bytes , port , pin)

Поэтому если с пинами нет проблем - зачем мучиться?
Серийный номер в этом случае не нужен.

1-30 31-49
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]






   EasyEDA:  бесплатный редактор схем

   ✓ Создание схем
   ✓ Возможность симуляции
   ✓ Быстрое создание печатных плат
   ✓ Интуитивно понятный интерфейс

   Нарисуй свою схему прямо сейчас!
   Изготовление печатных плат   https://easyeda.com/order
авторизация
Логин:
Пароль:
Комментарии
Когда не хватает ног. Часть 2. Сдвиговый регистр 74HC595
01.12.2016 - yorx:
Доброго времени суток, exersizze попробовал Ваш код все равно не работает как на...
Помни об усадке!
30.11.2016 - pchela5:
Автомобильные никакие не лезут?
Помни об усадке!
29.11.2016 - AlekS:
Виктор, спасибо.
С заменой транса в зиму, перестройка не комельфо) Валяет...
Управляем микроконтроллером с ПК по UART
29.11.2016 - exersizze:
Михаил, для работы с инфракрасными датчиками и диодами есть команды RC5SE...
Управляем микроконтроллером с ПК по UART
29.11.2016 - Михаил:
Всем привет.
Подскажите как переменную S передать по инфракрасному каналу...
Помни об усадке!
29.11.2016 - pchela5:
> Если ленту светодиодную порезать и соединить последовательно
Только ...
Когда не хватает ног. Часть 2. Сдвиговый регистр 74HC595
29.11.2016 - exersizze:
yorx, вывод Q7 ' первой микросхемы соединен с DS второй микросхемы? С...
Помни об усадке!
29.11.2016 - exersizze:
Можно даже без резистора их включать, если на ленте уже стоят. Но если опасаешьс...
Помни об усадке!
28.11.2016 - AlekS:
Да,пла, из абс как-то грубовато идет. (((
Самое главное, наверное и для т...


Лучшие цены на 3D принтеры
успей сделать себе подарок к Новому Году! ;)


Prusa i3

Prusa i3 от 12500 р.



Rostoсk

Rostock от 15000 р.