Jump to content
Cheshire Cat

Дайте советы новичку по программированию МК

Recommended Posts

Здравствуйте, только начал свой путь в программировании микроконтроллеров. Прошу советов в целом и ответов на вопросы в частности(они ниже).

1) Какие книги читать? По порядку от начального уровня и далее. Я сейчас читаю книгу Белова А. В. "Микроконтроллеры AVR. От азов программирования до создания практических устройств".

2) Какие программы использовать? В целом, не знаю какие вообще нужны программы для этого дела. Я сижу на Lunux, но могу и с вириальной машины запускать.

2.1) Можно ли для написания программы использовать C++? я немного знаю C, но сильно хуже чем C++. 

3) Можно ли обойтись без покупки реальных схем и инструментов? Хотя бы по первой. Понятно дело, что если развиваться в этом направлении, то без этого не обойтись. Но есть ли такая программа в которой можно собрать схему, в ней в микроконтроллер загрузить программу и посмотреть как она работает?

Share this post


Link to post
Share on other sites

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

2.1) Можно. Ардуино. Но смысл? Вы научиться хочете или что-то делать? Научится - надо начинать с асембера, потом С а С++ чистый оставь профессионалам. Дело в том что он разработан чтобы быстро делать программы, за счет повышенного потребления ресурсов. Но если у вас хрошо проработан алгоритм, всё продумано то и на С можно неплохо писать, учитывая некоторые особенности. Почему с асемблера? А чтобы у вас потом небыло вопросов связанных с работой с памятью, не задавались вопросом а почему это операции с плавающей запятой отнимают так много времени и памяти во флеше и т.д. и т.п.

3) Как всегда - МОЖНО, но будет очень сложно. Проще во 100 раз обзавестись реальным железом, хотябы той же платкой ардуино нано, где по сути голый контроллер и на которой вы сможете попрактиковать и ассемблер и С, и С++ в виде ардуиновской среды. Ну и само собой безпаечную макетку, с проводками светодиодами, дисплеями и прочими штуками.

Кстати светодиоды - +50 к отладке, ЖК дисплей - +1000 к отладке.

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

Share this post


Link to post
Share on other sites
Posted (edited)
16 часов назад, Cheshire Cat сказал:

 Прошу советов в целом и ответов на вопросы

Всецело поддерживаю Alexeyslav . Если сидите на Lunux то найдите компилятор для вашего микроконтроллера который может в нем работать и соответственно книгу которая его описывает. Достаточно часто с книгой бывают и диски с самой программой и примерами. Но самым главным и основным будет даташит . В нем подробно описана архитектура вашего микроконтроллера и что самое главное описаны все регистры и что в них нужно записывать чтобы управлять работой контроллера и писать программу. Писать естественно придется только на С. Так что придется его изучить суть глубже. Из симуляторов на памяти только Протеус. Но это еще тот монстр. Так что купить макетную плату панельку под микроконтроллер и простенький програматор будет лучшим вариантом. Как вариант купить программатор с функцией отладки. Ардуино вообще не рассматривается если действительно хотите изучить программирование микроконтроллеров

Edited by musa56

Share this post


Link to post
Share on other sites

Вебинар STM32G0 – новый лидер бюджетных 32-битных микроконтроллеров от STMicroelectronics

Компания Компэл приглашает вас 25 сентября принять участие в вебинаре, который посвящен новому семейству микроконтроллеров STM32G0. Вебинар рассчитан на технических специалистов и тех, кто хорошо знаком с семейством STM32. На вебинаре будут освоены современные методы тестирования производительности микроконтроллеров на примере самых бюджетных 32-битных семейств общего назначения STM32G0 и STM32F0 и проведено их подробное сравнение.

Подробнее

2 часа назад, Alexeyslav сказал:

...Вы научиться хочете или что-то делать? Научится - надо начинать с асембера...

Полностью поддерживаю.

1 час назад, musa56 сказал:

...Писать естественно придется только на С... 

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

Так что решать автору. От себя могу порекомендовать (для широкораспространенных AVR) VMLAB 3.15. И компилятор, и симулятор в одном флаконе. 

Share this post


Link to post
Share on other sites
32 минуты назад, Геннадий сказал:

На Си их конструируют

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

Share this post


Link to post
Share on other sites
                     

Литиевые батарейки Fanso в беспроводных датчиках пожарно-охранной сигнализации

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

Подробнее...

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

 применяя готовые библиотеки (кубики) и переставляя их местами. Шедевров, в данном случае не получается...

