Easyelectronics.ru

Электроника для всех
Текущее время: 26 ноя 2020, 21:09

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 48 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Алгоритм обработки длительных нажатий кнопок
СообщениеДобавлено: 31 янв 2010, 20:33 
Старожил

Зарегистрирован: 31 янв 2010, 20:19
Сообщения: 4945
Откуда: Донецк-Мариуполь
Пока пытаюсь работать с кнопками и 7-ми сегм. индикаторами. Например, часы, или паяльная станция. Хочу реализовать достаточно стандартный алгоритм нажатий кнопок. Если быстро нажать - устанавливается число на единицу больше/меньше. Если нажать и держать - то тогда начинается увеличение/уменьшение на десятки.
Но весь в раздумьях - как это правильно сделать?

Например, правильно ли будет сделать так: при нажатии кнопки запускается таймер, измеряется время нажатия (заодно "подавляется дребезг") и исходя их этого - делаем нужный инкремент/декремент. По отпускании кнопки - таймер останавливается.

Или это в принципе неверно?

Спасибо за внимание.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритм обработки длительных нажатий кнопок
СообщениеДобавлено: 01 фев 2010, 21:13 
Администратор
Аватара пользователя

Зарегистрирован: 16 янв 2010, 06:09
Сообщения: 6283
Откуда: Челябинск
две проверки и один счетчик. Т.е. если кнопка нажата - тикаем счетчиком, если отпущена - счетчик сбрасываем и фиксируем как короткое нажатие. Если счетчик дотикал до порога - считаем что у нас длинное нажатие.

_________________
Хозяин дома


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритм обработки длительных нажатий кнопок
СообщениеДобавлено: 02 фев 2010, 02:31 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:46
Сообщения: 125
Откуда: г. Буча, Киевская обл., Украина
Как-то, на олимпиаде по 8051 делал будильник, то там в требованиях к заданию было:
- обеспечить обработку длительного нажатия кнопки при настройке времени:
- при нажатии кнопки +1 к минутам\часам, если кнопка нажата более 1сек, то каждые 0,5сек +1 к минутам\часам.

то один таймер в высшим приоритетом считал секунды для часов (10 раз по 100мс). и если нога МК в состоянии "кнопка нажата", то "режим настройки времени". в РПД считается к-во 0,5сек, как кнопка нажата, и если больше 2-х раз (т.е. секунда)- то производил настройку времени согласно требованиям - каждые 0,5 - +1к сек\часам.

Второй таймер\счетчик - для подавления дребезга.

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

_________________
-||devil was an angel too||-
-||world is a ghetto||-


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритм обработки длительных нажатий кнопок
СообщениеДобавлено: 06 фев 2010, 20:10 
Старожил
Аватара пользователя

Зарегистрирован: 05 фев 2010, 16:57
Сообщения: 2193
Откуда: Нальчик
Вот те вариант опроса кнопки который я использую.


