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

Вопросы от начинающих по МК


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

  • Ответов 8,9т
  • Создана
  • Последний ответ

Топ авторов темы

Добрый день!

Подскажите,плз. Проект на Attiny13A, AtmelStudio6. Исходник и файл для Proteus7 во вложении.

Столкнулся с проблемой нехватки одной ноги на МК для подключения кнопки. Пробовал использовать для этой цели PB5, но фьюз RSTDISBL почему-то не удается нормально установить обычным usbasp программатором  (заливаю прошивку и устанавливаю все фьзы, кроме RSTDISBL - всё работает. Выставляю RSTDISBL - прошивка не работает, прошивка и фьюзы не читаются. Приходится сбрасывать все ФьюзБитДоктором.)

Тогда наткнулся в инете на статью, где предлагается использовать RESET для сброса МК, но потом считывать регистр MCUSR, где бит EXTRF должен указать, что сброс был произведен именно по RESET'у.

И вот тут я столкнулся с непонятками: в протеусе всегда выставлен бит EXTRF и не выставлен PORF, независимо от того как мы запустили МК.

001.thumb.png.6841106a0856002bfe548735f95ee850.png

Однако в эмуляторе студии вижу все наоборот: выставлен  PORF и не выставлен EXTRF (это после обычного запуска МК, как тут подать ноль на reset еще не разобрался)

002.png.c66ddc808a18e977fb9447702de48a12.png

Отсюда вопрос: это мой косяк или косяк протеуса? Что я делаю не так?

Код:

#define F_CPU 4800000	//Частота МК=4.8МГц

#include <avr/io.h>
#include <util/delay.h>

//Выходы:
//Выход на лампу 0 (PORF)
#define PORT_LED_0	 		PORTB
#define DDR_LED_0 			DDRB
#define PIN_LED_0 			PB0
//Выход на лампу 1 (EXTRF)
#define PORT_LED_1			PORTB
#define DDR_LED_1			DDRB
#define PIN_LED_1			PB1
//Выход на лампу 2 (BORF)
#define PORT_LED_2			PORTB
#define DDR_LED_2			DDRB
#define PIN_LED_2			PB2
//Выход на лампу 3 (WDRF)
#define PORT_LED_3			PORTB
#define DDR_LED_3			DDRB
#define PIN_LED_3			PB3
//Выход на лампу 4
#define PORT_LED_4			PORTB
#define DDR_LED_4			DDRB
#define PIN_LED_4			PB4

volatile unsigned char uchData;

int main(void)
{	
	uchData = MCUSR;

	//Инициализируем порты:
	//Выход
	DDR_LED_0 |= (1<<PIN_LED_0);			//Инициализируем пин на выход
	PORT_LED_0 &=~(1<<PIN_LED_0);			//Снять сигнал
	
	DDR_LED_1 |= (1<<PIN_LED_1);			//Инициализируем пин на выход
	PORT_LED_1 &=~(1<<PIN_LED_1);			//Снять сигнал
	
	DDR_LED_2 |= (1<<PIN_LED_2);			//Инициализируем пин на выход
	PORT_LED_2 &=~(1<<PIN_LED_2);			//Снять сигнал
	
	DDR_LED_3 |= (1<<PIN_LED_3);			//Инициализируем пин на выход
	PORT_LED_3 &=~(1<<PIN_LED_3);			//Снять сигнал
	
	DDR_LED_4 |= (1<<PIN_LED_4);			//Инициализируем пин на выход
	PORT_LED_4 &=~(1<<PIN_LED_4);			//Снять сигнал
		
	if (uchData & (1<<PORF))
	{//Bit 0 – PORF: Power-on Reset Flag
		PORT_LED_0 |= (1<<PIN_LED_0);
	}
  
	if (uchData & (1<<EXTRF))
	{//Bit 1 – EXTRF: External Reset Flag (т.е. нажали Reset)
		PORT_LED_1 |= (1<<PIN_LED_1);
	}
		
	if (uchData & (1<<BORF))
	{//Bit 2 – BORF: Brown-out Reset Flag
		PORT_LED_2 |= (1<<PIN_LED_2);
	}
	
	if (uchData & (1<<WDRF))
	{//Bit 3 – WDRF: Watchdog Reset Flag
		PORT_LED_3 |= (1<<PIN_LED_3);
	}
	
    while(1)
    {
		PORT_LED_4 ^= (1<<PIN_LED_4);
		_delay_ms(10);
    }
}