Это вы о чем? "С" обычный язык програмирования и к микроконтролерам никакого отношения не имеющий.  Соответственно никаких "кубиков" в нем нет. Програмирование микроконтролеров в первую очередь заключается в записи  в регистры и чтении из них управляющих слов по определенному алгоритму . И к стати совершенно неважно как вы это делаете на асемблере или на "С". Асемблер низкоуровневый язык  более привязаный к железу но из за этого програмировать на нем сложнее. "С" универсальный язык и  код асемблера получается после обработки компилятором. Естественно из за того что Язык "С" не привязан к железу то код получается не совсем оптимальным. Но писать на "С" удобнее. К стати не обязательно и на "С". Есть компиляторы и для других языков

Share this post


Link to post
Share on other sites
Posted (edited)
8 минут назад, musa56 сказал:

Програмирование микроконтролеров в первую очередь заключается в записи  в регистры и чтении из них управляющих слов по определенному алгоритму .

В общем случае СОВСЕМ НЕ ТАК. Собственно, записи в регистры заканчиваются написанием драйверов. Основная часть кода ни в какие управляющие регистры ничего не пишет.

Edited by my504

Share this post


Link to post
Share on other sites
19 часов назад, Cheshire Cat сказал:

Прошу советов

Советы давать - не мешки ворочать.  Держите еще один.:)

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

Share this post


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

Собственно, записи в регистры заканчиваются написанием драйверов.

Ну да чтобы поморгать светодиодиком мне нужно написать драйвер. Ну и зачем. Не проще загрузить в таймер значение и по окончании счета вывести в порт.

Share this post


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

чтобы поморгать светодиодиком

Моргание светодиодиком к программированию МК имеет такое же отношение, какое имеет пассажир автобуса к вождению болида формулы 1.

Share this post


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

Соответственно никаких "кубиков" в нем нет.

Одна конструкция FOR уже чего стоит, или даже элементарный IF, CASE... это ещё те кубики...
Но вообще С не люблю за то что один лишний символ может изменить смысл написанного кардинально, и оно ещё и скомпилируется.

17 минут назад, musa56 сказал:

Собственно, записи в регистры заканчиваются написанием драйверов.

Вообще это называется HAL. И написание аткой прослойки для контроллера позволяет даже делать портабельный код на ассемблере, просто для разных контроллеров подключается свой HAL, написанный заранее. Но это всё нудно и неинтересно, поэтому люди берут С-шку, плюются но едят кактус потому что для С сообщество уже написало HAL чуть ли не под каждый контроллер.

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

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

На младших AVR этот драйвер вырождается в одну конструкцию SBI/CBI иногда чуть сложнее, а вот для STM32 приходится писать драйвер - там и инициализация сложная, и сам процесс установки ножки порта может растянутся на 3-4 инструкции, одним алиасом уже не обойтись.

Share this post


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

Но вообще С не люблю за то что один лишний символ может изменить смысл написанного кардинально

Знаю Pascal/delphi, немного С++ (больше в среде builder), приходится на VB кое-что писать. AVR на асмике. Наверное в assemblere еще больше лишний или неверный символ посылает в хаос. 

21 час назад, Cheshire Cat сказал:

Какие книги читать?

У самого Ревич "Практическое программирование микроконтроллеров ATMEL AVR на языке ассемблера". Книжка на вид солидная, пока не начинаешь писать код. Не рекомендую. Некоторую пользу конечно принесла, но ей одной ограничится невозможно. Понимаю что,  переписывать datasheet пустая трата времени но хотя бы основные нюансы можно было расписать.

22 часа назад, Cheshire Cat сказал:

Какие программы использовать? ...Я сижу на Lunux,

 Не совсем то но... РАБОТА С ПРОГРАММАТОРОМ ОТ PROTTOSS В LINUX Самому не пригодилось, есть и debian и XP на одной машине, но чаще использую XP - ленивый я.

2 часа назад, _abk_ сказал:

Как симулятор вполне пойдет и Proteus.

У меня лично неважно работает с контроллерами AVR (tiny13, tiny2313, mega8 пробовал)

Share this post


Link to post
Share on other sites
Posted (edited)

Бог мой... народ, что вы такое несете?! Программирование - это запись в регистры... это кубики... это язык...

ВСЕ сказанное - это мизерная часть, ничтожно малая. Т.е. пренебрежимо малая. Программирвоание МК ничем не отличается от программирвоания для винды, линуха или написания скриптовых движков для сайтов.

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

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

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

Лично мне больше всего помогли книги Гради Буча по объектному программированию, название, к сожалению, забыл. Там нет ни одной строчки на реальном языке программирования, но после её прочтение ощущаешь себя специалистом. Ну и логика - к сожалению, дисциплина полностью изгнанная из учебных планов большинства ВУЗов (технических, если не ошибаюсь, поголовно всех). Без логики в программирование соваться нечего. Математика - для любительства достаточно базового школьного курса, если лучше - то лучше. Но никак не хуже.

