Jump to content

На чем писать  

580 members have voted

  1. 1. Что чаще используете в разработках?

    • Assembler
      162
    • C
      295
    • Что-то еще
      62


Recommended Posts

1 минуту назад, mazzi сказал:

проверяю различные идеи с помощью Ардуино.

Из этого следует, что уровень идей соответствует возможностям Ардуины как СРЕДЫ. Серьезные идеи Ардуиной не проверить.

Share this post


Link to post
Share on other sites
2 минуты назад, my504 сказал:

Из этого следует, что уровень идей соответствует возможностям Ардуины как СРЕДЫ. Серьезные идеи Ардуиной не проверить.

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


Пока ты жив, надежда есть.

Share this post


Link to post
Share on other sites
1 минуту назад, mazzi сказал:

горелой спичкой на салфетке

Это будет шуткой художника, а не профессиональным движением или достижением.

Работающий с Ардуиной достигнет с ней бОльшего, чем тот, кто без нее. Но из этого не следует, что уровень задач первого (в схемотехническом и программистском плане) можно считать сколь нибудь серьезным.

Share this post


Link to post
Share on other sites

Приглашаем на вебинар «Новинки и уникальные решения Molex. На что обратить внимание и почему»

15 апреля приглашаем на вебинар, который будет интересен разработчикам и инженерам-схемотехникам, интересующимся тенденциями рынка, новыми перспективными решениями для соединений «провод-провод», «провод-плата», «плата-плата». Для инженеров КИПиА и IT будут освещены уникальные решения Molex для «удлинения» интерфейсов HDMI, DisplayPort и USB даже в условиях сильного зашумления, а также семейство бесконтактных датчиков Contrinex. Помимо этого, будет уделено внимание дальнейшему развитию направления антенн, где Molex имеет ряд интересных и уникальных решений.

Подробнее

2 минуты назад, my504 сказал:

Работающий с Ардуиной достигнет с ней бОльшего, чем тот, кто без нее. Но из этого не следует, что уровень задач первого (в схемотехническом и программистском плане) можно считать сколь нибудь серьезным.

Что есть такого в Ардуино, что может помешать мне достичь своей цели?


Пока ты жив, надежда есть.

Share this post


Link to post
Share on other sites
36 минут назад, DrobyshevAlex сказал:

я вам могу написать и на асм код который хуже будет работать чем си

это потому, что ты не владеешь ассемблером в полной мере.

17 часов назад, my504 сказал:

Проще писать сразу на АСМе, но используя все соглашения и структуру кода Си.

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

НЕЛЬЗЯ на ассемблере писать, копируя работу компилятора Си.

а когда забудешь о структуре кода Си, то на ассемблере получишь код в несколько раз короче, чем на Си.


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

Share this post


Link to post
Share on other sites
                     

Как снизить потери при включении силового ключа: простая схема управления скоростью нарастания

Снижение потерь на переключения в силовых электронных системах, например, в приводах, зачастую противоречит требованиям ЭМС и ограничивается таким параметром как скорость нарастания напряжения. Простой способ решения, предлагаемый Infineon – параллельное использование двух традиционных драйверов.

Читать статью

2 минуты назад, my504 сказал:

Чтобы не сжечь чего нибудь на Ардуине, нужно просто думать,прежде чем написать код.

Допустим я решил написать код. Я вижу хваленую среду Ардуино. Мое мнение, его писали профессионалы и я могу ему доверять хотя бы на элементарном уровне, таком как в случае если у меня отвалился датчик am2320 подключенный по i2c - я просто получу 0, или false, или ERROR или throw, да что угодно, но это не повесит весь мк.

Да да, можно говорить о том, что это бесплатно, какие претензии на халяву. Но, имхо, нуб его такое бесплатное. А это еще советуют людям, мол берите ардуино)

Share this post


Link to post
Share on other sites
2 минуты назад, Starichok сказал:

НЕЛЬЗЯ на ассемблере писать, копируя работу компилятора Си.

а когда забудешь о структуре кода Си, то на ассемблере получишь код в несколько раз короче, чем на Си.

Напишите на ассемблере короче чем на си например такое:

   for(i=0;i<16;i++)
   {
      for(j=0;j<4;j++)
      {
         mera[i][j]=disk[s++];
      }
   }

 


Пока ты жив, надежда есть.

Share this post


Link to post
Share on other sites
33 минуты назад, Starichok сказал:

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

НЕЛЬЗЯ на ассемблере писать, копируя работу компилятора Си.

