Почему нельзя увеличить длительность между байтами DS18b20

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Открыл глаза
Аватара пользователя
Сообщения: 69
Зарегистрирован: Вс сен 23, 2007 15:34:32
Откуда: г. Киров

Сообщение 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");
1000 паяльников мне в задницу!
Контактная информация:
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 375
Зарегистрирован: Вс мар 04, 2007 13:14:25
Откуда: Украина

Сообщение Krik99 »

Вот http://radiokot.ru/circuit/digital/home/26/ в моём термометре я работал с 3 датчиками и нечего не мерцало. Я писал под Code Vision AVR, заприщал прирывания только тогда, когда обращался к функцие 1Wire.
Изображение
Контактная информация:
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 69
Зарегистрирован: Вс сен 23, 2007 15:34:32
Откуда: г. Киров

Сообщение Slawo »

Krik99 ->> Спасибо, но мне не нужен готовый проект, раз уж я спаял все на своей платке.
Я тоже запрещаю прерывания на время пользования 1-wire функциями, но пока шлется 8 байт адреса, экранчик гаснет, хотя МК настроен на частоту 8МГц, а у тебя при 4МГц не мерцало, как же правильно сделать
1000 паяльников мне в задницу!
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 375
Зарегистрирован: Вс мар 04, 2007 13:14:25
Откуда: Украина

Сообщение Krik99 »

Какой компилятор? Либу сам писал или готовую используеш? Выводиш на LED через таймер? Как настроен таймер?
PS У меня тоже долго мигал и я не знал как с етим боротся, но потом оптимально подправил код и всё получилось... Пример вывода на 7-ми сементный LED дисплей, есть у меня на сайте. :)
Изображение
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18682
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

юзайте нормальную либу 1-wire? плюньте вы на эти поделки CVAVR! для 1-wire запрещать прерывания надо не более чем на 15-20 микросекунд! такая пауза никак не может повлиять на динамическую индикацию! а если надо запрещать прерывания на весь пакет битов - это кривая либа!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 69
Зарегистрирован: Вс сен 23, 2007 15:34:32
Откуда: г. Киров

Сообщение Slawo »

В качестве 1-wire фунцкций использую библиотеку CodeVision.
Таймер прерывается каждые 0.002с. МК работает от внутреннего генератора 8МГц.
Что именно делает функция w1_init()? Посылает импульс reset или нет? Адреса устройств ищу готовой функцией w1_search(SEARCH_ROM,rom_code) один раз перед зацикливанием while(1)
1000 паяльников мне в задницу!
Контактная информация:
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 69
Зарегистрирован: Вс сен 23, 2007 15:34:32
Откуда: г. Киров

Сообщение Slawo »

ARV - >> То есть вы советуете свою либу написать 1-wire? А в ней тогда запрещасть прерывания тока время передачи одного бита потом ждать и посылать следующий бит? Или делать паузы между байтами
1000 паяльников мне в задницу!
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18682
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

да, подход именно такой: запрещать на время передачи 1-го бита. а между битами и байтами можно хоть сутки паузу делать. но я не предлагаю писать самому (хотя это и полезно для самообразования) - воспользуйтесь поиском! таких либ далеко не одна существует!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 69
Зарегистрирован: Вс сен 23, 2007 15:34:32
Откуда: г. Киров

Сообщение Slawo »

Да все прекрасно, мне не составит особого труда написать 1-wire функции write_byte и read_byte, просто не мог никак погрешить на готовые функции CVAvr, думал что они прекрасно отлажены.
Вот такие вот пирожки, а я уж думал ругаться на сами датчики температуры, что они не хотят долго ждать данных :)
1000 паяльников мне в задницу!
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18682
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 69
Зарегистрирован: Вс сен 23, 2007 15:34:32
Откуда: г. Киров

Сообщение Slawo »

Апплодисменты в студию :))
Как показал опыт, свои функции iw_reset(), iw_write(), iw_read() по методу ARV запрещать прерывания только на пересылку бита информации отлично справились с задачей :idea:
LED не мерцает, а продолжительность прерывания таймера может быть хоть сколько длинной, и не нужно теперь при использовании 1-wire функций запрещать прерывания, ибо там все уже внутри прописано самолично :)))
Всем спасибо за внимание 8)
1000 паяльников мне в задницу!
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 69
Зарегистрирован: Вс сен 23, 2007 15:34:32
Откуда: г. Киров

Сообщение Slawo »

Эх.... Все же тему форума пока что рановато закрывать.
Несмотря на всю кажущуюся правильность написания функций, при разведении датчиков друг от друга проводами даже по полметра длиной из них явно доминирует один. C одного данные приходят правильно, а со второго или с других если больше на шине (я пробовал три) данные либо ошибаютс все время, либо совсем ноль приходит, если провода еще чуть длиннее сделать.
На всеобщее обозрение вываливаю свои функции в прикрепленном файлике.

Процедуры wait делаются просто nop'ами.

8 nop'ов при частоте 8МГц это 1 мкс. минус 4 nop'a на перехоод и возврат из функции.
В чем проблема, не пойму. Когда использовал CV библиотеки, хоть и мерцал экран, а данные правильно считывались и с 6-метровых проводов.
Вложения
использование функций.txt
(237 байт) 278 скачиваний
iwire функции.txt
(1.9 КБ) 285 скачиваний
1000 паяльников мне в задницу!
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 69
Зарегистрирован: Вс сен 23, 2007 15:34:32
Откуда: г. Киров

Сообщение Slawo »

Блин, а проверка CRC показывает, что данные пришли верно во всех трех случаях. Хотя тока со второго датчика вразумительные цифры. Убиться чтоль сходить :o
1000 паяльников мне в задницу!
Контактная информация:
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 173
Зарегистрирован: Чт мар 20, 2008 20:33:43

Сообщение delay »

Извиняюсь, у меня по ходу вопрос к Krik99
На указанной странице прошивка не скачивается.
Еще впорос, проверяли ли вы точность показаний термометра?
Я делал на DS18B20. Функции использовал стандартные CodeVision. Для получения десятичных значений - умножил значение температуры на 10. Сконфигурирывал так
ds18b20_init(&rom_code[I++][0],20,30,DS18B20_10BIT_RES)
При сравнении с показанием ртутного термометра, значение было завышено на 2 град. По даташиту, пограшность не должна превышать 0,5 град. Читал, что эти датчики необходимо колибровать регулируя наклон и смещение корректирующей линии.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18682
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

впервые слышу про калибровку этих датчиков!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса

Сообщение clawham »

извиняюсь за вопрос но....а что? сейчас модно приключения искать на попу? Я вот совсем недавно играюсь с атмегой 16-16pu и далласовским даччиком, который у меня как часть проходит огромной схемы....вопрос....неужели так прикоьно делать медленный контроллер ещё и многозадачным? Я например сделал устройство с экраном 3310 и экран меня не трогает вообще-кинул что выводить и забыл
как вариант можно сделать на тине последовательный индикатор а главный проц-грузить расчетом и пооучением данных датчиков....ибо тогда на отдельном их можно хоть 200 штук юзатьмненапример надо было 12 точек и это только начало
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

Сообщение Pooher »

при разведении датчиков друг от друга проводами даже по полметра длиной из них явно доминирует один
Тут даже не раздумывая можно начинать копаться с временными интервалами.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»