Авторизация


...

Кто на сайте?

Сейчас 85 гостей и ни одного зарегистрированного пользователя на сайте

Статистика

-Посетители : 26421
-Материалы : 210

Пользователь сайта продает...

  ENC28J60

Пользователь сайта покупает...

Вывод информации на экран телевизора с помощью монохромного генератора экранного меню на MAX7456 в связке с PIC18F252.

Автор: Александр Маюнов Просмотров: 14833

 

 

Глубокое изучение таких статей выложенных на этом сайте как: Видеоадаптер на микроконтроллере PIC18F46K20, и Термометр с выводом показаний на экран телевизора, очень заинтересовали т.к. выводить информацию можно через обычный тюльпан в формате PAL. Но собрав эти устройства понял, что для меня работать на таких высоких частотах, и уж тем более адаптировать свои устройства под них пока сложно. Погуглив в интернете, нашел кучу устройств на AVR-ах и выводом информации через  монохромный генератор экранного меню MAX7456.

Скачав datasheet (в приложении прилагается) начал разбираться как работает эта штуковина. Оказалась классная вещь, в арсенале имеется 256 символов прошитых в EEPROM  память MAX7456, работает в системе PAL/NTSC, выбирается пользователем, символы размером 12х18 пикселей, и в системе кодирования PAL на экран телевизора можно выводить 16 строк по 30 символов в каждой, расширенный диапазон температур (-45 до +850С). Работает такой девайс с внешним миром по последовательному интерфейсу SPI,  для начинающего  радиолюбителя ниже представил 8 положительных качеств MAXа.

  1. Минимальная обвязка.
  2. Умеренное энергопотребление (около 100мА)
  3. Возможность вывода символов и графических элементов собственного производства.
  4. Возможность принимать/передавать данные в частотах до 6МГц (на кварце пика в 20Мгц прием/передача осуществляется на частоте 5Мгц).
  5. Не нужна синхронизация с входом и выходом (автоматическая).
  6. Вывод данных в любую область дисплея без необходимости заполнять пропускаемое пространство.
  7. Простота управления.
  8. Инвертирование цвета и мигание символа (удобно для настройки).

Отрицательные:

  1. Цена.

На Российском рынке цена колеблется до 1200руб за штуку, в этом плане тоже сэкономил,   заказал на будущее сразу 5 на Алиэкспресс, вышло очень дешево по 130руб, за штуку. Генератор выпускается только в одном корпусе 28 выводной TSSOP, работающий от 5V, на поле дисплея можно вывести суммарно  до 480 символов.

В MAX7456 прошита таблица символов показанная на рис.1 ниже :

alt

Рис.1.Таблица заводских символов.

MAX7456 тактируется от внешнего кварца на 27МГц, для вникание в процессы предлагаю рассмотреть работу MAX в связке с PIC18F252, тактирующегося от кварца в 20МГц,  схема универсального блока изображена на рис.2  ниже.

alt

Рис.2. Схема связи PIC18F252 с MAX7456 с развязкой по питанию.

Для разработки этой схемы применил штатную обвязку MAX7456 указанную в даташите. Теперь разберемся с тем, что из себя представляет поле дисплея на которое будем выводить символ. Представим себе экран телевизора с сеткой в 16 строк и 30 клеток в каждой, так вот программист сначала создает разметку на таком поле расписывая символы которые будет выводить в нужной последовательности, для уменьшения команд для вывода символа в MAX7456 предусмотрен бит включения автоинкрементной работы, данные выводятся слева направо, поэтому устанавливаем адрес ячейки первого символа -> включаем автоинкрементную работу-> и посылаем в MAX только 8 битные данные, это удобно когда к примеру нужно вывести предложения, а уж потом менять только символы динамически изменяющиеся, например время часов, температуру, или измерение АЦП. Когда выводится последний символ предложения отправляем байт 0хFF, и MAX7456 воспринимает его как конец вывода в автоинкрементном режиме.  После чего пишем новый адрес строки и номера символа, и повторяем выше перечисленное, пока поле не будет заполнено там где нам нужно. Каждая строка после заполнения 29-го символа в автоинкрементной работе переходит автоматически на следующую строку в символ 0.

На рис.1., желтым цветом показаны строки, а синим все поле доступное для заполнения, символами и знаками.

alt

Рис.1. Поле дисплея на которое может выводится информация пользователя.

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

 

   movlw       .8
            movwf       SIMBOL
            call            ADR_LIN_5
            nop
            call            MESTO_DISP          ; установить курсор в выбраное место дисплея

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

