![]() | |
|
Главная Радио и связь Для нашего микроконтроллера AT90S2313 в конце файла 2313def.inc можно найти такой блок: .equ INTOaddr = $001 .equ INTladdr = $002 .equ ICPladdr = $003 .equ OCladdr = $004 .equ OVFladdr = $005 .equ OVFOaddr = $006 .•External InterruptO Vector Address .•External Interruptl vector Address ;Input Capturel Interrupt vector Address /Output Comparel Interrupt Vector Address /Overflowl Interrupt Vector Address /OverflowO Interrupt vector Address .equ URXCaddr = $007/UART Receive Complete Interrupt Vector /Address .equ UDREaddr = $008/UART Data Register Empty Interrupt Vector /Address .equ UTXCaddr = $009/UART Transmit Complete Interrupt Vector /Address .equ ACIaddr = $00a/Analog Comparator Interrupt vector /Address Здесь отсутствует лишь самое первое прерывание RESET, размещаемое по нулевому адресу. Но такой блок надо приводить кописанному выше виду Основная программа Основная программа начинается командой с меткой RESET. Первая пара операторов определяет адрес начала стека в оперативной памяти микроконтроллера. Работу стека мы еще рассмотрим, поэтому сейчас заметим, что стек - это область оперативной памяти или оперативного запоминающего устройства микроконтроллера (далее - ОЗУ). Стек предназначен в основном для обслуживания подпрограмм; при занесении в стек нескольких величин адрес каждой последующей величины уменьшается (у первой - самый большой адрес, у последней - самый маленький). Поэтому стек обычно располагают в конце ОЗУ, начиная с последней ячейки ОЗУ. Мы прервались после первого шага отладки: желтая стрелка указателя отладчика установлена против первой команды rjmp RESET. Откройте окно просмотра состояния процессора (в окне Workspace двойной щелчок по строке Processor). Далее слова «просмотр состояния» будут опускаться. В окне процессора указана выбранная нами тактовая частота 4 МГц; в окошках счетчика тактов микроконтроллера (Cycle Counter), указателя стека (Stack Pointer), счетчика команд (Program Counter), времени выполнения (Stop Watch) - нули. На Рис. 10 показано окно Workspace, в котором отображается состояние процессора во время отладки программы. Откройте окно памяти (меню View/Memory, Рис. 11). -30- 1
eunu4 lEDO mDo сгдв oaeo iaoo oass eOuO..- еэг" 6634 06?5 66г0 c09a а4ег елуи j IlEO %i?5 cisa оэио c19s 07d0 eoitfie us cgn oado гэсг s29e fecf Pmc. 10. Состояние процессора (окно Workspace) Рис. 11. Окно состояния памяти с открытым меню выбора типа памяти Кнопкой 8/16 выберите отображение в виде двухбайтных слов, как на рисунке. Заметьте, что в нулевой ячейке памяти программ находится число ОАСО (правильнее бьшо бы написать $ОАСО или ОхОАСО, что указывает на шестнадцатеричное представление величины, однако, вид записи соответствует виду, представленному в описываемом окне).Откроем окно Disassembler (Рис. 12), выбрав меню View/Disassembler oooooooj oddo Hi p 30: nop ;rjmp ANA COMP : Analog Coii + D0O0OC0A 0000 HOi- 90000000B: reset 32: RESETi: Idi tmp, low(RAMEND) : Oi =>iiU00j> }:;iJ0F i i 34: out SPL,tmp + ИПГП!ПГИ:: DFOD i}\ - I ---- c:\avr\Alarift\A.asm ------------------- 1; dec tmp .+odoooocr; 950A DEC Kit, ---- C:\AVK\Alarm\Alarm.asm -olldodooe 37 +O000000F 38: 20000010 : 40: +00000011 41: tooonooi 43: »JOOOOOJ" 45: ,!juouooj; clr tmp ; очистить peeur out DDRD,tmp ; линии порз, ВБ01 OUT Ож11,КК. out PORTB,tmp ;на бсех линия: EBOB out okis ser tmp ;установить tm] efof ser rib out PORTD.tmp .-дстаиовить на 3£>; 2 out 0x12, r out DDRE,tmp ;линии nop] BBo? etc йк17,я - out PIND,tmp bpnn cot ow! п fi Idi tmp 15 ;инициализация nop ;гзтр UART„TXC . UARl nop ,rjmp AKA„COMP . Anal >EESET: Idi tmp, low(RAMElTD2 - , ош&кв & 03 out SPL,tmp include "c:\avr\Alarm\A.asm" clr tmp D4uciiiumt out DDRD, tmp лин. out PORTE,tmp .на Всен gcmairioBumb НИЗК! ser tmp ;cmaKo6v out PORTD.tmp ;gcmaHo6i .nopma D out DDRE,tmp лпнь out PIHD.tmp оп>зрация - только для ojt h4P. Stud].o на вкодш-1к ко>г?г!а>: ШООКИК TjpoBHii если не бстг .e-C-/tu PINIi не дстпанс-Огдть, от. г---гтояние .luhuu порта Г "iiaKt . r£a-iia.M.uu jiipex кнопок: "ДРЕРЬ" "иТПИРЛНИЕ ИЗНУТРИ Idi tmp.15 out ¥DTCR.tmp : иници*.!- таймера Рис. 12. Окно дизассемблированного кода и окно профаммы Открывшееся окно Alarm закрывает собой окно программы Alarm.asm, поэтому его лучше сместить, как это показано на Рис. 12. В первой колонке окна Alarm находится адрес двухбайтной ячейки памяти программ, во второй колонке - код команды, хранящейся в этой ячейке, в третьей - наименование команды, такое же, как и в нашей программе, в четвертой - операнды, приведенные к приемлемому для микроконтроллера виду. Например, вместо имени tmp здесь будет имя регистра R16, вместо метки RESET: - смещение адреса и так далее. В пятой колонке находятся комментарии. Здесь могут быть представлены, например, результаты адреса переходов или константы в шестнадцатеричном, двоичном и десятичном видах. По существу, в этом окне представлен код программы в дизассембли-рованном виде. Во второй колонке строки с адресом +00000000: - тот же код СООА, только с измененной последовательностью байтов, который находится в нулевой ячейке памяти программ. Это двухбайтный код, соответствующий команде rjmp RESET. СО - код команды rjmp, OA - смещение адреса, которое надо добавить к содержимому счетчика команд для перехода к обработчику прерывания, начинающемуся меткой RESET:. В результате выполнения этой команды в счетчике окажется адрес OA, для перехода к следующей команде содержимое счетчика увеличится на единицу, в результате следующей выполнится команда, расположенная по адресу ОВ (смотрите пятую колонку строки). С адреса 00000001 по адрес ОООООООА следуют коды 0000, соответствующие нашим пустым командам пор, и так далее. Вероятно, читатель уже уловил связь между строкой в программе и кодом, исполняемым микроконтроллером. Новый шаг отладки вызвал бы перемещение указателя отладчика к следующей команде как в окне программы, так и в окне Disassembler Не многовато ли для первого шага отладки? Если материал для вас пока не очень понятен - не расстраивайтесь, просто запомните, что вопрос о такой-то возможности отладчика рассматривался. Тогда, при необходимости, вы сможете вернуться к этой части книги. Поэтому дать максимум материала по отладке целесообразно именно при рассмотрении простейшей программы, чтобы не возвращаться к нему при рассмотрении более сложных программ. Вернемся к программе, закроем окна Memory и Disassembler. Выполним второй шаг отладки, нажав клавишу F11. Далее подобный текст будет заменен фразами «выполним FI1:», «нажмите F11:» или просто «F11:». В окне Processor состояние счетчика стало равным $В, что соответствует адресу следующей команды, в счетчике тактов - 2, то есть команда rjmi 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.0069 |
||||||||||||||||||||||||||||||||||||||||||