Перейти к содержанию

Примеры кода для AVR


Duhas

Рекомендуемые сообщения

а у тебя есть другие способы расширить Таймер2 до 16 бит?

 

Мудрость приходит вместе с импотенцией...

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

Ссылка на комментарий
Поделиться на другие сайты

delayH:delayL - использовать как 16-битный счетчик (вместо OCR2), выбрав другую пару регистров. Сам OCR2 в режиме CTC будет служить множителем.

Я такие вопросы решаю так:

; значение задержки в регистры R25 - delayH, R24 - delayL (вместо R22, R21. R20 не требуется)
; OCR2 - значение множителя задержки
; прерывание таймера2, режим СТС
timer2_CTC:
   ; сохраним регистры, которые использует прерывание
	sbiw		r25:r24,1
;если длина "тела" большая, то делаем так
	breq		work
	rjmp		exit_timer2_CTC
work:
   ; "тело" прерывания
   ; идем на задание задержки для следующего цикла таймера
exit_timer2_CTC:
	reti

Конечно, для расчета задержки требуется несколько иной подход, но это стОит компактности решения.

Ссылка на комментарий
Поделиться на другие сайты

опять ты не в ту степь...

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

и я для себя разработал такой алгоритм.

мне может понадобится задержка и меньше 255 микросекунд.

например, нужно 97 микросекунд или 131 микросекунда. что ты со своими алгоритмом тут будешь делать? что на что будешь умножать?

Мудрость приходит вместе с импотенцией...

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

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

но ты не ответил на мой вопрос.

спрошу еще раз.

допустим, нужно 269 микросекунд.

что ты будешь в своем алгоритме загружать в OCR2 и на что будешь умножать?

ты сначала сам вникни в то, что ты написал...

Мудрость приходит вместе с импотенцией...

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

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

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

Ссылка на комментарий
Поделиться на другие сайты

у меня ожидается минимальное значение примерно 100 мкс. поэтому мне важна точность именно при малых величинах задержки. ну, а максимум - полное значение двух байтов - 65535.

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

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

вполне может оказаться, что первая задержка при трогании механизма с места может потребоваться и более 65535, и тогда придется изменять что-то в прошивке.

а по мере разгона двигателя (механизма) задержка будет уменьшаться по определенному закону до достижения заданного максимума скорости.

сейчас у меня сделан алгоритм разгона на 256 шагов. при этом задержка (время одного шага) уменьшается в 32 раза по сравнению с максимальным временем самого первого шага.

и сейчас я делал отладку программы на слабеньком двигателе от старенького флоппи на 5,25 дюйма.

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

 

 

Мудрость приходит вместе с импотенцией...

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

Ссылка на комментарий
Поделиться на другие сайты

28.12.2019 в 18:44, Starichok сказал:

то таймер просто не сможет его отработать с точностью до 1 такта таймера

Вот это серьезная тема пошла, потому что и старший байт, когда начинает отсчитывать 255-ffы? Только после входа в прерывание и загрузки регистра , то есть + дельта какая то на каждую единицу???

Видать до импотенции еще долго :) !

Изменено пользователем ruhi

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

со старшим байтом вообще нет никаких проблем.

прерывание начинает работать с некоторым предыдущим значением в регистре OCR2.

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

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

но для меня это не критично. если, к примеру, требуется 257 (256+1) мкс, то вместо 1 мкс прерывание отработает чуть больше, примерно 260 (256 + 4) мкс.

Мудрость приходит вместе с импотенцией...

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

Ссылка на комментарий
Поделиться на другие сайты

  • 2 месяца спустя...
  • 4 недели спустя...
17.03.2020 в 22:00, sbalymov сказал:

Парни пожалуйста скиньте пример кода на Си (AtmelStudio) захват таймера, нужно подсчитать время импульса ( pulseIn в Arduino)

Вот пример кода среда CodeVision 100% рабочий был написан для расшифровки ИК команд от пультов китайских и не очень ДВД кодировка NEC. Здесь применяется захват импульса как по фронту так и по спаду. Старался как можно меньше занимать работу контроллера поэтому не использовал команды типа delay_ms.

#include <mega32.h>    // F_CPU 8000000
#define Front TCCR1B=0xC2;
       // запуск таймера1 в ркжиме захвата по фронту сигнала
#define Spad  TCCR1B=0x82;       
       // переключение таймера на захват по спаду импульса
#define StopT1 TCCR1B=0x00; TCNT1H=0x00;TCNT1L=0x00
       // остановка таймера1
#define Sbros TCNT1H=0x00; TCNT1L=0x00       
       // сброс таймера1                
register int shetshik @2;
volatile unsigned char  pu[4]={0, 0, 0, 0}, 
                        ur=0, kkomand=0xFF, 
                         tik,  sobitie, oshibka;
// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Place your code here
  sobitie=3;  
}

// Timer 1 input capture interrupt service routine
interrupt [TIM1_CAPT] void timer1_capt_isr(void)
 {  
   #asm 
   IN   R2,0x26
   IN   R3,0x27
   #endasm
   if (oshibka==0){sobitie=2;} else {sobitie=0;};
   Sbros; }

void initializacia (void)
{  
PORTA=0x00;
DDRA=0xFF;

PORTB=0x00;
DDRB=0x0F;

PORTC=0x00;
DDRC=0x00;

PORTD=0xFF;
DDRD=0x00;

TCCR0=0x00; // 05
TCNT0=0x00;
OCR0=0x00;

TCCR1A=0x00;
StopT1;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

MCUCR=0x00;
MCUCSR=0x00;

TIMSK=0x24;

ACSR=0x80;
SFIOR=0x00;

// Global enable interrupts
#asm("sei")

}


void main(void)
 {
 // Declare your local variables here
 initializacia(); 
 oshibka=0; tik=10;
 sobitie=0;  
 while (1)
   { if ((!(PIND.6))&&(oshibka==0)&&(tik==10)){sobitie=1;};
           
     
       switch (sobitie) {
        case 1: 
              Front; Sbros; tik=8;
              pu[0]=0; pu[1]=0; 
              pu[2]=0; pu[3]=0;
              ur=0; sobitie=0;
        break;
        case 2: 
            switch (tik) {
             case 8: 
                     Spad;                          
                     if ((8500<shetshik)&&(shetshik<9700))
                     { tik=9; }
                     else{oshibka=1; tik=10;}; 
                   
                     
             break;                          
             case 9: 
                     if ((4300<shetshik)&&(shetshik<4800))   //4500 4900
                     { tik=0; kkomand=0xFF;} 
                     else
                      { if ((2000<shetshik)&&(shetshik<2600))  //2100 2500
                        {oshibka=7;}  else {oshibka=2;};
                        tik=10;};
                       
             break;
             
             case 10: 
               
             break; 
             
             default: 
                     if (tik>7){ tik=10;} else { 
                     if ((1000<shetshik)&&(shetshik<1280))     //Это "0"
                     {pu[ur] &=(~(1 << (tik)));}
                     else 
                       {if((2100<shetshik)&&(shetshik<2500))   //Это "1"
                        {pu[ur] |=(1 << (tik));}
                        else {oshibka=3; tik=10; };};
                        
                        if (tik==7){ if (ur==3)
                             { tik=10;
                              if ((pu[0]==~pu[1])&&(pu[2]==~pu[3]))
                                { kkomand=pu[2];}
                                else {oshibka=4; kkomand=0xFF;};
                               }
                                else{ur++; tik=0;};}
                        else {tik++;}; };
               };             // конец выборки tik 
             
             sobitie=0;                 
        break;
        case 3:  //установить первоначальный режим
              tik=10; 
              oshibka=0; 
              sobitie=0; 
        break; 
        
                };    // конец выборки sobitie
     PORTA=kkomand; PORTB=oshibka;}; //while вывод в двоичном коде команды - подвешивал светодиоды использовал для отладки.
 }

Если есть сложности с объявлением переменной shetshik можно просто её обьявить как обычную тип int. но при этом необходимо изменить считывание значений таймера согласно даташиту  и после соединять два 8-ми байтных числа в одно 16-ти разрядное.

Изменено пользователем AL_smeu
Ссылка на комментарий
Поделиться на другие сайты

  • 9 месяцев спустя...

Можно ли сделать 100% защиту от дребезга  управления механическим энкодером  EC11 ? Для входа в программу опроса есть возможность применить одно внешнее прерывание .  Желательно пример на аssemlere .  

МК AVR типа .

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, dodik сказал:

Желательно пример на аssemlere

да не вопрос... скорости опроса до 13кГц хватит?
http://www.piclist.com/techref/microchip/qenc.htm

ну а если вообще трэш нужен можете в железе собрать

https://forum.cxem.net/index.php?/topic/222151-обработка-энкодера-на-логике/&tab=comments#comment-3408583

:D

Ссылка на комментарий
Поделиться на другие сайты

@солар Спасибо за наводку )

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

Только что, IMXO сказал:

скорости опроса до 13кГц хватит?

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

Программу посмотрю .

Ссылка на комментарий
Поделиться на другие сайты

7 минут назад, dodik сказал:

В том то и дело , что мне встроить в программу такую скорость не получается

если чо это был сарказм... :lol2:  что бы с ЕС11 получить 13кГц  его нуна вращать со скоростью 32500 обр/мин

 

22 минуты назад, dodik сказал:

Использую одно внешнее прерывание для определения срабатывания

зачем? достаточно тупо раз 1..10мс опрашивать состояние энкодера,  внешние прерывание для опроса ЕС11 наненать.

