Программная реализация протокола 1-wire (iButton, MicroLan) на микроконтроллерах AVR

1-wire — это низкоскоростная шина связи, разработанная корпорацией Dallas Semiconductor (которая позже была приобретена компанией Maxim Integrated). Особенностью этой шины является то, что и ля питания подключенных устройств, и для обмена данными используется одна и та же пара проводов.

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

В этой статье речь пойдёт о программной реализации применительно к микроконтроллерам семейства AVR (ATtiny, ATmega, ATxmega) фирмы Atmel.

Автор: Погребняк Дмитрий. Самара, 2013.

Видео:Лекция 309. 1-wire интерфейсСкачать

Лекция 309.  1-wire интерфейс

Принцип работы шины 1-wire

Схема подключения сети устройств 1-wire

Питание подводится по тому же проводу, что и данные (т.н. паразитное питание). Провод через подтягивающий резистор (5 кОм, но может быть и ниже, вплоть до 1 кОм) подключен к источнику напряжения 5 Вольт. Устройства реализуют схему с открытым стоком, замыкая линию на «землю». Длительность низкого уровня и определяет передаваемые данные. Для обеспечения питания схем во время передачи данных, устройства содержат внутренний конденсатор 800пФ, который заряжается, пока на шине нет активности.

На шине может быть параллельно подключено несколько ведомых устройств, но ведущее устройство («мастер») должно быть только одно. Такая сеть 1-wire устройств имеет название MicroLan. Обмен инициируется мастером (кроме некоторых специальных случаев, когда используются прерывания). Схема с открытым коллектором реализует «монтажное И», что позволяет в автоматическом режиме перечислить подключенные к шине устройства.

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

Некоторые устройства могут требовать для совершения определённых операций более высокого значения тока на линии, чем то может обеспечить подтягивающий резистор. При наличии таких устройств, в схему должен быть введён подключаемый «сильный» подтягивающий резистор, обеспечивающий питание таким устройствам. Если устройства будут пытаться установить низкий логический уровень на шине (т.е. пытаться замкнуть линию данных на землю) во время работы «сильного» подтягивающего резистора, то это может привести к значительным токам утечки. Поэтому, этот резистор включается лишь временно, на период совершения устройствами операций, при которых потребляется значительный ток (например, когда датчики температуры проводят замер и оцифровку показаний), поэтому, во время такого подключения, активность на линии не допускается.

В каждом устройстве 1-wire жёстко зашита уникальная восьмибайтная последовательность, однозначно идентифицирующая конкретный экземпляр устройства. Эта последовательность включает в себя:

— 1 байт «код семейства» определяющий тип устройства (коды с 0 по 127 зарезервированы для устройств Maxim Integrated/Dallas Semiconductor, коды 128 и выше вкупе с частью серийного номера – для сторонних производителей);

— и 1 байт – контрольная сумма, рассчитанная на основе кода семейства и серийного номера.

Видео:Зачем ставить Микроконтроллер в простые устройства?Скачать

Зачем ставить Микроконтроллер в простые устройства?

Применение 1-wire

Наибольшее применение устройства 1-wire нашли в виде круглых контактных площадок-«таблеток», называемых iButton, многим они знакомы в виде ключей от домофонов (впрочем, некоторые производители домофонов, например «Цифрал», используют иные, отличные от 1-wire, схемы, но выполненные в таком же корпусе). В наиболее простом случае микросхема, спрятанная внутри такой «таблетки», содержит лишь уникальный код и ничего более. Хотя этот код уникальный, такой ключ несложно подделать.

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

Другой пример использования – это различные датчики, например, датчики температуры из серии DS18B20, DS18S20, DS18S22 и им подобные. Использование всего двух проводов делает достаточно удобным подключение серии датчиков, вместе с тем, в отличие от аналоговых датчиков, показания не зависят от длины провода.

В качестве примера ниже будут рассмотрены как раз такие термодатчики.

Видео:Протокол обмена данными 1-Wire (Microlan)Скачать

Протокол обмена данными 1-Wire (Microlan)

Подключение к микроконтроллеру AVR

Подключение к микроконтроллеру AVR

В некоторых источниках рассматривается вариант подключения через последовательный порт, путём замыкания Rx и Tx. В таком варианте при использовании UART работающего на скорости 115200 бод, формируются импульсы нужной формы. Однако такое подключение не лишено ряда недостатков:

— задействованы два вывода микроконтроллера, когда можно вполне обойтись одним;

— порт UART оказывается занятым, а он часто присутствует на микроконтроллере в единственном числе и требуется для иных нужд;

— накладываются схематические ограничения, т.к. шина 1-wire должна быть подключена на строго определённые ножки микроконтроллера.

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

Микроконтроллеры AVR способны выдавать ток до 40ма на свои порты. Для устройств, требующих подключения «сильного» подтягивающего резистора, можно использовать один из свободных портов, подключив его к шине через защитный резистор 200 Ом. Этот резистор требуется для того, чтобы ограничить ток в цепи, если в цепи произойдёт короткое замыкание, или «сильный» порт будет включен, когда одно из устройств пытается выдавать на линию сигнал. С риском для порта микроконтроллера, этот резистор можно исключить. В таком случае схему можно упростить, т.к. «сильное» подключение может обеспечиваться тем же портом, что используется для передачи данных (на схеме — PB0).

Читайте также: Шины зимняя резина шины gislaved

На уровне программы передача данных обеспечивается переключением значения соответствующего бита регистра, выбирающего направление порта (DDRx), пока соответствующий бит регистра, выбирающего значение на порту (PORTx) остаётся равным нулю.

Для порта «сильного» подтягивающего резистора требуется обеспечить переключение значений бит обоих регистров, чтобы в активном состоянии подключался сильный драйвер (соответствующие биты в регистрах DDRx и PORTx установлены в единицу) чтобы в неактивном состоянии он не влиял на шину (соответствующие биты в регистрах DDRx и PORTx сброшены в ноль). При переключении между этими двумя состояниями следует исключить возможность просаживания шины на «землю» (когда соответствующий бит в регистре DDRx равен единице, а в PORTx – нулю). Поэтому для включения «сильного» резистора требуется сначала установить значение (PORTx), что включит внутренний подтягивающий резистор и не изменит состояние шины, лишь затем – направление порта (DDRx). Отключение производить в обратной последовательности.

Код написан на языке C для компилятора avr-gcc с использованием библиотек из AVR-toolchain.

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

Видео:Как прошивать микроконтроллеры AVR программатором USBASPСкачать

Как прошивать микроконтроллеры AVR программатором USBASP

Протокол связи

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

Сброс и импульс присутствия

Последовательность инициализации 1-wire: сброс и импульс присутствия

Любой обмен начинается с инициализации, во время которой мастер посылает импульс «сброс» (reset),. Этот импульс представляет собой низкий уровень на линии в течение минимум 480 микросекунд (т.к. для ведомых устройств минимальная длительность импульса сброса, на которой они реагируют, находится в диапазоне 120-480мкс). Если на линии присутствуют устройства, использующие прерывание, то импульс сброса не должен превышать 960 микросекунд (иначе на его фоне может затеряться сигнал прерывания).

За исключением случаев, когда линия подпитывается «сильной» подтяжкой, импульс сброса может быть послан в любой момент, даже если обмен данными с устройством не закончен.

Опознав импульс сброса, устройства выжидают от 15 до 60 микросекунд после его завершения (т.е. появления высокого уровня) и выдают импульс длительностью от 60 до 240 микросекунд, подтверждающий их присутствие на линии. Такой импульс называется «импульс присутствия» (presence pulse). Поскольку схема с открытым стоком реализует «монтажное И», одновременная передача импульса присутствия многими устройствами сливается в один импульс длиной до 285 микросекунд. Обнаруживая такой импульс, мастер может определить подключены ли устройства к шине.

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

Передача и приём данных

Данные передаются побитно, и для приёма и для передачи инициатором является мастер, выставляя низкий уровень на линии длительностью минимум 1 микросекунду. Для передачи одного бита выделяется интервал времени, называемый «тайм-слот» (time slot), составляющий от 60 до 120 микросекунд. Между соседними тайм-слотами на шине должен присутствовать высокий уровень в течение минимум 1 микросекунды.

Передача от мастера к ведомому устройству

Отправка значений от мастера к ведомому устройству 1-wire

Если ведомые устройства готовы к приёму данных, они ожидают импульса низкого уровня, после которого выжидают от 15 до 60 микросекунд и проводят замер уровня на шине. Высокий уровень соответствует единице, низкий – нулю.

Таким образом, для передачи единицы мастер должен вернуть высокий уровень на линии до истечения 15 микросекунд после появления низкого уровня. Следует учесть, что в зависимости от электрической ёмкости сети, подтягивающему резистору может потребоваться значительное время (до нескольких микросекунд), чтобы вытянуть напряжения на линии до высокого логического уровня. Поэтому мастер должен прекращать удерживать линию на низком уровне загодя.

Для передачи нуля мастер должен удерживать линию на низком уровне как минимум 60 микросекунд, но не дольше 120 микросекунд (т.к. иначе такой сигнал может быть воспринят некоторыми устройствами как импульс сброса). После возвращения высокого уровня на линии, следует выждать минимум 1 микросекунду до следующей активности.

Приём от ведомого устройства мастером

Приём значений мастером от ведомого устройства 1-wire

Когда подразумевается ответ ведомого устройства, мастер также инициирует передачу очередного бита кратковременным (не менее 1 микросекунды) выставлением низкого уровня на шине. Распознав срез, активное ведомое устройство для передачи нуля продолжает удерживать низкий уровень на линии в течение 15-60 мкс, а для передачи единицы не предпринимает никаких действий, позволяя подтягивающему резистору вернуть высокий уровень на линии.

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

В случае если несколько устройств на шине передают данные одновременно, то, согласно правилу «монтажного И», передача неодинаковых данных будет распознана мастером как ноль.

Прерывания

Некоторые устройства (например, DS1994) могут сигнализировать о возникновении ситуаций требующих реакции путём посылки прерываний. Прерывание представляет собой импульс низкого уровня на шине длительностью от 960 до 3840 микросекунд.

Читайте также: Octavia a7 размер шин r16

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

Если же событие возникло после начала обмена данными и до импульса сброса, то устройство будет дожидаться очередного импульса сброса, и после него будет продолжать удерживать линию в низком уровне 960 до 3840 микросекунд. Если событие возникло во время импульса сброса, то до 3840 микросекунд с момента события.

Сразу после длительного импульса низкого уровня, спустя 15-60 микросекунд посылается импульс присутствия, как если бы сигнал прерывания был сигналом сброса. Такой же импульс присутствия будет послан и другими устройствами на шине, которые распознают импульс прерывания как импульс сброса.

Видео:Восстановление фьюзов AVR микроконтроллеров с помощью параллельного программирования.Скачать

Восстановление фьюзов AVR микроконтроллеров с помощью параллельного программирования.

Сетевой протокол

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

Передача данных осуществляется младшими битами вперёд.

Все устройства 1-wire обладают зашитым в ПЗУ уникальным 64-разрядным кодом, который позволяет однозначно определить устройство. Этот код и используется для адресации.

Младший байт кода (передаваемый первым) кодирует семейство. Коды с 1 по 127 зарезервированы Dallas Semiconductor/Maxim Integrated и фактически определяют тип устройства. Таблицу с кодами семейств и поддерживаемыми командами можно найти вот здесь: http://owfs.sourceforge.net/family.html

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

И, наконец, старший, восьмой байт – это контрольная сумма, вычисляемая на основе первых сими байт.

Расчёт контрольной суммы

Контрольная сумма представляет собой циклический избыточный код (Cyclic redundancy checkCRC) c полиномом X 8 + X 5 + X 4 + 1, инициализируется значением 0 и использует не инвертированную форму.

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

Обновление контрольной суммы байтом собственного значения вернёт ноль. На практике это означает, что расчёт контрольной суммы для всех восьми байт адреса устройства, включая байт контрольной суммы, должен вернуть ноль. Эту особенность удобно применять при проверке полученных данных.

Для побитного расчёта можно воспользоваться функцией:

Поскольку формула довольно проста, побитный расчёт требует около 90 тактов процессорного времени на каждый байт данных. Если же требуется ускорить расчёт, то можно использовать табличную функцию. Она выполняется значительно быстрее, но требует хранения 256-байтной таблицы:

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

Команда 0xCC SKIP ROM (игнорирование адресации)

Если достоверно известно, что на шине присутствует лишь одно устройство (т.н. схема подключения single-drop), то мастер может пропустить процедуру адресации, выслав байт 0xCC. Получив эту команду, ведомое устройство сразу перейдёт в активный режим, ожидая управляющих команд. В случае если на шине оказалось несколько устройств, то все они будут ожидать команд и реагировать на них одновременно, возможно, конфликтуя друг с другом.

Команда 0x33 READ ROM (Чтение ПЗУ)

Если на шине присутствует лишь одно устройство, то послав 0x33, и обеспечив 64 тайм-слота чтения, мастер может прочитать его уникальный код. Если же на шине присутствует несколько устройств, то они будут отвечать одновременно, код будет сформирован по принципу «монтажного И», и контрольная сумма не сойдётся. Таким образом можно определить что на шину подключено несколько устройств.

После получения этой команды, устройство передаёт содержимое своего 64-битного ПЗУ, хранящего адрес. Сначала идёт младший бит. Младший байт ПЗУ кодирует семейство устройства, затем 6 байт – уникальный серийный номер и последний байт – контрольная сумма.

Команда 0x55 MATCH ROM (Совпадение ПЗУ)

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

После передачи 0x55 мастер передаёт полный 8-байтный код (включая код семейства, серийный номер и контрольную сумму) адресуемого устройства, младшими разрядами вперёд. Устройство, у которого зашитый в ПЗУ код соответствует переданному, переходит в активный режим, ожидая дальнейших команд.

Команда 0xF0 SEARCH ROM (Поиск ПЗУ)

С помощью команды 0xF0 можно получить коды всех устройств, подключенных к шине.

Сразу за этой командой идут 64 группы (на каждый бит зашитого в ПЗУ кода) состоящие из двух тайм-слотов чтения и одного тайм-слота передачи.

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

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

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

Если значения этого бита у адресов устройств различаются, то, используя принцип «монтажного И», оба значения будут прочитаны мастером как нули. Мастер должен выбрать одно из значений, в соответствии с процедурой перебора адресов.

Читайте также: Статические или динамические шины для поддержания подвижности пальцев

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

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

Процедура повторяется для всех 64 бит, в конце остаётся только одно устройство, которое продолжает оставаться в активном режиме для получения следующих команд.

Алгоритм перебора всех подключенных устройств

Идея процедуры вычисления номеров всех устройств выглядит следующим образом:

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

— для идущих раньше этой позиции – выбирается значение из сохранённого (последнего найденного) адреса.

— для этой позиции – выбирается единица

— для позиций правее – выбирается ноль.

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

Поиск заканчивается, если на всех неоднозначных позициях переданы единицы.

Видео:Лекция по прошивке микроконтроллеров Atmel (Atmega32L)| Работа с программатором USBASP | AVRDUDEСкачать

Лекция по прошивке микроконтроллеров Atmel (Atmega32L)| Работа с программатором USBASP | AVRDUDE

Опрос температурных датчиков DS18B20, DS18S20, DS1822

Одним из наиболее частых применений протокола 1-wire является взаимодействие с температурными датчиками DS18B20, DS18S20, DS18S22.

Как предписано стандартом 1-wire, все датчики содержат 8-байтовый код, состоящий из кода семейства, уникального 48-битного серийного номера и контрольной суммы.

Датчики выпускаются в разных корпусах — трёхвыводные to92, для поверхностного монтажа — soic, а также в разнообразных вариантах герметичного исполнения.

Все они обеспечивают измерение температуры в пределах от -55°С до 125°С с точностью до 1/16 градуса. Время замера зависит от разрядности и достигает 0,75с.

Датчики могут работать как от внешнего источника питания, так и в режиме «паразитного питания» от линии данных, используя всего 2 провода.

Во втором случае вход внешнего питания должен быть соединён с общим выводом, и, так как устройства потребляют до 1,5 мА, на время замера температуры, шина данных должна подтягиваться «сильным» резистором, обеспечивая напряжение питания датчиков не менее 3 Вольт.

Получение значений температуры с датчиков выполняется в два этапа:

1) Запрос на измерение температуры (команда 0x44). Для устройств с паразитным питанием в течение 10мкс после этого должен быть включен сильный подтягивающий резистор на всё время замера (до 750мс).

2) Запрос на вычитывание измеренных значений (команда 0xBE).

Любому запросу к устройству обязательно предшествует сигнал сброса и одна из команд выбора устройства, в соответствии с сетевым протоколом 1-wire.

Результаты измерений сохраняются в устройстве в буферной памяти размером 9 байт, называемой скратчпад (scratchpad). У всех трёх рассматриваемых моделей термодатчиков структура скратчпада схожа между собой:

ПозицияЗначение
0младший байт значения температуры
1старший байт значения температуры
2,3граничные контрольные значения, или пользовательские данные
4регистр конфигурации (DS18B20, DS1822) /зарезервирован (принимает значение 0xFF для DS18S20)
5зарезервирован (принимает значение 0xFF)
6зарезервирован (DS18B20, DS1822)/остаток COUNT_REMAIN (DS18S20)
7зарезервирован (принимает значение 0x10 для DS18B20, DS1822)/множитель = отсчётов на градус (всегда 0x10 = 16 для DS18S20)
8контрольная сумма, рассчитывается для всего скратчпада по тем же правилам что и для адреса 1-wire

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

Датчики DS18B20 и DS1822 имеют программируемое разрешение от 9 до 12 бит, и сохраняют результат всегда в 1/16 градусах Цельсия. Таким образом значения 0x50 0x05 соответствуют +85°С, 0xA2 0x00 – +10,125°С, 0x6F 0xFE – -25,0625°С. По умолчанию разрешение датчиков задано 12 бит. При выборе меньшего разрешения (в этой статье не будет рассматриваться) сокращается время замера температуры, при этом недостающее число младших разрядов результата будет содержать неопределённые данные.

В отличие от них, DS18S20 сохраняет результат с разрешением в половину градуса. То есть 0xAA 0x00 соответствует +85°С, 0x32 0x00 – +25°С, 0xCE 0xFF – -25°С. Однако, можно вычислить значение с точностью до 1/16 градуса, используя значение COUNT_REMAIN, сохраняемое в позиции 6 скратчпада по следующей формуле:

ТЕМПЕРАТУРА = ПРОЧИТАННАЯ ТЕМПЕРАТУРА – 0,25°С + COUNT_REMAIN / 16,

Где 16 – это количество отсчётов на градус, значение, возвращаемое в позиции 7 скратчпада и всегда равное 16 для DS18S20.

Пример измерения температуры

Пример ниже собирает показания с датчиков DS18S20, DS18B20 и DS1822, подключенных к шине 1-wire с «сильным» подтягивающим резистором, как описано выше, и пересылает результаты измерений по UART. Используется процедуры и функции для работы с сетью 1-wire, описанные выше.

Видео:Видеокурс по AVR микроконтроллерам - Урок 1Скачать

Видеокурс по AVR микроконтроллерам - Урок 1

Проект для AtmelStudio 6

Исходный код проекта доступен для скачивания здесь: zip-файл, 42 кБ.

Проект написан на языке C и реализован для микроконтроллеров ATmega8, работающих на частоте 8МГц, но может быть легко адаптирован для других AVR микроконтроллеров с флеш-памятью 2 кБ и более. Схема подключения такая же, как на рисунке выше.

Архив также включает скомпилированный код для микроконтроллера ATmega8, в форматах hex и elf.

  • Свежие записи
    • Нужно ли менять пружины при замене амортизаторов
    • Скрипят амортизаторы на машине что делать
    • Из чего состоит стойка амортизатора передняя
    • Чем стянуть пружину амортизатора без стяжек
    • Для чего нужны амортизаторы в автомобиле


    📹 Видео

    (Указатели "часть 1") программирование микроконтроллеров avrСкачать

    (Указатели "часть 1") программирование микроконтроллеров avr

    Побитовые операции | Микроконтроллеры с нуля #11Скачать

    Побитовые операции | Микроконтроллеры с нуля #11

    Программирование микроконтроллеров avr для начинающихСкачать

    Программирование микроконтроллеров avr для начинающих

    STM32 или AVR. Как изучать программирование микроконтроллеров.Скачать

    STM32 или AVR. Как изучать программирование микроконтроллеров.

    Порты ввода-вывода | Первая программа | Микроконтроллеры с нуля #4Скачать

    Порты ввода-вывода | Первая программа | Микроконтроллеры с нуля #4

    Микроконтроллеры AVR. С чего начать. Выбор программатора. USBASP V2.0Скачать

    Микроконтроллеры AVR. С чего начать. Выбор программатора. USBASP V2.0

    Программирование микроконтроллеров Урок 1Скачать

    Программирование микроконтроллеров Урок 1

    AVR 1# Знакомство с Atmel StudioСкачать

    AVR 1# Знакомство с Atmel Studio
Поделиться или сохранить к себе:
Технарь знаток