Вложения:
опрос-кнопки.gif
опрос-кнопки.gif [ 30.84 Кб | Просмотров: 20735 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритм обработки длительных нажатий кнопок
СообщениеДобавлено: 06 фев 2010, 21:37 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:55
Сообщения: 5548
Откуда: Уругвайская АССР
Сам я тяготею к опросу клавиатуры по входу в процедуру GetKey, получается примерно так:
при инициализации девайса все столбцы клавиатуры утягиваем в ноль. Таким образом, если хоть на одной строке обнаруживается ноль, значит что-то нажато. Только в этом случае производится полное сканирование матрицы - избавляемся от необходимости каждый раз сканировать матрицу.
Сам алгоритм прост:
вход:
  1. счётчик_запрета==0? (да-выход, без нажатия)
  2. что-то нажато? (нет - выход, без нажатия, последняя_нажатая:=ноль)
  3. сканируем матрицу, получаем скан-код, столбцы клавиатуры - в ноль.
  4. скан-код равен последней нажатой ? да: - выход, без нажатия
  5. последняя_нажатая:=скан-код, счётчик_запрета:=постоянная времени антидребезга, выход с нажатием.
используются переменные - последняя_нажатая: байт, для хранения скан-кода, счётчик_запрета: байт, декрементируется в таймерном прерывании. Для подавления дребезга служит именно он, такой подход позволяет сразу получить нажатую клавишу, а потом пропускать переходные процессы в клавиатуре.
А если нужно детектить долгое нажатие, то при нажатии заряжаем счётчик в ещё одну переменную, и добавляем ещё одну проверку, в строке 4, и если счётчик опустел, то выдаём - было длинное нажатие. Процедура отдаст скан-код при нажатии, а потом «длинный скан-код» при исчерпании счётчика.
Если так нельзя, то скан-код нужно отдавать из строки 2, где фиксируется отпускание кнопки.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритм обработки длительных нажатий кнопок
СообщениеДобавлено: 24 дек 2010, 00:25 
Заглядывает иногда

Зарегистрирован: 16 ноя 2010, 15:16
Сообщения: 74
Откуда: Башкирия, Белорецк
ShadS писал(а):
Вот те вариант опроса кнопки который я использую.

Пример кода можно взглянуть? Если он реализован на Си.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритм обработки длительных нажатий кнопок
СообщениеДобавлено: 24 дек 2010, 01:39 
Старожил
Аватара пользователя

Зарегистрирован: 03 сен 2010, 22:46
Сообщения: 6139
Откуда: Москва
Была уже такая тема, и даже код приводился. Среди прочего там был мой пример, вполне годный для этой задачи, на С. Обрабатывал сразу несколько кнопок, с генерацией событий по нажатию, отпусканию, длительному нажатию, и повторам.

Не помню только, как тема называлась... про дребезг, что ли.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритм обработки длительных нажатий кнопок
СообщениеДобавлено: 21 май 2012, 22:21 
Заглядывает иногда

Зарегистрирован: 16 ноя 2010, 15:16
Сообщения: 74
Откуда: Башкирия, Белорецк
(GCC AVR) Покажите работающий код по обработке кнопок (одиночное нажатие, длительное нажатие), 4 кнопки. Сколько пересмотрел, нет четко работающего кода.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритм обработки длительных нажатий кнопок
СообщениеДобавлено: 21 май 2012, 23:33 
Старожил
Аватара пользователя

Зарегистрирован: 29 май 2010, 18:46
Сообщения: 4189
Откуда: Киев
JeckDigger писал(а):
(GCC AVR) Покажите работающий код по обработке кнопок

Не уверен, что это лучшее, но работает
Функция вызывается раз на 10 мс.
Код:
typedef enum { NO_KEY, DN_KEY, UP_KEY, UP_N_DN_KEYS} KeyMode;

KeyMode get_UpDn( void) {         // returns state of Up and Down keys
  static ucha up_counter, dn_counter;
                    // Step 1: Up and Dn counters = 0...10...40...10...40....
  if( UP_key_pressed)
    { if( ++up_counter > 40) up_counter = 10;}  // Кожні 0,3 секунд 1 автокрок
  else up_counter = 0;                          // One sample is Zero => counter reset

  if( DN_key_pressed)
    { if( ++dn_counter > 40) dn_counter = 10;}
  else dn_counter = 0;
                    // Step 2: Logic
  if( up_counter == 10)
  {
    if( dn_counter > 0) return UP_N_DN_KEYS;      // Both keys are pressed
    return UP_KEY;                                 // Only UP key
  }
  if( dn_counter == 10)
  {
    if( up_counter > 0) return UP_N_DN_KEYS;      // Both keys are pressed
    return DN_KEY;                                // Only DN key
  }

  return NO_KEY;
}

Зедсь как однократные, так и длительные, да еще и одновременное нажатие двух. Опрос - без матрицы. просто 2 порта.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритм обработки длительных нажатий кнопок
СообщениеДобавлено: 21 май 2012, 23:59 
Старожил

Зарегистрирован: 10 авг 2011, 19:26
Сообщения: 632
DI HALT писал(а):
две проверки и один счетчик. Т.е. если кнопка нажата - тикаем счетчиком, если отпущена - счетчик сбрасываем и фиксируем как короткое нажатие. Если счетчик дотикал до порога - считаем что у нас длинное нажатие.
срабатывание по отжатию - не лучшее решение.
достаточно срабатывать по определенным значениям счетчика.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритм обработки длительных нажатий кнопок
СообщениеДобавлено: 22 май 2012, 00:28 
Старожил
Аватара пользователя

Зарегистрирован: 05 фев 2010, 16:57
Сообщения: 2193
Откуда: Нальчик
reptile писал(а):
срабатывание по отжатию - не лучшее решение.
достаточно срабатывать по определенным значениям счетчика.
А как тогда определять короткое, если не по отжатию?
По другому не получиться. Короткое по отжатию, если счетчик длительного не дотикал, а если дотикал, то тут ДА, кнопка еще нажата, а нажатие (длинное) уже есть.....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритм обработки длительных нажатий кнопок
СообщениеДобавлено: 22 май 2012, 00:30 
Старожил

Зарегистрирован: 10 авг 2011, 19:26
Сообщения: 632
>>А как тогда определять длительное нажатие, если короткое не по отжатию?

а какая цель ? автоповтор ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритм обработки длительных нажатий кнопок
СообщениеДобавлено: 22 май 2012, 00:34 
Старожил
Аватара пользователя

Зарегистрирован: 05 фев 2010, 16:57
Сообщения: 2193
Откуда: Нальчик
reptile писал(а):
а какая цель ? автоповтор ?
Да нет, обычные одиночные нажатия, с автоповтором сложнее будет наверное.
До автоповтора как то руки пока не доходили.....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритм обработки длительных нажатий кнопок
СообщениеДобавлено: 22 май 2012, 00:42 
Старожил
Аватара пользователя

Зарегистрирован: 29 май 2010, 18:46
Сообщения: 4189
Откуда: Киев
ShadS писал(а):
А как тогда определять короткое, если не по отжатию?

В моем примере, если счетчик up_counter досчитал до 10 (с учетом частоты вызова, это 100 мс), то уже выполняется действие НАЖАТА КНОПКА ВВЕРХ. Но счетчик не сбрасывается, а продолжает тикать пока кнопка нажата. Через 300 мс счетчик сбросится в 10 и вызывающая программа отработает уже автоповтор. И так каждые 300 мс.
Моя задача облегчается тем, что действие на однократное нажатие и на длительное - одно и то же, только при длительном программа сама делает автоповтор.
А могут быть случаи:
- при длительном нажатии отработать другую команду, пусть это будет КОМАНДА2. При этом допустим, что отработка первого нажатия (НАЖАТА КНОПКА ВВЕРХ) нам не мешает. Ну и ладно: тогда при проверке условия
Код:
if( ++up_counter > 40)

надо ставить флаг КОМАНДЫ2.
- при длительном нажатии отработать другую команду, пусть это будет КОМАНДА2. Но при этом допустим, что отработка первого нажатия (НАЖАТА КНОПКА ВВЕРХ) нам мешает. Тут сложнее: нужно сразу нажатие не трабатывать, а действительно ждать до отпускания (тогда команда НАЖАТА КНОПКА ВВЕРХ таки отрабатывается) или выполнения условия
Код:
if( ++up_counter > 40)

...тогда отрабатывается КОМАНДА2, а команда НАЖАТА КНОПКА ВВЕРХ херится.

Так что не вижу, чем мой код не годится.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритм обработки длительных нажатий кнопок
СообщениеДобавлено: 22 май 2012, 00:42 
Старожил
Аватара пользователя

Зарегистрирован: 20 фев 2012, 19:20
Сообщения: 753
Откуда: Минск
Вот, для примера, модуль обработки клавиатуры из моего частотомера:

Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритм обработки длительных нажатий кнопок
СообщениеДобавлено: 27 июн 2020, 23:15 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2015, 12:31
Сообщения: 220
Откуда: Лукоморье
Как-то вдруг появилась необходимость различать короткие/длинные нажатия.
DI HALT писал(а):
две проверки и один счетчик. Т.е. если кнопка нажата - тикаем счетчиком, если отпущена - счетчик сбрасываем и фиксируем как короткое нажатие. Если счетчик дотикал до порога - считаем что у нас длинное нажатие.

Попробовал нечто такое, но что-то пошло не так. При длинном нажатии все равно первым пролетает флаг короткого нажатия, а уже потом флаг длинного.
Вопрос: Где грабли?

Код:
void buttons_check(void) { // опрос кнопок х2 шт.
  uint8_t buttonState = 0; // буфер для текущего состояния кнопок
  uint8_t buff; // буфер для текущего состояния флагов кнопок
  static uint16_t buttonPressCounter[] = { 0, 0 }; // счётчики продолжительности нажатия кнопок

  BUTTON0_STATE = BUT_PINX & (1<<BUT_NUM);  // состояние кнопки 1, PD1
  BUTTON1_STATE = BUT_PINX & (1<<BUT_NUM2); // состояние кнопки 2, PD2
 
  buttonState = (BUTTON0_STATE | BUTTON1_STATE << 1) ^ 0x03; // 0b00000011; (?)

  for (uint8_t i = 0; i <= 1; i++) { // для каждой из кнопок проверяем:
    if ((buttonState >> i) & 1) { // если кнопка нажата
      buttonPressCounter[i]++; // увеличиваем значение счётчика

      if (buttonPressCounter[i] == 80) {
        buff |= (1 << i); // фиксируем короткое нажатие
      }
      else { 
        buff &= ~(1 << i); // сбрасываем флаг короткого нажатия кнопки
      }
     
      if (buttonPressCounter[i] == 3200) {
        buff |= (1 << i) | (1 << (i+4)); // фиксируем длинное нажатие         
        //buttonPressCounter[i] = 2400; // повторяем действие длинного нажатия при удерживании кнопки (примерно 4 раза в секунду)
      }
    }
    else { // когда кнопку отпустили
      buttonFlags = buff;
      buttonPressCounter[i] = 0; // сбрасываем счётчик
      buff &= ~((1 << i) | (1 << (i+4))); // сбрасываем флаги нажатия кнопки
    }
  }
}

P.S. В функции считаем флажки таймера TIMER2 идущие каждые 625us.


Последний раз редактировалось RTSAM 27 июн 2020, 23:39, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритм обработки длительных нажатий кнопок
СообщениеДобавлено: 27 июн 2020, 23:20 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 7069
Грабли в граблях. Погуглите фразу "дребезг контактов".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритм обработки длительных нажатий кнопок
СообщениеДобавлено: 27 июн 2020, 23:25 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2015, 12:31
Сообщения: 220
Откуда: Лукоморье
Так тут вроде как короткое нажатие ловится через 50 мс. Дребезг уже должен пройти.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритм обработки длительных нажатий кнопок
СообщениеДобавлено: 27 июн 2020, 23:32 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 7069
"625us", а время дребезга 1-5 мс.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритм обработки длительных нажатий кнопок
СообщениеДобавлено: 27 июн 2020, 23:36 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2015, 12:31
Сообщения: 220
Откуда: Лукоморье
Возможно я был неправильно понят, но 625us x 80 = 50 ms. 50ms > 5 ms. Как-то так.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритм обработки длительных нажатий кнопок
СообщениеДобавлено: 28 июн 2020, 00:41 
Старожил

Зарегистрирован: 16 окт 2013, 01:27
Сообщения: 1626
Как уже выше говорили :)
Прерывание по нажатию и отпусканию кнопки, если нажатие или отпускание менее 10 mS не реагирую, если более 10 ms поднимается флаг и далее уже в теле основного цикла идет обработка:
например вот тут обработка секундных нажатий от 1 до 4 сек, если держим 5 сек - сброс.

Код:
if(!BUTTON()){
   LCD_Gotoxy(15,7);LCD_PrintDec(button_sec,0);
   LCD_Gotoxy(7,7);
      switch (button_sec) {
         case 1:   {TIM2->CNTRH=0;TIM2->CNTRL=0;Counter=0;   LCD_PrintStr(" Reset ",1);}break;
         case 2: {count_dir=0;                                          LCD_PrintStr("  Up   ",1);}break;
         case 3: {count_dir=1;                                          LCD_PrintStr("  Down ",1);}break;
         case 4: {imp_per_metr=100;                                 LCD_PrintStr("  Imp  ",1);}break;
         case 5: {button_sec=0;                                       LCD_PrintStr("  Ret  ",1);}break;
         default: {} break;
      }
}
else {
LCD_ClearStr(7,1);
}


В обработчике даже счетчика своего нет - он запоминает текущее системное время когда нажата и отпущена кнопка и вычисляет собственно задержку в ms.

P\S это извращение пришлось делать когда переобулись уже после выхода платы, пришлось добавлять функционал и вешать конфигуратор на одну кнопку.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритм обработки длительных нажатий кнопок
СообщениеДобавлено: 28 июн 2020, 00:46 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 7069
(я делаю еще проще - цикл опроса кнопок 10 мс. Проблем с дребезгом ни-ка-ких ))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритм обработки длительных нажатий кнопок
СообщениеДобавлено: 28 июн 2020, 10:58 
Старожил

