; Подключение 03У512К к AT90S8535
;================================
.include "с: \atmel\8535def.inc"
.equ RamH =$16а; Адрес ячейки внутренней SRAM, хранящей
; старший байт адреса страницы внешней памяти
.equ RamL =$16b; Адрес ячейки внутренней SRAM, хранящей
; младший байт адреса внешней памяти
; Три старших бита адреса внешней памяти
; (номер страницы внешней памяти):
.equ Ar0 =PC0
.equ Ar1 =PC1
.equ Ar2 =PC2
.equ Wr =PC4; Управление записью во внешнюю память
.equ Rd =PC3; Управление считыванием из внешней памяти
.equ Buf1 =PD3; Управление записью в буфер 1
.equ Buf2 =PD4; Управление записью в буфер 2
.equ aADC =$60; Адрес для переноса массива из внешней памяти во внутреннюю SRAM
.equ aPack =$Ь0; Адрес 45-байтового массива во; внутренней SRAM микроконтроллера
.def tm =r16
.def cnt =r19
;====
RESET:
ldi tm, (1<
out PORTC,tm; на линиях WR и RD
ldi tm,$ff; контакты порта С -
out DDRC,tm; в режиме выходов
clr tm; На линиях порта D низкие уровни
out PORTD,tm; (в том числе BUF1, BUF2=0)
ldi tm,$ff; контакты порта D -
out DDRD,tm; в режиме выходов
ser tm; Установка регистра tm (tm=$ff)
out DDRB,tm; вывод в порт DDRB содержимого tm
; контакты порта В — в режиме выходов
ldi tm,low(RAMEND)
; Стек — начиная с конца внутренней SRAM
out SPL,tm
ldi tm,high(RAMEND)
out SPH,tm
; Загрузка во внутреннее ОЗУ микроконтроллера,
; начиная с ячейки с адресом аРаск
; 45-ги байтов массива: $20, $21, $22….
ldi XL,low(aPack)
ldi XH,high(aPack)
ldi tm,$20
ldi cnt,45
StRAM:
st X+,tm
inc tm
dec cnt
brne StRAM
; Перепишем этот массив во внешнюю память на страницу № 2
; (старшие биты адреса внешней памяти AR2 AR1 AR0 = 101)
in tm,PORTC
andi tm, $ff-((1<
; очистка битов AR2, AR1, AR0
; 1111 1000 = $ff-@K0D = ((K ori tm, (1< ; Установка бита 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