Отладка В AVR STUDIO

March 14, 2011 by admin Комментировать »

1.   Запускаем АVR Studio 4, проект создавать не нужно.

2.      Открываем объектный файл проекта {Open File) и выбираем фильтр Object Files в окне открытия файлов. AVR Studio 4 поддерживает семь типов объектных файлов. Выбираем файл с расширением .obj либо с расширением .cof. Открывается окно Select device and debug platform, в котором указываем платформу для отладки: AVRSimulator и АТх8515. После этого создается проектный файл и загружается отладчик. Дальнейшие действия зависят от выбранного типа файла.

3.    Выбираем файл для загрузки в AVR Studio 4.

Выбрав файл с расширением .obj, отладку можно осуществлять в кодах Ассемблера. Следует обратить внимание на то, что проект содержит три файла (.asm, .inc и .vec) и отладка начинается с файла .vec, содержащего векторы прерываний. Курсор отладки (желтая стрелка) установлен на команде rjmp reset. После нажатия кнопки Step Into (Fll) курсор переходит на обработчик сброса, расположенный в файле .asm, и дальнейшая отладка продолжается в обычном режиме. Чтобы пропустить команды, добавленные компилятором, и перейти к отладке кода, написанного программистом, нужно установить курсор на первую команду процедуры main О и нажать кнопку Run to cursor. Все команды до курсора будут выполнены. Проект можно просмотреть в окне Disassembler, которое открывают, выбрав в меню View;Disassembler, Отладку можно продолжить в этом окне.

Для отладки программы на языке Си выбираем файл с расширением .cof.

4.           Устанавливаем параметры отладки в меню Debug; AVRSimulator Options: АТх8515, частота 1 МГц, протоколирование порта РВ с выводом на экран.

5.        Содержимое используемых регистров ввода;вывода МК можно проконтролировать несколькими способами:

а)   непосредственно просматривая их содержимое на вкладке НО панели Workspace;

б)   анализируя область памяти регистров ввода;вывода {View! Memory [I;O]),

в)   присвоив их значения переменным, которые в дальнейшем просматривают в окне Watch.

В нашем случае имеем одну переменную timer, которая принимает значение таймера;счетчика TCNTO. Открываем окно Watch, выбрав команду меню View;Watch, и перетаскиваем мышью эту переменную в столбец Name. Пока переменная находится вне зоны видимости отладчика, в столбце Value будет записано Not in Scope. Подготовка к отладке завершена.

6.     В начале процесса отладки и при нажатии кнопки сброса Reset курсор отладки устанавливается на первой строке процедуры main (). Выполнение программы можно контролировать, открыв окно Disassembler, однако имея программу на языке Си, значительно удобнее отлаживать программу в окне Си-программы.

7.    Нажимая кнопку Step Into (Fll), наблюдаем за изменением содержимого регистров ввода;вывода микроконтроллера. Одно из преимуществ отладки на Си – использование только программных инструкций, способствующее ускорению процесса отладки. В цикле for (;;) командой Ассемблера sleep микроконтроллер переводится в режим пониженного энергопотребления.

8.     Занесем в счетчик TCNTO значение 2. При разомкнутой кнопке SWO (состояние 1) эмулируем замыкание кнопки SW2 (состояние 0), что приведет к вызову обработчика прерывания. При вызове процедуры delay_ms{) отладчик не входит в нее, но вызов задерживает его работу и изменяет значение счетчика циклов.

9.   Установив курсор на команде sleep, выполним команду Run to Cursor (выполнить до курсора). После останова симуляции, что обнаруживается по желтому индикатору в строке состояния, в окне Output получим список сообщений (отчет), в котором значение 0x81(10000001) соответствует готовности схемы (светодиод LED7 выключен, LED6 включен), значение OxCl(11000001) – погашены оба светодиода, 0x41(01000001) – LED6 погашен, LED7 включен. Список сообщений:

Длительность включения светодиода LED7 составляет 0,503 с.

10.     Изменим значение задержки в процедуре delay_ms{). Редактировать объектные файлы в AVR Studio 4 нельзя, поэтому снова открываем Code Vision AVR, исправляем соответствующие строки и заново выполняем компиляцию. Если AVR Studio 4 не был закрыт, то появится сообщение, что объектный файл был изменен и его нужно перезагрузить – выполняем перезагрузку.

11.     Компилируем в CodeVision AVR, установив в окне Configure тип выходного файла Intel HEX. Загрузив полученный файл с расширением .hex в микроконтроллер STK500 и изменив на вкладке Board окна STK500 частоту, проверяем работу программы. Соединяем РВ6: РВ7 – LED6:LED7, SWO – РВО, SW2 – PD2. В исходном состоянии светодиод LED6 включен, LED7 выключен. Нажав несколько раз на кнопку SWO, затем на кнопку SW2, наблюдаем мигание светодиода LED7 с частотой 1 Гц. В это время светодиод LED6 выключен. После завершения мигания LED6 вновь включается, а устройство переходит в режим ожидания.

Выводы

Работа над проектом с использованием языка Си позволяет сделать ряд наблюдений, касающихся наглядности программ, размеров кода, отладки и их переносимости.

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

Программирование на Ассемблере требует знаний всех ресурсов микроконтроллера. Программа, написанная на Ассемблере, не всегда наглядна, разобраться в коде достаточно сложно, при использовании микроконтроллеров с RISC-архитектурой возникают проблемы с программированием сложных операций, таких, как умножение и деление, с обработкой структур данных.

Размер кода. При использовании всех возможностей языка Си программа может быть очень компактной, однако, если сравнивать откомпилированные коды, оценки могут измениться. Код, написанный на Ассемблере, минимален по размеру и оптимизирован под конкретную задачу, что позволяет получить высокую скорость работы программы. Компилятор же оперирует фрагментами кода по общим правилам. Так, в примере со светодиодами в начале работы программы 8.1 обнуляются все регистры микроконтроллера и оперативная память SRAM, при входе в процедуру прерывания регистры сохраняются в стеке, а затем восстанавливаются при выходе. Однако в приложении работа с памятью не предусмотрена – используется всего лишь несколько регистров.

Отладка. Если программа пишется на языке высокого уровня, а отлаживать предполагается откомпилированный код, то весь процесс может занять больше времени, чем написание и отладка программы на Ассемблере. Вместе с тем написание и отладка на языке Си программ, ориентированных в большей степени на обработку данных, проще, чем при использовании Ассемблера.

Переносимость. Изменение частоты синхронизации микроконтроллеров, очевидно, влияет на длительность выполнения процедур. Если время выполнения должно остаться неизменным (в нашем случае это время включения светодиода), потребуется вносить изменения в программу на Ассемблере, заново пересчитывая коэффициенты в циклах задержки. В программе на Си необходимо только заменить частоту в конфигурации проекта и компилятор пересчитает все автоматически, что, безусловно, проще.

Учитывая, что откомпилированный код всегда больше исходного, написанного на Ассемблере, и принимая невозможность простой его оптимизации, можно сделать выводы о предпочтении того или иного языка программирования в зависимости от сложности и направленности задачи, наличия средств отладки, доступного размера памяти микроконтроллера, требуемого быстродействия процедур, сроков проектирования и т. д.

В заключение приведем ряд рекомендаций по написанию программ на языке Си для микроконтроллеров. Для уменьшения размера программного кода рекомендуется:

–    компилировать с оптимизацией по размеру;

–     использовать локальные переменные, а не глобальные, так как первые хранятся в регистрах, а вторые – в ОЗУ;

–       использовать по возможности беззнаковые типы данных меньшего размера;

–      если глобальная переменная используется только в одной функции, она должна быть объявлена как Static,

–    использовать конструкцию for (;;) для бесконечных циклов;

–     использовать циклы с декрементом и конструкцию {} while {выражение)’,

–     выполнять доступ в память непосредственно, не используя указатели;

–    использовать макросы вместо функций для подзадач, компилируемых в две-три команды Ассемблера.

Для уменьшения требований к памяти SRAM следует:

–     константы и литералы располагать в памяти программ, объявляя их с помощью директивы Flash\

–     избегать объявления глобальных переменных, если они на самом деле локальные, так как последние размещаются динамически и убираются из памяти, когда выходят из зоны видимости;

–      правильно оценивать размер программного стека (Data Stack Size), который необходимо указывать в настройках проекта {Project;Configure, закладка CCompilier).

Приложения П1. Обозначения регистров ввода;вывода

Имя регистра

Адрес I;O

Назначение

ACSR, Analog Comparator

$08

Регистр управления и

Control and Status Register

 

состояния аналогового компаратора

DDRA, Data Direction Register,

$1A

Регистр направления

Port A

 

данных порта А

