Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПМК ДЗ 2012 примеры.doc
Скачиваний:
2
Добавлен:
17.08.2019
Размер:
202.24 Кб
Скачать

Пример выполнения задания

  1. Порт для выдачи данных - PC.

  2. Таблица данных называется Table

  3. Данные для выдачи в порт: $00, $12, $25, $67, $fa

  4. Для подсчета количества байтов использовать регистр 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

В ОЗУ находятся данные измерений в виде массива данных. Необходимо их скорректировать на указанную величину (добавить постоянное смещение). Скорректированные данные записать также в ОЗУ.

Пример выполнения задания

  1. Исходный массив называется Massiv_In, скорректированный - Massiv_Out. Находятся в ОЗУ.

  2. Константа называется Constanta и находится также в ОЗУ.

  3. Количество элементов массива - 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 и записать назад.