Такое вот моё мнение.

Edited by ARV

Share this post


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

На младших AVR этот драйвер вырождается в одну конструкцию SBI/CBI иногда чуть сложнее

Это зависит от задачи и схемотехники. И дело не в шаблонах структур для простой инициализации регистров в STM. Драйверы создают общую диаграмму работы УСТРОЙСТВА (а не МК). и эта диаграмма может быть совершенно примитивной для АРМа и головоломно сложной для шестивыводного МК.

6 часов назад, Serb_ret сказал:

Наверное в assemblere еще больше лишний или неверный символ посылает в хаос.

Лишний символ на АСМе приводит к генерации ошибки и никуда никого не посылает. Речь шла о том, что ЛЮБОЙ слой абстракций способен как удачно зачистить цель для ее постижения, так и забить наглухо непроходимой стеной. В этом смысле АСМ более открыт, ибо все абстракции в нем мы создаем сами. В отличии от Си, где нужно порой бороться не только с логикой алгоритма, но и с логикой компилятора.

Share this post


Link to post
Share on other sites
Posted (edited)
4 часа назад, my504 сказал:

 И дело не в шаблонах структур для простой инициализации регистров

Господа давайте не будем уж слишком углубляться. Чел только пытается начать программировать микроконтроллеры. С таким обсуждением мы напрочь отобьем всякую охоту их изучать . Ему бы что нибудь совсем простое

Edited by musa56

Share this post


Link to post
Share on other sites

