Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное
учреждение высшего профессионального образования
«Комсомольский-на-Амуре государственный
технический университет»
Электротехнический факультет
Кафедра «Промышленная электроника»
О Т Ч Е Т
по лабораторной работе № 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, а также реализовали программу счетчика с использованием прерываний.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.