Постановка задачи


29, Июнь, 2008

Этот пост можно смело считать кратким описанием того безобразия, что я называю AVR. Учебный Курс.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

А если что, то я всегда рядом, стоит только оставить комментарий... =))))

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


  Содержание Вводная. Что такое микроконтроллер


ист-к: http://easyelectronics.ru/avr-uchebnyj-kurs-postanovka-zadachi.html