Страница 1 из 2
помогите переделать, библиотеку ds18b20 под мои требования.
Добавлено: Чт ноя 11, 2010 23:10:23
O-LED
Значит по порядку.
Пишу в CVAVR. Использую термометр DS18B20. библиотеку работы с ней беру стандартную из CVAVR. Алгоритм работы у неё, как вы наверное знаете, следующий -
команда на измерение температуры - пауза(длительность зависит от точности измерения, до 750мкс) - чтение температуры.
Так вот, если просто делать какой термометр, то такой алгоритм вполне подходит. а вот если делать устройство посложней, которое постоянно чтото обрабатывает, и должно откликаться в режиме реального времени, то в момент паузы мы получаем "затык" в работе длинной 750мкс. Это очень сильно портит впечатление от работы устройства.
Что хотелось бы.
Хотелось бы иметь такую библиотеку, чтоб я сам мог дать команду на измерение, например ds18b20_convert(), потом сам, любым удобным мне способом, отсчитал нужную паузу(а в это время моя программа крутится в обычном режиме, без всяких "туплений"), а потом прочитал уже готовый результат например ds18b20_readTemp()
Полазив по инету, подходящей мне библиотеки не нашел. кругом примеры и обучалки на базе встроенной в CVAVR библиотеки.
Помогите найти, или изменить имеющуюся под мои требования. желательно чтоб она поддерживала несколько датчиков, (хотя это наверное не трудно добавить).
Спасибо.
Re: помогите переделать, библиотеку ds18b20 под мои требован
Добавлено: Пт ноя 12, 2010 08:26:36
ARV
на моем сайте есть проект "термостат - меньше не бывает", он с исходниками. там есть библиотечка для работы с 1-wire и с термодатчиками в том числе. вся работа ведется так, что реализовать задуманное вами - не представляет проблем. проблему для вас будет представлять то, что я писал библиотеку для WinAVR, и под закидоны вашего CVAVR вам самостоятельно придется ее адаптировать.
Re: помогите переделать, библиотеку ds18b20 под мои требован
Добавлено: Пт ноя 12, 2010 09:32:29
AndreiVV
вот под codevision
Re: помогите переделать, библиотеку ds18b20 под мои требован
Добавлено: Вс ноя 14, 2010 02:29:54
O-LED
Большущее спасибо,

особенно
AndreiVV за библиотеку. Впринципе это то что я искал, но как оказалось не совсем то что нужно. Конечно, отклик программы стал моментальным, но в момент чтения температуры появилось помиргивание индикаторов. Залез я тогда в lib , и нашел там запрет прерываний на время выполнения команд w1_write(0x44); и w1_init(); Ради эксперимента попробовал убрать запрет прерываний - и, о чудо, помиргивание естественно пропало. После этого я решил посмотреть увеличилось ли количество "ложных" ответов от дски. и к моему удивлению, сколько было, столько и осталось

так нафига мне эти запреты если нету разницы, подумал я, и оставил в таком виде. единственно сделал проверку на коректность чтения результата, и если он не корректен - это чтение игнорирую.
Так я получил то что хотел

