ЦМПУ / Новая папка / Лаб9ЦМПУ
.docxЛабораторная работа №9 «Изучение принципа работы таймеров/счетчиков микроконтроллера»
Цель работы: Ознакомиться с принципом работы и функциями таймеров/счетчиков микроконтроллера ATmega128. Ознакомиться с принципом подключения клавиатуры к микроконтроллеру.
Порядок выполнения лабораторной работы на симуляторе
-
Запустить симулятор VMLAB 3.12.
-
Создать новый проект с именем “Project9.prj”.
-
В окно кодов ввести листинг программы №9.
-
В окно файла проекта ввести листинг проектного файла №9.
-
Запустить программу на ассемблирование командой Project/Build (F9).
-
Выполнить программу в автоматическом режиме командой Go/Continue (F5) из меню Run.
-
Открыть панель управления через View/Control Panel (Alt+Shift+C).
-
Нажать одну из клавиш “0”, “1”, “2”, “4”, “5”, “6”, “8”, “9”, “A”, “D”, а затем клавишу ввода “E”.
-
В окне осциллографа (View/Scope (Alt+Shift+S)) пронаблюдать изменение сигналов во времени. Измерить частоту сигнала на выводе PD4 и длительность ШИМ-сигнала на – PB5 Сравнить полученное значение с табличным (см. таблицу 9.18).
-
Открыть окно периферийных устройств через меню View/Peripherals (Alt+Shift+L) и пронаблюдать за изменением значений счетных регистров таймеров Timer0 и Timer1.
-
Сбросить МК клавишей “С”.
12. Повторить пункты 5−8.
13. В соответствии с вариантом выполнить самостоятельное задание (см. таблицу 9.20).
14. Для сохранения проекта выполнить команду File/Save all.
15. Для выхода из среды разработки VMLAB 3.12 выполнить команды File/Exit (Alt+F4).
на эмуляторе
-
Отладить предложенную программу (см. листинг программы №9). Получить машинный код программы в файле Project9.hex.
-
Кабелем подключения соединить эмулятор с разъемом LPT компьютера.
-
Включить сетевой тумблер на эмуляторе.
-
Запустить программатор Pony Prog.
-
Произвести калибровку устройства через меню Установки/Калибровка.
-
Настроить интерфейс в меню Установки/Настройки.
-
Выбрать тип МК ATmega128 через Устройство/AVRmicro/ATmega128.
-
Стереть содержимое МК через меню Команды/Стереть.
-
Выбрать через меню Файл/Открыть файл программы (FLASH) оттранслированную программу Project.hex.
-
Записать программу через меню Команды/Записать программу (FLASH).
-
Выйти из Pony Prog (Файл/Выход).
-
Сбросить МК в начальное состояния клавишей “Сброс”.
-
Задать параметры выходных сигналов нажатием одной из цифровой клавиши. Для окончания ввода нажать клавишу “Ввод”.
-
Соединить осциллограф клеммой “Земля” с контактом 3 (“Земля”) разъема X3 эмулятора, а другую клемму − с контактом 1 того же разъема. Пронаблюдать и измерить частоту сигнала. Сравнить полученное значение с табличным (см. таблицу ).
-
Клемму “Земля” соединить с тем же контактом 3 разъема X3, а другую клемму − с контактом 2. Пронаблюдать и измерить длительность сигнала. Сравнить полученное значение с табличным (см. таблицу ).
-
Повторить пункты 12−15.
-
В соответствии с вариантом выполнить самостоятельное задание (см. таблицу 9.20).
Листинг программы №9
; BASIC .ASM template file for AVR
; ******************************************************
; Define here the variables
;
.include "C:\VMLAB\include\m128def.inc""; определение библиотеки МК ;ATmega128, при условии расположения программы VMLAB на ;локальном диске С
.def scancode=r16
.def schscan=r17
.def schopr=r18
.def code=r19
.def keycode=r20
.def temp=r21
.def frec=r22
.def dlit=r23
.def zader=r24
.def zader1=r25
;Основная программа
;Определение таблицы переходов
.ORG $0 ;Начало таблицы переходов
reset: ; начальная метка
rjmp Start ;Переход на метку Start основной программы
reti ; Addr $01
reti ; Addr $02
reti ; Addr $03 Вектора прерываний МК ATmega128.
reti ; Addr $04 Приведены вектора с адреса $01 по адрес $10.
reti ; Addr $05 Полностью вектора прерываний представлены
reti ; Addr $06 в приложении с назначением прерываний
reti ; Addr $07 (внешних и внутренних).
reti ; Addr $08
reti ; Addr $09
reti ; Addr $0A
reti ; Addr $0B
reti ; Addr $0C
reti ; Addr $0D
reti ; Addr $0E
reti ; Addr $0F
reti ; Addr $10
.ORG $20 ;Вектор прерывания при переполнении таймера T0
rjmp IntT0
.ORG $22 ;Начальный адрес основной пpогpаммы
Start:
ldi temp,high(RAMEND) ; Установка указателя стека в конце ОЗУ out SPH,temp
ldi temp,low(RAMEND) ; Установка указателя стека в конце ОЗУ out SPL,temp
rcall Scan ;Вызвать процедуру работы с клавиатурой
Frec: out TCNT0,frec ;Установить заданную частоту сигнала
ldi temp,$4 ;Запустить таймер T0, fck/64
out TCCR0,temp ;Задание значения $4 в регистр управления таймером Т0
out OCR1AL,dlit ;Установить заданную длительность сигнала ldi temp,$81 ;Настроить таймер T1, PWM 8 бит
out TCCR1A,temp ;Задание значения $81 в регистр А управления таймером Т1
ldi temp,$1 ;Запустить таймеp T1, fck/1
out TCCR1B,temp ;Задание значения $1 в регистр В управления таймером Т1
ldi temp,$1 ;Разрешить прерывания от таймера Т0
out TIMSK,temp
ldi temp,$F0 ;Конфигурирование линии PB5 на вывод
out DDRB,temp ;Задание значения $20 в регистр направления данных порта В sei ;Разрешить все пpеpывания
ldi temp,$10 ;Конфигурирование линий PD4 на вывод
out DDRD,temp ;Задание значения $10 в регистр направления данных порта D sei ;Разрешить все пpеpывания
Work:
rjmp Work ;Рабочий цикл пpогpаммы, ничего не делаем
;Процедура cканирования клавиатуры
Scan: clr scancode ;Сброс scancode
ldi temp,$0F ;Конфигурирование 4-х выводов порта E на вывод
out ddre,temp ;и 4-х выводов на ввод
Stklav: sec ;Установить флаг переноса
ldi temp,$1 ;Назначить кл. S1 число 1
ldi schscan,$44 ;Загрузка счетчика сканирования
ldi code,$FE ;Загрузка исходного байта сканирования
Schs: out porte,code ;Вывод байта сканирования в порт E
rol code ;Сдвиг байта сканирования
in keycode,pine ;Ввод байта сканирования
swap keycode ;Поменять местами 4-е разряда байта возврата
ldi schopr,$3 ;Загрузка счетчика опросов
Scho: ror keycode ;Сдвиг байта возврата
brcc Oprkl ;Выход из прочедуры при обнаружении нажатой ;клав.
If0: inc temp ;Инкремент scancode
dec schopr ;Уменьшить счетчик опросов
brne Scho ;Если schopr=0, то перейти на метку Sсho
dec schscan ;Уменьшить счетчик сканирований
brne Schs ;Если schscan=0, то перейти на метку Sсhs
rjmp Stklav ;иначе перейти на метку Klav
Oprkl: cpi temp,$C ;При обнаружении нажатой кл. "Ввод"
breq Delay ;перейти на процедуру устранения дребезга контактов
mov scancode,temp ;иначе сохранить значение нажатой кл.в ;scancode
rjmp If0 ;и продолжить сканирование клавиатуры
;Процедура устранения дребезга контактов клавиш
;Задержка около 10 мс
Delay: clr zader
ldi zader1,$96
Delay1: dec zader
brne Delay1
dec zader1
brne Delay1
;Процедура задания сигналам частоты и длительности
Setkl: cpi scancode,$0 ;Если нажата только кл. "Ввод", то
breq If0 ;снова сканировать клавиатуру
cpi scancode,$1
ldi frec,$D9 ;Задать частоту сигнала 800 Гц
ldi dlit,$18 ;и длительность импульса ШИМ-сигнала 12 мкс breq Endkl
cpi scancode,$2
ldi frec,$ED ;Задать частоту сигнала 1600 Гц
ldi dlit,$30 ;и длительность импульса ШИМ-сигнала 24 мкс breq Endkl
cpi scancode,$3
ldi frec,$F3 ;Задать частоту сигнала 2400 Гц
ldi dlit,$48 ;и длительность импульса ШИМ-сигнала 36 мкс
breq Endkl
cpi scancode,$4
ldi frec,$F7 ;Задать частоту сигнала 3200 Гц
ldi dlit,$60 ;и длительность импульса ШИМ-сигнала 48 мкс
breq Endkl
cpi scancode,$5
ldi frec,$F9 ;Задать частоту сигнала 4000 Гц
ldi dlit,$78 ;и длительность импульса ШИМ-сигнала 60 мкс
breq Endkl
cpi scancode,$6
ldi frec,$FA ;Задать частоту сигнала 4800 Гц
ldi dlit,$90 ;и длительность импульса ШИМ-сигнала 72 мкс
breq Endkl
cpi scancode,$7
ldi frec,$FB ;Задать частоту сигнала 5600 Гц
ldi dlit,$A8 ;и длительность импульса ШИМ-сигнала 84 мкс
breq Endkl
cpi scancode,$8
ldi frec,$FC ;Задать частоту сигнала 6400 Гц
ldi dlit,$C0 ;и длительность импульса ШИМ-сигнала 96 мкс
breq Endkl
cpi scancode,$9
ldi frec,$FD ;Задать частоту сигнала 7200 Гц
ldi dlit,$D8 ;и длительность импульса ШИМ-сигнала 108 мкс
breq Endkl
ldi frec,$FE ;Задать частоту сигнала 8000 Гц
ldi dlit,$F0 ;и длительность импульса ШИМ-сигнала 120 мкс
Endkl: ret
;Пpоцедуpа пpеpывания по пеpеполнению таймеpа T0
IntT0: push temp ;Сохранить temp в стеке
out TCNT0,frec ;Пеpезагpузить таймер Т0
in temp,SREG ;Сохранить SREG
sbis pind,4 ;Если на PD4 был "0", то установить "1"
rjmp Ust1 ;и наоборот
cbi portd,4
rjmp EndT0
Ust1: sbi portd,4
EndT0: out SREG,temp ;Восстановление SREG
pop temp ;Выгрузить данные из стека
reti ;Выйти из процедуры
Рис. 9.15 Процедура задания сигналам частоты и длительности