|
АЦП в ATMega8: 8 бит или 10 бит?, Загадка в АЦП ATMega8 (ADC5) |
|
|
|
Mar 18 2007, 19:35
|
Участник

Группа: Участник
Сообщений: 35
Регистрация: 26-02-07
Пользователь №: 25 691

|
При использовании АЦП в микроконтроллере ATMega8 была замечена одна интересная особенность. По официальным справочным данным в корпусе DIP микроконтроллер имеет два канала АЦП с разрешением 8 бит (ADC4 и ADC5) и четыре канала с разрешением 10 бит (ADC0...ADC3). Использовался канал ADC5. При считываении данных из регистра ADC в выбранном канале значение менялось от 0 до 1023(!!!), что эквивалентно разрешению 10 бит. Возник вопрос: как это обьяснить?
|
|
|
|
|
Mar 18 2007, 20:52
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(Sminder @ Mar 18 2007, 19:35)  При использовании АЦП в микроконтроллере ATMega8 была замечена одна интересная особенность. По официальным справочным данным в корпусе DIP микроконтроллер имеет два канала АЦП с разрешением 8 бит (ADC4 и ADC5) и четыре канала с разрешением 10 бит (ADC0...ADC3). Использовался канал ADC5. При считываении данных из регистра ADC в выбранном канале значение менялось от 0 до 1023(!!!), что эквивалентно разрешению 10 бит. Возник вопрос: как это обьяснить? Чтобы считывать только 8бит из ADC установите бит ADLAR в ADMUX и читайте только регистр ADCH, получите 8бит и время на считывание сэкономите
|
|
|
|
|
Mar 18 2007, 22:21
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(Sminder @ Mar 18 2007, 16:35)  При использовании АЦП в микроконтроллере ATMega8 была замечена одна интересная особенность. По официальным справочным данным в корпусе DIP микроконтроллер имеет два канала АЦП с разрешением 8 бит (ADC4 и ADC5) и четыре канала с разрешением 10 бит (ADC0...ADC3). Использовался канал ADC5. При считываении данных из регистра ADC в выбранном канале значение менялось от 0 до 1023(!!!), что эквивалентно разрешению 10 бит. Возник вопрос: как это обьяснить? Такое было в описаниях до версии М включительно, однако, начиная с версии N, все каналы имеют одинаковую разрядность и одинаковую абсолютную точность НЕЗАВИСИМО от типа корпуса. 1.75 lsb при 200 кГц клока и 3 lsb при 1000 кГц клока ацп. Работают люди(:-). Объяснений можно дать много, но скорее всего у вас канал висел в воздухе, и вы оцифровывали наводку.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Mar 19 2007, 23:28
|
Участник

Группа: Участник
Сообщений: 35
Регистрация: 26-02-07
Пользователь №: 25 691

|
Цитата(=GM= @ Mar 18 2007, 21:21)  Объяснений можно дать много, но скорее всего у вас канал висел в воздухе, и вы оцифровывали наводку. Я, наверное, не совсем понятно обрисовал ситуацию, но вывод в воздухе конечно же не висел - на него подавалось калиброванное напряжение, что и контролировалось с помощью АЦП. Цитата Очень просто - младшим двум битам верить нельзя. Т.е. их достоверность Атмел не гарантирует, в них скорее всего шум. Вероятно, так оно и есть, измерения особой точностью не блещут, но я правда не ставил режим шумопонижения и фильтры в цепях опорного напряжения. Цитата Вы не совсем точно перевели даташит. Разрешение всех каналов составляет 10 бит. Но в DIP корпусе точность не гарантируется более 8 бит Я являюсь обладателем справочника А.В. Евстифеева "Микроконтроллеры AVR семейств Tiny и Mega фирмы Atmel", где в принципе и написано, цитирую: "... Кроме того, во всех моделях ATMega8x два канала (ADC4 и ADC5) являются 8-разрядными." Даташит на английском я тоже имею, но и в нем ничего путевого не нашел.
|
|
|
|
|
Mar 20 2007, 22:22
|
Участник