Ссылка на комментарий
Поделиться на другие сайты

15 часов назад, dodik сказал:

внешнее прерывание для определения срабатывания

В сторону: - Вы маньяки... Вы все маньяки! Накий черт мгновенный отклик, если потом один хрен ждать повторного опроса?!

По вопросу. Если уж приспичило прерывание, то после входа в него (появился фронт, перепад или на что он там настроен у тебя), подожди пока успокоится дребезг или помеха и еще раз опроси.

Я не раздаю удочки. Я продаю рыбу.

Ссылка на комментарий
Поделиться на другие сайты

16 часов назад, IMXO сказал:

что бы с ЕС11 получить 13кГц 

скорость опроса энкодер задает, только при внешних прерываниях , насколько мне понятно  

 а вы утверждаете

16 часов назад, IMXO сказал:

внешние прерывание для опроса ЕС11 наненать.

 

1 час назад, солар сказал:

Накий черт мгновенный отклик

Потому что программы бывают разные . У меня на один процессор выходит 6 функциональных программ  и одна системная на прерываниях 16 раз в секунду для настроек  . Кнопки повешены на ТМ1637.  Такой треш :rolleyes:

Вводить опрос

16 часов назад, IMXO сказал:

тупо раз 1..10мс

в моем случае нужно в функциональные программы 6 раз несколько по разному да и функционал прилично напрягает МК .  А глюки искать если что ....

Был бы многоядерный МК - нет вопросов . На одно ядро можно все  настройки повесить и 13кГц скорости для приколу  .

Разобрал для интересу один китайский аппарат . Там на опросе стоит отдельный  STM  . На один оборот пропускает 4-5 тактов при средней скорости вращения от руки )))

Пропуск тактов на большой скорости не заметен . Индикатор мельтешит и щелчки тупо верещат . У меня задача настройка по цифровому индикатору .  

1 час назад, солар сказал:

и еще раз опроси.

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

Скрытый текст

;----------------------Прерывание от компаратора-------------------------------------
ACI_:push ZH push ZL in Save,SREG in temp,OSCCAL push temp

;-----------------проверка A на 0 инверсно ACO-----------------------
sbic ACSR,ACO rjmp F_B sts encoder_mode,zero  rjmp  end_ACI    ; сброс флага запрета входа

;-----------------проверка B первая A=0-----------------------
F_B: sbi PORTC,2 ;<<<<<<<<<<<<<<<<<<<<<<<<<< тест
lds temp,encoder_mode sbrc temp,1 rjmp end_ACI                 ; проверка флага запрета входа
 ;sbis pinC,B rjmp B2
ldi temp,200 dec temp breq B1 sbic pinC,B rjmp PC-3            ;проверка В на "1"    
ldi temp,200 dec temp breq B2 sbis pinC,B rjmp PC-3 rjmp F_B   ;проверка В на "0"
B1: ldi temp,0B00000010 sts encoder_mode,temp rjmp R_A      ;B=1