Проект: 003.zip

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

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

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

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

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

21 минуту назад, Lerik-Co сказал:

Столкнулся с проблемой нехватки одной ноги

Как звучит начальная задача?

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

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

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

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

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

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

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

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

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

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

14 часа назад, Дмитрий Мамедиев сказал:

Собираю программу на что пишет:
id returned 1 exit status
Находится в collect2.exe
Чего он хочет не могу понять.

Имхо, для решения задачи слишком мало исходных данных: на чем пишешь, в чем собираешь, в какой строке исходника ошибка?

А вообще: гугл говорит, что в коде есть недопустимые символы. Скорее всего копипастил код из браузера?

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



Имхо, для решения задачи слишком мало исходных данных: на чем пишешь, в чем собираешь, в какой строке исходника ошибка?
А вообще: Скорее всего копипастил код из браузера?

Да. Но с некоторыми изменениями от себя. Работаю в атмелтстудио 7. Строка 0!
Ссылка на комментарий
Поделиться на другие сайты

1 минуту назад, Дмитрий Мамедиев сказал:

Строка 0!

Так надо было  не номер строки указать, а саму строку написать. :lol:

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

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




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

Не помогло



Так надо было  не номер строки указать, а саму строку написать.

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

@Дмитрий Мамедиев , проект выложи сюда.

 

1 час назад, Lerik-Co сказал:

Отсюда вопрос: это мой косяк или косяк протеуса?

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

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

#include "main.h"

#define sbi(x, y)  (x |= (1 << y))   /*set Register x of y*/
#define cbi(x, y)  (x &= ~(1 <<y ))  /*Clear Register x of y*/      
#define uchar   unsigned char
#define uint   unsigned int
      //Defined HT1621's command (обозначим команды)
#define  ComMode    0x52  //4COM,1/3bias  1000    010 1001  0 
#define  RCosc      0x30  //встроенный RC-генератор (включено по умолчанию)1000 0011 0000
#define  LCD_on     0x06  //on LCD
#define  LCD_off    0x04  //off LCD
#define  Sys_en     0x02  //включаем системный осцилятор дисплея 1000   0000 0010
#define  CTRl_cmd   0x80  //записываем control cmd
#define  Data_cmd   0xa0  //записываем data cmd  
   // //  назначаем порты   HT1621 data port
#define CS   2  //это ss в атмеге8 порт PB2
#define WR   5  //sck PB5
#define DATA 3  //mosi PB3
#define CS1    (PORTB|=(1<<2))
#define CS0    (PORTB&=~(1<<2))//digitalWrite
#define WR1    (PORTB|=(1<<5))
#define WR0    (PORTB&=~(1<<5))
#define DATA1  (PORTB|=(1<<3))
#define DATA0  (PORTB&=~(1<<3))

/*void SPI_init(void)
{
    DDRB |= ((1<<PORTB2)|(1<<PORTB3)|(1<<PORTB5)); //ножки SPI на выход
    PORTB &= ~((1<<PORTB2)|(1<<PORTB3)|(1<<PORTB5)); //низкий уровень
    SPCR |= (1 << SPE) | (1 << MSTR)| (1<<SPR0);//включим шину, объ¤вим ведущим, делитель 16
}

void SPI_SendByte (char byte)
{
    SPDR = byte;
    while (!(SPSR & (1 << SPIF)));
}*/

char dispnum[6]={0x00,0x00,0x00,0x00,0x00,0x00};

/*0,1,2,3,4,5,6,7,8,9,A,b,C,c,d,E,F,H,h,L,n,N,o,P,r,t,U,-, ,*/   

