Страница 4 из 5
Добавлено: Пт фев 29, 2008 11:42:52
Mozart
вообще-то почитайте доку... и запишите в регистры TH & TL другие значения... и посмотрите что получится...
потом я не нашёл как переводить датчик в термостат... вот именно в доке на ds18b20... значит делаем вывод, что TH & TL это есть диапазон измеряемых температур...
Добавлено: Пт фев 29, 2008 11:57:50
ARV
Mozart писал(а):потом я не нашёл как переводить датчик в термостат... вот именно в доке на ds18b20... значит делаем вывод, что TH & TL это есть диапазон измеряемых температур...
DS18B20 не надо переводить в режим термостата. этот режим всегда включен и так. только понимается он извращенно: надо послать команду поиска адресов датчиков, у которых сработал Alarm (т.е. температура вышла за преджелы TH-TL), и тогда сработавшие ответят... бред какой-то...
Добавлено: Пт фев 29, 2008 13:03:17
Mozart
DS18B20 не надо переводить в режим термостата. этот режим всегда включен и так. только понимается он извращенно: надо послать команду поиска адресов датчиков, у которых сработал Alarm (т.е. температура вышла за преджелы TH-TL), и тогда сработавшие ответят... бред какой-то...
да это всё ясно... и идея хорошая... и далеко не бред... единственно они могли бы сделать более быстрое преобразование не 750mS а хотя бы 100...
и ещё на сколько ему можно доверять?... вот это проверить бы ещё...
кто проверит скажите...
Добавлено: Пт фев 29, 2008 13:32:35
ARV
я где-то читал, что датчики эти внесены в госреестр средств измерений, так что получается, верить им можно...
ATmega + DS18B20
Добавлено: Сб мар 22, 2008 21:58:56
traun
Всем здраствуйте, просьба заранее не пинать.
У меня вопрос к тем кто умеет работать с DS18B20.
Написал вот такую программу для работы с этим термодатчиком:
Код: Выделить всё
Код:
Chip type : ATmega8535
Program type : Application
Clock frequency : 1,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 128
*****************************************************/
#include <mega8535>
#include <wh>
#asm
.equ __w1_port=0x1B ;PORTA
.equ __w1_bit=1
#endasm
#include <1wire>
#include <ds1820>
#include <stdlib>
/* maximum number of DS18B20 connected to the bus */
#define MAX_DEVICES 6
unsigned char rom_codes[MAX_DEVICES][9];
void Init_ports(void) // Указываем необходимые порты как выходы
{
DDRD=0b11111111;
DDRC=0b00000111;
DDRA=0b11111111;
}
char str1[16]="end";
char str[]=" Dev found";
char devices;
//-----------------------MAIN ---------------------
void main(void)
{
Init_ports();
lcd_init();
/* detect how many DS18B20 devices
are connected to the bus and
store their ROM codes in the rom_codes array */
//lcd_putsxy(5,0,st_do);
#asm("cli");
devices=w1_search(0xf0,rom_codes);
#asm("sei");
if (devices>0) {
lcd_clear();
lcd_puts(str);
}
lcd_putsxy(5,0,str1);
while (1)
{
};
}
как видите в теории вроде все правильно, если нет то поправте меня.
К порту А на 1 контакт вешаю датчик выводом DQ, GND - земля, и еще +5 волт на Vdd, а так же сопротивлятор между DQ и Vdd на 4.7 кОм. Вроде бы тоже все верно, если что не правильно - поправьте.
Так вот, при включении питания мега виснет при поиске датчика, почему не знаю, помоги плиз. И еще если резистор отключить то на экране дисплеея сразу получаю end, типо прога работать закончила.
А при запросе температуры получаю -9999.
Помогите пожалуйста советом как все таки правильно работать с этим датчиком и что я сделал не так.
Добавлено: Сб мар 22, 2008 22:03:08
Mozart
ну ёпрст... конечно она у вас будет виснуть... потому что прерываний у вас нет... ну я по крайне мере их не увидел... а второе в цикле while(1) надо что-то написать...
а в третьих она у вам не виснит просто выполняет не известные вам инструкции...
Добавлено: Сб мар 22, 2008 22:22:45
traun
Прерываний у меня в программе нету, на что они должны срабатывать? Все делал как в примере cvavr. Можете тогда продемонстрировать полностью рабочую прогу?
Добавлено: Сб мар 22, 2008 22:26:54
Mozart
Код: Выделить всё
/* detect how many DS18B20 devices
are connected to the bus and
store their ROM codes in the rom_codes array */
//lcd_putsxy(5,0,st_do);
#asm("cli");
devices=w1_search(0xf0,rom_codes);
#asm("sei");
if (devices>0) {
lcd_clear();
lcd_puts(str);
}
lcd_putsxy(5,0,str1);
вот это вота надо запихать вот сюда
точнее вот сюда
Добавлено: Сб мар 22, 2008 22:36:44
traun
Тогда может лучше вот так, типа пока не найдено хотя бы одно устройство - искать...
Код: Выделить всё
whie(!devices) {
/* detect how many DS18B20 devices
are connected to the bus and
store their ROM codes in the rom_codes array */
//lcd_putsxy(5,0,st_do);
#asm("cli");
devices=w1_search(0xf0,rom_codes);
#asm("sei");
if (devices>0) {
lcd_clear();
lcd_puts(str);
}
}
lcd_putsxy(5,0,str1);
Добавлено: Сб мар 22, 2008 22:44:02
Mozart
Тогда может лучше вот так, типа пока не найдено хотя бы одно устройство - искать...
это ваше личное дело... но работать так не будет...
ну найдёт устройство хотф бы одно два три не важно... а дпльше что??? нарисуйте себе алгоритм...
з.ы. читайте книги по Си...!!! ибо ответ на этот вопрос можно найти в книге...
Добавлено: Сб мар 22, 2008 22:49:09
traun
Ясно, за совет про алгоритм спасибо.
Это просто начальная стадия, дальше будет цикл где будет считываться информация с датчика и воводится на дисплей.
Ну скажем раз в секунду...
Добавлено: Сб мар 22, 2008 22:55:21
Mozart
вообще я что-то похожее не давно делал... я сделал на прерывании по таймеру...
Добавлено: Сб мар 22, 2008 23:36:54
traun
Только что переписал код, как выше, зашил, но результат тот же...
МК в ступоре, я тоже. он по прежнему не находит не одного устройства, оно кстати всего одно...
Виснет на строчке:
Добавлено: Сб мар 22, 2008 23:40:26
Mozart
у вас джтаг есть?
покажите функцию... w1_search(0xf0,rom_codes);
Добавлено: Сб мар 22, 2008 23:44:17
traun
Mozart писал(а):у вас джтаг есть?
покажите функцию... w1_search(0xf0,rom_codes);
функция стандартная из библиотеки 1-wire, что такое джтаг? Я с мк работаю всего пару месяцев...
Добавлено: Сб мар 22, 2008 23:56:19
Mozart
я не телепат... что такое 0xF0 и rom_codes в этой функции??
и как работает ваша стандартная функция я тоже не знаю.
потом вы уверены что собрали свою конструкцию прально?? точно ничего не перепутали?
порты правильно настроили??? напишите ещё на всякий случай PORTx =0x00;
а ЖК работает?
джтаг что такое?? смотрите на сайте
www.atmel.com
ну и писатель же вы!!!
вместо этого...
Код: Выделить всё
if (devices>0) {
lcd_clear();
lcd_puts(str);
}
lcd_putsxy(5,0,str1);
напишите это
Код: Выделить всё
if (devices>0) {
lcd_clear();
lcd_puts(str);
}
else
lcd_putsxy(5,0,str1);
Добавлено: Вс мар 23, 2008 01:14:10
Mozart
заработало?
Добавлено: Вс мар 23, 2008 07:19:22
traun
Устройство собрано верно... проверил несколько раз. Если убрать строку поиска датчика, то на него сразу выводится END. так что все тут в порядке... Но работать все равно не хочет... Сегодня попробую реализовать Функцию поиска датчика самостоятельно... Наткнулся вчера на статью ARV, хотя может даже просто датчик дохлый...
Добавлено: Вс мар 23, 2008 13:06:54
Mozart
напишите вот так ...
Код: Выделить всё
if (devices > 0) {
lcd_clear();
lcd_puts(str);
}
else
lcd_putsxy(5,0,str1);
добавьте
else почле if(devices > 0)
а то ваша прога опред датчик после вывода str она выводит str1
Добавлено: Вс мар 23, 2008 15:42:37
traun
Mozart писал(а):напишите вот так ...
Код: Выделить всё
if (devices > 0) {
lcd_clear();
lcd_puts(str);
}
else
lcd_putsxy(5,0,str1);
добавьте
else почле if(devices > 0)
а то ваша прога опред датчик после вывода str она выводит str1
Мой термометр заработал....
Дело было вовсе не в программе, а как раз наооборот в аппаратной части...
Когда я первый раз подключал этот датчик к Мк, я не правильно подпаял сам датчик и подтягивающий резистор...
Датчик сгорел... свою ошибку я понял, но вот совсем не подумал о том, что мог сгореть и порт... Что в последствии я и обнаружил.

Тогда я прошил новый МК, все заработало почти сразу...
