Страница 1 из 1
Почему нельзя увеличить длительность между байтами DS18b20
Добавлено: Чт окт 16, 2008 01:54:55
Slawo
Мучаем все те же 18b20.
Вот на Меге8 в автомобиль хочу пару-тройку термометров повесить и на семисегментном индикаторе отображать температуру по одному из выбранных кнопочкой датчиков.
Суть проблемы опять в мерцании, то есть когда один висит датчик, это все без проблем.
Индикация: по переполнению таймера выбирается следующее значение из массива, все стандартно.
Вот пока шлешь 8-байтный адрес устройства, приходится запрещать прерывания, вот в этот-то момент и происходит погасание индикатора. Хотел построчно посылать 8 байт адреса и между ними делать небольшие паузы в несколько милисекунд, чтобы в это время работала индикация, но так датчики упорно не хотят работать

Пробовал не запрещать прерывания а по-минимуму сократить процедуру прерывания, все равно, такой же эффект. Подскажите кто чем может =)
В качестве 1-wire фунцкций использую библиотеку CodeVision
Ну вот что у меня
#asm("cli")
w1_init();
w1_write(MATCH_ROM);
#asm("sei");
delay_ms(2);
#asm("cli");
w1_write(rom_code[dev-1][0]);
#asm("sei");
delay_ms(2);
#asm("cli");
w1_write(rom_code[dev-1][1]);
.......
w1_write(rom_code[dev-1][7]);
#asm("sei");
delay_ms(2);
#asm("cli");
w1_write(CONVERT_T);
#asm("sei");
Добавлено: Чт окт 16, 2008 08:05:06
Krik99
Вот
http://radiokot.ru/circuit/digital/home/26/ в моём термометре я работал с 3 датчиками и нечего не мерцало. Я писал под Code Vision AVR, заприщал прирывания только тогда, когда обращался к функцие 1Wire.
Добавлено: Чт окт 16, 2008 16:19:32
Slawo
Krik99 ->> Спасибо, но мне не нужен готовый проект, раз уж я спаял все на своей платке.
Я тоже запрещаю прерывания на время пользования 1-wire функциями, но пока шлется 8 байт адреса, экранчик гаснет, хотя МК настроен на частоту 8МГц, а у тебя при 4МГц не мерцало, как же правильно сделать
Добавлено: Чт окт 16, 2008 16:56:26
Krik99
Какой компилятор? Либу сам писал или готовую используеш? Выводиш на LED через таймер? Как настроен таймер?
PS У меня тоже долго мигал и я не знал как с етим боротся, но потом оптимально подправил код и всё получилось... Пример вывода на 7-ми сементный LED дисплей, есть у меня на сайте.

Добавлено: Чт окт 16, 2008 17:35:24
ARV
юзайте нормальную либу 1-wire? плюньте вы на эти поделки CVAVR! для 1-wire запрещать прерывания надо не более чем на 15-20 микросекунд! такая пауза никак не может повлиять на динамическую индикацию! а если надо запрещать прерывания на весь пакет битов - это кривая либа!
Добавлено: Чт окт 16, 2008 17:36:43
Slawo
В качестве 1-wire фунцкций использую библиотеку CodeVision.
Таймер прерывается каждые 0.002с. МК работает от внутреннего генератора 8МГц.
Что именно делает функция w1_init()? Посылает импульс reset или нет? Адреса устройств ищу готовой функцией w1_search(SEARCH_ROM,rom_code) один раз перед зацикливанием while(1)
Добавлено: Чт окт 16, 2008 17:44:30
Slawo
ARV - >> То есть вы советуете свою либу написать 1-wire? А в ней тогда запрещасть прерывания тока время передачи одного бита потом ждать и посылать следующий бит? Или делать паузы между байтами
Добавлено: Чт окт 16, 2008 17:58:14
ARV
да, подход именно такой: запрещать на время передачи 1-го бита. а между битами и байтами можно хоть сутки паузу делать. но я не предлагаю писать самому (хотя это и полезно для самообразования) - воспользуйтесь поиском! таких либ далеко не одна существует!
Добавлено: Чт окт 16, 2008 18:10:36
Slawo
Да все прекрасно, мне не составит особого труда написать 1-wire функции write_byte и read_byte, просто не мог никак погрешить на готовые функции CVAvr, думал что они прекрасно отлажены.
Вот такие вот пирожки, а я уж думал ругаться на сами датчики температуры, что они не хотят долго ждать данных