//const char num[]={0x7D,0x60,0x3E,0x7A,0x63,0x5B,0x5F,0x70,0x7F,0x7B,0x77,0x4F,0x1D,0x0E,0x6E,0x1F,0x17,0x67,0x47,0x0D,0x46,0x75,0x37,0x06,0x0F,0x6D,0x02,0x00,};

const char num[]={0xD7,0x50,0xE3,0xF1,0x74,0xB5,0xB7,0xD0,0xF7,0xF5,0xF6,0x37,0x87,0X23,0X73,0XA7,0XA6,0X76,0X36,0X07,0XD6,0XE6,0X22,0X27,0X57,0X20,0x00,};

       /**-------------------------------------------------------------------------
                      Name: SendBit_1621(отправлять данные)
      ---------------------------------------------------------------------------*/
void SendBit_1621(uchar sdata,uchar cnt) //Первый бит
      {
       uchar i;
       for(i=0;i<cnt;i++)
             {
              WR0;
              _delay_ms(20);
              if(sdata&0x80) DATA1;
              else DATA0;
              _delay_ms(20);
              WR1;
              _delay_ms(20);
              sdata<<=1;
              }
        _delay_ms(20);
      }
      /**-------------------------------------------------------------------------
                        Name: SendCmd(отправлять cmd)

                        //Запись MODE «100» и 9 бит команды
      ---------------------------------------------------------------------------*/
      void SendCmd_1621(uchar command)
      {
      CS0;
      SendBit_1621(0x80,4);   
      SendBit_1621(command,8); 
      CS1;                   
      }
      /**-------------------------------------------------------------------------
                        Name: Write_1621 отправлять data and cmd)
      ---------------------------------------------------------------------------*/
      void Write_1621(uchar addr,uchar sdata)
      {
       addr<<=3;
       CS0;
       SendBit_1621(0xa0,3);     //запись MODE“101”
       SendBit_1621(addr,6);     //запись addr high 6 bits
       SendBit_1621(sdata,8);    //запись data  8 bits
       CS1;
      }
      /**-------------------------------------------------------------------------
                                Name: all_off(Clear Display)
      ---------------------------------------------------------------------------*/
      void HT1621_all_off(uchar num)
      { uchar i;
        uchar addr=0;
        for(i=0;i<num;i++)
                       {
                         Write_1621(addr,0x00);
                     addr+=1;
                    }
      }
      /****************************************************************************
                                Name: all_on(All lit)
      ****************************************************************************/
      void HT1621_all_on(uchar num)
      { uchar i;
        uchar addr=0;
        for(i=0;i<num;i++)
                { Write_1621(addr,0xff);
                addr+=1;
                }
      }    
        /****************************************************************************
                                Name: all_on_num(All lit,Display the same number)
      ****************************************************************************/
      void HT1621_all_on_num(uchar num,uchar xx)
      { uchar i;
        uchar addr=0;
        for(i=0;i<num;i++)
                { Write_1621(addr,xx);
                addr+=1;
                }
      }
      /****************************************************************************
                                Name: Init_1621(initialize 1621)
      *****************************************************************************/
      void Init_1621(void)
      {
       SendCmd_1621(Sys_en);
       SendCmd_1621(RCosc);   
       SendCmd_1621(ComMode); 
       SendCmd_1621(LCD_on);
      }
      /****************************************************************************
                                Name: LCDoff(off 1621)
      *****************************************************************************/
      void LCDoff(void)
      { 
       SendCmd_1621(LCD_off); 
      }
      /****************************************************************************
                                Name: LCDon(on 1621)
      *****************************************************************************/
      void LCDon(void)
      { 
       SendCmd_1621(LCD_on); 
      }
void displayallnum(unsigned int n)       //Display all digital characters
{        
    uchar i,j;
    uchar addr=0;
        for(i=0;i<n;i++)
                       { for(j=0;j<27;j++)
                         {
                         Write_1621(addr,num[j]); 
                         _delay_ms(100) ;
                         }
                         addr+=1;
                       }

//By-bit display 8 characters and decimal point

void displayall8(void)

{uchar i;
    HT1621_all_off(16);
    for(i=0;i<16;i++)
       {
    Write_1621(i,0b11110111);
    _delay_ms(50) ;
       }
}
 /****************************************************************************
   Name: displaydata(unsigned long int t) Display  data

   t : Data to be displayed
*****************************************************************************/
void displaydata(unsigned long int t)

{uchar i;
dispnum[5]=num[t/100000];
dispnum[4]=num[(t/10000)%10];
dispnum[3]=num[(t/1000)%10];
dispnum[2]=num[(t/100)%10];
dispnum[1]=num[(t/10)%10];
dispnum[0]=num[t%10];

for(i=0;i < 6 ;i++)
     {
        Write_1621(i,dispnum);
     }
}  

void setup()
{
    DDRB|=(1<<CS)|(1<<WR)|(1<<DATA);//CS,WR,DATA на выход
  /* pinMode(CS, OUTPUT); //Pin 2
   pinMode(WR, OUTPUT); //Pin 5
   pinMode(DATA, OUTPUT); //Pin 3*/
}

void loop()
{
     long int t=0;
     uchar i;
     _delay_ms(50) ;
     Init_1621() ;
    HT1621_all_on(16) ;
    _delay_ms(300) ;
    HT1621_all_off(16);
    _delay_ms(300) ;
    HT1621_all_on(16) ;
    _delay_ms(300) ;
    HT1621_all_off(16);
    _delay_ms(300) ;
for(i=0;i<27;i++)
   {
     HT1621_all_on_num(16,num);
     _delay_ms(200) ;
     HT1621_all_off(16);
   }
    

while(1)
    {
    //display 0 to 99999

   for(t=0;t<99999;t++)
   {    
     displaydata(t);
     _delay_ms(100) ;
    }
  //displaydata : "0 1 2 3 4 5 6 7 8 9 A b"
   //for(i=0;i < 16 ;i++)
//{
  //Write_1621(i,num);
//}
//displaybihua();
//_delay_ms(1000);
  }
}
вот мои каракули. это было написано под ардуино и на сколько знаний хватило переделал. но вроде все исправил да пишет id returned 1 exit status/collect2.exe

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

5 часов назад, Дмитрий Вас сказал:

вот мои каракули.

если это main.c , и в нем описаны все переменные и функции , что тогда лежит в main.h, накой он нужен и существует ли он вообще?

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

В 13.03.2018 в 12:02, Lerik-Co сказал:

Отсюда вопрос: это мой косяк или косяк протеуса? Что я делаю не так?

И всё таки это оказался косяк протеуса: собранная в железе на макетке схема работает правильно.

PB0 (ножка №5) - Подали питание:

IMG_20180314_120141.thumb.jpg.1f4345055e7418d376b3b7556b06da14.jpg

 

PB1 (ножка №6) - Нажали Reset

IMG_20180314_120300.thumb.jpg.b181d9943e0f9f4b5c44a53944319cfd.jpg

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

Здравствуйте. Помогите с вопросом. Есть скетч написанный в Arduino IDE для Atmega328, прочитал, что можно прошивать с помощью ардуино уно микроконтроллеры ATtiny45.

Возможно ли прошить ATtiny45 данным скетчем? Просто вычитал, что не все функции поддерживаются.

Скетч прилагаю:

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

#include <EEPROM.h>

#define Led (3)
#define button 8

#define gab 13      

int ledState;       //яркость светодиода 4 режима
int regim=1;     // режимы яркости светодиода
int address = 0;
int value;    //яркость светодиода в лоопе


void setup (){
 pinMode(Led, OUTPUT);
 pinMode(button, INPUT);
 pinMode(gab, INPUT);
   EEPROM.get(address, ledState);

attachInterrupt(0, Regul, FALLING);
}


void Regul()
  {
    regim++;
    if (regim > 5)
      regim = 1;
    switch(regim)
    {
      case 1:
        ledState = 10;
        break;
      case 2:
        ledState = 25;
        break;
      case 3:
        ledState = 50;
        break;
      case 4:
        ledState = 75;
        break;
      case 5:
        ledState = 95;
    }
    analogWrite(Led, ledState);
    EEPROM.put(address, ledState);
  }


void loop(){

    if ((digitalRead(button) == HIGH)&&(digitalRead(gab) == LOW)&&(value<=0)) //если кнопка вкл нажата, кнопка выключения нет и светодиод не горит
      {
          for (value = 0; value <= ledState; value += 2) //плавно прибавляем яркость
        {
          analogWrite(Led, value);
          delay(20);
         }
      }
 
      else if ((digitalRead(button) == LOW)&&(digitalRead(gab) == HIGH)&&(value>=ledState))
      {
          for (value = ledState; value >= 0; value -= 2)
      {
            analogWrite(Led, value);
            delay(20);
       }
       }

      if ((digitalRead(gab) == HIGH)&&(value>=ledState))
       {
      for (value = ledState; value >= 0; value -= 2)
        {
            analogWrite(Led, value);
            delay(20);
          }
      }

        if ((digitalRead(button) == LOW)&&(value>=ledState))
        {
         for (value = ledState; value >= 0; value -= 2)
        {
            analogWrite(Led, value);
            delay(20);
        }
        }

}

 

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

1 час назад, matrixk сказал:

… можно прошивать с помощью ардуино уно микроконтроллеры ATtiny45

  Показать содержимое

А в этом случае точно нужен скетч,а не hex-файл?

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

Врятли это будет тривиальным.

Скетч прошить конечно можно будет, но для этого нужно выцепить готовый HEX-файл, в который скомпилируется этот скетч и перед этим ещё указать компилятору что надо компилировать для ATtiny45 а не Atmega328 которую он видит. Но тут возникает вопрос "АНАФИГА" козе боян? Эти манипуляции уже как бы выше идеологии ардуино, там недалеко уже и до студии, чистого Си и обычного программатора.

Учение - изучение правил. Опыт - изучение исключений.

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

3 часа назад, Alexeyslav сказал:

перед этим ещё указать компилятору что надо компилировать для ATtiny45 а не Atmega328 которую он видит. Но тут возникает вопрос "АНАФИГА" козе боян? Эти манипуляции уже как бы выше идеологии ардуино, там недалеко уже и до студии, чистого Си и обычного программатора.

В Arduino IDE скачал файл, чтоб он мог прошивать ATtiny45, нашел информацию как прошить. Просто я изучал язык (самоучка) именно для ардуино, но тут возникла задача уменьшить размер контроллера, по объему памяти подходит ATtiny45. На чистом Си вряд ли смогу переписать, поэтому и хочу попробовать залить данный скетч в ATtiny45. Но я еще не покупал ATtiny45, вот и советуюсь есть смысл заморачиваться?

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

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

Учение - изучение правил. Опыт - изучение исключений.

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

1 hour ago, Alexeyslav said:

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

Существует несколько Ардуин на ATtiny85, изменя в скетче будут небольшие. А в ATtiny45 он работать наверно не будет, у них отличается объем памяти. Лучше покупать ATtiny85.

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

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

Поэтому более правильный ардуино-путь это взять ATTINY85, прошить в него ардуиновский загрузчик вашим скетчем и работать далее с ним как с обычной ардуиной напрямую. Места там останется как раз на уровне  ATTINY45...

Учение - изучение правил. Опыт - изучение исключений.

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

Скажите а как мне в _delay_ms(x): поестить переменную x типа Integer допустим ранее я обьявил unsigned short int x;  и присвоил значение 

x = 0x3E8; //1000

выдаёт ошибку при компиляции
Error        __builtin_avr_delay_cycles expects a compile time integer constant   

Получается нельзя поместить в _delay_ms() свою переменную ?

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

void main_delay(uint16_t x)

{

for(uint16_t i=x; i>0; i--)

 _delay_ms(1);
//_delay_us(950);
}

_delay принимает только const, выше простая функция которая позволит делать разные задержки

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

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

Если программа написанна в ардуино, я смогу и как, залить ее в атмегу 8 без ардуино платформы?

 

Короче как залить в атмегу 8 ардуино скетч с помощью usbasp.

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

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

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

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

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

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

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

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

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

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

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

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