Группа: Участник
Сообщений: 35
Регистрация: 26-02-07
Пользователь №: 25 691

|
Извиняюсь, я был неправ. Действительно, просмотрев версию мануала ревизии Р (раньше была Н), я убедился, что все каналы АЦП 10-разрядные.
|
|
|
|
|
Mar 21 2007, 01:09
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(Sminder @ Mar 20 2007, 19:22)  Извиняюсь, я был неправ. Действительно, просмотрев версию мануала ревизии Р (раньше была Н), я убедился, что все каналы АЦП 10-разрядные. Да уже версия Q есть, октябрь 2006, полгода прошло, что ж вы всё старые качаете(:-).
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Apr 23 2007, 12:34
|

Местный
  
Группа: Свой
Сообщений: 226
Регистрация: 2-06-06
Пользователь №: 17 720

|
Цитата во всех моделях ATMega8x два канала (ADC4 и ADC5) являются 8-разрядными там наверно имеется ввиду не буквальная 8-разрядность, а точность измерения по этим каналам (измерение проходит в нормальном 10-битном режиме, но младшие 2 разряда должны прыгать), возможно связано это с совмещением этих выводов с TWI. Хотя я не заметил существенной разницы между этими и другими каналами АЦП, наверно в более новых кристаллах переразвели аналоговую часть.
|
|
|
|
|
Apr 23 2007, 15:59
|

Местный
  
Группа: Свой
Сообщений: 208
Регистрация: 6-07-04
Из: Полтава
Пользователь №: 279

|
Цитата(defunct @ Apr 23 2007, 13:51)  Если под "путевым" имеется в виду та чушь из справочника А.В. Евстифеева, то вы ее там не найдете потому что в даташите ее нет...
В даташите есть достоверная инфа про конкретный чип, его просто надо читать, а не картинки рассматривать... Та ну, не стоит так набрасываться, и на Евстифеева в том числе. Было такое дело, 6+2 или 4+2 каналов, два из которых позиционировались как 8-битной точности. Именно в дейташите. Правда, древнем.  Могу ревизию указать, поскольку и антиквариат храню  Rev. 2486I–AVR–12/02. А что Евсифеев, он тоже ведь мог оным дейташитом пользоваться, просто на момент написания книги более новых не существовало. Мало того, в старом дейташите есть упоминание об одном хитром бите регистра SFIOR. Это - Bit 4 – ADHSM: ADC High Speed Mode. Вот что о нем написано: Writing this bit to one enables the ADC High Speed mode. This mode enables higher conversion rate at the expense of higher power consumption. В более поздних ревизиях дейташитов это упоминание было изъято. Хотя бит, как ни странно, работает.  Вот такие пироги.
|
|
|
|
|
Apr 23 2007, 16:09
|

Местный
  
Группа: Свой
Сообщений: 208
Регистрация: 6-07-04
Из: Полтава
Пользователь №: 279

|
Цитата(defunct @ Apr 23 2007, 16:04)  Извиняюсь погорячился.. Понедельник - день тяжелый ;> В понедельник бывает.  Цитата(defunct @ Apr 23 2007, 16:04)  А ДШ свежий желательно иметь всегда, особливо когда возникают спорные вопросы. Тут - без каких-либо возражений.
|
|
|
|
|
Apr 23 2007, 16:30
|
Участник

Группа: Свой
Сообщений: 71
Регистрация: 7-07-06
Из: Новосибирск
Пользователь №: 18 652

