Как написать программу для мк

Материалы статьи подготовлены на кафедре «Автоматика, Информатика и Системы Управления» (АИиСУ) Московского Государственного Индустриального Университета (ГОУ МГИУ).
(С 2011 года МГИУ носит название — ФГБОУ ВПО «МГИУ»).
Авторы: Крюков А.И., Шубникова И.С., Тройков С.М.

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

Существует большое количество всевозможных приложений для написания управляющих программ для МК фирмы Atmel — это среды разработки и отладки на языках низкого уровня (например, бесплатный пакет AVR Studio для разработки программ на языке AVR Assembler), среды разработки на языках высокого уровня (такие как среда WinAVR для разработки программ на С-подобном языке) и есть даже графическая среда разработки и отладки программного обеспечения под названием «Algorithm Builder».

Пишем первый код для ATMEGA32 в Атмел студио и мигаем светодиодом

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

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

Дабы не переписывать весь мануал по работе со средой Algorithm Builder советую прочитать его самостоятельно, тем более, что приложение отечественного производства и содержит подробнейшее описание на русском языке на основе примеров по работе с ним. Основываясь на личном опыте, можно с уверенностью сказать, что данного мануала (кстати, далеко не объемного — всего на 20-30 мин. изучения) вполне хватает, чтобы полностью понять и разобраться в данном программном продукте.

Скачать Algorithm Builder можно по адресу http://algrom.net/russian.html. А процесс разработки управляющей программы можно посмотреть по ссылке . Таким образом, представим далее готовую программу в описанной среде разработки с подробнейшими комментариями к ней.

Основы программирования контроллеров за 5 минут

Для начала необходимо выбрать тип кристалла (в нашем случае Atmega8) в меню Опции/Опции проекта и там же задать тактовую частоту 8000000 Гц (8 МГц). Далее выполняем сброс кристалла при запуске (Элементы/Прерывания/Reset). После чего инициализируем стек, выбрав Элементы/Настройщик…/Stack Pointer (SP), откроется окошко с которым нужно будет просто согласиться, нажав «ОК» (рис. 2).

Рис. 2. Настройщик стека

Следующим этапом следует инициализировать приемопередатчик USART (не стоит удивляться появлению буквы «S» в аббревиатуре – это более современный вариант UART, отличающийся от него возможностью передавать/принимать данные не только в асинхронном режиме, но и в синхронном) путем выбора меню Элементы/Настройщик…/USART. В открывшемся окошке (рис. 3) в разделе Receiver ставим галочки напротив Enable (включаем приемник данных) и Complete interrupt enable (разрешаем прерывания по окончании приема данных), далее ставим галочку напротив Double Speed, задаем размер символа Character Size: 8 – bit и выставляем скорость передачи данных Baud Rate = 9615 bps (когда нажмете на выбор скорости передачи данных в меню следует выбирать 9600 bps, 9615 bps получается в связи с пересчетом тактовой частоты на 8 МГц).

Рис. 3. Настройщик USART

Далее следует разрешить глобальные прерывания записав «1» во флаг глобальных прерываний I.

Листинг №1
Основное тело программы

На листинге №2 приведен код подпрограммы задержки (Delay). Временная задержка необходима для точной и полной отработки команды и формируется путем зацикливания программы на N циклов (методом проб и ошибок мы подсчитали, что в нашем случае наиболее удачное число циклов 84FF в 16-тиричной системе счисления).

Листинг №2
Подпрограмма задержки

Окончание приема данных по UART вызывает прерывание USART_Receive_Complete (если оно в данный момент не запрещено в основном теле программы), которое в коде можно задать через меню Элементы/Прерывания/ USART_Receive_Complete. В теле обработчика следует сохранить все используемые в нем регистры в стек, а в конце обработчика обратно их восстановить из стека. Так же в этом обработчике можно получить байт статуса (регистр UCSRA) для проверки данных на ошибки и, естественно, сами данные из регистра UDR (листинг №3).

Листинг №3
Обработчик прерывания

Угол поворота сервопривода зависит от ширины подаваемого на него импульса при сохранении периода постоянным (период 20 мс, а длительность управляющего импульса от 0,8 до 2,2 мс, хотя для разных сервоприводов эти значения могут немного отличаться) для этого нам и понадобится подпрограмма отработки угла поворота сервопривода (листинг №4). Время управляющего импульса и время паузы будем задавать аналогично подпрограмме задержки. Как мы уже писали выше, экспериментальным путем для частоты кристалла 8 МГц мы определили, что время импульса задается кодом в приделах от $05AF до $154F. Таким образом, зная время всего периода – $9E3C (определили так же экспериментально), можно рассчитать время паузы как разницу между длительностью периода и длительностью импульса. Остается только аналогично подпрограмме задержки отработать последовательно время импульса и время паузы, а затем повторить такой сигнал несколько раз (в нашем случае мы повторили сигнал $10 раз, т.е. 16 раз в десятичной системе счисления)

