Написание программы счетчика с использованием прерываний

Страницы работы

Содержание работы

Министерство образования и науки Российской Федерации

Федеральное государственное бюджетное образовательное

учреждение высшего профессионального образования

«Комсомольский-на-Амуре государственный

технический университет»

Электротехнический факультет

Кафедра «Промышленная электроника»

О Т Ч Е Т

по лабораторной работе № 2

по дисциплине «МиЭвМУ»

Счетчик

Студенты группы 0БМб-1                                                     Ю.Д. Попова

М.М. Кононова

                                                                                          Е.С. Конюхова

Преподаватель                                                                         С.В. Назаренко

Цель работы: Познакомится с прерываниями и со счетчиком в микроконтроллере AVR. Написать программу счетчика с использованием прерываний.

1. Теоретические сведения

Для грамотной организации задержки в микроконтроллере существуют счетчики. В рассматриваемой нами задачи будем использовать МК модели 2313. В нем два таймера: 8- и 16-разрядный, второй удобнее для отсчетов длительных интервалов времени. Но мы для простоты выберем 8-разрядный Timer0, что будет универсальным решением абсолютно для всех моделей МК AVR.

Интервал времени мы будем отсчитывать по переполнению этого таймера, которое наступает каждые 256 импульсов счета. Если мы станем считать эти события с помощью одного регистра, то таких событий можем также насчитать максимум 256. Тогда максимальный интервал времени, который мы сможем получить, определяется по формуле:

256*256/Tc

где Tc – частота импульсов на входе таймера в герцах, определяемая предделителем  в долях от тактовой.

Если мы хотим задавать интервалы в порядке 1с, то эта частота должна быть около 65 кГц, таким образом, при тактовой частоте МК 4 МГц коэффициент деления может составлять 64 (точная частота на входе таймера – 62500, максимальный отмеряемый  интервал при указанных условиях составит 1,05с).

Задавать интервал мы сможем   долями 1/256 от указанного максимального (задавая значение счетного регистра), т.е. приращениями приблизительно по 4 мс.

Приведем пример прерывания события отсчета интервала времени по переполнению таймера  Timer0. Регистр для отсчета прерывания назовем Count_timer и допустим что нам требуется отметить 0,5 с (т.е. интервал должен включать 128 циклов переполнения таймера). Сначала где то в счетном регистре загружаем нужное число командой ldi Count_timer, 128 и там же запускаем таймер:

TIM0: ; по переполнению Timer0

Dec Count_timer ; в каждом прерываний уменьшаем на 1

Breq end_timer ; если ноль, то на конец отсчета

Reti ; иначе выход из прерывания

End_timer:

……………….

<производим необходимые действия и останавливаем таймер>

………………..

Reti

Заметим, что если в самом первом цикле требуется очень точно отмерить  интервалы времени, то предварительно необходимо обнулить счетный регистр таймера (TCNT0).

Для этого создадим новый проект в AVR Studio и выберем нужный нам МК AT90S2313.

2. Ход работы

Текст нашей программы:

;Программа счета нажатий в двоичном коде

.device AT90S2313

.include "2313def.inc"

;частота 4 МГц

.def temp=r16 ;рабочая переменная

.def Count_time =r17 ;счетчикзадержки

.def Counter = r18 ;счетчик нажатий

.def Flag = r19 ;регистр флагов: если бит 0 установлен,

;то обнаружили нажатие и переходим к обнаружению отпускания

;======= прерывания ============

rjmp RESET;Reset Handle

rjmp INT0_ ;External InterruptO Vector Address

reti ;External Interruptl Vector Address

reti ;Timerl capture Interrupt Vector Address

reti ;Timerl compare Interrupt Vector Address     

reti ;Timerl Overflow Interrupt Vector Address

rjmp TIM0_ ;TimerO Overflow Interrupt Vector Address

reti ;UART Receive Complete Interrupt Vector Address

reti ;UART Data.Register Empty Interrupt Vector Address

reti ;UART Transmit Complete Interrupt Vector Address

reti ;Analog Comparator Interrupt Vector Address

;========== программа ============

INT0_:  ;внешнее прерывание по кнопке

;первым делом запрещаем прерывания от кнопки

clr temp

out GIMSK, temp

;на всякий случай очищаем регистр флагов прерываний

 ldi temp,$FF

out GIFR,temp ;GIFR очищается записью единиц

sbrs Flag,0 ;проверяем бит 0 нашего регистра флагов

rjmp Push_pin ;если 0, то было нажатие

cbr Flag,1 ;иначе было отпускание, очищаем бит 0

inc Counter ;кн. была отпущена, увеличиваем счетчик

out PORTB,Counter ;выводим счетчик в порт В

ldi Count_time, 50  ;интервал 0,2 с

rjmp ent_int  ;нa выход

Push_pin:  ; было нажатие

Sbr Flag,1; установка бита 0

ldi Count_time,128 ;интервал 0,5 с

ent_int:

ldi temp,0b00000011;  запуск Timer0 входная частота 1:64

out TCCR0,temp

reti ;конец обработки прерывания кнопки

TIM0_:   ;обработчик прерьшания Timer0

dec Count_time ;в каждом прерывании уменьшаем на 1

breq end_timer ;если ноль, то на конец отсчета

reti ;иначе выход из прерывания

end_timer:

clr    temp ;останавливаем таймер

out TCCR0,temp

sbrc Flag,0 ;проверяем бит 0 нашего регистра флагов

rjmp Push_tim ;если 1,  то было нажатие

ldi temp,(1<<ISC01)   ;иначе устанавливаем прер.   INTO поспаду

out MCUCR,temp

rjmp end_tim ;на выход

Push_tim:  ;если было нажатие

ldi temp,(1<<ISC01|1<<ISC11)   ;устанавливаем прер.   INTO пофронту

out MCUCR,temp

end_tim:

ldi temp,(1<<INT0)   ;разрешаемпрерывание INTO

out GIMSK,temp

reti ;конец обработки прерывания таймера

RESET:  ;начальная инициализация

ldi temp,low(RAMEND)   ;загрузка указателя стека

out SPL,temp

ldi temp,0b00000100  ;для второго разряда порта D

out PORTD,temp ;подтягивающий резистор на всякий случай

ldi temp, 0b1111111  ;порт В все контакты на выход

out DDRB,temp

clr Counter ;очищаемсчетчик

clr Flag ;очищаемнашфлаг

ldi temp, (1<<TOIE0)   ;разр. прерывания TimerO

out TIMSK,temp

ldi temp,(1<<ISC01)   ;устанавливаемпрер. INTO поспаду

out MCUCR,temp

ldi temp, (1<<INT0)   ;разрешаем прерывание INTO

out GIMSK, temp

sei ; разрешаем прерывания

Gcykle: ;основной пустой цикл

Rjmp GcykleЗатем в появившемся окне программы приступим к написания программы.

Рисунок 1 – Набранная программа в AVR Studio

Рисунок 2 – Набранная программа в AVR Studio (продолжение)

Компилируем программу и видим, что ошибок нет. После компиляции проекта собираем схему в программе Proteus (рисунок 3).

Рисунок 3 – Схема установки в программе Proteus

Программа считает количество нажатий на кнопку и показывает результат в двоичном коде на LED. Ниже показана работы программы (рисунок 4).

Рисунок 4 – Работа программы

Вывод: выполнив данную лабораторную работу, мы познакомились с прерываниями и счетчиками в программном обеспечении AVR Studio, а также реализовали программу счетчика с использованием прерываний.

Похожие материалы

Информация о работе