![]() |
Главная Микроконтроллеры [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.0009 |