Управление семисегментным индикатором

Управление семисегментными индикаторами по одному проводу

Часто бывает ситуация, когда надо выполнить простую задачу с которой справится даже грошовый контроллер вроде ATTiny12, но вот незадача — нужна индикация, а под какой нибудь семисегментный индикатор придется убить дофига выводов, а их всего восемь, из которых два питание, а один Reset. Можно, конечно, взять просто МК потолще, но мне больше по душе разные схемотехнические извраты. Вот и тут камрад Kalobyte подкинул ссылку на прикольную схему управления тройным (а в перспективе хоть десятерным) семисегментным индикатором по одному проводу.

Индикатор зажигается посредством сдвигового регистра 74HC164, всего таких регистров можно навесить очень много, просто соединив по цепи несколько регистров.

Если отбросить RESET, то для проталкивания данных в регистр нужны две линии — Data и Clock. Путем небольшого изврата можно эти две линии обьединить в одну.

Для начала немного теории
Обычная RC цепочка.

Отличается тем, что напряжение на конденсаторе не может измениться мгновенно. Время заряда и разряда зависит от емкости кондера и сопротивления резистора. Оценить его можно по постоянной времени T=R*C , это время за которое заряд изменится примерно втрое (в е=2.7 раз).

Если мы пустим через нее длинный импульс, то конденсатор успеет как полностью зарядиться, так и полностью разрядиться.

Если подадим короткий импульс, по времени намного меньше чем постоянная времени, то напряжение на конденсаторе изменится совершенно незначительно. Так, дрыгнется да и только. То же относительно короткой паузы. Незначительный провал и все возвращается на круги своя. Чуете куда я клоню?

Правильно!
У нас у регистра есть линия данных (Data) и линия строба (Clock). Когда уровень на Clock меняется с нуля на единицу (передний фронт) с линии Data считывается текущий уровень. Их можно разнести по разные стороны RC фильтра. И одни сигналы передавать узкими, другие широкими импульсами.

А теперь думаем. Строб един для всех регистров, а данные различные для разных битов. Поэтому строб будет всегда один, а данные будут меняться. Делаем строб узким и снимаем его до RC цепи. Узкие импульсы не могут пройти сквозь RC цепь, а данные передаем широкими импульсами, которые спокойно перезаряжают конденсатор. Данные мы снимаем после RC цепи.

Получается вот такая схема:

Сигналы Reset я даже рисовать не стал — они там намертво на +5 повешаны. Сброс регистров осуществляется загоном в него нулей. Регистов тут два, но как я уже писал, можно навесить их еще очень много, лишь бы хватило скорости их заполнять.

Осталось теперь хитрым образом формировать биты на линии. Чтобы было понятней, я нарисовал поясняющую картинку, на которой показана передача байта 10011010.

Красная зона это уровень логической единицы, синяя — логического нуля.

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

Красным цветом я отметил фронты на которых происходит считывание данных ну и стрелочками показал текущий логический уровень.

Ниже показаны типовые формы единицы и нуля. Как видишь, тут идет длинный импульс данных, который призван зарядить/разрядить конденсатор до нужного логического уровня, а потом краткий, как иголка, импульс строба. Причем в стробе нам важен только передний фронт.

А вот так выглядит осциллограмма реальной передачи

Вот, взяли и применив копеечный регистр, сэкономили на микроконтроллере. Зажопили кучу выводов и получили моральное удоволетворение от извращенского метода 🙂 Попутно вкурив в очередной пример применения конденсатора и интегрирующей цепочки.

Ссылки по теме:

Источник: http://easyelectronics.ru/upravlenie-semisegmentnymi-indikatorami-po-odnomu-provodu.html

Семисегментные индикаторы. Практическая электроника :

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

Если к ним подключить модулятор, то можно сделать из индикаторов интересные электронные часы. Чтобы более подробно разобраться в этом вопросе, необходимо изучить основные типы устройств.

Также важно ознакомиться с моделями, которые представлены на рынке.

Одноразрядные модели

Одноразрядный семисегментный индикатор (схема показана ниже) в наше время отличается своей простотой. Как правило, контакты у моделей установлены в параллельном порядке. При этом светодиоды используются самые обычные. Сделать электронные часы из одноразрядных индикаторов можно довольно просто. В данном случае блок питания потребуется на 30 В.

Также следует учитывать, что модулятор для этого типа индикаторов может использоваться исключительно одноканальный. Непосредственно регулятор для него важно вывести через двойной переходник.

При этом резисторы для часов подойдут как импульсного, так и инерционного типа. Непосредственно подключение семисегментного индикатора осуществляется через проводник. Предельное напряжение он обязан выдерживать не менее 35 В.

При этом параметр силы тока должен составлять 5 А.

Двухразрядные модификации

Двухразрядные модификации на сегодняшний день являются довольно распространенными. Светодиоды в данном случае чаще всего используются красного типа. Однако на рынке можно найти и другие варианты. Сила свечения у данных индикаторов зависит от производителя. Как правило, контакты у них устанавливаются медного типа.

При этом резисторы используются в основном импульсные. Для того чтобы понять, как сделать часы на практике, необходимо заранее подготовить модулятор, а также преобразователь для устройства. В первую очередь для часов подбирается корпус.

При этом семисегментные индикаторы важно устанавливать на модулятор. Непосредственно регулятор должен располагаться в стороне. Соединяется он с блоком питания через тетрод. Также для лучшей проводимости многие специалисты рекомендуют использовать усилитель.

В данном случае блок питания подойдет на 15 В. В конце работы останется лишь зафиксировать проводник.

Трехразрядные устройства

Трехразрядные устройства обладают большой мощностью. Светодиоды в данном случае имеются резонансного типа, и на рынке они, как правило, представлены белого цвета.

Резисторы для подключения индикаторов применяются инерционного типа. Для того чтобы сделать из трехразрядной модификации часы, потребуется найти качественный модулятор.

При этом управление семисегментным индикатором будет происходить через регулятор кнопочного типа.