|
немного не по теме, но сталкивался с ситуацией с тексасовскими ЦАПами. Как это принято имеется семейство с одинаковой цоколевкой и разрядностью 8/10/12 в зависимости от типа (и цены в геометрической прогрессии естественно). Брали 10 -разрядный, а оказалось что у него все 12 разрядов работают. Для себя объяснил что так делается по маркетинговым соображениям. Может и здесь Atmel пытался покончить с архаичным dip'ом. Явно кристаллы одинаковые идут в разные корпуса. В том, что разрядность может в 4 раза пострадать из-за большей длины от кристалла до пина сильно сомневаюсь.
|
|
|
|
|
Apr 25 2007, 11:19
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(Anjey_N @ Apr 24 2007, 19:50)  Я новичок, поэтому наверное сейчас задам глупый вопрос! Пишу прогу для вольтметра, использую Мегу16 со встроенным АЦП. Делаю 128 выборок, суммирую и затем делю на 128. Получаю результат. Мне сказали, что теперь нужно применить вычисление скользящего среднего. А как это сделать, я не знаю! Может, кто-нибудь подскажет или даст ссылку на это чудо!  Делаете кольцевой массив на количество выборок и переменную для суммы. С каждой новой выборкой вычитаете из суммы самое старое значение из массива, пишете на его место значение выборки, прибавляете к сумме значение выборки и делите сумму на количество элементов в массиве (константа). Как проинициализировать массив решайте сами.
|
|
|
|
|
Apr 26 2007, 00:52
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(Anjey_N @ Apr 24 2007, 18:50)  Мне сказали, что теперь нужно применить вычисление скользящего среднего. А как это сделать, я не знаю! Пример скользящего усреднения по 16-ти точкам (без использования массивов) Код int UpdateAverage( int CurrVal ) { static int Sum = 0; int tmp = (Sum + (16 >> 1)) >> 4; // среднее = (Sum + n/2) / n, где n = 16 Sum += CurrVal - tmp; return tmp; } <Усредненное значение АЦП> = UpdateAverage( <Текущее значение АЦП> );
|
|
|
|
|
Apr 26 2007, 06:56
|

Mute Beholder
  
Группа: Свой
Сообщений: 260
Регистрация: 4-04-07
Из: Третья планета от Солнца
Пользователь №: 26 754

|
Цитата(defunct @ Apr 26 2007, 03:52)  Пример скользящего усреднения по 16-ти точкам (без использования массивов) Код int UpdateAverage( int CurrVal ) { static int Sum = 0; int tmp = (Sum + (16 >> 1)) >> 4; // среднее = (Sum + n/2) / n, где n = 16 Sum += CurrVal - tmp; return tmp; } <Усредненное значение АЦП> = UpdateAverage( <Текущее значение АЦП> ); нерабочий примерчик-то. вызвал 16 раз функцию с аргументом CurrVal = 10, в результате получил 6. через 20 итераций получил 7. и вообще странный какой-то алгоритм - возвращать результат целочисленного деления (накопленной суммы + константа) на константу. PS я всегда пользуюсь методом с кольцевым массивом, как описал IgorKossak
--------------------
Common sense is not so common.
|
|
|
|
|
Apr 26 2007, 13:07
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(Snaky @ Apr 26 2007, 05:56)  нерабочий примерчик-то. вызвал 16 раз функцию с аргументом CurrVal = 10, в результате получил 6. через 20 итераций получил 7.  Пример рабочий. Вы дальше повызывайте. Хотите чтоб быстрее получался рез-тат усредняйте по 8-ми или по 4-м точкам. Цитата и вообще странный какой-то алгоритм - возвращать результат целочисленного деления (накопленной суммы + константа) Почитайте какую-нить книжку по усреднению прежде чем выступать. Константа эта для устранения абсолютной погрешности в 0.5LSB при накоплении суммы. Цитата PS я всегда пользуюсь методом с кольцевым массивом У вас видать памяти в МК всегда много..
|
|
|
|
|
Apr 26 2007, 13:08
|
Участник

Группа: Участник
Сообщений: 21
Регистрация: 25-04-07
Пользователь №: 27 294

|
В общем виде фильтрация выглядит примерно так (для чайников): Код // Размер массива - должен быть степенью двойки!! #define ARRAY_SIZE 16
// Функция берет текущее значение и возвращает отфильтрованное int GetMovingAverage(int current_value) { static int filter_array[ARRAY_SIZE]; static unsigned int index = 0; static int sum = 0;
// Вычитаем удаляемое значение из суммы и прибавляем текущее sum += current_value - filter_array[index]; // Вставляем текущее значение в массив filter_array[index] = current_value; // Изменяем индекс. Не забывать, что ARRAY_SIZE должен быть степенью двойки!! index = (index + 1) & (ARRAY_SIZE - 1); // Возвращаем отфильтрованное значение. return sum / ARRAY_SIZE; } Реальные типы переменных должны быть согласованы с размерностью данных. Данные считаются недостоверными, пока функция не будет вызвана ARRAY_SIZE раз.
|
|
|
|
|
Apr 26 2007, 17:21
|
Участник

Группа: Участник
Сообщений: 21
Регистрация: 25-04-07
Пользователь №: 27 294

|
VladimirYU А как это выражается формулами?
|
|
|
|
|
Apr 26 2007, 21:35
|

Частый гость
 
Группа: Участник
Сообщений: 80
Регистрация: 12-01-07
Из: Энергодар Украина
Пользователь №: 24 374

|
Цитата(Lepeksiy @ Apr 26 2007, 13:08)  В общем виде фильтрация выглядит примерно так (для чайников): Код // Размер массива - должен быть степенью двойки!! #define ARRAY_SIZE 16
// Функция берет текущее значение и возвращает отфильтрованное int GetMovingAverage(int current_value) { static int filter_array[ARRAY_SIZE]; static unsigned int index = 0; static int sum = 0;
// Вычитаем удаляемое значение из суммы и прибавляем текущее sum += current_value - filter_array[index]; // Вставляем текущее значение в массив filter_array[index] = current_value; // Изменяем индекс. Не забывать, что ARRAY_SIZE должен быть степенью двойки!! index = (index + 1) & (ARRAY_SIZE - 1); // Возвращаем отфильтрованное значение. return sum / ARRAY_SIZE; } Реальные типы переменных должны быть согласованы с размерностью данных. Данные считаются недостоверными, пока функция не будет вызвана ARRAY_SIZE раз. Спасибо, буду разбираться и учиться!
|
|
|
|
|
Apr 26 2007, 23:17
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(defunct @ Apr 26 2007, 12:07)  Пример рабочий. Вы дальше повызывайте. Хотите чтоб быстрее получался рез-тат усредняйте по 8-ми или по 4-м точкам. Фильтр неплохой, сам пользуюсь :-) Но это, IMHO, не скользящее среднее. Реакция скользящего среднего на единичный скачок - прямая линия с выходом на уровень, т.е. если у нас было "много" нулей и вдруг пошло 32, то на 16-ом значении (при скользящем усреднении окном в 16 отсчётов) на выходе уже будет 32. А этот "экспоненциальный" фильтр имеет поведение как у RC-цепочки.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Apr 27 2007, 01:39
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
SnakyРади интереса попробуйте вот это (по 4м точкам): Код int UpdateAverage( int CurrVal ) { static int Sum = 0; int tmp = (Sum + 2) >> 2; Sum += CurrVal - tmp; return tmp; } за 12 итераций будет вам 10. ;> А алгоритм прост до ужаса, упрощенно: среднее = Sum / кол-во выборок по который усредняем. Sum = Sum + Текущее значение - среднее. Цитата(ReAl @ Apr 26 2007, 22:17)  Но это, IMHO, не скользящее среднее. ... А этот "экспоненциальный" фильтр имеет поведение как у RC-цепочки. Согласен
|
|
|
|
|
Apr 27 2007, 05:30
|

Mute Beholder
  
Группа: Свой
Сообщений: 260
Регистрация: 4-04-07
Из: Третья планета от Солнца
Пользователь №: 26 754

|
Цитата(defunct @ Apr 26 2007, 16:07)  Пример рабочий. Вы дальше повызывайте. Хотите чтоб быстрее получался рез-тат усредняйте по 8-ми или по 4-м точкам. Почитайте какую-нить книжку по усреднению прежде чем выступать. Константа эта для устранения абсолютной погрешности в 0.5LSB при накоплении суммы. У вас видать памяти в МК всегда много.. Тогда называйте вещи своими именами сразу. А то человек спросил про скользящее среднее, а вы ему совсем другое под этим названием подсовываете. Метод скользящего среднего - это то,что описал IgorKossak и Lepeksiy. Иначе захочется кому-нибудь сэкономить на памяти под массив, и будет потом долго удивляться, что результат поменялся. PS Да, памяти у меня в МК всегда много - не жалуюсь.
--------------------
Common sense is not so common.
|
|
|
|
|
Apr 27 2007, 18:49
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(Snaky @ Apr 27 2007, 04:30)  Иначе захочется кому-нибудь сэкономить на памяти под массив, и будет потом долго удивляться, что результат поменялся. Да, реакция на выбросы у них отличается. Кстати, а в чём вообще смысл скользящего среднего? Фильтрует он не лучше, чем "экспоненциальный", памяти жрёт. Раз уж есть массив - так сделать бы фильтр с "более нормальным" откликом, чем прямоугольник. Да, счёту больше, ну так а жалко счёту - вон он, экспоненциальный, заодно и памяти меньше :-)
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Apr 27 2007, 22:05
|

