Skip to content

Instantly share code, notes, and snippets.

@nikto-b
Created April 23, 2022 10:12
Show Gist options
  • Save nikto-b/124592b0d28d32f8d187eae683517470 to your computer and use it in GitHub Desktop.
Save nikto-b/124592b0d28d32f8d187eae683517470 to your computer and use it in GitHub Desktop.
LR3
.include "m32def.inc"
.org 0
; ЛР 3
; Частота смены последовательности:
; 125ms / 8Hz
; Последоавтельности:
; 11111111
; 01111110
; 01100110
; 00100100
; 00000000
; Таблица векторов прерываний
jmp reset
jmp ext_int0
jmp ext_int1
jmp ext_int2
jmp tim2_comp
jmp tim2_ovf
jmp tim1_capt
jmp tim1_compA
jmp tim1_compB
jmp tim1_ovf
jmp tim0_comp
jmp tim0_ovf
jmp spi_stc
jmp usart_RxC
jmp usart_UDRE
jmp usart_TxC
jmp a_d_c
jmp ee_rdy
jmp aha_comp
jmp t_w_i
jmp spm_rdy
reset:
cli
; Установка stack pointer`a
ldi R16, 0x04
ldi R17, 0x5F
out SPH, R16
out SPL, R17
; Настройка всего i/o порта A на вывод
ldi R16, 0xFF
out DDRA, R16
ldi R30, low(tab_LED*2)
ldi R31, high(tab_LED*2) ; Загружаем адрес начала таблицы в пару Z
mov R29, R30 ; Копируем младший байт пары в R29 поскольку в таблице меньше 5 элементов
ldi R28, 0x05 ; - Кол-во элементов в таблице
add R29, R28 ; Вычисляем конечный адрес таблицы (будут проблемы в случае переноса адреса в старший байт)
; Настройка таймера:
; Регистр сравнения:
ldi R16, 0x3D
ldi R17, 0x09
out OCR1BH, R16
out OCR1BL, R17
; Заглушаем канал A чтобы предотвратить сброс по его совпадению
; TODO: изучить почему при совпадении по A происходит сброс, а по B - нет
ldi R18, 0xFF
out OCR1AH, R18
out OCR1AL, R18
; Запускаем таймер 1 в режиме CTC с предделителем частоты 64
ldi R17, 0b00000100
ldi R16, 0b00001011
out TCCR1A, R17
out TCCR1B, R16
; Разрешаем прерывание по совпадению канала сравнения B
ldi R16, 0b00001000
out TIMSK, R16
; Очищаем флаги прерываний
ldi R16, 0x00
out TIFR, R16
sei
main:
; busywait
jmp main
tim1_compB:
; Загружаем новое значение из таблицы и увеличиваем адрес указателя на таблицу на 1
lpm R17, Z+
; Отображаем загруженное значение в i/o порт A
out PORTA, R17
; Сбрасываем счётчик таймера (тут может вылезти погрешность в 2 такта, но я её не обнаружил)
ldi R19, 0x00
out TCNT1H, R19
out TCNT1L, R19
; Копируем конечный адрес таблицы во временный регистр и сравниваем с младшим байтом адреса
mov R28, R29
cp R28, R30
brne end
; Если дошли до конечного адреса таблицы - возвращаемся на начальный адрес
ldi R30, low(tab_LED*2)
ldi R31, high(tab_LED*2)
end:
reti
; Заглушка для таблицы векторов прерываний
tim1_capt:
tim1_compA:
tim1_ovf:
ext_int0:
ext_int1:
ext_int2:
tim2_comp:
tim2_ovf:
tim0_comp:
tim0_ovf:
spi_stc:
usart_RxC:
usart_UDRE:
usart_TxC:
a_d_c:
ee_rdy:
aha_comp:
t_w_i:
spm_rdy:
reti
; Таблица последовательностей
; При изменении кол-ва элементов - сменить значение в регистре R28
tab_LED:
.db 0b11111111, 0b01111110
.db 0b01100110, 0b00100100
.db 0b00000000
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment