помогите переделать, библиотеку ds18b20 под мои требования.
помогите переделать, библиотеку ds18b20 под мои требования.
Значит по порядку.
Пишу в CVAVR. Использую термометр DS18B20. библиотеку работы с ней беру стандартную из CVAVR. Алгоритм работы у неё, как вы наверное знаете, следующий -
команда на измерение температуры - пауза(длительность зависит от точности измерения, до 750мкс) - чтение температуры.
Так вот, если просто делать какой термометр, то такой алгоритм вполне подходит. а вот если делать устройство посложней, которое постоянно чтото обрабатывает, и должно откликаться в режиме реального времени, то в момент паузы мы получаем "затык" в работе длинной 750мкс. Это очень сильно портит впечатление от работы устройства.
Что хотелось бы.
Хотелось бы иметь такую библиотеку, чтоб я сам мог дать команду на измерение, например ds18b20_convert(), потом сам, любым удобным мне способом, отсчитал нужную паузу(а в это время моя программа крутится в обычном режиме, без всяких "туплений"), а потом прочитал уже готовый результат например ds18b20_readTemp()
Полазив по инету, подходящей мне библиотеки не нашел. кругом примеры и обучалки на базе встроенной в CVAVR библиотеки.
Помогите найти, или изменить имеющуюся под мои требования. желательно чтоб она поддерживала несколько датчиков, (хотя это наверное не трудно добавить).
Спасибо.
Пишу в CVAVR. Использую термометр DS18B20. библиотеку работы с ней беру стандартную из CVAVR. Алгоритм работы у неё, как вы наверное знаете, следующий -
команда на измерение температуры - пауза(длительность зависит от точности измерения, до 750мкс) - чтение температуры.
Так вот, если просто делать какой термометр, то такой алгоритм вполне подходит. а вот если делать устройство посложней, которое постоянно чтото обрабатывает, и должно откликаться в режиме реального времени, то в момент паузы мы получаем "затык" в работе длинной 750мкс. Это очень сильно портит впечатление от работы устройства.
Что хотелось бы.
Хотелось бы иметь такую библиотеку, чтоб я сам мог дать команду на измерение, например ds18b20_convert(), потом сам, любым удобным мне способом, отсчитал нужную паузу(а в это время моя программа крутится в обычном режиме, без всяких "туплений"), а потом прочитал уже готовый результат например ds18b20_readTemp()
Полазив по инету, подходящей мне библиотеки не нашел. кругом примеры и обучалки на базе встроенной в CVAVR библиотеки.
Помогите найти, или изменить имеющуюся под мои требования. желательно чтоб она поддерживала несколько датчиков, (хотя это наверное не трудно добавить).
Спасибо.
KIT
- Реклама
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18647
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: помогите переделать, библиотеку ds18b20 под мои требован
на моем сайте есть проект "термостат - меньше не бывает", он с исходниками. там есть библиотечка для работы с 1-wire и с термодатчиками в том числе. вся работа ведется так, что реализовать задуманное вами - не представляет проблем. проблему для вас будет представлять то, что я писал библиотеку для WinAVR, и под закидоны вашего CVAVR вам самостоятельно придется ее адаптировать.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: помогите переделать, библиотеку ds18b20 под мои требован
вот под codevision
- Вложения
-
- ds18b20.rar
- (1.61 КБ) 902 скачивания
Re: помогите переделать, библиотеку ds18b20 под мои требован
Большущее спасибо,
особенно AndreiVV за библиотеку. Впринципе это то что я искал, но как оказалось не совсем то что нужно. Конечно, отклик программы стал моментальным, но в момент чтения температуры появилось помиргивание индикаторов. Залез я тогда в lib , и нашел там запрет прерываний на время выполнения команд w1_write(0x44); и w1_init(); Ради эксперимента попробовал убрать запрет прерываний - и, о чудо, помиргивание естественно пропало. После этого я решил посмотреть увеличилось ли количество "ложных" ответов от дски. и к моему удивлению, сколько было, столько и осталось
так нафига мне эти запреты если нету разницы, подумал я, и оставил в таком виде. единственно сделал проверку на коректность чтения результата, и если он не корректен - это чтение игнорирую.
Так я получил то что хотел
Так я получил то что хотел
KIT
- Pavel V.
- Мявтор!
- Сообщения: 384
- Зарегистрирован: Ср май 17, 2006 18:39:01
- Откуда: Москва
- Контактная информация:
Re: помогите переделать, библиотеку ds18b20 под мои требован
Если еще интересно, могу завтра выложить свою библиотеку для температурных датчиков. Правда, она на C++ написана, но перенести на "голый" C проблем не составит.
В протоколе 1-Wire важна длительность задержки только в начале формирования тайм-слота и составляет максимум 15 мкс при чтении бита. Остальные задержки не нормированы и должны составлять "не менее" некоторой величины. Соответственно, на это время запрещать прерывания не нужно.
Вот процедуры записи и чтения бита данных, здесь можно увидеть в каких местах и на сколько должны запрещаться прерывания.
В протоколе 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 под мои требован
хоть я и решил проблему, но все равно интересно. конечно выложи, вдруг будет работать без ложных ответов.
Да и просто на будущее пусть будет.
Да и просто на будущее пусть будет.
KIT
- Pavel V.
- Мявтор!
- Сообщения: 384
- Зарегистрирован: Ср май 17, 2006 18:39:01
- Откуда: Москва
- Контактная информация:
Re: помогите переделать, библиотеку ds18b20 под мои требован
Ок, завтра выложу.
ПС
У меня проблем с получением ложных данных нет, хотя софтина работает под операционкой, а следовательно, функции работы с протоколом испытывают периодическое переключение контекста
Библиотека под MSP430, но перенести будет легко на любую платформу, надо только переписать функции, ответственные за ногодрыжество.
ПС
У меня проблем с получением ложных данных нет, хотя софтина работает под операционкой, а следовательно, функции работы с протоколом испытывают периодическое переключение контекста
Библиотека под MSP430, но перенести будет легко на любую платформу, надо только переписать функции, ответственные за ногодрыжество.
- Pavel V.
- Мявтор!
- Сообщения: 384
- Зарегистрирован: Ср май 17, 2006 18:39:01
- Откуда: Москва
- Контактная информация:
Re: помогите переделать, библиотеку ds18b20 под мои требован
Как обещал, вот библиотека.
Как работает:
- Первым делом надо произвести сканирование шины на наличие присоединенных устройств, найденные идентификаторы запоминаются с специальной табличке.
- Запустить преобразование температуры
- Считать результат
Как использовать в программе:
У меня обрезается значение температуры после запятой, если надо полное значение, нужно переписать кусочек метода Environment::ReadTemp(void).
Также, не реализован сокращенный режим работы (SKIP ROM), когда подключено одно устройство и запись настроек в датчик. Там все просто, но не было необходимости.
Как работает:
- Первым делом надо произвести сканирование шины на наличие присоединенных устройств, найденные идентификаторы запоминаются с специальной табличке.
- Запустить преобразование температуры
- Считать результат
Как использовать в программе:
Код: Выделить всё
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);
}
Также, не реализован сокращенный режим работы (SKIP ROM), когда подключено одно устройство и запись настроек в датчик. Там все просто, но не было необходимости.
- Вложения
-
- onewire.zip
- (5.46 КБ) 361 скачивание
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18647
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: помогите переделать, библиотеку ds18b20 под мои требован
ага, например для тини2313 применение динамического построения объектов в памяти и вообще собъектно-ориентированные программки - самое то, что требуется 
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: помогите переделать, библиотеку ds18b20 под мои требован
Pavel V. - спасибо. правда "переписать библиотеку" это пока не про меня.......
ARV хочу вас спросить, как знатного термометростроителя. какого минимального размера можно получить код для работы с дс18В20?? Например, нелюбимый вами кодевижн" генерит примерно 1,6кб кода только для работы с дской. в тоже время видел реализованные на тини2313 навороченные часы с термометром.
Спасибо.
ARV хочу вас спросить, как знатного термометростроителя. какого минимального размера можно получить код для работы с дс18В20?? Например, нелюбимый вами кодевижн" генерит примерно 1,6кб кода только для работы с дской. в тоже время видел реализованные на тини2313 навороченные часы с термометром.
Спасибо.
KIT
- Pavel V.
- Мявтор!
- Сообщения: 384
- Зарегистрирован: Ср май 17, 2006 18:39:01
- Откуда: Москва
- Контактная информация:
Re: помогите переделать, библиотеку ds18b20 под мои требован
Для больших процессоров (и соответственно, больших приложений) применение C++ считаю оправданным. ОО-код именно для МК для меня новая сфера, только осваиваюсь. До этого на плюсах писал только для уж совсем больших процессоровARV писал(а):ага, например для тини2313 применение динамического построения объектов в памяти и вообще собъектно-ориентированные программки - самое то, что требуется
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18647
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: помогите переделать, библиотеку ds18b20 под мои требован
я не могу знать, что там кодвижн ваш делает и зачем, но примитивная программка-тест такого видас моими библиотеками компилируется в 510 байт кода, т.е. влезет в attiny13 и еще место останется.
Pavel V., если вы мне объясните, в чем в данном случае смысл использования не статического объекта, а динамического (а при использовании статического объекта в чем тогда разница с не-ОО программированием), а так же оправдания ОО-подхода для системы, в которой нет "развития" классов - я пойму смысл его использования и для очень больших процессоров. а иначе - увы...
Код: Выделить всё
int main(void){
while(1){
if(get_temperature(NULL) > 55)
PORTB |= _BV(PB1);
else
PORTB &= ~_BV(PB1);
_delay_ms(1000);
}
}
Pavel V., если вы мне объясните, в чем в данном случае смысл использования не статического объекта, а динамического (а при использовании статического объекта в чем тогда разница с не-ОО программированием), а так же оправдания ОО-подхода для системы, в которой нет "развития" классов - я пойму смысл его использования и для очень больших процессоров. а иначе - увы...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Pavel V.
- Мявтор!
- Сообщения: 384
- Зарегистрирован: Ср май 17, 2006 18:39:01
- Откуда: Москва
- Контактная информация:
Re: помогите переделать, библиотеку ds18b20 под мои требован
Код: Выделить всё
[b]Pavel V.[/b], если вы мне объясните, в чем в данном случае смысл использования не статического объекта, а динамического (а при использовании статического объекта в чем тогда разница с не-ОО программированием), а так же оправдания ОО-подхода для системы, в которой нет "развития" классов - я пойму смысл его использования и для очень больших процессоров. а иначе - увы...Для меня преимущества ОО подхода к программированию - это в первую очередь возможность обеспечить модульность и расширяемость системы. А еще шаблоны, виртуальные функции и т.п. Все эти возможности C++ чрезвычайно мощные и удобные.
Re: помогите переделать, библиотеку ds18b20 под мои требован
ARV фиг его знает что там делает кодвижн, но если создать проект для 2313, с мульти поддержкой разных типов датчиков (DS1820 DS18S20 DS18B20) и автоматическим определением их числа, и больше ничего не трогать(ну кроме плюс еще 1-wire естественно ), а потом компильнуть, то получается код занимающий 73 процента пямяти, или немного меньше чем 1,6 кб.
выложите пожалуйста свои библиотеки. я так понимаю они для WinAVR?? сохраню, пусть будут, может пригодятся. Кстати. а для WinAVR не проблема всякие библиотеки?? а то надумаю перейти на него, а окажется что на него гораздо меньше всего чем на кодевижн.
выложите пожалуйста свои библиотеки. я так понимаю они для WinAVR?? сохраню, пусть будут, может пригодятся. Кстати. а для WinAVR не проблема всякие библиотеки?? а то надумаю перейти на него, а окажется что на него гораздо меньше всего чем на кодевижн.
KIT
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18647
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: помогите переделать, библиотеку ds18b20 под мои требован
библиотеки не библиотеки, а исходники модулей для 1-wire есть в составе моих проектов, ранее я писал, каких - вы можете абсолютно свободно скачивать их с моего сайта.
для WinAVR полно всего, от универсальных библиотек для всего до автогенераторов кода по типу кодвижна.
для WinAVR полно всего, от универсальных библиотек для всего до автогенераторов кода по типу кодвижна.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Pavel V.
- Мявтор!
- Сообщения: 384
- Зарегистрирован: Ср май 17, 2006 18:39:01
- Откуда: Москва
- Контактная информация:
Re: помогите переделать, библиотеку ds18b20 под мои требован
WinAVR - это ни что иное как GCC, а под него примеров пруд пруди. CV - редкая какашка, крайне не рекомендую использовать в работе. Разве что только в самом-самом начале из-за удобного мастера конфигурирования. И то, идея использовать мастер для конфигурации периферии весьма спорная, потому что поддерживать этот код впоследствии совершенно невозможно.
Re: помогите переделать, библиотеку ds18b20 под мои требован
Понятно. спасибо.
Текущий проект доделаю уже в кодевижн, а потом посмотрим, может и перейдем на вин-авр.
а какие еще в нем плюсы?? читал что код меньше. что еще? чем он лучше кодевижена, например если не пользоваться генератором начального кода.
Текущий проект доделаю уже в кодевижн, а потом посмотрим, может и перейдем на вин-авр.
а какие еще в нем плюсы?? читал что код меньше. что еще? чем он лучше кодевижена, например если не пользоваться генератором начального кода.
KIT
Re: помогите переделать, библиотеку ds18b20 под мои требован
Скачал я этот файл ds18b20.rar
Заменил библиотеки (старые удалил).
Подключил файл #include <ds18b20_.h>
В итоге у меня выскакивает ошибка в этой строчке:
temp=ds18b20_temperature(0)*10;//команда для получения значения температуры
Компилятор CodeVisionAVR C Compiler ругается на "ds18b20_temperature"
В чем дело??? Пересмотрел библиотеки, ответа не нашол.
Заменил библиотеки (старые удалил).
Подключил файл #include <ds18b20_.h>
В итоге у меня выскакивает ошибка в этой строчке:
temp=ds18b20_temperature(0)*10;//команда для получения значения температуры
Компилятор CodeVisionAVR C Compiler ругается на "ds18b20_temperature"
В чем дело??? Пересмотрел библиотеки, ответа не нашол.
Re: помогите переделать, библиотеку ds18b20 под мои требован
какая ошибка? как объявлена переменная temp?
KIT
Re: помогите переделать, библиотеку ds18b20 под мои требован
Переменная temp объявленна как unsigned int , также пробывал и floatO-LED писал(а):какая ошибка? как объявлена переменная temp?
На самом деле, в файле ds18b20_.lib нет функции ds18b20_temperature! Она закоментированна...
Пробывал ds18b20_read_temp, то тогда пишет постоянное число 85.
Ошибка такая : L184: undefained symbol "ds18b20_temperature"


