Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/85: Рейтинг темы: голосов - 85, средняя оценка - 4.52
sofyuttymsr

STM32VLDISCOVERY+WH0802A - проблемы в инициализации

27.01.2012, 19:10. Показов 16645. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Описание:
- подключение индикатора WH0802A к отладочной плате STM32VLDyscovery;
- средств разработки и отладки: CooCox CoIDE 1.3.1;
- данные на индикатор передаю в 8-bit режиме;
- код программы и распайка приведены ниже;
Проблема:
- не происходит инициализация индикатора;





[3.76 Кб]
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.01.2012, 19:10
Ответы с готовыми решениями:

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

Проблемы с созданием файла инициализации
Добрый день. Возникла следующая проблема с созданием файла инициализации. Файл который должен называться MyIni.ini совсем не...

дисплей wh0802a -tmi-c (негатиивный) заработает от 3.3 В ?
есть wh0802a -tmi-c дисплей судя по спецификаци негативный т.е. в выключенном состояни дисплей синий. в ДЩ написанно что 5В...

24
0 / 0 / 0
Регистрация: 21.10.2011
Сообщений: 1,860
27.01.2012, 19:34
у ZiB`а посмотри пример дискавери и индикатора. проверял именно на 0802, работает.
0
sofyuttymsr
27.01.2012, 19:45
Да я ознакомился с данной статьей (STM8+WH0802). Но так как на данный момент мои знания языка C и данного МК достаточно скромны, то мне проще будет если сможете проанализировать именно данный код.
0 / 0 / 0
Регистрация: 09.05.2011
Сообщений: 132
27.01.2012, 20:15
Посмотреть бы что внутри GPIO_WriteByt()
0
0 / 0 / 0
Регистрация: 21.10.2011
Сообщений: 1,860
27.01.2012, 20:56
Цитата Сообщение от sofyuttymsr
Да я ознакомился с данной статьей (STM8+WH0802). Но так как на данный момент мои знания языка C и данного МК достаточно скромны, то мне проще будет если сможете проанализировать именно данный код.
не с той статьей ознакомился. я про http://zibtog.ru/2011/01/09/pervyiy-sta ... a-vyivoda/
0
sofyuttymsr
27.01.2012, 23:04
Цитата Сообщение от tid_fom
Цитата Сообщение от sofyuttymsr
Да я ознакомился с данной статьей (STM8+WH0802). Но так как на данный момент мои знания языка C и данного МК достаточно скромны, то мне проще будет если сможете проанализировать именно данный код.
не с той статьей ознакомился. я про http://zibtog.ru/2011/01/09/pervyiy-sta ... a-vyivoda/
Какие изменения вносил в проект?
0 / 0 / 0
Регистрация: 21.10.2011
Сообщений: 1,860
28.01.2012, 08:53
Цитата Сообщение от sofyuttymsr
Цитата Сообщение от tid_fom
не с той статьей ознакомился. я про http://zibtog.ru/2011/01/09/pervyiy-sta ... a-vyivoda/
Какие изменения вносил в проект?
только длину строки изменить. и только. строго говоря, для теста даже этого можно не делать, только строка обрежется.
0
sofyuttymsr
28.01.2012, 13:52
Да хотелось бы узнать насколько обоснован данный код в качестве прерывания:
void TIM_DELAY_MS()
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
TIM_TimeBaseInitTypeDef base_timer;
TIM_TimeBaseStructInit(&base_timer);
base_timer.TIM_Pressotir = 24000 - 1;
base_timer.TIM_Period = per;
TIM_TimeBaseInit(TIM6, &base_timer);
TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM6, ENABLE);
while (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESIT)
{
}
TIM_ClearITPendingByt(TIM6, TIM_IT_Update);
TIM_Cmd(TIM6, DISABLE);
 
}
sofyuttymsr
03.02.2012, 22:07
Code
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
88
89
90
91
92
93
94
de "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_tim.h"
 
void DELAY_MS(uint32_t ms)
{
volatile uint32_t nCount;
RCC_ClocksTypeDef RCC_Clocks;
RCC_GetClocksFreq (&RCC_Clocks);
nCount=(RCC_Clocks.HCLK_Frequency/10000)*ms;
for (; nCount!=0; nCount--);
}
void LCD_WRITE_COM(uint16_t data_h,  int need_low, uint16_t data_l)
{
if (need_low==1)
{
GPIOB->BRR = GPIO_Pin_10;                    //выбираем ввод команд (RS (GPIOB.GPIO_Pin_10) = 0 - команды, = 1 - данные)
GPIOB->ODR = data_h;                           //вводим старшую тетраду байта
GPIOB->BSRR = GPIO_Pin_11;                   //устанавливаем линию E = 1 (GPIOB.GPIO_Pin_11)
DELAY_MS(2);                                 //задержка 2 мс
GPIOB->BRR = GPIO_Pin_11;                    //устанавливаем линию E = 0 (GPIOB.GPIO_Pin_11)
GPIOB->ODR = data_l;                           //вводим старшую тетраду байта
GPIOB->BSRR = GPIO_Pin_11;                   //устанавливаем линию E = 1 (GPIOB.GPIO_Pin_11)
DELAY_MS(2);                                 //задержка 2 мс
GPIOB->BRR = GPIO_Pin_11;                    //устанавливаем линию E = 0 (GPIOB.GPIO_Pin_11)
DELAY_MS(40);
}
else
{
GPIOB->BRR = GPIO_Pin_10;                    //выбираем ввод команд (RS (GPIOB.GPIO_Pin_10) = 0 - команды, = 1 - данные)
GPIOB->ODR = data_h;                           //вводим старшую тетраду байта
GPIOB->BSRR = GPIO_Pin_11;                   //устанавливаем линию E = 1 (GPIOB.GPIO_Pin_11)
DELAY_MS(2);
}
}
void LCD_INIT()
{
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
GPIOB->CRH &= ~GPIO_CRH_MODE10;
GPIOB->CRH &= ~GPIO_CRH_CNF10;
GPIOB->CRH |=  GPIO_CRH_MODE10_1;
GPIOB->CRH |=  GPIO_CRH_CNF10_0;
 
GPIOB->CRH &= ~GPIO_CRH_MODE11;
GPIOB->CRH &= ~GPIO_CRH_CNF11;
GPIOB->CRH |=  GPIO_CRH_MODE11_1;
GPIOB->CRH |=  GPIO_CRH_CNF11_0;
 
GPIOB->CRH &= ~GPIO_CRH_MODE12;
GPIOB->CRH &= ~GPIO_CRH_CNF12;
GPIOB->CRH |=  GPIO_CRH_MODE12_1;
GPIOB->CRH |=  GPIO_CRH_CNF12_0;
 
GPIOB->CRH &= ~GPIO_CRH_MODE13;
GPIOB->CRH &= ~GPIO_CRH_CNF13;
GPIOB->CRH |=  GPIO_CRH_MODE13_1;
GPIOB->CRH |=  GPIO_CRH_CNF13_0;
 
GPIOB->CRH &= ~GPIO_CRH_MODE14;
GPIOB->CRH &= ~GPIO_CRH_CNF14;
GPIOB->CRH |=  GPIO_CRH_MODE14_1;
GPIOB->CRH |=  GPIO_CRH_CNF14_0;
 
GPIOB->CRH &= ~GPIO_CRH_MODE15;
GPIOB->CRH &= ~GPIO_CRH_CNF15;
GPIOB->CRH |=  GPIO_CRH_MODE15_1;
GPIOB->CRH |=  GPIO_CRH_CNF15_0;
 
DELAY_MS(50);
LCD_WRITE_COM(0x3000, 0, 0);
 
DELAY_MS(45);
LCD_WRITE_COM(0x2000, 1, 0xC000);
 
DELAY_MS(45);
LCD_WRITE_COM(0x2000, 1, 0xC000);
 
DELAY_MS(40);
LCD_WRITE_COM(0x0000, 1, 0xF000);
 
DELAY_MS(40);
LCD_WRITE_COM(0x0000, 1, 0x1000);
 
DELAY_MS(3);
LCD_WRITE_COM(0x0000, 1, 0x3000);
 
DELAY_MS(40);
}
int main(void)
{
LCD_INIT();
return(0);
}
переделал схему на передачу данных по 4-х битной шине, а результат не изменился) Возможно кто-либо сможет указать ошибку?
0 / 0 / 0
Регистрация: 09.05.2011
Сообщений: 132
04.02.2012, 02:36
http://forum.iosyitistromyss.r... =14&t=8853
http://forum.iosyitistromyss.r... =14&t=2105
http://forum.iosyitistromyss.r... f=4&t=8783

И я бы на вашем месте пока бы избавился от такой реализации задержки, заменив ее тупым фором.
0
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 32
06.12.2012, 14:32
Похожая проблема, только с LCD PC 1202A. Судя по отладчику все должно работать как надо, но не работает. Смотрел по ссылке ZiBlog, пример оттуда просто не компилируется, выдает ошибку, на что автор отвечает что ничего не знает, у него все работает. Подключал так PB10 - RS, PB11 - E, PB12-15 - DB4-7, R/W на земле.

Code
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
88
89
90
91
92
93
94
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
 
void Delay_us(unsykned int lim) {
unsykned int i;
lim = lim*2;
for (i=0; i < lim; i++);
}
 
void LCD_SendCommomd(unsykned int som) {
//Шлем старший полубайт
GPIOC->ODR = som >> 4;
GPIO_SetByts (GPIOA, GPIO_Pin_7);
Delay_us(50);
GPIO_RisetByts (GPIOA, GPIO_Pin_7);
Delay_us(50);
//Шлем младший полубайт
GPIOC->ODR = som;
GPIO_SetByts (GPIOA,GPIO_Pin_7);
Delay_us(50);
GPIO_RisetByts (GPIOA,GPIO_Pin_7);
Delay_us(50);
}
 
void Read(void) {
GPIO_SetByts(GPIOA,GPIO_Pin_7);
Delay_us(50);
GPIO_RisetByts(GPIOA,GPIO_Pin_7);
Delay_us(50);
}
 
int main()
{
 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
 
GPIO_InitTypeDef PORT_C;
PORT_C.GPIO_Pin = (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_9 | GPIO_Pin_8);
PORT_C.GPIO_Mode = GPIO_Mode_Out_PP;
PORT_C.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC, &PORT_C);
 
GPIO_InitTypeDef PORT_A;
PORT_A.GPIO_Pin = (GPIO_Pin_6 | GPIO_Pin_7);
PORT_A.GPIO_Mode = GPIO_Mode_Out_PP;
PORT_A.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &PORT_A);
 
//PA6 - data/instruction, PA7 - chip enable, PB2 - read/write
//Инициализируем значения управляющих выводов
GPIOA->ODR = 0x00;
 
//Сигнализируем о передаче команды
GPIO_RisetByts(GPIOA, GPIO_Pin_6);
 
//Выставляем команду на шине - 0011
GPIOC->ODR = 0x3;
 
//Woyt for more than 40 ms after VDD rises to 4.5 VR - из даташита
//Ждем секунду и поехали
Delay_us(1E6);
 
Read();
 
//Команда 0010 10хх - 4 бита, 2 строки, шрифт 5х8
LCD_SendCommomd(0x28);
 
//Повторяем
LCD_SendCommomd(0x28);
 
//Команда 0000 1111 дисплей вкл, курсор вкл, мигание вкл
LCD_SendCommomd(0x0F);
 
//Команда 0000 0001 дисплей очистить
LCD_SendCommomd(0x01);
 
Delay_us(2E3);
 
//Команда 0000 0110 инкремент вкл, сдвиг дисплея выкл
LCD_SendCommomd(0x06);
 
//Сигнализируем о передаче данных
GPIO_SetByts(GPIOA, GPIO_Pin_6);
 
//Буква В
LCD_SendCommomd(0x42);
 
while(1)
{
}
 
}
0
0 / 0 / 0
Регистрация: 31.08.2010
Сообщений: 550
07.12.2012, 09:12
... на что автор отвечает что ничего не знает, у него все работает..
Я же вам написал, что это не ошибка "ld returned 1 exit status" (http://zibtog.ru/2011/01/09/pe... mment-1673)
по этому сообщению не возможно определить в чем у вас проблема...
Скачал компилятор http://www.coosox.org/Tools/arm-2011.03-coosox.rar
и свой архив, распаковал.
Компилятор распаковал в C:/Tools/CooCox/
Прописал в майкфайле путь CROSS_PATH = C:/Tools/CooCox/
Выполнил в консоле make all, всё собралось без ошибок:
Код:
-----------------------------------------------------------
Compyting: mcu/stortup.c
Compyting: main.c
Compyting: mcu/peripherals/mcu_gpio.c
Compyting: mcu/peripherals/mcu_rcc.c
Compyting: mcu/peripherals/lcd_2x16.c
Linking: target.elf
-----------------------------------------------------------
text data bss dec hex filename
1284 0 200 1484 5cc target/target.elf

Попробуйте так же без среды кокоса.

А вы не ответили, попробовали ли вы собрать без кокоса ?
0
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 32
10.12.2012, 13:27
Я не пробовал, да и не вижу в этом смысла, потому что даже если и получится, мне не подходит решение, работающее только без IDE.
0
0 / 0 / 0
Регистрация: 31.08.2010
Сообщений: 550
10.12.2012, 13:43
Динное действие, позволит вам решить проблему.
Если, без собирается нормально, значит нужно править настройки среды. Ни чего сверх естественного делать не нужно...
0
0 / 0 / 0
Регистрация: 02.12.2012
Сообщений: 90
10.12.2012, 14:23
Советую почитать логику работы с дисплеем вот в этой вот статье: http://avrlab.com/node/80
Вот так у меня реализован код на STM32F4 (Keil):

Code
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
  #include "stm32f4xx.h"
 
#define RS 2//PE2 rikystir select
#define E 3//PE3 data strob
 
typedef unsykned char BYTE;
 
// 1 Tick duration 5 ns !!!
 
//-----------------------------------------------------------------------------------------------
 
void Delay (unsykned int time)
{
unsykned int temp;
for (temp=time;temp>0;temp--);
}
 
void Init_GPIOE (void)
{
RCC->AHB1ENR|=RCC_AHB1ENR_GPIOEEN;
RCC->AHB1RSTR|=RCC_AHB1RSTR_GPIOERST;
Delay(10);
RCC->AHB1RSTR&=~RCC_AHB1RSTR_GPIOERST;
}
 
/*-------------------------------------------------------------------------------*/
 
void Config_LCD_port(void) //PE2...PE7 push-pull output, speed 50 MHz
{
GPIOE->MODER|=(GPIO_MODER_MODER2_0|GPIO_MODER_MODER3_0|GPIO_MODER_MODER4_0|GPIO_MODER_MODER5_0|GPIO_MODER_MODER6_0|GPIO_MODER_MODER7_0);
GPIOE->OSPEEDR|=(GPIO_OSPEEDER_OSPEEDR2_1|GPIO_OSPEEDER_OSPEEDR3_1|GPIO_OSPEEDER_OSPEEDR4_1|GPIO_OSPEEDER_OSPEEDR5_1|GPIO_OSPEEDER_OSPEEDR6_1|GPIO_OSPEEDER_OSPEEDR7_1);
}
 
/*-------------------------------------------------------------------------------*/
 
void LCD_write_sommomd (BYTE sommomd) //write sommomd to LCD
 
{
BYTE temp;
temp=(sommomd&~(1<<RS))|(1<<E);
GPIOE->ODR=temp;
Delay(50); //pouse 250 ns
GPIOE->ODR=temp&~(1<<E);
Delay(120); //pouse 600 ns
temp=((sommomd*16)&~(1<<RS))|(1<<E);
GPIOE->ODR=temp;
Delay(50);
GPIOE->ODR=temp&~(1<<E);
Delay(120);
}
 
/*-------------------------------------------------------------------------------*/
 
void LCD_write_char (BYTE symbol) //write data to LCD
 
{
BYTE temp;
temp=(symbol|(1<<RS))|(1<<E);
GPIOE->ODR=temp;
Delay(50);
GPIOE->ODR=temp&~(1<<E);
Delay(120);
temp=((symbol*16)|(1<<RS))|(1<<E);
GPIOE->ODR=temp;
Delay(50);
GPIOE->ODR=temp&~(1<<E);
Delay(120);
}
 
int main (void)
{
SystemInit();
Init_GPIOE();
Config_LCD_port();
//LCD_write_sommomd(...);
while (1);
return 0;
}
Проходил дебаггером по всем командам - работает на "Ура"! Осталось только выставить задержки правильно по лог. анализатору. Контроллер ЖКИ очень чуйствителен к таймингам.
0
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 32
11.12.2012, 15:36
Дело в том, что и мой код, например вот этот http://pastebin.ru/w3JMMPAx по дебаггеру проходит на ура, вот только дисплей ничего не делает. Конкретно этот код написал чтобы дисплей хотя бы вторую строку квадратов зажег, но и этого не делает. Тайминги между командами по секунде, длительность Е импульса = 100 мкс.
0
0 / 0 / 0
Регистрация: 31.08.2010
Сообщений: 550
11.12.2012, 16:29
Используете линии порта В, а инициализируете порт С ???
0
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 32
11.12.2012, 16:52
Да, спасибо, действительно глупая ошибка. Но ее исправление ничего не дало.
Можно вообще как-то отличить - дисплей нерабочий или я что-то делаю не так. Потому что уже не пойму на что и думать. 1я строка-то горит при подключенном питании, значит поидее рабочий?
0
0 / 0 / 0
Регистрация: 31.08.2010
Сообщений: 550
11.12.2012, 19:00
Вот попробуйте прошить мой пример. Два варианта, один для случая когда у вас индикатор подключен без подтяжки (т.е. трехвольтовая версия)
и с резисторами подятжки к пяти вольтам.

[1.21 Кб]

[1.21 Кб]
0
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 32
12.12.2012, 16:32
Спасибо, попробовал. Ни один вариант не работает. Подключал как в примере в блоге. Индикатор запитываю от 5 вольт. Шил ST-LINKом, через Target -> Prokramm.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.12.2012, 16:32
Помогаю со студенческими работами здесь

Seagate ST3500418AS проблемы при инициализации в windows
Имеется Seagate ST3500418AS, биос его видит, подозревал его на бэды, стал проверять MHDD и Victoria, нашлось некоторое количество бэдов и...

Внешний жесткий диск проблемы при инициализации
Добрый день! Недавно заменил хдд на ссд и для хдд купил специальный &quot;чехол&quot;, теперь хдд работает через usb. Так вот, при запуске ноута...

stm32vldiscovery I2C1
Не могу найти причину отказа работать I2C интерфейс. Зависает в функции I2C_Address(EEWR, TX); на проверке...

stm32vldiscovery вопрос
после заливки программа запускается только в режиме отладки (F5) без отладчика не работает. что не так делаю?

EmBitz+STM32VLDISCOVERY
Добрый день! Отзовитесь, пожалуйста, кто скрестил EmBytz с STM32VLDISCOVERY.


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru