Выбрать главу

        dec cnt

        brne StRAM

; Перепишем этот массив во внешнюю память на страницу № 2

; (старшие биты адреса внешней памяти AR2 AR1 AR0 = 101)

        in tm,PORTC

        andi tm, $ff-((1<<AR2)+(1<<AR1)+(1<<AR0))

                ; очистка битов AR2, AR1, AR0

                ; 1111 1000 = $ff-@K0D = ((K<AR2)+(1«AR1)+(1«AR0))

        ori tm, (1<<AR1)

                ; Установка бита AR1(aдpec страницы 010

                ; (страница № 2))

        out PORTC,tm; Вывод в порт С содержимого tm

        clr tm; Очистка содержимого tm (tm=0)

        sts RamH,tm; Сохранение в ячейке RamH содержимого tm

        sts RamL,tm

        rcall St45bt; Вызов подпрограммы St45bt

; Скопируем массив из внешней памяти на странице № 2

; (старшие биты адреса внешней памяти AR2 AR1 AR0 = 101)

; во внутреннее ОЗУ микроконтроллера

         clr tm; Очистка содержимого tm (tm=0)

         sts RamH,tm; Сохранение в ячейке RamH содержимого tm

         sts RamL,tm

         rcall DOutPrp

cycle: rjmp cycle

; Подпрограммы:

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

Копирование массива из внутренней во внешнюю память

St45bt:

         ldi ZL,low(aPack)

         ldi ZH,high(aPack)

         ldi cnt,45

mSt45:

         rcall SetAddr

         rcall DataSt

         dec cnt

         brne mSt45

         ret

; ======

; Подпрограмма копирования 45 байтов из внешней памяти во внутреннее ОЗУ

DOutPrp:

ldi     ZL,low(aADC)

         ldi ZH,high(aADC)

         ldi cnt,45

DOut1:

         rcall SetAddr

         rcall DataLd

         dec cnt

         brne DOut1

         ret

; ========

; Подпрограмма установки

SetAddr:

Ids     XL,RamL; Скопировать содержимое ячейки RamL в XL

         Ids XH,RamH

         out PORTB,XL; Вывести в порт В содержимое XL

         nop; Задержка 156 нc

         nop; Задержка 156 нc

         sbi PORTD,Buf1; Установить бит Buf1 порта D

         nop

         nop

         cbi PORTD,Buf1; Сбросить бит Buf1 порта D

         nop

         nop

         out PORTB,XH; Вывести в порт В содержимое ХН

         nop

         nop

         sbi PORTD,Buf2; Установить бит Buf2 порта D

         nop

         nop

         cbi PORTD,Buf2; Сбросить бит Buf2 порта D

         adiw XL,1; Увеличить содержимое пары XH:

         sts RamH,XH; Сохранить содержимое ХН в ячейке RamH

         sts RamL,XL

         ret; Возврат из подпрограммы

; =========

Подпрограмма копирования байта из внутреннего ОЗУ во внешнюю память

DataSt:

         Id tm,Z+

         out PORTB,tm

         nop

         nop

         cbi PORTC,Wr

         nор

         nор

         sbi PORTC,Wr

         ret

; ==========

; Подпрограмма копирования байта из внешней памяти во внутреннее ОЗУ

DataLd:

         clr tm; Очистка tm

         out DDRB,tm; Контакты порта В в режиме входов

         cbi PORTC,Rd; Сбросить бит Rd порта С

         nор

         nор

         in tm,PINB ; Считать данные на контактах порта В в tm

         sbi PORTC,Rd; Установить бит Rd порта С

         St Z+, tm; Сохранить содержимое tm в ячейке ОЗУ

         ser tm; Установить tm

         out DDRB,tm; Все контакты порта В в режиме выходов

         ret

Отладка программы

После ассемблирования (клавиша F7) при отсутствии ошибок приступим к отладке (клавиша F11), в появившемся окне Simulator options | Device выберем микроконтроллер AT90S8535.

Рассмотрим определение констант в программе. Ячейки внутренней памяти микроконтроллера с адресами RamH и RamL хранят старший и младший байты адреса внешней памяти. То есть, в этих ячейках будет отражаться информация об адресе внешней памяти, которая выводится в буферы адреса (регистры DD3 и DD4 по схеме электрической).