DDRB, Data Direction Register,

$17

Регистр направления

Port В

 

данных порта В

DDRC, Data Direction Register,

$14

Регистр направления

Port С

 

данных порта С

DDRD, Data Direction Register,

$11

Регистр направления

PortD

 

данных порта D

EEARH, EEPROM Address

$1F

Регистр адреса

Register High Byte

 

EEPROM, старший байт

EEARL, EEPROM Register

$1E

Регистр адреса

Address Register Low Byte

EEPROM, младший

 

байт

EECR, EEPROM Control Regis

$1C

Регистр управления

ter

 

EEPROM

EEDR, EEPROM Data Register

$1D

Регистр данных

 

EEPROM

GIFR, General Interrupt Flag

$3A

Общий регистр флагов

Register

 

прерываний

GIMSK, General Interrupt Mask

$3B

Общий регистр маски

Register

 

прерываний

ICRIH, T;Cl Input Capture

$25

Регистр захвата Т;С1,

Register High Byte

 

старший байт

ICRIL, T;Cl Input Capture Reg

$24

Регистр захвата Т;С 1,

ister Low Byte

 

младший байт

MCUCR, MCU General Control

$35

Регистр управления

Register

 

микроконтроллером

OCRl AH, T;Cl Output Com

$2B

Регистр сравнения А

pare Register A High Byte

 

Т;С1, старший байт

OCRl AL, T;Cl Output Com

$2A

Регистр сравнения А

pare Register A Low Byte

 

Т;С1, младший байт

Продолжение прилож. П1

Имя регистра

Адрес I;O

Назначение

0CR1BH, Т;С1 Output Com

$29

Регистр сравнения В T;Cl,

pare Register В High Byte

 

старший байт

OCRIBL, T;Cl Output Com

$28

Регистр сравнения В Т;С1,

pare Register В Low Byte

 

младший байт

PINA, Input Pins, Port A

$19

Выводы порта А

PINB, Input Pins, Port В

$16

Выводы порта В

PINC, Input Pins, Port С

$13

Выводы порта С

PIND, Input Pins, Port D

$10

Выводы порта D

PORTA, Data Register, Port A

$1B

Регистр данных порта А

PORTB, Data Register, Port В

$18

Регистр данных порта В

PORTC, Data Register, Port С

$15

Регистр данных порта С

PORTD, Data Register, Port D

$12

Регистр данных порта D

SPCR, SPI Control Register

$0D

Регистр управления SPI

SPDR, I;O Data Register

$0F

Регистр данных SPI

SPH, Stack Pointer High

$3E

Старший байт указателя стека

SPL, Stack Pointer Low

$3D

Младший байт указателя стека

SPSR, SPI Status Register

$0E

Регистр состояния SPI

SREG, Status Register

$3F

Регистр состояния процессора

TCCRO, T;CO Control

$33

Регистр управления тай

Register

 

мера;счетчика ТО

TCCRIA, T;Cl Control

$2F

Регистр управления А

Register A

 

таймера Т;С1

TCCRIB, T;Cl Control

$2E

Регистр управления В

Register В

 

таймера Т;С1

TCNTO, Timer;CounterO

$32

Счетный регистр тайме

(8 bit)

 

ра;счетчика 0

TCNTIH, T;Cl High Byte

$2D

Счетный регистр Т;С1, старший байт

TCNTIL, T;Cl Low Byte

$2C

Счетный регистр Т;С 1, младший байт

Окончание прилож. П1

Имя регистра

Адрес I;O

Назначение

TIFR, Т;С Interrupt Flag

$38

Регистр флагов прерыва

Register

 

ний от таймеров

TIMSK, Т;С Interrupt Mask

$39

Регистр маски прерыва

Register

 

ний от таймеров

UBRR, UART Baud Rate

$09

Регистр скорости переда

Register

 

чи UART

UCR, UART Control Register

$0A

Регистр управления UART

UDR, UART I;O Data Register

$0C

Регистр данных UART

USR, UART Status Register

SOB

Регистр состояния UART

WDTCR, Watchdog Control

$21

Регистр управления сто

Register

 

рожевым таймером

 

Оставить комментарий

микросхемы мощности Устройство импульсов питания пример приемника провода витков генератора выходе напряжение напряжения нагрузки радоэлектроника работы сигнал сигнала сигналов управления сопротивление усилитель усилителя усиления устройства схема теория транзистора транзисторов частоты