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 по схеме электрической).