Главная  Радио и связь 

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

Для нашего микроконтроллера 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



Нате

, lf Regi:ler0-15

т Щ Regiier 16-31

L Proces5Qt

V Program СоигГег

» Slack Poinler

. » Cycle Counter

» Xregistei

Y-register

2-reglster

L t Frequency

4.0000 Mh

у StopWatcti

ООО us

+1 (D Stack Monitor

В i.0 AT90S2313

Mt:-[rii:ifi,i

Program r\

Data

Eeprom

100 100 iz7

0000 0000 0000 ж

0000 0000 OITD ~

oiBB 08EE on:r

lES ;D0

OFEO OiBD es34 34dB 04Q0 СгЭА 20D0 IFDO

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