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

Сколько DS18B20 может обслужить Atmega16

Добавлено: Пн июн 01, 2009 13:30:21
lkote68
Опытный Тигра Привет ты куда пропал. :))
Привет и другим Котам.
Котярики кто знает как правильно поставить кнопку сброса ежели на выводе сброса у меня висит супервизор DS1816

Добавлено: Пн июн 01, 2009 14:23:14
Yellow Tiger
Да, у этого супервизора входа для ручного сброса нет. Включи нормальнозамкнутую кнопку перед пином Vcc и зашунтируй её резистором, остальное супервизор сделает сам. :)))

P.S. Ремонт у меня, уже пару месяцев, и чем дальше, тем толще партизаны. На мелочи время выкроить удается, а на что-то более-менее серьёзное - никак. :( Раз ты вспомнил, значит таки-надо... попробую напрячься в среду. ;)

Сколько DS18B20 может обслужить Atmega16

Добавлено: Пн июн 01, 2009 14:45:17
lkote68
Еще раз привет. Я правильно понял (вложение кнопка нарисов разомкнутой не придирайся). Я понял твоя идея что в норме питание в первом случае подается через медь а при нажатии через резистор U= Uпит-Isup*R. Я так думаю входной ток у него совсем небольшой. Следовательно чтоб он увидел различия резистор не малый надо.
Посмотрел ST супервизоры они их там подразделяют на pushpull и open drain. Теперь ясно. DSка open drain (хотя че они их называют open drain) можно кнопку прямо на RST лепить, по крайней мере я так понял.

Re: Сколько DS18B20 может обслужить Atmega16

Добавлено: Пн июн 01, 2009 18:33:48
Yellow Tiger
lkote68 писал(а):Я правильно понял ...
Правильно.
lkote68 писал(а):чтоб он увидел различия резистор не малый надо.
Тебе жалко что-ли? Если будешь ресетить кнопкой, все равно резистор понадобится, и не только он (см. дальше). Так даже лучше - резистор понадобится высокоомный, а именно они-то всегда и остаются лишние. :))) Ну, и кроме того - супервизор заточен под эту задачу лучше и места знимает меньше, чем резистор и кондер. :)))
lkote68 писал(а):DSка open drain ... можно кнопку прямо на RST лепить, ...
Можно, но тогда еще понадобится кондер, чтобы дребезг стереть.

_____________
Посмотрел в ДШ, посчитал и оказалось, что из-за внутреннего пуллапа (5к всего) этот фортель может не получиться - пока этот пуллап ток не сосет, для снижения напруги на супервизоре на 1.2В нужен резистор в 35к, но как только выход ресет откроется и через 5к-омный пуллап потечет ток, те же самые 35к сожрут уже не 1.2В, а все 7/8, и тогда супервизору останется всего 0,625 вольта. В ДШ, правда, утверждается, что Vcc начинается от 0,0В, но я бы сначала убедился в этом сам (как-то не верится в чудеса - чем-то же надо держать там затвор открытым). :))
Если требования к ресету высоки, я бы рассмотрел супервизоры со встроенным принудительным ресетом; взгляни например на ADM1818 - супервизор, встроенный принудительный ресет, sot23 и цена даже немного ниже, чем у твоего далласовского.

Добавлено: Ср июн 03, 2009 19:55:47
Yellow Tiger
Привет. Посмотрел я код и вот что скажу - решение по размножению кода с заменой инструкций дергающих один бит на шаблонные копии, дергающие разные биты, выгодно, на мой взгляд, лишь если нужно задействовать два-три пина, а при большем количестве пинов накладные расходы, связанные с парой - сравнение номера канала с очередным номером + переход к следующему сравнению, если текущее сравнение ложно - оказываются тяжелее, чем накладные расходы связанные с вычислением полного байта, нужного для работы с пином.
Давай сравним, сейчас у тебя так:

Код: Выделить всё

void    w1_init(unsigned char chan) // параметр - номер канала (и пина, заодно)
{
    if (chan == 0){
        w1_init0();
    } else if(chan == 1){
        ...
    } else
        w1_init7();
}
то есть, если канал - восьмой, то все операции с ним будут сопровождаться семью сравнениями и семью переходами! Вычисляемых переходов в AVR нету, поэтому такой метод фактически привел к алгоритму прямого перебора. Я думаю, что нужно попробовать применить в процедурах не инструкции установки/сброса бита, а инструкции вывода в порт сразу всего набора бит - байта. Разумеется, семь бит, которые мы не хотим трогать, нужно предварительно прочитать, каждая операция с битом получается такой:
1. прочитать байт из порта
2. изменить в нем нужный бит
3. вывести байт в порт

Операций там две - установить нужный бит, либо сбросить нужный бит. Делается побитным ИЛИ предыдущих бит с единичкой в нужном разряде (установка бита), либо побитным И предыдущих бит с единичками во всех разрядах кроме нужного. Что-то вроде такого:

Код: Выделить всё

static unsigned char OrMask[8]  = {0x1, 0x2, 0x4, ...,0x80},
                     AndMask[8] = {0xFE,0xFD,0xFB,...,0x7F},
                     SetBit, ClrBit;
void    w1_init(unsigned char chan) // параметр - такой же
{
        SetBit = OrMask[chan];
        ClrBit = AndMask[chan];
        ...
        // set bit
        Port = Port | SetBit;
        // reset bit
        Port = Port & ClrBit;
        ...
}
Переменные SetBit и ClrBit можно сделать локальными, разумеется.

Накладные расходы здесь тоже есть, но если нужно использовать более трех пинов, то они оказываются меньше тех, что в твоем варианте. Попробуй так, по-моему, это должно сработать лучше. ;)

P.S. Если памяти будет так мало, что даже 16 байт будет жалко под статические битовые маски (OrMask и AndMask), то их можно, конечно, не хранить, а генерить на лету сдвигами - не так быстро, но и в этом случае расходы будут меньше, чем при прямом переборе. Да и объем кода будет почти в восемь раз меньше. :)))

Сколько DS18B20 может обслужить Atmega16

Добавлено: Вт июн 09, 2009 09:24:31
lkote68
Привет тигра. Обязательно отвечу Сейчас некогда Делаю девайс в метале и пишу прогу для визуализации. До 25.06.09 должен сделать. Будет Совет смотреть. Сам понимаешь времени мало. Еще и компоненты приобретать мне.

Добавлено: Вт июн 09, 2009 18:45:37
Yellow Tiger
Да, успеть за две недели - это не фунт изюма. Удачи! :)

Сколько DS18B20 может обслужить Atmega16

Добавлено: Чт июн 18, 2009 12:04:29
lkote68
Тигра хошь посмотреть что получилось - давай мыло или еще что то сюда не лезет

Добавлено: Пт июн 19, 2009 19:21:20
Yellow Tiger
Посмотрел, мало что можно разобрать после эрика 790-го. В ДИП8 - это кто? Там восемь каналов на 315/814 - это как раз и есть линии для датчиков? А кто же тогда в ДИПах - тиньки? ТО92-е на синей плате - далласы? И почему платы две?
В общем, интересно, но непонятно... Изображение

Сколько DS18B20 может обслужить Atmega16

Добавлено: Пт июн 19, 2009 22:02:20
lkote68
Я там еще две фоты бросил. Составной 315-815 ключ для подпитки дсок. Я с биполярными как с родными поэтому сделал на них. Макетка это таже схема только + на ней дски и некоторые варики по ходу. Там реализовано было 4 канала. Просто показал с чего начал. Дип16 - генератор сделал на плате 2 генератора про запас. Около меги там есть отверстия под кварц мона если кому не понравится переставать. Но мне лично нравится отдельный генератор - там амлитуда все 5V.

Re: Сколько DS18B20 может обслужить Atmega16

Добавлено: Пт июн 19, 2009 22:48:12
Yellow Tiger
Через оптроны рулишь далласами? Пока не понял, как ты обошелся восемью оптронами на развязке восьми каналов...
Кстати - сколько же в результате далласов висит на каждом канале и в сумме на меге16? :))

P.S.
проехали...

Сколько DS18B20 может обслужить Atmega16

Добавлено: Пн июн 22, 2009 09:46:11
lkote68
Нет даласы как по даташиту без всякой развязки. На базовом контроллере развязки нет - ну и я спрыгнул. То отвязка RX, TX, и направления передачи 485. Спечифичная тема применения твоего транзистора. Так по друзьям спросил. Грят должен работать. Я лично микрофонными усилителями не занимался. Спроси по конкретнее может сообразим что то. И ваще ты ссылку средактил на вопрос.
Чтоб узнать сока висит будем привлекать тебя :-)) Пока надеюсь по 10 на канал. Посмотрел та Atmega32 у нее ж распиновка таже - перекомпилим навешаем глянем. Я пока не могу оценить сколько памяти остается.