Добавлено: Чт окт 16, 2008 18:13:18
ARV
да функции-то отлажены, только не расчитаны на динамическую индикацию, вот и все. все примеры, как можете видеть, расчитаны на ЖКИ
Добавлено: Чт окт 16, 2008 21:33:45
Slawo
Апплодисменты в студию
Как показал опыт, свои функции iw_reset(), iw_write(), iw_read() по методу ARV запрещать прерывания только на пересылку бита информации отлично справились с задачей
LED не мерцает, а продолжительность прерывания таймера может быть хоть сколько длинной, и не нужно теперь при использовании 1-wire функций запрещать прерывания, ибо там все уже внутри прописано самолично
Всем спасибо за внимание

Добавлено: Чт окт 16, 2008 23:44:02
Slawo
Эх.... Все же тему форума пока что рановато закрывать.
Несмотря на всю кажущуюся правильность написания функций, при разведении датчиков друг от друга проводами даже по полметра длиной из них явно доминирует один. C одного данные приходят правильно, а со второго или с других если больше на шине (я пробовал три) данные либо ошибаютс все время, либо совсем ноль приходит, если провода еще чуть длиннее сделать.
На всеобщее обозрение вываливаю свои функции в прикрепленном файлике.
Процедуры wait делаются просто nop'ами.
8 nop'ов при частоте 8МГц это 1 мкс. минус 4 nop'a на перехоод и возврат из функции.
В чем проблема, не пойму. Когда использовал CV библиотеки, хоть и мерцал экран, а данные правильно считывались и с 6-метровых проводов.
Добавлено: Пт окт 17, 2008 02:00:44
Slawo
Блин, а проверка CRC показывает, что данные пришли верно во всех трех случаях. Хотя тока со второго датчика вразумительные цифры. Убиться чтоль сходить

Добавлено: Пт окт 17, 2008 08:00:01
delay
Извиняюсь, у меня по ходу вопрос к Krik99
На указанной странице прошивка не скачивается.
Еще впорос, проверяли ли вы точность показаний термометра?
Я делал на DS18B20. Функции использовал стандартные CodeVision. Для получения десятичных значений - умножил значение температуры на 10. Сконфигурирывал так
ds18b20_init(&rom_code[I++][0],20,30,DS18B20_10BIT_RES)
При сравнении с показанием ртутного термометра, значение было завышено на 2 град. По даташиту, пограшность не должна превышать 0,5 град. Читал, что эти датчики необходимо колибровать регулируя наклон и смещение корректирующей линии.
Добавлено: Пт окт 17, 2008 09:43:28
ARV
впервые слышу про калибровку этих датчиков!
Добавлено: Сб ноя 01, 2008 17:28:55
clawham
извиняюсь за вопрос но....а что? сейчас модно приключения искать на попу? Я вот совсем недавно играюсь с атмегой 16-16pu и далласовским даччиком, который у меня как часть проходит огромной схемы....вопрос....неужели так прикоьно делать медленный контроллер ещё и многозадачным? Я например сделал устройство с экраном 3310 и экран меня не трогает вообще-кинул что выводить и забыл
как вариант можно сделать на тине последовательный индикатор а главный проц-грузить расчетом и пооучением данных датчиков....ибо тогда на отдельном их можно хоть 200 штук юзатьмненапример надо было 12 точек и это только начало
Добавлено: Пт ноя 07, 2008 09:57:50
Pooher
при разведении датчиков друг от друга проводами даже по полметра длиной из них явно доминирует один
Тут даже не раздумывая можно начинать копаться с временными интервалами.