Created
April 23, 2022 10:12
-
-
Save nikto-b/124592b0d28d32f8d187eae683517470 to your computer and use it in GitHub Desktop.
LR3
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.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