ATtiny13A 101 применение

auct
Offline
Зарегистрирован: 14.12.2014

Joiner пишет:

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

Проект из которого Вы копировали называется "Шар судьбы".

Хотя может я и ошибаюсь...Может Вы и есть тот автор?

Я не автор. "Шар судьбы" на Хабре как учебник для меня был.

auct
Offline
Зарегистрирован: 14.12.2014

bodriy2014 пишет:

После включения моргаем вторым пином и спать, отключая лишнее!(

так как это ни какое не устройство то и ответ без картинок))

Если программируете тини через ардуино, значит вы сами в файл boards.txt добавляли меню ATtiny13.

так там есть строка с lock_bits ее и редактируете.

Лично я заливая прошивки через Arduini ISP использую для установки фьюзов SinaProg она поддерживает ардуино.

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

ЗЫ: Хотя я думаю, что человек, который сможет клонировать прошивку, сможет такое и сам запилить.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Может ли Attiny работать как HID?

Например, получать из Serial координаты мыши и пихать в USB HID команды перемещения курсора.

Или это умеют только 32u4?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Tomasina, может. Но библа V-USB занимает примерно 2 кило флеша. Соответссно в МК должно быть хотя бы 4 кило флэша)

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013

Всем привет.

Есть какието непонятки с работой PWM в Attine13.

Собираю простую электронную свечку. Вот по этой схеме.

Три леда, два из них запаролелены и сидят на PB1, а третий сидит на PB0.

Для ШИМ хотел использовать RANDOM но в тиньку он не влезает. Поэтому сделал два вектора и в цикле по ним бегаю.

Но почемуто, если в десятой строке вместо переменной pwmY[i] ставлю какое нибуть постоянное число, оба выхода ШИМ отключаются (проверял скопом).

Если в девятой строке вместо переменной pwmR[i] прописываю какую нибуть постоянную, то тогда всё вроде работает но всё равно как то не корректно, в концеили в начале цикла FOR происходит какаято задержка и леды горят около 2 секунд постоянно (не мерцают).

Что я не правильно делаю?

 

int pwmY[100]={121,114,156,188,180,163,163,116,166,109,127,144,170,150,165,183,119,151,190,169,133,167,172,146,175,139,100,172,190,179,137,108,127,191,167,155,111,125,192,101,161,176,177,173,128,146,178,187,174,136,191,159,118,192,140,133,165,125,140,157,129,118,107,129,134,133,182,197,135,160,154,195,179,192,177,188,182,192,102,180,106,151,110,167,128,115,133,170,154,199,110,115,111,107,115,125,119,178,131,105,};
int pwmR[100]={97,75,75,78,96,73,78,86,54,61,94,85,51,84,82,56,54,59,73,100,71,52,54,58,96,72,51,55,86,67,64,61,62,53,61,61,56,73,54,83,74,82,73,61,53,79,65,100,81,81,77,87,59,52,71,91,98,78,68,100,80,83,73,92,74,90,50,82,100,54,57,98,67,50,100,81,51,61,89,73,98,66,75,78,75,67,76,87,97,99,63,74,58,59,74,76,61,65,96,92,};
void setup() 
{ 
}
void loop()
{
  for (int i=0;i<100;i++){
    analogWrite(0,pwmR[i]);// Выводим шим для красного
    analogWrite(1,pwmY[i]);// Выводим шим для желього
    delay(50);
  }
}

 

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Насчёт USB - точно помню, у микросина читал о порте V-USB на ATTiny10 - uWire. Гуглите, может и то)

ggarry
Offline
Зарегистрирован: 21.01.2016

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

 

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013
int pwmY[100]={121,114,156,188,180,163,163,116,166,109,127,144,170,150,165,183,119,151,190,169,133,167,172,146,175,139,100,172,190,179,137,108,127,191,167,155,111,125,192,101,161,176,177,173,128,146,178,187,174,136,191,159,118,192,140,133,165,125,140,157,129,118,107,129,134,133,182,197,135,160,154,195,179,192,177,188,182,192,102,180,106,151,110,167,128,115,133,170,154,199,110,115,111,107,115,125,119,178,131,105,};
int pwmR[100]={97,75,75,78,96,73,78,86,54,61,94,85,51,84,82,56,54,59,73,100,71,52,54,58,96,72,51,55,86,67,64,61,62,53,61,61,56,73,54,83,74,82,73,61,53,79,65,100,81,81,77,87,59,52,71,91,98,78,68,100,80,83,73,92,74,90,50,82,100,54,57,98,67,50,100,81,51,61,89,73,98,66,75,78,75,67,76,87,97,99,63,74,58,59,74,76,61,65,96,92,};
void setup() 
{ 
  pinMode(PB3, OUTPUT);
}
void loop()
{
  for (byte i=0;i<10;i++){
    analogWrite(0,pwmR[i]);// Выводим шим для красного
    analogWrite(1,pwmY[i]);// Выводим шим для желього
   for (int i=0;i<1000;i++){
   digitalWrite(PB3, LOW);//вместо задержки
   }
  }
}

