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

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


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

Здравствуйте! Нужна помощь начинающим. Пытаюсь изучить uart но ,что то не понимаю . 

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


#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "pin_macros.h"
unsigned char data;
unsigned long long vrema;
 unsigned char a=1;
#define Pin4 C,4,H
#define Pin5 C,5,H
#define Pin3 C,3,H
#define Pin2 C,2,L
#define Pin1 C,1,H
#define Pin0 C,0,H
unsigned char status, status1;
unsigned char *pstatus;
unsigned char i = 0;


//*** Инициализация UART ***//
void uart_init(void)
    {
        //скорость обмена данными
        UBRRH = 0;  //старший байт
        UBRRL = 51; //младший байт
        //8 бит данных, 1 стоп бит, без контроля четности
        UCSRC = ( 1 << URSEL ) | ( 1 << UCSZ1 ) | ( 1 << UCSZ0 );
        //разрешить прием и передачу данных
        UCSRB = ( 1 <<RXEN )|(1<<RXCIE) |( 1 << TXEN ) |  (1<<TXCIE);//|( 1 << UDRIE )
		//UCSRB |= (1<<RXCIE) | (1<<TXCIE); //Разрешаем прерывание при передаче 
		DRIVER(Pin4,OUT);
		DRIVER(Pin5,OUT);
		DRIVER(Pin3,IN);
		DRIVER(Pin2,IN);
		DRIVER(Pin1,IN);
		DRIVER(Pin0,IN);
		DRIVER(Pin3,PULLUP);
		DRIVER(Pin2,PULLUP);
		DRIVER(Pin1,PULLUP);
		DRIVER(Pin0,PULLUP);

} 
ISR(USART_RXC_vect) 

{ 

	data=UDR;
	 
} 
/*
ISR(USART_TXC_vect){

//UDR = data;

}

		*/
ISR( USART_UDRE_vect )		
		{


				}
		
		
    

//*** Прием данных по UART ***///*
/*unsigned char uart_receive(void)
    {
        while ( ! ( UCSRA & ( 1 << RXC )));
        return UDR;
		a=2;
    }*/

//*** Передача данных по UART ***//
void uart_transmit( uint8_t data)
    {
        while ( ! ( UCSRA & ( 1 << UDRE )));
		
		UDR = data;
	 	a=0; 
    }
//———————————————

void timer_ini(void)

{
		TCCR1B |= (1<<WGM12); // устанавливаем режим СТС (сброс по совпадению) 
		TIMSK |= (1<<OCIE1A); //устанавливаем бит разрешения прерывания 1ого счетчика по совпадению с OCR1A(H и L) 
		OCR1A = 7812;//OCR1AL = 0b00000000;//OCR1AH = 0b10000000; //записываем в регистр число для сравнения 
		TCCR1B = (1<<CS12)|(1<<CS10)|(1<<WGM12);//установим делитель.         // Start Timer1 with prescaler 1024
}

ISR (TIMER1_COMPA_vect) 

{  

}
//*** Главная программа ***//
int main(void)
{    pstatus=&status;
    DDRD = 0x00;    //установим все порты DDRD как входы
    PORTD = 0x00;   //установим логический 0 на все порты DDRD
    
  sei();// разрешаем прерывания
    uart_init();
    timer_ini();
    while(1)
        {
			vrema++;
			if(vrema>=10000){
				a=2;
				//data++;
				vrema=0;}
				
		         
            if(data==0b00110001)
            {
              ON(Pin5); // PORTC |= 1 << 5;    //устанавливаем логическую 1 на порт PC5 регистра DDRC
			  data='8';
            }
            if(data==0b00110010)
            {
               OFF(Pin5); //PORTC &= ~(1 << 5); //устанавливаем логический 0 на порту PC5 регистра DDRC
            }

            if(data==0b00110011)
            {
               ON(Pin4); //PORTC |= 1 << 4;    //устанавливаем логическую 1 на порт PC4 регистра DDRC
            }
            if(data==0b00110100)
            {
                OFF(Pin4);//PORTC &= ~(1 << 4); //устанавливаем логический 0 на порту PC4 регистра DDRC
            }
			
			if(a==2){
		
            uart_transmit(data);
			} 
				
				
			 }										   
}

 

atmega8 уарт.rar

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

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

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

Подскажите плиз где я не понимаю )

#define LCD_DATA_PORT GPIOA

#define LCD_DATA_PIN_0 GPIO_Pin_9
#define LCD_DATA_PIN_1 GPIO_Pin_10
#define LCD_DATA_PIN_2 GPIO_Pin_11
#define LCD_DATA_PIN_3 GPIO_Pin_12

#define LCD_DATA_HI(b) (LCD_DATA_PORT->BSRR |= (b & 0b1 ? LCD_DATA_PIN_0 : 0) | (b & 0b10 ? LCD_DATA_PIN_1 : 0) | (b & 0b100 ? LCD_DATA_PIN_2 : 0) | (b & 0b1000 ? LCD_DATA_PIN_3 : 0))
void LCDClear()
{
	LCDSendByte(0x01, 0);
	delay_ms(2);
    LCDSendByte(0x02, 0);
    delay_ms(2);
}

void LCDStrob()
{
    LCD_EN_HI();
    delay_us(40);
    LCD_EN_LOW();
}

void LCDSendByte(char ByteToSend, int IsData)
{
    LCD_DATA_CLEAR();
    LCD_DATA_HI((ByteToSend & 0xF0) >> 4);

    if (IsData == 1)
        LCD_RS_HI();
    else
        LCD_RS_LOW();
    LCDStrob();

    delay_us(40);

    LCD_DATA_CLEAR();
    LCD_DATA_HI(((ByteToSend & 0x0F)));

    if (IsData == 1)
        LCD_RS_HI();
    else
        LCD_RS_LOW();

    LCDStrob();

    delay_us(40);

    LCD_DATA_CLEAR();
}

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

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


file-1569825152767-1.jpg

Pic2.jpg

Pic1.jpg

gDmNOiDL3jg.jpg

 

 

LCD_DATA_PORT->BSRR |= (b & 0b1 ? LCD_DATA_PIN_0 : 0) | (b & 0b10 ? LCD_DATA_PIN_1 : 0) | (b & 0b100 ? LCD_DATA_PIN_2 : 0) | (b & 0b1000 ? LCD_DATA_PIN_3 : 0)

так делал потому что ноги не подряд шли на другой платке)

Вынес в заголовочный файл для более удобного переноса.

Этот код прекрасно работал. Но вот сейчас не работает) То есть при отправке 0x01 должно выполнится условие b & 0b1 и в регистр записаться значение из GPIO_Pin_9

Но пишет GPIO_Pin_12 то есть выполняется b & 0b1000 ? LCD_DATA_PIN_3

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

Простите) вопрос снят)) я не верно график смотрел)) конец графика это и есть начало)

 

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

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

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

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

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

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

Товарищи, такой вопрос :

насколько я понял , приставка 0х   означает что далее следует 16-ричное число. ( например 0х1F , где 1F и есть данное число.), но например в скетче модуля NRF24 есть строка  : "radio.openWritingPipe(0x0123456789LL);     // Задаем идентификатором 0x0123456789LL для передачи данных"

вопрос в том почему там есть буква "L", если максимально допустимая F, и на каком основании ( из каких соображений) вообще задается этот идентификатор ?

 

ps- скетч передачи данных для ARDUINO 

Изменено пользователем zoom-0

好奇心不是缺点,而是一个知识的来源。

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

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

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

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

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

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

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

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

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

То есть если число в десятичной ( например больше 32000) мы приписываем L
а вторая L зачем ? long long ( long2 ).

И как образуется само число ? в разных скетчах оно разное.
например const uint64_t pipes[6] = { 0xF0F0F0F0D2LL, 0xF0F0F0F0E1LL, 0xF0F0F0F0E2LL, 0xF0F0F0F0E3LL, 0xF0F0F0F0E4LL, 0xF0F0F0F0E5LL };

на основе чего оно образуется ? Посмотрел внутри библиотеку, но  не увидел там например "min  max".

Где-нибудь есть полное описание библиотеки rf24  /  nrf24l01  ?  все что есть в интернете, это просто примеры , а описания нифига нет :(

好奇心不是缺点,而是一个知识的来源。

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

19 минут назад, zoom-0 сказал:

а вторая L зачем ? long long ( long2 ).

так определяется число этого:

uint64_t

типа. Это НЕ библиотека это основы языка С. long -это 4 байта на число,

long long -это 8 байт на число (это не в квадрате, это умножить на 2 :)

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

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

1 час назад, zoom-0 сказал:

все что есть в интернете, это просто примеры , а описания нифига нет :(

учебник по языку Си религия запрещает читать? гугл - > Полный справочник по C -  Глава 02 -> Базовые типы данных , Константы

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

Спасибо, пошел в гугловский читальный зал :)

пс/ а как в "репу" плюсануть ? 

только не отправляйте в гугл и в правила форума :)

好奇心不是缺点,而是一个知识的来源。

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

  • 1 месяц спустя...

