Всё по DS18(B/S)20.

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение Аlex »

Глянул хелп на CV, в 1-Wire библиотеке есть функция
unsigned char w1_crc8(void *p, unsigned char n)
Она расчитывает контрольную сумму.
Можете её заюзать.
Реклама
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение WiseLord »

Идея в том, что и скратчпад (9 байтов), и id датчика (8 байтов) устроены так, что последний байт должен быть равен контрольной сумме предыдущих. Также это равносильно тому, что контрольная сумма всех байтов равна нулю.

Сейчас я для расчёта использую встроенную в avr-libc функцию, раньше использовал самописную. Может, пригодится.
Реклама
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Re: Всё по DS18(B/S)20.

Сообщение ROMan2947 »

Приветствую!
прошу помочь выпросить у сей девайса хоть какие-нибудь данные. наблюдаю за шиной с помощью осциллографа, импульс присутствия имеется, байт кода команды так же вырисовывается.но в ответ тишина :(
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>

#define LOW DDRA=1<<1;
#define HIGT DDRA&=~(1<<1)

void init()
{
LOW;
_delay_us(485);
HIGT;
_delay_us(485);
}

int write_bit(int bit)
{

if(bit==1)
{ LOW;
_delay_us(2);
HIGT;
_delay_us(75);
}
else
{
LOW;
_delay_us(75);
HIGT;
_delay_us(2);
}
}


int write_byt(int DATA)
{
for (int RZD=0;RZD<=7;RZD++)
{
write_bit(1&(DATA>>RZD));
}
}

int main (void)
{
//while(1)
//{
int kom=0x33; //команда чтения ROM
init();
write_byt(kom);

LOW;
_delay_us(2);
HIGT;
//}


}
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18547
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение ARV »

ROMan2947 писал(а):if(bit==1)
{ LOW;
_delay_us(2);
HIGT;
_delay_us(75);
}
else
{
LOW;
_delay_us(75);
HIGT;
_delay_us(2);
}
внимательно изучите протокол обмена, а именно, тайм-слоты записи 1 и 0, а так же тайм-слоты чтения 1 и 0.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Re: Всё по DS18(B/S)20.

Сообщение ROMan2947 »

ARV писал(а):
ROMan2947 писал(а):if(bit==1)
{ LOW;
_delay_us(2);
HIGT;
_delay_us(75);
}
else
{
LOW;
_delay_us(75);
HIGT;
_delay_us(2);
}
внимательно изучите протокол обмена, а именно, тайм-слоты записи 1 и 0, а так же тайм-слоты чтения 1 и 0.
так-то я знаю, что проблема в тайм-слотах,задолбался втыкать в эти графики, от этого и пришел сюды. по счет чтения это отдельная тема! с записью что не так?
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18547
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение ARV »

ROMan2947 писал(а):задолбался втыкать в эти графики
а без этого никак
ROMan2947 писал(а):с записью что не так?
вот, например, старенькая моя статеечка, не самый лучший образец, но для начала пойдет. смотрим на картинку
Изображениеи пробуем сопоставить с вашим кодом.

откуда вы взяли 75 мкс задержки при записи или чтении? приведите все задержки к нужным значениям, и все заработает. а не хотите - берите готовую библиотеку 1-wire и тупо пользуйтесь чужими наработками.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Re: Всё по DS18(B/S)20.

Сообщение ROMan2947 »

ARV писал(а):
ROMan2947 писал(а):задолбался втыкать в эти графики
а без этого никак
ROMan2947 писал(а):с записью что не так?
вот, например, старенькая моя статеечка, не самый лучший образец, но для начала пойдет. смотрим на картинку
Изображениеи пробуем сопоставить с вашим кодом.

откуда вы взяли 75 мкс задержки при записи или чтении? приведите все задержки к нужным значениям, и все заработает. а не хотите - берите готовую библиотеку 1-wire и тупо пользуйтесь чужими наработками.
эту картинку уже до дыр насмотрел))) и статейку читал.
парюсь я не над тем,чтоб разового попользоваться, а цель все досконально изучить и самому с нуля все написать....чужими наработками пользоваться неэффективно для обучения!

75 мкс это мой выбор в заданном интервале. даже на картинке написано что тайм-слот записи "0" от 60 мкс до 120 мкс вот мои 75 и находятся в заданном диапазоне или я не так чет понимаю?

вот с интернета еще нарыл
Write 1. Master переводит шину в состояние лог. 0 на время от 1 до 15 мкс. Затем master отпускает шину на оставшееся время слота.
Write 0. Этот сигнал показан на рис. 2. Master переводит шину в состояние лог. 0 на время как минимум 60 мкс, но не дольше 120 мкс.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение Аlex »

ROMan2947 писал(а):но в ответ тишина
Дак он сам и не будет отвечать. Нужно FF-ки ему посылать, после передачи команды. Протокол почитайте внимательнее.

Код: Выделить всё

init();
 write_byt(0x33);
 for(i=0;i<8;i++){  // Читаем 8 бат данных
   write_byt(0xFF);
 }
С тайм-слотами, на первый взгляд, всё в порядке.
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Re: Всё по DS18(B/S)20.

Сообщение ROMan2947 »

Аlex писал(а):
ROMan2947 писал(а):но в ответ тишина
Дак он сам и не будет отвечать. Нужно FF-ки ему посылать, после передачи команды. Протокол почитайте внимательнее.

Код: Выделить всё

init();
 write_byt(0x33);
 for(i=0;i<8;i++){  // Читаем 8 бат данных
   write_byt(0xFF);
 }
С тайм-слотами, на первый взгляд, всё в порядке.
спасибо за направление, попробую сейчас :wink:
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Re: Всё по DS18(B/S)20.

Сообщение ROMan2947 »

Аlex писал(а):
ROMan2947 писал(а):но в ответ тишина
Дак он сам и не будет отвечать. Нужно FF-ки ему посылать, после передачи команды. Протокол почитайте внимательнее.

Код: Выделить всё

init();
 write_byt(0x33);
 for(i=0;i<8;i++){  // Читаем 8 бат данных
   write_byt(0xFF);
 }
С тайм-слотами, на первый взгляд, всё в порядке.
ответ от датчика получен) спасибо большое!!! :lol:
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Re: Всё по DS18(B/S)20.

Сообщение ROMan2947 »

Здравствуйте!!

1) датчик высылает один и то же код температуры при разрешении 9 бит и 12 бит. в чем существенный смысл разрешения,кто подскажет?
2) 5 старших битов старшего байта температуры они в любых случаях одинаковые? то есть разработчики по идее выделили на знак температуры 5 битов?
Последний раз редактировалось ROMan2947 Ср янв 11, 2017 18:57:35, всего редактировалось 1 раз.
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение Zhuk72 »

1. Может конфигурацию неправильно задаете.
Как выставляете 9-битный режим? Последовательность команд какая?
Смысл в том, что при приемлемом разрешении в 0.5*С на конвертацию затрачивается почти на порядок меньше времени, чем в случае 12-битного режима.

2. Имеете в виду старшие 5 бит старшего байта температуры? Они всегда определяют знак температуры.
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Re: Всё по DS18(B/S)20.

Сообщение ROMan2947 »

Zhuk72 писал(а):Может конфигурацию неправильно задаете.
Как выставляете 9-битный режим? Последовательность команд какая?

инициализация;
write_byt(0xCC);пропуск ROM\
write_byt(0x1F); четвертый байт пишу 0x1F
write_byt(0x48); копирую

Добавлено after 1 minute 57 seconds:
Zhuk72 писал(а):1. Может конфигурацию неправильно задаете.
Как выставляете 9-битный режим? Последовательность команд какая?
Смысл в том, что при приемлемом разрешении в 0.5*С на конвертацию затрачивается почти на порядок меньше времени, чем в случае 12-битного режима.

2. Имеете в виду старшие 5 бит старшего байта температуры? Они всегда определяют знак температуры.
да их и имею, вопрос был для чего нужно 5 бит для знака???? когда можно было выделить один бит...разработчик так захотели или еще как то могут использоваться данные биты?
Последний раз редактировалось ROMan2947 Ср янв 11, 2017 18:56:25, всего редактировалось 1 раз.
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение Zhuk72 »

1. У меня такая последовательность:

Код: Выделить всё

    send_ds(0xCC); // Skip ROM
    send_ds(0x4E); // Write Scratchpad
    send_ds(0x00); // TH alarm
    send_ds(0x00); // TL alarm
    send_ds(0x1F); // Config.
    init_ds();
    send_ds(0xCC); // Skip ROM
    send_ds(0x48); // Copy Scratchpad
    delay_ms(10);  // Time required for writing to EEPROM.
2. Да, так уж разработчик захотел.
Все равно биты эти пустые, ну так пусть все и будут знаковыми.
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Re: Всё по DS18(B/S)20.

Сообщение ROMan2947 »

[quote="Zhuk72"]1. У меня такая последовательность:

Код: Выделить всё

    send_ds(0xCC); // Skip ROM
    send_ds(0x4E); // Write Scratchpad
    send_ds(0x00); // TH alarm
    send_ds(0x00); // TL alarm
    send_ds(0x1F); // Config.
    init_ds();
    send_ds(0xCC); // Skip ROM
    send_ds(0x48); // Copy Scratchpad
    delay_ms(10);  // Time required for writing to EEPROM.

по поводу пишется или нет, сомнений нет. так как данные всех байтов ROM я вывел на порт к которым подключил светодиоды, т. е. визуально вижу какой код записан в каждом байте. сравнил коды при разных режимах разрешения они оказались идентичными,вот мне и стало не понятно... он должен быть разным или нет?
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение Zhuk72 »

ROMan2947 писал(а): инициализация;
write_byt(0xCC);пропуск ROM\
write_byt(0x1F); четвертый байт пишу 0x1F
write_byt(0x48); копирую
Что вы выводите и как можете контролировать процессы ВНУТРИ датчика я не представляю.
Я же не для красоты выложил свои команды. То, что вы делаете (в цитате выше) - неправильно.
Посмотрите ДШ, там есть диаграмма, по которой и надо прошагать. Ну и читать описание работы внимательнее.
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Re: Всё по DS18(B/S)20.

Сообщение ROMan2947 »

Zhuk72 писал(а):
ROMan2947 писал(а): инициализация;
write_byt(0xCC);пропуск ROM\
write_byt(0x1F); четвертый байт пишу 0x1F
write_byt(0x48); копирую
Что вы выводите и как можете контролировать процессы ВНУТРИ датчика я не представляю.

я считываю регистр конфигурации и вывожу код на порт МК и с помощью лампочек смотрю, что там хранится. при 9 битном режиме мне выводит 00011111, а при 12 01111111, что тут не понятного!?

Добавлено after 5 minutes 35 seconds:
Zhuk72 писал(а):
ROMan2947 писал(а): инициализация;
write_byt(0xCC);пропуск ROM\
write_byt(0x1F); четвертый байт пишу 0x1F
write_byt(0x48); копирую
Что вы выводите и как можете контролировать процессы ВНУТРИ датчика я не представляю.
Я же не для красоты выложил свои команды. То, что вы делаете (в цитате выше) - неправильно.
Посмотрите ДШ, там есть диаграмма, по которой и надо прошагать. Ну и читать описание работы внимательнее.
по счет команд и кто как командует датчиком это отдельная тема...главный вопрос остается в стороне... при одной и той же температуре меняется ли двоичный код температуры в зависимости от разрешения?
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение Zhuk72 »

ROMan2947 писал(а):я считываю регистр конфигурации и вывожу код на порт МК и с помощью лампочек смотрю, что там хранится. при 9 битном режиме мне выводит 00011111, а при 12 01111111, что тут не понятного!?
Непонятно было первое описание процесса.
ROMan2947 писал(а):...главный вопрос остается в стороне... при одной и той же температуре меняется ли двоичный код температуры в зависимости от разрешения?
Измеряйте, выводите сырые данные при разных режимах и сравнивайте.
Можете и в Протеусе проверить, он эти датчики нормально симулирует.
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Re: Всё по DS18(B/S)20.

Сообщение ROMan2947 »

Zhuk72 писал(а):
ROMan2947 писал(а):я считываю регистр конфигурации и вывожу код на порт МК и с помощью лампочек смотрю, что там хранится. при 9 битном режиме мне выводит 00011111, а при 12 01111111, что тут не понятного!?
Непонятно было первое описание процесса.
ROMan2947 писал(а):...главный вопрос остается в стороне... при одной и той же температуре меняется ли двоичный код температуры в зависимости от разрешения?
Измеряйте, выводите сырые данные при разных режимах и сравнивайте.
Можете и в Протеусе проверить, он эти датчики нормально симулирует.
придется экспериментировать....ну тем интереснее)
спасибо!
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение Zhuk72 »

Я уже проверил в Протеусе при шаге датчика 0.0625*С.
При 9-битной конфигурации младшие 3 бита всегда в нуле.
Выход изменяется (начиная с бита 3), когда прирост достигает 0.5*С, т.е. через каждые 8 шагов.
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Ответить

Вернуться в «Периферия»