Re: помогите переделать, библиотеку ds18b20 под мои требован
Добавлено: Вс ноя 14, 2010 23:35:43
Pavel V.
Если еще интересно, могу завтра выложить свою библиотеку для температурных датчиков. Правда, она на C++ написана, но перенести на "голый" C проблем не составит.
В протоколе 1-Wire важна длительность задержки только в начале формирования тайм-слота и составляет максимум 15 мкс при чтении бита. Остальные задержки не нормированы и должны составлять "не менее" некоторой величины. Соответственно, на это время запрещать прерывания не нужно.
Вот процедуры записи и чтения бита данных, здесь можно увидеть в каких местах и на сколько должны запрещаться прерывания.
Код: Выделить всё
template<uint16_t PORT, uint16_t PIN>
void OneWire<PORT, PIN>::WriteBit(uint8_t bit) {
uint16_t intState = __get_interrupt_state();
__disable_interrupt();
SetPinOutput();
SetPinLow();
DelayMks(2);
if(bit) {
SetPinInput();
}
__set_interrupt_state(intState);
DelayMks(70);
SetPinInput();
PullUpPin();
}
template<uint16_t PORT, uint16_t PIN>
uint8_t OneWire<PORT, PIN>::ReadBit(void) {
uint16_t intState = __get_interrupt_state();
__disable_interrupt();
SetPinOutput();
SetPinLow();
DelayMks(2);
SetPinInput();
PullUpPin();
DelayMks(13);
uint8_t result = IsPinLow() ? 0 : 1;
__set_interrupt_state(intState);
DelayMks(45);
return result;
}
Re: помогите переделать, библиотеку ds18b20 под мои требован
Добавлено: Пн ноя 15, 2010 00:01:48
O-LED
хоть я и решил проблему, но все равно интересно. конечно выложи, вдруг будет работать без ложных ответов.
Да и просто на будущее пусть будет.
Re: помогите переделать, библиотеку ds18b20 под мои требован
Добавлено: Пн ноя 15, 2010 00:15:39
Pavel V.
Ок, завтра выложу.
ПС
У меня проблем с получением ложных данных нет, хотя софтина работает под операционкой, а следовательно, функции работы с протоколом испытывают периодическое переключение контекста
Библиотека под MSP430, но перенести будет легко на любую платформу, надо только переписать функции, ответственные за ногодрыжество.
Re: помогите переделать, библиотеку ds18b20 под мои требован
Добавлено: Пн ноя 15, 2010 11:43:11
Pavel V.
Как обещал, вот библиотека.
Как работает:
- Первым делом надо произвести сканирование шины на наличие присоединенных устройств, найденные идентификаторы запоминаются с специальной табличке.
- Запустить преобразование температуры
- Считать результат
Как использовать в программе:
Код: Выделить всё
uint8_t oneWireCount = 0;
OneWire<6, 7>* oneWire;
Environment* env;
oneWire = new OneWire<6, 7>();
env = new Environment(oneWire);
oneWireCount = env->Search();
env->StartConversion();
Sleep(1000);
env->ReadTemp();
for (uint8_t i = 0; i < oneWireCount; ++i) {
int8_t temp = env->GetTemp(i);
}
У меня обрезается значение температуры после запятой, если надо полное значение, нужно переписать кусочек метода Environment::ReadTemp(void).
Также, не реализован сокращенный режим работы (SKIP ROM), когда подключено одно устройство и запись настроек в датчик. Там все просто, но не было необходимости.
Re: помогите переделать, библиотеку ds18b20 под мои требован
Добавлено: Пн ноя 15, 2010 11:51:41
ARV
ага, например для тини2313 применение динамического построения объектов в памяти и вообще собъектно-ориентированные программки - самое то, что требуется

Re: помогите переделать, библиотеку ds18b20 под мои требован
Добавлено: Пн ноя 15, 2010 12:04:36
O-LED
Pavel V. - спасибо. правда "переписать библиотеку" это пока не про меня.......
ARV хочу вас спросить, как знатного термометростроителя. какого минимального размера можно получить код для работы с дс18В20?? Например, нелюбимый вами кодевижн" генерит примерно 1,6кб кода только для работы с дской. в тоже время видел реализованные на тини2313 навороченные часы с термометром.
Спасибо.
Re: помогите переделать, библиотеку ds18b20 под мои требован
Добавлено: Пн ноя 15, 2010 12:12:27
Pavel V.
ARV писал(а):ага, например для тини2313 применение динамического построения объектов в памяти и вообще собъектно-ориентированные программки - самое то, что требуется

Для больших процессоров (и соответственно, больших приложений) применение C++ считаю оправданным. ОО-код именно для МК для меня новая сфера, только осваиваюсь. До этого на плюсах писал только для уж совсем больших процессоров