Частый гость
 
Группа: Участник
Сообщений: 80
Регистрация: 12-01-07
Из: Энергодар Украина
Пользователь №: 24 374

|
Спасибо всем! Благодаря вашим советам мне удалось запустить АЦП. Только врёт он немножко. Эталон --- АЦП 96 мВ --- 89 мВ 207 мВ --- 201 мВ 500 мВ --- 496 мВ 1 В --- 1 В 1.49 мВ --- 1.492 мВ 2 В --- 2.011 В 2.52 В --- 2.532 В Как это исправить, подскажите!
Сообщение отредактировал Anjey_N - Apr 27 2007, 22:06
|
|
|
|
|
Apr 28 2007, 02:31
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(ReAl @ Apr 27 2007, 19:49)  Да, реакция на выбросы у них отличается. Кстати, а в чём вообще смысл скользящего среднего? Фильтрует он не лучше, чем "экспоненциальный", памяти жрёт. Раз уж есть массив - так сделать бы фильтр с "более нормальным" откликом, чем прямоугольник. Да, счёту больше, ну так а жалко счёту - вон он, экспоненциальный, заодно и памяти меньше :-) Разница между скользящим средним и "экспоненциальным" заключается в том что "экспоненциальный" дает сдвиг фазы сигнала до 1/2 частоты сигнала То есть если сигнал "постоянный" то разницы нет никакой, а вот если изменяющийся, то тогда в каждом конкретном случае нужно рассчитывать в какой момент времени данные уже устаканились и устраивает ли нас такой сдвиг фазы
|
|
|
|
|
Apr 28 2007, 05:59
|

