МИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра БТС
ИДЗ №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:
ldi r17, 0b00000001
sbic PINB, 0
ldi r17, 0b00000000
out PORTB, r17
reti
reset:
ldi r17, 0b10000000
out TIMSK, r17
ldi r17, 0b00000001
out TCCR1B, r17
ldi r18, 0b00000001
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:
ldi r17, 0b00000001
sbic PINB, 0
ldi r17, 0b00000000
out PORTB, r17
reti
reset:
ldi r17, 0b00000010
out TIMSK, r17
ldi r17, 0b00000100
out TCCR0B, r17
ldi r18, 0b00000001
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;
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-ти битные таймеры. Удалось ознакомится с особенностями данных таймеров и их прерываний. Были определены необходимые значения предделителей для каждого таймера, с учетом частоты работы микроконтроллера и счетных регистров.