Листинг №4
Подпрограмма отработки угла поворота

После написания кода (прорисовки алгоритма) управляющей программы необходимо ее откомпилировать и прошить в микроконтроллер. Компиляцию программы можно произвести нажатием Ctrl+F9 либо через меню Программа/Компилировать. В случае успешной компиляции появится информационное окно в котором будет указан объем занятой памяти МК.

Читайте также:
Как отключить полноэкранный режим программ

Далее необходимо прошить результат компиляции (файл с расширением *.hex без приписки «EE_» вначале, лежащий в той же папке, что и исходник программы) в контроллер. Это можно сделать с помощью бесплатной утилиты AvrProg, входящей в так же бесплатный пакет AVR Studio. Скачать ее можно с сайта mymcu.ru либо с atmel.com (англоязычный сайт).

Помимо утилиты для прошивки МК потребуется еще и программатор. Его можно либо купить (простые версии стоят относительно недорого) либо спаять самостоятельно.

Рис. 4. Схема LPT-программатора

Самый простой из мне известных – LPT-программатор, но он соответственно потребует наличие порта LPT на компьютере, что на данный момент становится редкостью. Идея программатора проста и состоит в соединении порта LPT с интерфейсом ISP и линией Reset контроллера напрямую (рис. 4).

Другой вариант программатора для самостоятельной сборки – USB-программатор (схема показана на рис. 5), он конечно сложнее, но в последствии может оказаться значительно более удобным. Тем не менее есть одно «но» – для его сборки все равно потребуется LPT-программатор, правда однократно.

Он будет необходим для прошивки управляющего контроллера самого программатора с целью прошивки FUSE-битов. Необходимо, чтобы были запрограммированны (установленны в «0») биты SPIEN, CKOPT и SUT0. Обычно МК, идущие с завода, т.е. новые, имеют уже запрограммированный бит SPIEN. Так же желательно (но не обязательно) запрограммировать (установить в «0») бит BODEN.

Остальные биты должны быть незапрограммированны (установленны в «1»). Для этого может потребоваться приложение Codevision AVR V2.03.4. Подробное описание сборки USB-программатора можно прочитать тут: http://modder-team.clan.su/publ/5-1-0-36 .

Рис. 5. Схема USB-программатора

Подключив программатор с МК к компьютеру (не важно какой программатор) нужно запустить AvrProg (адрес приблизительно такой для AVR Studio: C:Program FilesAtmelAVR ToolsAvrProg ) и если с программатором и МК все в порядке откроется окошко в котором нужно указать путь к Вашему hex-файлу и нажать кнопку «Program».

Источник: myrobot.ru

Каталог статей

Теперь предстоит разобраться – как именно программист может выполнять операции с регистрами AVR при помощи написанной им программы. Для начала немного поговорим об ассемблере, прошу сторонников Си не ругаться, до ЯВУ мы ещё доберёмся.

Как я уже писал в первой части, программа – это заданная программистом последовательность инструкций, каждая из которых предписывает МК выполнить определённое действие. Пример инструкции: загрузить в регистр с именем r16 константу 0x12. Приказ этот для МК в виде 16-битного числа выглядит так: 1110000100000010.

Именно это число, которое называется КОД ОПЕРАЦИИ, и будет занесено в 16-битную ячейку памяти программ по соответствующему адресу. Как именно распределяется программа по ячейкам памяти программ – разберём немного позже. Последовательность инструкций в виде 16-битных чисел представляет собой программу для AVR в машинных кодах. Однако, процесс написания программы в машинных кодах очень неудобен для человека. Поэтому в помощь программисту существует АССЕМБЛЕР – переводчик удобных для восприятия человеком команд в машинные коды для МК. Инструкция «загрузить в регистр с именем r16 константу 0x12» на ассемблере выглядит так:
ldi r16,0x12

Сокращение «ldi» образовано от английских слов «load data immediate» — «загрузка данных непосредственная». МНЕМОНИКА команды – запись её в виде ldi Rd, K – достаточно легко запоминается человеком. СИСТЕМА КОМАНД микроконтроллера – это совокупность всех команд, которые могут быть применены к данному МК.

Число входящих в систему команд различно для разных семейств МК. Мнемоники также различаются. Поэтому ассемблер для одного семейства МК существенно отличается от предназначенного для другого семейства.
Для ознакомления с системой команд AVR откройте главу 3 книги А.В. Евстифеева «Микроконтроллеры AVR семейства Mega. Руководство пользователя».

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

start: ldi r16,0x02 ; Загрузить константу 0х02 в регистр общего назначения r16
out DDRB,r16 ; Записать в регистр DDRB данные из регистра r16
; Теперь вывод PB1 оказался настроен на выход
ldi r16,0x1D ; Аналогичные действия с регистрами. Выключить
out PORTB,r16 ; светодиод, который подключен к между PB1 и «общим»
rjmp start ; Перейти на метку start

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

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

Подобно тому, как Пупкин может сначала поселиться в гостиничном номере 105, а затем его переселят в номер 209. Но если просто сказать «Пойдём в номер Пупкина», мы разберёмся, по какому адресу идти в данный момент. После имени метки в ассемблере AVR следует ставить двоеточие. Недопустимо ставить в программе 2 метки с одинаковым именем.

После точки с запятой пишутся КОММЕНТАРИИ. Это пояснения, которые программист пишет для себя и тех, кто будет смотреть программу. Микроконтроллеру они не нужны, поэтому ассемблер их просто игнорирует.

Адреса ячеек памяти программ в AVR начинаются с нуля ($0000). Адрес последней ячейки и их общее количество зависят от модели МК. Например, у ATmega16 объём памяти программ составляет 8192 ячейки. Ячейки 16-битные, поэтому память программ занимает 16 килобайт. Память может измеряться и в словах. 1 слово занимает 16 бит или 2 байта.

Таким образом, объём памяти ATmega16 составляет 8K слов. Адреса ячеек – от $0000 до $1FFF. Большинство инструкций занимают по 1 ячейке, некоторым необходимо 2. Максимальный размер программы для конкретного МК как раз и ограничивается объёмом его памяти программ.

Читайте также:
Мышь DEXP hellfire gs 100 программа для ее настройки

Откуда МК узнаёт – какую именно команду ему предстоит выполнить сейчас? Адрес ячейки памяти программ со следующей исполняемой командой находится в специальном регистре, который называется ПРОГРАММНЫЙ СЧЁТЧИК или PC. Другое его название – СЧЁТЧИК КОМАНД. В микроконтроллерах AVR, в отличие от PIC, для программиста PC напрямую недоступен.

При нормальной работе МК число в регистре PC после выполнения каждой команды автоматически увеличивается на 1 (или на 2, если команда занимает 2 ячейки). При переходах и ещё в некоторых случаях (прерывания, вызов подпрограмм и возврат из них) этот порядок нарушается, и в PC загружается тот адрес, на который выполняется переход. Таким образом, порядок выполнения инструкций, находящихся в памяти программ, соответствует последовательности значений PC.

Скорость работы МК определяется тактовой частотой. 1 машинный цикл AVR выполняется за время 1 периода тактового генератора. Таким образом, при частоте тактового генератора 1 МГц за 1 секунду произойдет 1 миллион тактов. Большая часть команд выполняется микроконтроллерами AVR за 1 машинный цикл. Это стало возможным благодаря конвейерной обработке команд.

При отработке команд перехода и ещё некоторых нормальная работа конвейера нарушается, и возникают задержки от 1 до 4 тактов. Подробнее о работе конвейера и причинах возникновения задержек почитайте в книге А.В. Евстифеева «Микроконтроллеры AVR семейства Mega. Руководство пользователя», глава 2, раздел 2.3.

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

Нижняя граница тактовой частоты архитектурой самого МК не ограничивается, она может быть сколь угодно малой – хоть 1 такт в год от внешнего источника. Верхняя граница зависит от модели МК и нередко составляет 8 или 16 МГц. Подробности, как обычно, можете узнать из даташита на конкретный МК.

Адрес $0000 – это ВЕКТОР СБРОСА. Именно с размещённой по этому адресу команды начинается выполнение программы после включения питания или сброса МК. Значение адреса вектора сброса в некоторых МК может быть изменено, но этот случай нас пока не интересует. Сброс может быть вызван внутренними или внешними причинами. О внутренних разговор будет позже.