Программатор кстати AVRDUDE нативно линуксовый, в комплекте с железной реализацией USBASP.

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. 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

    • By Вячеслав_НС
      Здравствуйте ! подскажите , какую лучше библиотеку использовать (и где ее взять) для управления i2c atmega8 в atmel studio 7  .  задача - управлять atmega8 по i2c ,  цап  PCF8591T .
      понимаю , в интернете много примеров и библиотек , но хотелось бы пример максимально простой и точно рабочий . т.к. пока что все мои попытки не привели к успеху ... то Atmel Studio 7 при компиляции ругается на несуществующий файл ( к примеру - "stream.h") при использовании библиотеки i2c , то еще какие то грабли .
    • By Глеб Панков
      Собирал усилитель от Урала 114 в корпус, и при последней проверке (как оказалось - еще отнюдь не последней!) выявил, что он гудит. То есть не гудит так, как будто это фон сети, нет. Это импульсы частотой 5-6 герц, не выше. Гул появляется, если крутить ручку переменного резистора, который регулирует низкие частоты (по схеме R3).
      Проходные конденсаторы менял на пленку от фильтров блоков питания. R1 был заменен на 1 килоом, переменный резистор по входу - на 33 килоома. Напряжения на анодах V1.1 - 110 вольт, V1.2 - 100 вольт, V2 и V3 - 250 вольт. Напряжения на катодах такие же, как указано на схеме.
      Цепочку C9 R13 трогал - результата не принесло.
      Подскажите, что делать?
       

    • By Антон Плюшкин
      В общем есть небольшая тривиальная задача - сделать свитюльку. Контроллер управляет светодиодиками, цвета меняются, людишки довольны.
      Схема проста: Attiny44a -> 2n3904 x3 -> RGB-светодиод.
      Собрал, протестил, всё норм, но!
      Как только в коде я использую функцию задержки - _delay_ms (util/delay.h) - контроллер повисает!
      #define F_CPU 16000000UL #include <avr/io.h> #include <util/delay.h> int main(void) { // Input/Output Ports initialization // Port A initialization // Function: Bit7=Out Bit6=Out Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRA=(1<<DDA7) | (1<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0); // State: Bit7=0 Bit6=0 Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); // Port B initialization // Function: Bit3=In Bit2=Out Bit1=In Bit0=In DDRB=(0<<DDB3) | (1<<DDB2) | (0<<DDB1) | (0<<DDB0); // State: Bit3=T Bit2=0 Bit1=T Bit0=T PORTB=(0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Phase correct PWM top=0xFF // OC0A output: Non-Inverted PWM // OC0B output: Non-Inverted PWM // Timer Period: 0,031875 ms // Output Pulse(s): // OC0A Period: 0,031875 ms Width: 0 us // OC0B Period: 0,031875 ms Width: 0 us TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (1<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (1<<WGM00); TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (1<<CS00); TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Ph. correct PWM top=0x00FF // OC1A output: Non-Inverted PWM // OC1B output: Disconnected // Noise Canceler: Off // Input Capture on Falling Edge // Timer Period: 0,031875 ms // Output Pulse(s): // OC1A Period: 0,031875 ms Width: 0 us // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (1<<WGM10); TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10); TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 0 Interrupt(s) initialization TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0); // Timer/Counter 1 Interrupt(s) initialization TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (0<<TOIE1); // External Interrupt(s) initialization // INT0: Off // Interrupt on any change on pins PCINT0-7: Off // Interrupt on any change on pins PCINT8-11: Off MCUCR=(0<<ISC01) | (0<<ISC00); GIMSK=(0<<INT0) | (0<<PCIE1) | (0<<PCIE0); // USI initialization // Mode: Disabled // Clock source: Register & Counter=no clk. // USI Counter Overflow Interrupt: Off USICR=(0<<USISIE) | (0<<USIOIE) | (0<<USIWM1) | (0<<USIWM0) | (0<<USICS1) | (0<<USICS0) | (0<<USICLK) | (0<<USITC); // Analog Comparator initialization // Analog Comparator: Off // The Analog Comparator's positive input is // connected to the AIN0 pin // The Analog Comparator's negative input is // connected to the AIN1 pin ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0); ADCSRB=(0<<ACME); // Digital input buffer on AIN0: On // Digital input buffer on AIN1: On DIDR0=(0<<ADC1D) | (0<<ADC2D); // ADC initialization // ADC disabled ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); unsigned char VL_OCR0A = 0, VL_OCR0B = 0, VL_OCR1A = 0; OCR0A = 0; OCR0B = 0; OCR1A = 0; while(1) { _delay_ms( 100 ); VL_OCR0A = VL_OCR0A + 1; VL_OCR0B = VL_OCR0B + 1; VL_OCR1A = VL_OCR1A + 1; if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; } if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; } if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; } OCR0A = VL_OCR0A; OCR0B = VL_OCR0B; OCR1A = VL_OCR1A; } } Т.е. если указать задержку в начале цикла, то светодиод не светится вообще.
      Если задержку убрать - светодиод немного подсвечивает всеми цветами.
      while(1) { _delay_ms( 100 ); // <--- ЗАДЕРЖКА --- VL_OCR0A = VL_OCR0A + 1; VL_OCR0B = VL_OCR0B + 1; VL_OCR1A = VL_OCR1A + 1; if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; } if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; } if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; } OCR0A = VL_OCR0A; OCR0B = VL_OCR0B; OCR1A = VL_OCR1A; } Где я накосячил?
      З.Ы.: Замечаний по поводу оптимизации кода, излишних переменных и п.р. прошу не писать - изощряюсь как могу ибо не пойму почему не работает
    • By ryabinin
      Здравствуйте.
      Прошу прощения за корявость изложения, с электроникой на Вы. Возникла следующая задача. Есть параллельно соединённая цепь одноцветных дип-светодиодов. Нужно сделать регулировку яркости диодов через сенсорную кнопку: первое касание включает цепь на максимальной яркости, каждое последующее уменьшает яркость на 25%, пятое касание выключает цепь. На фото - как реализовано подобное в китайском светильнике (кнопка тактовая). В гугле выдаёт более "объёмные" решения. За работающую схему с меня вознаграждение)


    • By BosveL
      Есть оптическая мышь. Её считывающий элемент устроен так, что когда мышка в покое, на светодиод (который подсвечивает этот элемент) подается напряжение 1.35 V и 4 mA. Но когда мышку двигаешь, светодиод загорается сильнее и напряжение на нём составляет уже 1.8 V и 24 mA. Необходимо сделать так, чтобы на ардуино приходила логическая единица, означающая, что мышку двигают. Я думаю это сделать с помощью мосфета, только не могу никак подобрать его. Он должен открываться при указанном напряжении (когда мышь двигается) и посылать через повышающий преобразователь 3.3 вольта (т.е. лог. единицу). Если это можно сделать не с помощью мосфета, подскажите пожалуйста свои мысли и идеи.
      ___
      Это будет маска для сна, которая замечает движение глаз в быстрой фазе сна и зажигает светодиоды (на самой маске). Ставил PIR датчик движения, он не хочет работать так близко, срабатывает в 1 из 5 случаев. А вот мышка подходит идеально. Заменил её светодиод на инфракрасный, теперь она работает в невидимом для человеческого глаза диапазоне. Кстати говоря этот ИК светодиод питается отдельно от мышки (с ней он работать не хочет). и теперь контакты, где был родной светодиод (красный) поступает указанные выше значения. Вот с этих контактов хочу взять логическую единицу.  Весь проект написан на ардуино, наработки скетча имеются. Я новичок, поэтому не могу подобрать мосфет. Искал в инете, понял как это работает, но не могу разобраться как его подобрать. Заранее спасибо за помощь.
×
×
  • Create New...