а когда забудешь о структуре кода Си, то на ассемблере получишь код в несколько раз короче, чем на Си.

Это полная чушь, любезный Старичок. При всем моем к Вам уважении...

Вы даже не понимаете о чем я говорю. От слова совсем. Речь не идет о копировании работы компилятора. речь идет исключительно о соглашениях и СТРУКТУРЕ кода. Если у Вас есть желание подробно узнать об этом, я могу Вас ознакомить, но в личке. Моргните и я прилечу...)))

26 минут назад, mazzi сказал:

Напишите на ассемблере короче чем на си

Смотря на каком АСМе. :D

Скажем, на ASM16 это будет выглядеть так:

	do		#15, 0f
		repeat		#4
			mov	[W0++], [W1++]
0:		nop

А могу написать фрагмент кода на АСМе, который будет короче, чем код на Си. По числу строк - точно. B)

Причем без учета скобок Си. А так и мой пример короче Си реализации.

Edited by my504

Share this post


Link to post
Share on other sites
26 минут назад, my504 сказал:

Смотря на каком АСМе. :D

Ассемблер для AVR.


Пока ты жив, надежда есть.

Share this post


Link to post
Share on other sites

Несмотря на раздел AVR, обсуждение ведется В ПРИНЦИПЕ, без привязки к платформе (см. название темы), ибо намек товарисча, непрерывно грозящего нассать в ботинок, ранее заключался в том, что если не хватает производительности, то... Ну и далее все указывает на АРМ... :rolleyes:

Edited by my504

Share this post


Link to post
Share on other sites
43 минуты назад, mazzi сказал:

Напишите на ассемблере короче чем на си например такое:

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

30 минут назад, my504 сказал:

Вы даже не понимаете о чем я говорю. От слова совсем. Речь не идет о копировании работы компилятора. речь идет исключительно о соглашениях и СТРУКТУРЕ кода.

вполне возможно, что я тебя не понял.

под словом "структура" я однозначно понимаю структуру, а именно:

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

но это очень куцее объяснение моего понимания структуры Си..

39 минут назад, my504 сказал:

Если у Вас есть желание подробно узнать об этом, я могу Вас ознакомить

большое спасибо, но пока у меня нет такого желания.


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

Share this post


Link to post
Share on other sites
12 минут назад, Starichok сказал:

создание функций и передача параметров в функции через стек и подобные особенности Си.

Вообще то на АСМе тоже стоит создавать функции. Экономия на call и return выглядит смешной на фоне угрозы запутать код так, что сам в нем утонешь. Передача переменных в функцию через стек  - это особенность определенного компилятора и к Си не имеет никакого отношения. При относительно небольшом количестве переменных их обычно передают через РОНы и через РОНы возвращают значение функции. Вот локальные переменные действительно можно открывать в стеке, но это если есть аппаратный механизм такого действа. Например, в 16-разрядных микрочипах это так называемый фрейм, который открывается закрывается инструкциями lnk #N/ulnk и позволяют исключить локальные НЕ статик переменные в функциях из регулярной области ОЗУ, что резко упрощает их администрирование. Работа с этими переменными ничуть не сложнее работы с регистрами. Система команд это поддерживает, а необходимости перегружать эти переменные из ОЗУ в РОНы нет никакой.

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

Edited by my504

Share this post


Link to post
Share on other sites

в ассемблере функции, как таковые, не нужны вообще.

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

а если какие-то действия нужно выполнить более одного раза, то в ассемблере это оформляется подпрограммой, а не функцией.

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


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

Share this post


Link to post
Share on other sites
1 минуту назад, Starichok сказал:

в ассемблере

Каком Ассемблере? Если тема про AVR, то, вероятно, рекомендованный в программе AVR Studio. 

Share this post


Link to post
Share on other sites
6 минут назад, Starichok сказал:

а если какие-то действия нужно выполнить более одного раза, то в ассемблере это оформляется подпрограммой, а не функцией.

Не расстраивайте меня, Старичок... Функция Си превращается после компиляции в самый обычный вызов call. Таким образом, при сопоставлении АСМа и Си  "подпрограмма"  и "функция" идентичны до неразличимости.

АСМ код выстроенный как непрерывный без вызовов либо примитивен и не подлежит обсуждению в местном контексте (нечего в нем обсуждать), либо код на АСМе написан безграмотно и в смысле его масштабирования, и в смысле сопровождения. Такой код работает гораздо медленнее выстроенного под фичи архитектуры МК.

Share this post


Link to post
Share on other sites

я конеш понимаю упоротость профи, но так же понимаю, что форум тут в основном любительский. А любителям как правило до звезды ваши потуги выжать из примитивного камня каждый такт. Важнее решить задачу не утонув в собственном "творчестве". И если я могу получить быстрее и проще за 50 рублей, а мне скажут - нееет, друг. Это не спортивно. Заплати 150 и траxайcя по возрослому. Ответ будет скорее всего такой - иди как ты дружище лесом. И да, чаще всего я намекаю именно на то о чем все подумали. И как показывает статистика об этом уже думают очень многие нормальные люди. И да, я не брезгую взять в руки 16-ый пик если надо и даже ардуино, об который все так боятся запачкаться. Просто потому что знаю что могу от них получить и за какое время. А еще знаю что живу один раз и не собираюсь ушатывать свою жизнь в клавиши. Зачем? Чтобы потом гордо заявлять - да я вас всех на пальце имел, потому что я крутой асмофрик и могу в два байта упихать программу полета на марс? В контексте реального мира это ничего не стоит


Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Share this post


Link to post
Share on other sites
1 минуту назад, mail_robot сказал:

А еще знаю что живу один раз и не собираюсь ушатывать свою жизнь в клавиши.

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

 

Share this post


Link to post
Share on other sites

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


Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Share this post


Link to post
Share on other sites
16 часов назад, my504 сказал:

Не расстраивайте меня, Старичок... Функция Си превращается после компиляции в самый обычный вызов call.

сожалею, я не собирался тебя расстраивать.

только этот самый обычный вызов call в Си оказывается обвешен кучей команд PUSH и POP, которых у меня на ассемблере не будет вообще.

 


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

Share this post


Link to post
Share on other sites
7 минут назад, Starichok сказал:

обвешен кучей команд PUSH и POP,

даже если нет передачи переменных? на пуш и поп на асм я делал передачу переменных в функцию и обратно емнип. 

Share this post


Link to post
Share on other sites

дело в том, что в ассемблере нет необходимости передавать переменные в подпрограмму (функцию) через пуш и возвращать через поп.

в ассемблере все переменные (по крайней мере у меня) доступны напрямую. я могу взять любую переменную прямо из места ее хранения и результат поместить также прямо в нужное место.

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

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

16 часов назад, mail_robot сказал:

А любителям как правило до звезды ваши потуги выжать из примитивного камня каждый такт.

а вот мне не до звезды. и я в программировании любитель.

возможно, это у меня осталось с тех давних времен, когда программная память (ПЗУ) была маленькой (по сравнению с современными МК) и приходилось экономить каждый байт (а не такт).

а на счет такта - я уже говорил где-то, что в современных МК такты процессора никто не видит, мы можем видеть только машинный цикл.

это в древних МК 51-ой серии можно было видеть отдельные такты, так как там в одном машинном цикле было 12 машинных тактов.

и там был именно тактовый генератор - за один период тактовой частоты выполнялся один машинный такт.


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

Share this post


Link to post
Share on other sites
1 минуту назад, Starichok сказал:

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

Я тоже так думал когда-то. И хотя теоретически так и есть, я решил это проверить и попробовал посоревноваться с компилятором с Си от фирмы Keil, и был посрамлен. На максимальной оптимизации по объему кода он меня победил. Я просматривал код, который он генерирует, и понял, что лучше написать вряд ли возможно. А если и возможно, то выигрыш будет мизерный.


Пока ты жив, надежда есть.

Share this post


Link to post
Share on other sites

@mazzi , не в обиду. Фраза должна была звучать так.

14 минут назад, mazzi сказал:

Я просматривал код, который он генерирует, и понял, что лучше написать...

...Вам...

15 минут назад, mazzi сказал:

...вряд ли возможно. А если и возможно, то выигрыш будет мизерный.

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

Share this post


Link to post
Share on other sites
23 минуты назад, Starichok сказал:

что в ассемблере нет необходимости передавать переменные в подпрограмму

эта необходимость есть в Си? я чего то не знаю? не хотите не передавайте.

24 минуты назад, Starichok сказал:

я могу взять любую переменную прямо из места ее хранения и результат поместить также прямо в нужное место.

опять же в си нельзя? там нет указателей? или глобальных переменных?  я могу из своего приложения получить данные в переменной в другом приложении и изменить их. (сейчас правда не уверен, под винду 100 лет не кодил, но раньше точно мог)

