Перейти к содержанию

Подключение Нескольких Датчиков Ds18B20


Рекомендуемые сообщения

Доброго всем дня!

Использую кристалл ATTiny2313A.

Завершил заниматься работой с одним датчиком ds18b20, теперь хочу понять как работает и реализовать несколько датчиков на одной линии.

Почитал мануал. Для обращения к конкретным датчикам необходимо знать его 64-bit ROM код или по-крайней мере 48-bit Serial Number, так как Family code у всех одинаковый (28h). При обращении к датчикам необходимо всего лишь послать команду Match ROM (55h) потом 64-bit ROM конкретного датчика, затем команду для него, что делать.

Только вот трудность возникла у меня. Как узнать этот 64-bit ROM код каждого датчика? И если он не один, а допустим 3 и более?

В начале подумал, что необходимо каждый датчик по отдельности проверить и разузнать его код при помощи команды Read ROM (33h), а потом использовать как описал выше. А если со временем придется поменять один из датчиков, то придется переписывать 64-bit ROM код опять?

Тогда имеется другая команда, Search ROM (F0h), которая находит и считывает 64-bit ROM коды всех датчиков, которые нашла. Ну, а потом обращается к ним по найденным кодам. С этой командой у меня не совсем сложилось. Я нашел русский даташит, и не совсем понял ее принцип работы. И потом, неужели каждый раз МК должен использовать эту команду при обработке датчиков, не займет ли это много времени?

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

Заранее спасибо

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

И потом, неужели каждый раз МК должен использовать эту команду при обработке датчиков, не займет ли это много времени?

Много времени не займёт ,да и не за чем это.

Достаточно в начальный момент старта (включения) произвести опрос и регистрацию датчиков, а дальше использовать уже известные адреса.

Не квалифицированный, но везучий электрик знает в лицо всех архангелов.

Прогресс сделал розетки недоступными для большинства детей. Умирают только самые одаренные.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Да, действительно. Не додумался.

Но вот с кодом, у меня ступор. Инициализация, отправка команды Search ROM(F0h) понятно, но потом все остальные процедуры, просто не могу понять как происходит определение датчиков.

Может кто подскажет, как Вы в своих проектах поступали?

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Search ROM, найдет все устройства в момент инициализации микролан(при резете), в динамике, при подключении нового устройства, оно подает в сеть "импульс присутствия", по нему мастер должен повторно запустить Search ROM. "Отвал" устройства контролируется по отсутствию ответа от адреса. Таким образом, мастер контролирует сеть.

Errare humanum est. Коли людЯм позволено, что же о нас то говорить!
 

Ссылка на комментарий
Поделиться на другие сайты

<p>Начал осваивать код по по опросу нескольких датчиков. Для начала просто хотел сделать инициализацию, отправить команду SEARCH ROM(F0h) и получить хотя бы пару бит с датчиков ds18b20. Ну и просмотреть на протеусе, что покажет осциллограф. Так и сделал, но на протеусе, после инициализации происходит отправка команды 00h. Я перепроверил команду, но процесс не поменялся. Потом, просто отправил любое число после инициализации, но результат был FFh и не важно какое число отправляю.

Может я что-то не понял в прочтении осциллограммы

Привожу, что у меня на протеусе и листинг программы.

#define F_CPU 4000000L
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
//=========ds18b20_commands_==========================================
#define READ_ROM 0x33
#define SKIP_ROM 0xCC //The master can use this command to address all devices
 //on the bus simultaneously without sending out any ROM code information
#define SEARCH_ROM 0xF0 //identify the ROM codes of all slave devices on the bus
#define MATCH_ROM 0x55 //this command allows the bus master to address a specific slave device
 //on a multidrop or single-drop bus
#define CONVERT_T 0x44 //This command initiates a single temperature conversion.
#define READ_SCRATCHPAD 0xBE //This command allows the master to read the contents of the scratchpad.
//=========define_port_and_pin_of_1-wire_cmmunication=================
#define OWI_PORT PORTD
#define OWI_DDR DDRD
#define OWI_PIN PIND
#define OWI_BIT 3 //PIND.3
//=========Bus_statements=============================================
#define OWI_LOW OWI_DDR |= (1<<OWI_BIT) //Bus master pulling low
#define OWI_HIGH OWI_DDR &=~ (1<<OWI_BIT) //Resistor pullup
//=========Initialization_Function====================================
char OWI_reset(void)
{
char SR0=SREG; //save the register value
cli();	 //interrupts are forbidden
char device; //variable for keeping of found devices
OWI_LOW;	 //pull the bus to low
_delay_us(485); //wait 480mcs minimum as per datasheet.MASTER TX RESET PULSE
OWI_HIGH;	 //leave the bus high by pullup resistor
_delay_us(65); //wait 60mcs minimum as per datasheet.DS18B20 TX presence pulse
if((OWI_PIN & (1<<OWI_BIT))==0x00) //check the bus for ds18b20 presence pulse
{device=1;	 //on the bus we have the sensor
}
else
{device=0;	 //on the bus we don't have any sensor
}
SREG=SR0;	 //return the first value of the register
_delay_us(420); //finishing the initialization time
return device;
}
//=================Sending_1-bit_to_the_DS18b20=======================
void OWI_write_bit (char bit)
{
char SR1=SREG; //save the register value
cli();	 //interrupts are forbidden
OWI_LOW;	 //pull the bus to low
_delay_us(2); //MASTER WRITE “1” SLOT, more than 1 mcs
if(bit) OWI_HIGH; //if we have 0
_delay_us(65); //MASTER WRITE “0” SLOT, from 60mcs to 120mcs
OWI_HIGH;	 //leave the bus high by pullup resistor
SREG=SR1;	 //return the first value to the register
}
//=================Sending_1-byte_to_the_DS18b20=======================
void OWI_write_byte (unsigned char c)
{
char i;	 //variable for the check cycle
for(i=0;i<8;i++) //in this cycle we are operating bit by bit
{
if(c & (1<<i)==1<<i)
{OWI_write_bit(1); //if bit is equal 1 than send 1
}
else
{OWI_write_bit(0); //else we are send o
}
}
}
//================1-bit_Reading_Function==============================
char OWI_read_bit(void)
{
char SR2=SREG; //save the register value
cli();	 //interrupts are forbidden
char OWI_rbit; //variable for keeping of bit
OWI_LOW;	 //pull the bus to low
_delay_us(2); //MASTER READ “0” SLOT
OWI_HIGH;	 //leave the bus high by pullup resistor
_delay_us(13); //
OWI_rbit=(OWI_PIN & (1<<OWI_BIT))>>OWI_BIT; //Read the bus on the pin
_delay_us(45); //time for finishing of time slot
SREG=SR2;	 //return the first value to the register
return OWI_rbit;
}
//===============1-byte_Reading_Function===============================
unsigned char OWI_read_byte()
{
char data=0,i; //variable for this function
for(i=0;i<8;i++) //check the bus and save the data
data|=OWI_read_bit()<<i; //check next bit
return data;
}
//*************Main function of DS18B20************************************************
int temp_18b20()
{
unsigned char B;
unsigned int ds18_temp=0;
if(OWI_reset()==1)
{
OWI_write_byte(SKIP_ROM);
OWI_write_byte(CONVERT_T);
_delay_us(750);
OWI_reset();
OWI_write_byte(SKIP_ROM);
OWI_write_byte(READ_SCRATCHPAD);
B=OWI_read_byte();
ds18_temp=OWI_read_byte();
ds18_temp=(ds18_temp<<8) | B;
}
return ds18_temp;
}
//*************Convert the data********************************************************
char convert(unsigned int td)
{
char dat=td>>4;
return dat;
}
//============Communication_with_2_and_more_sensors===================================
char COMM_2more_sensors()
{
if (OWI_reset()==1) //Initialization procedure
{
OWI_write_byte(SEARCH_ROM); //Send command for testing the sensors on the bus
OWI_read_bit(); //Check first two bits from the sensors
OWI_read_bit();
}
}
int main(void)
{
DDRB=0xFF;	 //Port B as a output
PORTB=0x00;
DDRD=0x26;
PORTD=0x01;
while(1)
{
 COMM_2more_sensors();
}
}

post-186628-0-50652400-1424884709_thumb.png

post-186628-0-01555200-1424884886_thumb.png

Изменено пользователем Purple
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...