Зарегистрирован: 04 окт 2012, 00:23
Сообщения: 2745
Откуда: Москва
u37 писал(а):
(я делаю еще проще - цикл опроса кнопок 10 мс. Проблем с дребезгом ни-ка-ких ))

У АЦП проблем с дребезгом тоже "никаких"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритм обработки длительных нажатий кнопок
СообщениеДобавлено: 28 июн 2020, 19:43 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2944
Как-то так:
Код:
// Button handling ISR. Changes btn_state based on timer0 & button release
ISR(INT0_vect) {
    if (bit_is_clear(BTN_PIN, BTN) && state.btn_state == BTN_NONE) { // Set button state & run timer on button press
        STOP_TIMEOUT();
        state.btn_state = BTN_PRESSED;
        RUN_TIMEOUT(BTN_LONG_OVF); // Run timeout for LONG overflow period (more than LONG press timing)
        LOG("BTN press\r\n");
    } else if (bit_is_set(BTN_PIN, BTN) && state.btn_state == BTN_PRESSED) { // Things to check on button release
        LOG("BTN release!\r\n");
        if ((t0_ovf_cnt < BTN_LONG_OVF) && (t0_ovf_cnt > (BTN_LONG_OVF - BTN_SHORT_OVF)) && !t0_timeout_flag) // if at least 1 overflow period has passed & no timeout yet, but less than short period has passed
            state.btn_state = BTN_SHORT;
        else if ((t0_ovf_cnt <= (BTN_LONG_OVF - BTN_SHORT_OVF)) && !t0_timeout_flag) // if overflow counter has already counted more than BTN_SHORT_OVF
            state.btn_state = BTN_LONG;
        else if (t0_timeout_flag)
            state.btn_state = BTN_EXTRA_LONG;
        else
            state.btn_state = BTN_NONE;
        STOP_TIMEOUT();
        t0_timeout_flag = false;
    }
}