25 минут назад, Starichok сказал:

как это можно сделать в ассемблере.

я уже писал выше, но вы меня не поняли. не всегда программист умнее компилятора... по этому это дело случая) а вы скзаали раз я тупой то это моя проблема.

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

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

29 минут назад, Starichok сказал:

возможно, это у меня осталось с тех давних времен, когда программная память (ПЗУ) была маленькой (по сравнению с современными МК) и приходилось экономить каждый байт (а не такт).

у меня тоже есть это есть, я всегда стараюсь юзать как можно меньше памяти, юзать макросы и инлайн функции, я всегда плююсь когда вижу код uint32_t pct = 0;

где идет установка допустим от 0 до 100 процентов с шагом 1 процент. зачем там uint32. но тем не менее тут и без ассемблера можно обойтись, как и с битовыми масками, с указателями и тд.

я не утверждаю что на си можно сделать все то же что на асм, я лишь говорю что не сталкивался еще с тем что бы мне нужен ассемблер был в моем хобби)

33 минуты назад, Starichok сказал:

а на счет такта - я уже говорил где-то, что в современных МК такты процессора никто не видит, мы можем видеть только машинный цикл.

вот я все собираюсь делать осцил, пока делал на макетке наброски, я не думаю что перейдя на асм моя прошивка быстрей заработает. если я пишу в  BSRR или BRR или еще куда, то разве этот код не скомпилится верно? и будет занимать больше тактов чем на асм? 

 

2 минуты назад, Геннадий сказал:

...Вам...

я ж говорю, тут одни гении :) лишь бы других обосрать даже не видя как чел пишет)

Ну то есть к чему я все это. Не всегда есть необходимость писать на асм. Но я не говорю что на асм писать не нужно вообще)) 

Share this post


Link to post
Share on other sites
2 часа назад, Starichok сказал:

вызов call в Си оказывается обвешен кучей команд PUSH и POP, которых у меня на ассемблере не будет вообще.

