Программирование микроконтроллеров. Часть 1
Каждый радиолюбитель, рано или поздно, собирающий конструкции на микроконтроллерах задумывается о написании своих программ, а не о простом повторении чужих программ для своих проектов.
Программировать микроконтроллеры не так уж и сложно.
Самое главное в этом деле — желание. Будет желание, будет и результат.
В этом уроке я покажу вам как написать простую программу для микроконтроллера At-mega328. Посмотреть datasheet на него http://www.atmel.com/Images/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Datasheet.pdf. Этот микроконтроллер довольно широко распространен, прост в программировании и стоит дешево. Именно этот микро-контроллер стоит в Arduino UNO широко известном радио конструкторе для начинающих и не только радиолюбителей.
Программировать в этом уроке я буду своеобразный «Hello, World!» для микроконтроллеров: мигание светодиодом. Для этого нам понадобиться среда программирования, я выбрал Atmel Studio 7 и программа для моделирования электронных схем Proteus. Atmel Studio можно скачать по этой ссылке: http://www.atmel.com/tools/atmelstudio.aspx, а Proteus на сайте https://www.labcenter.com.
Нужно создать папку на диске где будут храниться проекты. Пусть это будет папка на диске D. Я назвал ее Электроника. В этой папке я создал еще одну папку Test1. Потом запустил Proteus и нарисовал такую схему:
И сохранил проект под именем Test1. Запустил Atmega Studio и создал новый проект
В появившемся окне выбрал тип микроконтроллера, в моем случае это atmega328p
Все готово и можно приступать к программированию.
В строке #include <avr/io.h>
подключается библиотека в которой находятся определения констант, имен регистров и всего прочего, что может понадобиться для выполнения базового ввода-вывода.
Перед этой строчкой я вставил: #define F_CPU 8000000UL
А после неё: #include <util/delay.h>
#define F_CPU 8000000UL
– здесь мы указываем компилятору с какой частотой будет работать микроконтроллер
#include <util/delay.h>
- этой строчкой подключается еще одна библиотека которая отвечает за задержки — это такие функции, как _delay_ms(), _delay_us(); для этой библиотеки, как раз в самом начале, и указывали частоту используемого генератора.
Теперь код будет выглядеть так:
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
/* Replace with your application code */
while (1)
{
}
}
Далее нужно указать какой порт будет работать на выход. Делается это так:
DDRD = 0xff;
- переключаем порт D микроконтроллера на выход
PORTD = 0x00;
- устанавливаем все выходы порта в логический 0
В теле цикла while нужно прописать следующее:
PORTD = 0xff;
_delay_ms(100);
PORTD = 0x00;
_delay_ms(100);
Весь код будет выглядеть так:
#define F_CPU 8000000UL //Рабочая частота МК (8МГц)
#include <avr/io.h>
#include <util/delay.h> //для _delay_ms()
int main(void)
{
DDRD = 0xff; //переключаем порт D на выход
PORTD = 0x00; //устанавливаем все выходы порта в логический 0
/* Replace with your application code */
while (1)
{
PORTD = 0xff; //устанавливаем все выходы порта в логическую 1
_delay_ms(100); //ждем 100 мс
PORTD = 0x00; //устанавливаем все выходы порта в логический 0
_delay_ms(100); //ждем 100 мс
}
}
Сохраняем и компилируем проект
Видим, что ошибок нет. Проект скомпилирован, прошивка Test1.hex находится здесь D:\Электроника\Test1\Test1\Test1\Debug.
В Proteus в свойствах микроконтроллера указываем нашу прошивку
Теперь можно запускать симуляцию проекта. Светодиод начнет мигать.
Эту прошивку можно «залить» в atmega328 при помощи программатора, подключить к микро-контроллеру светодиод с резистором, питание и схема заработает!
На этом все.
Вам понравился мой урок? Есть замечания по нему? Нужно делать продолжение или нет?
Жду комментариев и критики.
Я в ЖЖ http://evgenij-byvshev.livejournal.com/.
Я в ВК https://vk.com/evgenij_byvshev.