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

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
evgenich
Родился
Сообщения: 14
Зарегистрирован: Чт дек 06, 2012 20:20:29
Откуда: Питер
Контактная информация:

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

Сообщение evgenich »

Не получается заставить работать поиск. Приём-отправка-конвертирование температуры работает, а вот с поиском - беда какая-то... Я использовал готовый пример от karve (430oh.com). С одним отличием. Может быть, в нём всё дело. У karve использовался внешний резистор подтяжки, он пишет, что используя внутренний, - у него плохо работало "отпускание" линии. У меня нормально и без внешнего резистора завелось, я нашёл какой-то косяк в его библиотеке, но сейчас уже не помню, в чём он был.
ссылка на мой проект

Спойлер

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

void ow_search(uint8_t *id, int depth, int reset)
{
  int i, b1, b2, f;

  if (depth == 64)  {
    // we have all 64 bit in this ow_search branch
     uart_WriteString("found: ");
    for (i = 0; i < 8; i++) {
       uart_WriteString("%02x");
       uart_putchar(id[i]);
    }

    uart_WriteString("\n");
    return;
  }

  if (reset) {
    if (f = ow_reset()) {
       uart_WriteString("reset failed\n");

       if (f == 1) {
          uart_WriteString("not pulldown\n");
       }
       if (f == 2) {
          uart_WriteString("must be released\n");
        }
       return;
    }
  }
    ow_write_byte(DS1820_SEARCHROM); // ow_search ROM command

    // send currently recognized bits
    for (i = 0; i < depth; i++)
    {
      b1 = ow_read_bit();
      b2 = ow_read_bit();
      ow_write_bit(id[i / 8] & (1 << (i % 8)));
    }

  // check another bit
  b1 = ow_read_bit();
  b2 = ow_read_bit();
  if (b1 && b2) {
     uart_WriteString("no response to search\n");
     return; // no response to ow_search
  };
  if (!b1 && !b2) // two devices with different bits on this position
  {
    // check devices with this bit = 0
    ow_write_bit(0);
    id[depth / 8] &= ~(1 << (depth % 8));
    ow_search(id, depth + 1, 0);
    // check devices with this bit = 1
    id[depth / 8] |= 1 << (depth % 8);
    ow_search(id, depth + 1, 1); // different branch, reset must be issued
  } else if (b1) {
    // devices have 1 on this position
    ow_write_bit(1);
    id[depth / 8] |= 1 << (depth % 8);
    ow_search(id, depth + 1, 0);
  } else if (b2) {
    // devices have 0 on this position
    ow_write_bit(0);
    id[depth / 8] &= ~(1 << (depth % 8));
    ow_search(id, depth + 1, 0);
  }
}


Здесь добавлены проверки на наличие устройств, все сообщения отсылаются в порт. Это всё работает. А поиск - нет :(
evgenich
Родился
Сообщения: 14
Зарегистрирован: Чт дек 06, 2012 20:20:29
Откуда: Питер
Контактная информация:

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

Сообщение evgenich »

хм... может быть, - попробовать убрать эти лишние проверки... наверняка они рушат временнЫе параметры кода...
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

ow_read_bit не увидел чему равен - это раз
2. Если уж Вы работаете с USART , то он никогда не пришлёт Вам "чистый ноль" поэтому проверять на ноль бесполезно , ноль проверяется на отсутствие единицы.
Правда asm , но всё понятно

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

;+ Получаемые данные не соответсвуют нормальному представлению человека о нуле,
;+ Все данные не равные 0xFF - это ноль. А 0xFF - единица
SEARCH_VALUE_BIT:
      cpse   temp1,FULL            ;| Приводим состояние temp1 и темр к принятому в обществе нулю
      mov      temp1,zero            ;| т.е. если не 0xFF записываем 0x00
      cpse   temp,Full            
      mov      temp,zero
Аватара пользователя
Ckfdf
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Ср ноя 28, 2012 07:09:50
Откуда: Казахстан, Алматы
Контактная информация:

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

Сообщение Ckfdf »

Имеется код в Code VisionAVR

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

w1_init();
    w1_write(0xСС);
    w1_write(0x44);
    delay_us(120);
    w1_init();
    w1_write(0xСС);
    w1_write(0xBE);
   
   
    temper=w1_read();                //формирование полученного значения температуры temper определена как int
    temper=((w1_read())<<8)+temper;

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

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

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

Хочу подключить еще один датчик,
Подключить куда ? К другому выводу или на один ПИН повесить ?

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

delay_us(120);
Это откуда такие цифры ? Время преобразования температуры ~750 миллисекунд, для DS18B20.
Аватара пользователя
Ckfdf
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Ср ноя 28, 2012 07:09:50
Откуда: Казахстан, Алматы
Контактная информация:

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

Сообщение Ckfdf »

Этот код я взял из хэлпа MikroC Pro for Pic, но в Code VisionAVR все работает нормально, откуда взялось значение 120 не знаю(изменял значение-не влияет), пытался в начале разобраться, но потом как-то плавно отклонился и не возвращался к вопросу. Датчики планирую подключить на один вывод.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

120us - это мало. Нужно >=750Ms. Обычно, делают 1 сек.
Что за хелп, покажите где это написано ?
Датчики планирую подключить на один вывод.
Тогда Вам нужно разбираться с поиском. И обращаться к каждому датчику по-отдельности, через его ID.
Аватара пользователя
Ckfdf
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Ср ноя 28, 2012 07:09:50
Откуда: Казахстан, Алматы
Контактная информация:

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

Сообщение Ckfdf »

Что-то не получается вложить хелп.
Про поиск я понял, я не могу код реализовать.
Если я правильно понял, алгоритм такой:
1.Команда сброса.
2.Соответствие ROM w1_write(0x55);
3.Выдать ROM Датчика
4.Команда чтния температуры w1_write(0x44);
Так вот я и не знаю как считать ROM. Предполагаю, нужно что-то типа:

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

w1_init();
w1_write(0xF0); //Поиск ROM

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

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

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

Не всё так просто. Почитайте, как реализуется поиск РОМ. Там одной командой не отделаешься.
Или найдите пример с поиском и поизучайте его.
Аватара пользователя
Ckfdf
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Ср ноя 28, 2012 07:09:50
Откуда: Казахстан, Алматы
Контактная информация:

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

Сообщение Ckfdf »

Так в том и проблема, что пока я находил примеры, использующие стандартные библиотеки.
Судя по даташиту для 2-х датчиков нужно запускать 2 команды поиска ROM, но куда и как этот Rom записывать.
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

2-х датчиков нужно запускать 2 команды поиска ROM, но куда и как этот Rom записывать.

Всё несколько хуже. Там ещё потребуются 128 раз читать биты из DS , только для одного датчика. А затем повторить процедуру для второго с учётом конфликтов.
Я здесь где-то выкладывал ANN187 на русском. Вот с него надо и начать. Там есть мелкие ошибки , но на алгоритм это не влияет.
Аватара пользователя
Ckfdf
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Ср ноя 28, 2012 07:09:50
Откуда: Казахстан, Алматы
Контактная информация:

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

Сообщение Ckfdf »

Файл просмотрел. А разве там расписан не сам алгоритм команды F0h?
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

Если вы смотрели AN187 - то да, это и есть алгоритм
Аватара пользователя
Ckfdf
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Ср ноя 28, 2012 07:09:50
Откуда: Казахстан, Алматы
Контактная информация:

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

Сообщение Ckfdf »

То есть, код типа:

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

unsigned char RC[];//массив для записи РОМ кода датчика
unsigned char i;//переменная положения элемента массива
...
w1_init();
w1_write(0xF0);
w1_write(0xBE);
for(i=0;i<8;i++){
RC[i]=w1_read;}//чтение РОМ кода(если правильно)
//обращение к конкретному датчику с кодом записанным в RC
w1_init;
w1_write(0x55);
for(i=0;i<8;i++){
w1_write(RC[i]);}
w1_write(0x44);
delay_ms(800);
w1_write(0x55);
for(i=0;i<8;i++){
w1_write(RC[i]);}
w1_write(0xBE);
//дальше чтение температуры и вывод на дисплей

не подходит. Просто всю процедуру писать не реально!
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

Ckfdf писал(а):Просто всю процедуру писать не реально!

Считайте коды датчиков и вбейте их в прогу.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

То есть, код типа:

То , что Вы привели это не поиск датчиков , а чтение с них температуры. А чтобы читать с них температуру , надо знать их ROM-ID. Так , что он для Вас пока бесполезен.
А что бы знать их ROM надо делать поиск , хотя бы для одного датчика. Но , что бы написать поиск , надо почитать литературу указаную Вам выше.
Затем
Считайте коды датчиков и вбейте их в прогу.
metan
Вымогатель припоя
Сообщения: 593
Зарегистрирован: Ср янв 06, 2010 10:01:46

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

Сообщение metan »

Здравствуйте, уважаемые специалисты!
Есть проблема, совет ваш очень нужен.
Дано: простейший градусник -часы с бипером по критической температуре на ATmega8.
тактирование от внутреннего генератора 4МГц + часовой кварц на Timer 2
Питание 9В + встроенный стабилизатор 7805. Конденсаторы по питанию сухие и мокрые в наличии.
компилятор CodeVision V2.03.4.
Три датчика DS18B20 на PORTB.3 в цепочку, у последнего подтяжка 4,7кОм
Спаял сам девайс, припаял на проводочках датчики, отладил, все меряет, тикает и бибикает. Хорошо.
Собрал в корпус, перепаял датчики на шлейф (использовал 4 жильный обычный телефонный провод, обжал на конце RJ-11)
Провод из 3 кусков - 7, 10 и 5 м.
Включаю. Эпик фэйл: число датчиков = 0.
Отпаиваю 2 куска, оставляю только 7 м и один датчик, впаиваю к нему подтяжку. Включаю. Число датчиков = 0...1, (зависимости не нашел), температуру не меряет. Уменьшаю подтяжку до 2 КОм. Нифига не лучше.
Яростно чешу репу, гляжу свой код, читаю интернеты. Везде пишут, что даже на телефонной лапше должно работать.
Думаю, наверное задержки неточны, пробую повысить их точность, переключившись на 8 Мгц. Нифига не лучше.
Приношу кусок витой пары 25 м, подключаю через него (двумя свитыми парами). Число датчиков = 1 стабильно, но температуру меряет все равно нестабильно.
Теперь в тупике. Буду очень признателен, если кто-то что посоветует.

Весь проект прилагается.
bval_mega8_termoclock-3.zip
(110.38 КБ) 244 скачивания

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

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

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

Подтяжку сделайте у МК, а не у последнего датчика, и попробуйте её уменьшить - до 500 ОМ можете смело уменьшать.
По коду. Трудно что-то сказать, видя наполовину закрытый код.
metan
Вымогатель припоя
Сообщения: 593
Зарегистрирован: Ср янв 06, 2010 10:01:46

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

Сообщение metan »

Здравствуйте.
Аlex писал(а):Подтяжку сделайте у МК, а не у последнего датчика

Большое спасибо за быстрый ответ. К сожалению, данная мера увенчалась неудачей.
Вообще, у меня с этим проектом чепуха какая-то происходит. Вчерась колупался и наткнулся на следующее:
Питался девайс от 9В 300 мА нестабилизированного источника (транс, мост и конденсатор) напряжение холостого хода около 13В. На плате это питание подается сразу на стабилизатор 7805.
Подавал напряжение через обжатый RJ-11 (прозрачный телефонный штекер). Через второй такой же разъем витой парой подключен датчик. Думаю, дай попробую запитаться от стабилизированного источника (есть у меня старый добрый ИПС).
Выставил на ипсе 12 вольт, и так как обжатого провода больше никакого не нашел, а подпаиваться к плате не очень хотелось, подключил его через 7м телефонного четырехжильного. Включаю. Число датчиков = 0!!!. Припаиваюсь к плате напрямую - число датчиков = 1. Как такое может быть, даже в ум ничего не идет. Ну упало на проводе пусть 1 В, но там же на плате стабилизатор+ёмкости разные!
В выходные буду дальше лазить, наверное осцил придется из закромов доставать. Для начала проверю систему на возможные просадки/помехи.
Буду признателен за любые советы и рекомендации по лечению проекта.
Спасибо.
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

metan, а у вас с обеих сторон от 7805 конденсаторы стоят?
Желательно рядом с 7805 конденсаторы ставить. Как на входе, так и на выходе.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Ответить

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