Андрей Смирнов
Время чтения: ~18 мин.
Просмотров: 2

Даташит на русском Atmega8

Что такое даташит

Даташит – это техническое описание на какой-либо радиокомпонент. Где его найти? Ну, конечно же, в интернете! Так так почти вся радиоэлектронная продукция выпускается “за бугром”, то и описание на них, соответственно, “забугорское”, а точнее, на английском языке. Те, кто хорошо дружит с разговорным английским, не факт, что сможет прочитать технические термины в даташитах.

Даташит на английском на Atmega8

Давайте попробуем пролить свет истины на основные характеристики МК ATmegа8. Для этого качаем даташит. В нашей статье мы будем рассматривать только основные сведения нашего подопечного.

Вот что мы видим на первой странице даташита:

2016-05-31_09-58-25.png

  2016-05-31_10-00-04.png

Даташит на русском  Atmega8

Запоминаем правило: в фирменном описании нет ни одного лишнего слова! (иногда информации не хватает, но это уже другой случай)

Features. Переводится как “функции”. В среде электронщиков просто “фичи”.

– High Performance, Low Power AVR® 8-Bit Microcontroller

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

Понимаем как рекламу, единственно полезное то, что данный микроконтроллер — 8 битный.

– Advanced RISC Architecture

Расширенная RISC архитектура.

RISC и CISC — технологии построения процессорных систем. Но нам это не важно, по крайней мере, пока.

– 130 Powerful Instructions – Most Single Clock Cycle Execution

130 команд, большинство из них выполняются за один цикл.

А вот это уже интереснее! Во-первых, такое большое количество команд (например, у микроконтроллеров PIC всего 35 команд) уже подразумевает ориентацию этого МК под языки высокого уровня. Во-вторых, узнаем, что одна команда выполняется за один такт генератора. Т.е., при тактовой частоте 1 МГц одна команда будет выполняться 1 микросекунду (1 мкс, одну миллионную часть секунды — 10^-6). А при 10 МГц — в десять раз быстрее, т.е., 0,1 мкс.

– 32 x 8 General Purpose Working Registers

32 восьмибитных регистра общего пользования.

Про регистры поговорим позднее, просто запомним, что большое количество регистров — весьма неплохо, ведь регистр — это ячейка памяти в самом МК. А чем больше такой памяти – тем «шустрее» работает МК!

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

– Fully Static Operation

Полностью статическая структура.

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

(Также нелишним будет напомнить о том, что потребляемая мощность большинства типов МК напрямую зависит от тактовой частоты: чем выше тактовая частота, тем больше он  потребляет)

– Up to 16 MIPS Throughput at 16 MHz

До 16 миллионов выполняемых команд при тактовой частоте 16 МГц.

За одну секунду при тактовой частоте 16 МГц может быть выполнено до 16 000 000 команд! Следовательно, одна однобайтовая команда может быть выполнена за 0,07 мкс. Весьма недурно для маленькой микросхемы.

С учетом предыдущего пункта понимаем, как работает на частотах от 0 Гц до 16 МГц.

– On-chip 2-cycle Multiplier

В данном МК имеется встроенный умножитель, который умножает числа за два такта.

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

– High Endurance Non-volatile Memory segments

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

Вспоминаем типы памяти: EEPROM и FLASH.

– 8KBytes of In-System Self-programmable Flash program memory

– 8 Кбайт встроенной в МК памяти. Память выполнена по технологии Flash. В самом МК имеется встроенный программатор.

Этот объем весьма хорош! Для обучения (да и не только) — с запасом. А наличие встроенного программатора этой памяти, позволяет загружать данные в память, используя простой внешний программатор (в простейшем случае это пять проводков, которыми микроконтроллер подключают к LPT порту компьютера).

– 256 Bytes EEPROM

В МК имеется 256 байт энергонезависимой памяти EEPROM.

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

– 1024 Bytes Internal SRAM

В МК имеется 1024 байт оперативной памяти (ОЗУ/RAM).

Также весьма приятный объем

– Write/Erase cyles: 10,000 Flash/100,000 EEPROM

Память Flash выдерживает 10 000 циклов записи/стирания, а память EEPROM — до 100 000

Проще говоря, программу в МК можно изменять до 10 000 раз, а свои данные в 10 раз больше.

– Data retention: 20 years at 85°C/100 years at 25°C

Сохранность данных в памяти МК — до 20 лет при температуре хранения 85°C, и 100 лет — при температуре 20°C.

Если ваши внуки и правнуки включат вашу «мигалку» или музыкальную шкатулку, то они смогут насладиться их работой ))

– Optional Boot Code Section with Independent Lock Bits

– Programming Lock for Software Security

МК имеет несколько областей памяти (не уточняем каких), которые можно защитить от прочтения установкой специальных бит защиты.

Ну, тут всё понятно: свои труды вы можете защитить от вычитывания программы из памяти МК.

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

– Two 8-bit Timer/Counters

– One 16-bit Timer/Counter

В МК имеется два таймера/счетчика: 8 и 16 бит.

– Three PWM Channels

Три канала ШИМ

– 8-channel ADC in TQFP and QFN/MLF package

Eight Channels 10-bit Accuracy

– 6-channel ADC in PDIP package

Six Channels 10-bit Accuracy

В составе МК есть несколько каналов АЦП: 6 – для корпуса PDIP и 8 – для корпуса QFN/MLF. Разрядность АЦП — 10 бит.

– Byte-oriented Two-wire Serial Interface

– Programmable Serial USART

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

Master/Slave SPI Serial Interface

Реализован SPI интерфейс связи, режимы Мастер/Подчиненный.

– Programmable Watchdog Timer with Separate On-chip Oscillator

Сторожевой таймер с собственным автономным генератором.

– On-chip Analog Comparator

Аналоговый компаратор.

– Power-on Reset and Programmable Brown-out Detection

Реализованы режимы контроля напряжения питания и защита работы МК при плохом питании (гарантирует увеличение надёжности работы всей системы).

– Internal Calibrated RC Oscillator

Встроенный калиброванный RC-генератор (можно запустить МК без внешних элементов).

– External and Internal Interrupt Sources

Реализовано несколько типов внешних и внутренних прерываний.

– Five Sleep Modes

Пять режимов «сна» (уменьшение энергопотребления МК за счет отключения некоторых внутренних узлов или специальных методов замедления их работы)

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

– 28-pin PDIP, 32-lead TQFP, 28-pad QFN/MLF and 32-pad QFN/MLF

Указаны типы корпусов, в которых выпускается данный микроконтроллер. Видим «28 DIP» — это хорошо! Не надо покупать специализированные дорогостоящие панели и мучиться с тоненькими и часто расположенными выводами на корпусе МК.

Temperature Range:

 -40°C to 85°C

Рабочая температура: -40°C … +85°C

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

(Был у меня горький опыт, когда в устройстве был применен именно такой «теплолюбивый» микроконтроллер. А устройство поместили на улицу… И каждую зиму «благодарные» пользователи моего устройства «хвалили» меня за «замерзание» микроконтроллера, которое проявлялось в виде полного его зависания)

Напряжение питания и тактовая частота

– 2.7 – 5.5V for ATmega8L

– 4.5 – 5.5V for ATmega8

Имеется две модификации данного МК: одна работоспособна при широком диапазоне питающих напряжение, вторая — в узком.

ATmega8L: 0 – 8 MHz @ 2.7 – 5.5V

ATmega8: 0 – 16 MHz @ 4.5 – 5.5V

Максимальная тактовая частота:

– Atmega8L: 0 – 8 МГц при напряжении питания 2,7 – 5,5 вольт