Одной из причин сброса является падение напряжения питания Vcc ниже определённой величины. Для внешнего сброса предназначен вывод _RESET. Сброс происходит при удержании низкого уровня (не более 0,1Vcc) на этом выводе не менее 1…3 мкс. При работе МК на выводе _RESET должно поддерживаться напряжение (0,9…1,0)Vcc. Во многих AVR имеется внутренний подтягивающий резистор, соединяющий _RESET c Vcc.

В этом случае _RESET допустимо никуда не подключать, но для большей надёжности можно установить и дополнительный внешний резистор. Подробности о сбросе можете прочитать в книге А.В. Евстифеева «Микроконтроллеры AVR семейства Mega. Руководство пользователя», глава 4, раздел 4.4.

При сбросе во все регистры ввода/вывода (РВВ) заносятся начальные значения, заданные фирмой-производителем, а в PC загружается адрес вектора сброса. Выполнение программы после сброса начинается не мгновенно, а после некоторой задержки, для надёжности. По адресу $0000 программист обычно размещает команду безусловного перехода к инициализационной части программы, начало которой он обозначает меткой, например, «start”. Это делается для того, чтобы обойти размещённую в начале памяти программ таблицу векторов прерываний.

.org 0
reset: jmp start
……
…… (здесь переходы на обработку прерываний)
……
start: ldi r16,0x12
…… (отсюда продолжается программа)

В этом примере reset и start – метки. Директивой org программист указывает ассемблеру, по какому адресу следует поместить следующую команду в памяти программ. Таким образом, команда jmp start будет размещена по адресу $0000. Перед директивами в ассемблере AVR следует ставить точку.

Какую команду следует применить здесь для перехода – двухбайтовую jmp или однобайтовую rjmp – зависит от конкретной модели AVR, смотрите в даташите. По какому адресу будет находиться первая команда инициализационной части (в примере это ldi) – нам в данном случае неважно, пусть ассемблер её сам расположит, а нам достаточно знать метку.

После сброса МК в PC загрузится вектор сброса $0000 и будет выполнена находящаяся по этому адресу команда безусловного перехода к метке start. Следовательно, в PC загрузится соответствующий метке start адрес, и выполнение программы продолжится с команды ldi r16,0x12

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

Выводы по 2 части:

1. Для перевода удобных человеку команд в машинные коды предназначен ассемблер.
2. Набор возможных действий программиста с микроконтроллером определяется системой команд этого МК.
3. Каждая команда имеет определённую мнемонику для лучшего запоминания.
4. При написании программы на ассемблере применяются метки, комментарии и директивы.
5. Максимальный размер программы ограничивается объёмом памяти программ выбранного МК.
6. Порядок выполнения находящихся в памяти программ команд соответствует последовательности значений программного счётчика PC.
7. Скорость работы МК определяется тактовой частотой. 1 такт работы AVR выполняется за 1 период тактовой частоты.
8. Тактирование AVR возможно от внутреннего RC-генератора, подключение внешних деталей при этом не требуется.
9. Выполнение программы после включения питания или сброса МК начинается с адреса вектора сброса (для AVR обычно $0000).
10. Сброс может быть вызван падением напряжения питания ниже определенной величины, воздействием на вывод _RESET, а также некоторыми другими причинами.
11. Программа, как правило, начинается с команды безусловного перехода к инициализационной части.
12. Инициализация предназначена для программной настройки МК после сброса под нужды программиста.

Читайте также:
Как называется программа для флешки

Источник: cxema21.ru

Как написать программу для мк

Форум KAZUS.RU » Форумы по электронике » Делимся опытом » Хочу научиться писать программы для МК 8051.

Почётный гражданин KAZUS.RU
Регистрация: 22.06.2004
Адрес: Харьков
Сообщений: 1,488
Сказал спасибо: 3,207

Сказали Спасибо 3,010 раз(а) в 686 сообщении(ях)

Если рассматривать вопрос об освоении нового типа микроконтроллера, то конечно PIC поновее и AVR посолиднее аппаратно.
А если ставить целью использование имеющихся, то 8051 не есть плохой выбор. Все с них начинали. Это классика. Лет десять уже говорят что архитектура мертвая. А она развивается.
И спор этот будет вечно.
А касательно ассемблера и Си:
Невозможно 100% использовать Си если не понимать как это получится на ассемблере и чем будет заниматься аппаратура, выполняя код.

Почётный гражданин KAZUS.RU
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76

Сказали Спасибо 326 раз(а) в 230 сообщении(ях)

Невозможно 100% использовать Си если не понимать как это получится на ассемблере

Я просто не советую тратить время на АСМ — не вижу надобности в оном — ИМХО.

Регистрация: 28.08.2004
Сообщений: 178
Сказал спасибо: 26
Сказали Спасибо 26 раз(а) в 20 сообщении(ях)

Касательно Фрунзе, три тома это 1,2,3.Звиняйте за прозу. Прочел первый,-можеш не читать второй и т.д. Хотя первый это начало.
Проблема языков высокого уровня(Си) и аппвратных (asm) всегда была есть и будет. Разница во времени. Чем больше пишешь программ на низких языках тем ближе подходишь к необходимости создания библиотек, потом готовых функций, процедур и т.д. Но чтобы к этому прийти надо поработать на низу, а после этого Паскаль, Бэйсик, СИ сами собой становятся понятными. Все дело во времени а стало быть в уверенности и понимании того, что происходит с железом

Почётный гражданин KAZUS.RU
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76

Сказали Спасибо 326 раз(а) в 230 сообщении(ях)

только мое мнение:

Я не изучал и не знаю АСМ — но я уверено разрабатываю устройства на МК и знаю что происходит с железом МК.

иначе я бы не смог отладить устройство и не мог бы сделать работающее по ТЗ устройство.

Регистрация: 28.08.2004
Сообщений: 178
Сказал спасибо: 26
Сказали Спасибо 26 раз(а) в 20 сообщении(ях)

Уважаемый avr, читал, смотрел, изучал Ваш сайт. Считаю его самым лучшим ресурсом по контроллерам, и это без балды . Фрунзе со своей книгой, отработанной между прочим ещё в статьях журнала «Радио» и Ваш сайт, это и есть то с чего следует начинать программирование контроллеров. (Сам ознакомился с этой книгой после э-мейла с указанием книги). Начинать просто программирование, без привязки к контроллерам это другая тема. Но ещё раз повторюсь, что касается контроллеров, то эти два ресурса, как по мне, — наилучшие.
Теперь о настойчивом повторении про не знание .АСМ.
Языки высокого уровня, как мне кажется, позволяют создавать программы на основе отработанных алгоритмов преобразования строки СИ в строку .bin, доступную для контроллера. Ведь по большому счёту .asm тоже не машинный язык. Ранее, когда ресурсы железа были ограничены, програмист стремился использовать каждый байт памяти наиболее рационально (опять же с точки зрения своей задачи).
По моему не мной сказано, но мной видено, программа на .асм может быть короче компилированной компилятором с языков типа СИ (высокого уровня) для одной и той же задачи. Почему, вопрос второй. Здесь же хочу отметить, что на сегодняшний день, надо сказать, очень ускоренный день (живём быстрее) экономия ресурсов контроллера даже на 1кб на проект, не критична.

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

Почётный гражданин KAZUS.RU
Регистрация: 22.06.2004
Адрес: Харьков
Сообщений: 1,488
Сказал спасибо: 3,207

Сказали Спасибо 3,010 раз(а) в 686 сообщении(ях)

Абсолютно согласен со своим земляком (Vasilij- Донецк, Украина).
›››› Чем больше пишешь программ на низких языках тем ближе подходишь к необходимости создания библиотек, потом готовых функций, процедур и т.д. Но чтобы к этому прийти надо поработать на низу, а после этого Паскаль, Бэйсик, СИ сами собой становятся понятными.›››››
Когда я рассматриваю дизассемблированный код, получаемый Си или другим высокоуровневым компилятором, то есть места непонятные и неподдающиеся логике.
Допустим общение по 1wire интерфейсу.
Компилятор создает некоторое количество переменных, процессор, выполняя программу,проводит над ними манипуляции(складывает, обменивает, проводит переходы и т.д.). На 20-30 ходу логика вообще утрачивается.
Но эти 300-400 байт кода работают в реальном устройстве.
И правда, зачем изобретать велосипед, если по всевозможным граблям уже походили и создали РАБОТАЮЩИЙ алгоритм. Это очень сильно экономит время создания (программирования устройства).
Рано или поздно человек приходит к использованию языков высокого уровня.
Мы немножко отвлеклись от темы.
Здесь начиналось об освоении 8051. Этот микропроцессор самый старший. Для него написано куча программ, как для разработки так и для применения.
Зная как работает 8051 можно легко освоить более новые (других типов) процессоры. Поэтому считаю что 51-й стоит того, чтобы с него начать.
Даже люди освоившие Моторолу08 или 05 для применения 8051 начинали с нуля (Фрунзе, Григорьев-8080).
И нет книги типа «моторола для чайников»-кто знает 51-й, тот уже не чайник.

Источник: kazus.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru