Электронная метка с жки на микроконтроллере

Подключение знакосинтезирующего ЖКИ к контроллеру (PIC16F628A)

В этой статье описано как подключить жидкокристаллический индикатор со знакогенератором к микроконтроллеру.

Рассмотренные здесь методы и схемы подходят для подключения ЖКИ со встроенными контроллерами HD44780 (Hitachi), KS0070, KS0066 (Samsung), LC7985 (Sanyo), SED1278 (Epson) или с другими аналогичными.

Эти, или совместимые с ними, контроллеры используются в большинстве выпускаемых в настоящий момент знакосинтезирующих ЖКИ, например, в таких, как ACM0802, ACM1601, ACM1602, ACM1604, ACM2002, ACM2004, ACM2402, ACM4002, ACM4004 фирмы Displaytronic, MT-10S1, MT-16S2D фирмы МЭЛТ, DV-0802, DV-16100, DV-16110, DV-16120, DV-16210, DV-16230, DV-16235, DV-16236, DV-16244, DV-16252, DV-16257, DV-16275, DV-16276, DV-20100, DV-20200, DV-20210, DV-20211, DV-20220, DV-24200, DV-40200 фирмы Data Vision, AC082A, AC161, AC162, AC164, AC202, AD202, AC204, AC242, AD242, AC402 фирмы Ampire.

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

В дальнейшем, когда мы будем говорить о подключении к ЖКИ, следует понимать, что речь идет о подключении к встроенному контроллеру.

Перечисленные выше контроллеры ЖКИ имеют аналогичные интерфейсы, наборы команд и распределение памяти, хотя размер встроенной ROM-памяти, последовательность команд инициализации, время выполнения команд и некоторые другие параметры могут несколько отличаться.

Итак, для начала, давайте разберемся с работой ЖКИ.

1) Интерфейс.

Обычно ЖКИ имеет 14 или 16 выводов, назначение которых представлено в таблице 1:

ТАБЛИЦА 1

номер контакта наименование описание
1 Vss GND — общий провод (земля)
2 Vdd Power supply — питание +5В
3 Vo контраст
4 RS Register select — выбор регистра
5 R/W Read/write — чтение/запись
6 E Enable — вкл/выкл передачи
7 DB0 Data bit 0
8 DB1 Data bit 1
9 DB2 Data bit 2
10 DB3 Data bit 3
11 DB4 Data bit 4
12 DB5 Data bit 5
13 DB6 Data bit 6
14 DB7 Data bit 7
15 BL+ питание подсветки
16 BL- общий провод подсветки

Таким образом, интерфейс имеет восемь информационных линий: DB7..DB0 и три управляющих: RS, R/W, E.

Линия RS определяет к какому регистру контроллера ЖКИ мы хотим обратиться, то есть какую информацию мы передаем — данные или команды.

Линия R/W определяет направление передачи данных — запись в ЖКИ или чтение из ЖКИ.

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

Интерфейс работает следующим образом: сначала на интерфейсных линиях DB7…DB0, RS, R/W формируется информация, которую нужно передать, потом на некоторое время (>500 нс для f0=270 кГц) подается высокий уровень на линию E (в это время ЖКИ считывает информацию), после чего сигнал E переводится опять в состояние низкого уровня. f0 — частота, на которой работает контроллер ЖКИ. Вообще, контроллеры ЖКИ могут работать на разных частотах (у них есть выводы для подключения внешнего резонатора), но обычно используется внутренний генератор на 270 кГц.

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

Также, в контроллере ЖКИ предусмотрена возможность сообщить внешнему устройству о своем состоянии (BUSY/READY).

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

Для уменьшения количества проводов от ЖКИ к внешнему устройству можно использовать не 8, а 4 информационных сигнала (DB7…DB4). Все рассматриваемые контроллеры ЖКИ допускают такую возможность. В этом случае данные передаются в два этапа (кроме первой команды инициализации): 1) передаются управляющие биты и старший полубайт посылки 2) передаются управляющие биты и младший полубайт посылки.

Первое, что нужно сделать после включения ЖКИ — это провести инициализацию. Инициализация заключается в посылке нескольких команд в определенной последовательности. Количество команд инициализации может несколько отличаться у разных контроллеров, но все же базовый набор команд для восьми- и четырехбитного интерфейсов, подходящий для большинства контроллеров, приведен ниже.

Во время инициализации лучше не анализировать флаг BUSY, а тупо ждать положенное время перед посылкой следующей команды, так как флаг начинает выставляться не сразу, а после какой-то команды (смотрите даташит).

Инициализация для восьмибитного интерфейса (f0=270 кГц)1) включение питания2) пауза >30 мс3) FUNCTION SET

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
1 1 N F X X

N=0 — однострочный дисплей, N=1 — двустрочный дисплей

F=0 — шрифт 5х8, F=1 — шрифт 5х11

