Страница 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
Большущее спасибо, :beer: особенно AndreiVV за библиотеку. Впринципе это то что я искал, но как оказалось не совсем то что нужно. Конечно, отклик программы стал моментальным, но в момент чтения температуры появилось помиргивание индикаторов. Залез я тогда в lib , и нашел там запрет прерываний на время выполнения команд w1_write(0x44); и w1_init(); Ради эксперимента попробовал убрать запрет прерываний - и, о чудо, помиргивание естественно пропало. После этого я решил посмотреть увеличилось ли количество "ложных" ответов от дски. и к моему удивлению, сколько было, столько и осталось :dont_know: так нафига мне эти запреты если нету разницы, подумал я, и оставил в таком виде. единственно сделал проверку на коректность чтения результата, и если он не корректен - это чтение игнорирую.
Так я получил то что хотел :)))

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"