Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.96/89: Рейтинг темы: голосов - 89, средняя оценка - 4.96
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580

Usbasp и Atmel AT89C51ED2

05.01.2016, 11:29. Показов 19594. Ответов 189
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток, подскажите пожалуйста на работу коллега принес usbasp заказанный в китае https://encrypted-tbn0.gstatic... NCR1lFBZkQ И принес списанный прибор, на борту которого чип Atmel AT89C51ED2, можно ли через данный программатор залить прошивку в данный чип ? если можно то подскажите как и чем ? потому как программатор не видит кристалл. Использовал программу avrdudeprog и SinaProg в списке данного кристалла не наблюдаю. Помогите пожалуйста разобраться с этим чудом. Всем спасибо
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.01.2016, 11:29
Ответы с готовыми решениями:

Чем программировать AT89C51ED2
У деда жены откопал на антресолях кучу AT89C51ED2. Хочу применить это чудо по назначению, но не знаю чем его программировать и какой...

Выполнение кода из внешней EEPROM (ASM, AT89C51ED2)
Задача: Необходимо в память (EEPROM) записать исполняющий код (не важно что он делает),который будет выполняться при включении...

Реверсинг "Эталон-01" на базе AT89C51ED2... или вопросы компетентности и степени жадности
Доброго времени суток. Моя проблема заключается в следующем. Работаю программистом ПЛК(только начинаю, только устроился). Дали задание: ...

189
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
10.01.2016, 21:42
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Dostik Посмотреть сообщение
я до этого тоже пока не дошел.
информации в интернете навалом
вот например, ознакомься
http://www.computer-museum.ru/... timers.htm
http://www.labfor.ru/guidance/mpu-leso1/4
http://de.ifmo.ru/bk_netra/pag... 62&layer=1
1
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
10.01.2016, 21:51
Цитата Сообщение от Dostik Посмотреть сообщение
У него вообще нет ЦАП
ЦАП мало у кого есть
Цитата Сообщение от ValeryS Посмотреть сообщение
второй таймер программируешь на 50 Гц
и таймеры у нас закончились
Цитата Сообщение от Dostik Посмотреть сообщение
Показал как задержки делать самому
стоп, стоп, стоп. Витальич только микросекундные задержки делает без таймеров , а миллисекундные или больше только таймер!!!
1
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580
10.01.2016, 21:58  [ТС]
Цитата Сообщение от Витальич Посмотреть сообщение
и таймеры у нас закончились
их же вроде всего два на данном чипе да ?
Цитата Сообщение от Витальич Посмотреть сообщение
стоп, стоп, стоп. Витальич только микросекундные задержки делает без таймеров
я об этом и говрю
Цитата Сообщение от Витальич Посмотреть сообщение
а миллисекундные или больше только таймер!!!
Само собой. Спасибо
ValeryS, Спасибо большое пойду читать.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
10.01.2016, 23:22
Цитата Сообщение от Витальич Посмотреть сообщение
и таймеры у нас закончились
не совсем
это у классического ядра 2 таймера 0 и 1
а у продвинутого появляется еще один таймер2

можно конечно создать на одном физическом несколько логических таймеров, но это уже не начинающий уровень
1
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580
10.01.2016, 23:24  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
можно конечно создать на одном физическом несколько логических таймеров, но это уже не начинающий уровень
я до этого в скором времени доберусь ... главное вникнуть что умеет мой мк, как обращаться с ним на уровне и тогда все будет very good
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
10.01.2016, 23:24
Dostik, а вообще у 51 слишком много ограничений, а что ты хочешь ядру уж за 30 лет
почему не начать с более современных камней, с той же STM например, причем она тупо дешевле
1
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580
11.01.2016, 00:10  [ТС]
ValeryS, аналогично посоветовал мне сделать и Витальич, этот мк есть на работе, плюс я сделал кирпич прибора , случайно стерев прошивку его , пока едет моя Arduino в которой я немного разочаровался, следующей моей покупкой будет приобретение STM32F7, но еще проконсультируюсь с вами и Витальич, а для развития я думаю лишнем не будет, разрешили данный прибор использовать для своих целей увидев что у меня что-то получается, сразу посыпались идеи коллег использовать данный мк для своих нужд и т.д , а себе я такой камушек приобретать не буду.

Добавлено через 1 минуту
Чучуть не понял как работать с таймером, а точнее как его объявлять, сделал так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void My_Timer (){
 
TH0 = 62036 >> 8 ;// заносим старший байт числа 62036
TL0 = 62036;      // заносим младший байт числа 62036
TCON_bit.TR0 = 1;          // запускаем таймер
while (!TCON_bit.TF0);     // ждем переполнения таймера
static unsigned char tmp=0;
if(tmp>256)
 P2_bit.P2_4 =0;
else
P2_bit.P2_4 =1;
tmp++;
TCON_bit.TF0 = 0;         // обнуляем флаг переполнения  
}
и объявил функцию в main но ничего не происходит. Что я сделал не так ?

Добавлено через 1 минуту
Цитата Сообщение от Dostik Посмотреть сообщение
while (!TCON_bit.TF0); * * // ждем переполнения таймера
Думаю ошибка таится здесь

Добавлено через 2 минуты
ValeryS, Если будет интересно STC 12C5A16AD
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
11.01.2016, 00:30
Цитата Сообщение от Dostik Посмотреть сообщение
Что я сделал не так ?
ну наверное в майн не так вызываешь
покажи майн
далее я не вижу настройки режима таймера
если найду старые проекты для 51 скину сюда
Цитата Сообщение от Dostik Посмотреть сообщение
Если будет интересно STC 12C5A16AD
там я уже был ничего сказать не могу
1
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580
11.01.2016, 00:46  [ТС]
ValeryS,
C
1
2
3
4
5
6
7
8
9
10
11
12
13
int main (void)
{
  
 /**/ /**/
 
 
 My_Timer(); 
 Lcd_init();
 Lcd_Cmd(0x01);
Display_Name();
 
while (1);
}
Добавлено через 12 минут
Переделал немного так :
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void My_Timer (){
TMOD = 0;
TMOD_bit.C_T0 = 0;
TH0 = 62036 >> 8 ;// заносим старший байт числа 62036
TL0 = 62036;      // заносим младший байт числа 62036
TCON_bit.TR0 = 1; // запускаем таймер
while (!TCON_bit.TF0);     // ждем переполнения таймера
static unsigned char tmp=0;
if(tmp>256)
 P2_bit.P2_4 =0;
else
P2_bit.P2_4 =1;
tmp++;         
TCON_bit.TF0 = 0;         // обнуляем флаг переполнения  
}
Результат прежний

Добавлено через 25 секунд
или нужно полностью описывать все что есть ?
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
11.01.2016, 00:53
Цитата Сообщение от Dostik Посмотреть сообщение
My_Timer();
вызывается один раз
а должон в цикле
про все остальное завтра скажу, у меня уже 3 часа ночи

Добавлено через 1 минуту
Цитата Сообщение от Dostik Посмотреть сообщение
static unsigned char tmp=0;
if(tmp>256)
tmp никогда не будет больше 256, предел для чара 255
1
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580
11.01.2016, 01:00  [ТС]
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void My_Timer (){
TMOD = 0;
TMOD_bit.C_T0 = 0;
TH0 = 62036 >> 8 ;// заносим старший байт числа 62036
TL0 = 62036;      // заносим младший байт числа 62036
TCON_bit.TR0 = 1; // запускаем таймер
//while (!TCON_bit.TF0);     // ждем переполнения таймера
static unsigned char tmp=0;
if(tmp>254)
 P2_bit.P2_4 =0;
else
P2_bit.P2_4 =1;
tmp++;         
//TCON_bit.TF0 = 0;         // обнуляем флаг переполнения  
}
 
int main (void)
{
while (1){
My_Timer(); 
Lcd_init();
Lcd_Cmd(0x01);
Display_Name();}
//while (1);
}
Без изменений, да конечно, спасибо вам за помощь и ваше свободное время, до завтра
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
11.01.2016, 09:25
Цитата Сообщение от ValeryS Посмотреть сообщение
а вообще у 51 слишком много ограничений, а что ты хочешь ядру уж за 30 лет
почему не начать с более современных камней, с той же STM например, причем она тупо дешевле
Зря вы так. В последние 2-3 года вышло очень много SOC'ов на 8051м. От TI, Nordic и т.д. По-видимому, не смотря на возраст", платформа показывает себя с хорошей стороны. С кортексами равнять конечно не приходится, но ядро 8051 все еще актуально, имхо.
1
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
11.01.2016, 09:42
Цитата Сообщение от Voland_ Посмотреть сообщение
но ядро 8051 все еще актуально, имхо.
а я и не спорю
каждой задаче свое ядро
но чисто практический интерес
вот цены, в нашем городе, на AT89C51ED2 от 330 до 700 рублей
http://www.promelec.ru/catalog... 59/#123759
http://www.promelec.ru/catalog... 18/#139418
http://www.promelec.ru/catalog... 64/#140364
за те же деньги, даже дешевле, я могу взять STM32F401RCT6
http://www.promelec.ru/catalog... 18/#155718
что намного круче
конечно же для реального проектирования, нужно учитывать условия эксплуатации, 0х51 все таки дубовей
но по моему мнению, держатся за ядро потому что слишком много наработок, и переход на другое ядро дороже выйдет
1
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580
12.01.2016, 09:24  [ТС]

