Динамическая индикация + термометр DS18B20

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
__Alexander
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

раз асм тогда вопросов нет

Думаете компилятор плохо оптимизирует код? Не всегда, для таких простых вещей очень даже ничего. Можно и на асме нагородить такого, что когда дезассемблировать сишный код - увидеть как действительно надо было делать.

А если по сути, советую:
1. Свести регенерацию индикации до минимума, уменьшать частоту, когда действительно станет заметным на глаз эта самая регенерация. Тогда время для опроса датчика увеличится.
2. С датчиком работать команда-ответ. Т.е. сресетили датчик, подали команду, подождали, прочли ответ, подождали. и т.д.
А для чтения температуры команд то надо только 4. 0xcc 0x44 0xcc 0xbe, а используя стандартные библиотеки можно не видеть что где-то есть функция, допустим опроса всех устройств на линии и подобных. И от этого индикация может тормозит.
Лично пробывал - не тормозило. Может просто угадал?
Аватара пользователя
Mozart
Мучитель микросхем
Сообщения: 413
Зарегистрирован: Пт мар 10, 2006 12:23:05
Откуда: Moscow
Контактная информация:

Сообщение Mozart »

я так просмотрел... и почему-то никто не предложил отключать прерывания во время работы 1-wire...
и вообще для него от 200мС и больше многовато будет/// блин это вообще время преобразования!!!
чего вы ждёте пока он преобразует что ли??? а время чтения 15мкС... читайте мануал...
когда вы запускаете его на преобразование то он сам по себе там что-то преобразует.. потом посылаете комманду на чтение результата!!!
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
chief
Потрогал лапой паяльник
Сообщения: 397
Зарегистрирован: Ср сен 19, 2007 09:21:04

Сообщение chief »

кто подскажет какими ресурсами пользуются стандартные библиотеки под датчик и индикацию? конкретно таймеры и прерывания...
Аватара пользователя
__Alexander
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

>я так просмотрел... и почему-то никто не предложил отключать
>прерывания во время работы 1-wire...

Вот именно, что прерывания отключаются, и соответсвенно отключается прерывание таймера по которому происходит регенерация семисегментников. А люди спрашивают как это лечить.

>кто подскажет какими ресурсами пользуются стандартные
>библиотеки под датчик и индикацию? конкретно таймеры и
>прерывания...

Что есть стандартные? Это выбирать вам. Датчик от прерваний не зависит, можно вешать на любую ногу. А индикацию соответственно на любой таймер, который есть в конкретном типе МК.
chief
Потрогал лапой паяльник
Сообщения: 397
Зарегистрирован: Ср сен 19, 2007 09:21:04

Сообщение chief »

а что если процедуру обработки 1-wire засунуть в тело программы. А индикацию вызывать про прерыванию от таймера, неужели будут сбои?
Аватара пользователя
alex2103
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт сен 18, 2007 16:41:16
Откуда: Украина, г. Запорожье
Контактная информация:

Сообщение alex2103 »

при использовании стандартной библиотеки CV функция получения температуры слишком избыточна...она при каждом обращении делает поиск устройств и их инициализацию. Короче надо ручками править их.
chief
Потрогал лапой паяльник
Сообщения: 397
Зарегистрирован: Ср сен 19, 2007 09:21:04

Сообщение chief »

так сделайте ассемблерную вставку процедуры могу выложить
Аватара пользователя
alex2103
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт сен 18, 2007 16:41:16
Откуда: Украина, г. Запорожье
Контактная информация:

Сообщение alex2103 »

было бы интересно взглянуть :) может понадобиться.
chief
Потрогал лапой паяльник
Сообщения: 397
Зарегистрирован: Ср сен 19, 2007 09:21:04

Сообщение chief »

Выкладываю процедуры.
Сначала объявляются переменные (много лишних так как взято из целого проекта)
tim0_ovf - обработчик прерывания от таймера 0
Результат сохраняется в области ОЗУ. Датчик подключается к PB2 в другом случае необходимо все править.
Будут какие то другие вопросы - спрашивайте. Отмечу что данные процедуры работают только с одним датчиком и не поддерживают адресацию.
Вложения
DS18B20.txt
процедуры для работы с DS18B20
(4.52 КБ) 832 скачивания
AlexZ
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Ср сен 26, 2007 07:16:40
Откуда: Челябинск

Сообщение AlexZ »

Доброго времени суток!
Делал как то я 2-х канальный термометр-термостат на DS18B20 + Mega8. Поищу исходники, выложу процедуру общения с датчиками.
Программа написана на С под IAR
AlexZ
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Ср сен 26, 2007 07:16:40
Откуда: Челябинск

Сообщение AlexZ »

//************************************
//** П/П выдает команду сброса ***
//** датчику DS18B20 и возвращает: ***
//* 1 - датчик ответил на запрос ***
//* 0 - датчик не установлен ***
//* 2 - замыкание на линии ***
//************************************
unsigned char reset_DS18B20 (char _PIN)
{
unsigned char b=0,i,d=0;
DDRD|=(1<<_PIN); // Вывод порта настраиваем на вывод
PORTD&=~(1<<_PIN); // Лог. 0 на линии
__delay_cycles(0.0005*CPU_FREQ); // Ждем 500 мкс
PORTD|=(1<<_PIN); // Лог. 1 на линии
DDRD&=~(1<<_PIN); // Вывод порта настраиваем на ввод
i=50;
while (i)
{
__delay_cycles(0.00001*CPU_FREQ); // Ждем 10 мкс
i=i-1; // Проверяем наличие ответного импульса от датчика:
if (PIND & (1<<_PIN)) b=1; // Проверяем, что линия подтянулась к лог.1
if (~(PIND & (1<<_PIN))) // после импульса сброса.
{ //
if (b==1) d=1; // Если датчик ответил, d=1
} //
} //
if (b==0&&d==0) d=0x02; // Если линия замкнута - возвращаем d=2
return d;
}

//************************************
//** П/П записывает байт в DS18B20 **
//************************************
void write_DS18B20 (char byte, char _PIN2)
{
PORTD|=(1<<_PIN2); //
DDRD|=(1<<_PIN2); // Вывод порта программируем на вывод
for (j=0;j<8;j++) //
{
if (byte & 0x01) // выделяем младший бит
{ // Если выделенный бит равен 1:
PORTD&=~(1<<_PIN2); // Лог.0 на линии
__delay_cycles(0.000001*CPU_FREQ); // Ждем 1 мкс
PORTD|=(1<<_PIN2); // Лог.1 на линии
__delay_cycles(0.00006*CPU_FREQ); // Ждем 60 мкс
}
else
{ // Если выделенный бит равен 0:
PORTD&=~(1<<_PIN2); // Лог.0 на линии
__delay_cycles(0.00006*CPU_FREQ); // Ждем 60 мкс
PORTD|=(1<<_PIN2>>1; // Сдвигаем byte вправо для выделения следующего бита
}
}
Последний раз редактировалось AlexZ Чт сен 27, 2007 07:20:54, всего редактировалось 2 раза.
AlexZ
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Ср сен 26, 2007 07:16:40
Откуда: Челябинск

Сообщение AlexZ »

Если кому надо обрабатывать прерывания во время чтения/записи в DS18B20, то нужно поставить запрет прерывний на время приема/передачи байта и на время формирования импульса сброса.
Если время запрета прерываний нужно сделать минимальным, тогда можно поставить запрет прерываний только на время приема одного бита.
AlexZ
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Ср сен 26, 2007 07:16:40
Откуда: Челябинск

Сообщение AlexZ »

//************************************
//** П/П считывает байт из DS18B20 **
//************************************
unsigned char read_DS18B20 (char _PIN3)
{
unsigned char n=0,g;
for (j=0;j<8;j++) //
{
PORTD|=(1<<_PIN3); //
DDRD|=(1<<_PIN3); // Вывод порта программируем на вывод
PORTD&=~(1<<_PIN3); //
__delay_cycles(0.000001*CPU_FREQ); // Ждем 1 мкс
DDRD&=~(1<<_PIN3); // Переключаем вывод порта на ввод
__delay_cycles(0.000006*CPU_FREQ); // Ждем 6 мкс
g=PIND; //
n=n>>1; //
if (g & (1<<_PIN3)) n=n+0x80; //
__delay_cycles(0.000060*CPU_FREQ); // Ждем 60 мкс
}
return n;
}
Аватара пользователя
Silent
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Пн окт 01, 2007 10:17:36
Откуда: Санкт-Петербург

Хочу подключить DS18B20 к ПЛИС XC9536-15VQ44I

Сообщение Silent »

Хочу подключить DS18B20 к ПЛИС XC9536-15VQ44I.
ПЛИС должен расшифровывать код датчика сравнивать его с критической температурой и принимать решение о перегреве. Для начала, прежде чем детально переводить и изучать руководство, хочу спросить тех кто работал с этим датчиком - возможно ли такое?
Что из себя представляет код датчика (алгоритм кодирования), как распознать начало и окончание передачи, какие там задержки? Буду очень благодарен за помощь!
Аватара пользователя
Aheir
Модератор
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург
Контактная информация:

Сообщение Aheir »

Да, вполне возможно. 1-Wire, этим все сказано. Информация есть и на этом Форуме и в Сети :) Появятся вопросы - милости просим.
Оптимизм х (Опыт + Знания) = const
Аватара пользователя
Silent
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Пн окт 01, 2007 10:17:36
Откуда: Санкт-Петербург

Сообщение Silent »

Хм... Я не могу задавать в ПЛИС пременные интервалы сигналов, не могу послать сигнал RESET длиной 480 мк, ни соблюдать временные параметры каждого тайм-слота, могу только послать коротенький импульс - несколько наносекунд, либо бесконечной длины... на сколько я разобрался в XC9536. Внешние генераторы частоты я не могу использовать, а реализовать необходимую задержку на основании паразитных задержек логических элементов не самый лучший выход, если он вообще возможен...

А статейка по 1-Wire на этом сайте действительно хорошая.
chief
Потрогал лапой паяльник
Сообщения: 397
Зарегистрирован: Ср сен 19, 2007 09:21:04

Сообщение chief »

Мне даже более интересно как вы собираетесь обрабатывать на ПЛИС результаты. Мне кажется для таких целей использовать их скажем так немножко странно. Вообще это часть проекта, или весь проект?
Аватара пользователя
Silent
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Пн окт 01, 2007 10:17:36
Откуда: Санкт-Петербург

Сообщение Silent »

Часть проекта... Просто на плате есть один ПЛИС (без всяких генераторов частоты), один вход/выход у него свободен, вот и не хотелось бы ничего менять и добавлять, хотя, чувствую, придётся задействовать микроконтроллер.
Конечно, не продумывал всё досконально, но если преобразовать внутри ПЛИСа последовательный код с датчика в параллельный, то результаты обработать не составило бы никакого труда.
Аватара пользователя
Denis-d20
Открыл глаза
Сообщения: 52
Зарегистрирован: Сб ноя 24, 2007 10:06:53
Откуда: Украина,хмельницкий
Контактная информация:

Сообщение Denis-d20 »

Доброе время суток. Я смотрю тут товарищ AlexZ вы ложил код на DS18b20 у меня вопрос подходит ли этот код для WinAWR? и Если можно разжуйте поподробнее этот код
Аватара пользователя
ZVER73rus
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Вт апр 22, 2008 19:11:39

Сообщение ZVER73rus »

афтар. писал прогу для под твои цели. на СИ. при динамической индикации не удалось добиться постоянного свичения темпер. при статической с регистрами все отлично работает!.
мигало с интервалом 1сек.
Закрыто

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