Отладка приложений

Отладка приложений

Популярность микроконтроллеров AVR привела к появлению на рынке огромного количества самых разнообразных средств отладочных средств. Среди продуктов сторонних разработчиков существуют как мощные дорогостоящие симуляторы типа Proteus, так и совершенно бесплатные на подобие VMLab. Фирменные внутрисхемные эмуляторы от Atmel (ISE40, ISE40, ISE200), работающие в IDE AVR Studio, вообще, позволяют вести отладку в реальном режиме времени. Все модели AVR последних поколений обязательно имеют в своем составе отладочные модули dW или JTAG. В их системе команд появилась даже инструкция программной точки останова break. Комплекты разработчика (AVR Dragon, AVR ONE и т.д.) для таких микроконтроллеров стали значительно проще и функциональней.

Симуляторы, эмуляторы и отладчики, безусловно, очень мощные и разносторонние инструменты. С их помощью можно сэкономить много времени сил при отыскании программных и аппаратных ошибок. Не уменьшая достоинств этого арсенала отладочных средств, все же нужно сказать и о двух недостатках. Это сложность использования   и цена. Именно поэтому “простые” методы отладки до сих пор остаются актуальными. Иногда для того чтобы убедится в работоспособности программы, легче вывести необходимый сигнал на светодиод на макетной плате, чем моделировать в симуляторе всю схему.

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

Пошаговый режим отладки

У AVR-микроконтроллеров существует одна важная особенность, которая позволяет реализовать пошаговый режим работы, что особенно удобно при отладке отдельных участков кода не критичных ко времени. Выполнение очередной команды будет происходить только после нажатия SB1, как показано на рис.1а.

Рис.1 Схема подключения кнопки при пошаговом режиме отладки

а – с помощью внешнего прерывания INT0

б – с помощью прерывания от аналогового компаратора

Кнопка подключена через фильтр для подавления дребезга контактов R1C1 к линии 2 порта D микроконтроллера. Сам же вывод по совместительству является еще и входом внешнего прерывания INT0. Если это прерывание будет разрешено и условием его генерации будет изменение состояния с лог.0 на лог.1 (по спаду), то нажатие SB1 приведет нас на подпрограмму обработчика прерывания service_INT0. При этом флаг прерывания INTF0 в регистре GIFR, как и флаг глобального разрешения прерываний I в SREG, будут сброшены на нуль. В нутрии обработчика находится цикл ожидания, в котором производится опрос PD2 до тех пор, пока на выводе будет установлен сначала высокий (кнопка отпущена), а затем низкий (кнопка нажата) логические уровни. Но последнее событие одновременно приведет к установке флага INTF0 (состояние INT0 изменилось с 1 на 0). После выхода из подпрограммы по команде reti прерывания снова окажутся разрешены, а так как INTF0 уже установлен, то процессор вновь уйдет на обработчик service_INT0, предварительно выполнив одну команду в тексте основной программы (аппаратная особенность AVR). Таким образом, каждое нажатие кнопки будет приводить к эмуляции режима пошаговой работы микроконтроллера.

.def temp = R16 .org 0 rjmp main ;вектор сброса rjmp service_INT0 ;вектор внешнего прерывания INT0 . main: cbi PORTD,PD2 ;настраиваем линию 2 порта D на ввод cbi DDRD,DDD2 ;отключаем внутреннее сопротивление ldi temp,1 << ISC01 ;выбираем условием прерывания INT0 out MCUCR,temp ;изменение на входе с лог. 1 на лог. 0 ldi temp,1 << INT0 ;разрешаем прерывание INT0 out GICR,temp sei ;глобальное разрешение прерываний . service_INT0: sbis PIND,PD2 ;ожидаем, пока не будет отпущена rjmp service_INT0 ;кнопка SB1 wait: sbic PIND,PD2 ;ожидаем, пока не будет нажата rjmp wait ;кнопка SB1 reti

Вести отладку с помощью прерывания INT0, конечно, наиболее удобно. Во всех моделях AVR оно имеет наивысший приоритет и будет обслуживаться в первую очередь. Но в большинстве случаев с тем же успехом можно использовать также INT1, INT2, INT3,…, PCINT1, PCINT2 и т.д. На схеме из рис.1б, например, показано, как в тех же целях применить встроенный компаратор. Кнопка SB1 подключена к инвертирующему входу AIN1. Резистор R1 создает на этом выводе смещение равное напряжению питания VCC. К неинвертирующему входу AIN0 приложено напряжение от внутреннего ИОН (для разных моделей 1.1…1.4 В). Нормально на выходе компаратора (читается через бит ACO в управляющем регистре ACSR) присутствует низкий логический уровень, поскольку UAIN0 < UAIN1. Как только происходит нажатие SB1, AIN1 соединяется с землей и на выходе установится высокий уровень напряжения. В этот момент будет установлен флаг ACI в ACSR, что приведет к возникновению прерывания (условием прерывания предварительно задается изменение состояние выхода с лог.0 на лог.1). В обработчике service_ANA_COMP производятся те же по смыслу действия, что и при обработке прерывания INT0.

.def temp = R16 .org 0 rjmp main ;вектор сброса . .org 0x10 rjmp service_ANA_COMP ;вектор прерывания от компаратора . main: cbi PORTD,PD7 ;настраиваем линию 7 порта D на ввод cbi DDRD,DDD7 ;отключаем внутреннее сопротивление ldi temp,(1<< ACBG)|(1<< ACIE)|(1<< ACIS1)|(1<< ACIS0) out ACSR,temp ;подключаем к AIN0 внутренний ИОН и ;разрешаем прерывания при изменении состояния выхода с 0 на 1 sei ;глобальное разрешение прерываний . service_ANA_COMP: sbic ACSR,ACO ;ожидаем, пока не будет отпущена rjmp service_ANA_COMP ;кнопка SB1 wait: sbis ACSR,ACO ;ожидаем, пока не будет нажата rjmp wait ;кнопка SB1 reti

Перейти к следующей части:


Категория: Микроконтроллеры
Метки:

Написать коментарий

*
= 5 + 9

Добавить изображение

Последние статьи