Не по теме:

И вам доброе утро ;)



Добавлено через 10 часов 6 минут
Сделал шим следующим образом :
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void My_Timer (){
TMOD = 1;
while (1){
P2_bit.P2_4 =1;
TH0 = 0x6F; ;     // заносим старший байт числа
TL0 =  0xFF;      // заносим младший байт числа 
TCON_bit.TR0 = 1; // запускаем таймер
 
while (!TCON_bit.TF0);      // ждем переполнения таймера 
TCON_bit.TR0 = 0;          // остановка таймера
TCON_bit.TF0 = 0;         // обнуляем флаг переполнения  
 
P2_bit.P2_4 =0;
TH0 = 0x6F; ;           // заносим старший байт числа 
TL0 = 0xFF;            // заносим младший байт числа 
TCON_bit.TR0 = 1;     // запускаем таймер
 
while (!TCON_bit.TF0);     // ждем переполнения таймера    
TCON_bit.TR0 = 0;         // остановка таймера
TCON_bit.TF0 = 0;        // обнуляем флаг переполнения  
}
}
Но не совсем разобрался как рассчитывать время, для разных интервалов ? Спасибо за помощь

Добавлено через 13 минут
Вот и второй вопрос поспел:
-Как теперь подружить мой шим и дисплей ? работает только что-то одно
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
void Display_Name()
{
 My_Timer ();
 
  char buf[4];
  for (int i=0;i<256;i++) {
 // P2_bit.P2_4 = sin_tab[i];
  sprintf(buf,"%d",sin_tab[i]);
  Lcd_Disp (0x80, buf);
 
  Lcd_Disp (0xC1, "Test");}
}
 
void My_Timer (){
TMOD = 1;
while (1){
P2_bit.P2_4 =1;
TH0 = 350; ;     // заносим старший байт числа 62036
TL0 =  150;      // заносим младший байт числа 62036
TCON_bit.TR0 = 1; // запускаем таймер
 
while (!TCON_bit.TF0);      // ждем переполнения таймера 
TCON_bit.TR0 = 0;          // остановка таймера
TCON_bit.TF0 = 0;         // обнуляем флаг переполнения  
 
P2_bit.P2_4 =0;
TH0 = 350; ;            // заносим старший байт числа 62036
TL0 = 150;             // заносим младший байт числа 62036
TCON_bit.TR0 = 1;     // запускаем таймер
 
while (!TCON_bit.TF0);     // ждем переполнения таймера    
TCON_bit.TR0 = 0;         // остановка таймера
TCON_bit.TF0 = 0;        // обнуляем флаг переполнения  
}
}
int main (void)
{
while (1){
 
Lcd_init();
Lcd_Cmd(0x01);
Display_Name();}
//My_Timer(); }
//while (1);
}
 
void Lcd_init()
{
  Lcd_Cmd (0x38);
  Delay (2);
  Lcd_Cmd (0x0C);
  Delay (2);
  Lcd_Cmd (0x01);
  Delay (2);
  Lcd_Cmd (0x06);
  Delay (2);
}
 
void Lcd_Cmd (unsigned char cmm)
{
  LCD_port = cmm;
  LCD_rs = 0;
  LCD_rw = 0;
  LCD_en = 1;
  Delay (2);
  LCD_en = 0;
}
 
void Lcd_Data (unsigned char ASCII)
{
LCD_port = ASCII;
  LCD_rs = 1;
  LCD_rw = 0;
  LCD_en = 1;
  Delay (2);
 LCD_en = 0;
}
 
void Lcd_Disp (unsigned char Loc, unsigned char *String)
{
  Lcd_Cmd (Loc);
  while (*String)
  {
    Lcd_Data (*String++);
   
  }
}
Добавлено через 7 минут
Переделал так :
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void My_Timer (){
int i = 0;  
TMOD = 1;
while (1){
P2_bit.P2_4 =1;
TH0 = 350; ;     // заносим старший байт числа 62036
TL0 =  150;      // заносим младший байт числа 62036
TCON_bit.TR0 = 1; // запускаем таймер
 
while (!TCON_bit.TF0);      // ждем переполнения таймера 
TCON_bit.TR0 = 0;          // остановка таймера
TCON_bit.TF0 = 0;         // обнуляем флаг переполнения  
 
P2_bit.P2_4 =0;
TH0 = 350; ;            // заносим старший байт числа 62036
TL0 = 150;             // заносим младший байт числа 62036
TCON_bit.TR0 = 1;     // запускаем таймер
 
while (!TCON_bit.TF0);     // ждем переполнения таймера    
TCON_bit.TR0 = 0;         // остановка таймера
TCON_bit.TF0 = 0;        // обнуляем флаг переполнения  
  char buf[4];
  if(i<256) {
 // P2_bit.P2_4 = sin_tab[i];
  sprintf(buf,"%d",sin_tab[i]);
  Lcd_Disp (0x80, buf);
  i++;
Lcd_Disp (0xC1, "Test");}}
}
Но шим уже не тот, и таймер не так тикает. Как быть ?