volatile bool t0_timeout_flag = false;
volatile uint8_t t0_ovf_cnt;

// Simple counter which runs from RUN_TIMEOUT(OVF) macro which sets t0_ovf_cnt.
ISR(TIMER0_OVF_vect) {
    t0_ovf_cnt--;
    if (t0_ovf_cnt == 0) {
        TCCR0 = 0;
        TCNT0 = 0;
        t0_timeout_flag = true;
    }
}


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритм обработки длительных нажатий кнопок
СообщениеДобавлено: 26 сен 2020, 21:13 
Только пришел

Зарегистрирован: 06 авг 2020, 22:13
Сообщения: 26
По одной кнопке обрабатывать - идея так себе.

Вот тут код, который параллельно 8 кнопок обрабатывает. Нет проблем и 16 сделать, или больше - поменять тип данных и всё. Тут ещё и датчик вращения прикручен заодно.
По таймеру каждые 10 мс опрос кнопок knopf_abfrage(knopf_input()) и каждую мс опрос датчика вращения void drehgeber_abfrage(knopf_input()).
signed char encode_read(void) возвращает изменение датчика вращения.
unsigned char get_key_press( unsigned char key_mask ) определяет, нажата ли кнопка, указанная в key_mask.
unsigned char get_key_rpt( unsigned char key_mask ) определяет длинное нажатие
unsigned char get_key_state( unsigned char key_mask ) - удержание кнопки
unsigned char get_key_short( unsigned char key_mask ) - короткое нажатие
unsigned char get_key_long( unsigned char key_mask ) - длинное нажатие.

Разрешены:
- get_key_press()
- get_key_rpt()
- get_key_press() вместе с get_key_rpt()
- get_key_short() вместе с get_key_long()
- get_key_short() вместе с get_key_long() и get_key_rpt()

Код написан Петером Данеггером, https://www.mikrocontroller.net/

У меня кнопки с датчиком подключены через регистр HC165 и SPI. Но это очень просто сделать по-другому: достаточно переделать функцию static inline u8 knopf_input(void)

#define REPEAT_START определяет задержку перед быстрым счётом (если кнопка продолжает удерживаться), #define REPEAT_NEXT - скорость быстрого счёта. #define REPEAT_MASK задаёт кнопки, для которых включён режим быстрого счёта.


Вложения:
Комментарий к файлу: Обработка нажатия кнопок и датчика вращения
Knopf.zip [4.1 Кб]
Скачиваний: 54
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 48 ]  На страницу 1, 2  След.


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB