Вместо предисловия
Микроконтроллеры с AVR-архитектурой - самое молодое семейство микроконтроллеров
общего назначения, появившееся в начале 90-х годов прошлого века. Аббревиатура
AVR не содержит слов "advanced" и "RISK", это всего лишь
начальные буквы фамилий разработчиков. Несмотря на такую "скромность",
это семейство с полным правом претендует на гордое звание RISK-микроконтроллеров,
а также прекрасно вписывается в любые устройства управления без особых усилий разработчика,
несмотря на некотороые неудобства при написании кода.
Впрочем, лучше, чем фирма ATMEL,
хвалебную оду этим контроллерам никто не создаст, поэтому этот материал посвящён
некоторым подводным камням, присутствующим в архитектуре и схемотехнических
решениях AVR, рассмотренных на примере AT90S1200 и AT90S2313.
Камни электрические
Как схемотехнический элемент AVR-контроллеры сделаны практически идеально. Мощные
двунаправленные выводы I/O-портов с Z-состоянием прекрасно приспособлены и для
управления внешними устройствами, и для работы на шине.
Вывести контроллер из строя, не превышая предельно допустимых значений напряжения питания
и логических уровней не удалось ( не удивляйтесь, ATMEL-овские AT89C порой выходят из строя
по совершенно неведомым причинам, не говоря уже о наших 1830 и 580 ) за весь достаточно долгий
( около 1.5 лет ) период моего с ними общения. Перегрузки выводов портов, КЗ на шину питания или
соединение "выход-выход", губительные для MCS51-контроллеров, ни к каким фатальным последствиям
не приводили. AT90S1200 и AT90S2313 производят очень благоприятное впечатление благодаря своей надёжности
и неприхотливости.
В общем, схемотехнических проблем немного, да и проблемами это назвать сложно, скорее это
"особенности конструкции".
Камень 1. Питание.
Как утверждает документация, AVR-контроллеры совершенно не требовательны к питанию. И это чистая правда. В частности AT90S2313 умудрялся работать без сбоев, когда в качестве питания ему подали (о ужас!!!) нестабилизированое напряжение со стогерцовой пульсацией от 3 до 5 В. Но... если вы забыли "священный" конденсатор между питанием и "землёй" в непосредственной близости от выводов Vcc и GND контроллера, причём ближе к Vcc, то можете получить пульсации по питанию с амплитудой 0,5...1 В и частотой тактового генератора микроконтроллера и абсолютное безмолвие самого генератора. Пока это единственное семейство микроконтроллеров (за исключением "динозавра" 8080), которое ведёт себя подобным образом. Не спешите выбрасывать стабилизатор и контроллер! Просто проверьте конденсатор (или его наличие).
Камень 2. Сигнал #RESET.
По включении питания в микроконтроллере активизируется внутренняя цепь сброса, никаких внешних RC-цепей не требуется. Более того, конденсатор между #RESET и GND может быть даже "вредным", т.к. если одновременно #RESET и BS, или #RESET и SCK окажутся по включении питания в "0", теоретически возможна активизация режима программирования. Мне кажется, что лучше всего бросить #RESET "в воздухе" или, если контроллер включен в систему, использующую его вывод сброса, не допускать его ввода в режим программирования.
Камни программные
AVR-контроллеры во многом схожи с "настоящим" компьютером - у них есть контроллер прерываний, допускающий вложенные прерывания, правда с жестко закреплёнными приориоритетами и адресами обработчиков и подробное слово состояния. При первом беглом просмотре документации программист видит, что доступны все виды адресации, имеются в наличии все арифметические и логические операции и (ура!!!) даже операции с памятью с авто- декрементом и инкрементом индексных регистров! 32 регистра и море памяти! А быстродействие какое! Он радостно потирает руки, садится за компьютер и ... Поверьте, при первом знакомстве эта достаточно норовистая "железка" подарила мне много часов "исследовательской" работы.
Камень 1. Регистровый файл.
AVR-контроллеры имеют регистровый файл из 32 регистров общего назначения, на первый взгляд
равнозначных. Однако, попробуем операции с константами:
.equ const =1 ;Какая-нибудь константа ;Загрузка константы в регистр ldi r16,const ;Правильно ldi r2,const ;Ошибка ;Установка битов в регистре sbr r17,const ;Правильно sbr r1,const ;Ошибка ser r18,const ;Правильно ser r10,const ;Ошибка
То же самое относится к операциям OR и AND (инструкции ori и andi соответственно),
а также инструкциям сравнения с константой cpi и вычитания байтовой константы из регистра
subi. Итак, выясняется, что операции с константами можно производить только в старших 16
регистрах, 6 из которых ещё являются индексными. Но это ещё не всё.
Наивный программист думает, что если можно вычесть константу из регистра, значит можно сложить
регистр с константой. А вот и нет! Такой операции просто нет. Ну нет и всё тут.
Впрочем, всё это не так страшно, как кажется, если постараться оптимизировать арифметику в
программе. К счастью, ограничений на операции типа "регистр-регистр" нет.
Камень 2. Регистры управления и битовая адресация.
В области ввода-вывода ($20...$5F) не все регистры допускают битовую адресацию. Возможно это проблема ассемблера AVRASM.EXE, но она всё же есть, и в документации ATMEL я не встретил об этом ни слова. Но не всё так мрачно - I/O-порты, регистры управления портов, FLASH-памяти , UART и компаратора битовую адресацию понимают, а для остальных регистров она не так уж важна. Вот примеры битовых обращений к области ввода-вывода:
sbi portb,2 ;Правильно sbi timsk,5 ;Ошибка
Камень 3. RAM.
К сожалению, "громадный" по масштабам микроконтроллеров объём RAM предназначен только для хранения информации и не допускает арифметических и логических операций с прямой адресацией. Поэтому программист, привыкший к архитектуре MCS51 или схожей с ней, допускающей какой-то минимум арифметики с памятью, будет очень долго чертыхаться по поводу, например, обилия операций типа "вынь-положи" для поиска совпадений в таблице, находящейся в RAM, и т.п.
Заключение
В этом материале изложены наиболее существенные особенности контроллеров серии AT90S,
которые могут доставить много хлопот разработчику, впервые взявшемуся за создание устройства
на AVR-контроллере. Хочется дополнить этот список ещё двумя-треия главами, что вскорости придётся
сделать. Я не ставил перед собой задачу показать конкретные пути решения проблем или
продублировать ATMEL-овскую документацию, а только хотел показать, как эти проблемы выглядят.
И тем более, несмотря на местами ехидный тон, у меня нет желания очернять это изящное создание -
AVR-контроллеры. По крайней мере в своём классе контроллеру AT90S2313 равных просто нет,
а AT90S4414 и AT90S8515 могут довольно успешно заменить "короля управления" MCS51.
Уважение к читателю, подключенному, возможно, через телефонную линию, не позволяет
мне выставить к обозрению довольно обширные наблюдения за поведением AVR-контроллеров
в различных устройствах. AVR-архитектура - очень интересное создание, заслуживающее большего,
чем пять коротких глав в Internet-издании. Но это дело будущего, надеюсь, недалёкого.
© Берёзкин С.Е., 2001 г.