Программирование таймера/счетчика для работы в ШИМ режиме для выдачи импульсов на вывод PD7 (OC2) микроконтроллера

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

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

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

Российский государственный профессионально-педагогический университет

Инженерно-педагогический институт

Кафедра микропроцессорной управляющей вычислительной техники

Лабораторная работа №4

Изучение программирования таймеров-счетчиков

                                                                               Выполнили:

                                                                                   Проверил: Садовников М.Е.

Екатеринбург 2008

Цель работы:

Изучение функционирования таймеров/счетчиков микроконтроллеров АТ90S8535, получение практических навыков в их программировании.

Задача:

Запрограммировать таймер/счетчик2 для работы в ШИМ режиме для выдачи импульсов на вывод PD7 (OC2) микроконтроллера, к которому подключен звукоизлучатель HA1. При нажатии на кнопку SB1 частота ШИМ уменьшается,       а при одновременном нажатии двух кнопок SB1 и SB2 – увеличивается. Уменьшение и увеличение частоты импульсов оценивается по изменению тона звучания звукоизлучателя.

Решение задачи в общем виде:

Частота и включенность счетчика зависит от  состояния 3-х битов CS22,CS21,CS20. Частота ТС2 может изменяться  в пределах от CK/1024 до CK. Для ШИМ эти значения всегда в 510 раз меньше. Если частота МК 8МГц, то при состоянии битов CS22=0,CS21=1,CS20=0 частота ШИМ будет 8000000/8/510=1960Гц. Звук на такой частоте, наверно, можно будет услышать. Для изменения частоты звука программист должен изменять эти биты. Уменьшение и увеличение частоты организовано в виде отдельных подпрограмм.

Признаком нажатия кнопки является то, что ее предыдущее состояние было ненажатое (0 на входе), а сейчас нажатое (1 на входе). Эти состояния отслеживаются в бесконечном цикле.

Блок схема:

Листинг программы:

.include "8535def.inc"

.def freq=r16;регистр в котором хранится текущее состояние TCCR2

.def SB1last=r17;предыдущее состояние SB1 1-нажата, 0-не нажата

.def SB2last=r18;предыдущее состояние SB2 1-нажата, 0-не нажата

.cseg

;vektor reset

.org $000

rjmp start

start:;начало основной программы

;НАСТРОЙКА ПОРТОВ

cbi DDRA,1;1-й бит на вход - SB1

cbi DDRA,2;2-й бит на вход - SB2

sbi DDRD,7;7-й бит на выход - PD7(OC7)- HA1

clr SB1last;сначала кнопки не нажаты

clr SB2last;=>обнуляем

ldi freq,$80 ;значение сравнения записываем в регистр

out OCR2,freq;сравнения тайм.сч.2

;ВЫБОР ДЕЛИТЕЛЯ ЧАСТОТЫ, ВКЛЮЧЕНИЕ ШИМ

ldi freq,$74 ;соответствует частоте CK/64/1024

out TCCR2,freq;TCCR2<--freq

m1: ;ОСНОВНОЙ ЦИКЛ РАБОТЫ ПРОГРАММЫ

sbic PINA,1;пропустить следующую команду, если НЕ нажата

rjmp SB1on  ;кнопка SB1

ldi SB1last,0;сбросить признак нажатости кнопки

sbic PINA,2;пропустить следующую команду, если бит 2

rjmp SB2on1;в регистре А очищен (НЕ нажата SB2)

ldi SB2last,0;сбросить признак нажатости кнопки

rjmp m1

SB2on1:

ldi SB2last,1;установить признак нажатости кнопки

rjmp m1

SB1on: ;когда нажата кнопка SB1

sbic PINA,2;пропустить следующую команду, если НЕ нажата

rjmp SB2on2  ;кнопка SB2

cpi SB1last,0;сравнить SB1last и 0

brne ne0     ;и если не равно перейти на метку ne0

rcall DecFrq;вызов подпрограммы уменьшения частоты шим

ne0:

rjmp endif2

SB2on2:

cpi SB1last,0;сравнить SB1last и 0

brne ne01     ;и если не равно перейти на метку ne01

rcall IncFrq;вызов подпрограммы увеличения частоты шим

rjmp endif3

ne01:

cpi SB2last,0;сравнить SB2last и 0

brne endif3  ;и если не равно перейти на метку endif3

rcall IncFrq;вызов подпрограммы увеличения частоты шим

endif3:

ldi SB2last,1;загрузить 1 в SB2last

rjmp endif2

endif2:;конец проверки кнопки SB2

ldi SB1last,1;установить признак нажатости кнопки

rjmp m1

;ПОДПРОГРАММА УВЕЛИЧЕНИЯ ЧАСТОТЫ ШИМ

IncFrq:

cpi freq,$71

breq x71

dec freq;freq=freq-1

out TCCR2,freq;TCCR2<--freq

x71:

ret

;ПОДПРОГРАММА УМЕНЬШЕНИЯ ЧАСТОТЫ ШИМ

DecFrq:

cpi freq,$77

breq x77

inc freq;freq=freq+1

out TCCR2,freq;TCCR2<--freq

x77:

ret

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

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