|
датчик ds18s20 точность измерения и разрешение. |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Mar 25 2006, 19:08
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
На схемах вывод DQ соединен с плюсом питания через резистор. А можно вместо него: Код DDRD=0x00; PORTD=0xFF; ? И еще вопрос - у меня датчик DS18b20 , в codevision пример на ds1820. Что надо поменять в программе? Я поменял family_code с 0x10 на 0x28, согласно мануалу. Резистор не подключал, а вставил код, как указано выше (ну нету под рукой резистора - магазины закрыты, до завтра не утерплю...). пытаюсь определить устройство: Код devices=w1_search(0xf0,rom_code); sprintf(s,"%u , DS1820\nDevice detected",devices); Устройство не определяется.
|
|
|
|
|
Apr 8 2006, 03:02
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Не могу запустить датчик DS18B20. Опишу картину. Вначале я подключилдатчик к микроконтроллеру ATMega8 и перепробовал из нескольких примеров код инициализации датчика. Не работало. Напомню сведения из DataSheet:
То есть, надо подать импульс 480 мкс,подождать 15-60 мкс, после чего последует импульс от датчика длиной 60-240 мкс. А мой контроллер не ловит этот импульс. Начинаю ковыряться, выясняю, что импульс от датчика есть, но следует ранее чем через 15 мкс.. и заканчивается ранее чем через 60 мкс. Подключаю осциллограф. Вот картина (прошу обратить внимание - инвертирована по сравнению с даташитом):
сразу же после тестового импульса появляется импульс датчика, очень короткий. То есть датчик отзывается, но как-то вяло. Дай-ка думаю, попробую его опросить. Посылаю код 0XF0 - поиск ROM code - отвечает гад - один бит выдает в линию. На остальные команды не реагирует.
Еще один немаловажный момент - в даташите написано - что тестовый импульс от микроконтроллера должен быть не менее 480 мкс. Вышеописанная осциллограмма наблюдается даже при 50 мкс. Вот фрагменты программы: Код #define DQW PORTD.0 #define DQR PIND.0 #define DQD DDRD.0
///////////////////////////
unsigned char ow_reset(void) {
unsigned char presence; DQW = 0; DQD = 1; delay_us(500); DQD = 0; delay_us(70); presence=DQD; delay_us(450); return(presence);
}
void main () { while (1) {
ow_reset(); write_byte(0xF0);
for(k = 0; k < 9; k++) { get[k] = read_byte(); }
} } Подключаю так:
Что посоветуете? Неисправность датчика? Не могу пока проверить - датчик один, а в магазинах обещают подвезти бог знает когда...
|
|
|
|
|
Apr 16 2006, 13:27
|
Участник

Группа: Новичок
Сообщений: 15
Регистрация: 13-04-06
Пользователь №: 16 093

|
Хм.. а у меня другая проблема:
Купил я датчик DS18b20 - снимаю с него показания программой, написанной под DS1820 - все без проблем.
Скачиваю из интернета код-пример под DS18b20 - запускаю... В общем форматирование строки согласно примерам из CodeVision, а именно:
printf("t%u=%+.3f\xf8C\n\r",i+1, ds18b20_temperature(&rom_codes[i++][0]));
или
sprintf(lcd_buffer,"t%u=%+.3f\xdfC",j++,ds18b20_temperature(&rom_code[i][0]));
выводит буквенно-цифровой бред на экран. И на изменение температуры показания на экране никак не реагируют.
Ставлю старый формат, как для DS1820 - sprintf(s,"t%u=%c%i.%u\xdfC",i,j,temp/10,temp%10); температуру показывает в 10 раз меньшую, но зато она хотя бы изменяется на экране.
Как правильно отформатировать строку?
Сообщение отредактировал ogogogogogogogogogo - Apr 16 2006, 13:28
|
|
|
|
|
Apr 16 2006, 16:16
|
Участник

Группа: Новичок
Сообщений: 15
Регистрация: 13-04-06
Пользователь №: 16 093

|
Простите, мне проще работать с тем, что уже есть. Я вывожу результат на индикатор. Вот код из ds18b20.lib: Код float ds18b20_temperature(unsigned char *addr) { unsigned char resolution; if (ds18b20_read_spd(addr)==0) return -9999; resolution=(__ds18b20_scratch_pad.conf_register>>5) & 3; if (ds18b20_select(addr)==0) return -9999; w1_write(0x44); delay_ms(conv_delay[resolution]); if (ds18b20_read_spd(addr)==0) return -9999; w1_init(); return (*((int *) &__ds18b20_scratch_pad.temp_lsb) & bit_mask[resolution])*0.0625; } То есть возвращает она вот чего: return (*((int *) &__ds18b20_scratch_pad.temp_lsb) & bit_mask Как это переварить? sprintf(s,"%f", temp) не выводит ничего.
|
|
|
|
|
Apr 17 2006, 16:40
|

Иногдящий
   
Группа: Свой
Сообщений: 691
Регистрация: 28-02-05
Пользователь №: 2 931

|
Цитата у вас на осцоллограмме импульс сброса почему то 1 а он то должен быть 0 Автор же предупредил, что осциллограмма инверитрована. Цитата Похоже что у вас звенит задний фронт Тоже врядли - слишком большой сигнал (да и задержка до него слишком большая).
|
|
|
|
|
Apr 17 2006, 18:26
|
Участник

Группа: Новичок
Сообщений: 15
Регистрация: 13-04-06
Пользователь №: 16 093

|
А по-моему у него та же проблема, что и у меня была - с кварцем. Все на вид правильно, однако стоит проверить , соответствуют ли временные задержки указанным. Если zheka не опытней, чем я, то он наверняка тоже CKSEL не прошил. А вот у меня другие проблемы. У же говорил, что код-пример из CodeVision Выдает буквенно-цифровой бред. Вот я выдрал код функции, измеряющей температуру: Код float ds18b20_temperature(unsigned char *addr) { unsigned char resolution; if (ds18b20_read_spd(addr)==0) return -9999; resolution=(__ds18b20_scratch_pad.conf_register>>5) & 3; if (ds18b20_select(addr)==0) return -9999; w1_write(0x44); delay_ms(conv_delay[resolution]); if (ds18b20_read_spd(addr)==0) return -9999; w1_init(); return (*((int *) &__ds18b20_scratch_pad.temp_lsb) & bit_mask[resolution])*0.0625; } Что-то я не вижу там обработки заявленного __ds18b20_scratch_pad.temp_msb (старшего байта). Нет его (temp_msb) упоминания и во всех других файлах имеющих отношение к демо-проекту. Может я не прав, конечно... Но если прав - объясните, как доработать функцию, чтобы она полностью обрабатывала ответ датчика.
Сообщение отредактировал ogogogogogogogogogo - Apr 17 2006, 18:32
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|