|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 1:16 am
| Автор |
Съобщение |
|
head_up
Ранг: Форумен бог
Регистриран на: Нед Юни 01, 2008 9:54 pm Мнения: 1503 Местоположение: Пловдив
|
 Борба с PIC32
тъй, боря се с един pic32mx460F512L. Първи впечатления - дървения, много мрънкане отнесе. На второ гледане може и да ми се понрави. Т.е. почва да ми харесва, нещо като мазохизъм.
Имам два прости въпроса:
-> първият е относно MPLAB 8.66 - не дава да си сложа брейкпоинт. Значи след много мъки и рестартирания на средата + чистене някак си успявам да сложа един - махам го и после пак не мога да сложа. Ползвам дебъгера, който идва с PIC32 Starter Board-a, т.е. един Господ знае какво точно е. Обаче по това, което гуглето казва излиза, че и с други дебъгери се появява тоя проблем - някой намират за решение да правят проекта на ново всеки път. Е, на мен не ми харесва - как се решава това по-елегантно? Не може, за да дебъгва човек нормално да му се налага всеки път да прави това - триене ръчно, нов проект и всичката акробатика!
-> втория въпрос е относно делители и таймерна система. Много, ама много ми се иска да имам таймер да цъка на 1us и едновременно с това да ползвам ядрото на макс - 80МХз. Е, да, ама в това животно всичкото делител е на степени на 2-ката. Както и да го суча това не се постига по друг начин освен, ако не смъкна ядрото на 64МХз, делителя за периферията на 2 и на всеки каквото му трябва... А не искам да правя и това - има ли някакво научно решение или да си държа таймерите на 0.1us за инкремент и да се съобразявам с това? Защото за 32 битов таймер ме устройва, но за 16 битовия ми идва късо времето - трябват ми доста повече, поне 3-4 пъти. Но не мога да си позволя 2 32 битови, защото не ми стигат за всички цели. Та с тази дилема ми е трудно да живея по празниците
Другото - абе то всичко хубаво, ама микрочип дали имат намерения да фиксват бъговете в тая серия процесори - не може да изкарат 4 ревизии и от 66 (документирани) бъга да фикснат има няма 10! Малко ми звучи несериозно. Иначе с тия екзампъли дето са ги дали - благодат, за часове човек се учи как да ползва този процесор. Старта е в пъти по-бърз от другото, до което съм се докоснал. Освен със средата - не е отместена и на бит от 6-та версия, все си е саката. Но това са си мои разбирания 
|
| Пет Апр 22, 2011 12:45 am |
|
 |
|
head_up
Ранг: Форумен бог
Регистриран на: Нед Юни 01, 2008 9:54 pm Мнения: 1503 Местоположение: Пловдив
|
Сам ще си отговарям, но ще съм доволен и на чуждо мнение
Учудващо, но след опит за поставяне на брейкпоинт средата учтиво ми покава среден пръст с горното съобщение. Нищо, брейкпойнта се явява като неактивен и не се спира на него. Пак хубаво. Ако сложа колкото ме интересува брейпойнти (в случая 3) и мълчаливо се съглася с предупреждението, те продължават да си седят неактивни. Обаче - правя един ресет на процесора и ... чудо! Въпреки, че брейкпойнтите продължават да бъдат неактивни - на тях се спира! Ай ся - това нормално ли е?! 
|
| Пет Апр 22, 2011 1:01 am |
|
 |
|
relsys
Ранг: Форумен бог
Регистриран на: Пет Ное 25, 2005 11:41 am Мнения: 1680
|
Абе ще почна да отговарям и аз, нали си взех МХ695.... ама засега само съм го пойнал на една смотана платка от Комет.
То 6 TQFP на нея, няма къде да пойнеш кварца дет се вика...
Аз обаче няма да го мъча под MPLAB...
|
| Пет Апр 22, 2011 2:49 pm |
|
 |
|
head_up
Ранг: Форумен бог
Регистриран на: Нед Юни 01, 2008 9:54 pm Мнения: 1503 Местоположение: Пловдив
|
@relsys, подозрително биеш към едни продукти, от които упорито бягам  Не, благодаря ти.
|
| Пет Апр 22, 2011 3:03 pm |
|
 |
|
relsys
Ранг: Форумен бог
Регистриран на: Пет Ное 25, 2005 11:41 am Мнения: 1680
|
Не, не бия на никъде. Просто споделям колко до никъде съм стигнал и аз ... от мързел ...
Иначе, всеки сам има право да си избира, колко трудно иска да му бъде. Колкото до "продуктите", проекта върху който ще работя с акумулаторите от другата тема, ще е разработен с тях върху PIC24 и PIC32. Когато стане готов, /надявам се най-късно септември/ ще поканя всеки от вас който има интерес, да му хвърли един поглед от по-близо.
|
| Пет Апр 22, 2011 7:13 pm |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
 Re: Борба с PIC32
Нещо има гнило в твоя телевизор. Имам и 3-те им PIC32 SK, всички си работят като пушка, на машината ми е MPLAB 8.60. Ако си включил оптимизациите не винаги можеш да зададеш точка на прекъсване, щото там където искаш може и да няма код. Затова си пускаш листинга (View/Dissasembly Listing ) и гледаш има ли код точно там където искаш да има точка на прекъсване.
Периферията може да се клочи 1:1 с ядрото, т.е. имаш си делител 1:1. Аз съм си направил следното за по-лесни настройки:
 |  |  |  | Код: #if defined(RUN_AT_48MHZ) // Setup for Fcy=48MHz for core and Fpb=48MHz for peripheral // Explorer 16 board has 8.000MHz crystal, FPLLIDIV=DIV_4 divide this // 8.000MHz by 2, FPLLMUL=MUL_24 multiply 2.000MHz by 24 and result is 48MHz // for core. FPBDIV=DIV_1 divide core clock by 1 and result is 48MHz clock for // peripheral #pragma config POSCMOD=XT, FNOSC=PRIPLL #pragma config FPLLIDIV=DIV_4, FPLLMUL=MUL_24, FPLLODIV=DIV_1 #pragma config FPBDIV=DIV_1, FWDTEN=OFF, CP=OFF, BWP=OFF #elif defined(RUN_AT_56MHZ) // Setup for Fcy=56MHz for core and Fpb=56MHz for peripheral // Explorer 16 board has 8.000MHz crystal, FPLLIDIV=DIV_3 divide this // 8.000MHz by 3, FPLLMUL=MUL_21 multiply 2.6666MHz by 21 and result is 56MHz // for core. FPBDIV=DIV_1 divide core clock by 1 and result is 56MHz clock for // peripheral #pragma config POSCMOD=XT, FNOSC=PRIPLL #pragma config FPLLIDIV=DIV_3, FPLLMUL=MUL_21, FPLLODIV=DIV_1 #pragma config FPBDIV=DIV_1, FWDTEN=OFF, CP=OFF, BWP=OFF
#elif defined(RUN_AT_64MHZ) // Setup for Fcy=64MHz for core and Fpb=32MHz for peripheral // Explorer 16 board has 8.000MHz crystal, FPLLIDIV=DIV_2 divide this // 8.000MHz by 2, FPLLMUL=MUL_16 multiply 4.000MHz by 16 and result is 64MHz // for core. FPBDIV=DIV_2 divide core clock by 2 and result is 32MHz clock for // peripheral #pragma config POSCMOD=XT, FNOSC=PRIPLL #pragma config FPLLIDIV=DIV_2, FPLLMUL=MUL_16, FPLLODIV=DIV_1 #pragma config FPBDIV=DIV_2, FWDTEN=OFF, CP=OFF, BWP=OFF
#elif defined(RUN_AT_72MHZ) // Setup for Fcy=72MHz for core and Fpb=36MHz for peripheral // Explorer 16 board has 8.000MHz crystal, FPLLIDIV=DIV_2 divide this // 8.000MHz by 2, FPLLMUL=MUL_18 multiply 4.000MHz by 18 and result is 72MHz // for core. FPBDIV=DIV_2 divide core clock by 2 and result is 36MHz clock for // peripheral #pragma config POSCMOD=XT, FNOSC=PRIPLL #pragma config FPLLIDIV=DIV_2, FPLLMUL=MUL_18, FPLLODIV=DIV_1 #pragma config FPBDIV=DIV_2, FWDTEN=OFF, CP=OFF, BWP=OFF
#elif defined(RUN_AT_80MHZ) // Setup for Fcy=80MHz for core and Fpb=40MHz for peripheral // Explorer 16 board has 8.000MHz crystal, FPLLIDIV=DIV_2 divide this // 8.000MHz by 2, FPLLMUL=MUL_20 multiply 4.000MHz by 18 and result is 80MHz // for core. FPBDIV=DIV_2 divide core clock by 2 and result is 40MHz clock for // peripheral #pragma config POSCMOD=XT, FNOSC=PRIPLL #pragma config FPLLIDIV=DIV_2, FPLLMUL=MUL_20, FPLLODIV=DIV_1 #pragma config FPBDIV=DIV_2, FWDTEN=OFF, CP=OFF, BWP=OFF
#else #error "Wrong defined PIC32 RUN_AT_xxMHZ frequency, please see HardwareProfile.h ." #endif
|  |  |  |  |
А по време на работа можеш да проверяваш делителите на периферията и честотата на процесора:  |  |  |  | Код: typedef struct tagSYSPBCLK{ uint32 fsys_clk; // System clock set by pragma directive ( fuses sys clk ) uint32 fpb_clk; // Peripheral clock set by pragma directive ( fuses pb clk ) uint32 sys_clk; // System clock set by OSCCON register uint32 pb_clk; // Peripheral clock set by OSCCON register }SYSPBCLK;
/* GetSysAndPbClk() is useful function to check if system and peripheral clock are initialized properly. It use as input parameter desired system frequency and return as result a structure from type SYSPBCLK filled with actual system and peripheral clock. SYSPBCLK has two identical sections, one set from pragma directive, and second contain actual frequency read from OSCCON register.
This funcion can be used in debug process. Let say we have 8MHz crystal and we want to have 64MHz system clock and 32MHz peripheral clock. GetSysAndPbClk() will help us to see if FPLLIDIV, FPLLMUL, FPLLODIV and FPBDIV have right values. */ uint8 const pllidiv_array[8] = {1, 2, 3, 4, 5, 6,10,12}; uint8 const pllmul_array[8] = {15,16,17,18,19,20,21,24}; uint16 const pllodiv_array[8] = {1, 2, 4, 8,16,32,64,256}; uint8 const pbdiv_array[4] = {1, 2, 4, 8};
void GetSysAndPbClk(uint32 crystal, // input quartz crystal, Hz SYSPBCLK *result) { uint32 fpllidiv, // PLL input divider fpllmult, // PLL multiplier fpllodiv, // PLL output divider fpbdiv, // Peripheral Bus Clock Divider pllmult, // PLL multiplier pllodiv, // PLL output divider pbdiv; // Peripheral Bus Clock Divider // Oscillator configuration from #pragmas fpllidiv = pllidiv_array[DEVCFG2bits.FPLLIDIV]; fpllmult = pllmul_array[DEVCFG2bits.FPLLMUL]; fpllodiv = pllodiv_array[DEVCFG2bits.FPLLODIV]; fpbdiv = pbdiv_array[DEVCFG1bits.FPBDIV]; // Oscillator configurations from OSCCON register pllmult = pllmul_array[OSCCONbits.PLLMULT]; pllodiv = pllodiv_array[OSCCONbits.PLLODIV]; pbdiv = pbdiv_array[OSCCONbits.PBDIV]; // Calculate system clock and peripheral bus clock // set by pragma directive result->fsys_clk = ( crystal * fpllmult ) / ( fpllidiv * fpllodiv ); result->fpb_clk = result->fsys_clk / fpbdiv; // Calculate system clock and peripheral bus clock // set by OSCCON register result->sys_clk = ( crystal * pllmult ) / ( fpllidiv * pllodiv ); result->pb_clk = result->sys_clk / pbdiv; }
|  |  |  |  |
И кои са тези "сериозни" бъгове, които искат немедленна фиксация  ? Щото използвам няколко техни 32-ки и досега не съм чел errata документи. Не че нямат, сигурно имат, ама нищо не се е случвало при мен.
За картинката, ами в документацията си пише, че има ограничение от 6 хардуерни точки на прекъсване, ако си напляскал 6, е нормално да ти излиза тази картинка. Софтуерните са неограничени, само че не знам как се използват.
_________________ Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....
|
| Пет Апр 22, 2011 8:09 pm |
|
 |
|
head_up
Ранг: Форумен бог
Регистриран на: Нед Юни 01, 2008 9:54 pm Мнения: 1503 Местоположение: Пловдив
|
Благодаря за съпорта
На първо време - няма други поставени брейкпойнти, само един да кажем (макар, че успях да ги докарам за опита до 3) - положението е както го описах, брейкпойнта седи като неактивен след горното предупреждение, но след като ресетна процесора макар брейкпойнта все още да е неактивен - изпълнението се спира там. Т.е. все едно брейкпойнта е валиден, обаче средата всеки път ми вади онова съобщение и ми маркира брейкпойнта, като че не мога да го ползвам - и то номера със спирането става след рестарт на процесора. Странно е. За сега го преживявам - поне мога да спра изпълнението някъде, но ... не е добре де, създава дискомфорт.
Ползвам това по принцип - т.е. 80МХз:
Но това не дава възможност броячите да работят на 1us такт! Т.е не и при 40 клок на периферията - виж при 64->32 може, но не искам да смъквам ядрото. В най-добрият случай при 80МХз - 1.25us ми е сравнително удобно или 0.1 us, което става само при 32 битов таймер, не и за 16 битовите, защото ми скъсява времето много. W/e с повече старание и при 1.25, и при 0.1 ще го докарам, но е криво като трябва да въртя времената на код, който разчита на "точно време".
Относно бъговете имаше няколко "отклонения" в работата на UART-а, по-точно за OERR и флага за празно RX фифо, когато се оказва, че флага нямало да бъде валиден - на мен данните ми трябват колкото и да са, ако ще и да съм загубил някой байт - работим по заобиколките, както препоръчват. Не се зачетох във всичките им проблеми, но не мисля, че е редно, която и да е фирма да пусне 4 ревизии и да оправи 1/6 от бъговете. Не знам дали ще има някой друг проблем да ме засегне, те повечето и могат спокойно да се "фикснат".
Обаче като им свикне човек няма ядове, почват да ми харесват - както казах мазохизъм 
|
| Съб Апр 23, 2011 12:44 am |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
Ако от такъв бъг се плашиш  Какво да кажем тогава за DSP-тата на Texas от TMS320F281x серията ? Модел 2003г., последна ревизия на бъговете от 2009г., и все още има неоправени  Ето например една стил ала-Microchip PIC18 от първите им ревизии: Ами това ( пак на TMS320F281x ):  |  |  |  | Цитат: Revision(s) Affected: TMS320F281x: 0, A, B, C, D, E, F and G TMS320C281x: 0, A, B Details: If contention exists between the CPU and the eCAN controller for access to certain eCAN register areas, a CPU read may erroneously read all zeros (0x00000000), and a CPU write may erroneously fail to execute. Specifically: 1) If the CPU reads the eCAN mailbox RAM area (MSGID, MSGCTRL, MDL, or MDH registers) at the same time that the eCAN controller is accessing (reading or writing) the LAM/MOTO/MOTS register area, the CPU may erroneously read all zeros (0x00000000).
Workaround: For all CPU reads from the eCAN mailbox RAM area, check to see if the read returns all zeros. If so, the CPU should perform a second read. If the second read returns zero as well, then the data is correctly zero. If the second read returns a non-zero value, then the second data is the correct value. Note that interrupts must be disabled during the consecutive CPU reads.
|  |  |  |  |
Както и да е.
Отностно едната ти микросекунда:
PIC32 има един допълнителен 32-битов брояч ( регистър #9, Core Timer, CT ) в коопроцесор 0 ( CP0 ), който може да се спира, пуска и да генерира прекъсвания като всеки друг таймер. Обикновено се използва за Core Timer и се тактува на всеки два такта на ядрото. В твоя случай при 80MHz такт на ядрото, CT ще се тактува с 40MHz, зареждаш в период регистъра му 40 и ще ти генерира прекъсване точно на 1us. Имай в предвид, че регистрите на коопроцесор 0 не са в адресното п-во на ядрото, те си имат собствен регистров файл и комуникацията между коопроцесора и ядрото става с инструкциите mtc0 и mfc0 ( move to CP0 & move from CP0 ). Ще видиш подробно описание на коопроцесора в DS61113C, секция MCU. Периода на CT се задава с друг регистър от CP0, регистър #11, Compare. Таймерa се стартира/спира с бит 27 ( Disable Count, DC ) на регистър #13, Cause, от CP0, a прекъсването се забранява/разрешава с бит 0 на IEC0 . Не забравяй, че прекъсването ще бъде активно докато не презапишеш Compare регистъра.
Стана ми интересно какво точно правиш та държиш непремнно на едната микросекунда ?
П.П. Едно време използвах най-вече PC-та с AMD професори, и имах много ядове с най-различни видове софтуер, от MPLAB до Protel. Откакто съм минал на Intel професори ядовете ми са намалели в пъти. Даже ми става чудно как пък един елементарен SK няма да тръгне, моите ги изпробвах преди малко на 3-те нормални лаптопа, на единия Малчо ( 10" дисплей ) и на едната настолна машина, все MPLAB 8.60, ми няма проблем със задаване на точките на прекъсване. Не ми се слиза в мазето да ги изпробвам на MPLAB X под Ubuntu 
_________________ Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....
|
| Съб Апр 23, 2011 4:25 am |
|
 |
|
head_up
Ранг: Форумен бог
Регистриран на: Нед Юни 01, 2008 9:54 pm Мнения: 1503 Местоположение: Пловдив
|
Ееее, ти ме взе за закуска  Не е въпроса, че ме плаши - въпроса е колко време щях да си дъвча чорапите как кода ми цикли на нещо такова, ако не бях прочел ератата (примерно) за проблема на uart-a? И не е въпроса, че го има в първа ревизия, а че го има и в 4-та! За тексасците не искам да им надничам в нещата, последния ми сблъсък с тях беше малко разочероващ - не за процесори де, та за ДСП-тата само мога да цъкам с език
Абе за правенето - портвам си един код, който спокооойно си работи на LPC, C0, на уж по-добра платформа - микрочипско дело. И тъй като в LPC-тата таймерите са адски добре развити, т.е. делители на входа за каквато ти душа поиска стойност, компараторите за прекъснвания - без спиране/рестартиране на брояча като freerun, 1 таймер за 3 PWM (и повече), всичкото накичено на 2 таймера и няма проблем, тук ми се налага да разхвърлям по различните броячи функционалност същестуваща при 1us и като гледам ще глътна всичките 5 16 битови, срещу 2 на LPC-то. Та както казах - за едно ми идва късо времето, за друго не. Ще взема да го ползвам тоя таймер на ядрото, където викаш, има идея да брой - ако може делителя му да е на 40, не обърнах внимание - благодаря  Въпроса беше, че не искам да имам прекъсване на 1 us, а инкремент на толкова при максимална тактова на ядрото. Но проблема май си го реших с някоя благословия и поносимо отклонение от точното време. Не е невъзможно да си прехвърля кода, подводните камъни из ератата и рестартирането на таймера при съвпадение с на PR например, ако знаеш колко ги псувах - чак на чуждоезични псувни минах - пък те са по-цветущи от нашенските 
|
| Съб Апр 23, 2011 12:17 pm |
|
 |
|
head_up
Ранг: Форумен бог
Регистриран на: Нед Юни 01, 2008 9:54 pm Мнения: 1503 Местоположение: Пловдив
|
Ей, това с CoreTimer наистина спаси ситуацията. Голямо "благодаря", ¶, току виж всичко се наредило 
|
| Съб Апр 23, 2011 2:06 pm |
|
 |
|
head_up
Ранг: Форумен бог
Регистриран на: Нед Юни 01, 2008 9:54 pm Мнения: 1503 Местоположение: Пловдив
|
може ли някой да удари едно рамо с MPLABa - има неща от него, които колкото и дребни да са, ме побъркват. Ок, с клавишните комбинации си ги докарах да са както ми харесват, но някой може ли да ме осветли как да направя променливите (по-точно масиви) да излизат по дефолт в хекс формат - сега се показват в аски код и докато ги мина всичките на хекс ми се отщява да дебъгвам. Второто - има ли бързи клавишни комбинации за извеждане на Locals, Watch и т.н. - не успях да намеря начин да правя това, нито пък гуглето се оказа полезно в случая.
И странно защо, но понякога ми изчезва StepOver - просто става неактивно - това има ли логично обяснение и оправяне или и него да го минавам с някоя благословия 
|
| Пет Апр 29, 2011 3:53 pm |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
Като отвориш Watch джама, кликваш с десния бутон на променливата, избираш Properties, след което за Default Type Format избираш Hex. Отделно ако кликнеш с десния бутон върху първия ред ( Virtual, Symbol Name и т.н. ) можеш да избереш да ти показва съдържанието в повече от един формат ( Dec, Hex, ASCII и т.н. )
MPLAB мисля, че ти пази настройките на прозорците ако използваш Workspace, ако само създаваш Proejct без Workspace май не ги пази. Ама не съм сигурен, отдавна не съм използвал голи проекти и не помня какво беше там.
_________________ Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....
|
| Пет Апр 29, 2011 6:41 pm |
|
 |
|
head_up
Ранг: Форумен бог
Регистриран на: Нед Юни 01, 2008 9:54 pm Мнения: 1503 Местоположение: Пловдив
|
Отново въпрос: имам си един проект за пик32, чиято компилация иска разни суичове към гцц-то, като -Os -fomit-frame-pointer -mips16. Ако изключим, че -fomit-frame-pointer ми е не ясно какво прави и гуглето мълчи, то за останалата част от проекта - не искам да има опримизация, нито да ми го тика в mips16 и това нещо, което не разбирам. Ок, мога да експортна мейкфайл и да приложа желаните суичове вътре както ми трябват. Но после не мога да накарам MPLAB-a след това да го ползва. Как става тая магия ?! 
|
| Пон Май 09, 2011 10:20 am |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
Май си скаран с помощната информация или пък не я четеш
Не ти трябват make файлове, на всеки файл в проекта можеш да зададеш различни опции, един да е оптимизиран, друг да не,
един да е компилиран с -mips16, а друг да си е 32-битов код. Ако кликнеш с десния бутон върху името на файла в прозореца на проекта излиза менюто Build options, там сменяш само за конкретния файл опциите, има и възможност да се наследят глобалните опции или да използваш алтернативни опции, които си ги въвеждаш ръчно.
Ето добро обяснение какво върши frame pointer-a : http://www.yosefk.com/blog/getting-the- ... inter.html
_________________ Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....
|
| Пон Май 09, 2011 3:39 pm |
|
 |
|
head_up
Ранг: Форумен бог
Регистриран на: Нед Юни 01, 2008 9:54 pm Мнения: 1503 Местоположение: Пловдив
|
 май е това  Твърде се излигавих с това гугле - все едно ако то не знае - никъде не го пише
Ок, това което казваш е полезно - ще свърши работа, макар да са купчина файлове си е играчка да се направи за всеки по отделно, но става. Има ли начин с нещо като импорт да пренасям тези настройки от проект на проект? Нещо като мейкфайла
Благодаря за помощния линк, странно защо на мен гуглето ми се сърди като го питах за това и мълчеше 
|
| Пон Май 09, 2011 4:29 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 3 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|