Тетроды в данном случае пороговое напряжение обязаны выдерживать на уровне 15 В. Проводимость их зависит от частотности конденсаторов.

Многие специалисты при сборе часов советуют преобразователи устанавливать с тиристором. В данном случае блок питания можно использовать без усилителя. Для подключения индикаторов понадобятся проводники.

Для безопасного использования прибора их необходимо изолировать.

Индикаторы серии E 10561

Семисегментный светодиодный индикатор данной серии отличается повышенным параметром рассеивания. В данном случае цифры видны очень четко.

Светодиоды в таких устройствах используются, как правило, асинхронного типа. При этом резонансные модели также встречаются. Чтобы подключить устройство к регулятору, потребуются мощные резисторы.

В данном случае преобразователи используются с тиристорами.

Пороговая частота этих устройств не должна превышать 3 Гц. При этом блоки питания, как правило, используются на 30 В. В такой ситуации показатель номинального тока должен располагаться на уровне 12 А.

Все это позволит успешно включить индикатор. Непосредственно подсоединение прибора осуществляется через контакты. В некоторых случаях тетрод в цепи может располагаться после преобразователя.

В таком случае можно надеяться на пороговое напряжение на уровне 15 В.

Особенности моделей серии E 15461

Семисегментные индикаторы данной серии относятся к классу двухразрядных. В этом случае светодиоды в устройствах установлены резонансного типа. Для подключения модели используются медные контакты.

Сделать часы в данном случае довольно просто. Модулятор для этих целей можно использовать одноканального типа. При этом резисторы подбираются средней мощности.

Напряжение они обязаны выдерживать минимум на уровне 20 В.

Блоки питания для этих целей можно использовать от персонального компьютера. Также следует отметить, что указанные индикаторы являются довольно компактными.

При этом яркость их можно регулировать при помощи модуляторов. Для этого дополнительно потребуется установка преобразователя. Для повышения мощности свечения используются поворотные регуляторы.

Усилители в данном случае устанавливаются довольно редко.

Подключение устройства серии E 10578

Индикаторы указанной серии имеются с резонансными светодиодами. В настройке они довольно просты и цифры способны отображать четко. Также следует учитывать, что параметр рассеивания у них очень высокий. Таким образом, устанавливать их в электронные приборы можно довольно просто. Как правило, такие модели используются в микроволновых печах.

При этом для секундомеров они также подходят. В данном случае модулятор устанавливается с расширителем. При этом многоканальные модификации являются более распространенными. Усилители для устройств подходят только низкоомного типа. Дополнительно следует учитывать, что частотность модели зависит от блока питания.

Если рассматривать прибор на 20 В, то вышеуказанный параметр будет находиться в районе 4 Гц.

Схема индикаторов серии E 10509

Семисегментные индикаторы данного типа способны похвастаться высокой чувствительностью. При этом светодиоды для них подходят резонансные. На рынке они чаще всего представлены красного и синего цвета.

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

Тетроды в данном случае напряжение должны быть способны выдерживать максимум на уровне 30 В.

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

Применение индикаторов серии E 22563

Индикаторы данного типа на сегодняшний день являются довольно востребованными. На электронные приборы указанные модели устанавливать можно. При этом в промышленной сфере устройства данного типа также являются востребованными. В этом случае светодиоды устанавливаются средней мощности. Причем контактные системы на рынке представлены самые разнообразные.

Подключение моделей к модулятору, как правило, осуществляется через тетроды. Преобразователи подходят с частотой не менее 4 Гц. Дополнительно следует учитывать, что параметр рассеивания свечения светодиодов зависит от мощности блока питания. Если рассматривать самые простые часы с модулятором серии РР20, то он подбирается на 20 В.

Модель на хроматических резисторах

Семисегментные индикаторы на хроматических резисторах встречаются довольно редко. Модуляторы в данном случае могут использоваться только одноканального типа.

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

Блоки питания в данном случае можно использовать от персональных компьютеров. Также важно учитывать, что чувствительность системы зависит от типа тетродов.

Использование оптических модуляторов

Оптические модуляторы, как правило, используются с индикаторами резонансного типа. При этом на электроприборы данные конфигурации устанавливаются часто.

В данном случае регуляторы используются в основном поворотного типа. При этом кнопочные варианты встречаются довольно редко. Резисторы для указанных систем подходят асинхронного типа.

Непосредственно подсоединение модуляторов в цепи происходит через преобразователи.

Источник: https://www.syl.ru/article/213066/new_semisegmentnyie-indikatoryi-prakticheskaya-elektronika

Семисегментный индикатор

Доброго дня уважаемые друзья!
Приветствую Вас на сайте «Мир микроконтроллеров»

Семисегментный светодиодный индикатор
Схема подключения одноразрядного семисегментного индикатора
Схема подключения многоразрядного семисегментного индикатора

Семисегментный светодиодный индикатор, как говорит его название, состоит из семи элементов индикации (сегментов), включающихся и выключающихся по отдельности.

Включая их в разных комбинациях, из них можно составить упрощённые изображения арабских цифр.

Сегменты обозначаются буквами от A до G; восьмой сегмент — десятичная точка (decimal point, DP), предназначенная для отображения дробных чисел.
Изредка на семисегментном индикаторе отображают буквы.

Семисегментные светодиодные индикаторы бывают разных цветов, обычно это белый, красный, зеленый, желтый и голубой цвета. Кроме того, они могут быть разных размеров.

Также, светодиодный индикатор может быть одноразрядным (как на рисунке выше) и многоразрядным. В основном в практике используются одно-, двух-, трех- и четырехразрядные светодиодные индикаторы:

Кроме десяти цифр, семисегментные индикаторы способны отображать буквы. Но лишь немногие из букв имеют интуитивно понятное семисегментное представление.

В латинице: заглавные A, B, C, E, F, G, H, I, J, L, N, O, P, S, U, Y, Z, строчные a, b, c, d, e, g, h, i, n, o, q, r, t, u.
В кириллице: А, Б, В, Г, г, Е, и, Н, О, о, П, п, Р, С, с, У, Ч, Ы (два разряда), Ь, Э/З.

Поэтому семисегментные индикаторы используют только для отображения простейших сообщений.

Всего семисегментный светодиодный индикатор может отобразить 128 символов:

 В обычном светодиодном индикаторе девять выводов: один идёт к катодам всех сегментов, а остальные восемь — к аноду каждого из сегментов. Эта схема называется «схема с общим катодом», существуют также схемы с общим анодом (тогда все наоборот).

Часто делают не один, а два общих вывода на разных концах цоколя — это упрощает разводку, не увеличивая габаритов. Есть еще, так называемые «универсальные», но я лично с такими не сталкивался.

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

А так как необъятное не объять, то такие индикаторы мы пока рассматривать не будем (а ведь есть еще индикаторы с гораздо большим количеством сегментов, матричные).

Многоразрядные светодиодные индикаторы часто работают по динамическому принципу: выводы одноимённых сегментов всех разрядов соединены вместе. Чтобы выводить информацию на такой индикатор, управляющая микросхема должна циклически подавать ток на общие выводы всех разрядов, в то время как на выводы сегментов ток подаётся в зависимости от того, зажжён ли данный сегмент в данном разряде.

Подключение одноразрядного семисегментного индикатора к микроконтроллеру

На схеме ниже, показано как подключается одноразрядный семисегментный индикатор к микроконтроллеру.

При этом следует учитывать, что если индикатор с ОБЩИМ КАТОДОМ, то его общий вывод подключается к «земле», а зажигание сегментов происходит подачей логической единицы на вывод порта.

Если индикатор с ОБЩИМ АНОДОМ, то на его общий провод подают «плюс» напряжения, а зажигание сегментов происходит переводом вывода порта в состояние логического нуля.

Осуществление индикации в одноразрядном светодиодном индикаторе осуществляется подачей на выводы порта микроконтроллера двоичного кода соответствующей цифры соответствующего логического уровня (для индикаторов с ОК — логические единицы, для индикаторов с ОА — логические нули).

Токоограничительные резисторы могут присутствовать в схеме, а могут и не присутствовать. Все зависит от напряжения питания, которое подается на индикатор и технических характеристик индикаторов.

Если, к примеру, напряжение подаваемое на сегменты равно 5 вольтам, а они рассчитаны на рабочее напряжение 2 вольта, то токоограничительные резисторы ставить необходимо (чтобы ограничить ток через них для повышенного напряжении питания и не сжечь не только индикатор, но и порт микроконтроллера).

Рассчитать номинал токоограничительных резисторов очень легко, по формуле дедушки Ома.

К примеру, характеристики индикатора следующие (берем из даташита): — рабочее напряжение — 2 вольта — рабочий ток — 10 мА (=0,01 А) — напряжение питания 5 вольт Формула для расчета: R= U/I (все значения в этой формуле должны быть в Омах, Вольтах и Амперах) R= (напряжение питания — рабочее напряжение)/рабочий ток

R= (5-2)/0.01 = 300 Ом

Источник: https://microkontroller.ru/praktikum-mikrokontrollershhika/semisegmentnyiy-indikator/

Семисегментный индикатор | Программирование микроконтроллеров ⋆ diodov.net

Семисегментный индикатор ввиду своей красочности часто применяется для отображения информации, например значения температуры, величины напряжения либо тока. В этой статье мы продолжаем изучать программирование микроконтроллеров и уже научимся подключать к микроконтроллеру ATmega8 простейший одноразрядный семисегментный индикатор, и будем отображать на нем цифры.

Давайте начнем все по порядку. Для начала рассмотрим, что собою представляет семисегментный индикатор. Внешне он имеет различные размеры. Главным идентификатором служит высота цифры, которая в справочниках приводится в дюймах. Высота цифры имеет стандартный ряд значений, который приводится в дюймах.

По количеству разрядов различают одно-, двух-, трех-, и четырехразрядные индикаторы. Бывает и более разрядов, но они встречаются довольно редко.

Семисегментный индикатор. Принцип работы семисегментного индикатора

Любой семисегментный индикатор обязательно состоит из семи сегментов. Отсюда и происходит его название. Каждый сегмент – это обычный отдельный светодиод. Мощные семисегментники могут содержать в одном сегменте несколько, как правило, последовательно соединенных светодиодов.

Кроме того в корпусе помимо сегментов находится еще и точка или запятая или другой символ.

С помощью семи сегментов можно изобразить десять цифр: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 и некоторые буквы, как латиницы, так и кириллицы.

Светодиоды всех элементов соединяются одноименными выводпми между собой или анодами, или катодами. Поэтому разделяют семисегментные индикаторы с общим анодом и общим катодом.

Вне зависимости от количества разрядов и размеров цифр каждый сегмент имеет название в виде одной из первых букв английского алфавита: a, b, c, d, e, f, g. Точка обозначается dp.

Для того чтобы засветить один из светодиодов семисегментного индикатора с общим анодом следует на общий вывод (анод) подать «+», а на соответствующий отдельный вывод – «-» источника питания.

Если применяется общий катод, — то наоборот – минус подается на общий, а плюс на отдельный вывод.

Чтобы отобразить на индикаторе цифру или букву следует засветить несколько сегментов. Например, для отображения единицы 1 задействуются сегменты b и c. При отображении восьмерки 8 задействуются все символы от a до g. Пятерка получается из таких символов: a, c, d, f, g.

Как подключить семисегментный индикатор к микроконтроллеру

Теперь рассмотрим, как подключить семисегментный индикатор к микроконтроллеру ATmega8. Подключим его к порту D. Данные порт имеет все восемь бит, что очень удобно сочетается с количеством выводов одноразрядного семисегментного индикатора, у которого их также восемь с учетом вывода для точки.

Схемы подключения с общим анодом ОА и общим катодом ОК аналогичны, только общий вывод подключается соответственно к плюсу или минусу источника питания.

Все светодиоды подключаются к выводам микроконтроллера через отдельные резисторы сопротивлением 220…330 Ом.

Не стоит экономить на резисторах и подключать все элементы через один общий резистор. Поскольку в таком случае с изменением числа задействованных сегментов будет изменяться величина тока, протекающего через них. Поэтому цифра 1 будет светиться ярче, чем 8.

Чтобы знать какой из выводов отвечает тому или иному сегменту нам понадобится распиновка семисегментного индикатора. Отсчет выводов, как и у микросхем, начинается с левого нижнего и продолжается против часовой стрелки. При этом лицевая сторона индикатора должна быть направлена вверх, а выводы вниз.

Теперь создадим модель в Протеусе и соберем схему на макетной плате. Далее по мере написания кода будем проверять работу микроконтроллера на модели и на реальном устройстве.

Семисегментный индикатор в Proteus находится в категории (Category) Optoelectronics (Оптоэлектроника). Ниже в подкатегории (Sub-category) следует кликнуть по строке 7-Segment Displays. После этого в окне результатов (Results) выбираем одноразрядный семисегментный индикатор 7SEG-MPX1-CC.

Код для микроконтроллера ATmega8

Теперь пишем код. Сначала настраиваем порт D полностью на выход. Для отображения единицы 1 задействуются сегменты b и c, выводы которых подключены к PD1 и PD2. Поэтому соответствующие биты регистр PORTD нужно установить в единицу.

#include<\p>

int main(void)

{

    DDRD = 0b11111111;

        while (1)

    {

         PORTD = 0b00000110; //1

    }

}

После компиляции кода и прошивки кода результаты мы видим в Proteus и на макетной плате.

Аналогичным образом формируются все цифры.

Давайте сделаем программу более интересной, так, чтобы цифры изменялись в порядке нарастания от нуля до девяти с паузой 0,3 секунды.

#define F_CPU 1000000L

#include<\p>

#include<\p>

int main(void)

{

    DDRD = 0b11111111;

    while (1)

    {

         PORTD = 0b00111111; //0

         _delay_ms(300);

         PORTD = 0b00000110; //1

         _delay_ms(300);

         PORTD = 0b01011011; //2

         _delay_ms(300);

         PORTD = 0b01001111; //3

         _delay_ms(300);

         PORTD = 0b01100110; //4

         _delay_ms(300);

         PORTD = 0b01101101; //5

         _delay_ms(300);

         PORTD = 0b01111101; //6

         _delay_ms(300);

         PORTD = 0b00000111; //7

         _delay_ms(300);

         PORTD = 0b01111111; //8

         _delay_ms(300);

         PORTD = 0b01101111; //9

         _delay_ms(300);

            }

}

Данный код можно значительно упорядочить и этим мы займемся в последующих статьях по программированию микроконтроллера ATmega8. На этом заканчиваем наше первое знакомство с семисегментными индикаторами.

Скачать программы и модель в Proteus

Источник: http://diodov.net/semisegmentnyj-indikator-programmirovanie-mikrokontrollerov/

Урок 19. Семисегментные светодиодные индикаторы (LED). Режимы управления, подключение к микроконтроллеру

В уроке узнаем о схемах подключения семисегментных светодиодных индикаторов к микроконтроллерам, о способах управления индикаторами.

Предыдущий урок     Список уроков     Следующий урок

Светодиодные семисегментные индикаторы остаются одними из самых популярных элементов для отображения цифровой информации.

Этому способствуют следующие их качества.

  • Низкая цена. В средствах индикации нет ничего дешевле светодиодных цифровых индикаторов.
  • Разнообразие размеров. Самые маленькие и самые большие индикаторы – светодиодные. Мне известны светодиодные индикаторы с высотой цифры от 2,5 мм, до 32 см.
  • Светятся в темноте. В некоторых приложениях это свойство чуть ли не решающее.
  • Имеют различные цвета свечения. Бывают даже двухцветные.
  • Достаточно малые токи управления. Современные светодиодные индикаторы могут подключаться к выводам микроконтроллеров без дополнительных ключей.
  • Допускают жесткие условия эксплуатации (температурный диапазон, высокая влажность, вибрации, агрессивные среды и т.п.). По этому качеству светодиодным индикаторам нет равных среди других типов элементов индикации.
  • Неограниченный срок службы.

Типы светодиодных индикаторов.

Семисегментный светодиодный индикатор отображает символ с помощью семи светодиодов – сегментов цифры. Восьмой светодиод засвечивает децимальную точку. Так что в семисегментном индикаторе 8 сегментов.

Сегменты обозначаются латинскими буквами от ”A” до ”H”.

Аноды или катоды каждого светодиода объединяются в индикаторе и образуют общий провод. Поэтому существуют индикаторы с общим анодом и общим катодом.

Светодиодный индикатор с общим анодом.

Светодиодный индикатор с общим катодом.

Статическое управление светодиодным индикатором.

Подключать светодиодные индикаторы к микроконтроллеру необходимо через резисторы, ограничивающие ток.

Расчет резисторов такой же, как для отдельных светодиодов.

R = ( U питания  –  U сегмента ) / I сегмента

Для этой схемы:  I сегмента = ( 5 – 1,5 ) / 1000 = 3,5 мА

Современные светодиодные индикаторы достаточно ярко светятся уже при токе 1 мА. Для схемы с общим анодом засветятся сегменты, на управляющих выводах которых микроконтроллер сформирует низкий уровень.

В схеме подключения индикатора с общим катодом меняется полярность питания и сигналов управления.

Засветится сегмент, на управляющем выводе которого будет сформирован высокий уровень (5 В).

Мультиплексированный режим управления светодиодными (LED) индикаторами.

Для подключения каждого семисегментного индикатора к микроконтроллеру требуется восемь выводов. Если индикаторов (разрядов) 3 – 4, то задача становится практически не выполнимой. Просто не хватит выводов микроконтроллера. В этом случае индикаторы можно подключить в мультиплексированном режиме, в режиме динамической индикации.

Выводы одноименных сегментов каждого индикатора объединяются. Получается матрица светодиодов , подключенных между выводами сегментов и общими выводами индикаторов. Вот схема мультиплексированного управления трех разрядным индикатором с общим анодом.

Для подключения трех индикаторов потребовалось 11 выводов, а не 24, как при статическом режиме управления.

При динамической индикации в каждый момент времени горит только одна цифра. На общий вывод одного из разрядов подается сигнал высокого уровня (5 В), а на выводы сегментов поступают сигналы низкого уровня для тех сегментов, какие должны светиться в этом разряде.

Через определенное время зажигается следующий разряд. На его общий вывод подается высокий уровень, а на выводы сегментов сигналы состояния для этого разряда. И так для всех разрядов в бесконечном цикле. Время цикла называется временем регенерации индикаторов.

Если время регенерации достаточно мало, то человеческий глаз не заметит переключения разрядов. Будет казаться, что все разряды светятся постоянно. Для исключения мерцания индикаторов считается, что частота цикла регенерации должно быть не менее 70 Гц.

Я стараюсь использовать не менее 100 Гц.

Схема динамической индикации для светодиодов с общим катодом выглядит так.

Меняется полярность всех сигналов. Теперь на общий провод активного разряда подается низкий уровень, а на сегменты, которые должны светиться – высокий уровень.

Расчет элементов динамической индикации светодиодных (LED) индикаторов.

Расчет несколько сложнее, чем для статического режима. В ходе расчета необходимо определить:

  • средний ток сегментов;
  • импульсный ток сегментов;
  • сопротивление резисторов сегментов;
  • импульсный ток общих выводов разрядов.

Т.к. разряды индикаторов светятся по очереди, то яркость свечения определяет средний ток. Мы должны выбрать его исходя из параметров индикатора и требуемой яркости. Средний ток будет определять яркость свечения индикатора на уровне, соответствующем статическому управлению с таким же постоянным током.

Выберем средний ток сегмента 1 мА.

Теперь рассчитаем импульсный ток сегмента. Чтобы обеспечить требуемый средний ток, импульсный ток должен быть в N раз больше. Где N число разрядов индикатора.

I сегм. имп. = I сегм. средн. * N

Для нашей схемы I сегм. имп. = 1 * 3 = 3 мА.

Рассчитываем сопротивление резисторов, ограничивающих ток.

R = ( U питания  –  U сегмента ) / I сегм. имп.

R = ( 5 – 1,5 ) / 0.003 = 1166 Ом

Определяем импульсные токи общих выводов разрядов. Одновременно светиться могут 8 сегментов, значит надо импульсный ток одного сегмента умножить на 8.

I разряда имп. =  I сегм. имп. * 8

Для нашей схемы  I разряда имп. = 3 * 8 = 24 мА.

В итоге:

  • сопротивление резисторов выбираем 1,1 кОм;
  • выводы микроконтроллера управления сегментами должны обеспечивать ток не менее 3 мА;
  • выводы микроконтроллера выбора разряда индикатора должны обеспечивать ток не менее 24 мА.

При таких значениях токов индикатор может быть подключен непосредственно к выводам платы Ардуино, без использования дополнительных ключей. Для ярких индикаторов, таких токов вполне достаточно.

Схемы с дополнительными ключами.

Если индикаторы требуют больший ток, то необходимо использовать дополнительные ключи, особенно для сигналов выбора разрядов. Общий ток разряда в 8 раз больше тока одного сегмента.

Схема подключения светодиодного индикатора с общим анодом в мультиплексированном режиме с транзисторными ключами выбора разрядов.

Для выбора разряда в этой схеме необходимо сформировать сигнал низкого уровня. Соответствующий ключ откроется и подаст питание на разряд индикатора.

Схема подключения светодиодного индикатора с общим катодом в мультиплексированном режиме с транзисторными ключами выбора разрядов.

Для выбора разряда в этой схеме необходимо сформировать сигнал высокого уровня. Соответствующий ключ откроется и замкнет общий вывод разряда на землю.

Могут быть схемы, в которых необходимо использовать транзисторные ключи и для сегментов, и для общих выводов разрядов. Такие схемы легко синтезируются из двух предыдущих. Все показанные схемы используются при питании индикатора напряжением равным питанию микроконтроллера.

Ключи для индикаторов с повышенным напряжением питания.

Бывают индикаторы больших размеров, в которых каждый сегмент состоит из нескольких светодиодов, соединенных последовательно. Для питания таких индикаторов требуется источник с напряжением  большим, чем 5 В. Ключи должны обеспечивать коммутацию повышенного напряжения с управлением от сигналов уровней микроконтроллера (обычно 5 В).

Схема ключей, замыкающих сигналы индикатора на землю, остается неизмененной. А ключи питания должны строиться по другой схеме, например, такой.

В этой схеме активный разряд выбирается высоким уровнем управляющего сигнала.

Между переключением разрядов индикатора на короткое время (1-5 мкс) должны выключаться  все сегменты. Это время необходимо на завершение переходных процессов коммутации ключей.

Конструктивно выводы разрядов могут быть объединены как в одном корпусе многоразрядного индикатора, а может быть собран многоразрядный индикатор из отдельных одноразрядных.

Более того, можете собрать индикатор из отдельных светодиодов, объединенных в сегменты. Так обычно поступают, когда необходимо собрать индикатор очень больших размеров.

Все приведенные выше схемы будут справедливы и для таких вариантов.

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

Предыдущий урок     Список уроков     Следующий урок

Источник: http://mypractic.ru/urok-19-semi-segmentnye-svetodiodnye-indikatory-led-rezhimy-upravleniya-podklyuchenie-k-mikrokontrolleru.html

Управление по одному проводу семисегментным дисплеем на сдвиговых регистрах 74HC595 — Сообщество «Радиокружок» на DRIVE2

Достаточно часто у любителей микроконтроллеров возникает проблема с нехваткой выводов. Обычно для расширения портов ввода/вывода используют сдвиговые регистры типа 74HC595. Но для управления ими требуется целых три вывода! А можно обойтись и ОДНИМ! Именно об этом пойдет речь далее.

Совершенно случайно ко мне в руки попала вот такая игрушка. Устройство представляет собой четырех разрядный статический семисегментный дисплей, выполненный на основе сдвиговых регистров 74HC595.

Модуль ориентирован на ардуино и давно снят с продажи. Но интересна схема коммутации входов.

Она выполнена с использованием двух RC цепочек на входах тактирования и управления выходной защелкой и позволяет управлять выходами сдвиговых регистров всего по одному проводу вместо трех.

Я бы может и прошел мимо, но данную схему впервые встретил в журнале Радио еще лет 15 назад, и тогда хотелось ее повтрить, но почему-то этого не случилось.

Схема подключения индикаторов к регистрам не вызывает вопросов. Разберемся с подключением сигналов управления. Вход тактирования 11 сдвигового регистра подключается к порту микроконтроллера напрямую.

Вход данных 14 подключается к той же линии через RC-цепочку R1C1, время заряда которой составляет примерно 20-25мкС.

Вход управления защелкой 12 подключен через RC-цепочку R2C2, которая заряжается примерно за 250мкС.

Полный размер

Электрическая схема модуля.

Принцип управления достаточно прост. Если на вход дисплея подать очень короткий импульс около 1мкС, то RC-цепочки не успевают зарядиться, а так как сдвиговый регистр имеет достаточно высокое быстродействие, то данные в регистр вдвинуться успевают. Таким образом, длительностью импульса можно управлять зарядом конденсаторов и определять напряжение на входе данных и защелки.

Принцип работы схемы хорошо виден на осциллограмме управляющих сигналов

Передача логической единицы производится подачей импульса длительностью примерно 25мкС и короткой паузы не более 1мкС. Импульс зарядит конденсатор на входе данных до уровня логической единицы, а короткая пауза не успеет его разрядить. Фронт следующего импульса попадет на тактовый вход и запишет единицу в регистр.

Для записи в сдвиговый регистр логического нуля необходимо наоборот сперва подать паузу длиной примерно 30мкС, чтобы разрядить конденсатор на входе данных до уровня логического нуля, если ор был заряжен в предыдущем периоде. А затем подаем короткий импульс около 1мкС, чтобы его фронт записал ноль в регистр.

В завершении передачи 24 бит данных для заполнения 4 сдвиговых регистров следует подать импульс длительностью 250мкС для переключения сигнала управления защелкой.

Записанные данные поступят на выходы микросхем и будут удерживаться там до следующего фронта.

Теперь конденсатор следует разрядить, для этого устанавливаем на входе схемы низкий уровень минимум на 250мкС, прежде чем подавать новые данные.

На этом можно было бы и закончить баловство, если бы не моя привычка тестировать свои железяки. Меня насторожил тот факт, что RC цепочки имеют разницу по времени заряда всего на один порядок.

Отсюда получается, что конденсатор на входе защелки может полностью зарядиться, если подать 10 единиц подряд.

А с учетом того, что уровень логической единицы для 74НС595 начинается с напряжения 3,15В, то для полного заряда конденсатора достаточно подряд подать около 6 единиц.

В схеме использованы индикаторы с общим анодом, для отключения сегментов которых на выходе регистра необходимо записать единицы. Получается, что при включении на индикаторе цифры 1 необходимо передать двоичный код 11001111, который как раз и содержит 6 единиц.

Если включать на семисегментном дисплее две единицы подряд, то как раз и получим шесть импульсов, передающих логические единицы. Такая комбинация успевает зарядеть конденсатор на входе защелки.

В результате чего в момент обновления дисплея наблюдается кратковременное “подмигивание”.

На графиках видно, что сигнал на входе управления защелкой сдвигового регистра уже после передачи первого семисегментного кода единицы заряжается практически до уровня логической единицы. В итоге, после каждого такого цикла передачи кода для одного регистра, весь дисплей обновляется.

Мусор появляется на очень короткое время и практически не различим, НО теперь я об этом знаю… и не могу с этим жить. Как только я не пытался сократить длительности импульсов высокого уровня и увеличить паузы, полностью устранить этот глюк не получилось.

Проблему решил заменой резистора R2 с 33КОм на 100КОм. Время заряда RC-цепочки увеличилось в несколько раз. Индикатор стал работать лучше.

Но все равно разница между временем заряда конденсаторов на входе данных и защелки было недостаточным для вывода на дисплей четырех единиц.

Да и включить при такой схеме больше четырех сдвиговых регистров подряд не получится, т.к. конденсатор С2 все равно может успеть зарядиться до уровня логической единицы.

Для окончательной доработки схемы нужно добавить один а лучше два диода для ускорения разряда С2 и заряда С1. В идеале нужно использовать диоды Шоттки, они обладают более высоким быстродействием. Результат доработки показан на схеме.

Сравните результат работы схемы с диодами и без них. Справа графики без диодов, слева с диодами.

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

И самое главное, что конденсатор входа управления защелкой успевает разрядиться за короткий импульс записи. Теперь можно ни в чем себе не отказывать и подключать практически любое количество сдвиговых регистров.

А вот и листинг демо программы для микроконтроллера armega328. Частота процессора 16000000Гц. Данные передаются по линии PORTC.0. Писал в CodeVisionAVR. Думаю, что по комментариям все понятно.

Источник: https://www.drive2.ru/c/469629454843380044/

Семи сегментный индикатор и AVR. Динамическая индикация. Программа на Си. Шаг №5

Обновлено 3.04.15. Всем привет. В прошлой статье мы с Вами рассмотрели алгоритм общения с ЖКИ, а также вывод информациина нее, и протестировали в симуляторе.

В этой записи я кратенько расскажу о “недорогом” способе вывода информации — это семисегментный индикатор, который является наиболее простым из индикаторов, для отображения арабских цифр, а также некоторых символов, которые возможно на нем вывести. Также рассмотрим программу на Си для AVR, и подключение в железе и симуляторе.

Для отображения букв используются более сложные много сегментные и матричные индикаторы. Но здесь речь пойдет о семи сегментных… Также рассмотрим что такое динамическая индикация, как способ мгновенного отображения измеряемой величины. Для этого в программе рассмотрим использование прерываний.


         Итак следует знать, что индикаторы бывают с общим анодом и катодом как на рисунке ниже. У меня под руками был индикатор с общим катодом (нижняя часть рисунка), управляющий вывод которого подключают к минусу. Вот с ним мы и будем работать.

Если индикаторов несколько, следовательно и управляются катоды несколькими ножками МК. !!! Но всегда используйте транзисторы, т.к. порты ввода-вывода могут сгореть из-за относительно большого тока. Я использовал обычные 315 транзисторы.

На рисунке ниже я отобразил примерное подключение, через них, управляющего вывода индикатора и контроллера. Для монтажа нам потребуется 11 ножек микроконтроллера, т.е.

для отображения информации на сегментах 8 ножек (7 +точка) и по одной ножки на каждый индикатор для его управления, у меня их три, поэтому и ножки управления тоже три. Ниже я привел и описал программу. Для управления сегментами  будем использовать пины одного порта, что б не путаться.

Писал под микроконтроллер ATmega8. Если Вы хотите отвязаться от “камня” то это не проблема, например в разбиваем код на библиотеки, где без проблем можно изменить настройки под другой “камень”, в основном это номера пинов и портов. Там же описаны общие правила универсальности и переноса.

Рисунок подключения транзистора к МК и индикатору.

Перейдем к программе. В этой небольшой программе (на Си) я привел пример включения трех элементов индикатора и вывод числа с запятой. Использование таймера и прерывания для вывода на индикатор.

В ходе написания программы мы должны определиться какой пин порта должен соответствовать сегменту на индикаторе. Сам элемент индикатора приведен на рисунке ниже. Сбоку описание подключения выводов к сегментам элемента индикатора(пин порта – номер ножки элемента (рис.

выше) – буква сегмента – число в массиве, отвечающее за включение сегментов на элементе).

PB0 — 12 — управление первым элементом

PB6 — 9 — управление вторым элементом
PB7 — 8 — управление третьим элементом
PD7 – 11 — (A) — 128
PD6 – 10 — (F) — 64
PD5 – 7 — (B) — 32
PD4 – 5 — (G) — 16
PD3 – 4 — © — 8
PD2 – 3 — (DP) — 4
PD1 – 2 — (D) — 2
PD0 – 1 — (E) — 1

 #include

 #include

 #include

 /*Определим каждому пину порта элемент семи сегментника (риунок выше)*/

 #define a 128

 #define b 32

 #define c 8

 #define d 2

 #define e 1

 #define f 64

 #define g 16

 #define dp 4

 /*Эти макросы содержат числа, соответствующие двойке, возведенной в степень, равной номеру    “ножки” того порта, к которому подключен сегмент индикатора с одноименным макросу названием.*/

 short unsigned int j, k = 0;  /*переменные исп-ся в макросе прерывания*/

 float i = 0;    /*Переменная для вывода на индикатор*/

short unsigned int w = 0; /*Переменная индикатор для включения точки*/

unsigned char Slot[11];  /*Массив в котором хранятся числа, которые нужно

вывести через порт на индикатор, чтобы он показал цифру, равную номеру

  элемента массива. Числа зависят только от макросов.*/

 void Slot_init ()  /*Функция инициализации индикатора*/

 {

         Slot[0] = (a+b+c+d+e+f);

         Slot[1] = (b+c); 

         Slot[2] = (a+b+g+e+d);

         Slot[3] = (a+b+g+c+d);

         Slot[4] = (f+g+b+c);  /*Имена макросов соответствуют именам сегментов индик*/

         Slot[5] = (a+f+g+c+d);

         Slot[6] = (a+f+g+c+d+e);

         Slot[7] = (a+b+c);

         Slot[8] = (a+b+c+d+e+f+g);

         Slot[9] = (a+b+c+d+f+g);

         Slot[10] = dp;   /*Точка*/

 }

/*В этих переменных хранятся цифры, которые нужно отобразить*/

 char Elem1, Elem2, Elem3; 

 /* Функция выделяет цифры из трехзначного числа Number*/

 void Display (float Number)

 {

        float N1, N2; /*Переменные для функции modf*/

        N1 = modf (Number, &N2); /*Разбиваем число на целую и дробную части,                                                                                                             N1  = дробной N2 = целой*/

        if (N1 != 0) /*Еслине равно нулю то присутствует дробь*/ 

       {

                  Number= Number*10; /*тогда умножаем число на 10, для обычного вывода                                                                                                  на  индикатор трехзначного дробного числа*/

                  w = 1; /* переменная индикатор которая используется в цикле ниже,                                                 чтобы  включать точку*/

        }

        short unsigned int Num1, Num2, Num3;

        Num1=Num2=0;

        while (Number >= 100) /*Сотни*/ 

       {

                Number -= 100;

                Num1++;

       }

       while (Number >= 10) /*Десятки*/ 

      {

               Number -= 10;

               Num2++;

      }

       Num3 = Number; /*Еденицы*/ 

       Elem1 = Slot[Num1];

       if (w == 1) /*Условие дя включения точки на втором элементе*/

       {

                Elem2 = (Slot[Num2]|0×04); /*логическое сложение с пином отвечающим за                                                                                                        точку*/

                w = 0;    /*Выключаем точку*/

        }

        else

                Elem2 = Slot[Num2];

        Elem3 = Slot[Num3];

       }

int main (void) /*начало основой программы*/