Mute Beholder
  
Группа: Свой
Сообщений: 260
Регистрация: 4-04-07
Из: Третья планета от Солнца
Пользователь №: 26 754

|
Цитата(ReAl @ Apr 27 2007, 21:49)  Да, реакция на выбросы у них отличается. Кстати, а в чём вообще смысл скользящего среднего? Фильтрует он не лучше, чем "экспоненциальный", памяти жрёт. Раз уж есть массив - так сделать бы фильтр с "более нормальным" откликом, чем прямоугольник. Да, счёту больше, ну так а жалко счёту - вон он, экспоненциальный, заодно и памяти меньше :-) Оба фильтра по сути цифровая реализация ФНЧ. Просто фильтр скользящего среднего с массивом - это КИХ фильтр, экспоненциальный - БИХ. В моих задачах нужна конечная по времени реакция на отклик - я иду на затраты памяти. Олссон/Пиани интерпретируют экспоненциальный фильтр как авторегрессионный фильтр скользящего среднего первого порядка (признаю, тут можно согласиться с defunct). Подробнее - см. аттач (имхо лучше не объяснишь). PS Что значит "с более нормальным откликом" - я не понял
Прикрепленные файлы
filtr.zip ( 495.18 килобайт )
Кол-во скачиваний: 85
--------------------
Common sense is not so common.
|
|
|
|
|
Apr 28 2007, 08:04
|
Местный
  
Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782

