Эту статью (а точнее цикл статей) я решил полностью посвятить микроконтроллерам фирмы Atmel. Конечно, тема эта избитая. НО! На собственном опыте знаю, что познать истину среди этого, извините, БАРДАКА, очень и очень сложно! Поэтому решил попытаться внести хотя бы какую-нибудь ясность в головы жаждущих познать этого страшного зверя, зовущегося «Микроконтроллер».
Итак, цель этой статьи в том, чтобы описать и по возможности показать весь процесс создания устройства на основе микроконтроллера с «нуля». То есть, от задумки (например, решили мы собрать новогоднюю мигалку, подобную описанной уважаемым alx32 в статье «Анатомия микроконтроллеров ATmega») до воплощения в железе. Разумеется, минуя все промежуточные стадии: постановка задачи, выбор МК, подбор обвязки, формулировка алгоритма, написание программы, отладка, создание платы и, самое долгожданное – запуск!!! Список всех частей:
Грызём микроконтроллеры. Урок 1. Моргаем 8-ю светодиодами. CodeVision, Proteus, ISIS
Грызём микроконтроллеры. Урок 2. CodeVision и С
Грызём микроконтроллеры. Урок 3. Циклы, прерывания и массивы
Грызём микроконтроллеры. Урок 4. Мерим температуру или напряжение
Грызём микроконтроллеры. Урок 5. Кодовый замок
Грызём микроконтроллеры. Урок 6. Прошиваем МК
Грызём микроконтроллеры. Урок 7. Подключение к МК кнопок, клавиатуры, энкодера
Грызём микроконтроллеры. Урок 8. Программирование кнопок, клавиатуры, энкодера
Грызём микроконтроллеры. Урок 9. Клавиатура вглубину
Итак, задача: нам нужно создать устройство, способное зажигать в определенном порядке (пусть будет по очереди) , N-ное количество светодиодов (пускай будет 8 штук, это для начала).
Выберем микроконтроллер: на мой взгляд, нам очень подходит МК ATtiny2313, т.к. у него достаточное количество портов ввода-вывода (очень советую почитать о архитектуре микроконтроллеров в статье, написанной alx32, «Анатомия микроконтроллеров ATmega»). Потом он не дорог и легкодоступен.
Теперь, ДО(!) того, как браться за написание программы для микроконтроллера, прикидываем схему в железе, чтобы потом писать программу именно под эту схему (см. выше).
Каждый выход порта микроконтроллера может отдать в нагрузку ток до 20мА, чего вполне достаточно для питания светодиода, поэтому подключаем светодиоды через токоограничительные резисторы прямо к выходам МК.
На этом с железом пока всё.
Теперь можно браться за программирование. Писать можно на чем угодно, но начинающим советую отдать предпочтение языку 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
Находим в конце текста такие строки
Это бесконечный цикл (т.е.выполняется всё время, пока включено питание) нашей программы . Всё, что перед ним – команды предварительной настройки микроконтроллера. Строки, начинающиеся с “//” – комментарии, их тоже полезно иногда читать.
Вводим вместо слов “// Place your code here” следующие строки:
PORTB.0=1;
delay_ms(500);
PORTB.0=0;
PORTB.1=1;
delay_ms(500);
PORTB.1=0;
PORTB.2=1;
delay_ms(500);
PORTB.2=0;
PORTB.3=1;
delay_ms(500);
PORTB.3=0;
PORTB.4=1;
delay_ms(500);
PORTB.4=0;
PORTB.5=1;
delay_ms(500);
PORTB.5=0;
PORTB.6=1;
delay_ms(500);
PORTB.6=0;
PORTB.7=1;
delay_ms(500);
PORTB.7=0;
delay_ms(500);
Обратите внимание – каждая строка должна заканчиваться точкой_с_запятой, иначе компилятор будет ругать вас матом.
Жмем кнопочку Make the project (в панели инструментов).
Матерится? И правильно! Компилятор не знает функции delay_ms(), поэтому надо указать ему файл, в котором эта функция описана.
Для этого в самом начале текста программы нужно вставить строку
#include <delay.h>
(тут точка_с_запятой не нужна!)Примерно вот так:
Снова жмем волшебную кнопочку.
Проект создан.
Теперь в папке, в которую мы сохранили сам проект, появился файл название_проекта.hex – это и есть прошивка микроконтроллера!
Но подождите, не торопитесь хвататься за паяльник. Мы ведь учимся программировать, а не паять!
Именно поэтому предлагаю проверить нашу программу в виртуальном режиме, а именно – в таком замечательном и любимом мною продукте от Labcenter Electronics - Proteus VSM
Там можно моделировать абсолютно любые схемы (даже примитивы Лапласа есть!). Взять ее можно в прикрепленном архиве, вместе с файлами проекта. Правда версия не совсем крякнутая, поэтому не работает сохранение. Что с этим делать расскажу в отдельной статье.
Итак, запускаем ISIS (среда разработки принципиальных схем). В этом окне нажимам кнопочку “P”.
В строке “Keywords” вводим “attiny2313” и справа получаем:
Выбирать особо не из чего, поэтому щелкаем дважды по этой одинокой строке и видим слева в основном окне:
Это значит, что элемент добавлен.
Теперь введите в поле “Keywords” слова “LED-RED” и “RES”. Добавьте резистор и светодиод в проект и закройте окно выбора элементов.
Пробуем собрать схему (вывод RESET обязательно подключите к +5V, иначе ничего не заработает! и в жизни это тоже желательно!)
Вот небольшая подсказка:
А для редактирования свойств элементов достаточно щелкнуть по ним дважды.
Собрали? Надеюсь, не покалечили при этом себя, близких и окружающие предметы.
Простите за издевательство, просто если разберешься сам – уже не забудешь, так что, постигайте, программа очень мощная и она стоит того, чтобы ее освоить! :laughing:
Когда схема собрана, можно прошить наш виртуальный МК. Для этого щелкаем по нему дважды и видим окно:
В поле “Program file” указываем наш файл прошивки, остальное не трогаем, пока. Жмем кнопку OK. И запускаем анимацию:
Вот и замигала наша мигающая мега-мигалка!!!
Вот только проблемка. Заметили, что все светодиоды зажигаются один за другим, кроме первого. Он зажигается не в тот же момент, когда тухнет последний, а с небольшой задержкой.
Вот мы и нашли ошибки в работе программы, даже не проверяя ее на настоящем микроконтроллере.
Попробуйте сами найти причину этой неприятной неожиданности.
В общем, продолжение следует.
Будем разбираться с записью во все выводы сразу и использованием таймеров, массивов и прерываний.
Proteus 7.10 Full (104Mb) Проверяйте на вирусы сами!
Схема для ISIS:
🎁migalka.rar 12.19 Kb ⇣ 452
Камрад, рассмотри датагорские рекомендации
🌼 Полезные и проверенные железяки, можно брать
Опробовано в лаборатории редакции или читателями.