{

        DDRB = 0Xff;  /*все выводы порта B сконфигурировать как выходы*/

        DDRD = 0xff; /*все выводы порта D сконфигурировать как выходы*/

        PORTD = 0×00; /*Устанавливаем 0*/ 

        PORTB |= _BV (PB6);

        PORTB |= _BV (PB0);

        PORTB |= _BV (PB7);

        Slot_init (); 

        sei (); /*Разрешить общее прерыввание*/

        /*Инициализация таймера Т0*/

       TIMSK = (1

Источник: http://www.ap-impulse.ru/podklyuchaem-semisegmentnyj-indikator-i-pishem-programmu-shag-5/

Управление драйвером семисегментных индикаторов MAX7219

В этой статье хочу показать как программно управлять модулем с драйвером MAX7219 и восемью семисегментными индикаторами. Довелось пообщаться с этим модулем и надо сказать, мне он очень понравился.

Понравилось и то, как легко им управлять и то, что он освобождает микроконтроллер от обслуживания динамической индикации. С ним можно вообще данные переписывать только при их изменении, как с LCD дисплеем.

Привожу здесь код программы (демо) для микроконтроллера на языке Си.

В общем то управление драйвером простое, как сдвиговым регистром по трехпроводной схеме (3-Wire). Вернее он и имеет как раз в своем составе сдвиговый регистр. Алгоритм управления такой. Низким уровнем на входе CS разрешаем принимать данные. Данные отсылаются по 16 бит, старшим битом вперед.

Биты с 15 по 8 это или адрес знакоместа (значения от 1 до 8), или служебная команда (значения от 9 до 15). Биты с 7 по 0 это данные, либо для инструкции, либо образ (маска) символа. Каждый выставленный бит на входе DIN записывается в регистр по фронту тактового импульса на входе CLK.

После того как все биты переданы, “защелкиваем” их, выставив единичку на входе CS.

Управляет драйвер восемью светодиодными семисегментными индикаторами с общим катодом. Это означает, что чтобы погасить все сегменты индикатора, надо прописать в него 0, а что бы зажечь, нужно прописать 255. Каждый из разрядов индикатора имеет независимую адресацию и его содержимое может быть обновлено без необходимости перезаписи всего индикатора.

Внешний вид модуля MAX7219.

Сама плата выполнена качественно, а вот индикаторы на ней припаяны кривовато. Подключение индикаторов странное. Ожидалось, что под номером 1 будет индикатор расположенный слева, но как видим слева идут 8, 7, 6 и т. д.. Почему-то распаяны они именно так, хоть это и не критично, и легко корректируется в коде программы.

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

А так индикаторы смотрятся через светофильтр. Яркость свечения не уменьшилась, а вот незасвеченные сегменты уже не видно.

Код “демки” на языке Си.

/**************************************************************/ /*** Управление драйвером семисегментных индикаторов MAX7219 **/ /************** нагруженным на восемь индикаторов. ************/ /************ Микроконтроллер: PIC16F628A *********************/ /************ Среда разработки MPLAB IDE v8.89 – язык C *******/ #include pic.h // нужен для HI-TECH C компилятора #include htc.h // для работы с функцией задержки #define _XTAL_FREQ 4000000 // прописываем частоту генератора /************* прописали выводы микроконтроллера **************/ #define knopkaup RA0 // кнопка больше #define knopkadown RA1 // кнопка меньше #define DIN RB0 // определение ввод данных #define CLK RB1 // определение тактирующего сигнала #define CS RB2 // определение выбор устройства #define DIN_OFF() DIN = 0; // данные в ноль #define DIN_ON() DIN = 1; // данные в еденичку #define STR_OFF() CLK = 0; // Строб в ноль #define STR_ON() CLK = 1; // Строб в еденичку #define WR_OFF() CS = 0; // начало передачи #define WR_ON() CS = 1; // завершение передачи /******************* логические операции **********************/ #define TestBit(x,y) (x & (1 0;i –) { if(TestBit(adres, i – 1)) { DIN_ON(); // выставили единичку } else { DIN_OFF(); // выставили нолик } STR_ON(); // такт в единичку __delay_us(5); // длительность строба STR_OFF(); // такт в ноль } for(i = 8; i > 0; i –) { if(TestBit(data, i – 1)) { DIN_ON(); // выставили единичку } else { DIN_OFF(); // выставили нолик } STR_ON(); // такт в единичку __delay_us(5); STR_OFF(); // такт в ноль } WR_ON(); // завершение передачи } void clear(void) { char i; for(i = 8; i > 0; i –) { w3_write(i, cifra[10]); // гасим все индикаторы } } void inic7219(void) { w3_write(0x0F, 0x00); // тест выключен w3_write(0x0C, 0x01); // нормальный режим w3_write(0x0B, 0x07); // кол-во знаков 8 w3_write(0x09, 0x00); // дешифраторы отключены w3_write(0x0A, bright_indik); // яркость свечения clear(); } void klava(void) { if(knopkaup == 0 && bright_indik != 15) { bright_indik ++; clear(); w3_write(0x0A, bright_indik); // яркость свечения hg1 = bright_indik / 10; // значение первой цифры hg2 = bright_indik % 10; // значение второй цифры hhg1 = cifra[hg1]; // маска первой цифры hhg2 = cifra[hg2]; // маска второй цифры w3_write(5, hhg1); // прописали первую цифру w3_write(4, hhg2); // прописали вторую цифру __delay_ms(1500); clear(); return; } if(knopkadown == 0 && bright_indik != 0) { bright_indik –; clear(); w3_write(0x0A, bright_indik); hg1 = bright_indik / 10; hg2 = bright_indik % 10; hhg1 = cifra[hg1]; hhg2 = cifra[hg2]; w3_write(5, hhg1); w3_write(4, hhg2); __delay_ms(1500); clear(); } } /******************* основная программа ***********************/ void main(void) { podgot(); bright_indik = 8; // яркость по умолчанию inic7219(); __delay_ms(500); while(1) { for(c = 0; c

Источник: http://naladchikkip.ru/upravlenie-drajverom-semisegmentnyh-indikatorov-max7219

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}