Итак, цель этой статьи в том, чтобы описать и по возможности показать весь процесс создания устройства на основе микроконтроллера с «нуля». То есть, от задумки (например, решили мы собрать новогоднюю мигалку, подобную описанной уважаемым alx32 в статье «Анатомия микроконтроллеров ATmega»…) до воплощения в железе. Разумеется, минуя все промежуточные стадии: постановка задачи, выбор МК, подбор обвязки, формулировка алгоритма, написание программы, отладка, создание платы и, самое долгожданное – запуск!!!
Обновлено: добавлены файлы. Итак, задача: нам нужно создать устройство, способное зажигать в определенном порядке (пусть будет по очереди) , N-ное количество светодиодов (пускай будет 8 штук).
(это для начала……..)
Теперь можно браться за программирование. Писать можно на чем угодно, но начинающим советую отдать предпочтение языку C, т.к. программировать проще и нагляднее. Лично я пользуюсь компилятором CodeVision AVR (он есть в файловом архиве), дальнейшие листинги программ будут приводиться именно для этого компилятора.
Определимся с алгоритмом. Нам нужно по очереди через определенный промежуток времени активировать один из выходов МК.
Включать/выключать можно разными способами:
- присваивать значения каждому выводу отдельно;
- записывать значения сразу всех выводов.
Значения (последовательность) можно получить:
- набрав все команды вручную;
- из массива;
- математическим методом.
Временной интервал можно задать:
- функциями delay (задержка);
- через таймер.
Поэкспериментируем со всеми этими способами. Но сначала нужна заготовка…
Чтобы создать заготовку программы воспользуемся генератором кода, встроенным в CVAVR. Для этого запускаем программу, нажимаем File -> New, в открывшемся окне выбираем “Project” и жмем OK. На вопрос «Воспользоваться генератором кода?» отвечаем “Yes”.
Появилось окно генератора кода. В нем выбираем тип МК и его тактовую частоту, остальное оставляем как есть:

Далее переходим на вкладку “Ports” и там в “PortB” и выставляем следующее:
Так мы определили все выводы порта B как выходы, а нолики означают, что при включении питания на них будет устанавливаться логический "0".
Остальные функции нам пока не нужны.
Жмем “File -> Generate, Save and Exit”, выбираем куда сохранить файлы проекта и видим окно с созданным генератором кодом.
Теперь давайте введем в программу наш код.
Простейший вариант реализации (хотя и самы не красивый с точки зрения программирования) – записываем значения каждого вывода, а задержки делаем через функцию delay.
delay_ms(x); - задержка на x миллисекунд
delay_us(x); - задержка на x микросекунд
PORTB - порт, с которым мы работаем.
PORTB.x - обращение к выводу x порта B
Находим в конце текста такие строки

Это бесконечный цикл (т.е.выполняется всё время, пока включено питание) нашей программы . Всё, что перед ним – команды предварительной настройки микроконтроллера. Строки, начинающиеся с “//” – комментарии, их тоже полезно иногда читать.
Жмем кнопочку Make the project (в панели инструментов).
Матерится?

И правильно! Компилятор не знает функции delay_ms(), поэтому надо указать ему файл, в котором эта функция описана.
Для этого в самом начале текста программы нужно вставить строку
#include <delay.h>
(тут точка_с_запятой не нужна!)Примерно вот так:

Снова жмем волшебную кнопочку.
Проект создан.
Теперь в папке, в которую мы сохранили сам проект, появился файл название_проекта.hex – это и есть прошивка микроконтроллера!

Но подождите, не торопитесь хвататься за паяльник… Мы ведь учимся программировать, а не паять!

Именно поэтому предлагаю проверить нашу программу в виртуальном режиме, а именно – в таком замечательном и любимом мною продукте от Labcenter Electronics - Proteus VSM


Итак, запускаем ISIS (среда разработки принципиальных схем). В этом окне нажимам кнопочку “P”.
В строке “Keywords” вводим “attiny2313” и справа получаем:
Выбирать особо не из чего, поэтому щелкаем дважды по этой одинокой строке и видим слева в основном окне:
Это значит, что элемент добавлен.
Теперь введите в поле “Keywords” слова “LED-RED” и “RES”. Добавьте резистор и светодиод в проект и закройте окно выбора элементов.
Пробуем собрать схему (вывод RESET обязательно подключите к +5V, иначе ничего не заработает! и в жизни это тоже желательно!)
Вот небольшая подсказка:
А для редактирования свойств элементов достаточно щелкнуть по ним дважды.
Собрали? Надеюсь, не покалечили при этом себя, близких и окружающие предметы.

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

Когда схема собрана, можно прошить наш виртуальный МК. Для этого щелкаем по нему дважды и видим окно:
В поле “Program file” указываем наш файл прошивки, остальное не трогаем, пока. Жмем кнопку OK. И запускаем анимацию:
Вот и замигала наша мигающая мега-мигалка!!!

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

В общем, продолжение следует… Будем разбираться с записью во все выводы сразу и использованием таймеров, массивов и прерываний…


Одержим идеей автоматизации жилища а-ля "Умный дом" =)