Не помогло :(

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Zahar пишет:

int pwmY[100]={121,114,156,188,180,163,163,116,166,109,127,144,170,150,165,183,119,151,190,169,133,167,172,146,175,139,100,172,190,179,137,108,127,191,167,155,111,125,192,101,161,176,177,173,128,146,178,187,174,136,191,159,118,192,140,133,165,125,140,157,129,118,107,129,134,133,182,197,135,160,154,195,179,192,177,188,182,192,102,180,106,151,110,167,128,115,133,170,154,199,110,115,111,107,115,125,119,178,131,105,};
int pwmR[100]={97,75,75,78,96,73,78,86,54,61,94,85,51,84,82,56,54,59,73,100,71,52,54,58,96,72,51,55,86,67,64,61,62,53,61,61,56,73,54,83,74,82,73,61,53,79,65,100,81,81,77,87,59,52,71,91,98,78,68,100,80,83,73,92,74,90,50,82,100,54,57,98,67,50,100,81,51,61,89,73,98,66,75,78,75,67,76,87,97,99,63,74,58,59,74,76,61,65,96,92,};
void setup() 
{ 
  pinMode(PB3, OUTPUT);
}
void loop()
{
  for (byte i=0;i<10;i++){
    analogWrite(0,pwmR[i]);// Выводим шим для красного
    analogWrite(1,pwmY[i]);// Выводим шим для желього
   for (int i=0;i<1000;i++){
   digitalWrite(PB3, LOW);//вместо задержки
   }
  }
}

Не помогло :(

Привет.

Могу написать.

И проверить на своем шилде https://www.youtube.com/watch?v=TS-b9FpGlYs

ggarry
Offline
Зарегистрирован: 21.01.2016

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

 

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015
Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013

bodriy2014 

Огромное спасибо за проделанную работу.

Вот только один вопрос, почему когда я комментирую одну из этих строк

OCR0A=pwmR[i];

OCR0B=pwmY[i];

ШИМ проподает на обоих каналах?

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Zahar пишет:

bodriy2014 

Огромное спасибо за проделанную работу.

Вот только один вопрос, почему когда я комментирую одну из этих строк

OCR0A=pwmR[i];

OCR0B=pwmY[i];

ШИМ проподает на обоих каналах?

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

если еще будут корректировки пишите сразу чтоб все проверил и внес в скетч.

 

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013

Нет, нет, корректировок больше не будет.

Просто я пытаюсь понять что и как. Я учился на 5081, там всё по другому, вот и пытаюсь понять как работать с этим зверем.

 

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Zahar пишет:

Нет, нет, корректировок больше не будет.

Просто я пытаюсь понять что и как. Я учился на 5081, там всё по другому, вот и пытаюсь понять как работать с этим зверем.

А зачем в схеме Q4,Q5,Q6 ?

Как только мосфет откроется они подтянут затвор к земле и мосфет закроется диод не успеет разгореться.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

А в какой программе схему рисовали?

Так должно работать

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

bodriy2014 пишет:

А зачем в схеме Q4,Q5,Q6 ? Как только мосфет откроется они подтянут затвор к земле и мосфет закроется диод не успеет разгореться.

Это схема управления со стабилизацией тока, :)

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

dimax пишет:

Это схема управления со стабилизацией тока, :)

Спасибо понял, вы как всегда-зрите в корень.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Zahar, посмотрел ваш скетч на осциллографе, и пожалуй есть что сказать. Похоже скетч ваш не работал никогда. Не в вашем случае, и не в том (к сожалению), что вам предложил мой коллега bodriy2014. То что вы считали работой -был какой-то хаос к работе никак не относящийся. Давайте вспомним сколько памяти в тини13, что б не лезть в даташит -напомню -64 байта. Давайте посмотрим сколько вы ему пытаетесь засунуть в память -два массива по 100 слов, т.е. 400 байт!!! В принципе вы могли бы создавать массивы не INT а byte, но глобально бы это проблему не решило -вы б получили суммарный массив в 200 байт. А у нас всего 64.  Ваша задумка совершенно негодится. Но выход есть, записывать массив во флэш, через PROGMEM , соответссно и читать потом через PROGMEM, тогда скорее всего идея заработает.

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013

Простите что так долго не отвечал.

dimax прав, Q4-Q6 это действительно стабилизация тока. Кстати если кому интересно, считается очень просто.

На R7-R9 должно падать около 0,7В. Следовательно, если Диод трёх ватный его ток 0,7А, отсюда 0,7В/0,7А=1Ом.

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013

dimax, я так и предпологал что там какойто бред на выходе. Поэтому хотел посмотреть каждый выход отдельно.

Массив byte, я тоже пробовал, вообще переставало работать. Щас попробую загнать во флэш.

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013

Вот так, правильно?

#include <avr/pgmspace.h>
byte PROGMEM pwmY[100]={
  121,114,156,188,180,163,163,116,166,109,127,144,170,150,165,183,119,151,190,169,133,167,172,146,175,139,100,172,190,179,137,108,127,191,167,155,111,125,192,101,161,176,177,173,128,146,178,187,174,136,191,159,118,192,140,133,165,125,140,157,129,118,107,129,134,133,182,197,135,160,154,195,179,192,177,188,182,192,102,180,106,151,110,167,128,115,133,170,154,199,110,115,111,107,115,125,119,178,131,105,};
byte PROGMEM pwmR[100]={
  97,75,75,78,96,73,78,86,54,61,94,85,51,84,82,56,54,59,73,100,71,52,54,58,96,72,51,55,86,67,64,61,62,53,61,61,56,73,54,83,74,82,73,61,53,79,65,100,81,81,77,87,59,52,71,91,98,78,68,100,80,83,73,92,74,90,50,82,100,54,57,98,67,50,100,81,51,61,89,73,98,66,75,78,75,67,76,87,97,99,63,74,58,59,74,76,61,65,96,92,};
void setup() 
{ 
  pinMode(PB3, OUTPUT);
}
void loop()
{
  for (byte i=0;i<100;i++){
    byte buffR = pgm_read_byte(&pwmR[i]); // чтение байта из флэш
    byte buffY = pgm_read_byte(&pwmY[i]); // чтение байта из флэш
    analogWrite(0,buffR);// Выводим шим для красного
    analogWrite(1,buffY);// Выводим шим для желього
    delay(50);
  }
}

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Zahar, ну да, похоже . Если не считать того, что массивы нужно сделать const  и пинмоде не правильно.

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013

Всё заработало :) 

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

Когда закончу, выложу фотки.

Всем огромное спасибо!!!

karl2233
Offline
Зарегистрирован: 05.07.2015

всем привет в этом чатике(с)

суть такова - хочу сделать индикатор типа вольтметра на Тиньке, что б три диодика поочерёдно зажигались при разных напряжениях на батарее.

вопрос:

правильно ли я понимаю, что можно написать программку для Attiny13 в ИДЕ.

потом, выбрав соответствующий МК, загрузить в Тиньку?

понятно что библиотеки и прочее надо(уже поставил).

MacSim
Offline
Зарегистрирован: 28.11.2012

maksim пишет:

Практика показывает, что на Attiny13 с дуиновскими функциями далеко не уедешь... уж слишком они объемные.

а на меге на них катаетесь значит. выкидывайте их потихоньку.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

karl2233 пишет:

....

правильно ли я понимаю, что можно написать программку для Attiny13 в ИДЕ.

потом, выбрав соответствующий МК, загрузить в Тиньку?

...

Да можно.

ggarry
Offline
Зарегистрирован: 21.01.2016

Тини13 с помощью Ардуины легко управляет 12 светодиодами в режиме вольтметра. А если не страшно вывод сброса задействовать то как-раз 20 светиков доступно. Не чип а сказка.

 

minamonra
Offline
Зарегистрирован: 18.06.2014

HWman пишет:

Ну наконец-то написал. Как восстановить неправильно выставленные фьюзы в ATtiny:
http://habrahabr.ru/post/249967/
Пользуйтесь.

HWman, а этот вариант не собирал?

https://sites.google.com/site/wayneholder/attiny-fuse-reset-with-12-volt-charge-pump

выглядит более безопасно, собрать платку под него что-ли... две tiny45 лежат заблокированные.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Кто интересуется поделками на Тини13, вот моя еще одна.

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

Видео работы.

 

 

BlackPhreaker
BlackPhreaker аватар
Offline
Зарегистрирован: 29.02.2016

Однозначно забираю в коллекцию!!!

vkn
Offline
Зарегистрирован: 02.03.2016

Уважаемые, помогите разобраться!

Пытаюсь прошить attiny 13a как при помощи ардуино, так и при помощи USBasp v.2 (перемычку JP3 ставить пробовал) в IDE 1.6.7 и получаю вот такую ошибку:


Скетч использует 350 байт (34%) памяти устройства. Всего доступно 1 024 байт.
Глобальные переменные используют 4 байт динамической памяти.
java.lang.NullPointerException
	at cc.arduino.packages.uploaders.SerialUploader.uploadUsingProgrammer(SerialUploader.java:272)
	at cc.arduino.packages.uploaders.SerialUploader.uploadUsingPreferences(SerialUploader.java:83)
	at cc.arduino.UploaderUtils.upload(UploaderUtils.java:78)
	at processing.app.Sketch.upload(Sketch.java:1178)
	at processing.app.Sketch.exportApplet(Sketch.java:1152)
	at processing.app.Sketch.exportApplet(Sketch.java:1124)
	at processing.app.Editor$DefaultExportAppHandler.run(Editor.java:2525)
	at java.lang.Thread.run(Thread.java:745)

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

Последний раз использовал простейший код мигания светодиодом:

	void setup() {               
  pinMode(0, OUTPUT); 
}
void loop() {
  digitalWrite(0, HIGH);
  delay(1000);
  digitalWrite(0, LOW);
  delay(1000);
}

Может быть у кого-то еще была подобная ошибка?

Пробовал устанавливать частоту 1,2; 4,8; 9,6 Мгц - на результат это не повлияло.

И вообще какую софтину вы используете совместно с USBasp?

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

vkn пишет:

Может быть у кого-то еще была подобная ошибка?

И вообще какую софтину вы используете совместно с USBasp?

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

vkn
Offline
Зарегистрирован: 02.03.2016

С драйверами все ок, этим USBasp шил atmega 328P без как-либо проблем. 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Откатись на более старую версию IDE, например 1.6.6. - 1.6.0. Свежие ночные сборки лучше не ставить вообще, сырые и глючные.

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

vkn пишет:

С драйверами все ок, этим USBasp шил atmega 328P без как-либо проблем. 

ты компьютер перезагрузил?

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

Jeka_M пишет:

Откатись на более старую версию IDE, например 1.6.6. - 1.6.0. Свежие ночные сборки лучше не ставить вообще, сырые и глючные.

такая ошибка джавы случается на всех версиях иде

vkn
Offline
Зарегистрирован: 02.03.2016

Да, я писал, что более старые пробовал и комп конечно же перезагружал.

vvg10
vvg10 аватар
Offline
Зарегистрирован: 18.04.2013

Доброго дня! Подскажите, правильно ли написан скетч. Алгоритм такой: ноги 2 и 3 входы, на которые подается 0( скажем кнопки на землю), 5 выход ШИМ. Задача: на 2 - 0, на 3 - 0 -- ШИМ100%, на 2 - 0, на 3 -1 -- ШИМ75%, на 2 - 1, на 3 - 1 -- ШИМ50%. И с частотой ШИМ, что-то никак не разберусь. Нужна от 1 до 5 кГц любая. Какая в моем скетче?

#define in1Pin 2
#define in2Pin 3
#define PWMPin 5


void setup(){ 

pinMode(in1Pin, INPUT);       
digitalWrite(in1Pin, HIGH);

pinMode(in2Pin, INPUT);        
digitalWrite(in2Pin, HIGH);

pinMode(PWMPin, OUTPUT);        
digitalWrite(in2Pin, HIGH);




TCCR0A=0x83;  
TCCR0B=0x01;  
OCR0A=0x00;   
              
} 

void loop() 
{ 

  if (digitalRead(in1Pin)==LOW && digitalRead(in2Pin)==LOW){
  OCR0A=255;  
  }           
              
  if (digitalRead(in1Pin)==LOW && digitalRead(in2Pin)==HIGH){
  OCR0A=190; 
  }

  if (digitalRead(in1Pin)==HIGH && digitalRead(in2Pin)==HIGH){
  OCR0A=130;  
  }
} 

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

vvg10, в вашем скетче частота шим = тактовая частота МК / 255. Не понятно что вы подразумеваете под пинами 2,3 и 5. Указывать нужно по битам порта. Выход oc0a на PB0, соответссно PWMpin 0

vvg10
vvg10 аватар
Offline
Зарегистрирован: 18.04.2013

Пины 2, 3 и 5 - нумерация ног тиньки. Соответственно PB3, PB4, PB0. Как задать частоту 1 кГц? И про правильность написания хотелось бы услышать. Да, кнопки подразумеваются с фиксацией.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

vvg10, 1) не припомню такой возможности, что бы номер ноги можно было давать вместо номера порта для pinMode и прочего digitalWrite. Так что если не заработает -не удивляйтесь)

2)в таймере  тини13 можно выбрать что-то  одно: либо гибко регулировать скважность, либо частоту. В вашем случае можно частоту менять делителем прескалера. А именно задавая параметр в регистр TCCR0B=; как дополнительный делитель к вышеупомянутой формуле.

1 -дополнительно делить на 1

2-.. на8

3 -.. на64

4-..на 256

5-..на 1024

 

vvg10
vvg10 аватар
Offline
Зарегистрирован: 18.04.2013

 Я понял, что нужно задавать так 

01 #define in1Pin 4
02 #define in2Pin 3
03 #define PWMPin 0
 
 Просто во всех прошлых проектах на Ардуино задавал именно нумерацию пинов платы. А про остальное что скажете?
dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

vvg10, про остальное особо не к чему придраться. Я бы лично применил энкодер, и регулировал бы скважность по-человечески от 0 до 255. Или переменный резистор на аналоговый вход. Хотя конечно смотря какая задача. Например для управления фонариком достаточно одной кнопки, и перебирать ею  несколько градаций скважности.

vvg10
vvg10 аватар
Offline
Зарегистрирован: 18.04.2013

Спасибо. Именно для фонаря, но управление двумя сигналами, поэтому так как есть. Еще раз спасибо.

karl2233
Offline
Зарегистрирован: 05.07.2015

я эта, программу написал =) 

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

в УНО работает(порты другие) а при заливке в Тини13 - не алё.

#define Led 0 // led
#define Led 1 // led
#define Led 2 // led
int analogIn = 4; // input
int analogValue = 0;  
void setup()
{
  //pinMode(0, OUTPUT);
  //pinMode(1, OUTPUT);
  //pinMode(2, OUTPUT);
 }
void loop()
{
 if(millis() % 500 == 0) // Каждые 500 мс (% - остаток от деления)
   analogValue = analogRead(analogIn);
   
 if (analogValue > 800)// 800=16,4V;
   {
   digitalWrite(0, HIGH);
   digitalWrite(1, LOW);
   digitalWrite(2, LOW);
   }
 if (analogValue > 700 & analogValue < 799)  // 700=14,4V; 700-799
   {
   digitalWrite(0, LOW);
   digitalWrite(1, HIGH);
   digitalWrite(2, LOW);
   }
 if (analogValue > 650 & analogValue < 699)  // 600=12,8V;650-699
   {
   digitalWrite(0, LOW);
   digitalWrite(1, LOW);
   digitalWrite(2, HIGH);
   }
/if (analogValue < 649) 
   {
   digitalWrite(0, LOW);
   digitalWrite(1, LOW);
   digitalWrite(2, LOW);
 }
    

подскажите, плз, что не так?

скетч BLINK заливал в Тини13, всё работает, а этот ни в какую.

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

karl2233, да тоже самое что и у предыдущего товарища. Вы читаете якобы аналоговый вход 4, но такого не существует. Их всего4, но счёт с ноля. Поэтому последний -вход 3.

karl2233
Offline
Зарегистрирован: 05.07.2015

dimax, отблин... я невнимательтный тормоз.

спасибо за подсказку!

в первом посту прочитал, а последний не удосужился. 

всё работает =) я теперь Великий Кукурузо

====================================

з.ы. возникает вопрос - ведь в Тини13 пять портов(RST не считаю), как их обозначать? или я что-то не так понимаю?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

karl2233, что значит обозначить? Всё уже обозначено. У портов есть номера. У цифровых от 0 до 5, у аналоговых от 0 до 3.

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

17.03.2016 Обновил статью на geektimes, об нововведениях читайте тут.