Gerik_PP писал(а):...В общем я подумал и родил!... коммутируемую 1-вайр микролан...P.P.S. Схема на дальнем конце провода (со стороны DS18B20) во вложении
Вы меня простите, но то ли лыжи не едут, то ли снег закончился...
задача какая? сделать чтоб работало или обязательно "коммутируемый 1-вайр микролан" ?
если первое то (тут немного оговорюсь, с пиками не на короткой ноге):
1) у вас 4 ноги заюзаны на усилители и 4 на переключения. а датчиков всего 4. Язык чешится спросить чего не заюзали ышо штук 20 - переключать переключатель, масштабирование и прочую, в данных рамках имхо не нужную вещь).
2) присмотритесь к схеме включения ds9503 фигура 4 если я правильно вижу из вашего аттача. Обратите внимание - там 4 резистора. и цифры ножек микросхемы посмотрите. т.е. два из нарисованных резисторов внутри милкосхемы, а два нужно подвесить внешнии. обычно это так-же 5 Ом - вполне.
я бы сделал следующее (если чисто по задаче):
1) выкинул бы всю коммутацию.
2) питание датчиков - от 5 вольт. обычно от того же самого, что и МК.
3) подключил бы датчики через схему с фигуры даташита на DS9503. Поверьте - оно рабочее (не одна тысяча продаваемых по всему миру пром. установок. в одной установке до 8 датчиков где то бывает). единственная доработка - поставте вместо разъёма для 1-ваир таблетки обычный разъём (на ваше усмотрение). у нас вошло в обиход юзанье телефонных, на 4 пина разъёмов. крепёжный инструмент прост, удобно менять датчики на лету (отдельный разъём - отдельный функционал датчика закреплённый за ним). т.е. всякую муть по поводу адресации - забудьте, глупости всё это в данном аспекте. протокол упрощается. датчик либо подключён либо нет.
всё.
профит - у вас освободяться ышо ноги.
как работать с ними. идеально повесить всё на один порт. так общение быстрее, обращение ко всем пинам в параллель сразу. сканировать можно без пауз - сразу. разогрев (чисто из практики) не более 0,2 градуса при постоянном (не паразитном питании).
при переключении вход-выход, старайтесь следовать следующей логике:
(чтение слота)
что требуется: необходимо выдать синхро импульс и далее перейти на чтение и через некий тайм аут прочитать его значение.
что нуна сделать: необходимо выдать нолик, необходимый тайм-аут, выдаём еденичку(!), переводим на приём, тайм-аут, чтение пина
т.е. в данном случае, при выдачи принудительно единички - мы делаем фронт круче.
резистор подтяжки внешний. его порядок около 4,5 кОм. внутренний резистор раз в десять больше - его юзать можно но это менее помехозащищённый вариант.
по поводу логики сканирования.
в инете уже пробегало решение:
делаете подпрограммки обработки элементарных действий. заводите таймер вызывающий эти обработчики. каждый обработчик должен иметь возможность: выставить новое время через которое сработает таймер, указать следующую команду (она может быть либо следующей, либо предыдущей - для организовывания циклов побитной записи либо чтения), и иметь доступ к некой структуре состояния (там обычно флаги синхронизаций, счётчики и прочая мелочь).
в главной программе теперь просто составляете список(очень удобно и наглядно если список команд выглядит типа: сбросить, результат сброса записать туда-то, записать байт - значение такое, прочитать байт в эту ячейку памяти и т.д.), команд которые должен ваш "шедуллер" выполнять тупо в цикле.
т.к. датчики в параллель, то сброс, запись в них, синхросигналы - можно выдавать параллельно(!), единственно где вам потребуется разрулить - это чтение с датчиков. т.е. вы читаете байт с порта(в нём есть ВСЕ пины ВСЕХ датчиков) - вам остаётся только методом выщёлкивания необходимых пин в нужные(разные) ячейки памяти(по кол-ву ваших датчиков).
идеально код получается таким - ваш код обработчика, параметры портов (настраивается от проекта к проекту), карта выполняемых команд шедуллера, параметр таймера. всё. т.е. код полностью партируемый при выше указанных условиях.
удачи вам
(круглый)
ЗЫ
Привёл реальный вариант работы с датчиками. сам код простите - дать не смогу. есть нюансы
