Програмирование

микроконтроллеров AVR Atmell
Моя основная цель — дать понять как это работает, как это использовать, как это настроить, чтобы получить хоть что-то рабочее. Поэтому я много уделяю алгоритмам, организации логики программ — классическим приемам программирования. Стараюсь не забывать и про оптимизацию.
Это, возможно, будет неинтересно тем кто учился на программистов, но вот электронщикам, изучающим программирование, это редко дают даже в ВУЗах.

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

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

О структуре курса
Курс начинается с ассемблера. Так как я считаю, что без понимания работы контроллера на уровне машинных инструкций невозможно научиться писать надежные и быстрые программы. Знание ассемблера позволяет в разы быстрей находить баги и ошибки в собственных программах. Да и вообще, на самом деле, ассемблер куда проще изучать чем тот же Си. Просто потому, что там все действия видны как на ладони. Достаточно только прогнать по ним отладчик AVR Studio.

В Си же есть ряд мощных заморочек с оптимизатором да и вообще, будучи более высокоуровневым, Си намного более сложен по структуре чем ассемблер. И изучать его с нуля сложней — т.к. в случае когда очевидная конструкция работает “не так” не знаешь куда бежать и за что хвататься. А если знаешь ассемблер, то открываешь дизасм, прогоняешь мутный участок и все баги выходят из сумрака.

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

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

О ошибках
Я их совершаю, более того, я их совершаю часто. Могут быть как опечатки и технические неточности, так и откровенные ляпы:) Так что не стоит все написанное у меня рассматривать как истину в последней инстанции. Если что то не работает или работает не так как надо, то открывай даташит и сравнивай параметры — я мог и ошибиться. Если это так то сообщи мне в комментариях — исправлю. Если в чем то сомневаешься — спрашивай, разберемся.
В даташитах, кстати, тоже бывают ошибки. Более того, они бывают и в самих контроллерах на аппаратном уровне. Особенно в первых ревизиях. Об ошибках контроллеров и прошлых ревизий даташитов есть отдельный раздел. Называется ERRATA, находится в конце каждого даташита на контроллер. Советую внимательно его прочитать.


О языках
Вся техническая документация написана на английском. Но незнание языка — это не отмазка. Сейчас 21 век, а еще в конце 20го века, крошечная программка Сократ’97 умела вполне сносно переводить с английского на русский, не литературно, конечно, но понять суть можно было. За 13 лет технологии машинного перевода продвинулись весьма значительно =)))) Так что читайте мануалы.

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

Однако, примеры просты и перегнать из Си в ассемблер и наоборот несложно. Особенно когда речь идет о инициализации и запуске в работу периферии.

Отмазки в стиле “Я знаю Си(ассемблер), а а вот ассемблер(си) не понимаю, есть пример на Си(асме)?” идут от нежелания чуть чуть подумать, внимательно посмотреть на то что и куда записывается:))) Не важно на каком языке что записано! Главное, что и в какие порты пихается, это понять можно с первого взгляда, на чем бы не писалось — на асме, си, паскале или бейсике.
Я, конечно, отвечаю и на такие вопросы. Но настроение мне это не повышает:)

О телепатии
Я ей не владею. Так что если что то не работает, то не надо мне пытаться съесть мозг вопросами. Куда лучше приложить тот код который не работает. Причем не стоит его копипастить в форму ввода комментариев — его весь перекосит, половина символов закосит под хтмл тэги, а читать все это вовсе будет невозможно. Да и проблема может быть вовсе и не там где тебе кажется.

Возьми и пихни в архив весь проект из AVR Studio и залей на какой-нибудь файлхостинг (их миллион сейчас. Тот же narod.yandex.ru), а мне в комменты скинь ссылочку на архив и описание проблемы. Быстрей будет.

А раньше было же не так! Что случилось с старыми статьями?
А как собачки — сдохли и все. Старый курс был весьма коряв, в нем содержались мощные дыры, а также не было единой отладочной платформы. Сейчас, с появлением демоплатыPinboard эта проблема решена.

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

Чего не будет в курсе
У меня гарантированно не будет ботвы вида “смотрите как легко и просто мигнуть диодиком”, “скопируйте эту строку в свою программу и на LCD увидите текст. Это просто”. Я не буду показывать как писать программы для AVR на примере какого-нибудь, нафиг тебе не нужного устройства, вроде частотомера или музыкального звонка. Захочешь частотомер — сам потом сделаешь, уже без моей помощи:)

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

Разумеется, я покажу и как дидом мигнуть, и как на LCD экран вывести что-то. А также множество других не менее интересных приемов. Но будет это далеко не сразу, а лишь тогда, когда выданной тебе инфы будет достаточно для представления себе полной картины происходящего действа.

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

И ты удивишься тому, какой же простой и логичный язык Ассемблера. А потом, без проблем, пересядешь на Си. Освоив, тем самым надфиль и кувалду микроконтроллерного программирования. Я в этом уверен.

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

Но, если сильно все упростить, то основной функцией микроконтроллера является “дрыганье ножками”. Т.е. у него есть несколько выводов (от 6 до нескольких десятков в зависимости от модели) и на этих выводах он может выставить либо 1 (высокий уровень напряжения, например +5вольт), либо 0 (низкий уровень напряжения, около 0.1 вольта) в зависимости от программного алгоритма зашитого в его память. Также микроконтроллер может определять состояние сигнала на своих ножках (для этого они должны быть настроены на вход) — высокое там напряжение или низкое (ноль или единица). Современные микроконтроллеры также почти поголовно имеют на борту Аналогово Цифровой Преобразователь — это штука подобная вольтметру, позволяет не просто отследить 0 или 1 на входе, а полноценно замерить напряжение от 0 до опорного (обычно опорное равно напряжению питания) и представить его в виде числа от 0 до 1024 (или 255, в зависимости от разрядности АЦП)

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

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

MSC-51
Самое обширное и развитое это MSC-51, старейшее из всех, идущее от intel 8051 и ныне выпускаемое массой фирм. Иногда кратко зовется С51. Это 8-ми разрядная архитектура, отличается от большинства других восьмиразрядников тем, что это CISC архитектура. Т.е. одной командой порой можно совершить довольно сложное действие, но команды выполняются за большое число тактов (обычно за 12 или 24 такта, в зависимости от типа команды), имеют разную длину и их много, на все случаи жизни. Среди контроллеров архитектуры MSC-51 встречаются как динозавры вроде AT89C51, имеющие минимум периферии, крошечную память и неважнецкое быстродействие, так и монстры вроде продукции Silicon Laboratories имеющие на борту весьма мясистый фарш из разнокалиберной периферии, огромные закрома оперативной и постоянной памяти, мощные интерфейсы от простого UART ‘a до USB и CAN, а также зверски быстрое ядро, выдающее до 100 миллионов операций в секунду. Что касается лично меня, то я обожаю архитектуру С51 за ее чертовски приятный ассемблер на котором просто кайфово писать. Под эту архитектуру уже написаны гигабайты кода, созданы все мыслимые и немыслимые алгоритмы.

Atmel AVR
Вторым моим любимым семейством является AVR от компании Atmel. Вообще Atmel производит и MSC-51 контроллеры, но все же основной упор они делают на AVR. Эти контроллеры уже имеют 8-ми разрядную RISC архитектуру и выполняют одну команду за один такт, но в отличии от классического RISC ядра имеют весьма развесистую систему команд, впрочем не такую удобную как у С51, за что я их недолюбливаю. Но зато AVR всегда снаряжены как на войну и просто напичканы разной периферией, особенно контроллеры подсемейства ATMega. А еще их очень легко прошивать, для этого не нужны ни специализированные программаторы, ни какое либо другое сложное обрудование. Достаточно лишь пяти проводков и компьютера с LPT портом. Простота освоения позволила этому контроллеру прочно запасть в сердца многих и многих радиолюбителей по всему миру.

Microchip PIC.
Еще один 8-ми разрядный RISC микроконтроллер, отличается весьма извратской системой команд, состоящей всего из пары десятков команд. Каждая команда выполняется за четыре такта. есть ряд достоинств, в первую очередь это низкое энергопотребление, и быстрый старт. В среднем PIC контроллере нет такого количества периферии как в AVR, но зато самих модификаций PIC контроллеров существует такое количество, что всегда можно подобрать себе кристалл с периферией подходящей точно под задачу, не больше не меньше. На PIC ‘ax традиционно построены бортовые компьютеры автомобилей, а также многочисленные бытовые сигнализации.

Какое же семейство выбрать? О, это сложный вопрос. На многочисленных форумах и конференциях по сей день идут ожесточенные бои на тему какое семейство лучше, фанаты AVR грызутся с приверженцами MSC-51, попутно не забывая пинать по почкам PIC ‘овцев, на что те отвечают тем же.

Ситуация тут как в Starcraft:) Кто круче? Люди? Зерги? Протоссы? Все дело в применении, масштабах задач и массе других параметров. У каждого семейства есть свои достоинства и недостатки. Но лично я бы выбрал AVR и вот по каким причинам:

  • 1. Доступность в России. Эти контроллеры заслуженно популярны и любимы народом, а значит наши торговцы их охотно возят. Впрочем, как и PIC. С MSC-51 ситуация хуже. Морально устаревшие AT89C51 достать не проблема, но кому они нужны? А вот современные силабы это уже эксклюзив.
  • 2. Низкая цена. Вообще низкой ценой в мире славится PIC, но вот ирония — халявы начинаются только если брать его вагонами. На деле же, на реальном прилавке, AVR будет процентов на 30-40 дешевле чем PIC при несколько большем функционале. С MSC-51 ситуация ясна еще по первому пункту. Эксклюзив это не только редко, но и дорого.
  • 3. Очень много периферии сразу. Для серийного устройства это скорей недостаток. Куда лучше иметь только то, что надо в текущей задаче, а остальное чтобы не мешалось и не кушало зря энергию. Этим славится PIC со своим развесистым модельным рядом, где можно найти контроллер в котором будет нужное и не будет ненужного. Но мы то собираемся изучать и делать для себя! Так что нам лучше чтобы все, сразу и про запас. И вот тут AVR на голову выше чем PIC, выкатывая раз за разом все более фаршированные контроллеры. Купил себе какую-нибудь AtMega16A и все, можешь все семейство изучить.
  • 4. Единое ядро. Дело в том, что у всех современных AVR одинаковое ядро с единой системой команд. Есть лишь некоторые различия на уровне периферии (и те незначительные). Т.е. код из какой нибудь крошечной ATTiny13 легко копипастом перетаскивается в ATMega64 и работает почти без переделок. И почти без ограничений наоборот. Правда у старых моделей AVR (всякие AT90S1200) совместимость сверху вниз ограниченная - у них чуть меньше система команд. Но вот вверх на ура. У Микрочипа же существует целая куча семейств. PIC12/16/18 с разной системой команд. 12е семейство это обычно мелочь малоногая (вроде Tiny в AVR), а 18 это уже более серьезные контроллеры (аналог Mega AVR) И если код с 12го можно перетащить на 18, то обратно фиг.
  • 5. Обширная система команд контроллеров AVR. У AVR около 130 команд, а у Microchip PIC всего 35. Казалось бы PIC в выйгрыше — меньше команд, проще изучить. Ну да, именно так и звучит микрочиповский слоган, что то вроде “Всего 35 команд!”. Только это на самом деле фигня. Ведь что такое команда процессора? Это инструмент! Вот представь себе два калькулятора — обычный, бухгалтерский и инженерный. Бухгалтерский куда проще изучить чем инженерный. Но вот попробуй посчитать на нем синус? Или логарифм? Нет, можно, не спорю, но сколько нажатий кнопок и промежуточных вычислений это займет? То то же! Куда удобней работать когда у тебя под рукой куча разных действий. Поэтому, чем больше система команд тем лучше.
  • 6. Наличие бесплатных кроссплатформенных компиляторов Си. Конечно, кряк всегда найти можно. Где где, а в нашей стране это проблемой никогда не было. Но зачем что то воровать если есть халявное?;)
  • 7. Ну и последний аргумент, обычно самый весомый. Наличие того, кто бы научил и подсказал. Помог советом и направил на путь истинный. Я выбрал для себя AVR досконально будет разбираться именно это семейство, а значит выбора у тебя особого нет:)

Ой, но этих же AVR целая прорва. Какой взять???
Интересный вопрос. Вообще МК лучше выбирать под задачу. Но для изучения лучше хапнуть что то фаршированное.

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: