Главная  Микроконтроллеры 

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [ 83 ] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93]

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

; Вставка содержимого файла 8515def.inc, находящегося ; в директории C:\Avr\Try в нашу программу

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

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

.DEF cnt =г17 ; Переменная cnt - счетчик цикла

ПЕЗЕТ; IN tmp,HCUCH

: Ввод содержимого регистра МСиСП в регистр tmp

0П1 tmp,(1«SnE)

; Установка бита SRE (режим работы с

; внешней памятью)

; Бит SRW не устанавливаем

; (работа без дополнительного

; цикла ожидания)

OUT MCUCR,tmp

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

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

.EQU

wrBufI

=$7FFD

: Адрес для

записи данных в буфер 1

; (по схеме

- элемент DD6)

wrBuf2

=$BFFE

; Адрес для

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

.EQU

wrBuf3

=$OFFF

; Адрес для

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

rdBufi

=$FFFD

; Адрес для

считывания данных из ячейки, соотв.

буферу 1

.EQU

rdBuf2

-$FFFE

; Адрес для

считывания данных из ячейки, соотв.

буферу 2

.EQU

rdBuf3

=$FFFF

Состояние выходов регистров может не соответствовать считанным из соответствующих ячеек памяти данным

• из-за неисправности регистров;

• из-за возможного соединения выхода регистра с общим проводом во внешнем устройстве.

Создадим новую директорию C:\Avr\Buff\. В AVR Studio создадим новый проект, назовем его Buffers, воспользуемся уже созданной директорией C:\Avr\Buff\, в проекте создадим новый файл BUFSRAM.asm, в котором напишем следующую программу.

Программа BUF SRAM.astTi обращение к внешней памяти, запись данных в буферы



; Адрес для считывания данных из ячейки, соотв. буферу 3 LDI tmp.SAA ; Загрузка константы в tmp STS wrBufI, tmp ; Сохранение содержимого регистра tmp в буфере 1 LDI tmp, $55 ; Загрузка константы в tmp STS wrBuf2, tmp

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

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

LDS tmp, rdBufI

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

ORI tmp, (1«7)+(1«6)+(1«5)+(1«4) ; Установка битов 4.. .7

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

LDS tmp, rdBuf2 ORI tmp. ОЫ1110000

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

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

; для обозначения двоичной константы 1111 0000

; перед ней ставят символы "ноль" и "Ь" STS wrBuf2, tmp

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

ANDI tmp. ОЫ 1110000 ; сброс тех же битов STS wrBuf3. tmp

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

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

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

.EQU аАгВдШ =$Е060

: Используем константу аАгВдп как адрес начальной ячейки ; для хранения массива 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 запишется

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

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

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



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

; Если бит (флаг) Z в регистре состояния процессора SREG ; не установлен - перейти на команду с меткой ARR1:

;======ЗАГРуЗКА В НАНЯТЬ ВТОРОГО МАССИВА

.EQU аАгВдп2 =$FFFC

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

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

LOI ZL.low(aArBgn2+1) LDI ZH,high(aArBgn2+1)

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

; элемента массива 2, увеличенного на единицу LDI cot.ArSize ; Загрузка в cnt размера массива LDI tmp,$03 ; Загрузка константы в tmp

ARR2: ST -Z, tmp ;

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

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

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

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

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

; по адресу (аАгВдп2+1)-1, то есть, по адресу аАгВдп2

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

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

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

BRNE ARR2

; Если бит (флаг) Z в регистре состояния процессора SREG ; не установлен - перейти на команду с меткой ARR2:

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

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

Ассемблируем программу (клавиша F7). При обнаружении ошибок проверьте правильность набора программы в строках, содержащих ошибки - номера строк с ошибками и комментарии к этим ошибкам выводятся в окне Project output, появляющемся после ассемблирования.

Директивой .INCLUDE в программу вставлен файл 8515def.inc, использовавшийся в предыдущем примере и находящийся с проектом в разных директориях. Поэтому ассемблирование пройдет нормально, если файл c:\avr\try\851 Sdef.inc еще существует.



[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [ 83 ] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93]

0.0014