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

Лаба 2 / Лаба_2

.docx
Скачиваний:
2
Добавлен:
08.04.2022
Размер:
335.74 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра БТС

ИДЗ №2

по дисциплине «Микропроцессорные системы»

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

Студент гр. 7501

Исаков А.О.

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

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

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

2020

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

Используемые инструменты: Отладочная плата ATTINY2313, интегрированная среда разработки AVR Atmel Studio 7.

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

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

ATtiny2313  низкопотребляющий 8 битный КМОП микроконтроллер с AVR RISC архитектурой.

AVR ядро объединяет богатую систему команд и 32 рабочих регистра общего назначения. Все 32 регистра непосредственно связаны с арифметико-логическим устройством (АЛУ), что позволяет получить доступ к двум независимым регистрам при выполнении одной команды.

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

  1. Источники тактовой частоты

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

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

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

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

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

Емкость конденсатора RC-цепочки должна быть не ниже 22пФ. Также, с помощью фьюз-бита CKOPT мы можем подключить между выводом XTAL1 и землёй внутренний конденсатор емкостью 36 пФ, что позволяет избавиться от внешнего конденсатора.

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

С помощью такого кварца можно с высокой точностью отсчитывать секундные интервалы. Для подключения часового кварца используются отдельные выводы TOSC1 и TOSC2, причём использование дополнительных внешних конденсаторов не требуется (рис. 3).

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

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

Основными управляющими регистрами являются регистры TCCRxn (Timer/Counter Control Register, для микроконтроллера AtTiny2313 предусмотрено три управляющих регистра – TCCR0A, TCCR0B и TCCR0C, которые определяет режим работы таймера и значение коэффициента предделителя.

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

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

Режим работы таймера T1 определяется состоянием четырех битов WGM10WGM13, которые находятся в двух разных управляющих регистрах TCCR1A и TCCR1B

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

Режим Normal. Это наиболее простой режим работы таймеров, он же единственный режим в младших моделях семейства. В этом режиме счетный регистр функционирует как обычный суммирующий счетчик. По каждому импульсу тактового сигнала осуществляется инкремент счетного регистра. При переходе через значение $FF возникает переполнение, и счет продолжается со значения $00. В том же такте сигнала, в котором обнуляется регистр TCNTn, устанавливается в «1» флаг переполнения счетного регистра TOVn (Timer Overflow).

  1. Прерывания таймера

За прерывания от таймеров отвечают регистры 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-ти битные таймеры. Удалось ознакомится с особенностями данных таймеров и их прерываний. Были определены необходимые значения предделителей для каждого таймера, с учетом частоты работы микроконтроллера и счетных регистров.

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