Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПМК ДЗ 2012 примеры.doc
Скачиваний:
2
Добавлен:
17.08.2019
Размер:
202.24 Кб
Скачать

Решение.

.include "8535def.inc"

;----------------- Инициализация векторов прерывания ---------------------

.org 0

rjmp Start ;Перепрыгиваем таблицу векторов прерываний

.org INT0addr ;Отступаем INT0addr байт от начала FLASH

rjmp INT0addrSUB ; и записываем вектор прерывания от INT0

.org INT1addr ;Отступаем INT1addr байт от начала FLASH

rjmp INT1addrSUB ; и записываем вектор прерывания от INT1

;-------------------- Глобальное запрещение прерываний -------------------

Start:

cli

;--------------------- Установка указателя стека -------------------------

ldi R16, low(ramend) ;Загружаем в r16 младший адрес

; верхней границы SRAM

out spl, R16 ;И записываем его в младший байт

; указателя стека

ldi R16, high(ramend) ;То же, но для старшего байта

out sph, R16 ;

;---------------- Разрешение режима энергосбережения ---------------------

;----------------- и прерываний по входам INT0-INT1 ----------------------

ldi r16, 0b11000000 ;Разрешаем прерывания по INT1 и INT0

out GIMSK, r16 ;

ldi r16, 0b01001110 ;Разрешаем режим Idle, и задаем условия

out MCUCR, r16 ; возникновения прерываний по INT1 и INT0

;----------------- Разрешение прерываний ---------------------------------

sei

;========================= Основная программа ============================

sleep ;Включаем режим пониженного энергопотребления

m1: nop

rjmp m1

;============================ Подпрограммы ===============================

;------------------ Обработки прерывания по входу INT0 -------------------

INT0addrSUB:

nop ;Подпрограмма ничего не делает

reti

;------------------ Обработки прерывания по входу INT1 -------------------

INT1addrSUB:

nop ;Подпрограмма ничего не делает

reti

ПМК ДЗ №4

Написать программу чтения и записи счетных регистров таймера-счетчика ТС0 в подпрограмме обработки прерывания по его переполнению.

  1. Режим работы TC0 - c коэффициентом деления 64.

  2. Записать в счетный регистр TC0 число $5F через регистр r16.

  3. Прочитать содержимое счетного регистра ТС0 в r16.

Решение.

.include "8535def.inc"

;----------------- Инициализация векторов прерываний ---------------------

.org 0

rjmp Start ;Перепрыгиваем таблицу векторов прерываний

.org OVF0addr

rjmp OVF0addrSUB

;---------------------- Запрет прерываний --------------------------------

Start:

cli

;-------------------- Установка указателя стека --------------------------

ldi R16, low(ramend) ;Загружаем в r16 младший адрес

;верхней границы RAM

out spl, R16 ;И записываем его в младший байт

;указателя стека

ldi R16, high(ramend) ;То же, но для старшего байта

out sph, R16 ;

;----------------- Инициализация таймера-счетчика 0 ----------------------

ldi r16, 0b00000011 ;Коэффициент деления 64

out tccr0, r16

ldi r16, 0b00000001 ;Разрешаем прерыв. от переполнения TC0

out TIMSK, r16

;-------------------- Разрешение прерываний ------------------------------

sei

;======================= Основная программа ==============================

m1: nop ;Основная программа ничего не делает

rjmp m1

;============== Подпрограмма обработки прерываний от ТС0 =================

OVF0addrSUB:

push r16 ;Сохраняем в стеке содержимое r16

in r16, TCNT0 ;Читаем из счетного регистра число

ldi r16, $5f ;Загружаем в r16 число $5f

out TCNT0,r16 ;и записываем его в счетный регистр

pop r16 ;Извлекаем из стека содержимое r16

reti

  1. ПМК ДЗ №5

Написать программу генерации прямоугольных импульсов c частотой следования 300 Гц, с вывода PORTA3, при частоте кварцевого резонатора 1 МГц. Использовать прерывание по переполнению ТС0 Для расчетов использовать программу AndyRate.exe (в программе задаем 600 Гц).