|
Цитата(Lepeksiy @ Apr 26 2007, 18:21)  VladimirYU А как это выражается формулами? Все очень просто, привожу не код, а алгоритм: Исходно имеем Summator - переменная двойной длины, Current - результат текущих измерений (данные с прибора, АЦП ...) Previos - предыдущий фильтрованный результат Далее error = Current - Previos Summator = Summator +error Previos = Summator>>N N определяет степень фильтрации ( количество результатов по которым идет усреднение). Ньюансы кода, как понимаете, зависят от формы предсавления результатов (разрядность, тип и т.д.) А математика за этим следующая 1/(TS+1) представить можно как интегратор 1/TS охваченный единичной отрицательной обратной связью. W(S) = Wпр(S)/(Wпр(S)*Wос(S) + 1)
|
|
|
|
|
Apr 28 2007, 19:12
|
Участник

Группа: Новичок
Сообщений: 24
Регистрация: 20-10-06
Пользователь №: 21 500

|
Вот такой вот рабочий код приведен в документе slaa037.pdf - апликэшн репорт от тексаса Код ***************************************************************************** * Anti–bias results * answer = input + (0.875 * lasty) – lastx; * lasty = answer; * lastx = input; *****************************************************************************
|
|
|
|
|
Apr 29 2007, 09:13
|

Частый гость
 
Группа: Участник
Сообщений: 80
Регистрация: 12-01-07
Из: Энергодар Украина
Пользователь №: 24 374

|
Цитата(Сергей Борщ @ Apr 28 2007, 00:50)  Если эталон - китайский мультиметр, то сменить мультиметр. Если же эталон заслуживает доверия, то давайте думать. Это не похоже на погрешность источника опорного напряжения, ибо отклонения имеют разный знак на концах шкалы. Какое у вас выходное сопротивление источника сигнала? И что вы используете в качестве опорного напряжения? Если внешняя опора, то какое выходное сопротивление ее источника? 1) Мультимер UNI-T M890F, купленный 4 года назад за 20 баксов. На него я ещё не разу не жаловался! 2) В качестве источника входного сигнала я ис пользую такую сему 3) ИОН внутренний с конденсатором на ножке AREF, равен 2.66 В Может я чего намутил в программе,посмотрите, пожалуйста, код
Сообщение отредактировал Anjey_N - Apr 29 2007, 09:18
Эскизы прикрепленных изображений
|
|
|
|
|
Apr 29 2007, 18:29
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Anjey_N @ Apr 29 2007, 09:13)  На него я ещё не разу не жаловался! Это не значит что он показывает правильно. Цитата(Anjey_N @ Apr 29 2007, 09:13)  2) В качестве источника входного сигнала я ис пользую такую сему Выходное сопротивление вашей цепи близко к предельному: Цитата The ADC is optimized for analog signals with an output impedance of approximately 10k or less. If such a source is used, the sampling time will be negligible. Попробуйте увеличить время выборки (sampling time) снизив тактовую частоту АЦП или возьмите потенциометр на 10К
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|