Принцип работы с микроконтроллерами Atmel (Avr)

Микроконтроллер - устройство, микросхема, предназначена для управления другими устройствами. Микроконтроллер содержит в себе процессор, память, а так же периферийные устройства. Фактически, контроллер "дергает ножками" - посылает импульсы разной длительности на ноги.

Микроконтроллер
atmega8 в DIP - корпусе

И это очень важно понять для начала изучения микроконтроллеров.

Список периферийных устройств контроллера очень большой.

Неполный перечень:

  • универсальные цифровые порты - имеют настраиваемый режим работы как на ввод, так и вывод;
  • другие интерфейсы ввода-вывода, такие как 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 - на ввод.

Нумерация ножек порта:

ports

Например, настроем первый бит (1 ножку) порта А на вывод:

DDRA = 0b00000001;

0b в начале означает, что число представленое в двоичной сичтеме исчисления. Вы можете представлять числа в любой удобной для вас форме. Но принято использовать 2 формы - двоичную (бинарную) и шестнадцатиричную. В  двоичной системе проще понимать (0 - низкий логический уровень на ножке, 1 - высокий), в шестнадцатиричной более компактная запись. Что использовать - решать вам.

Разумеется, такая запись не слишком удобная (но самая понятная и быстрая), как правило, для таких и подобных действий используют побитовые операции, но их подробно рассмотрим (в применении к микроконтроллерам) в одной из следущих заметок.

Теперь можем передать значение на порт (на ту же 1 ножку):

PORTA = 0b00000001;

Ну и.... Фактически все для ознакомления! Этих элементарных знаний плюс немного фантазии плюс немного базового опыта в программировании достаточно для того, чтобы, например, создать какую-то светодиодную мигалку (например, как здесь: Подарок девушке своими руками (на attiny2313)).

Например, под gcc-avr простейша программа имеет следующий вид:

//Подключение библиотек ввода/вывода
#include <avr/io.h>

void main() {

//Переводим первый бит порта А в режим вывода DDRA = 0b00000001;

//Подаем высокий логический уровень на первую ножку порта А PORTA = 0b00000001; }

И так мы можем зажечь/спалить светодиодик =)