Это из-за примитивности кода, уважаемый Старичок. В условиях ограниченного количества РОНов есть необходимость сохранять контекст текущей задачи при вызове функции (подпрограммы). Например, есть некая программа (она тоже вызов, но из основного цикла) сортировки массива, которая использует почти все РОНы, поскольку очень ресурсоемкая и применяет регистровую адресацию операндов , а не через ОЗУ, что гораздо медленнее. В этой программе периодически вызывается некая функция, которой тоже нужны РОНы. Вот в таком случае нужно освободить их от материнской задачи. Для чего их на входе выбрасывают в стек, а на выходе возвращают. Вы можете предложить более быстрое решение этого сохранения-восстановления? :rolleyes:

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • Guest Роман
      By Guest Роман
      Добрый день, форумчане. Такая задача. Хочу создать несколько устройств на светодиодах. Задача каждого в том, чтобы от движения (датчик вибрации, наклона) светодиод начинал моргать, переливаться и т.д. Подпитывается всё от батарейки, конечно же как можно меньших размеров (таблетка).
      Собственно я уже реализовал такое пробное устройство на ATtiny13, вибродатчике 18015 и батарейке CR1220. Всё работает, но хотелось бы это дело и удешевить и уменьшить в размерах, если это конечно же возможно. Особо в параметрах МК я не разбираюсь, но могу сказать что мне от неё точно нужно:
      1) Маленький размер
      2) Как минимум 1 канал ШИМ (а лучше 3, для переливания трёх светодиодов RGB)
      3) Память на 1Кб (программу для одного такого устройства приложу ниже, может её можно и сократить, но не факт что такую же, но на три диода получится ужать)
      4) Низкое потребление или возможность подключения режимов с низким потреблением.
      5) Работа от 3В. (от таблетки)
      6) Возможность программирования через Arduino UNO (но другие варианты тоже рассматриваю, просто Arduino уже есть)

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

      Очень надеюсь на Вашу помощь. Заранее большое Вам спасибо!
      Прикладываю обещанный мною код:
      int vib = 4; int led = 0; long loopTime = 5000; void setup() { pinMode(led, OUTPUT); pinMode(vib, INPUT); } void loop() { if (digitalRead(vib)){ unsigned long currentMillis = millis(); while(millis()-currentMillis<=loopTime) { for(int fadeValue = 0; fadeValue <=255; fadeValue+=5){ analogWrite(led,fadeValue); delay(2); } for(int fadeValue = 255; fadeValue >=0; fadeValue-=5){ analogWrite(led,fadeValue); delay(2); } for(int fadeValue = 0; fadeValue <=255; fadeValue+=5){ analogWrite(led,fadeValue); delay(2); } for(int fadeValue = 255; fadeValue >=0; fadeValue-=5){ analogWrite(led,fadeValue); delay(2); } digitalWrite(led, LOW); delay(600); } } }  
    • By Evgeniy90
      Здравствуйте! Столкнулся со следующей проблемой: при сборке МД "Шанс" дошел до этапа прошивки МК, в итоге запорол 3 атмеги. Прошивал 3 способами:
      1. Через Arduino UNO(As ISP) просто МК
      2. Через Arduino UNO(As ISP) МК внутрисхемно(соответственно с обвязкой)
      3. Через USB ASP внутрисхемно(с обвязкой соответственно).
      Вышло так, что в наличии кварца 11.0592 МГц не было, и я временно впаял 12 МГц. Прошил трижды всё правильно(фьюзы , контакты и т.д). После прошивки просто не видит МК (ну и плата не работает без МК.да и Бог с ней, но МК всеравно не могу считать). В чем причина понять не могу. Одно думаю, что это разница между 11.0592 и 12 МГц. Посоветуйте как решить проблему.
      Коды ошибок после прошивки во всех трёх случаях одинаковые:
      Sinaprog -invalid device signature
      Averdude -avrdude: warning: cannot set sck period, please check for usbasp firmware update
      target don't answer
    • By Engineerr
      Кто использует microPascal for AVR? 
      Полезные ссылки, программы, примеры.
    • By Sova
      Добрый день. Опять ATMega, опять таймер 1, вопрос рутинный, но я за сегодня уже извёлся. Что я хотел сделать: МК должен рассчитывать положения моторов (SG90, регулируются временем импульса), включать их все вместе по совпадению таймера 2, затем рассчитывать, когда какой мотор надо отключить, получившийся список сортировать и ставить таймер 1. Таймер 1 сработал - выключили мотор, переставили таймер 1 на подальше. Снова сработал - снова что-то там сделали, увеличили OCR1A и так далее. Конечно же с первого раза не заработало и я начал упрощать и локализировать проблему.
      Получилось вот что: при срабатывании прерывания на совпадение таймера 1 с OCR1A я смотрю в отладчик - а там во-первых TIFR = OCF1A + OCF1B + TOV1, а TCNT1 равен чему угодно, но не OCR1A. Таймер как будто срабатывает не тогда. А когда я ставлю значение поменьше, допустим, OCR1A = 1000 и перехожу в пустой цикл while(1){}, то при наступлении OCR1A == 1000 просто ничего не происходит, прерывание не срабатывает. В целом так. Сейчас очень упрощённый, минимально не работающий код выглядит так:
      #define SET(_REGISTER, _BIT) _REGISTER |= 1 << _BIT #define UNSET(_REGISTER, _BIT) _REGISTER &= ~(1 << _BIT) void local_timer_setup(void) { SET(TCCR1B, CS10); //Setting timer 1 to x1 mode }; void local_timer_start(void) { TCNT1 = 0; SET(TIMSK, OCIE1A); //Allow timer 1 match A interruption }; void local_timer_off(void) { UNSET(TIMSK, OCIE1A); //Prohibit timer 1 match A interruption }; ISR(TIMER1_COMPA_vect) { PORTD = 0xFF; local_timer_off(); }; ISR(TIMER2_COMP_vect) { if (global_timer_count == 2) { global_timer_count = 0; TIFR = 0; PORTD = 0; if (current_step < 10) OCR1A = 0xFFF; else OCR1A = 0xFFFF; if (current_step == 20) current_step = 0; else current_step++; local_timer_start(); } else global_timer_count++; }; Полный код в файле. sei() не забыл. Кстати, таймер нормально выключать/включать через TIMSK, как у меня? Заранее спасибо. 
      Scarecrow_embeded.rar
    • By dron92
      Подскажите как вернуть к жизни контролер или в утиль!
      Решил собрать программатор AVRISP mkII купил микросхему собрал подключил а устройств нет в диспетчере и  Flip не видит его!
      Начал искать косяки в сборке не нашел решил спаять Отладочная плату
      тот же результат, попробовал подключить через ISP не отвечает !
      Решил пойти на крайние меры  подключил через FuseDoctor сигнатуру он не видел вел 1e9482 вроде увидел но результата сбросить не проучилось но теперь он начал видится в таком формате фото внизу




×
×
  • Create New...