Главная /
Микроконтроллеры /
AVR /
|
Что нужно для того, чтобы стать профессиональным разработчиком программ для микроконтроллеров и выйти на такой уровень мастерства, который позволит с лёгкостью найти и устроиться на работу с высокой зарплатой (средняя зарплата программиста микроконтроллеров по России на начало 2015 года составляет 80 000 рублей).
Подробнее...
|
Микроконтроллеры AVR: общие сведения
Микроконтроллеры серии AVR – это одни из самых быстродействующих МК в мире.
Эта серия представлена очень большим разнообразием моделей, начиная от небольших
8-выводных устройств и заканчивая микросхемами в 40-выводных корпусах.
Система команд
максимально унифицирована, поэтому, написав программу для одной модели, можно перенести
ее на другую модель с минимальными переделками.
Все микроконтроллеры AVR имеют FLASH-память программ, что позволяет их многократно
перепрограммировать. В отличие, например, от микроконтроллеров PIC, которые выполняют
одну команду за 4 такта, МК серии AVR выполняют большинство команд за один такт.
Среда разработки AVR Studio, распространяемая бесплатно, имеет удобный интерфейс и
позволяет разрабатывать программы как на языке ассемблера, так и на языке С.
В нашем проекте
используется микроконтроллер AT90S1200. Это 8-разрядный RISK-микроконтроллер,
имеющий 15 выводов для ввода-вывода данных. Назначение выводов и расположение их на корпусе МК приведено на рис. 1.
Рис.1. Назначение выводов микроконтроллера AT90S1200
Регистры ввода-вывода
Регистрам ввода-вывода присвоены номера от 0 ($00) до 63 ($3F). Каждый из этих
регистров выполняет специфические функции (например, считает ход времени,
управляет последовательным портом и т.п.). Основные регистры ввода-вывода – это PortB,
PortD, PinB, PinD. Эти регистры представляют собой порты B и D
соответственно.
Если порт функционирует как вход, то двоичное число, содержащееся в регистрах PinB и PinD,
показывает состояние выводов. При этом вывод PB0 будет соответствовать биту 0 регистра
PinB и т.д. Если на выводе напряжение высокого уровня, то соответствующий бит установлен в 1,
и наоборот.
Чтобы задать режим работы вывода микроконтроллера (далее - МК), нужно определить, какие выводы
будут работать как входы, а какие – как выходы. Это делается при помощи регистров
ввода-вывода DDRB и DDRD. Каждый бит этих регистров соответствует одному из выводов МК.
Например, бит 4 регистра DDRB соответствует выводу PB4. Установка в 1 соответствующего
бита регистра DDRx делает его выходом, а сброс бита в 0 делает его входом.
Если мы конфигурируем вывод как вход, то мы можем задать, будет ли к этому выводу
подключен внутренний подтягивающий резистор или нет. Чтобы включить подтяжку входа,
нужно установить в 1 соответствующий бит порта PortX. Что касается выходов,
то необходимо определить, в каком состоянии они будут находиться при старте программы.
Для этого устанавливают или сбрасывают соответствующие биты порта PortX.
Прерывания
В модели 1200 имеются следующие прерывания:
- Прерывание по низкому уровню на выводе INT0 (PD2)
- Прерывание по нарастающему фронту сигнала на выводе INT0
- Прерывание по спадающему фронту сигнала на выводе INT0
- Прерывание по переполнению таймера/счетчика T/C0
- Прерывание по выходному сигналу аналогового компаратора
Первые три прерывания являются взаимоисключающими, т.е. в любой момент времени
можно вызвать только одно из этих прерываний.
При возникновении прерывания программа переходит по одному из адресов,
расположенных в начале памяти программ. В совокупности эти адреса образуют таблицу
векторов прерываний. Для модели 1200 таблица векторов прерываний приведена в таблице 1.1.
Таблица 1.1. Таблица векторов прерываний МК AT90S1200
Тип прерывания |
Адрес перехода команды |
Включение питания/Сброс |
0х0000 |
Внешнее прерывание на INT0 |
0х0001 |
Прерывание по переполнению T/C0 |
0х0002 |
Прерывание от аналогового компаратора |
0х0003 |
Имеется возможность разрешать отдельные прерывания, используя различные регистры.
Бит разрешения внешнего прерывания является 6-м битом регистра ввода-вывода GIMSK
(General Interrupt Mask – общий регистр маски прерываний). Установка этого бита
разрешает прерывание, сброс – запрещает. Бит разрешения прерывания по переполнению T/C0
является первым битом регистра ввода-вывода TIMSK
(Timer Interrupt Mask – регистр маски прерываний от таймеров/счетчиков).
Однако наивысший приоритет имеет «глобальное разрешение» прерываний.
Это специальный переключатель, который запрещает все прерывания, когда выключен,
и разрешает индивидуально разрешенные прерывания, когда включен. В роли этого
переключателя выступает бит 1 регистра флагов SREG.
Внешнее прерывание INT0 может быть сконфигурировано таким образом, чтобы оно
происходило при наступлении одного из трех условий, в зависимости от состояния
битов 0 и 1 регистра ввода-вывода MCUCR (в этом регистре хранятся также установки
спящего режима). Зависимость типа прерывания от состояния указанных битов приведена
в таблице 1.2.
Таблица 1.2. Типы прерываний INT0
MCUCR |
Условие возникновения прерывания |
Бит 1 |
Бит 0 |
0 |
0 |
На выводе INT0 напряжение низкого уровня |
0 |
1 |
Неверная конфигурация |
1 |
0 |
На выводе INT0 спадающий фронт |
1 |
1 |
На выводе INT0 нарастающий фронт |
При возникновении прерывания бит глобального разрешения прерываний автоматически
сбрасывается. Благодаря этому во время работы обработчика прерываний исключается
возникновение других прерываний. При возврате из прерывания обычно нужно повторно
разрешить прерывания. Для этого имеется специальная
команда RETI.
Каждое прерывание имеет свой флаг прерывания. Этот флаг (бит) устанавливается
в 1 в тот момент, когда прерывание должно произойти, даже если прерывания глобально
запрещены и соответствующая программа обработки прерываний не вызывается.
Если прерывания запрещены, то, прочитав этот флаг, можно определить, было ли прерывание.
Этот флаг остается установленным до тех пор, пока его не сбросить. Флаги прерываний
сбрасываются установкой в них значения 1!!!
Флаг прерывания по переполнению T/C0 является первым битом регистра ввода-вывода
TIFR (Timer Interrupt Flag Register – регистр флагов прерываний таймеров),
а флаг внешнего прерывания – 6-м битом регистра ввода-вывода GIFR
(General Interrupt Flag Register – регистр флагов прерываний общего назначения).
Подпрограммы
В модели 1200 можно сделать не более 3-х вложенных друг в друга подпрограмм,
так как этот МК имеет 3-уровневый аппаратный стек. Вызывается подпрограмма командой
RCALL.
Для возврата из подпрограммы используется
команда RET.