ADR_LIN_5      
            bcf         TEMP_H,0                    ; адрес старшего байта строки
            movlw    78H                              ; адрес младшего байта строки
            addwf    SIMBOL,W
            movwf    TEMP_L                      ;
            RETURN                                    ; возвращаемся

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Теперь разберемся с картой оперативной памяти MAX7456. На  первый взгляд целая куча регистров и как всё запомнить какой куда и для чего.

Попробуем разобраться, для того чтоб начать передавать данные и выводить их на дисплей нужно настроить MAX7456, а именно настроить регистры выделенные темно-синим цветом, они можно сказать основные для инициализации MAX, красным цветом выделены регистры адреса символа на экране DMAH:DMAL, и регистр DMDI для указания номера символа из памяти EEPROM MAX7456. Желтым указаны регистры статуса (состояния) генератора. Зеленым показаны вспомогательные регистры установки яркости ряда т.е. строки, для каждой строки может выбираться своя контрастность. Голубым показаны регистры необходимые для записи новых или изменения существующих символов в памяти МАХ7456. По умолчанию и после подачи питания, большинство всех этих регистров устанавливаются в зашитые заводом состояния, их значения можно посмотреть в переведенном даташите (прилагается в архиве).

 

alt

 

Карта оперативной памяти MAX7456 (Регистры специального назначения)

 

MAX7456 может работать в двух режимах в 8-битном самом гибком режиме и 16-битном самом высокоскоростном. В этой статье я буду рассматривать только 8-разрядный режим. Итак как же происходит запись и чтение байтов в регистры MAXа? Открываем переведенный даташит стр.21 и начинаем вникать. Для того чтоб начать master-у общение с MAX7456 (он же slave) необходимо перевести вывод контроллера CS c высокого уровня в низкий т.е. с лог. 1 в лог 0. Тем самым MAX7456 начинает ожидать первый байт, как правило первым байтом идет адрес регистра в который будем записывать и следом тут же данные которые в этот регистр нужно записать, всё устанавливаем в лог.1 выход CS, и MAX7456 тут же его обрабатывает. Байт записан. Если байт нужно считать из MAX7456, то устанавливаем лог.0 на линии CS, и отправляем адрес регистра только с адресом для чтения например 80Н, и тут же отправляем один пустой байт, чтобы синхронно со вторым байтом у нас в приемнике осел байт который мы считали т.е. регистр VM0, всё устанавливаем в лог.1 выход CS. Байт считан. Теперь подробнее всё это:

При корректной настройке модуля SPI PIC18F252 байты отправляются и принимаются без ошибок, и с пол пинка. Настроим модуль SPI:

Для этого нужно настроить выводы RC2/CS, RC3/SCK, RC5/SDO – на выход, с этих выводов будут только выходить сигналы, а RC4/SDI –на вход, с него будем принимать данные аппаратными средствами модуля SPI.  После чего смотрим в переведенный даташит, и читаем диаграммы приема/передатчика MAX, рассмотрим рис.4

 

alt

Рис.4. Операция записи в MAX7456

 

Передача осуществляется старшим битом вперед передается 16 бит без остановок, старший байт содержит адрес регистра выбранного из карты оперативной памяти, а младшим, байт данных который будет содержать этот регистр, передача происходит по переднему фронту значит при настройке PIC SCK (CKE=1), пассивным низкий уровень сигнала SCK(CKP=0), активный считается низкий уровень сигнала лог.0 на линии CS, пассивным высокий лог.1.

Рассмотрим операцию чтения на рис.5. Для чтения байта указывается сначала адрес регистра который будем считывать(старший бит устанавливается в 1), а затем отправляем пустой байт, т.к. синхроимпульсы на линии SCK появляются только тогда когда отправляется от пика байт, MAX второй байт отправленный в него игнорирует, и синхронно с приемом отправляет в пик байт запрошенного регистра. Из этой диаграммы можно сделать вывод, что считывать байт отправленный из МАХ в ПИК правильнее читать в середине периода вывода данных.

 

alt

Рис.5. Операция чтения из MAX7456

 

Итак всё данные для настройки модуля SPI имеются,

настраиваем регистр SSPSTAT b’0100 0000’ ; 0-бит приемный буфер SSPBUF

1-5 нас не интересует они для настройки модуля I2C

6 –  при CKP=0 -> СКЕ=1

7- опрос в середине периода вывода данных.

настраиваем регистр SSPCON1  b ’0000 0000’ ; 3:0 биты выбора тактового сигнала выбираем Fosc/4 получается 20/4 =5МГц частота передачи на линии SCK.

4-бит СКР (бит выбора полярности тактового сигнала) пассивный низкий уровень СКР=0

5-бит включения/выключения 1/0 модуля SPI

6- в 0 нет переполнения приемного буфера.

7- нас не интересует они для настройки модуля I2C

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

Теперь разберемся с инициализацией MAX7456.

MAX7456 тактируется от 27МГц кварца, для устойчивого его запуска, и для наведения порядка внутри генератора после подачи питания и настройки модуля SPI сразу передавать данные нельзя, это приведет к неожиданным результатам, необходимо выждать время 50мс за это время внутри МАХ сбрасывает все регистры к установкам по умолчанию.

Выстраиваем последовательность инициализации МАХ7456:

  1. Настраиваем модуль SPI
  2. Пауза 50мс
  3. Записать в рег. VM0 – 02h (общий программный сброс)
  4. Ждать 100мкс
  5. Записать в рег. VM0 b’0100 1100’ (стандарт PAL, вкл. дисплей, вкл. экран в след. VSYNC)
  6. Записать в рег. DMM b’0100 0000’ (включить 8-битный режим)
  7. Записать в рег. HOS  b'00110001' ( смещ. экрана по горизонтали вправо +17 пикселей)
  8. И Записать в рег. VOS если необходимо, зависит от разрешения экрана телека. 

Всё инициализация окончена.

Можно выводить символы:

  1. Записать в DMAH b'00000000' (значение старшего байта адреса на дисплее)
  2. Записать в DMAL  .30 (значение младшего байта адреса на дисплее, 2 строка 0 символ)
  3. Записать в DMDI адрес любого символа из таблицы символов например 02h (цифра 2).

И так далее повторяя предыдущие 3 операции.

Разберем автоинкрементный режим:

  1. Записать в DMAH b'00000000' (значение старшего байта адреса на дисплее)
  2. Записать в DMAL  .61 (значение младшего байта адреса на дисплее, 3 строка 1 символ)
  3. Записать в рег. DMM b’0100 0001’ (включить 8-битный режим, автоинкрементный режим)
  4. Записать в DMDI 01h   (вывод символа 1)
  5. Записать в DMDI 02h   (вывод символа 2)
  6. Записать в DMDI 03h   (вывод символа 3)
  7. Записать в DMDI 04h   (вывод символа 4)
  8. Записать в DMDI 05h   (вывод символа 5)
  9. Записать в DMDI 06h   (вывод символа 6)
  10. Записать в DMDI 07h   (вывод символа 7)
  11. Записать в DMDI 08h   (вывод символа 8)
  12. Записать в DMDI 09h   (вывод символа 9)
  13. Записать в DMDI 0Ah   (вывод символа A)
  14. Записать в DMDI 0Bh   (вывод символа B)
  15. Записать в DMDI 0Ch   (вывод символа C)
  16. Записать в DMDI 0Dh   (вывод символа D)
  17. Записать в DMDI 0FFh (конец автоинкрементной работы)

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

В MAX7456 можно после вывода символа заставить его мигать, или инвертировать его цвет, либо и то и другое.

Рассмотрим мигание и инвертирование. Для этого в регистре VM1 нужно настроить интенсивность мигания, в программе я установил ВТ:ВТ т.е. вкл.=выкл., скорость мигания поставил 120мс в режиме PAL.

После вывода вышеуказанной информации включим мигание к примеру символа 6 и 7, и инвертируем символ 8 и 9.

  1. Записать в VM1 b’0100 1000’ (мигание ВТ:ВТ, 6 полей, остальное без изменения).
  2. Записать в DMAH b'0000 0010' (1-бит символьного атрибута символа задается в DMDI).  Теперь в DMDI записывается  не номер символа из таблицы, а байт атрибута символа т.е. то, что этот символ должен делать на экране просто гореть, инвертировать свои цвета или мигать.
  3. Записать DMAL .66
  4. Записать в рег. DMM b’0100 0001’ (включить 8-битный режим, автоинкрементный режим)
  5. Записать в DMDI b'0100 0000' (включить мигание 6)
  6. Записать в DMDI b'0100 0000' (включить мигание 7)
  7. Записать в DMDI b'0010 0000' (включить инвертирование 8)
  8. Записать в DMDI b'0010 0000' (включить инвертирование 9)
  9. Записать в DMDI 0FF (конец автоинкрементной работы)

Можно и не включать автоинкрементный режим тогда нужно для каждого символа устанавливать свой адрес.

Далее рассмотрим шаги для записи символьных байтов в символьную память NVM.

Или как изменить символы в памяти EEPROM MAX7456.

В архиве есть папка INMAX с программой для прошивки в MAX таблицы с символами показаными рис 6.

 

alt

Рис.6 Таблица символов прошитая в память MAX7456.

 

Запись нового символа (цитата с даташита с пояснениями):

1) Запишите VM0 [3] = 0, чтобы отключить дисплей изображения.

2) Запишите CMAH [7:0] = xxH, чтобы выбрать символ (0–255), в который будем записывать новый символ (Рисунки 10 и 13 datasheet).

3) Запишите CMAL [7:0] = xxH, чтобы выбрать байт на 4 пикселя (0–63) в символе, который будет записан (Рисунки 10 и 13 datasheet). Для видимой части отведено 54 байта остальные 10 невидимы, поэтому их можно и не менять и записать только 54 байта.

4) Запишите CMDI [7:0] = xxH, чтобы установить пиксельные значения выбранной части символа (Рисунки 11 и 13 datasheet).

5) Повторите шаги 3 и 4, пока все 54 байта символьных данных не будут загружены в теневую RAM.

6) Запишите CMM [7:0] = 1010xxxx, чтобы записать в массив NVM  теневой RAM (рисунок 13 datasheet). Символьная память будет занята приблизительно до 12 мс во время этой записи. STAT [5] может быть прочитан, чтобы проверить, что запись NVM завершена.

7) Запишите VM0 [3] = 1, чтобы включить дисплей изображения OSD.

В программе INMAX реализована запись  в память EEPROM вышеуказанной таблицы символов. Прошиваем программу в PIC18F252, подаем питание через 3-5сек, прозвучит 1 сигнал зумера, и на экран выведутся все символы записанные в EEPROM MAX7456, на разных телевизорах по разному видна правая сторона строк, т.е. на некоторых телеках видно не 30 символов а 27-28.

А вот на компьютерном мониторе с входом CVBS (PAL обычно желтый) у меня было видно все 30 символов в строке. После удачной прошивки на дисплее появится картинка которая показана на рис.7:

 

alt

Рис. 7 таблица символов прошитых в EEPROM MAX7456.

 

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

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

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

 

alt

 

Рис.8 Работа демонстрационной заставки MAX7456 без синхросигнала.

И работа той же заставки когда в видеовход MAX7456 включил тюльпан с ТВ-приставки  DVB-T2 , представлена на рис.9.

 

alt

Рис.9. Работа демонстрационной заставки MAX7456 с проходящим  синхросигналом.

 

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

alt

Рис.10 Материнская плата на PIC18F252.

alt

Рис.11 Материнская плата на PIC18F252 обратная сторона.

 

и часть для видео вывода, на MAX7456 показанную на рис.12, и рис.13.

 

alt

 

Рис.12. Плата для работы с видео генератором MAX7456.

alt

 

Рис.13. Плата для работы с видео генератором MAX7456 обратная сторона.

На обратной стороне вы можете увидеть бумажку подложенную под генератор. Дело в том, что генераторы ко мне по почте шли месяц с Китая. И в интернете нигде не упоминается о том, что обратная часть генератора содержит металлическую площадку. Платы я разрабатывал где-то за пару недель до их прихода, и какого было моё удивление когда уже оставалось только впаять  в плату MAX7456, а там такое. В общем выкрутился бумагой для выпекания, она термостойкая и в два слоя сделала хороший изолятор от дорожек на плате.


Фото самого генератора представлены на рис.14 сверху и снизу.

 

alt

Рис.14. Генератор экранного меню MAX7456 в фас и профиль.

 

И в дополнение на материнку как оказалось прямо вертикально подключить программатор PICKIT2 не  удалось, а если делать их загнутыми, то тогда для третьего блока не удалось бы получить питание +5В и GND, а  также RB6, RB7. Решил оставить так, только дополнил переходником показанным на рис.15.

 

alt

 

Рис.15. Переходник для удобства подключения программатора.

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

 А теперь на сладкое, рассмотрим как же самому создавать символы, как их конвертировать из двоичного кода в 16-ричный, и записать их в генератор MAX.

Специалисты фирмы maximintegrated сделали и это возможным, разработав программное обеспечение которое можно скачать тут,  кликнув на  MAX7456 EVKIT Software  только прежде нужно там же зарегистрироваться, там всё строго поэтому эту программу в архиве не прилагаю.

После регистрации и скачивания архива 7456R11.ZIP вес примерно 528кБ. Устанавливаем программку на комп, и можно редактировать готовые или создавать символы своего изготовления.

Открываем программу, выбираем «Не подключаться к стартовому набору EVKit» жмем «ОК». В архиве в конце статьи есть два файла с расширением .MCM, это DEFAULTCM и RUSTABLE, первая это штатная заводская таблица символов, а вторая таблица символов сделанная вручную, и русифицированная.

 

alt

 

 

В программе Maxim MAX7456 Evaluation Kit нажимаем на вкладку Character Memory File Builder. Появится таблица символов залитых в генератор на заводе. Нажимаем вверху слева File-> Open Character Memory from File-> и находим куда у вас разархивировался архив от статьи (предварительно его нужно куда-нибудь разархивировать) RUSTABLE.mcm. Здесь и будем рисовать свои символы.

 

alt

 

Открылся файл с русифицированной версией прошивки для МАХ7456. Выбираем ячейку, в данном случае выбрал ячейку 01h, справа в поле edit character рисуем символ, который хотим записать в МАХ, и нажимаем Save Character под окном где рисовали. Нажимаем File-> Save Character Memory to File as-> выбираем любое удобное место сохранения например рабочий стол, и сохраняем.

НАСТОЯТЕЛЬНО НЕ РЕКОМЕНДУЮ РИСОВАТЬ в ЯЧЕЙКЕ С АДРЕСОМ 00h!!!

Т.к. при сбросе вся память дисплея заполняется нулями, как сказано в даташите,  но оказывается, что не нулями, а ячейкой с адресом 00h.

Теперь на рабочем столе появился файл RUSTABLE.mcm он состоит из длинного списка бинарных байтов, это и есть байты символов которые нам нужно конвертировать в 16-ричную форму. Заходим в интернет на вот на ЭТУ страницу 

 

alt

 

Находим подпункт mcm->.c definition. Нажимаем «Выберите файл» указываем путь к нашему файлу на рабочем столе, устанавливаем точки 54 байта и формат конвертирования hex, и ставим галочку passend fur C-OSD?, и нажимаем mcm->.c. Программа сконвертирует все наши символы, и даже нарисует как каждый будет виден на экране ТВ.

alt

 

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

 

alt

 

Заменяем выделенное символа 1 на то, что у нас скопировано в буфере, подгоняем по записям ставим   db    0xбла, бла , компилируем, зашиваем в PIC18F252 и подаем питание на наше железо, секунд через 4-5 на экране монитора появятся все символы записанные в EEPROM MAX7456, и 1 символом будет наш смайлик.

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

alt

И нажимаем mcm->charmap png.

alt

У вас загрузится карта оперативной памяти EEPROM MAX7456 с нашим смайликом.

Её распечатываем и работаем.

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

Удачных свершений.

 

 

Схема нарисована в программе sPlan 7.0

Платы разведены в программе Sprint Layout 6.0

Скачать

Ссылка для скачивания доступна только авторизованным пользователям сайта !

Вопросы можно задавать на форуме

 

 

Случайные статьи....

Prev Next

Переходник USB - 1Wire на микроконтроллере PIC18F2550

08-04-2013 Alex

Переходник USB - 1Wire на микроконтроллере PIC18F2550

   Ниже представлена схема простого переходника с USB на 1-Wire, на микроконтроллере PIC18F2550. Устройство, в первую очередь, разработано для тех, кто не "дружит" с электроникой и программированием микроконтроллеров, и кому очень хочется подключить к своему ПК устройства, управляемые по интерфейсу 1-Wire,...

Простое объяснение битовых логических операций

17-01-2012 Александр Милевский

Простое объяснение битовых логических операций

Несколько раз сталкивался с необходимостью объяснить стандартные логические битовые операции применительно к командам среднего семейства Microchip. Если человек хочет научиться основам программирования мк, но не сталкивался никогда с электроникой и цифровой техникой, это тяжелый случай.  Эта статья для такой категории...

Сторожевой таймер WDT.

08-08-2011 Super User

Сторожевой таймер (WDT) есть во всех микроконтроллерах 18 серии. Задействован в  основном в тех приложениях, где требуется производить  "перезагрузку"  микроконтроллера в случае возникновения сбоев при выполнении программы. В приложениях, где задействован сторожевой таймер, необходимо с определенным интервалом времени сбрасывать таймер WDT,...

Промышленный терморегулятор. Часть 3.

30-09-2011 Sergey Roslik

Промышленный терморегулятор. Часть 3.

 1 Часть - основные технические характеристики, схема, печатная плата, прошивка.  2 Часть - подключение устройства к ОРС серверу, конфигурирование ОРС сервера.  3 Часть - выборка данных с ОРС сервера и отображение их на мнемосхеме.  У меня на предприятии используется программный комплекс «НЕВА» (http://energosoyuz.spb.ru),...


Все права принадлежат ChipMK.ru. При копировании материала ссылка обязательна. 2011-2017 © ChipMK.ru

ChipMk.ru Яндекс.Метрика
PRCY.ru