4) пауза >39 мкс

5) DISPLAY ON/OFF CONTROL

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
1 D C B

D=0 — дисплей выключен, D=1 — дисплей включен

C=0 — курсор выключен, C=1 — курсор включен

B=0 — мерцание выключено, B=1 — мерцание включено

6) пауза >39 мкс

7) DISPLAY CLEAR

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
1

8) Пауза >1.53 мс

9) ENTRY MODE SET

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
1 I/D SH

I/D=0 — уменьшение указателя при операции с памятью, I/D=1 — увеличение указателя при операции с памятью

SH=0 — сдвигание дисплея выключено, SH=1 — сдвигание дисплея включено

Инициализация для четырехбитного интерфейса (f0=270 кГц)

1) включение питания

2) пауза >30 мс

3) FUNCTION SET

RS R/W DB7 DB6 DB5 DB4
1
1
N F X X

N=0 — однострочный дисплей, N=1 — двустрочный дисплей

F=0 — шрифт 5х8, F=1 — шрифт 5х11

4) пауза >39 мкс

5) DISPLAY ON/OFF CONTROL

RS R/W DB7 DB6 DB5 DB4
1 D C B

D=0 — дисплей выключен, D=1 — дисплей включен

C=0 — курсор выключен, C=1 — курсор включен

B=0 — мерцание выключено, B=1 — мерцание включено

6) пауза >39 мкс

7) DISPLAY CLEAR

RS R/W DB7 DB6 DB5 DB4
1

8) Пауза >1.53 мс

9) ENTRY MODE SET

RS R/W DB7 DB6 DB5 DB4
1 I/D SH

I/D=0 — уменьшение указателя при операции с памятью, I/D=1 — увеличение указателя при операции с памятью

SH=0 — сдвигание дисплея выключено, SH=1 — сдвигание дисплея включено

2) Память

В ЖКИ есть 2 вида памяти: DDRAM, CGRAM (CGROM).

DDRAM — display data RAM (память дисплея) — то, что записано в этой памяти, — непосредственно отображается на дисплее. Эта память имеет следующее адресное пространство и соответственное отображение на дисплее (для дисплея 24х2):

Первая строка

Display position 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
DDRAM address 00h 01h 02h 03h 04h 05h 06h 07h 08h 09h 0Ah 0Bh 0Ch 0Dh 0Eh 0Fh 10h 11h 12h 13h 14h 15h 16h 17h

Вторая строка

Display position 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
DDRAM address 40h 41h 42h 43h 44h 45h 46h 47h 48h 49h 4Ah 4Bh 4Ch 4Dh 4Eh 4Fh 50h 51h 52h 53h 54h 55h 56h 57h

То есть, то, что записано в DDRAM по адресу, например, 42h, будет отображаться в третьей позиции на второй строке дисплея. Для дисплеев других размеров доступное адресное пространство DDRAM будет другим (обычно первые 40h адресов — первая строка, вторые 40h адресов — вторая строка и т.д.)

CGRAM (CGROM) — character generator RAM (ROM) — память знакогенератора.

Память знакогенератора разделена на CGRAM — доступна для записи/чтения, сюда можно залить 8 своих собственных символов и CGROM — доступна только для чтения, заранее прошитые шрифты.

В разных ЖКИ могут быть прошиты разные шрифты, это надо смотреть по доке или можно определить самому, организовав вывод на дисплей последовательно всех прошитых символов.

При обращении к первым шестнадцати символам знакогенератора происходит обращение к CGRAM, при обращении к символам, с номерами старше шестнадцатого — обращение к CGROM. Причем, пользовательских символов ведь всего 8, поэтому первые восемь символов знакогенератора указывают на те же области CGRAM, что и вторые восемь символов.

Иногда, в CGROM могут быть прошиты не все символы, начиная с семнадцатого, а, например, начиная с номера 21h, а при обращении к символам от 10h до 21h на дисплей выводится всякий мусор. Это зависит от прошивки.

Для вывода на экран какого-либо символа, необходимо выполнить следующие действия:

1) установить курсор командой “set DDRAM address” в ту позицию, куда мы хотели бы вывести символ (информационные биты указывают адрес DDRAM, соответствующий выбранной позиции)

SET DDRAM ADDRESS (AC6…AC0 — адрес устанавливаемой позиции курсора в памяти дисплея)

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
1 AC6 AC5 AC4 AC3 AC2 AC1 AC0

2) вывести символ на экран командой “write data to RAM”, при этом информационные биты указывают на номер символа, выводимого из CGRAM/CGROM.

WRITE DATA TO RAM (A7..A0 — номер символа, выводимого из памяти знакогенератора)

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
1 A7 A6 A5 A4 A3 A2 A1 A0

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

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

Вот и всё! Для того, чтобы схемы заработали, осталось только залить в микроконтроллер программу, реализующую обмен данными с ЖК-индикатором.

Пример готового девайса (8-битный интерфейс, ЖКИ — PM1623):

Примеры программ и готовые прошивки:

— просто вывод текста

— заливка в CGRAM пользовательских символов и вывод их на экран

Скачать печатную плату (AutoCAD2000i) Эта плата разведена под использование SMD компонентов. Если вы будете использовать другие компоненты, то плату придется переделывать.

Источник: http://radiohlam.ru/?p=807

Подключение LCD(HD44780) к микроконтроллерам AVR

Дата публикации: 28 февраля 2011.

Рейтинг:  5 / 5

Внутреннее устройство LCD

Достоинством символьных многострочных LCD является то, что заботу о подаче требуемых напряжений на массив “ЖК-конденсаторов” берет на себя встроенный управляющий контроллер. На рис.1 показана структурная схема типового LCD с организацией 16х2, которая идентична для всех моделей независимо от фирмы-изготовителя.

Основу составляет специализированный контроллер, обычно выполненный в виде одной или двух микросхем-“капелек”, реже – в виде фирменной SMD-микросхемы. По назначению выводов и системе команд он совпадает с родоначальником серии – HD44780.

Общепринятое название таких микросхем “Dot Matrix Liquid Crystal Display Controller/Driver”, из чего следует их двойная функция – контроллер управляет интерфейсом, а драйвер “зажигает” сегменты.

Контроллер синхронизируется внутренним RC-генератором G1, имеющим частоту 250 ±50 кГц. Напряжение подсветки подается через выводы А и К на светодиоды, которые освещают ЖК-панель с торца или обратной стороны корпуса. Светодиоды включены матрицей и соединены параллельно-последовательно. В связи с этим напряжение подсветки довольно высокое 4,0…4,2 В.

Назначение и нумерация всех внешних выводов LCD унифицированы (рис.2). Это не зависит от количества строк и символов, будь то “8×1” или “16×2”. Даже контакты светодиодной подсветки 15, 16 имеются на всех LCD, хотя при ее физическом отсутствии они будут просто “висеть в воздухе”.

Небольшой нюанс. На печатной плате LCD порядок нумерации контактных площадок отличается от модели к модели. Например, встречаются следующие варианты: слева направо 1-16, справа налево 16-1, вперемежку 15, 16, 1-14.

Подсказку следует искать визуально по отмаркированным цифрам на печатной плате. Контакты 15, 16 обычно дублируются еще одной парой контактов с маркировкой А и К соответственно. Электрически они соединены параллельно.

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

Электрический интерфейс состоит из трех шин:

DB0-DB7 шина данных;

RS, R/W, E шина управления;
VCC, GND, Vo, A, K шина питания.

Внимание: перед подключением питания VCC и GND внимательно прочитайте описание на Ваш дисплей, т.к. контакты питания у некоторых дисплеев могут различаться.

Типовая схема подключения LCD к МК показана на рис.3. Именно она и будет использоваться для первой тестовой проверки LCD с выведением на экран знаменитой фразы “Hello, world!” (“Здравствуй, мир!”). Кнопка SB1 осуществляет начальный сброс. Переменным резистором R2 регулируют контрастность изображения. Его сопротивление непринципиально и может меняться от 5 до 20 кОм.

Рис. 3

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

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

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

Во-первых, LCD будет работать только на прием информации по всем 11 соединительным линиям шины данных и управления.

Во-вторых, экран LCD считается жестко привязанным к начальной позиции с фиксированными адресами знакомест.

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

Программное управление LCD

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

Таблица 3

В таблице (см. выше) показана расшифровка наиболее употребляемых команд, посылаемых от МК в LCD, а на рис.4 – показаны команды для перехода на определенное знакоместо верхней или нижней строки экрана.

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

Рисунок 4

Различают команды прямого и косвенного действия. Первые из них занимают адреса 0x01-0x3F и не требуют передачи данных.

За вторыми (диапазон выше 0x3F) обязательно следует передача одного или нескольких байтов информации. Для примера на рис.

5 показаны временные диаграммы выполнения команды 0x80 “Установка курсора в первое знакоместо верхней строки экрана” и индикация в нем цифры “4” пересылкой кода данных 0x34.

Рисунок 5

Формировать диаграммы, показанные на рис.5, должен МК с учетом задержек из табл.3, необходимых контроллеру LCD на выполнение команд. Для повышения устойчивости работы экономить на задержках не надо. По крайней мере, при отладке программы они должны быть достаточно большими.

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

Далее показана Си-программа для тестовой проверки LCD по схеме, собранной на рис.3.

// Тестовая программа для LCD, шина 8 бит #include #include #define RS PC0 // RS подключаем к PC0 микроконтроллера #define EN PC2 // EN подключаем к PC2 микроконтроллера // Функция записи команды в LCD void lcd_com(unsigned char p) { PORTC &= ~(1

