![]() |
Главная Микроконтроллеры [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 ===ЗАГРУЗКА ДАННЫХ В БУФЕРЫ
Состояние выходов регистров может не соответствовать считанным из соответствующих ячеек памяти данным • из-за неисправности регистров; • из-за возможного соединения выхода регистра с общим проводом во внешнем устройстве. Создадим новую директорию 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.0008 |