Добавлено через 13 часов 9 минут
Всем доброго времени суток, вопрос пока прежний, может можно оборачивать в поток ? ну или как вариант параллельное программирование ? правда с параллелькой не особо большой опыт был
0
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
12.01.2016, 11:20
Всё дело в волшебных пузырьках проектировании
Я бы делал так:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
char buffer_lsd[60];
 
__interrupt ШИМ_Таймера()
 {
  перезапуск таймера ШИМ
 }
 
__interrupt Дисплея()
 {
   Перезапись дисплея 
   Перезапуск таймера дисплея
 }
 
main()
 {
  Запуск таймера дисплея настроен 50 Гц
  Запуск таймера ШИМ не знаю сколько там у Вас
  while()
   {
     Полезный код, а индикация и ШИМ работают без нашего вмешательства
   }
 }
1
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580
12.01.2016, 20:14  [ТС]
Видимо я что-то не понял :
C
1
2
3
4
5
6
7
8
__interrupt  void Display_Name()
{
  char buf[4];
  for (int i=0;i<256;i++) {
  sprintf(buf,"%d",sin_tab[i]);
  Lcd_Disp (0x80, buf); 
  Lcd_Disp (0xC1, "Test");}
}
Warning[Pe167]: argument of type "char *" is incompatible with parameter of type "unsigned char *" C:\Users\User\Desktop\tetst\Prot\prob2\m ain.c 40
Warning[Pe069]: integer conversion resulted in truncation C:\Users\User\Desktop\tetst\Prot\prob2\m ain.c 51
Warning[Pe069]: integer conversion resulted in truncation C:\Users\User\Desktop\tetst\Prot\prob2\m ain.c 60
Warning[Pe167]: argument of type "char *" is incompatible with parameter of type "unsigned char *" C:\Users\User\Desktop\tetst\Prot\prob2\m ain.c 71
Error[Pa037]: function type not callable C:\Users\User\Desktop\tetst\Prot\prob2\m ain.c 82
Error while running C/C++ Compiler
0
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
12.01.2016, 20:41
Цитата Сообщение от Dostik Посмотреть сообщение
Видимо я что-то не понял :
я привел псевдо код, а не решения.
В общем случаи в IAR прерывание имеет синтаксис:
C
1
2
3
4
#pragma vector=0x03
__interrupt  void Display_Name() 
{
}
где 0x03 - вектор прерывания.
В мануале смотрим вектор и задаём его
Возможно нужно инслудом подключить файл с описанием прерываний.
1
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580
12.01.2016, 20:55  [ТС]
Вот что написано в доке :
The header file iodevice.h, where device corresponds to the selected device,
contains predefined names for the existing interrupt vectors.

Вот что я получаю :
Fatal Error[Pe1696]: cannot open source file "device.h" C:\Users\User\Desktop\tetst\Prot\prob2\m ain.c 5
searched: "D:\Program Files\IAR Embedded Workbench for 8051 8.30\8051\inc"
searched: "D:\Program Files\IAR Embedded Workbench for 8051 8.30\8051\inc\clib"
Error while running C/C++ Compiler

Нет такой ...
Может её скачать надо где-то ?
0
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
12.01.2016, 21:24
INTRINSICS.H
если не получится кидайте архив с проектом попробую вспомнить.
1
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580
12.01.2016, 22:01  [ТС]
Prot.rar
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.01.2016, 22:01
Помогаю со студенческими работами здесь

USBAsp
Вот собственно... Купил себе нетбук и появилась необходимость в USB программаторе. Делал по печатке DY HOTTa. Сторону с пайкой стыдно...

USBAsp
Всем привет. Собрал программатор USBAsp. Подключил к USB, по идее должен же загореться светодиод что питание поступило а он у меня...

tiny85 & USBasp
Попробовал сейчас залить програмку в тини85 при помощи усбаспа, программа заливается корректно, а фьюзы не читаются. Пользуюсь оболочкой...

Проблемы с USBASP
Здравствуйте. Начал изучение микроконтроллеров. Приобрел usb программатор USBASP. Пытаюсь прошить тини2313. Скачал проги eXtreme Burner...

Обновление USBasp
Добрый день. Некоторое время занимался arduino, решил вылазить из пеленок и самостоятельно травить платы, прошивать контроллеры... ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
160
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru