Найти тему
Евгений Бывшев

Программирование микроконтроллеров. Часть 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 и нарисовал такую схему:

-2

И сохранил проект под именем Test1. Запустил Atmega Studio и создал новый проект

-3

В появившемся окне выбрал тип микроконтроллера, в моем случае это atmega328p

-4

Все готово и можно приступать к программированию.

-5

В строке #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 мс
}
}

Сохраняем и компилируем проект

-6

Видим, что ошибок нет. Проект скомпилирован, прошивка Test1.hex находится здесь D:\Электроника\Test1\Test1\Test1\Debug.
В Proteus в свойствах микроконтроллера указываем нашу прошивку

-7

Теперь можно запускать симуляцию проекта. Светодиод начнет мигать.
Эту прошивку можно «залить» в atmega328 при помощи программатора, подключить к микро-контроллеру светодиод с резистором, питание и схема заработает!