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

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

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

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

Не проще ли просто взять DS1821? Её даже с компа можно запрограммировать.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
sanyo.95
Нашел транзистор. Понюхал.
Сообщения: 170
Зарегистрирован: Вс мар 30, 2014 21:41:24
Откуда: Украина

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

Сообщение sanyo.95 »

Gudd-Head писал(а):Не проще ли просто взять DS1821?
Спасибо, но этих датчиков у нас нет. Да и железка собрана уже...
Аватара пользователя
Freerider
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Вс сен 06, 2009 20:17:20

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

Сообщение Freerider »

Вычитал из даташита по ds18b20 что после отправки команды 0x44 (Конвертирование температуры) датчик должен линию опустить в ноль пока датчик выполняет температурное преобразование , а по окончании поднять линию в 1.Так вот прикол состоит в том что он линию в 0 не опускает после 0x44 .При этом в программе я сделал так чтобы по 1 на линии шло считывание байтов температуры и самое интересное оно идет хотя как из даташита время конверсии при 9битном разрешении 93,75 мс .А у меня получается вообще без этой задержки.Или это время конверсии подругому рассчитывается?
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20091
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

Freerider писал(а):после отправки команды 0x44 (Конвертирование температуры) датчик должен линию опустить в ноль пока датчик выполняет температурное преобразование

Покажите где вы такой бред вычитали.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7357
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

Не правильно прочитали. Просто должен отвечать "0" на каждый посланный слот чтения. Т.е. посылаешь 00100010 и потом делаешь чтение (без сброса!) и должны возвращаться 0, пока идёт преобразование. Как только появилась "1" - преобразование закончено и можно делать сброс, чтобы заслать команду чтения скратчпада.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20091
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

uldemir писал(а):Т.е. посылаешь 00100010

А мне казалось, просто дёргаешь линию — и если датчик не дёрнул в ответ, то преобразование закончилось.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Freerider
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Вс сен 06, 2009 20:17:20

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

Сообщение Freerider »

Gudd-Head писал(а):
Freerider писал(а):после отправки команды 0x44 (Конвертирование температуры) датчик должен линию опустить в ноль пока датчик выполняет температурное преобразование

Покажите где вы такой бред вычитали.

Сей бред тут http://open.e-voron.dp.ua/wp-content/up ... 20-rus.pdf.
Просто по программе я делаю проверку после команды 0x44
sbic PORB,0
CLR Counter_Comand;
RET
Тут у меня либо программка выполняет основную задержку либо если датчик отконвертировал и выдал 1 на линию то я сбрасываю счетчик команд и у меня программка снова делает инициал датчика и чтения температуры его. Просто програмка у меня на основой задержке не зациклается на линии почему то датчик сразу выдает 1
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7357
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

Gudd-Head писал(а):
uldemir писал(а):Т.е. посылаешь 00100010

А мне казалось, просто дёргаешь линию — и если датчик не дёрнул в ответ, то преобразование закончилось.

не надо доёбываться до слов. Посылаешь 00100010 - это команда 0х44 - конвертирование температуры. Если "просто" дёргать шину - вообще нифига не будет. Это работает только сразу после команды конвертирования. Иначе, как бы другие устройства на шине могли бы работать?

Freerider писал(а):Сей бред тут http://open.e-voron.dp.ua/wp-content/up ... 20-rus.pdf.
Кстати, в даташите так и написано:
после посылки команды Convert T мастер может посылать временные интервалы считывания и DS18B20 ответят, выдавая 0 во время преобразования температуры,

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

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

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

uldemir писал(а):Посылаешь 00100010 - это команда 0х44 - конвертирование температуры.

Ну, значит мы друг друга недопоняли.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Freerider
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Вс сен 06, 2009 20:17:20

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

Сообщение Freerider »

Тогда вопрос про "временные интервалы считывания" сколько они по времени должны быть
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20091
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7357
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

Freerider писал(а):Тогда вопрос про "временные интервалы считывания" сколько они по времени должны быть

трудности перевода... Вы же читаете температуру? ну вот так же и надо посылать команды чтения. Я их называю слот чтения (который ничем не отличается от слота записи лог.1).
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

Freerider писал(а):Тогда вопрос про "временные интервалы считывания" сколько они по времени должны быть

Я делал так:
раз в секунду по таймеру читаю данные температуры предыдущего замера, и тут же посылаю команду на следующее преобразование, выхожу из обработчика до следующего прерывания.

И все... одно отвлечение в секунду и переменная температуры всегда актуальна....
Аватара пользователя
Freerider
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Вс сен 06, 2009 20:17:20

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

Сообщение Freerider »

Да действительно надо было делать тайм слот для чтения состояния датчика.Теперь промежуток между командой 0x44 и новой инициал где то 78 мс (стоит 9 битное разрешение) хотя должно быть 93.75 мс.Все это проверяю в логическом анализаторе dx pro
Аватара пользователя
Freerider
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Вс сен 06, 2009 20:17:20

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

Сообщение Freerider »

shads писал(а):
Freerider писал(а):Тогда вопрос про "временные интервалы считывания" сколько они по времени должны быть

Я делал так:
раз в секунду по таймеру читаю данные температуры предыдущего замера, и тут же посылаю команду на следующее преобразование, выхожу из обработчика до следующего прерывания.

И все... одно отвлечение в секунду и переменная температуры всегда актуальна....

Да просто хотелось не тупить с задержкой а опрашивать датчик чтоб как только так сразу его считывать
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

Freerider писал(а):как только так сразу его считывать
А смысл какой? Для скоростных применений этот датчик не подходит... а для визуального отображения температуры - нет смысла чаще одного раза в сек менять показания... да и программа меньше становится, если в прерывании по таймеру просто поднять флаг, а в основном цикле опрашивать этот флаг и инитить обмен...
nnikolaoo
Родился
Сообщения: 5
Зарегистрирован: Вт ноя 25, 2014 13:47:16

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

Сообщение nnikolaoo »

Господа! Помогите, чем сможете.
Ситуация.
Пытаюсь читать DS18B20 (так на нем написано).
Не читается.
Собрал программу:

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

#define ONEWIRE_PORT PORTC
#define ONEWIRE_DDR DDRC
#define ONEWIRE_PIN PINC
#define ONEWIRE_PIN_NUM 0 //нога PC1 N22

inline void onewire_low() {// Устанавливает низкий уровень на шине 1-wire
   ONEWIRE_DDR |= (1<<ONEWIRE_PIN_NUM);
}

inline void onewire_high() {// "Отпускает" шину 1-wire
   ONEWIRE_DDR &= ~(1<<ONEWIRE_PIN_NUM);
}

inline uint8_t onewire_level() {// Читает значение уровня на шине 1-wire
   return ONEWIRE_PIN & (1<<ONEWIRE_PIN_NUM);
}

// Определения и функции ниже нужны только если требуется "сильный" подтягивающий резистор
#define ONEWIRE_STRONG_DDR DDRC
#define ONEWIRE_STRONG_PORT PORTC
#define ONEWIRE_STRONG_PIN_NUM 1 //нога PC1 N23

void onewire_strong_enable() {// включение "сильной" подтяжки
  ONEWIRE_STRONG_PORT |= (1<<ONEWIRE_STRONG_PIN_NUM);// Для исключения низкого уровня на шине, сначала изменяется регистр значения
  ONEWIRE_STRONG_DDR |= (1<<ONEWIRE_STRONG_PIN_NUM);// затем - регистр направления
}


void onewire_strong_disable() {// отключение "сильной" подтяжки
  ONEWIRE_STRONG_DDR &= ~(1<<ONEWIRE_STRONG_PIN_NUM);// Для исключения низкого уровня на шине, сначала изменяется регистр направления
  ONEWIRE_STRONG_PORT &= ~(1<<ONEWIRE_STRONG_PIN_NUM);// затем - регистр значения
}

// Выдаёт импульс сброса (reset), ожидает ответный импульс присутствия.
// Если импульс присутствия получен, дожидается его завершения и возвращает 1, иначе возвращает 0
uint8_t onewire_reset(){
   onewire_low(); //проваливает уровень
   _delay_us(640); // Пауза 480..960 мкс
   onewire_high(); // поднимает в единицу
   _delay_us(2); // Время необходимое подтягивающему резистору, чтобы вернуть высокий уровень на шине
   for (uint8_t c = 80; c; c--) {// Ждём не менее 60 мс до появления импульса присутствия;
      if (!onewire_level()) {
         // Если обнаружен импульс присутствия, ждём его окончания
         while (!onewire_level()) { } // Ждём конца сигнала присутствия
         return 1;
      }
      _delay_us(1);
   }//   for (uint8_t c = 80; c; c--) {// Ждём не менее 60 мс до появления импульса присутствия;
   return 0;
}

int main(void){
   while(1)
   {
        _delay_us(4000);   
        onewire_reset();
        };
}



Оговорюсь - Это куски. В остальной части она чего-то пишет (корректно) в LCD.
В результате я хотел получить периодический сигнал, который был-бы импульсом сброса и вызывал-бы ответ датчика. Посмотрел по осциллографу, напряжение просаживается на 640мкСек, а ответа нет.
Вопрос - Я чего-то делаю неправильно, или датчик кривой.
Если я чего пропустил в описании важного, извиняйте, спрашивайте.
ЗЫ. Пробовал другой датчик, такой-же результат тот-же.
С уважением Николай.
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

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

Сообщение uk8amk »

Судя по приведённому коду вы пропустили очень много важного, например посылку команд и чтение данных в т.ч.
nnikolaoo
Родился
Сообщения: 5
Зарегистрирован: Вт ноя 25, 2014 13:47:16

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

Сообщение nnikolaoo »

Про данные речи пока не идет. Я хочу, чтобы датчик ответил импульсом присутствия. Я что то понял не правильно и датчик, в ответ, не должен просадить сигнал до нуля?
С уважением, Николай.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20091
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

Должен. В ответ на Reset датчик должен послать Presense.
Зачем такая простыня кода чтобы дёрнуть ногой, а потом считать значение, я не понимаю.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Ответить

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