B2: ldi temp,0B00000011 sts encoder_mode,temp               ;B=0
;-----------------проверка A на 1 инверсно ACO-----------------------
R_A:out TCNT0,zero cbi PORTC,2 ;<<<<<<<<<<<<<<<<<<<<<<<<<<тест
R_A1:in temp_H,TCNT0 cpi temp_H,30 brlo R_A1 dec temp_L brne R_A2 rjmp end_ACI
R_A2:sbic ACSR,ACO rjmp R_A
cbr temp,0b00000010 sts encoder_mode,temp ; сброс флага запрета входа
;-----------------проверка B вторая A=1-----------------------
R_B: sbi PORTC,2 ;<<<<<<<<<<<<<<<<<<<<<<<<<<тест
;sbis pinC,B rjmp dec_set
ldi temp,200 dec temp breq inc_set sbic pinC,B rjmp PC-3           ;проверка В на "1"    
ldi temp,200 dec temp breq dec_set sbis pinC,B rjmp PC-3 rjmp R_B  ;проверка В на "0"  
;--------проверка на увеличение уставки----------
inc_set: lds temp,encoder_mode sbrs temp,0 rjmp end_ACI
rjmp inc_dec
;--------проверка на уменьшение уставки----------       
dec_set: lds temp,encoder_mode sbrc temp,0 rjmp end_ACI
;--------------------включение звука-----------------------------------------
inc_dec: cbi PORTC,2 ;<<<<<<<<<<<<<<<<<<<<<<<<<<тест
ldi temp,(1<<COM1A1) out TCCR1A,temp
;----------------выбор параметра для настройки-------------------------------
sbrs mode_AFC,plus rjmp F_nastr lds temp,mode_plus
cpi temp,F_m  brne PC+2 rjmp F_nastr
cpi temp,nq_m brne PC+4 sbrc mode,0 rjmp n_nastr rjmp q_nastr
cpi temp,A_m  brne PC+2 rjmp timer_nastr
cpi temp,U_m  brne PC+2 rjmp U_nastr
cpi temp,dF_m brne PC+2 rjmp dF_nastr
cpi temp,br_m brne PC+2 rjmp br_nastr
;----------------------выход из прерывания----------------------------------
end_ACI:
out TCNT0,zero in temp,TCNT0 cpi temp,30 brlo PC-2 out TCCR1A,zero  ;выключение звука
out SREG,Save pop ZL pop ZH reti
;---------------------------------------------------------------------------
;---------------------инициализация энкодера--------------------------------
IN_ENC:  ldi temp,(0<<ADEN) out ADCSRA,temp                     ; 0<<ADEN выключение АЦП
in temp,SFIOR sbr temp,(1<<ACME) out SFIOR,temp                 ; 1<<ACME подключение инвертирующего входа AIN1 к входу АЦП
ldi temp,(0<<MUX3)+(0<<MUX2)+(0<<MUX1)+(0<<MUX0)out ADMUX,temp  ; AIN1 к входу АЦП (ADC0) 23 нога
ldi temp,(0<<ACD)+(1<<ACBG)+(1<<ACIE)+(0<<ACIS1)+(0<<ACIS0) out ACSR,temp ret
;0<<ACD - компаратор включен
;1<<ACBG - к неинвертирующему входу (AIN0) подключен ИОН 1.22В
;AC0=1 если AIN0>AIN1 ;определение выхода компаратора
;ACI - флаг прерывания от компаратора
;1<<ACIE - разрешение прерываний от компаратора
;1<<ACIС - подключение компаратора к схеме захвата T1
;ACIS1:ACIS0 определяет условие возникновения прерывания от компаратора:
  ; 00 - любое изменение на входе.
  ; 01 - зарезервировано для следующих поколений
  ; 10 - переход с 1 на 0  + инверсия от компаратора
  ; 11 - переход с 0 на 1  + инверсия от компаратора

 

Ссылка на комментарий
Поделиться на другие сайты

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

1031125654_.png.3a8e8ce0bf6efe415dbeccfa8b8e0004.png708184319_.png.502cb34a6c4514e3cf228dc7383e9c49.png

Здесь все хорошо . Снято вчера в комнате .

Сегодня после транспортировки, с морозу . Тут не определено направление и пропущен такт .

2055435066_.png.cb56ea77eef027bd8e6b8184d73d76f2.png

Можно и такое победить наверное .

Ссылка на комментарий
Поделиться на другие сайты

b= PINx.y;

while(1)

{

_delay_ms(10);

a= b;

b= PINx.y;

if(a && !b) front= 1; else front= 0;

}

 

50 минут назад, dodik сказал:

16 раз в секунду

Сунь туда.

Я не раздаю удочки. Я продаю рыбу.

Ссылка на комментарий
Поделиться на другие сайты

жесть, у энкодера  два выхода = 4 состояния + 4 предыдущих состояния всего 16 вариантов , 4 из них "вперед", 4 "назад", 4"без изменений" ,4"невозможная комбинация"
для опроса ЕС11 достаточно проверять только вперед и назад,  тк на один щелочек приходится четыре импульса ,  считаем по четыре импульса

для ЕС11 у меня вот так , вызов функции по таймеру 1мс.

Скрытый текст

void encoder_read(void)
{unsigned char tempPORT;	
 static unsigned char encoder,Count; 
    tempPORT=PORTB;
    encoder<<=2;
    if(tempPORT&((1<<2)) encoder |=(1<<0);
    if(tempPORT&((1<<3)) encoder |=(1<<1);

      switch (encoder & 0x0F) {
     
      // UP  
      case 0b0001:
      case 0b0111:
      case 0b1000:
      case 0b1110:          
          Count++;
        break;
        
      // DOWN 
      case 0b0000:
      case 0b0100:
      case 0b1011:
      case 0b1101: 
          Count--;
        break;

     // nothing happened      
      case 0b0000:
      case 0b0101:      
      case 0b1010:      
      case 0b1111:
            
      // error
      case 0b0011:
      case 0b0110:
      case 0b1001:
      case 0b1100:      
        break;

         default:
         break;
      }   // switch encoder 16 state
          if (Count == 8)              // Если был шаг энкодера влево
             {
                ..............         // то действие А 
                Count = 4;
             }

          else if (Count == 0)         // Если был шаг энкодера вправо
             {
                ..............         // то действие Б
                Count = 4;
             }
}//end void encoder_read(void)

 

 

Ссылка на комментарий
Поделиться на другие сайты

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

Мудрость приходит вместе с импотенцией...

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

Ссылка на комментарий
Поделиться на другие сайты

  • 3 месяца спустя...

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...