Re: Сколько DS18B20 может обслужить Atmega16

Добавлено: Пн июн 22, 2009 18:43:26
Yellow Tiger
Как там твои заказчики, ты их охмурил, надеюсь? Изображение
lkote68 писал(а):И ваще ты ссылку средактил на вопрос.
Так ведь я объяснил - проехали. Я на ДР одному любимомук старику хочу успеть сделать усилятель карманный, времени мало, потому я ждал только практических замечаний/советов, а на обсуждения (как это обычно бывает) сейчас времени нетути; вот я и не стал ждать - произвёл поскребание по сусекам и отрыл на дне какого-то ящика малошумящие операционники; на том и порешил... ;)
lkote68 писал(а):Чтоб узнать скока висит, будем привлекать тебя :-))
Понятно - "инициатива наказуема", да? Изображение Кстати - ты код 1-варе функций пробовал переделывать в том направлении, что я предложил рассмотреть, или еще нет?

Сколько DS18B20 может обслужить Atmega16

Добавлено: Вт июн 23, 2009 14:55:08
lkote68
Охмурять будем 25.06.09 Поеду в командировку. Не твой код еще не пробовал. С лету не понял как заменить те что встроенные точнее сказать подменить. Имена нужны ж теже чтоб ниче не нарушить. А так работает пока все подмигивая зеленым глазом. Ща сижу обдумываю структуры БД чтоб удобнее была. Соорудил въюер набыстрячка графики отрисовывает по 8 каналам по одному датчику а в таблице рисует все что етсь. Вроде успел.

Добавлено: Вт июн 23, 2009 18:40:43
Yellow Tiger
Ага, послезавтра, значит... :) Ну, успеха! :)))
С кодом разберёмся,... чуток попозже... ;)

Сколько DS18B20 может обслужить Atmega16

Добавлено: Ср июн 24, 2009 18:06:43
lkote68
Содрал с ADAMA приспособил себе

Добавлено: Ср июн 24, 2009 19:44:33
Yellow Tiger
Эт даа, защищать супрессорами всё, что торчит наружу - правильная привычка! Изображение :)))

Сколько DS18B20 может обслужить Atmega16

Добавлено: Пн июл 06, 2009 10:00:02
lkote68
С небольшими огрехами (не открылся COM порт) презентация состоялась. Были подсунуты данные за предыдущий день :)) . Результатом оного - решение через 2 недели в опытно пром эксплуатацию.

Re: Сколько DS18B20 может обслужить Atmega16

Добавлено: Пн июл 06, 2009 18:34:33
Yellow Tiger
Поздравляю! Рад твоему успеху - дальше будет проще и, одновременно, интереснее. :)
lkote68 писал(а):...не открылся COM порт...
Надеюсь, ты никому не сказал?! Изображение

Сколько DS18B20 может обслужить Atmega16

Добавлено: Вт июл 07, 2009 06:08:01
lkote68
Да уже все работает Выдрал код из проги своей старой

HANDLE handle = CreateFile(SerialPort, //lpfilename
GENERIC_READ | GENERIC_WRITE, //desired access
0, // exclusive access
NULL, // no security attrs
OPEN_EXISTING,
NULL,
// overlapped I/O FILE_FLAG_OVERLAPPED FILE_ATTRIBUTE_NORMAL |
NULL );
if(handle==INVALID_HANDLE_VALUE) {
::MessageBox(NULL,"Невозможно открыть "+SerialPort+". Порт занят другим приложением.",
"Error",MB_OK);
ExitProcess(1);
}

DCB dcb;
GetCommState(handle, &dcb);
dcb.BaudRate = CBR_19200;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
SetCommState(handle, &dcb);

А тот вариант что не открывал (вернее он открывал но не всегда а еще точнее открывал всегда но не с теми параметрами скорость не та была).
Там у меня структура больше менялась. Тут я ее считал скорость и парити поменял и все. Не помню остался варик тот что так хитро скорость менял или нет Надо будет поискать разобраться что за беда
Генеральная линия таже ж :))