Источник: https://radioparty.ru/prog-avr/program-c/258-lcd-avr

Работа с символьным жидкокристаллическим индикатором

Методическое указание к лабораторной работе на учебном стенде LESO1.

1 Цель работы

  1. Изучить схему подключения жидкокристаллического индикатора (ЖКИ) к микроконтроллеру.
  2. Изучить особенности работы символьного ЖКИ.
  3. Изучить особенность параллельной синхронной передачи данных.
  4. Научится выводить на ЖКИ информацию.

2 Предварительная подготовка к работе

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

3 Краткие теоретические сведения

3.1 Устройство и принцип работы символьного жидкокристаллического индикатора

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

Графические индикаторы представляют собой матрицу из m строк и n столбцов, на пересечении которых находятся пиксели. Пиксель представляет собой неделимый объект прямоугольной или круглой формы, обладающий определённым цветом; пиксель – наименьшая единица растрового изображения.

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

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

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

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

Внешний вид ЖКИ показан на рисунке ниже.

Рисунок 1 – Внешний вид жидкокристаллического индикатора

В учебном стенде LESO1 использован двухстрочный восьмисимвольный ЖКИ. Структурная схема показана на рисунке 2.

Рисунок 2 – Структурная схема ЖКИ

В состав контроллера ЖКИ входят три вида памяти: CGROM, CGRAM, DDRAM.

Когда микроконтроллер передает в контроллер ЖКИ ASCII-коды символов, то они записываются в DDRAM (Display data RAM – ОЗУ ASCII-кодов отображаемых символов), такую память называют видеопамятью или видеобуфером. Видеобуфер в символьных индикаторах обычно содержит 80 ячеек памяти – больше, чем число знакомест дисплея.

У двухстрочных индикаторов ячейки с адресами от 0x00 и до 0x27 отображаются на верхней строке дисплея, а ячейки с адресами 0x40 … 0x67 – на нижней строке. Смещая видимое окно дисплея относительно DDRAM, можно отображать на дисплее различные области видеопамяти.

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

Рисунок 3 – Отображение символов из видеобуфера

Матрицы начертания символов хранятся в памяти знакогенератора.

Память знакогенератора включает в себя CGROM (Character generator ROM – ПЗУ знакогенератора), в которую на заводе-изготовителе загружены начертания символов таблицы ASCII. Содержимое CGROM изменить нельзя.

Для того, чтобы пользователь смог самостоятельно задать начертание нужных ему символов, в знакогенераторе имеется специальное ОЗУ – CGRAM (Character generator RAM). Под ячейки CGRAM отведены первые (младшие) 16 адресов таблицы кодов.

Схема подключения ЖКИ к микроконтроллеру ADuC842 показана ниже на рисунке:

Рисунок 4 – Схема подключения ЖКИ к микроконтроллеру

Интерфейс подключения – параллельный. Для соединения индикатора с микроконтроллером используется 11 линий — восемь для передачи данных (D0D7) и три линии управления.

Линия RS служит для сообщения контроллеру индикатора о том, что именно передается по шине: команда или данные (RS = 1 — данные, RS = 0 — команда).

По линии Е передается строб-сигнал, сопровождающий запись или чтение данных: по переходу сигнала на линии E из 1 в 0 осуществляется запись данных во входной буфер микроконтроллера индикатора. Запись информации в ЖКИ происходит по спаду этого сигнала.

Потенциал на управляющем выводе R/W (Read/Write) задает направление передачи информации, при R/W = 0 осуществляется запись в память индикатора, при R/W = 1 – чтение из нее. Еще три линии предназначены для подачи питающего напряжения (VDD, GND) и напряжения смещения, которое управляет контрастностью дисплея.

Диаграммы передачи данных от управляющего микроконтроллера к контроллеру ЖКИ и от контроллера ЖКИ в управляющий микроконтроллер показаны на рисунках 5 и 6 соответственно. После приема информации контроллеру ЖКИ требуется некоторое время на выполнение команд, в это время управляющий контроллер не должен давать следующую команду или пересылать данные.

Рисунок 5 – Диаграмма передачи информации контроллеру ЖКИРисунок 6 – Диаграмма чтения информации из контроллера ЖКИ

В таблице 1 приведены команды контроллера ЖКИ и время, необходимое для выполнения этих команд.

Для того чтобы можно было определить, когда ЖКИ закончит свои внутренние операции, контроллер ЖКИ содержит специальный флаг занятости – BUSY-флаг (BF).

Если контроллер занят выполнением внутренних операций, то BF установлен (BF = 1), если же контроллер готов принять следующую команду, то BF сброшен (BF = 0).

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

Таблица 1 – Команды контроллера ЖКИ

Команда Код Описание Время исполнения команды
RS R/W D7 D6 D5 D4 D3 D2 D1 D0
Очистка дисплея 1 Записывает код 0x20 (пробел) во все ячейки DDRAM, устанавливает счетчик адреса DDRAM в 0x00. 1,5 мс
Возврат в начальную позицию 1 х Устанавливает счетчик адреса DDRAM в 0x00 и возвращает курсор в начальную позицию. Содержимое DDRAM не изменяется. 1,5 мс
Режим ввода 1 L/R SH Задает направление перемещения курсора (L/R) и разрешает сдвиг сразу всех символов (SH). 38 мс
Включение-выключение дисплея 1 D C B Устанавливает/ отключает биты, отвечающие за включения дисплея (D), отображение курсора (C), мерцание курсора (B). 38 мкс
Сдвиг курсора или видимой области дисплея 1 D/C R/L x x Бит D/C определяет то, что будет перемещаться – видимая область дисплея или курсор (при D/C = 1 перемещается видимая область, при D/C = 0 – курсор), R/L задает направление перемещения. DDRAM не изменяется 38 мкс
Начальные установки 1 DL N F x x Определяет разрядность шины интерфейса (DL = 1 8-бит, DL = 0 4-бита), количества строк на дисплее (N = 1 – две строки, N = 0 – одна строка) и размера символов (F = 1 – 5×11 точек, F = 0 5×8 точек). 38 мкс
Установка адреса CGRAM 1 A5 A4 A3 A2 A1 A0 Установка счетчика адреса CGRAM 38 мкс
Установка адреса DDRAM 1 A6 A5 A4 A3 A2 A1 A0 Установка счетчика адреса DDRAM 38 мкс
Чтение BF и счетчика адреса 1 BF A6 A5 A4 A3 A2 A1 A0 Если BF = 1 то контроллер ЖКИ выполняет внутреннюю операцию. А6 – А0 – текущее значение адреса DDRAM.
Запись данных в RAM 1 D7 D6 D5 D4 D3 D2 D1 D0 Запись данных в ОЗУ (DDRAM или CGRAM) 38 мкс
Чтение данных из RAM 1 1 D7 D6 D5 D4 D3 D2 D1 D0 Чтение данных из ОЗУ (DDRAM или CGRAM) 38 мкс

Перед началом работы требуется произвести инициализацию ЖКИ согласно алгоритму, показанному на рисунке 7.

Рисунок 7 – Алгоритм инициализации ЖКИРисунок 8 – Таблица символов знакогенератора

3.2 Рекомендации по программному управлению ЖКИ

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

В любом случае, общий алгоритм передачи информации контроллеру не изменится.

Руководствуясь диаграммой передачи информации (рисунок 5), определим последовательность действий при передаче информации в ЖКИ следующим образом: устанавливаем требуемое значение RS, на линию R/W подаем логический ноль, затем на линию E выводим логическую единицу, после чего подаем на шину D значение передаваемого байта.

Контроллер ЖКИ считает этот байт и состояние управляющих линий (RS, R/W) только после подачи на линию E логического ноля. При этом, если временные задержки, указные на диаграмме, меньше длительности машинного цикла, то ими можно пренебречь. Код программы, реализующей запись в память ЖКИ байта данных, показан ниже:

В приведенном участке программы подразумевается, что переменные RS, RW и E объявлены как sbit, а переменная Data – как sfr. Аналогично будет происходить передача любой команды контроллеру ЖКИ.

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

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

4 Задание к работе в лаборатории

SFR параллельных портовSFR таймеровSFR UART

4.1 Вывод символа на ЖКИ

  1. Разработайте алгоритм программы, выводящей на экран ЖКИ ваше имя в заданной строке. Режим работы ЖКИ и номер строки определяется согласно варианту задания (таблица 2).
  2. По принципиальной схеме учебного стенда LESO1 определите, к каким выводам микроконтроллера ADuC842 подключен ЖКИ. По таблице SFR определите адреса используемых портов ввода-вывода.
  3. Разработайте и введите текст программы в соответствии с созданным алгоритмом.
  4. Оттранслируйте программу, и исправьте синтаксические ошибки.
  5. Загрузите полученный *.hex файл в лабораторный стенд LESO1.
  6. Убедитесь, что на экране дисплея в заданной позиции появился требуемый символ.

4.2 Управление ЖКИ через последовательный порт персонального компьютера (дополнительно)

  1. Измените программу таким образом, что бы на экране ЖКИ выводилась информация, переданная с персонального компьютера через UART. Передача команды осуществляется через терминал nwFlash. Выбор источника синхронизации и скорости передачи данных осуществляется по усмотрению студента.
  2. Загрузите полученный *.hex файл в лабораторный стенд LESO1.
  3. Через терминал nwFlash передайте коды символов, убедитесь, что соответствующие символы выводятся на экране индикатора.

Таблица 2 – Варианты заданий

номер варианта номер строки режим курсора
1 первая выключен
2 вторая включен, мерцает
3 первая включен, не мерцает
4 вторая выключен
5 первая включен, мерцает
6 вторая включен, не мерцает
7 первая выключен
8 вторая включен, мерцает
9 первая включен, не мерцает
10 вторая выключен
11 первая включен, мерцает
12 вторая включен, не мерцает
13 первая выключен
14 вторая включен, мерцает
15 первая включен, не мерцает

5 Указания к составлению отчета

Отчет должен содержать:

  1. Цель работы.
  2. Принципиальную схему подключения ЖКИ к управляющему микроконтроллер.
  3. Структурную схему ЖКИ.
  4. Диаграммы передачи данных по параллельному интерфейсу.
  5. Расчет параметров таймера.
  6. Графическую схему алгоритма работы программы.
  7. Исходный текст программы.
  8. Содержимое файла листинга программного проекта.
  9. Выводы по выполненной лабораторной работе.

Схемы, а также отчет в целом, выполняются согласно нормам ЕСКД.

Источник: http://www.labfor.ru/guidance/mpu-leso1/6

LCF-метр на ATMEGA8 и LCD1602 — Сообщество «Электронные Поделки» на DRIVE2

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

Измеритель LCF

Я уже собирал несколько измерительных приборов, Частотомер, испытатель транзисторов.
Но, как говорится “наши руки, не для скуки” решил собрать Измеритель LCF. Схему и всю подноготную почерпнул с этой страницы LCF-метр на ATMEGA8 и LCD1602.

Данный прибор предназначен для измерения ёмкости конденсаторов, индуктивности и частоты.

Конденсаторы:Диапазон измерений: 0,1 pF ÷ 10 000,0 uF.Измерения проводятся в трех диапазонах, переключение диапазонов автоматическое.

В первом диапазоне измеряются емкости до 100 nF, во втором до 100 uF, в третьем выше 100 uF.

Индуктивность:
Диапазон измерений: 0,1 uH ÷ 100,0 H.

Частота:
Диапазон измерений: 1 Hz ÷ 4 MHz.

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

Схему и плату делал в ДипТрейс под свои компоненты.

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

Вариант моей схемы

Сначала собирал прибор в безкорнусном варианте на ATMega8(32). В моём архиве есть вариант этой платы.Но побывав в магазине Чип и Дип обнаружил там много разных корпусов для РЭАИ сразу решил оформлять прибор в подходящий корпус.

Корпус G1204B 142.8×8, 5×38мм как нельзя лучше подходил для данного проекта. Тем более блок питания в корпусе я размещать не собирался. Место было много, я и не старался мельтешить.

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

Плата сторона деталей

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

Плата сторона дорожек

Вот готовое устройство.

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

сторона деталей

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

вставил плату в корпус

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

верхняя крышка

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

сейчас 4 шурупа закручу и готовый прибор смотрим чтобы ничего не замыкало

Что касаемо применяемых деталей, к точности номиналов никаких особых требований нет.

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

Фьюзы для ATMega8 будутLOW= DE

HIGH= D9

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

Калибровка измерителя емкости.1. Для калибровки следует выбрать режим измерения емкости и нажать на кнопку SET. В верхней строке дисплея появятся настроечные коэффициенты. Устанавливаемый параметр мигает. В нижней строке измеренная емкость.2. К входным щупам не должно быть никаких подключений.3.

Нажать на кнопку PLUS или MINUS – произойдет настройка показаний емкости на 0. Коэффициент Z1 (Z2, Z3) установится автоматически. Если показания не стали нулевыми – операцию повторить.4. Подключить к щупам образцовый конденсатор (для нижнего диапазона 1 nF ÷ 100 nF, для второго 100 nF ÷ 100 uF, для третьего 100 uF ÷ 10000 uF).

Прибор автоматически выберет предел измерения.5. Если показания емкости отличаются от номинала конденсатора – нажать на кнопку SET, начнет мигать параметр C1 (C2, C3).6. Кнопками PLUS/MINUS установить требуемую емкость.7. Повторить настройку, начиная с п.1.8. Все диапазоны настраиваются аналогично. (В верхних диапазонах параметр Z2, Z2 как правило устанавливается в 0.

)9. Через 10 сек от последнего нажатия на кнопки прибор перейдет в основной режим, настройки запишутся в память.

10. Если из основного режима нажать на кнопки PLUS/MINUS, то произойдет установка коэффициентов Z1 (Z2, Z3).

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

Закоротить входные щупы.3. Нажать на кнопку PLUS или MINUS – произойдет настройка показаний индуктивности на ноль. Параметр L0 устанавливается автоматически. Если показания не стали нулевыми – операцию повторить.4. Подключить к щупам индуктивность известного номинала.5.

Если показания индуктивности отличаются от номинала – нажать на кнопку SET, начнет мигать параметр LC.6. Кнопками PLUS/MINUS установить требуемую индуктивность.7. Повторить настройку, начиная с п.1.8.

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

9. Если из основного режима нажать на кнопки PLUS/MINUS, то произойдет установка коэффициента L0 (настройка показаний на ноль, при этом щупы должны быть замкнуты).

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

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

измерение частоты

Замер индуктивностей, на сколько точно он меряет не знаю эталонной индуктивности у меня не оказалось, но меряет.

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

замер индуктивности

Замер ёмкостей конденсаторов, достаточно точно определяет ёмкость от 10нф.

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

замер конденсатора 0,47мкФ

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

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

контактная площадка

Дело в том что щупы для смд компонентов уже имеют ёмкость около 30пф, и к таким щупам прибор нужно откалибровать. Но значение в 30 пф плавают, замерить ёмкость в 15пф вы не сможете. Да и ёмкость моей контактной площадки около 10пф, но тут хоть показания не плавают как с щупами. Откорректировал на «0» и можно пользоваться.

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

Замер смд конденсатора. Придерживаю зубочисткой

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

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

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

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

В архиве находятся: прошивки, описание, FUSE для прошивки микроконтроллера, файлы для симуляции работы прибора в Proteus, файлы схемы, варианты печатной платы от автора и мои варианты схем и плат в DipTrace.

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

Двухканальный термометр, часы на ATmega8, DS18B20, DS1307, LCD1602

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

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

Схема двухканального термометра и часов

Конструкция собрана на микроконтроллере ATmega8-16PU, микросхеме часов реального времени DS1307 в DIP корпусе, цифровых датчиках температуры DS18B20, ЖК индикаторе LCD1602

Схема устройства создана в программе «Cadsoft Eagle» Датчики температуры подключаются к разъемам DS1 и DS2: — вывод 1 — к выводу GND датчика — вывод 2 — к выводу DQ датчика

— вывод 3 — к выводу Vcc датчика

Подключение датчиков на схеме не соответствует печатной плате.
Программа подогнана под печатную плату, необходимо подключать:
— 1-й датчик к РВ1 (15-й вывод)
— 2-й датчик к РВ2 (16-й вывод)

Обращаю ваше внимание на подключение выводов порта D микроконтроллера к выводам индикатора: — PD0 микроконтроллера — к выводу D7 индикатора — PD1 микроконтроллера — к выводу D6 индикатора — PD2 микроконтроллера — к выводу D5 индикатора — PD3 микроконтроллера — к выводу D4 индикатора

Такое подключение выбрано с целью упрощения разводки дорожек на печатной плате

Детали, примененные в конструкции:

В качестве ЖК дисплея применен 2- строчный, 16-символьный LCD дисплей китайского производства с маркировкой «1602А» — негативный, белые символы на темно-синем фоне с белой подсветкой.

Также можно использовать любой аналогичный знакосинтезирующий (символьный) двухстрочный, 16-символьный индикатор, с поддержкой кириллицы или без поддержки, поддерживающий систему команд контроллера НD44780 типа: — STN (FSTN) Negative (blue или black) с подсветкой (такой применен в конструкции) — такие индикаторы работают только с подсветкой — FSTN Positive, TN Positive, HTN Positive —  с подсветкой или без нее

Примененный китайский LCD индикатор не имеет встроенной кириллицы, поэтому, для наглядности вывода дня недели на индикатор в ОЗУ знакогенератора (CGRAM) записаны пользовательские символы — «П», «н», «т», «Ч», «б» и два символа в инверсном виде «Д» и «У».

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

Конструкция собрана на односторонней печатной плате, все примененные детали — «выводные»
Печатная плата устройства создана в программе «SprintLayout». На плате имеется три перемычки — П1, П2, П3

Кварцевый резонатор установлен на плате «лежа», корпус резонатора припаивается перемычкой к контактной площадке на плате под резонатором.

Описание работы двухканального термометра и часов

Основой конструкции «Двухканальный термометр, часы» является микроконтроллер ATmega8 в DIP корпусе с тактовой частотой 1 МГц от встроенного генератора с внутренней RC цепочкой. Установка FUSE-битов — по умолчанию, ничего менять не надо.

Для определения текущего времени применена микросхема часов реального времени DS1307, которая отсчитывает секунды, минуты, часы, дату месяца, месяц, день недели и год с компенсацией високосного года действительной до 2100 года.

На индикацию выводятся только: — текущее время — часы и минуту — дата месяца — месяц — день недели

В качестве датчиков температуры применены два цифровых датчика температуры DS18D20, которые позволяют измерить текущую температуру в пределах от -45 градуов до +125 градусов Цельсия с точностью 0,5 градуса.

На индикацию выводится текущая температура каждого датчика с разрядностью 0,1 °С Перед значением каждой температуры выводятся символы «Д» и «У» в инверсном виде: — «Д» — температура в доме

— «У» — температура на улице

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

Питание устройства осуществляется от стабилизированного источника питания напряжением 5 Вольт, можно применить зарядное устройство от сотового телефона, или автономный источник питания — АКБ. Потребляемый ток зависит от яркости подсветки (номинала резистора R3) и в конкретном случае составляет 12 мА.

Управление устройством осуществляется двумя кнопками: — S1 — «Выбор»

— S2 — «Установка»

При первом включение устройства (или при каждом включении при отсутствии резервного источника питания DS1307 — BAT1) устройство переходит в режим «Полной» установки.

При этом необходимо выставить текущие год, месяц, дату, день недели и текущее время — часы-минуты.

В этом режиме перевод пояснительной информации на русский не проводился (в отличии от индикации дня недели), все пояснения выводятся на английском (полная установка производится крайне редко, разобраться в ней не трудно):

Установка года «Year»: Мигающий курсор в виде белого прямоугольника указывает где и что нужно вводить: — кнопкой «Установка» — выставляем десятки лет — кнопкой «Выбор» — переходим к установке единиц года — кнопкой «Установка» — выставляем значение единиц года

— кнопкой «Выбор» — переходим к следующей установке

Установка месяца «Month»
— аналогично установке года

Установка дня месяца «Data»:
— аналогично установке года

Установка дня недели «Week»:
— аналогично установке года, при этом — 1- Пн, 2 — Вт, 3 — Ср, 4 — Чт, 5 — Пт, 6 — Сб, 7 — Вс

Установка текущего времени «Hour_Min» Для примера, текущее время 17 часов 39 минут: — кнопкой «Установка» — выставляем десятки часов — 1 — кнопкой «Выбор» — переходим к установке единиц часов — кнопкой «Установка» — выставляем единицы часов — 7 — кнопкой «Выбор» — переходим к установке десятков минут — 4 — кнопкой «Установка» — выставляем единицы минут -0 — секунды уже обозначены на дисплеи как «00»

— ровно в 17 часов 40 минут нажимаем кнопку «Выбор» и текущее время 17 часов 40 минут 00 секунд запишется в DS1307

В рабочем режиме кнопки «Выбор» и «Установка» позволяют перейти в режимы:
кнопка «Выбор» — коррекция времени (при этом производится установка только текущего времени «Hour_Min» как описано выше)
кнопка «Установка» — «Полная» установка
Для входа в нужный режим необходимо нажать соответствующую кнопку и держать ее до тех пор пока экран дисплея не очистится. После очистки дисплея отпускаем кнопку и через секунду переходим в выбранный режим.

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

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

Устройство заработало сразу, проблем не наблюдается.

Печатная плата выполнена методом ЛУТ.

Из-за ошибки установки микросхем на плате, их пришлось выпаивать и переставлять (и на старуху бывает проруха), что привело к повреждению печатных проводников и, как результат, — внешний вид не очень, перемычка П2 установлена со стороны печатных проводников (не просверлил отверстия), датчик DS1 подсоединен  кабелем длиной около 1 метра (так, чтобы он был на высоте около 30 см от пола, датчик DS2 подсоединен кабелем длиной 5 метров и выведен за окно. Разъемы для подключения датчиков взяты от куллеров старых компьютеров.

Была одна проблема — не сразу запустилась RTC DS1307, причина — канифоль между выводами кварца. После промывки платы часы заработали.

  Программа устройства в НЕХ файле (10,8 KiB, 1 514 hits)

  Программа в Algorithm Builder (27,3 KiB, 1 147 hits)

  Схема двухканального термометра, часов в “Cadsoft Eagle” (390,1 KiB, 981 hits)

  Печатная плата двухканального термометра, часов в “Sprint Layout” (51,7 KiB, 1 886 hits)

Скачать с ЯндексДиска  (дополнительно — даташиты на русском)

Все необходимые детали для сборки «Двухканального термометра, часов на ATmega8, DS18B20, Ds1307», включая запрограммированный микроконтроллер, вы можете заказать в интернет- магазине сайта «МирМК-SHOP»

Другие конструкции на микроконтроллерах:
1. Простые электронные часы на микроконтроллере ATyni26, с использование микросхемы часов реального времени DS1307
2. Простой термометр на микроконтроллере ATmega8 и датчика температуры DS18B20
3.

Двухканальный термометр на микроконтроллере ATmega8 и датчиках температуры DS18B20
4. Двухканальный термостат, терморегулятор на ATmega8 и датчиках DS18B20
5.

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

Источник: https://microkontroller.ru/shemyi-konstruktsii-na-mikrokontrollerah/termometr-chasyi-atmega8-lcd1602/

Ссылка на основную публикацию
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}