Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;ЗАДАЧА: Запрограммировать работу таймера микроконтроллера AVR для формирования на линии порта выходного сигнала длительностью 50мкс через 1с после запуска таймера.
- ;Частота работы МК = 4МГц
- ;При частоте работы 4Мгц "тик" таймера будет происходить каждые 0.25мкс. Используем самый большой предделитель частоты (на 1024)
- ;При использовании предделителя на 1024, цикл таймера будет происходить каждые 0.26мс => нам необходимо (1000мс/0.26мс)=3846 тиков.
- ;Используем таймер Т1 так как он имеет 16-бит режим работы.
- .include "m8515def.inc"
- .def temp = r25
- .org $000
- rjmp INIT
- .org $006
- rjmp T_OVF
- INIT:
- ;Настраиваем стек
- ldi temp,low(RAMEND)
- out SPL,temp
- ldi temp,high(RAMEND)
- out SPH,temp
- ;Включение прерываний
- sei
- ser temp
- out TIMSK, temp
- ;Настройка порта B (0й пин на вывод)
- ldi temp, 0b00000001
- out DDRB, temp
- ;Вывод 0 на порт
- clr temp
- out PORTB, temp
- ;Устанавливаем режим деления частоты на 1024
- ldi temp, 0b00000101
- out TCCR1B, temp
- ;Режим ШИМ выключен, таймер отключен от OC1x (x = a,b)
- ldi temp, 0b00000000
- out TCCR1A, temp
- ;Загрузили значение в регистр счетчика
- ldi r19, HIGH(-3846)
- ldi r20, LOW(-3846)
- out TCNT1H, r19
- out TCNT1L, r20
- loop: rjmp loop
- T_OVF:
- ;Выводим на порт единицу
- ser temp
- out PORTB, temp
- ;Ждем
- rcall delay
- ;Сбрасываем порт в ноль
- clr temp
- out PORTB, temp
- reti
- ;Необходима задержка в 50мкс. 1 команда при частоте в 4МГц выполняется за 0.25мкс => необходимо 50*4=200 команд.
- ;Формула для рассчета кол-ва команд в цикле с тремя переменными: 3x(y*(z+1)+1). Из этого получаем: x=1, y=2, z=32 для 201 команды
- delay:
- ldi r16, 1
- d0: ldi r17, 2
- d1: ldi r18, 32
- d2: dec r18
- brne d2
- dec r17
- brne d1
- dec r16
- brne d0
- ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement