Всё по DS18(B/S)20.
- Gudd-Head
- Друг Кота
- Сообщения: 20091
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Всё по DS18(B/S)20.
Не проще ли просто взять DS1821? Её даже с компа можно запрограммировать.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
-
sanyo.95
- Нашел транзистор. Понюхал.
- Сообщения: 170
- Зарегистрирован: Вс мар 30, 2014 21:41:24
- Откуда: Украина
Re: Всё по DS18(B/S)20.
Спасибо, но этих датчиков у нас нет. Да и железка собрана уже...Gudd-Head писал(а):Не проще ли просто взять DS1821?
Re: Всё по DS18(B/S)20.
Вычитал из даташита по ds18b20 что после отправки команды 0x44 (Конвертирование температуры) датчик должен линию опустить в ноль пока датчик выполняет температурное преобразование , а по окончании поднять линию в 1.Так вот прикол состоит в том что он линию в 0 не опускает после 0x44 .При этом в программе я сделал так чтобы по 1 на линии шло считывание байтов температуры и самое интересное оно идет хотя как из даташита время конверсии при 9битном разрешении 93,75 мс .А у меня получается вообще без этой задержки.Или это время конверсии подругому рассчитывается?
- Gudd-Head
- Друг Кота
- Сообщения: 20091
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Всё по DS18(B/S)20.
Freerider писал(а):после отправки команды 0x44 (Конвертирование температуры) датчик должен линию опустить в ноль пока датчик выполняет температурное преобразование
Покажите где вы такой бред вычитали.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Всё по DS18(B/S)20.
Не правильно прочитали. Просто должен отвечать "0" на каждый посланный слот чтения. Т.е. посылаешь 00100010 и потом делаешь чтение (без сброса!) и должны возвращаться 0, пока идёт преобразование. Как только появилась "1" - преобразование закончено и можно делать сброс, чтобы заслать команду чтения скратчпада.
- Gudd-Head
- Друг Кота
- Сообщения: 20091
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Всё по DS18(B/S)20.
uldemir писал(а):Т.е. посылаешь 00100010
А мне казалось, просто дёргаешь линию — и если датчик не дёрнул в ответ, то преобразование закончилось.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Всё по DS18(B/S)20.
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
Re: Всё по DS18(B/S)20.
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.
uldemir писал(а):Посылаешь 00100010 - это команда 0х44 - конвертирование температуры.
Ну, значит мы друг друга недопоняли.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Всё по DS18(B/S)20.
Тогда вопрос про "временные интервалы считывания" сколько они по времени должны быть
- Gudd-Head
- Друг Кота
- Сообщения: 20091
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Всё по DS18(B/S)20.
http://open.e-voron.dp.ua/wp-content/up ... 20-rus.pdf
Стр. 15 рис. 14
Стр. 15 рис. 14
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Всё по DS18(B/S)20.
Freerider писал(а):Тогда вопрос про "временные интервалы считывания" сколько они по времени должны быть
трудности перевода... Вы же читаете температуру? ну вот так же и надо посылать команды чтения. Я их называю слот чтения (который ничем не отличается от слота записи лог.1).
Re: Всё по DS18(B/S)20.
Freerider писал(а):Тогда вопрос про "временные интервалы считывания" сколько они по времени должны быть
Я делал так:
раз в секунду по таймеру читаю данные температуры предыдущего замера, и тут же посылаю команду на следующее преобразование, выхожу из обработчика до следующего прерывания.
И все... одно отвлечение в секунду и переменная температуры всегда актуальна....
Re: Всё по DS18(B/S)20.
Да действительно надо было делать тайм слот для чтения состояния датчика.Теперь промежуток между командой 0x44 и новой инициал где то 78 мс (стоит 9 битное разрешение) хотя должно быть 93.75 мс.Все это проверяю в логическом анализаторе dx pro
Re: Всё по DS18(B/S)20.
shads писал(а):Freerider писал(а):Тогда вопрос про "временные интервалы считывания" сколько они по времени должны быть
Я делал так:
раз в секунду по таймеру читаю данные температуры предыдущего замера, и тут же посылаю команду на следующее преобразование, выхожу из обработчика до следующего прерывания.
И все... одно отвлечение в секунду и переменная температуры всегда актуальна....
Да просто хотелось не тупить с задержкой а опрашивать датчик чтоб как только так сразу его считывать
Re: Всё по DS18(B/S)20.
А смысл какой? Для скоростных применений этот датчик не подходит... а для визуального отображения температуры - нет смысла чаще одного раза в сек менять показания... да и программа меньше становится, если в прерывании по таймеру просто поднять флаг, а в основном цикле опрашивать этот флаг и инитить обмен...Freerider писал(а):как только так сразу его считывать
Re: Всё по DS18(B/S)20.
Господа! Помогите, чем сможете.
Ситуация.
Пытаюсь читать DS18B20 (так на нем написано).
Не читается.
Собрал программу:
Оговорюсь - Это куски. В остальной части она чего-то пишет (корректно) в LCD.
В результате я хотел получить периодический сигнал, который был-бы импульсом сброса и вызывал-бы ответ датчика. Посмотрел по осциллографу, напряжение просаживается на 640мкСек, а ответа нет.
Вопрос - Я чего-то делаю неправильно, или датчик кривой.
Если я чего пропустил в описании важного, извиняйте, спрашивайте.
ЗЫ. Пробовал другой датчик, такой-же результат тот-же.
С уважением Николай.
Ситуация.
Пытаюсь читать 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.
Судя по приведённому коду вы пропустили очень много важного, например посылку команд и чтение данных в т.ч.
Re: Всё по DS18(B/S)20.
Про данные речи пока не идет. Я хочу, чтобы датчик ответил импульсом присутствия. Я что то понял не правильно и датчик, в ответ, не должен просадить сигнал до нуля?
С уважением, Николай.
С уважением, Николай.
- Gudd-Head
- Друг Кота
- Сообщения: 20091
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Всё по DS18(B/S)20.
Должен. В ответ на Reset датчик должен послать Presense.
Зачем такая простыня кода чтобы дёрнуть ногой, а потом считать значение, я не понимаю.
Зачем такая простыня кода чтобы дёрнуть ногой, а потом считать значение, я не понимаю.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]