– Atmega8: 0 – 16 МГц при напряжении питания 4,5 – 5,5 вольт.

И что мы видим? А то, что модификация МК, работоспособная в широком диапазоне питающих напряжений, не может быть тактируема частотами выше 8 МГц. Следовательно, и ее вычислительные возможности будут ниже.

Power Consumption at 4 Mhz, 3V, 25°C

– Active: 3.6 mA

– Idle Mode: 1.0 mA

– Power-down Mode: 0.5 µA

Потребляемая мощность:

– при работе на частоте 4 МГц и напряжении питания 3 вольта потребляемый ток: 3,6 миллиампер,

– в различных режимах энергосбережения потребляемый ток: от 1 миллиампер до 0,5 микроампера

Распиновка Atmega8

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

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

Внимание!

Обратите внимание на такой факт: микросхема микроконтроллера может иметь (и имеет в данной модели) несколько выводов для подключения источника питания. То есть имеется несколько выводов для подключения «земли» — «общего провода», и несколько выводов для подачи положительного напряжения.

2016-05-31_10-18-57.png

Изготовители микроконтроллеров рекомендуют подключать соответствующие выводы вместе, т.е., минус подавать на все выводы, помеченные как Gnd (Ground — Земля), плюс — на все выводы помеченные как Vcc.

При этом через одинаковые выводы МК не должны протекать токи, так как внутри корпуса МК они соединены тонкими проводниками! То есть при подключении нагрузки эти выводы не должны рассматриваться как «перемычки».

Блочная диаграмма

Листаем описание далее, видим главу «Overview» (Обзор).

В ней имеется раздел «Block Diagram» (Устройство). На рисунке показаны устройства, входящие в состав данного микроконтроллера.

Генератор тактовой частоты

Но самым важным для нас в настоящее время является блок «Oscillator Circuits/Clock Generation» (Схема генератора/Генератор тактовой частоты).

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

Да и не лишним будет заранее просчитать: успеет ли МК выполнить тот или иной фрагмент программы за отведенное для этого время.

В даташите ищем соответствующую главу: «System Clock and Clock Options» (Тактовый генератор и его параметры). В ней видим раздел «Clock Sources» (Источники тактового сигнала), в котором имеется таблица с перечнем видов тактовых сигналов. В этом разделе указано, что данный МК имеет встроенный тактовый RC-генератор. В разделе «Default Clock Source» имеется указание о том, что МК продается уже настроенным для использования встроенного RC-генератора. При этом тактовая частота МК — 1 МГц.

Из раздела «Calibrated Internal RC Oscillator» (Калиброванный RC-генератор) узнаем, что встроенный RC-генератор имеет температурный дрейф в пределах 7,3 — 8,1 МГц. Может возникнуть вопрос: если частота встроенного тактового генератора 7,3 — 8,1 МГц, то как была получена частота 1 МГц? Дело в том, что тактовый сигнал попадает в схемы микроконтроллера через программируемый делитель частоты (Об это рассказано в разделе «System Clock Prescaler»).

В данном микроконтроллере он имеет несколько коэффициентов деления: 1, 2, 4 и 8. При выборе первого мы получим частоту самого тактового генератора, при включении последнего — в 8 раз меньше, т.е., 8/8=1 МГц. С учетом вышесказанного получаем, что тактовая частота данного МК при включенном делителе с коэффициентом 8 будет в пределах от 7,3/8 = 0,9125 МГц (9125 КГц) до 8,1/8 = 1,0125 МГц.

Обратите внимание на один ну очень важный факт: стабильность частоты дана при температуре МК 25 градусов по шкале Цельсия. Вспомним, что внутренний генератор выполнен по RC схеме. А емкость конденсатора очень зависит от температуры!

Конденсаторы по питанию

