Например TDA7294

РадиоКот >Схемы >Питание >Блоки питания >

Теги статьи: Добавить тег

Записки пластического реаниматолога

Автор: moai
Опубликовано 20.09.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

 


Файлы:
Статья в том виде, как она замышлялась
Текст и листинг программы, .hex и .eep-прошивки


Все вопросы в Форум.




Как вам эта статья?

Заработало ли это устройство у вас?

18 4 11
2 0 0