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


Comments 0