Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить

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

Вс янв 08, 2017 01:38:08

Глянул хелп на CV, в 1-Wire библиотеке есть функция
unsigned char w1_crc8(void *p, unsigned char n)
Она расчитывает контрольную сумму.
Можете её заюзать.

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

Вс янв 08, 2017 01:49:45

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

Сейчас я для расчёта использую встроенную в avr-libc функцию, раньше использовал самописную. Может, пригодится.

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

Вс янв 08, 2017 20:19:51

Приветствую!
прошу помочь выпросить у сей девайса хоть какие-нибудь данные. наблюдаю за шиной с помощью осциллографа, импульс присутствия имеется, байт кода команды так же вырисовывается.но в ответ тишина :(
#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;
//}


}

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

Вс янв 08, 2017 20:29:53

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.

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

Вс янв 08, 2017 20:38:06

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.


так-то я знаю, что проблема в тайм-слотах,задолбался втыкать в эти графики, от этого и пришел сюды. по счет чтения это отдельная тема! с записью что не так?

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

Вс янв 08, 2017 21:41:33

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

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

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

Вс янв 08, 2017 21:57:06

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 мкс.

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

Вс янв 08, 2017 22:49:07

ROMan2947 писал(а):но в ответ тишина
Дак он сам и не будет отвечать. Нужно FF-ки ему посылать, после передачи команды. Протокол почитайте внимательнее.
Код:
init();
 write_byt(0x33);
 for(i=0;i<8;i++){  // Читаем 8 бат данных
   write_byt(0xFF);
 }


С тайм-слотами, на первый взгляд, всё в порядке.

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

Пн янв 09, 2017 09:08:57

Аlex писал(а):
ROMan2947 писал(а):но в ответ тишина
Дак он сам и не будет отвечать. Нужно FF-ки ему посылать, после передачи команды. Протокол почитайте внимательнее.
Код:
init();
 write_byt(0x33);
 for(i=0;i<8;i++){  // Читаем 8 бат данных
   write_byt(0xFF);
 }


С тайм-слотами, на первый взгляд, всё в порядке.


спасибо за направление, попробую сейчас :wink:

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

Пн янв 09, 2017 20:33:20

Аlex писал(а):
ROMan2947 писал(а):но в ответ тишина
Дак он сам и не будет отвечать. Нужно FF-ки ему посылать, после передачи команды. Протокол почитайте внимательнее.
Код:
init();
 write_byt(0x33);
 for(i=0;i<8;i++){  // Читаем 8 бат данных
   write_byt(0xFF);
 }


С тайм-слотами, на первый взгляд, всё в порядке.


ответ от датчика получен) спасибо большое!!! :lol:

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

Ср янв 11, 2017 18:10:07

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

1) датчик высылает один и то же код температуры при разрешении 9 бит и 12 бит. в чем существенный смысл разрешения,кто подскажет?
2) 5 старших битов старшего байта температуры они в любых случаях одинаковые? то есть разработчики по идее выделили на знак температуры 5 битов?
Последний раз редактировалось ROMan2947 Ср янв 11, 2017 18:57:35, всего редактировалось 1 раз.

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

Ср янв 11, 2017 18:19:54

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

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

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

Ср янв 11, 2017 18:29:19

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 раз.

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

Ср янв 11, 2017 18:37:11

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. Да, так уж разработчик захотел.
Все равно биты эти пустые, ну так пусть все и будут знаковыми.

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

Ср янв 11, 2017 18:48:27

[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 я вывел на порт к которым подключил светодиоды, т. е. визуально вижу какой код записан в каждом байте. сравнил коды при разных режимах разрешения они оказались идентичными,вот мне и стало не понятно... он должен быть разным или нет?

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

Ср янв 11, 2017 19:13:57

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

Что вы выводите и как можете контролировать процессы ВНУТРИ датчика я не представляю.
Я же не для красоты выложил свои команды. То, что вы делаете (в цитате выше) - неправильно.
Посмотрите ДШ, там есть диаграмма, по которой и надо прошагать. Ну и читать описание работы внимательнее.

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

Ср янв 11, 2017 20:12:24

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); копирую

Что вы выводите и как можете контролировать процессы ВНУТРИ датчика я не представляю.
Я же не для красоты выложил свои команды. То, что вы делаете (в цитате выше) - неправильно.
Посмотрите ДШ, там есть диаграмма, по которой и надо прошагать. Ну и читать описание работы внимательнее.


по счет команд и кто как командует датчиком это отдельная тема...главный вопрос остается в стороне... при одной и той же температуре меняется ли двоичный код температуры в зависимости от разрешения?

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

Ср янв 11, 2017 20:31:20

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

Непонятно было первое описание процесса.

ROMan2947 писал(а):...главный вопрос остается в стороне... при одной и той же температуре меняется ли двоичный код температуры в зависимости от разрешения?

Измеряйте, выводите сырые данные при разных режимах и сравнивайте.
Можете и в Протеусе проверить, он эти датчики нормально симулирует.

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

Ср янв 11, 2017 20:41:50

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

Непонятно было первое описание процесса.

ROMan2947 писал(а):...главный вопрос остается в стороне... при одной и той же температуре меняется ли двоичный код температуры в зависимости от разрешения?

Измеряйте, выводите сырые данные при разных режимах и сравнивайте.
Можете и в Протеусе проверить, он эти датчики нормально симулирует.


придется экспериментировать....ну тем интереснее)
спасибо!

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

Ср янв 11, 2017 21:01:03

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