
- •Пмк дз Общие требования
- •Решение.
- •Решение.
- •Решение.
- •Решение.
- •Решение.
- •Решение.
- •Решение.
- •Решение.
- •Решение.
- •Пример выполнения задания
- •Решение.
- •Пример выполнения задания
- •Решение.
- •Пример выполнения задания
- •Решение.
- •Пример выполнения задания
- •Решение.
- •Пример выполнения задания
- •Решение.
- •Пример выполнения задания
- •Решение.
Пример выполнения задания
Порт для выдачи данных - PC.
Таблица данных называется Table
Данные для выдачи в порт: $00, $12, $25, $67, $fa
Для подсчета количества байтов использовать регистр r17.
Решение.
.include "8535def.inc"
;--------- Определение символьных имен регистров и констант ------------
.def TempCounter =r17
.equ Port_For_Output =portb
.equ DDR_For_Output =ddrb
.equ Number =5
;--------- Таблица векторов прерываний содержит только вектор сброса ----
.org 0
rjmp Start
;--------- Отступаем от начала Flash-памяти INT_VECTORS_SIZE ячеек ------
.org INT_VECTORS_SIZE
Start:
ldi r16, $ff ;Весь порт – на вывод
out ddrc,r16
m0:
ldi TempCounter, Number ;Грузим количество байтов
ldi zl, low(table*2) ;Грузим адрес начала таблицы
ldi zh, high(table*2)
m1:
lpm ;Читаем очередной байт
out Port_For_Output,r0 ; и отправляем его в порт.
adiw zh:zl, 1 ;Увеличиваем указатель на «1»
dec TempCounter ;Уменьшаем счетчик на «1»
brne m1 ;Если не все байты переданы - повторяем
rjmp m0 ;Если дошли сюда – то весь массив
; передан. Повторяем.
table: ;А это сама таблица
.db $00, $12, $25, $67, $fa
ПМК ДЗ №12
В ОЗУ находятся данные измерений в виде массива данных. Необходимо их скорректировать на указанную величину (добавить постоянное смещение). Скорректированные данные записать также в ОЗУ.
Пример выполнения задания
Исходный массив называется Massiv_In, скорректированный - Massiv_Out. Находятся в ОЗУ.
Константа называется Constanta и находится также в ОЗУ.
Количество элементов массива - N_Elementov. Задается через директиву .equ.
Решение.
.include "8535def.inc"
.def Temp =r16
.def Temp2=r17
.def Temp3=r18
.equ N_Elementov =5
.cseg ;С этой директивы начинается сегмент кодов (Flash)
.org 0 ;Таблица векторов прерываний содержит
rjmp Start ; только вектор сброса
.org INT_VECTORS_SIZE ;Отступ от нач.Flash-памяти INT_VECTORS_SIZE ячеек
Start:
ldi xl, low (Massiv_In) ;Загружаем в Х начальный адрес
ldi xh, high (Massiv_In) ; исходного массива
ldi yl, low (Massiv_Out) ;Загружаем в Y начальный адрес
ldi yh, high (Massiv_Out) ; выходного массива
lds Temp, Constanta ;Загружаем в Temp константу
ldi Temp2, N_Elementov ;Загружаем в Temp2 размер массива
m1: ld Temp3, x+ ;Читаем очередной элемент массива,
add Temp3, Temp ; прибавляем константу
st y+, Temp3 ; и записываем в память.
dec Temp2 ;Уменьшаем счетчик.
brne m1 ;Если не все элементы обработаны –
; берем следующий элемент.
m2: nop ;Если дошли сюда – значит, массив
rjmp m2 ; обработан. Зацикливаем.
.dseg ;С этой директивы начинается сегмент данных (SRAM)
.org SRAM_START
Massiv_In: .byte N_Elementov
Massiv_Out: .byte N_Elementov
Constanta: .byte 1
ПМК ДЗ №13
В EEPROM находится переменная, показывающая количество запусков программы. При очередном запуске эту переменную нужно прочитать. Если она равна указанному числу – программу зациклить. Если меньше – то увеличить на 1 и записать назад.