Advertisement
Guest User

Untitled

a guest
Jun 16th, 2019
284
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;ЗАДАЧА: Запрограммировать работу таймера микроконтроллера AVR для формирования на линии порта выходного сигнала длительностью 50мкс через 1с после запуска таймера.
  2. ;Частота работы МК = 4МГц
  3.  
  4. ;При частоте работы 4Мгц "тик" таймера будет происходить каждые 0.25мкс. Используем самый большой предделитель частоты (на 1024)
  5. ;При использовании предделителя на 1024, цикл таймера будет происходить каждые 0.26мс => нам необходимо (1000мс/0.26мс)=3846 тиков.
  6. ;Используем таймер Т1 так как он имеет 16-бит режим работы.
  7.  
  8. .include "m8515def.inc"
  9.  
  10. .def temp = r25
  11. .org $000
  12.     rjmp INIT
  13.  
  14. .org $006
  15.     rjmp T_OVF
  16.  
  17. INIT:
  18.     ;Настраиваем стек
  19.     ldi temp,low(RAMEND)
  20.     out SPL,temp
  21.     ldi temp,high(RAMEND)
  22.     out SPH,temp
  23.    
  24.     ;Включение прерываний
  25.     sei
  26.     ser temp
  27.     out TIMSK, temp
  28.  
  29.     ;Настройка порта B (0й пин на вывод)
  30.     ldi temp,   0b00000001
  31.     out DDRB,   temp
  32.  
  33.     ;Вывод 0 на порт
  34.     clr temp
  35.     out PORTB, temp
  36.  
  37.     ;Устанавливаем режим деления частоты на 1024
  38.     ldi temp,   0b00000101
  39.     out TCCR1B, temp
  40.  
  41.     ;Режим ШИМ выключен, таймер отключен от OC1x (x = a,b)
  42.     ldi temp,   0b00000000
  43.     out TCCR1A, temp
  44.  
  45.     ;Загрузили значение в регистр счетчика
  46.     ldi r19, HIGH(-3846)
  47.     ldi r20, LOW(-3846)
  48.     out TCNT1H, r19
  49.     out TCNT1L, r20
  50.     loop: rjmp loop
  51.    
  52.      
  53.  
  54. T_OVF:
  55.     ;Выводим на порт единицу
  56.     ser temp
  57.     out PORTB,  temp
  58.     ;Ждем
  59.     rcall delay
  60.     ;Сбрасываем порт в ноль
  61.     clr temp
  62.     out PORTB, temp
  63.     reti
  64.  
  65. ;Необходима задержка в 50мкс. 1 команда при частоте в 4МГц выполняется за 0.25мкс => необходимо 50*4=200 команд.
  66. ;Формула для рассчета кол-ва команд в цикле с тремя переменными: 3x(y*(z+1)+1). Из этого получаем: x=1, y=2, z=32 для 201 команды
  67. delay:
  68.     ldi r16, 1
  69. d0: ldi r17, 2
  70. d1: ldi r18, 32
  71. d2: dec r18
  72.     brne d2
  73.     dec r17
  74.     brne d1
  75.     dec r16
  76.     brne d0
  77.     ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement