МИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра БТС
ИДЗ №2
по дисциплине «Микропроцессорные системы»
Тема: Программирование таймера
Студент гр. 7501 |
|
Исаков А.О. |
Преподаватель |
|
Анисимов А.А. |
Санкт-Петербург
2020
Цель работы: запрограммировать задержки для мигания светодиодом на языках С и Assembler.
Используемые инструменты: Отладочная плата ATTINY2313, интегрированная среда разработки AVR Atmel Studio 7.
Основные теоретические положения
Устройство отладочной платы ATTINY2313
ATtiny2313 низкопотребляющий 8 битный КМОП микроконтроллер с AVR RISC архитектурой.
AVR ядро объединяет богатую систему команд и 32 рабочих регистра общего назначения. Все 32 регистра непосредственно связаны с арифметико-логическим устройством (АЛУ), что позволяет получить доступ к двум независимым регистрам при выполнении одной команды.
Рисунок 1 – Устройство отладочной платы ATTINY2313
Источники тактовой частоты
Для работы любого микроконтроллера его необходимо обеспечить стабильным источником тактовых импульсов. Для микроконтроллеров фирмы Atmel возможно несколько вариантов.
Воспользоваться внутренним генератором на RC-цепочке;
В качестве источника тактовых импульсов может выступать внешний кварцевый резонатор (или керамический). Максимальная поддерживаемая частота – 16 МГц (помним, что энергопотребление микроконтроллера возрастает с увеличением рабочей частоты, причём значительно). Для подключения внешнего кварцевого резонатора используются специальные выводы – XTAL1 и XTAL2, также для подключения необходимо использовать дополнительные конденсаторы емкостью в 15 – 30 пФ, в зависимости от частоты. Пример подключения кварцевого резонатора приведен на рис. 2.
Рисунок 2 – Схемы тактирования микроконтроллера
Вариант, нетребовательный к точности задаваемой системной частоты – воспользоваться вместо резонатора обычной RC-цепочкой, при этом для её подключения используются те же самые выводы, что и в предыдущем случае.
Емкость конденсатора RC-цепочки должна быть не ниже 22пФ. Также, с помощью фьюз-бита CKOPT мы можем подключить между выводом XTAL1 и землёй внутренний конденсатор емкостью 36 пФ, что позволяет избавиться от внешнего конденсатора.
Последний вариант – использование внешнего генератора: подключаем выход генератора к выводу XTAL1. Подобный способ тактирования микроконтроллера обеспечивает максимальную точность, единственный недостаток – подобные генераторы имеют достаточно высокую стоимость.
С помощью такого кварца можно с высокой точностью отсчитывать секундные интервалы. Для подключения часового кварца используются отдельные выводы TOSC1 и TOSC2, причём использование дополнительных внешних конденсаторов не требуется (рис. 3).
Рисунок 3 – Альтернативные схемы тактирования микроконтроллера
Управляющие регистры таймера
Основными управляющими регистрами являются регистры TCCRxn (Timer/Counter Control Register, для микроконтроллера AtTiny2313 предусмотрено три управляющих регистра – TCCR0A, TCCR0B и TCCR0C, которые определяет режим работы таймера и значение коэффициента предделителя.
Значение предделителя можно изменить в регистре TCCR1B, за него отвечают три бита: CS12:CS11:CS10 (Clock Select), которые как раз и определяют коэффициент деления тактовых импульсов микроконтроллера.
Рисунок 4 – регистр TCCR1B
Режим работы таймера T1 определяется состоянием четырех битов WGM10…WGM13, которые находятся в двух разных управляющих регистрах TCCR1A и TCCR1B
Рисунок 5 – регистры TCCR1A и TCCR1B
Режим Normal. Это наиболее простой режим работы таймеров, он же единственный режим в младших моделях семейства. В этом режиме счетный регистр функционирует как обычный суммирующий счетчик. По каждому импульсу тактового сигнала осуществляется инкремент счетного регистра. При переходе через значение $FF возникает переполнение, и счет продолжается со значения $00. В том же такте сигнала, в котором обнуляется регистр TCNTn, устанавливается в «1» флаг переполнения счетного регистра TOVn (Timer Overflow).
Прерывания таймера
За прерывания от таймеров отвечают регистры TIMSK (Timer/Counter Interrupt Mask) и TIFR (Timer/Counter Interrupt Flag Register).
TIMSK – это регистр масок, биты, находящиеся в нем, локально разрешают прерывания. Если бит установлен, значит конкретное прерывание разрешено. Если бит сброшен в ноль, значит данное прерывание запрещено. По умолчанию после системного сброса все биты регистра TIMSK сброшены в ноль.
Рисунок 6 – регистр TIMSK
Наиболее интересующее нас на данный момент прерывание – TOIE1, т. е. прерывание по переполнению таймера. Задавая коэффициент предделителя таймера и используя данное прерывание, мы можем с достаточно большой точностью отсчитывать необходимые нам временные интервалы.
ОБРАБОТКА РЕЗУЛЬТАТОВ МОДЕЛИРОВАНИЯ
Таймер T1 (Assembler)
.ORG 0x0000 // Начало таблицы прерываний
RJMP RESET
.ORG 0x0005 // Адрес прерывания по переполнению
RJMP TIM1_OVF
.ORG INT_VECTORS_SIZE
// Обработка прерываний
TIM1_OVF: //Прерывание по переполнению таймера T1
LDI R17, 0b00100000
SBIC PINB,5
LDI R17, 0b00000000
OUT PORTB, R17
RETI // Выход из прерывания
RESET:
// Инициализация периферии
LDI R17,0b10000000
OUT TIMSK,R17 // разрешаем прерывания
LDI R17, 0b00000011 // Cостояние предделителя (64)
OUT TCCR1B,R17
LDI R18,0b00100000 // Работа на выход B5
OUT DDRB, R18
OUT PORTB, R18 // изначально диод выключен
SEI // Глобальное разрешение прерываний
MAIN:
RJMP MAIN
Таймер T0 (Assembler)
// Вектора прерываний
.ORG 0x0000 // Начало таблицы прерываний
RJMP RESET
.ORG 0x0006 // Адрес прерывания по переполнению
RJMP TIM0_OVF
.ORG INT_VECTORS_SIZE
// Обработка прерываний
TIM0_OVF: //Прерывание по переполнению таймера T0
LDI R17, 0b00100000
SBIC PinB,5
LDI R17, 0b00000000
OUT PORTB, R17
RETI // Выход из прерывания
RESET:
// Инициализация периферии
LDI R17,0b00000010
OUT TIMSK,R17 // разрешаем прерывания
LDI R17, 0b00000101 // Состояние предделителя (1024)
OUT TCCR0B,R17
LDI R18,0b00100000 // Работа на выход B5
OUT DDRB, R18
OUT PORTB, R18 // изначально диод выключен
SEI // Глобальное разрешение прерываний
MAIN:
RJMP MAIN
Рисунок 7 – Первые полсекунды LED-BIRY горит
Рисунок 8 – Вторые полсекунды LED-BIRY погашен
Таймер T1 (на языке C)
#include <avr/io.h>
#include <avr/interrupt.h>
int z = 1;
ISR(TIMER1_OVF_vect)
{
if (z == 1) {
PORTB = 0b00000001;
z = 0;
} else {
PORTB = 0b00000000;
z = 1;
}
}
int main()
{
DDRB = 0b00000001; // настраиваем PВ0 на выход
TCCR1B = 0b00000010; // настраиваем делитель
TIMSK = 0b10000000;
TCNT1 = 0;
SREG = 0b10000000; // выставляем бит общего разрешения прерываний
while(1); // вечный цикл
}
Таймер T0 (на языке C)
#include <avr/io.h>
#include <avr/interrupt.h>
int z = 1;
ISR(TIMER0_OVF_vect)
{
if (z == 1) {
PORTB = 0b00000001;
z = 0;
} else {
PORTB = 0b00000000;
z = 1;
}
}
int main()
{
DDRB = 0b00000001;
TCCR0B = 0b00000101;
TIMSK = 0b00000010;
SREG = 0b10000000;
while(1);
}
ВЫВОД
В результате проделанной работы удалось написать работающий код в Atmel Studio для микроконтроллера AtTiny2313, а также схему, из микроконтроллера и мигающего светодиода, построенную в Proteus.
В ходе лабораторной работы были использованы встроенные в микроконтроллер 8-ми битные и 16-ти битные таймеры. Удалось ознакомится с особенностями данных таймеров и их прерываний. Были определены необходимые значения предделителей для каждого таймера, с учетом частоты работы микроконтроллера и счетных регистров.