Поправить прошивку на ассемблере для микроконтроллера AVR

Задание закрыто
Стоимость:Договорная
Срок выполнения:7 дней
Варианты оплаты:По договоренности
Дата публикации:2025-05-21 10:58
Был(а) на сайте:2025-05-26 20:59

Поправить прошивку на ассемблере для микроконтроллера AVR

 
Задача

Есть проект наручных LED-часов. После сборки и прошивки возникла проблема, что день недели отображается неверно в годах кроме +- пары лет года разработки проекта. Прошивка написана на ассемблере. Есть все исходники с комментариями. Необходимо поправить прошивку так, чтобы день недели отображался верно в любой год 21 века. Возможно потребуется помощь в компиляции прошивки.

Оставлять заявки могут только авторизованные пользователи.
;--- в самом конце вашего .text-сегмента, вместо старой DayofWeek: ---
.section .progmem_data
dow_month_tbl:
.db 0,3,2,5,0,3,5,1,4,6,2,4 ; месячные смещения для Сакамо?то

.section .text
.global DayofWeek
DayofWeek:
; Z <- &a1REG
ldi ZL, low(a1REG)
ldi ZH, high(a1REG)

; r16 <- день (1…31), r17 <- месяц (1…12), r18 <- год от 2000 (0…99)
ld r16, Z+3
ld r17, Z+4
ld r18, Z+5

; Загрузить offset = dow_month_tbl[month-1] в r19
ldi ZL, low(dow_month_tbl)
ldi ZH, high(dow_month_tbl)
dec r17 ; теперь r17 = month-1
add ZL, r17
adc ZH, r1 ; r1 должен быть обнулён (или используйте clr r0 перед этим)
lpm r19

; Если month <= 2, то год надо уменьшить:
cpi r17, 1
brsh .skip_year_dec
dec r18
.skip_year_dec:

; r20 <- год/4 (целочисленное)
mov r20, r18
lsr r20
lsr r20

; d_mod7 <- r16 mod 7
mov r21, r16
.loop_d7:
cpi r21, 7
brlo .done_d7
subi r21, 7
rjmp .loop_d7
.done_d7:

; y_mod7 <- r18 mod 7
mov r22, r18
.loop_y7:
cpi r22, 7
brlo .done_y7
subi r22, 7
rjmp .loop_y7
.done_y7:

; y4_mod7 <- r20 mod 7
mov r23, r20
.loop_y47:
cpi r23, 7
brlo .done_y47
subi r23, 7
rjmp .loop_y47
.done_y47:

; Сложить все остатки по модулю 7: result = d_mod7 + offset + y_mod7 + y4_mod7 (mod 7)
mov r24, r21
add r24, r19
.loop_s1:
cpi r24, 7
brlo .done_s1
subi r24, 7
rjmp .loop_s1
.done_s1:

add r24, r22
.loop_s2:
cpi r24, 7
brlo .done_s2
subi r24, 7
rjmp .loop_s2
.done_s2:

add r24, r23
.loop_s3:
cpi r24, 7
brlo .done_s3
subi r24, 7
rjmp .loop_s3
.done_s3:

; Записать результат в a1REG+13
ldi ZL, low(a1REG)
ldi ZH, high(a1REG)
std Z+13, r24

ret

Оставлять заявки могут только авторизованные пользователи.