Подскажите, на такой вопрос. Есть некая линия, пусть будет 1-4, в ней выводы с делителей назовем 2 и 3. Если на мк задействовать 4 контакта под ацп не привязанный к земле. Показания нужно снимать с 1-2 и 3-4. Какое ограничение по напряжению между 1-4 есть в мк, если они как бы не взаимодействуют между собой,  и как это называется в документации, и что если 4 является землёй?

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

3 часа назад, Анатолий Андронович сказал:

ацп ... Какое ограничение по напряжению

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

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

Не совсем понимаю. Получается на любой ноге мк напряжение не должно превышать напряжение питания мк относительно земли мк?
 А если используется дифференциальный ацп и линия с которой нужно снимать данные имеет отдельную землю? 
Для наглядности картинка, показания нужны между 1и2, и 3и4. 
Или есть ограничение по напряжению между любыми входами мк, даже если они, как бы не взаимодействуют между собой?
 

IMG_20191124_121247.jpg

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

16 минут назад, Анатолий Андронович сказал:

 А если используется дифференциальный ацп и линия с которой нужно снимать данные имеет отдельную землю? 

да пофиг, напряжение на входах АЦП не может превышать напряжение питания МК относительно аналоговой земли МК.

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

С учетом нарисованной схемы - разница напряжений на ногах МК составит 160 вольт. Умрет.
Если нужно менять именно разницу напряжения на верхнем и нижнем резисторе - проще поставить делители и мерять данные уже после них.

Текущий сетап: BBB-AD-H6.1-Nataly2014-AudioPro

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

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

относительно аналоговой земли МК

Теперь более менее дошло.
Начал читать по мк, и получил непонятку.
Сложилось впечатление, что если входы мк переключаются мультиплексором, и будучи дифференциальными, не связываются с землей мк. А линия с которой нужны показания тоже не завязана с землёй мк.  То при подключении этих входов мультиплексором по отдельности в разные такты делает их как бы не связанных между собой. И имея опорное напряжение тоже отдельно от земли мк, разница потенциалов между входами мк, которые как бы одновременно не задействованы могла быть достаточно большой.
Вопрос был гипотетический, для примера.
Читаю дальше. Благодарю за пояснение.
 

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

внутренние схемы МК имеют связь с "землей".

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

поэтому на любом входе напряжение не может быть больше напряжения питания.

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

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

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

  • 2 недели спустя...

Пару дней назад решил начать изучать ардуино, ибо всю свою сознательную жизнь я собирал устройства на мелкой логике. Но тут вот приспичило. А именно мне нужно как то осуществить такой проект. Есть для начала 2 сдвиговых регистра 74НС595 и есть ардуино уно р3

Собрал схему на рисунке

Shift-Register-74HC595_bb.png.5cab5720e2d07f1e01deb26a9b4c87f3.png

Вот скетч к ней

int dataPin  = 9;   //Пин подключен к DS входу 74HC595
int latchPin = 10;  //Пин подключен к ST_CP входу 74HC595
int clockPin = 11;  //Пин подключен к SH_CP входу 74HC595

void setup() {
  //устанавливаем режим OUTPUT
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);

  digitalWrite(latchPin, LOW);                        // устанавливаем синхронизацию "защелки" на LOW
  shiftOut(dataPin, clockPin, LSBFIRST, B01001100);   // передаем последовательно на dataPin
  digitalWrite(latchPin, HIGH);                       //"защелкиваем" регистр, тем самым устанавливая значения на выходах
}
 
void loop() {

}

На светодиодах высветилась комбинация 01001100. Ура, моя первая схема на микроконтроллере работает.
Далее дополнил схему ещё одним регистром сдвига, и добавил ещё 8 светодиодов.

Shift-Register-74HC595_02_bb.jpg.cda5d505e4a509e7b58c36a94fb9cc3b.jpg

 

И его скетч

int dataPin  = 9;   //Пин подключен к DS входу 74HC595
int latchPin = 10;  //Пин подключен к ST_CP входу 74HC595
int clockPin = 11;  //Пин подключен к SH_CP входу 74HC595

void setup() {
  //устанавливаем режим OUTPUT
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);


  digitalWrite(latchPin, LOW);                        // устанавливаем синхронизацию "защелки" на LOW
  // начинаем "продавливать" данные по цепочке регистров, начиная с последнего
  shiftOut(dataPin, clockPin, LSBFIRST, B01001100);   // передаем последовательно на dataPin - в первом регистре значение B01001100
  shiftOut(dataPin, clockPin, LSBFIRST, B10000111);   // "продавливаем" данные в следующий регистр - в первом регистре B10000111, во втором - B01001100
  // и т.д. по количеству регистров
  digitalWrite(latchPin, HIGH);                       //"защелкиваем" регистр, тем самым устанавливая значения на выходах
}
 
void loop() {
}


Теперь на 16 светодиодах 01001100 10000111
Но мне надо чтоб был массив из десятка или двух вот таких двух байтовых комбинаций, и чтоб можно было каждую комбинацию выводить на светодиоды нажатием кнопки. То есть нажал кнопку, высветилась первая двухбайтовая комбинация на этих 16 светодиодах, нажал ещё раз, высветилась следующая , и так далее по порядку. Скетч подключения кнопки тоже нашёл интернете

// пины подключенных устройств
int switchPin = 8;
int ledPin = 11;

// переменные для хранения состояния кнопки и светодиода
boolean lastButton = LOW;
boolean currentButton = LOW;
boolean ledOn = false;

void setup() {
   pinMode(switchPin, INPUT);
   pinMode(ledPin, OUTPUT);
}

// функция для подавления дребезга
boolean debounse(boolean last) {
   boolean current = digitalRead(switchPin);
   if(last != current) {
      delay(5);
      current = digitalRead(switchPin);
   }
   return current;
}

void loop() {
   currentButton = debounse(lastButton);
   if(lastButton == LOW && currentButton == HIGH) {
      ledOn = !ledOn;
   }
   lastButton = currentButton;
   digitalWrite(ledPin, ledOn);
}

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

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

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

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

Привет знатоки) Есть китайский показометр VC-288 на контроллере NUVOTON N76E003AT20 и он жутко тормознутый, тоесть показания меняються очень медленно. Можно ли его подключить к компу и подправить прошу? Походу и программатор надо, которого нету. Или выкинуть его? :D

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

56 минут назад, Дмитрий Вас сказал:

измеряю напряжение через ацп мк. почему показания прыгают?

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

Перед выводом на индикатор надо обязательно фильтровать значения.

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

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

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

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

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

странно что раньше работало и вот опять. теперь даже в протеусе не работает.

//задаем канал и получаем значение ацп
unsigned int ADC_read(unsigned char chanel)
{
	ADMUX&=0xF0;//обязательно обнуляем канал
	ADMUX|= chanel&0x0F;//задаем канал
	ADCSRA |= (1<<ADSC); // запуск преобразования
	while(0==(ADCSRA&(1<<ADIF))) continue;// ждем окончание преобразования АЦП
	//когда преобразование завершено ADIF устанавливается в 1 и мы его сбрасываем в 0
	return ADC;//получаем значение ацп
}
//вычисляем значение напряжения
unsigned int ADC_voltage(unsigned int value)
{
	static unsigned int ADC_value;//переменная суммы измерений
	static unsigned char count;//переменная суммы количества измерений
	ADC_value+=value;//складываем ADCW 64раза
	if (count==64)//если прошло 64 измерения
	{
		volt=(ADC_value*256L)>>16;//2,56 опорное 
		//сдвигая на >>16 получаем 8 бит 
		count=0;
		ADC_value=0;
	}
	else
	{
		count++;
	}
	return volt;
}

вот так вывожу на экран

lcd_gotoxy(0,0);
lcd_chisla(ADC_voltage(ADC_read(5)));

может кто увидит ошибку

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

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

//когда преобразование завершено ADIF устанавливается в 1 и мы его сбрасываем в 0

А где же сам сброс?

Как-то сложновато выходит с ADIF:  у вас же есть ADSC, который сам падает по завершению, почему бы не делать так:

ADCSRA |= _BV(ADSC);
while(ADCSRA & _BV(ADSC));
// результат тот же, а писанины меньше и шансов ошибиться тоже меньше

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

#define FILTR_DEPTH	32
  
int filtr(int data){
  static int buf[FILTR_DEPTH];
  static uint8_t pos;
  int16 result = 0;
  
  buf[pos++] = data;
  if(pos >= FILTR_DEPTH) pos = 0;
  
  for(uint8_t i=0; i<FILTR_DEPTH; i++)
    sum += buf[i];
  
  return sum / FILTR_DEPTH;
}

FILTR_DEPTH чем больше, тем сильнее фильтрация. Желательно выбирать значение равным степени 2: 4, 8, 16, 32 или 64, больше 64 смысла нет.

Кстати, функцию ADC_read можно ускорить: цикл ожидания завершения преобразования перенести в самое начало, а запускать преобразование в самом конце:

while(ADCSRA & _BV(ADSC)); // ждем завершения преобразования
int result = ADC; // запоминаем результат
ADCSRA |= _BV(ADSC); // запускаем преоразование
return result; // выдаем результат

Пока вы там будете выводить на ЖКИ, АЦП у вас будет делать замер, и к следующему обращению результат уже будет готов, ждать не придется.

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

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

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

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

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

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

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

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

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

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

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

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

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