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

[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]

; единицы, сдвинутой влево SRE (или 7) раз (=1000 0000),

; и единицы, сдвинутой влево SRW (или 6) раз (0100 0000)

: Сумма 1000 0000+0100 0000=1100 0000

, операция V (bbbb bbbb V1100 0000 =11bb bbbb)

; дает нужный результат

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

LDI ZL,low(aArBgn)

LDI ZH,high(aArBgn) ; LDI - операции загрузки в регистр однобайтной константы ; аАгВдп - двухбайтная константа - должна быть загружена ; в пару однобайтных регистров ZH:ZL, которые составляют ; двухбайтный регистр Z. Регистр Z и аналогичные ему двухбайтные : регистры X и Y используются в операциях с памятью (st,Id,...). ; аАгВдп=$0170, в ZL загрузится Iow($0170), т. е., младший байт $70 , в ZH загрузится hlgh($0170), то есть, старший байт $01 ; в Z (или в ZHiZL) образуется двухбайтное слово $01: $70. ; то есть, адрес, выбранный для начальной ячейки массива

LDI cnt.ArSlze ; Загрузить в cnt размер массива

NEXT: ST Z+,cnt

; ST - операция записи содержимого регистра cnt в ячейку памяти, ; адрес которой - в регистре Z, знак "+" после Z - значит ; с последующим увеличением адреса в регистре Z на единицу. ; В первом цикле данные занесутся по адресу $0170. а Z = $0171; : во втором цикле - по адресу $0171, Z = $0172 и т. д. ; в память пишется состояние счетчика циклов DEC cnt

: Уменьшить содержимое регистра cnt на единицу

NOP ; Команда добавляет один пустой цикл

NOP ; То же

BRNE NEXT

; Если бит (флаг) Z в регистре состояния процессора SREG

; (не путать бит Z регистра SREG с регистром адреса Z)

: не установлен (не равен) - перейти на команду с меткой NEXT:

; последняя команда, воздействующая на бит Z

; регистра SREG - DEC cnt. Команды NOP введены для

; демонстрации отсутствия их влияния на бит Z

; если вместо них вставить, например, команду INC tmp, влияющую

; на состояние бита Z, работа программы будет нарушена

; Далее - блок считывания данных из памяти:

LDI ZL.Iow(aArBgn)

LDI ZH.high(aArBgn)

LDI cnt.ArSize RD BLK:

LD tmp, Z+



; Здесь какие-то действия с tmp. например, ; передача в компьютер через UART

DEC cnt

BRNE RD BLK

RJMP RESET ; Перейти на команду с меткой RESET:

Вы заметили, что имена регистров и константы, определенные во включаемом в программу файле 8515def.inc довольно длинны? Не думайте, что, сокращая используемые имена до одной-двух букв, можно сэкономить время: через пару недель вы не разберетесь в собственной программе! А вот имена MCUCR, SRE, являясь сокращениями английских наименований MCU control register и Static RAM Enable, быстро запоминаются. Те же рекомендации можно предложить и для определяемых вами имен: и в чужой программе можно понять, что ArSize это Array Size (размер массива), а aArBgn - начальный адрес массива.

Отладка программы

Ассемблируем программу: Project Assemble. Обращайте внимание на наличие горячих клавиш: на строке Assemble указана горячая клавиша F7. Так как эта операция повторяется часто, удобнее пользоваться именно клавишей F7.

При первом ассемблировании автоматически открывается окно Simulator options. В строке Device этого окна надо выбрать микроконтроллер, на который ориентирована программа, в нашем случае это AT90S8515 with external SRAM. Затем нажмите кнопку ОК.

Замечание: для микроконтроллеров с программно-аппаратной поддержкой подключения внешней памяти симулятор программируется как для поддержки внешней памяти (выбрать AT90S8515 with external SRAM), так и для работы только с внутренней памятью (выбрать AT90S8515). Последовательность команд в программе, задающая режим работы с внешней памятью, достаточна лишь для самого микроконтроллера; на работу в режиме отладки в AVR Studio влияет именно выбор устройства в окне Simulator options.

В окне Simulator options следует установить частоту кварцевого резонатора, использующегося вместе с микроконтроллером. Частоту можно либо выбрать из предлагаемого списка, либо ввести вручную.



если надо задать точное значение, например, 6,425 МГц. Это позволит симулятору корректно выводить время работы программы не только в циклах микроконтроллера, но и в единицах времени.

Вызвать окно Simulator options вновь можно только после успешного ассемблирования в режиме отладки (переход в режим отладки - по нажатию клавиши F11).

В результате ассемблирования появится окно Project output. •

Если программа набрана без ошибок, а файл 8515def.inc находится в рабочей директории проекта - в последней строке окна Project output будет сообщение об отсутствии ошибок (Assembly complete with no errors).

Интересной информацией в этом окне является:

• сообщение о включении файла 8515def.inc в программу;

• предостережение: C:\Avr\Jry\SRAM.asm(15): warning: Register already defined by the.DEF directive - предупреждение о том, что в строке (15) программы директивой .DEF назначается имя регистру, которому уже назначено другое имя; хотя программа невелика, считать строки нет необходимости, достаточно щелкнуть мышкой на любой строке, чтобы увидеть ее номер, а также номер колонки, в правом нижнем углу всего окна AVR Studio: Lnl5,Col5;

• общий объем памяти, занимаемый программой (Total). Обратите внимание на то, что объем занимаемой памяти указывается в словах (words), каждое слово в памяти программы микроконтроллера двухбайтное, поэтому размер программы в байтах будет в два раза больше.

Займемся пошаговой отладкой программы: Debug Trace into (Fl 1).

Замечание. При отладке (смотрите меню Debug) удобно пользоваться горячей клавишей F11, когда требуется пошаговая отладка каждой команды, если Вы уже отладили часть программы в предыдущих сеансах работы, установите курсор на команду, с которой хотели бы продолжить отладку и нажлште Ctrl+FlO.

На левой границе окна против команды, которая будет выполняться, устанавливается стрелка - указатель выполнения команд.



[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.001