Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаба 2 / Лаба_2

.pdf
Скачиваний:
7
Добавлен:
08.04.2022
Размер:
413.19 Кб
Скачать

МИНОБРНАУКИ РОССИИ САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ «ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА) Кафедра БТС

ИДЗ №2 по дисциплине «Микропроцессорные системы»

Тема: Программирование таймера

Студент гр. 7501

 

Исаков А.О.

Преподаватель

 

Анисимов А.А.

 

 

 

 

 

Санкт-Петербург

2020

Цель работы: запрограммировать задержки для мигания светодиодом

на языках С и Assembler.

Используемые инструменты: Отладочная плата ATTINY2313,

интегрированная среда разработки AVR Atmel Studio 7.

Основные теоретические положения

1) Устройство отладочной платы ATTINY2313

ATtiny2313 низкопотребляющий 8 битный КМОП микроконтроллер с

AVR RISC архитектурой.

AVR ядро объединяет богатую систему команд и 32 рабочих регистра общего назначения. Все 32 регистра непосредственно связаны с арифметико-

логическим устройством (АЛУ), что позволяет получить доступ к двум независимым регистрам при выполнении одной команды.

Рисунок 1 – Устройство отладочной платы ATTINY2313

2) Источники тактовой частоты

Для работы любого микроконтроллера его необходимо обеспечить стабильным источником тактовых импульсов. Для микроконтроллеров фирмы

Atmel возможно несколько вариантов.

Воспользоваться внутренним генератором на RC-цепочке;

В качестве источника тактовых импульсов может выступать внешний

кварцевый резонатор (или керамический). Максимальная поддерживаемая

2

частота – 16 МГц (помним, что энергопотребление микроконтроллера возрастает с увеличением рабочей частоты, причём значительно). Для подключения внешнего кварцевого резонатора используются специальные выводы – XTAL1 и XTAL2, также для подключения необходимо использовать дополнительные конденсаторы емкостью в 15 – 30 пФ, в

зависимости от частоты. Пример подключения кварцевого резонатора приведен на рис. 2.

Рисунок 2 – Схемы тактирования микроконтроллера

Вариант, нетребовательный к точности задаваемой системной частоты – воспользоваться вместо резонатора обычной RC-цепочкой, при этом для её подключения используются те же самые выводы, что и в предыдущем случае.

Емкость конденсатора RC-цепочки должна быть не ниже 22пФ. Также, с

помощью фьюз-бита CKOPT мы можем подключить между выводом

XTAL1 и землёй внутренний конденсатор емкостью 36 пФ, что позволяет избавиться от внешнего конденсатора.

Последний вариант – использование внешнего генератора: подключаем выход генератора к выводу XTAL1. Подобный способ тактирования микроконтроллера обеспечивает максимальную точность, единственный недостаток – подобные генераторы имеют достаточно высокую стоимость.

С помощью такого кварца можно с высокой точностью отсчитывать секундные интервалы. Для подключения часового кварца используются

3

отдельные выводы TOSC1 и TOSC2, причём использование дополнительных внешних конденсаторов не требуется (рис. 3).

Рисунок 3 – Альтернативные схемы тактирования микроконтроллера

3) Управляющие регистры таймера

Основными управляющими регистрами являются регистры TCCRxn

(Timer/Counter Control Register, для микроконтроллера AtTiny2313

предусмотрено три управляющих регистра – TCCR0A, TCCR0B и TCCR0C,

которые определяет режим работы таймера и значение коэффициента предделителя.

Значение предделителя можно изменить в регистре TCCR1B, за него отвечают три бита: CS12:CS11:CS10 (Clock Select), которые как раз и определяют коэффициент деления тактовых импульсов микроконтроллера.

Рисунок 4 – регистр TCCR1B

Режим работы таймера T1 определяется состоянием четырех битов

WGM10WGM13, которые находятся в двух разных управляющих

регистрах TCCR1A и TCCR1B

Рисунок 5 – регистры TCCR1A и TCCR1B 4

Режим Normal. Это наиболее простой режим работы таймеров, он же единственный режим в младших моделях семейства. В этом режиме счетный регистр функционирует как обычный суммирующий счетчик. По каждому импульсу тактового сигнала осуществляется инкремент счетного регистра.

При переходе через значение $FF возникает переполнение, и счет продолжается со значения $00. В том же такте сигнала, в котором обнуляется регистр TCNTn, устанавливается в «1» флаг переполнения счетного регистра

TOVn (Timer Overflow).

4) Прерывания таймера

За прерывания от таймеров отвечают регистры TIMSK (Timer/Counter

Interrupt Mask) и TIFR (Timer/Counter Interrupt Flag Register).

TIMSK – это регистр масок, биты, находящиеся в нем, локально разрешают прерывания. Если бит установлен, значит конкретное прерывание разрешено. Если бит сброшен в ноль, значит данное прерывание запрещено.

По умолчанию после системного сброса все биты регистра TIMSK сброшены в ноль.

Рисунок 6 – регистр TIMSK

Наиболее интересующее нас на данный момент прерывание – TOIE1, т.

е. прерывание по переполнению таймера. Задавая коэффициент предделителя таймера и используя данное прерывание, мы можем с достаточно большой точностью отсчитывать необходимые нам временные интервалы.

5

ОБРАБОТКА РЕЗУЛЬТАТОВ МОДЕЛИРОВАНИЯ

Таймер 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 // Глобальное разрешение прерываний

6

MAIN:

RJMP MAIN

Рисунок 7 – Первые полсекунды LED-BIRY погашен

Рисунок 8 – Вторые полсекунды LED-BIRY горит

7

Таймер 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);

}

8

ВЫВОД

В результате проделанной работы удалось написать работающий код в

Atmel Studio для микроконтроллера AtTiny2313, а также схему, из микроконтроллера и мигающего светодиода, построенную в Proteus.

В ходе лабораторной работы были использованы встроенные в микроконтроллер 8-ми битные и 16-ти битные таймеры. Удалось ознакомится с особенностями данных таймеров и их прерываний. Были определены необходимые значения предделителей для каждого таймера, с учетом частоты работы микроконтроллера и счетных регистров.

9

Соседние файлы в папке Лаба 2