
- •Пмк дз Общие требования
- •Решение.
- •Решение.
- •Решение.
- •Решение.
- •Решение.
- •Решение.
- •Решение.
- •Решение.
- •Решение.
- •Пример выполнения задания
- •Решение.
- •Пример выполнения задания
- •Решение.
- •Пример выполнения задания
- •Решение.
- •Пример выполнения задания
- •Решение.
- •Пример выполнения задания
- •Решение.
- •Пример выполнения задания
- •Решение.
Решение.
.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 в подпрограмме обработки прерывания по его переполнению.
Режим работы TC0 - c коэффициентом деления 64.
Записать в счетный регистр TC0 число $5F через регистр r16.
Прочитать содержимое счетного регистра ТС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
ПМК ДЗ №5
Написать программу генерации прямоугольных импульсов c частотой следования 300 Гц, с вывода PORTA3, при частоте кварцевого резонатора 1 МГц. Использовать прерывание по переполнению ТС0 Для расчетов использовать программу AndyRate.exe (в программе задаем 600 Гц).