Введение в ассемблер ATMEL-AVR микропроцессоров (часть 1)
Введение в ассемблер ATMEL-AVR микропроцессоров (частично перевод, частично свой опыт)
Для чего учить ассемблер? Вопрос - ассемблер или другой язык, для чего учить другой язык, если я знаю другие языки программирования?
Краткий и простой Ассемблерные команды транслируются один к одному в исполняемые машинные команды. Процессор исполняет только то, что вы хотите и только то, что необходимо для выполнения поставленной задачи. Никакие дополнительные циклы и излишние функции не раздувают генерируемый код. Если память программ МК небольшая и ограниченная и вы хотите оптимизировать программу для размещения ее в память, ассемблер - выбор №1. Более короткие программы есть более простыми для отладки, каждый ее шаг имеет смысл. (Конечно, для современных МК количество памяти - не самое узкое место, но все же, это тоже важный аргумент).
Быстрый и незамедлительный В силу исполнения только необходимого кода, ассемблерные программы быстры настолько, насколько это возможно. Критические к времени приложения, например измерение времени без "железного" таймера, дадут лучший результат, если будут написаны на ассемблере. Если у вас есть много времени, и не важно, если МК остальные 99% времени будет находиться в ожидании, тогда можно выбирать любой язык программирования.
Ассемблер простой для изучения Это неправда, что ассемблер более запутанный или менее простой для понимания чем другие языки. Изучение ассемблера для любого "железа" приносит понимание основных идей остальных диалектов ассемблерного языка. Изучение нового диалекта позднее будет очень простым. Первый ассемблерный код не выглядит очень привлекательно, но с каждыми 100 последующими строчками программы он выглядит все лучше :). Идеальные программы требуют использования иногда несколько тысяч строчек кода, оптимизационная работа тоже требует много времени. Так как многие функции есть "железозависимыми", оптимальное программирование требует более близкого знания "железа" и особенностей диалекта. Первые шаги тяжелые в изучении любого языка. Для изучения некоторых ассемблерных команд требуется уже некоторый опыт.
ATMegaXX идеальные для изучения ассемблера Ассемблерные программы не очень "умные" - чип будет исполнять все, что вы ему прикажете, и не спросит вас, если вы перепишете/затрете то или другое. Вся защита должна быть запрограммирована вами. Ничто не предупредит вас, если сначала вы этого не запрограммируете.
Простые ошибки проектирования являются сложными для отладки, как и в других компьютерных языках. Но - тестирование программ на чипах от Атмела есть очень простым. Если она не работает, так как нужно, вы можете просто добавить диагностические строчки кода, перепрограммировать чип и далее тестировать ее. Не нужно никаких специальных средств для программирования/стирания памяти программ, МК даже не нужно вынимать из платы устройства, в котором он установлен.
Проверьте это! Сделайте первые шаги! Если вы знаете какие-то языки высокого уровня, забудьте их на первое время. В основе каждого ассемблерного языка лежит хорошее знание "железа". Большинство специальных приемов других компьютерных языков не имеют смысла в ассемблере.
Первых пять команд не очень просты для изучения, далее скорость изучения быстро возрастет. Написав первые несколько строчек, взяв лист с полным набором инструкций, вы удивитесь, насколько все команды похожи между собой. Не пытайтесь начать с программирования мега-устройства. Это не имеет смысла в никаком компьютерном языке и приводит к разочарованию. Пишите комментарии к своим подпрограммам, и сохраняйте в отдельных каталогах, если они уже отлажены, вы сможете вновь вернуться к ним в короткое время. Желаем успехов!
Железо для программирования на AVR ассемблере Изучение ассемблера требует несложного оборудования для тестирования ваших программ и наблюдения их в работы на практике. В этом разделе рассмотрим схему простой экспериментальной платы и некоторые рекомендации по ее сборке. Эта плата действительно проста для повторения. На ней будет очень просто сделать первые шаги в программировании. Если вы хотите делать больше опытов, оставте немного больше места для будущего расширения вашей экспериментальной платы.
ISP интерфейс процессоров семейства AVR Рассмотрим несколько основных положений последовательного режима программирования AVR МК. Одна из существующих программ и переходник для программирования были рассмотрены в предыдущей статье. Теперь немного рассмотрим, как это выглядит со стороны МК. Внутрисистемное программирование возможно благодаря встроенному интерфейсу в AVR МК, который позволяет писать и читать содержимое флеш - памяти программ и встроенную EEPROM. Этот интерфейс работает последовательно, и требует три сигнальных линии: -SCK (Serial Clock) - Сигнал, синхронизирующий прием записываемых в память битов, во внутренний сдвиговый регистр, и, синхронизирующий передачу читаемых битов из другого внутреннего сдвигового регистра; -MOSI (Master Output - Slave Input) - Линия, по которой пересылаются данные, записываемые в МК, -MISO (Master Input - Slave Output) - Линия, по которой читаются данные из МК. Эти три сигнальных вывода внутренне соединяются с системой программирования только тогда, когда закоротить вывод RESET на землю. Иначе, во время нормальной работы МК, эти выводы работают как программируемые линии ввода/вывода вместе с остальными.
Рисунок 1 - Разъем для ISP на плате устройства
Если нужно использовать эти вывода по какому-либо назначению во время нормальной работы МК и для внутрисистемного программирования, нужно быть внимательным, чтобы эти две цели не конфликтовали между собой. Обычно применяют развязывающие сопротивления, реже мультиплексоры. Не обязательно, но рекомендовано для внутрисистемного программирования осуществлять питание переходника от напряжения питания вашего устройства. Это упрощает конструкцию переходника, но требует две дополнительные линии для его шлейфа и контакты на разъеме платы с МК. GND - общий провод, VTG или VCC - напряжение питания (обычно 5В).
Назначение выводов ISP разъема 1 - SCK 2 - GND 3 - MISO 4 - +5V 5 - RESET 6 - not connected 7 - not used 8 - XTAL1 9 - MOSI 10 - GND
Экспериментальная плата с ATMega16 С целью тестов мы будем использовать МК ATMega16 на экспериментальной плате. Плата
Рисунок 2 – Схема экспериментальной платы
включает стабилизатор питания DA1, разъем для подключения источника питания +8..+11В ХР2, разъем XS1, которым можно подключить стабилизированное питание +5В, а также питание для устройства, подключаемого к силовым ключам (например, шагового двигателя), наличие напряжения питания индицируется светодиодом VD1, панелька DIP-40 для установки МК ATMega16, кварцевый генератор, разъем для внутрисистемного программирования ХР1 типа BH-10 , разъем для JTAG адаптера Х1 типа WF-6 (пригодится на будущее), 8 светодиодов, кнопоки SW1 (сброс МК), SW2, SW3 на линиях прерываний (кнопки такие, как в мышах). Разъемы доступа к портам Х2-Х5 для расширения (могут быть ВН-20 или HDR-2X10 - 20 контактных штырьков по10 в 2 ряда), адаптер для связи МК с ПК по интерфейсу RS-232 (DD2 типа MAX232 или ST232) с разъемом XS4 типа DB9R для подключения нуль-модемного кабеля. На плате также находятся 4 ключа IRLZ44, выходы которых заведены на разъемы XS2, XS3 (клеммы) для подключения, например, шагового двигателя или электромагнитных реле небольшой мощности. Диоды VD2-VD9 – обычные светодиоды любого цвета.
Рисунок 3 – Вариант разводки печатной платы
В прикрепленных файлах – схема и разводка в формате PCAD2006.
Для соединения платы с компьютером по интерфейсу RS-232 понадобится нуль-модемный кабель, в котором используются только три линии – GND, RXD, TXD. Линия GND подключается к выводам 5 разъемов, линии RXD, TXD соединяют перекрестно между собой контакты 2 и 3 разъемов
Рисунок 4 – Схема соединения минимально необходимых линий для нуль модемного кабеля