Установка резистора R43, подключенного к источнику питания +5 В, создает в описанной ситуации на линии RD высокий уровень и переводит выходы Ю0…Ю7 микросхемы памяти в высокоимпедансное состояние, исключая подобную ситуацию, резистор R44 устраняет возможность хаотичной записи при программировании. В обычном режиме работы эти резисторы не мешают микроконтроллеру управлять микросхемой памяти.
В рабочей программе, взятой за основу для нашего примера, АЦП микроконтроллера производил группу преобразований, результаты которых записывались во внутреннюю оперативную память микроконтроллера. Результаты группы преобразований обрабатывались и также записывались во внутреннюю оперативную память в виде массива размером в 45 байтов, начиная с ячейки с адресом аРаск. Этот массив переносился во внешнюю память для хранения. АЦП выполнял новую группу преобразований, которые тем же способом обрабатывались, а очередной массив размером в 45 байтов добавлялся во внешнюю память. Процесс продолжался до заполнения страницы внешней памяти (64 Кбайт), после чего вся информация со страницы внешней памяти через микроконтроллер передавалась в компьютер.
Представленная программа включает в себя подпрограммы, взятые из рабочей программы, оттуда же заимствовано распределение внутренней оперативной памяти микроконтроллера, а также имена констант и переменных.
Создадим новую директорию c: \Avr\Ram512, поместим в нее файл 8535def.inc, полученный при распаковке файла avr000.exe (ищите его там же, где распаковался файл 8515def.inc). В директории c: \Avr\Ram512 создадим проект Ram512 с новым файлом программы Ram512.asm, в который следует перенести следующую программу.
; Подключение 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<<Wr)+(1<<Rd); Устанавливаем высокие уровни
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