Перед тем, как подать на микроконтроллер питающее напряжение, выполним правило, которое обязательно для всех цифровых микросхем: в непосредственной близости от выводов питания микросхемы должен быть керамический конденсатор емкостью 0,06 — 0,22 мкф. Обычно устанавливают конденсатор 0,1 мкф. Его часто называют блокировочным конденсатором.

В схему необходимо установить и электролитический конденсатор емкостью 4-10 мкф. Он также является блокировочным фильтром, но на менее высоких частотах. Такой конденсатор можно устанавливать один для нескольких микросхем. Обычно на 2-3 корпуса микросхем.

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

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

Конденсатор для постоянного тока является изолятором. Но при установке конденсатора в цепи с непостоянным током он делается сопротивлением. Чем выше частота, тем меньшее сопротивление оказывает конденсатор. Следовательно, блокировочный конденсатор с малой емкостью пропускает через себя (шунтирует) высокочастотные сигналы (десятки и сотни Герц), а конденсатор с бОльшей емкостью — низкочастотные. Об этом я писал еще в статье Конденсатор в цепи постоянного и переменного тока

Выводы

микроконтроллер AVR ATmega-8 при поставке с завода работает на тактовой частоте 0,91—1,1 МГц;

напряжение питания должно быть в пределах 4,5 — 5,5 Вольт. Мы будем использовать микросхемы с питающим напряжением 5 Вольт, поэтому и МК будет питаться этим же напряжением. (Хотя работоспособность сохранится при напряжении питания 2,7 Вольт для обычных, не низковольтных моделей МК)

  • Цена: $8,93 за 10шт.

Здравствуйте, MySkuвчане! Герой нашего обзора — микроконтроллер Atmega8A-16PU. Я расскажу вам о программировании данного мк в интегрированной среде разработки CodeVisionAvr, помигаем светодиодом, рассмотрим плюсы и минусы работы в данной среде. Возможно, в дальнейшем это послужит для вас альтернативой уже ставшей «народной» Arduino. Если заинтересовались, гоу под cut. Преамбула. Так уж сложилось, что свое знакомство с мк я начал с Arduino. Мигал светодиодом, подключал различные датчики и шилды, делал различные проекты. Все работало, меня устраивало, однако хотелось чего-то большего. Подвернулся мне один проект, где участвует Atmega8A, под которую нужно самостоятельно написать прошивку. Именно он подтолкнул меня к изучению процесса программирования «голого» мк. Итак, перед нами микроконтроллер фирмы Atmel, семейства AVR Atmega8A.Технические характеристики: Распиновка: Тут находится datasheet Теперь для работы и программирования нужно подключить его к программатору по схеме: К сожалению, я как сапожник — без сапог, сейчас под руками нет программатора, поэтому я буду использовать Arduino UNO для загрузки в мк готовой прошивки и настройки фьюзов. Достаточно лишь загрузить скетч «Arduinoisp» из папки примеров Arduino IDE и подключить по схеме: Однако, у данного решения есть существенный недостаток, о котором расскажу чуть позже. Перед тем, как приступить к написанию программы в CodeVisionAvr (далее CvAvr), нам нужно определиться, на какой частоте будет работать наш мк. По умолчанию, с завода наш герой работает от внутреннего rc-генератора на частоте 1Мгц (с возможностью перенастройки на 2, 4, и 8Мгц). Поскольку внутренний rc-генератор калибруют на заводе при определенных условиях (точное напряжение, температура), то точность его работы в «полевых» условиях может отличаться от 3% до 10%. Для задач, где не нужна высокая точность тактирования, этим можно пренебречь, в остальных случаях лучше использовать внешний кварц. В своем проекте я использовал внешний кварц на частоту 8 Мгц. Теперь нам надо «объяснить» мк, что нужно работать от внешнего кварца. Делается это при помощи изменения фьюзов. Если пояснить «на пальцах», то это что то вроде БИОСа, как на материнской плате, где вы указываете режимы её работы, аналогично мы сообщаем мк, в каких режимах, помимо частоты, он должен работать. Вся информация будет храниться в энергонезависимой памяти. О прошивке фьюзов я расскажу под спойлером, те, кто умеет это делать самостоятельно, могут листать дальше.Дополнительная информацияКак же прописать эти самые фьюзы?! Для этого я использовал программу AvrDude, она бесплатна и легко найдется в интернете. Для того, чтобы правильно выставить фьюзы в соответствии с нужной частотой, смотрим datasheet, а можно и воспользоваться простым он-лайн калькулятором. Выставляем параметры, как на картинке. Тут все просто: Clock Source — задаем частоту (External Crystal 3 — 16 Mhz) от внешнего кварца. Start-up Time — скорость старта мк после снятия RESET или подачи питания (16K CK + 4.1ms fast). Ставим галку: Ext. Clock/RC Osc./Low-freq. Crystal: enable internal Capacitors (36 pF) Internal R/C Osc.: leave unchecked! External Crystal: enable full swing (neccessary for >8 MHz). Таким образом, мы получили Low Fuse 0xEF и High Fuse 0xC9. Отлично, полдела сделали. Теперь подключаем мк к Arduino UNO, а саму Arduino к компьютеру соответственно. Запускаем командную строку, переходим в папку с AvrDude. Далее вводим строку: avrdude -C avrdude.conf -c avrisp -P COM13 -b 19200 -p m8 -U lfuse:w:0xef:m -U hfuse:w:0xc9:m Вот как это выглядит на картинке: Разберем строку, которую ввели: avrisp — это тип нашего ардуиноподобного программатора COM13 — номер com порта, которым определяется наша Arduino в системе (в вашем случае его надо посмотреть в диспетчере устройств) 19200 — скорость com порта, оставляем как есть m8 — указываем, что наш мк — Atmega8 -U lfuse:w:0xef:m -U hfuse:w:0xc9:m — тут указаны наши Low Fuse 0xEF и High Fuse 0xC9 Будьте ВНИМАТЕЛЬНЫ !!, неправильно указанные Fuse могут привести к окирпичиванию мк (танцы с бубном по восстановлению нам не нужны). Нажимаем «Ввод» и на выходе получаем результат, как на картинке: Если не появилось никаких ошибок в процессе, то работа выполнена, наш мк теперь будет работать от внешнего кварца. Очень подробно о фьюзах можно прочитать тут и тут, а так же используя поиск в google. Теперь мы готовы приступить к программированию. Для себя я выбрал среду разработки CvAvr. Язык программирования будет отличается от «ардуиновского», в CvAvr он Си-подобный. Напишем наш первый Blink. После установки и запуска среды воспользуемся мастером создания проектов. Выбираем «File» — «New» — «Project». На вопрос, будем ли мы использовать мастер, отвечаем утвердительно. Target AVR Chip Type указываем AT90, ATtity, ATmega. Так выглядит мастер проектов: На вкладке Chip выбираем ATmega8A, Clock 8.000000 Mhz. Переходим во вкладку Ports. Наш светодиод будет подключен к 14 выводу микроконтроллера, согласно распиновке — PB0. На вкладке выбираем Port B, Bit 0 переключаем с IN на OUT, т.е. переводим режим работы 14 ножки нашего мк на выход. На этом работа мастера окончена. Выбираем «Program» — «Generate, Save and Exit». Сохраняем наш проект, например, под именем Blink.Получим такую вот портянку Тут ничего страшного нет, в проекте указаны режимы работы портов, таймеров, прерываний, USART, Analog Comparator, ADC, SPI и подключенных библиотек. Словом, все те параметры, которые мы указывали в мастере, все, кроме портов и чипа, у нас настроено по умолчанию. Основной цикл программы будем писать в while (1) { текст программы }. Т.к. мы работаем с PB0 (14 ножка), в цикле программы напишем: while (1) { PORTB.0=1; delay_ms (1000); PORTB.0=0; delay_ms (1000); } Тут мы устанавливаем высокий уровень на PB0, ждем 1 секунду и устанавливаем низкий уровень, затем цикл повторяется. Еще не забываем подключить библиотеку в начале проекта #include . Наша программа готова!!! Как видите, всё очень просто. Теперь выбираем «Project» — «Build All». Если ошибок допущено не было, то увидим отчет мастера: Размер нашей программы составил 198 bytes, и занял 2.4% памяти мк. Далее собираем схему: Теперь переходим в папку с нашим проектом, заходим в папку «Debug», затем «Exe», там находится файл с расширением hex. В моем случае это blink.hex. Остался последний шаг. Копируем этот файл в папку с AvrDude. Снова запускаем командную строку, переходим в нашу папку. Вводим строку avrdude -C avrdude.conf -c avrisp -P COM13 -b 19200 -p m8 -U flash:w:blink.hex Так это выглядит на картинке: Если все ввели правильно, жмем «Ввод» Поздравляю! Работа выполнена, светодиод должен вам радостно мигать 🙂 Заключение. В заключении хочу сказать о недостатке ардуиноподобного программатора, CvAvr его просто не поддерживает. Имея на руках, например, AVRISP mkII, выполнить прошивку фьюзов и загрузку программы можно непосредственно из CodeVisionAvr. Кстати, использовать графический интерфейс AvrDude доморощенный программатор то же отказался и работал только из командной строки. С CodeVisionAvr я разобрался довольно быстро, в интернете полно текстовых и видео уроков. За пару недель освоил работу аппаратного ШИМ, прерываний, таймеров, работу с кнопками и подключение графического дисплея. Конкретно мне надо было сделать часть своего проекта: на Atmega8 организовать аппаратный 16-битный ШИМ, подключить 2 кнопки для его управления, а также выводить режимы его работы на графический дисплей, что с легкостью я и сделал 🙂 Вот пара фото:Дополнительная информация

Итоги в сравнении с Arduino: + Разобраться в CvArv не сложно т.к. есть мастер создания проектов; + Наличие подключаемых библиотек, их достаточно много; + Быстрая компиляция; + Возможность симуляции проекта в Proteus, а так же отладки его силами встроенного debugger`а; + Размер программы в разы меньше. Стандартный Blink у нас занял 198 Байт, аналогичный скетч в Arduino IDE 1084 Байт + 2 Кб загрузчик; + Возможность реализовать режимы, которые нельзя сделать на Arduino. Например 16-битный ШИМ (вообще, на Arduino можно, но только с «костылями»); + Возможность применять для своих проектов мк типа ATtiny, ATmega там, где Arduino будет избыточен; — Все же новичку начинать осваивать мк лучше с Arduino; — Язык программирования отличается от ардуиновского processing`a; — Библиотек к Arduino все же больше; — CodeVisionAvr является платной программой, есть бесплатные версии с ограничениями; Программируя «голый» мк в CodeVisionAvr, я получил огромный опыт работы в свою копилку. Изучение таймеров, регистров, режимов работы, архитектуры, чтение datasheet увеличит вашу квалификацию, расширит кругозор и откроет новые аспекты работы с микроконтроллерами. В качестве бонуса прилагаю пару фото, когда разбирался с графическим жк-дисплеем, немного поигрался.Бонус
P.s. Много еще о чем хотел написать, но это уже получится не обзор, а огромная статья. Готов ответить на вопросы в рамках своей компетенции, в привате или комментариях. Очень много уроков по AVR можно подсмотреть тут. upd 25.01.2016 Хочу привести ссылку на Geektimes, где рассматривается работа Arduino против прямого программирования «голого мк». Используемые источники:

  • https://www.ruselectronic.com/chitaem-datashit-na-primere-atmega8/
  • https://mysku.ru/blog/ebay/36603.html

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации