Автор: moai
Опубликовано 20.09.2011
Создано при помощи КотоРед.
2011
(дорогому Радиокоту в день шестилетия – водевиль в шести картинках, с прологом и эпилогом)
Действующие лица и исполнитель:
П:
Петрович, почти что невинная жертва неочевидных обстоятельств.
ИП:
Источник Питания Б5‑44 в состоянии между клинической смертью и свалкой металлолома.
К:
Кеша. Маленький декоративный орел. Добровольный помощник. Куда ж без него!
МК:
интегрируемый МикроКонтроллер (с обвязкой и питанием).
я:
скромный автор этих строк, он же, собственно, исполнитель.
Пролог.
я:
Фу, Петрович, и кто только научил тебя так гнусно выражаться вслух?! Я, знаешь ли, даже стоя в караулах на гарнизонной гауптвахте, так ни разу и не смог выдавить из себя ни столь витиеватого, ни на таком градусе эмоционального накала...
П:
Да ну тебя, трепло военморское! Гляди, как у ТМ8-го корпус разворотило. А что еще заодно с ним сдохло – одному Богу известно.
я:
Впечатляюще. И как только тебе это удалось?
П:
Отремонтировал модуль, решил проверить, подал 15 В, а он ка-ак бабахнет! С дымом, с искрами... Измерил напряжение, а на выходе источника – 33 В вместо 15 В.
я:
А откуда подавал?
П:
Да вон он, в стенде, зар-раза.
я:
Б5‑44? О, замечательная машина! Я бы даже сказал – заслуженная. Ветеран лабораторного электропитания. Как же это ты напряжение на выходе не проверил?
П:
Как, как... Выставил на переключателях – и всё. Там же механика сплошная. Толком даже ломаться нечему.
я:
Ну, это ты зря. (тычу вольтметром) Действительно, 33 В.
П:
Наверное, регулирующий транзистор в стабилизаторе пробился. Совсем не ожидал. Там же защита... противоракетная. Вот, блин, угораздило! Сейчас придётся выкусывать и менять подряд все микросхемы и электролиты. Считай, повторная заводская сборка, причем даже больше, чем с нуля.
я:
Ну зачем же – подряд? Может, кто жив остался... А насчёт стабилизатора – сейчас проверим. (выставляю «0» в десятках вольт) Смотри: 5 В на выходе – в точности, как доктор прописал. Короче, диагноз ясен. В кодовых переключателях ПП10 неподвижные ламели выгравированы на платках из фольгированного стеклотекстолита и покрыты палладием. Гальваническое покрытие по ходу жизни сдирается, металлические опилки забиваются между ламелями и замыкают их. У тебя, видно, получилось так, что замкнулись ламели «1» и «2» в разряде «х10». Ты думал, что включил 10 В, а на ЦАП реально выдалась команда: 10 В + 20 В. Итого: 30 В.
П:
Да ну?!
я:
Точно. Мне как-то довелось с подобным столкнуться. Лет так тридцать пять назад тому, в позднем... э... младенчестве. Гляди: (переключаю «0» на «1») вот те снова 33 В. Кстати, замена кодовых переключателей в источниках серии Б5 – геморрой в тяжелейшей форме. Не по наслышке знаю – лично врачевал.
П:
И что же теперь делать?
я:
Ну... Например, поручи кому-нибудь отремонтировать. А то – сам займись. Или тебя этому в школе не учили?
П:
Издеваешься?! Мне кто-то дал право кем-то командовать? И, между прочим, у меня – в отличие от некоторых, сидящих на вахте, почесывая пузо и разгадывая дебильные кроссворды для домохозяек, – план. А теперь ещё и эта хрень вдобавок...
я:
Ладно, не канюч, вынай источник, взгляну между делом. Техописание есть? Тоже давай сюда.
П:
А модуль?
я:
Что – модуль?
П:
Не возьмёшь заодно?
я:
(саркастически) Интересно, и кто только додумался подать на него все 30 В вместо его родных 15 В?
Молчи, придурок, и не дергайся. Не хватало, чтобы ты ещё со стола мне на ногу сиганул. Никуда твои запчасти не денутся, вот они все до одной – в ящике. Сам виноват: не спалил бы Петровичу модуль – никто в твоих потрохах сейчас бы не ковырялся. А пылищи-то, грязищи! На выходном резисторе байпасного источника тока весь компаунд обгорел и осыпался, изоляция проводов в жгутах местами насквозь проплавлена – самых до жил... Да-а, дружок, а как всё-таки насчёт помойки? Нет, случаем, такого последнего желания?
ИП:
(от страха) Ик... Ик... Меня!!! За что?!! (жалобно) Не на-а-адо!!! Я ведь столько киловатт-часов честно отдал! И в нынешних ценах я сам уже как пара айфонов!.. Почти...
я:
Ладно, не дрейфь. Сейчас пройдусь кистью и пылесосом.
ИП:
(нервно) Ой! Хи-хи-хи! Ха-ха-ха! Щекотно!
я:
Так, лежи, отдыхай. А я пока поищу кодовый переключатель на замену.
Картинка вторая – в тщетных поисках решения «в лоб».
я:
Петрович, а что есть у нас на складе из кодовых переключателей-счётчиков?
П:
Погоди, сейчас базу открою... Вот, есть МТ-шки для поверхностного монтажа и для установки пайкой в отверстия. А какой точно надо?
я:
Вообще-то, как минимум, один ПП10-й, причём желательно с ограничителем хода в позиции «3» в старшем разряде.
П:
Не, больших со счётчиком – вообще нет.
я:
Как и предполагалось, зверь редкой породы, давно вымерший за компанию с динозаврами. (внезапное озарение) Ладно, не грузись. Слышь, а если я тебе его электронным счётчиком заменю, ты не против?
П:
А как им управлять потом?
я:
Ну... Могу, например, сымитировать так, что будет практически неотличимо от исходного.
П:
(замученно) Да делай, что хочешь...
Картинка третья – творческо-теоретико-эскизная.
К:
Привет, привет, привет!
я:
Ну-ну. Как поживаешь?
К:
Так себе – скучно... А ты, гляжу, что-то новенькое удумал?
я:
Угадал. Вот, решил вживить электронное управление ЦАП в старый лабораторный источник питания Б5-44.
К:
Можно я посижу рядом, полюбопытствую?
я:
А в клавиатуру гадить будешь?
К:
(возмущённо хлопая крыльями) Да ты что! Да чтобы я! Да когда вообще такое было! (тяжёлый вздох) То есть буду, конечно... Сам прекрасно знаешь, каждые двадцать минут. Но я же не со зла, а на автопило... то есть на автопомёте – австралийским светло-зелёным шекам так положено. И к тому же совсем по капельке.
я:
Н-да? А клавиатуре, между прочим, и этого хватает. Ладно, садись рядом на гибискус. Не ври, оттуда всё прекрасно видно. Заодно можешь кору клювом поточить: специально для того он и был посажен.
К:
(бормочет) А обналичка на стенке в гостиной всё равно вкуснее. (мечтательно) Морилка – покруче чесночного кетчупа от Heinz!
я:
Что-о?! Немедленно в клетку!!!
К:
(поспешно) Я на самом деле вот о чём сейчас подумал: у Б5-х сзади есть розетка Centronix – специально для подключения внешнего управления ЦАП-ом. Может, сделать внешний блочок управления и включить его через этот разъём? Тогда внутри вообще не придется ничего расковыривать...
я:
Не канает. Источник стоит, можно даже сказать, висит в стенде, лепить ему костыли снаружи довольно проблематично. Кроме того, оставлять дохлый кодовый переключатель на месте чревато: вдруг кто крутнёт по незнанию. Я безусловно встрою микроконтроллер, подающий сигналы на ЦАП, прямо в корпус источника. А индикацию уставок и кнопки управления выведу на переднюю панель через вырезы для кодовых переключателей.
К:
Слушай, а почему бы тогда вообще не выкинуть всю старую начинку целиком и не заменить её новой, современной?
я:
Я, знаешь ли, всего лишь пенсионер, а не миллионщик Савва Тимофеич Морозов. И заводится вся эта бодяга вовсе не из любви к чистому искусству, а ремонта средств производства для. Ну, и – опционально – ради лёгкой активизации кровообращения в лобной доле левого полушария. Потому собираться всё будет исключительно из хлама, имеющегося на родном предприятии, и в прочих залежах неликвидов.
К:
Это неспортивно.
я:
Зато экономно и справедливо. Кроме того, ограничения в изобразительных средствах заставят проявить максимум изобретательности. Ладно, к делу. Общая мысль тривиальна. Берём шесть 4-разрядных регистров, которые будут имитировать кодовые переключатели. Выходы регистров подадим на мощные буферные элементы с открытым коллектором, которые в свою очередь нагрузим на герконовые реле ЦАП. Вводить данные в каждый разряд будем группой из двух кнопок, расположенных одна над другой: однократное нажатие на верхнюю будет увеличивать значение в разряде, а на нижнюю – уменьшать. Каждому разряду, естественно, поставим в соответствие свою группу кнопок. Для ввода данных, их индикации и записи в регистры соберём простейшую схему на наидешевейшем микроконтроллере с минимально потребным числом ног.
К:
И сколько же этих самых ног ему по-твоему будет потребно?
я:
Перед тем, как считать, зададимся некоторыми начальными условиями. Во-первых, в наличии имеются индикаторы повышенной яркости оранжевого цвета с десятичной точкой и общим катодом: hpHDSP-7503. Поэтому выбор знакоместа для индикации будет осуществляться нулем. Во вторых, сразу после включения выходы микроконтроллера находятся в 3-м состоянии. Обрыв на входе ТТЛ логика обычно интерпретирует как логическую «1». Поэтому активный уровень сигналов, управляющих записью уставок в регистры и подачей выходного напряжения, примем за логический «0». А теперь калькулируем. √ Независимые уставки: 3 по току плюс 3 по напряжению. Итого под сигналы выбора знакомест индикации и соответствующих им регистров уставок (давай назовем их условно –ВБР[р]): 6. √ Под образ цифры, выводимой на 7-сегментный индикатор, естественно: 7. √ Каждый регистр уставки содержит инверсию двоично-десятичного представления цифры в соответствующем разряде. Поэтому для загрузки любого кода в регистр знакоместа достаточно 4-х битов. Порты микроконтроллера, используемые для вывода данных на индикаторы, в режиме разделения времени вполне можно использовать и для выдачи информации в регистры уставок. Назовем подмножество из 4-х линий, предназначенных для этой цели, шиной D[0/3]. √ Под общий для всех строб регистров загрузки уставок, пусть он называется –ЗАП, отведём 1 линию, а конкретный регистр уставки при записи будем адресовать ранее упомянутым сигналом выбора знакоместа –ВБР[р]. => Ещё 1 независимый сигнал – управление ЦАП, которым будем включать и выключать выходное напряжение. Назовем его –OE и будем считать, что «0» означает команду «Вкл», а «1» – совсем наоборот: «Выкл». Итого имеем: 6 + 7 + 1 + 1 = 15 выходных сигналов. Следовательно, из имеющегося в наличии нашим требованиям удовлетворяют, как минимум: ATtiny2313A (18 линий ввода-вывода) и ATmega8A (23 линии ввода-вывода). Задействуем внутренний тактовый RC-генератор (в самом деле, зачем же кварцевать реле и примитивнейшую тастатуру?). Тогда для организации ввода у нас остаётся: √ на ATtiny2313A = 18 – 15 – 1 /*–Reset*/ = 2 входа, √ на ATmega8A = 23 – 15 – 1 /*–Reset*/ = 7 входов.
К:
А если задействовать под ввод-вывод ещё и ногу, через которую выведен –Reset...
я:
...то придется к тому же собирать ещё и другой программатор, на что мне именно сейчас вовсе не хотелось бы отвлекаться.
К:
С чего это вдруг?
я:
Забыл, что ли? После отключения цепи сброса от внешнего вывода фьюзом RSTDISBL активировать режим программирования по SPI будет невозможно. А учитывая постулат Майерса, согласно которому программисты проявляют наибольшую изобретательность именно при совершении ошибок... (подозрительно) Кстати, а ты шлейф от бластера, часом, не отгрыз?
К:
(высокомерно-оскорблённо) Я тебе что, хомяк домашний – хлорвинил жрать?!
я:
Ха, знатный каламбурчик получился! Знаешь ли ты, что по-английски дом – это home? Так кого возьмём за платформу?
К:
(с энтузиазмом, бегая вправо-влево по ветке) Мегу, мегу! Выводов на всё – про всё с лихвой хватит. Поставишь вместо переключателей пару валкодеров – раздельно на регулировку тока и напряжения – красотища! Удобство!
я:
Валкодеров у меня нет, впрочем, как и желания их покупать. Цель помнишь?
К:
(сникшим голосом) Ну, тогда из мышей оптопары изымешь...
я:
О, да ты, парниша, прям подпольный трансплантолог-садист какой-то. И потом: где же я возьму столько мышей?
К:
(с жалким видом) Слышал, их можно наловить какой-то мышеловкой. Только не знаю, где...
я:
Э, дружок, между прочим, те, кто ловит мышей, точно с таким же, если не с большим аппетитом уплетают и птичек. Причем в сыром и иногда даже неощипанном виде.
К:
(убежденно, с чувством) Это всё страшные сказки для птенцов, чтобы перед сном сидели в гнезде тихо и не не шалили. (высокомерно-пренебрежительно) И вообще, видал я этих твоих так называемых птицеедов – лысых заморышей. (ностальгически) Как я их гонял, как гонял! Чуть было не склевал обоих. До последней косточки.
я:
Ах, вон оно что! У тебя, видно, совершенно выветрился из головы тот случай – где-то через недельку после того, как они перешли с Китти Милк на мясной паштет. Пашик, по-моему, тогда за всё тебе припомнил – и за себя, и за Лёшика, и за каждую косточку в отдельности.
К:
(смущенно) Ну... Я тогда уже начал линять, и тем перьям из хвоста и без того уже дня три, как пора было выпасть. Даже без всякой посторонней помощи.
я:
Крайне неубедительно. Что же ты тогда так верещал и ругался? Короче, буду делать на ATtiny2313A. И потом, у ATmega8A целых 28 ног. А это – плюс 5 мм ширины платы дополнительно.
К:
(обескураженно) Но ведь тогда всего два свободных входа остаётся...
я:
Ну и что? Нам, собственно, только две команды и нужно распознать: следует увеличить или же уменьшить значение в определенном разряде уставок. А адресные сигналы для выбора разряда мы уже заготовили.
К:
А вот и не две! Ещё нужны команды: включить ЦАП и выключить ЦАП. Так что уже четыре.
я:
Чересчур прямолинейно. Включено и выключено – два взаимоисключающих состояния. Поэтому их можно вводить одной тактирующей командой: на каждую нечетную по порядку – включить, а на каждую четную – выключить. Так что всего – три.
К:
(ехидно) А входов-то всего два!
я:
Ну и что? Потенциалами на двух входах можно закодировать целых четыре состояния, смотри: √ 11 ни одна кнопка не нажата √ 01 нажата одна из кнопок, подающая «0» на вход «увеличить» √ 10 нажата одна из кнопок, подающая «0» на вход «уменьшить» √ 00 нажата кнопка вкл/выкл ЦАП, подающая «0» на оба входа одновременно. Ну, как тебе?
К:
(задумчиво) А если при этом «0» на конкретные группы кнопок подавать с адресных линий выбора разряда, то тогда опрос нажатой кнопки будет автоматически синхронизирован с указанием того, в каком именно из регистров следует скорректировать значение. Так?
я:
Молоток!
К:
(с сомнением) Опасно всё это. А вдруг как кто случайно нажмёт несколько кнопок в одном ряду? Получится короткое между выходами микроконтроллера, причем один из них будет в «0», а другой – в «1»... Нехорошо!
я:
Дважды молоток. Но и на этот случай есть давно известное решение: поставим отсекающие диоды. Возьмем миниатюрные германиевые – ГД507А, с минимальным прямым падением, чтобы нажатие кнопки надёжно определялось. Что ещё нам нужно? Регистры. В выпаянном хламе есть замечательные защелки с тремя состояниями – 74ALS873BNT, по паре в одном корпусе. Ценное в них то, что выходы включаются низким уровнем. Мощные высоковольтные буферные элементы без инверсии имеются даже в К155 – это ЛП9.
К:
Стоп, а почему именно без инверсии?
я:
А вот почему. При запрете выходов регистров буферные элементы тоже запрутся, реле в ЦАП отключатся, и выходное напряжение станет равным 0 В. Кстати, это гарантирует то, что выходное напряжение, соответствующее случайному содержимому регистров сразу после включения питания, не будет подано на выход источника до момента завершения инициализации контроллера и записи в регистры уставок желаемых значений. И ещё: номинал ограничительных резисторов в коллекторах буферных элементов выберем так, чтобы обеспечивалось чёткое срабатывание реле ЦАП при минимально возможном токе. Кстати, обмотки реле ЦАП уже шунтированы по коммутационному выбросу напряжения диодами – спасибо изготовителю! Давай-ка для начала распределим сигналы по выводам микроконтроллера так:
Ну, что, рисуем схему?
К:
(с уважением) Ух ты! Сложно получилось...
я:
Не так сложно, как муторно будет собирать.
К:
А зачем управление сегментами на шине так перетасовано?
я:
Это чтобы провода в шлейфе до индикаторов не пришлось перекручивать друг через дружку.
Картинка четвертая – проектно-конструкторская.
К:
(возбужденно) Ну, давай, разводи!
я:
Ага, щас. Вот абсолютно никакого желания нет. Зато есть обрезки старой макетной платы. Отпилю кусок, какой надо, на нем и соберу.
К:
(разочарованно) А как же Sprint Layout, утюг, лазер, фоторезист и дрель, в конце концов?
я:
Намекаешь на то, что тебе до сих пор не удалось испробовать на вкус ни хлорного железа, ни каустика? Смею тебя заверить: ни то, ни другое – далеко не рахат-лукум. И потом: ведь сверхзадача современной цивилизации – это утилизация хлама. Больше хлама в деле – меньше техногенное загрязнение окружающей среды. Вспомни-ка про Большое тихоокеанское мусорное пятно!
К:
(саркастически) О, да! По крайней мере, звучит пафосно. Только ведь не влезет...
я:
Это ещё почему?
К:
Считаем: 1 х МК + 3 х регистра + 2 х ЛЕ1 + 4 х ЛП9 = целых 10 корпусов. Да и резисторов, как нерезанных собак. А по ширине тебе нужно уместиться, считай, в 6 – максимум 7 одиночных ПП10.
я:
Не беда, сделаем бутерброд: управляющую логику разместим на одной плате, а буфера с резисторами – на другой (кстати, у нас есть чуток резисторных сборок 8 х 1 кОм с общей точкой). Платы друг к дружке прикрепим столбиками из толстой медной проволоки на пайке. По ним же раздадим питание на обе половинки.
К:
А ведь должны быть ещё и кнопки, и индикаторы. Кстати, какие кнопки будешь ставить?
я:
Здесь поступим неоригинально. Имеется дохлый китайский пульт дистанционного управления от не менее дохлого китайского чего-то-там (а какой жуткой химией воняет):
Вырежем кнопки подходящего размера из общей резинки и прижмём их лицевой панелью из цветного прозрачного оргстекла. Для индикаторов в плате неподвижных контактов прорежем отверстия. Получится пирог о трех коржах: плата индикаторов – плата неподвижных контактов – лицевая панель:
Фрагмент лицевой панели.
Лицевую панель выполним в виде полосы, которую притянем винтами поверх штатной фальшпанели по краям и в центре. В ней же будут просверлены отверстия под кнопки коррекции уставок.
Плата неподвижных контактов.
На плате неподвижных контактов со стороны, обращанной к плате индикаторов, ставим отсекающие диоды.
Плата индикаторов.
На плате, предназначенной для индикации напряжения, установим резистор, через который зажжём десятичную точку в разряде Ux1. Индикаторы hpHDSP-7503 имеют внутреннее соединение между выводами 1 и 6. Сигнал выбора индикатора заводим на выводы 6, а с выводов 1 подаем его же на отсекающие диоды групп кнопок МЛ[адшего], СР[еднего] и СТ[аршего] разрядов. Размеры выбраны так, чтобы лицевая панель нашего устройства ввода-вывода с небольшим запасом закрывала по высоте вырезы в передней панели Б5-44, а платы с электроникой входили бы в них.
К:
(сконфуженно) Что-то не представлю себе, как там устроена внутри кнопка от китайского ПДУ.
я:
Проще некуда. Резиновый цилиндрик, нижняя плоская часть которого сделана токопроводящей путем добавления в резиновую массу графитовой пыли, одетый в выполненную с ним заодно резиновую юбочку, играющую роль возвратной пружины. При нажатии на кнопку юбочка сминается, цилиндрик опускается на печатную плату и замыкает своей науглероженной подошвой разрывы между дорожками на плате. При отпускании юбочка расправляется и поднимает контакт над платой.
К:
Замыкание дорожек резинкой?! Да у такой кнопки должно быть гигантское переходное сопротивление!
я:
Как сказать... При расстоянии между неподвижными контактами-дорожками порядка 0,2 мм получается где-то 1,2...3 кОм. Подать «0» на вход КМОП с подтяжкой к «1» порядка 50 кОм даже этого вполне хватает. Впрочем, коли есть сомнения в надежности, давай-ка налепим снизу на замыкатели кнопок маленькие кружочки из медной фольги. Только очень-очень хорошим клеем. Для подачи сигнала –ОЕ поставим обычную микрокнопку, а толкатель для неё вырежем из той же резинки, только возьмём что-нибудь посолиднее, например, «ОК».
К:
Кстати, чем собираешься его кормить? Отдельного изолированного +5 В в Б5-44, как известно, не предусмотрено.
я:
Легче некуда. Нерегулируемые интегральные стабилизаторы напряжения серии КР142 – лучшие друзья конструкторов радиоаппаратуры! Пжалста:
Источник питания для контроллера – схема.
Первичные +12 В следует взять от того же внутреннего изолированного выпрямителя, от которого питаются обмотки реле ЦАП. Символом общего провода здесь обозначен вывод -12 В того же выпрямителя. На самом деле он изолирован от корпуса и подан только на контакт 50 разъема входа управления ЦАП и на подвижные контакты кодовых переключателей.
К:
(с сомнением) А кто тебе сказал, что его одного будет достаточно? Даже у кошки и то целых четыре ноги (ага, вход, выход, земля и питание). А этот больше похож на недомерка какого-то.
я:
Просто больше 200 мА для наших целей не нужно. (12 – 5) В х 0,2 А = 1,4 Вт, что меньше габаритной рассеиваемой мощности КР142ЕН5А (10 Вт, если верить паспорту). Поэтому его одного за глаза должно хватить. (с жестом и акцентом от Фрунзика Мкртчяна) Я так думаю. Стабилизатор поставим на небольшой – квадратов на 40...50 – радиатор. Поскольку вывод «–» электрически соединён с фланцем ЕН5-го, радиатор поставим на изолирующей стойке, чтобы развязать его с корпусом В5-44:
Источник питания для контроллера - конструкция.
На каждой из плат контроллера поставим по керамическому конденсатору ёмкостью 1,0 мкФ и по электролиту на 22,0 мкФ. Так, на всякий случай – прибить клыки по +5 В, которые могут вызвать ложные состояния входов.
К:
(задумчиво) А ещё я не вижу, как ты собираешься отлаживать микропрограмму.
я:
В смысле?
К:
В смысле замещать неправильное правильным. Для внутрисхемного программирования ну абсолютно ничего не предусмотрено.
я:
И не надо. Под микроконтроллер поставлю панельку. В случае необходимости – выну и перезапишу отдельно от всего остального. Ну что, собираем? Смотри только, не вздумай сесть ненароком на паяльник!
К:
Не рано? Может, сначала отмакетировать, программу написать и отладить? А то мало ли – придётся схему править...
я:
Нет никакого смысла. Нечего в ней править: она из тех, что «будучи правильно собранной из исправных деталей не нуждается в налаживании». И метод «снизу-вверх» вполне адекватен полнейшей её банальности.
Так, готово, вот что на скорую руку получилось:
К:
(напряженно) С этим всё лёгкое и закончилось.
я:
Ошибаешься, самое трудоёмкое ещё даже и не начиналось.
К:
??
я:
Операция по имплантации получившегося протезного мозга в Б5-44.
К:
Как, а МИКРОПРОГРАММА?!!
Картинка пятая – студийно-записательская.
я:
Что – микропрограмма? Подумаешь, большую проблему озвучил. Да я вот прямо сейчас её из головы выдумаю.
К:
Ага. (ядовито цитирует) «Напишите первое и последнее предложения – PROCEDUREи ENDили их эквиваленты».
я:
Не надо фарисействовать, когда только-то и нужно, что слегкахакнуть. Все основные моменты были оговорены ранее и даже реализованы в железе. Поэтому просто уточним некоторые доселе не рассмотренные детали – и вперёд. Итак, поскольку у нас имеется два режима – «Включено» и «Выключено», необходимо как-то их меж собой различать (ну в самом деле, не языком же лизать выходные клеммы!). Поскольку кроме индикаторов уставок никаких других устройств отображения не предусмотрено, то будем различать режимы следующим образом: => изображение на индикаторах мигает – ЦАП выключен, и выходное напряжение равно 0В (не заморачиваясь, положим по пол-секунды на включение и на гашение индикаторов); => изображение на индикаторах постоянно – ЦАП включен, напряжение подано на выход. Последние значения уставок будем хранить в EEPROM – по 1 байту на каждый виртуальный кодовый переключатель.
К:
А зачем отводить так помногу? Ведь под каждую уставку и по пол-байта хватит.
я:
И что с того? Приложение – узкоспециализированное, данных – минимум. Даже если запихнем в ту же EEPROM еще и образы цифр, то при этом займется суммарно всего 16 байтов из 128.
К:
Кстати, а ты, помнишь, что EEPROM – это штука далеко не вечная? Согласно документации Atmel гарантировал только 100 тыщ циклов перезаписи.
я:
Безусловно. Поэтому сделаем так. В режиме «Выключено» запись уставок в EEPROM не делаем. В этом состоянии кнопками корректировки можно будет выставлять любую уставку как угодно. Запись же измененных уставок в EEPROM будет произведена лишь по нажатию кнопки «ОЕ» и только при переводе в режим «Включено».
К:
Неудобно: каждый раз для смены уставки нужно будет выключать источник. А если вообще нужно будет менять напряжение или ток постепенно и без отключения?
я:
Не вопрос, сделаем так: если уставка меняется в режиме «Включено», то её новое значение сразу же и запишем в EEPROM.
К:
Как-то коряво. Давай лучше так: если уставки меняются в режиме «Включено», то их новые устаканившиеся значения запишем в EEPROM не сразу, а по истечении какого-то значительного тайм-аута, например, секунд через 10...20, а то и через целую минуту.
я:
Звучит здраво, пусть будет по-твоему. Так, что ещё осталось? А, ну да, конструктивные ограничения уставок: => по напряжению: 00,0...30,0 В => по току: 000...999 мА Теперь, вроде, всё. Запускаем AVR Studio – и вперёд!
К:
(разочарованно) Что я вижу! Отчего проект не на C или C++?
я:
Преднамеренно усложняю себе жизнь. «Real programmers don’t use Pascal». А иногда даже C, Java и особенно Cobol (фу, какая гадость, аж затошнило). Да здравствуют полиненасыщенная система команд и шестнадцатеричные баксы от несравненного Дональда Кнута!
К:
(с выпученными глазами) Что-что?!
я:
Ничего. Былое и думы. Давай-ка лучше потрудимся над кодом. ATtiny2313A имеет два независимых таймера – 8-разрядный T0 и 16-разрядный T1. На коротком T0 соорудим запускаемый по требованию таймер подавления дребезга кнопок, а на длинном T1 – автогенератор полусекундных меток времени. Эти метки будем использовать для управления миганием индикаторов, а также для подсчёта момента отложенной записи в EEPROM. После включения или сброса по Brown-Out контроллер инициализируется: выключает ЦАП, читает уставки из EEPROM и образы цифр из Program Flash в RAM. После этого он входит в бесконечный цикл, в котором выдает на индикацию уставки тока и напряжения, опрашивает кнопки управления и соответствующим образом интерпретирует их нажатие – иными словами, реализует проектируемую нами бизнес-логику. Чувствительность к сбою питания выставим по ма ксимуму: 4,1...4,5В, т.е. BODLEVEL[1:0] = 00.Ну, поехали.
К:
(обеспокоенно) О, а это ещё что такое? С какой радости ты смещение в сегменте данных задвинул в 0 и там переменные объявляешь? Разве так можно делать? И ассемблер, вон, ругается...
я:
Конечно же, это сделано намеренно. Видишь ли, так называемая развитая система команд Atmel – это по большому счёту чрезвычайный RISC. Вариантов команд арифметики и логики, в которых операнд располагался бы непосредственно в RAM, в ней нет. Поэтому для того, чтобы произвести над данными из RAM какие-либо осмысленные действия, необходимо сперва вытащить эти данные в регистры общего назначения, обработать их опять же на регистрах, а затем записать обратно в RAM. Но! В архитектуре Atmel есть одна особенность: к регистрам для записи и считывания данных можно обращаться с помощью тех же команд доступа к RAM, правда, если только задавать адреса RAM в определённом диапазоне. Это-то я и делаю. В результате с одной стороны получаем единую для всех знакомест процедуру доступа на запись/чтение уставок в/из RAM по смещению, вычисляемому в регистре-счетчике цикла и однозначно задающему линию –ВБР[р]. С другой стороны получается, что эти уставки уже находятся в регистрах, следовательно, над ними можно производить арифметико-логические операции или выводить их в порты, не растрачивая лишний раз драгоценное время собственной жизни на написание абсолютно неинтересного кода для вытаскивания данных из RAM в регистры и их обратного сохранения из регистров в RAM.
К:
(язвительно) Ничего не скажешь, хитро. Чем-то даже смахивает на какой-то первобытный полиморфизм.
я:
А то ж! Это ведь даже чуть круче, чем просто объявление register.
К:
А зачем столько комментариев? Кто их читать-то будет?
я:
(уклончиво) Там поглядим. И потом, согласно критерию Гарцмана всякая плохая программа нуждается в обширной, детально проработанной документации. Так что я, считай, просто документирую её способом: «текст программы сам всё объясняет».
К:
(злорадно) Значит, ты пишешь заведомо плохую программу? А хорошая программа в чём по-твоему нуждается?
я:
Хорошая программа в полном соответствии с вышеупомянутым критерием нуждается лишь в мелких доработках. Идея! А сочиню-ка я упреждающим порядком такую доработку: пусть десятичное переполнение или –1 в младшем разряде вызывают соответственно десятичный перенос в старший разряд или заём из старшего разряда.
* * *
Вот и готово. Как видишь, каких-то 9 сотен с копейками строк, включая разрядку и комментарии. Бысто – и ничего сложного. Шьём:
Картинка шестая – микрохирургическая.
я:
Собирайся, едем в гости. На все выходные.
ИП:
(подозрительно) Это ещё к кому? И главное – зачем?
я:
Ко мне. Что, не в курсе? Я держу дома частную клинику, специализирующуюся на лечении отдельных разновидностей геморроя у источников постоянного тока серии Б5.
ИП:
Врёшь! Небось, решил нелегально пустить меня на органы?! Спаси-ите!!!
я:
Согласие умалишённого никому не требуется. Каталку для больного! В смысле – автобус.
* * *
я:
А ну, паршивец, кыш оттуда!
К:
(с видом полной непричастности) Привет, привет, привет! Кеша хороший!
я:
Не смей расклёвывать уплотнение! Сколько можно повторять одно и то же? Пластиковое окно денег стоит, между прочим.
К:
(надувшись) Между прочим, между прочим... Между прочим, те, кто по-настоящему любит своих меньших домашних братьев, время от времени покупает им бубль-гум. Это даже по ящику показывали. А мне? Хоть раз в жизни?! Вот, приходится заменять его силиконовым суррогатом.
я:
Категорически противопоказано. Только просо, овёс и семечки. Плюс крутое яйцо два раза в неделю и витамины в поилку.
К:
А как же гарантированная Конституцией свобода выбора?! Сво-бо-ду-раз-но-о-бра-зи-я-в-пи-та-ни-и!!!
я:
Бубль-гум для тебя – это всё равно, что последний ужин для таракана. А ты, между прочим, тоже денег стоишь. Даже больше, если приплюсовать визиты в ветеринарку и всё то, что тебе удалось к настоящему моменту изгрызть и раскокать.
К:
(заинтересованно) Ну-ка, ну-ка... А что это за хлам в мешке?
я:
А, это как раз и есть наш страдалец. Сейчас мы его...
ИП:
(злобно) Моя передняя панель!!! Зачем отломал кодовые переключатели?! Зачем крутишь эти дырки?! Их же там не должно быть!
я:
Не боись, так задумано. Первый этап – пластическая операция. Сейчас такое заварганим – твоя морда будет смотреться круче, чем у матричного Кианы Ривза.
ИП:
Так я и поверил! Ой, что будет... Ох, предохранителем чую – хана приходит!!
К:
(театральнозакатывая глаза) О, да. У него ведь не то, что диплома пластического хирурга – даже справки о посещении кружка юных прозекторов – и той нет!
* * *
(задумчиво) Хотя... Хм... Вроде как вполне терпимо. Думал, получится мерзопакостнее...
я:
Так, наживляем +5 В...
К:
(сидя на плече,во всю глотку и прямо в ухо) Включай!!!
МК:
(бодро мигая индикаторами) Специализированный микроконтроллер на платформе ATtiny2313A! Представляюсь по случаю прибытия для дальнейшего прохождения... (замечает распотрошённый Б5-44, с неподдельным ужасом, срывающимся голосом) Это что, ТУДА?
я:
(участливо) Что-то не так?
МК:
(возмущённо) Меня! Последнее достижение мировой микроэлектроники!! В это тесное ржавое железо!!!
я:
Ну, не такое уж оно и ржавое. И железа там не так, чтобы очень много (если, конечно, забыть про силовой трансформатор), в основном медь да силумин. А теснота для микрухи – так вообще не проблема.
К:
(глумливо) Зато какие перспективы! Будешь у нас... придумал: флагманским управленцем!! Вот это понимаю, карьера! Всего двадцать секунд под напряжением – и уже в люксах!!!
МК:
(в отчаянии) Я – гражданин иностранного государства! У меня даже права нет служить здесь, разве что на каком-нибудь «Мистрале»!! Уй-ё, мамаша Atmel, скорее родите меня обратно!!!
я:
(с металлом в голосе) Отставить истерику! Всё, пойдем смотреть каюту, представляться личному составу и принимать БЧ-7 (сращиваю провода, прикручиваю на место запчасти). А теперь (тумблер «ВКЛ.» вверх) – боевая тревога фактически!Всё, у кого что ещё осталось, к бою-походу приготовить!
МК:
(печально, глядя на мир через иллюминаторы в лицевой панели) «В желе-езе оби-ильно растё-от интеллект...» (последнее,видимо, имея в виду себя)
ИП:
(подхватывает издевательски) «...Я де-елаюсь му-удрым и си-ильным, как кнехт!»
я:
(удовлетворённо) Так, дым не идет, напряжение нормальненько регулируется, ток – тоже. Вот, считай, и всё.
Эпилог.
П:
(вместо «спасибо») Хм... Вроде как вполне терпимо. Думал, получится мерзопакостнее...
* * *
А теперь – благодарности: > Петровичу, устроившему Большой Взрыв, после которого, собственно, всё и закрутилось, > компании Atmel – за разработку и выпуск замечательного ATtiny2313A, за подробную документацию к нему и за бесплатное распространение интегрированной (хоть и несколько глючной) среды для его программирования и отладки, > маленькому домашнему декоративному орлу Кеше – за конструктивную критику в процессе и особенно – за необходимость постоянно находиться в тонусе в ожидании какого-либо подвоха, > сфинксятам Пашику и Лёшику – за приведение в меридиан (хоть и не надолго) декоративного орла Кеши, >компании Nokia – за встроенную в телефон фотокамеру, позволившую поделиться зрительными образами отдельных участников этого действа (возможно, не лучшего качества, но всё же немножко лучше, чем совсем ничего),
и наконец – самую горячую – > нашему имениннику – Радиокоту – за неустанную и эффективную пропаганду здорового образа шевеления мозгами, а также за КотоРед, без коего все описанные выше события так и остались бы не занесёнными на HTML-скрижали.
* * *
Список литературы: «Источники питания постоянного тока Б5-43 – Б5-45. Техническое описание и инструкция по эксплуатации», 3.233.219 ТО «AVR® 8-bit Microcontroller with 2/4K Bytes In-System Programmable Flash ATtiny2313A, ATtiny4313», Rev. 8246A–AVR–11/09 «AVR® 8-bit Instruction Set», Rev. 0856H–AVR–07/09 Джеффри Рихтер «Windows для профессионалов», Rev. 3, Microsoft® Press / ISBN 5-7502-0046-9