Принцип работы с микроконтроллерами Atmel (Avr)
Микроконтроллер - устройство, микросхема, предназначена для управления другими устройствами. Микроконтроллер содержит в себе процессор, память, а так же периферийные устройства. Фактически, контроллер "дергает ножками" - посылает импульсы разной длительности на ноги.
И это очень важно понять для начала изучения микроконтроллеров.
Список периферийных устройств контроллера очень большой.
Неполный перечень:
- универсальные цифровые порты - имеют настраиваемый режим работы как на ввод, так и вывод;
- другие интерфейсы ввода-вывода, такие как UART, USB, IEEE 1394, Ethernet;
- аналого-цифровые и цифро-аналоговые преобразователи;
- компараторы;
- широтно-импульсные модуляторы;
- таймеры;
- массивы встроенной флеш-памяти;
- встроенный тактовый генератор и/wp-admin/post.php?post=119&action=edit сторожевой таймер.
В заметках рассмотрим принцип работы с микроконтроллерами Atmel (Avr)
Для начала достаточно разобраться с универсальными цифровыми портами.
Каждый контроллер от Atmel имеет порты, с названиями PORTA, PORTB, .... в зависимости от типа микроконтроллера. Порты не обязательно начинаются с PORTA - например, в DIP Atmega8 его нет. В зависимости от типа контроллера, порты имеют разную разрядность (8, 16, 32 и т.д. бит). Розрядность порта может фигурировать в названии контроллера. Например, тот же Atmega8, Atmega16, Atmega32. А может и не фигурировать (Attiny2313 как вариант - но он тоже 8-битный). Надеюсь, интуитивно понятно, что разрядность порта определяет, сколько бит информации одновременно передается - а, значит, сколько ножек имеет порт.
Рассмотрим работу с микроконтроллером на языке C.
Для начала надо настроить порт на ввод или на вывод. Это можно сделать с помощью регистра DDRx, где х - порт (A, B, C и т.д.) 1 - порт настроен на выход, 0 - на ввод.
Нумерация ножек порта:
Например, настроем первый бит (1 ножку) порта А на вывод:
DDRA = 0b00000001;
0b в начале означает, что число представленое в двоичной сичтеме исчисления. Вы можете представлять числа в любой удобной для вас форме. Но принято использовать 2 формы - двоичную (бинарную) и шестнадцатиричную. В двоичной системе проще понимать (0 - низкий логический уровень на ножке, 1 - высокий), в шестнадцатиричной более компактная запись. Что использовать - решать вам.
Разумеется, такая запись не слишком удобная (но самая понятная и быстрая), как правило, для таких и подобных действий используют побитовые операции, но их подробно рассмотрим (в применении к микроконтроллерам) в одной из следущих заметок.
Теперь можем передать значение на порт (на ту же 1 ножку):
PORTA = 0b00000001;
Ну и.... Фактически все для ознакомления! Этих элементарных знаний плюс немного фантазии плюс немного базового опыта в программировании достаточно для того, чтобы, например, создать какую-то светодиодную мигалку (например, как здесь: Подарок девушке своими руками (на attiny2313)).
Например, под gcc-avr простейша программа имеет следующий вид:
//Подключение библиотек ввода/вывода
#include <avr/io.h>void main()
{
//Переводим первый бит порта А в режим вывода
DDRA = 0b00000001;
//Подаем высокий логический уровень на первую ножку порта А
PORTA = 0b00000001;
}
И так мы можем зажечь/спалить светодиодик =)