Читаем Микроконтроллеры AVR: от простого к сложному полностью

; Программа BUF_SRAM.asm

; обращение к внешней памяти, запись данных в буферы

; ========================


.INCLUDE "С: \Avr\Try\8515def.inc”

; Вставка содержимого файла 8515def.inc, находящегося

; в директории C: \Avr\Try в нашу программу


.DEF tmp=r16; Регистру r16 присвоить имя tmp

; (значение переменной tmp будет храниться в

; регистре общего назначения г16)


.DEF cnt = r17; Переменная cnt — счетчик цикла


RESET:   IN tmp,MCUCR

             ; Ввод содержимого регистра MCUCR в регистр tmp


             ORI tmp,(1<

             ; Установка бита SRE (режим работы с внешней памятью)

             ; Бит SRW не устанавливаем; (работа без дополнительного цикла ожидания)


             OUT MCUCR,tmp

             ; Вывод содержимого регистра tmp в регистр MCUCR


;=========ЗАГРУЗКА ДАННЫХ В БУФЕРЫ

.EQU wrBuf1=$7FFD

             ; Адрес для записи данных в буфер 1 (по схеме — элемент DD6)

.EQU wrBuf2=$BFFE

             ; Адрес для записи данных в буфер 2 (DD7)

.EQU wrBuf3=$DFFF

             ; Адрес для записи данных в буфер 3 (DD8)

.EQU rdBuf1=$FFFD

             ; Адрес для считывания данных из ячейки, соотв. буферу 1

.EQU rdBuf2=$FFFE

             ; Адрес для считывания данных из ячейки, соотв. буферу 2

.EQU rdBuf3=$FFFF

             ; Адрес для считывания данных из ячейки, соотв. буферу 3

             LDI tmp,$AA; Загрузка константы в tmp

             STS wrBuf1, tmp

; Сохранение содержимого регистра tmp в буфере 1

             LDI tmp, $55; Загрузка константы в tmp

             STS wrBuf2, tmp

             LDI tmp,$71; Загрузка константы в tmp

             STS wrBuf3, tmp


;======ЧТЕНИЕ / ИЗМЕНЕНИЕ ДАННЫХ В БУФЕРАХ

            LDS tmp, rdBuf1

                  ; Передача данных из ячейки с адресом rdBuf1 в регистр tmp

            ORI tmp, (1<<7)+(1<<6)+(1<<5)+(1<<4);

Установка битов 4.. 7

            STS wrBuf1, tmp

; Сохранение содержимого регистра tmp в буфере 1


            LDS tmp, rdBuf2

            ORI tmp, 0b11110000

                  ; Установка тех же битов, что и для буфера 1,

                  ; только константа представлена в двоичной форме,

                 ; для обозначения двоичной константы 1111 0000; перед ней ставят символы "ноль” и “Ь”

            STS wrBuf2, tmp

            ; Сохранение содержимого регистра tmp в буфере 2


            LDS tmp, rdBuf3

            ANDI tmp, 0b11110000; сброс тех же битов

            STS wrBuf3, tmp

            ; Сохранение содержимого регистра tmp в буфере 2


; ===== ЗАГРУЗКА В ПАМЯТЬ ПЕРВОГО МАССИВА

.EQU ArSize =10; Размеры массивов


.EQU aArBgn1 =$Е060

            : Используем константу аАrВgn как адрес начальной ячейки для хранения массива 1


            LDI ZL,low(aArBgn1)

            LDI ZH,high(aArBgn1)

            ; Загрузка в регистр Z адреса начала массива 1


            LDI cnt,ArSize; Загрузка в cnt размера массива

            LDI tmp,$FF; Загрузка константы в tmp


ARR1:        ST Z+, tmp;

                 ; Запись содержимого регистра tmp в ячейку памяти,

                 ; адрес которой — в регистре Z,

                 ; с последующим увеличением на 1 адреса в регистре Z

                 ; В первом цикле содержимое tmp запишется

                 ; по адресу aArBgn1 ($Е060), во втором цикле —

                 ; по адресу aArBgn1+1 ($Е061) и т. д.


           INC tmp; Увеличить содержимое tmp на единицу

           DEC cnt; Уменьшить содержимое счетчика циклов на единицу


           BRNE ARR1

; Если бит (флаг) Z в регистре состояния процессора SREG

; не установлен — перейти на команду с меткой ARR1:


; ======ЗАГРУЗКА В ПАМЯТЬ ВТОРОГО МАССИВА

.EQU   аАгВgn2 =$FFFC

           ; Используем константу аАгВgn2 как адрес последней ячейки

           ; для хранения массива 2


           LDI ZL,lоw(аАгВgn2+1)

           LDI ZH,high(aArBgn2+1)

                 ; Загрузка в двухбайтный регистр Z адреса конечного

                 ; элемента массива 2, увеличенного на единицу

           LDI cot,ArSize; Загрузка в cnt размера массива

           LDI tmp,$03; Загрузка константы в tmp


ARR2:        ST -Z, tmp;

                 ; Сначала уменьшается на единицу адрес,

                 ; хранящийся в регистре Z (поэтому в Z загружался

                 ; адрес, увеличенный на единицу), затем по новому

                 ; адресу запишется содержимое регистра tmp

                 ; В первом цикле содержимое tmp запишется; по адресу (аАrВgn2+1)-1, то есть, по адресу аАrВgn2

                 ; во втором цикле — по адресу аАrВgn2-1, и т. д.


           DEC tmp; Уменьшить содержимое tmp на единицу


           DEC cnt; Уменьшить содержимое счетчика циклов на единицу


           BRNE ARR2

; Если бит (флаг) Z в регистре состояния процессора SREG

; не установлен — перейти на команду с меткой ARR2:


STOP: RJMP STOP; Зацикливание программы

                          ; (перейти на команду с меткой STOP:)

Перейти на страницу:

Все книги серии Библиотека инженера

Похожие книги

Искусство схемотехники. Том 3 (Изд.4-е)
Искусство схемотехники. Том 3 (Изд.4-е)

Широко известная читателю по предыдущим изданиям монография известных американских специалистов посвящена быстро развивающимся областям электроники. В ней приведены наиболее интересные технические решения, а также анализируются ошибки разработчиков аппаратуры: внимание читателя сосредотачивается на тонких аспектах проектирования и применения электронных схем. На русском языке издается в трех томах. Том 3 содержит сведения о микропроцессорах, радиотехнических схемах, методах измерения и обработки сигналов, принципах конструирования аппаратуры и проектирования маломощных устройств, а также обширные приложения. Для специалистов в области электроники, автоматики, вычислительной техники, а также студентов соответствующих специальностей вузов и техникумов.

Пауль Хоровиц , Уинфилд Хилл

Техника / Радиоэлектроника