Страница 2 из 3

Добавлено: Пт сен 21, 2007 19:39:04
__Alexander
раз асм тогда вопросов нет

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

А если по сути, советую:
1. Свести регенерацию индикации до минимума, уменьшать частоту, когда действительно станет заметным на глаз эта самая регенерация. Тогда время для опроса датчика увеличится.
2. С датчиком работать команда-ответ. Т.е. сресетили датчик, подали команду, подождали, прочли ответ, подождали. и т.д.
А для чтения температуры команд то надо только 4. 0xcc 0x44 0xcc 0xbe, а используя стандартные библиотеки можно не видеть что где-то есть функция, допустим опроса всех устройств на линии и подобных. И от этого индикация может тормозит.
Лично пробывал - не тормозило. Может просто угадал?

Добавлено: Пт сен 21, 2007 20:58:51
Mozart
я так просмотрел... и почему-то никто не предложил отключать прерывания во время работы 1-wire...
и вообще для него от 200мС и больше многовато будет/// блин это вообще время преобразования!!!
чего вы ждёте пока он преобразует что ли??? а время чтения 15мкС... читайте мануал...
когда вы запускаете его на преобразование то он сам по себе там что-то преобразует.. потом посылаете комманду на чтение результата!!!

Добавлено: Вс сен 23, 2007 09:44:10
chief
кто подскажет какими ресурсами пользуются стандартные библиотеки под датчик и индикацию? конкретно таймеры и прерывания...

Добавлено: Вс сен 23, 2007 12:15:54
__Alexander
>я так просмотрел... и почему-то никто не предложил отключать
>прерывания во время работы 1-wire...

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

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

Что есть стандартные? Это выбирать вам. Датчик от прерваний не зависит, можно вешать на любую ногу. А индикацию соответственно на любой таймер, который есть в конкретном типе МК.

Добавлено: Вс сен 23, 2007 13:21:56
chief
а что если процедуру обработки 1-wire засунуть в тело программы. А индикацию вызывать про прерыванию от таймера, неужели будут сбои?

Добавлено: Пн сен 24, 2007 23:21:57
alex2103
при использовании стандартной библиотеки CV функция получения температуры слишком избыточна...она при каждом обращении делает поиск устройств и их инициализацию. Короче надо ручками править их.

Добавлено: Вт сен 25, 2007 09:34:53
chief
так сделайте ассемблерную вставку процедуры могу выложить

Добавлено: Вт сен 25, 2007 13:15:51
alex2103
было бы интересно взглянуть :) может понадобиться.

Добавлено: Вт сен 25, 2007 20:18:33
chief
Выкладываю процедуры.
Сначала объявляются переменные (много лишних так как взято из целого проекта)
tim0_ovf - обработчик прерывания от таймера 0
Результат сохраняется в области ОЗУ. Датчик подключается к PB2 в другом случае необходимо все править.
Будут какие то другие вопросы - спрашивайте. Отмечу что данные процедуры работают только с одним датчиком и не поддерживают адресацию.

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

Добавлено: Чт сен 27, 2007 06:51:01
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 вправо для выделения следующего бита
}
}

Добавлено: Чт сен 27, 2007 07:12:01
AlexZ
Если кому надо обрабатывать прерывания во время чтения/записи в DS18B20, то нужно поставить запрет прерывний на время приема/передачи байта и на время формирования импульса сброса.
Если время запрета прерываний нужно сделать минимальным, тогда можно поставить запрет прерываний только на время приема одного бита.

Добавлено: Чт сен 27, 2007 07:23:48
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;
}

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

Добавлено: Пн окт 01, 2007 10:45:53
Silent
Хочу подключить DS18B20 к ПЛИС XC9536-15VQ44I.
ПЛИС должен расшифровывать код датчика сравнивать его с критической температурой и принимать решение о перегреве. Для начала, прежде чем детально переводить и изучать руководство, хочу спросить тех кто работал с этим датчиком - возможно ли такое?
Что из себя представляет код датчика (алгоритм кодирования), как распознать начало и окончание передачи, какие там задержки? Буду очень благодарен за помощь!

Добавлено: Пн окт 01, 2007 11:53:13
Aheir
Да, вполне возможно. 1-Wire, этим все сказано. Информация есть и на этом Форуме и в Сети :) Появятся вопросы - милости просим.

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

А статейка по 1-Wire на этом сайте действительно хорошая.

Добавлено: Чт окт 04, 2007 18:32:10
chief
Мне даже более интересно как вы собираетесь обрабатывать на ПЛИС результаты. Мне кажется для таких целей использовать их скажем так немножко странно. Вообще это часть проекта, или весь проект?

Добавлено: Пт окт 05, 2007 17:26:09
Silent
Часть проекта... Просто на плате есть один ПЛИС (без всяких генераторов частоты), один вход/выход у него свободен, вот и не хотелось бы ничего менять и добавлять, хотя, чувствую, придётся задействовать микроконтроллер.
Конечно, не продумывал всё досконально, но если преобразовать внутри ПЛИСа последовательный код с датчика в параллельный, то результаты обработать не составило бы никакого труда.

Добавлено: Пн дек 03, 2007 16:15:44
Denis-d20
Доброе время суток. Я смотрю тут товарищ AlexZ вы ложил код на DS18b20 у меня вопрос подходит ли этот код для WinAWR? и Если можно разжуйте поподробнее этот код

Добавлено: Вт апр 22, 2008 19:15:46
ZVER73rus
афтар. писал прогу для под твои цели. на СИ. при динамической индикации не удалось добиться постоянного свичения темпер. при статической с регистрами все отлично работает!.
мигало с интервалом 1сек.