Re: помогите переделать, библиотеку ds18b20 под мои требован
Добавлено: Пн ноя 15, 2010 12:28:51
ARV
я не могу знать, что там кодвижн ваш делает и зачем, но примитивная программка-тест такого вида
Код: Выделить всё
int main(void){
while(1){
if(get_temperature(NULL) > 55)
PORTB |= _BV(PB1);
else
PORTB &= ~_BV(PB1);
_delay_ms(1000);
}
}
с моими библиотеками компилируется в 510 байт кода, т.е. влезет в attiny13 и еще место останется.
Pavel V., если вы мне объясните, в чем в данном случае смысл использования не статического объекта, а динамического (а при использовании статического объекта в чем тогда разница с не-ОО программированием), а так же оправдания ОО-подхода для системы, в которой нет "развития" классов - я пойму смысл его использования и для очень больших процессоров. а иначе - увы...
Re: помогите переделать, библиотеку ds18b20 под мои требован
Добавлено: Пн ноя 15, 2010 13:03:22
Pavel V.
Код: Выделить всё
[b]Pavel V.[/b], если вы мне объясните, в чем в данном случае смысл использования не статического объекта, а динамического (а при использовании статического объекта в чем тогда разница с не-ОО программированием), а так же оправдания ОО-подхода для системы, в которой нет "развития" классов - я пойму смысл его использования и для очень больших процессоров. а иначе - увы...
А что подразумевается под "развитием" классов? Наследование?
Для меня преимущества ОО подхода к программированию - это в первую очередь возможность обеспечить модульность и расширяемость системы. А еще шаблоны, виртуальные функции и т.п. Все эти возможности C++ чрезвычайно мощные и удобные.
Re: помогите переделать, библиотеку ds18b20 под мои требован
Добавлено: Пн ноя 15, 2010 13:30:42
O-LED
ARV фиг его знает что там делает кодвижн, но если создать проект для 2313, с мульти поддержкой разных типов датчиков (DS1820 DS18S20 DS18B20) и автоматическим определением их числа, и больше ничего не трогать(ну кроме плюс еще 1-wire естественно ), а потом компильнуть, то получается код занимающий 73 процента пямяти, или немного меньше чем 1,6 кб.
выложите пожалуйста свои библиотеки. я так понимаю они для WinAVR?? сохраню, пусть будут, может пригодятся. Кстати. а для WinAVR не проблема всякие библиотеки?? а то надумаю перейти на него, а окажется что на него гораздо меньше всего чем на кодевижн.
Re: помогите переделать, библиотеку ds18b20 под мои требован
Добавлено: Пн ноя 15, 2010 13:53:47
ARV
библиотеки не библиотеки, а исходники модулей для 1-wire есть в составе моих проектов, ранее я писал, каких - вы можете абсолютно свободно скачивать их с моего сайта.
для WinAVR полно всего, от универсальных библиотек для всего до автогенераторов кода по типу кодвижна.
Re: помогите переделать, библиотеку ds18b20 под мои требован
Добавлено: Пн ноя 15, 2010 13:54:02
Pavel V.
WinAVR - это ни что иное как GCC, а под него примеров пруд пруди. CV - редкая какашка, крайне не рекомендую использовать в работе. Разве что только в самом-самом начале из-за удобного мастера конфигурирования. И то, идея использовать мастер для конфигурации периферии весьма спорная, потому что поддерживать этот код впоследствии совершенно невозможно.
Re: помогите переделать, библиотеку ds18b20 под мои требован
Добавлено: Пн ноя 15, 2010 14:56:03
O-LED
Понятно. спасибо.
Текущий проект доделаю уже в кодевижн, а потом посмотрим, может и перейдем на вин-авр.
а какие еще в нем плюсы?? читал что код меньше. что еще? чем он лучше кодевижена, например если не пользоваться генератором начального кода.
Re: помогите переделать, библиотеку ds18b20 под мои требован
Добавлено: Пт дек 31, 2010 14:53:18
Amstron
Скачал я этот файл ds18b20.rar
Заменил библиотеки (старые удалил).
Подключил файл #include <ds18b20_.h>
В итоге у меня выскакивает ошибка в этой строчке:
temp=ds18b20_temperature(0)*10;//команда для получения значения температуры
Компилятор CodeVisionAVR C Compiler ругается на "ds18b20_temperature"
В чем дело??? Пересмотрел библиотеки, ответа не нашол.
Re: помогите переделать, библиотеку ds18b20 под мои требован
Добавлено: Пт дек 31, 2010 15:15:21
O-LED
какая ошибка? как объявлена переменная temp?
Re: помогите переделать, библиотеку ds18b20 под мои требован
Добавлено: Пт дек 31, 2010 15:30:42
Amstron
O-LED писал(а):какая ошибка? как объявлена переменная temp?
Переменная temp объявленна как unsigned int , также пробывал и float
На самом деле, в файле ds18b20_.lib нет функции ds18b20_temperature! Она закоментированна...
Пробывал ds18b20_read_temp, то тогда пишет постоянное число 85.
Ошибка такая : L184: undefained symbol "ds18b20_temperature"