AVR. Учебный Курс. Отладка программ. Часть 3

Автор DI HALT
Опубликовано 30 мая 2010 
Рубрики: AVR. Учебный курс
Метки: , , ,

Метод 3. USART (Работа с последовательными интерфейсами)
Пожалуй самым популярным отладочным интерфейсом является все же USART. Во-первых, он поддерживается аппаратно почти всеми микроконтроллерами. Во-вторых, он прост в использовании и требует всего один/два сигнальных провода, а в третьих, для связи с компом не надо городить никаких специфичных девайсов. В худшем случае UART-USB или UART-RS232 конвертер на FT232RL или MAX232.

Пользоваться им проще простого — в любой момент, когда нам это захочется, мы берем и отправляем нужный байт по этому интерфейсу. При этом достаточно заранее его настроить — стандартная инициализация UART:

1
2
3
4
5
6
7
8
9
10
11
12
; Usart INIT
		.equ 	XTAL = 8000000 	
		.equ 	baudrate = 9600  
		.equ 	bauddivider = XTAL/(16*baudrate)-1
 
uart_init:	LDI 	R16, low(bauddivider)
		OUT 	UBRRL,R16
		LDI 	R16, high(bauddivider)
		OUT 	UBRRH,R16
 
		LDI 	R16,0
		OUT 	UCSRA, R16
1
2
3
; Прерывания запрещены, прием-передача разрешен.
	LDI 	R16, (1<<RXEN)|(1<<TXEN)|(0<<RXCIE)|(0<<TXCIE)|(0<<UDRIE)
	OUT 	UCSRB, R16

Маркеры
Всегда полезно знать где наша программа шляется в данный момент. Конечно, можно зажигать светодиодики, как в прошлом методе. Но когда точек много, то выводов не напасешься на эту затею. Или затрахаешься перекомпилировать. Проще всего натыкать в код маркеров, наступая на которые наш МК будет отрыгивать в терминал свое местоположение. Терминальный клиент будет писать лог и ничего не проморгаешь.
Читать полностью

Комментариев (18)

AVR. Учебный Курс. Отладка программ. Часть 2

Автор DI HALT
Опубликовано 20 Апр 2010 
Рубрики: AVR. Учебный курс
Метки: ,

Метод 2. Моргалки (Работа портами Ввода-вывода)

Трассировка и аналитика это все замечательно, но когда мы начинаем отлаживать что то внешнее, то тут трассировка нам поможет мало. Т.к. глючить может не внутри, а снаружи.

Либо у нас будет не глюк, а банальное непонимание ситуации. Фразу из даташита, например, неправильно перевел или глаз замылился. Что то забыл или не туда припаял. Да мало ли как можно накосячить.

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

Причем нам не обязательно точно следить за тем, что там происходит покомандно — это мы или трейсом или туплением отладим. Интересней знать куда ушла прога.

Самым простым методом тут будет отладочный вывод. Все просто — мы берем и определяем один из выводов под отладку. Причем даже если у нас какая-нибудь крошечная тинька и все выводы расписаны буквально по нескольку раз, то все равно можно найти один лишний вывод — достаточно закомментить код который его использует, но в данный момент его правильность нас не интересует.

А у вывода может быть три состояния - Hi, Lo и Hi-Z. Так что рекомендую скреативить такой вот пробничек:

Тогда если у нас Hi-Z то будут тускленько гореть оба диода. Ну, а на соответствующий уровень свой диод в гордом одиночестве.

А в код пихаем дебажные секции вида:

1
2
3
;Set Hi
	SBI	DEBUGDDR,DEBUG
	SBI	DEBUGPORT,DEBUG
1
2
3
;Set Lo
	SBI	DEBUGDDR,DEBUG
	CBI	DEBUGPORT,DEBUG
1
2
3
;Set Hi-Z
	CBI	DEBUGDDR,DEBUG
	CBI	DEBUGPORT,DEBUG

Можно их в макросы завернуть. Удобней будет.

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

Однако если у нас надо отследить последовательность, то мы можем и не успеть разглядеть переимгивание светиков. Но никто не мешает воткнуть в код после смены состояния дебагвывода тупую задержку вида:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
	PUSHF			; Макрос сохранения флагов
	PUSH 	R16
	PUSH	R17
	PUSH	R18
 
	LDI	R16,255	; Грузим три байта
	LDI	R17,255	; Нашей выдержки
	LDI	R18,255
 
Dloop:	SUBI	R16,1		; Вычитаем 1
	SBCI	R17,0		; Вычитаем только С
	SBCI	R18,0		; Вычитаем только С
 
	BRCC	DLoop 		; Если нет переноса - переход
 
	POP	R18
	POP	R17
	POP	R16
	POPF			; Макрос восстановления флагов

Оформляется как прерывание для того, чтобы иметь минимальное влияние на код. Можно тоже оформить в виде макроса и втыкать его одной строчкой. Запрет прерываний опционально.

Либо вставлять затуп:

1
	RJMP 	PC

Контроллер на этой команде встанет и дальше никуда не пойдет (правда если включен вачдог, то он ребутнется по вачдогу).

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

1
2
3
4
5
6
;STOP DB_BTN
	CBI	DEBUGDDR,DEBUG
	SBI	DEBUGPORT,DEBUG	
 
	SBIC	DEBUGPIN,DEBUG
	RJMP	PC-1

Можно просто наставить таких кнопочных чекпоинтов. И пускать программу по ним своей могучей волевой рукой. А пока программа тупит на задержках или ожиданиях кнопок, можно спокойно замерить напряжения/пощупать лог уровни, состояние других выводов, да просто подумать.

Разумеется, если в схеме уже присутствуют светодиоды и кнопки, то и пробник тут не нужен - обойдемся имеющимися средствами — переназначив их на время отладки конкретного участка.

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

Комментариев (32)

AVR. Учебный Курс. Отладка программ. Часть 1

Автор DI HALT
Опубликовано 13 Апр 2010 
Рубрики: AVR. Учебный курс
Метки: , ,

У каждого случалась такая ситуация — программа вроде бы написана, даже компилится, но не работает. Почему не работает? Дак все же просто — в ней есть лажа!

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

В очередном цикле статей я постараюсь описать как можно более подробно методы, применяемые при отладке.

Метод 0. Тупление в код (Аналитический)
К моему великому удивлению, данный метод является наиболее популярным в народе и, а у начинающих порой единственным.
Видимо сказывается засилье всяких высокоуровневых языков вроде ПОХАПЭ или Си, где такое вполне может и проканать. Там да, можно пофтыкать несколько минут в исходник, глядишь да найдешь где накосячил.

И по наивности, не иначе, новички пытаются этот метод применить к своим ассемблерным программам.

И вот тут мозг срывает напрочь. С непривычки голова пухнет от попытки удержать в памяти состояние регистров, флагов, попыток просчитать куда пойдет ядро на следующем шаге.

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

Хотя я, в свое время, изучал ассемблер вообще без компа — не было его у меня. Тетрадка в клеточку, команды i8008 в столбик. А потом и Z80 с его божественным ассемблером. И опять без отладчиков, аналитически. Ляпота! Но вот когда я сел за ассемблер 80С51, в первую же очередь я нашел нормальную IDE с эмуляцией — Keil uVision. А эра х86 прошла под знаменем Borland Turbo Debugger и TASM. Когда моя первая 128 байтная интруха полыхнула по экрану пиксельным пламенем клеточного автомата… да ощущения были еще те. Где то ее сорцы валяются, надо поискать.

В написании может быть, но вот в отладке нифига подобного. Так как нечего тут думать. Ассемблер это как лопата — берешь и копаешь, а не думаешь как там поршни и трансмиссия в экскаваторе крутится.

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

Под каждый стиль написания кода свои инструменты отладки. Поэтому переходим к другому методу. Читать полностью

Комментариев (30)

Логический анализатор LOGIC-U PLUS

Автор vvzvlad
Опубликовано 15 марта 2010 
Рубрики: Инструмент
Метки: ,

Логический анализатор это прибор позволяющий считывать и расшифровывать цифровые данные. Вроде осциллографа, но работает только с логическими уровнями (есть уровень, нет уровня) и умеет обрабатывать множество каналов сразу (обычно от 8ми). Хороший анализатор умеет считывать поток данных и обрабатывать его, расписывая по пакетам передачи, выделять стартовые, стоповые, адресные байты. В общем, он представляет инфу летящую по разным шина в удобном для восприятия виде. Очень полезный инструмент при отладке цифровых устройств.

Привезли мне это чудо, доставили прям до двери, в простом бумажном пакете с марками украины. Коробочка маленькая, размером с две ладони. Читать полностью

Комментариев (7)

AVR. Учебный Курс. Программирование на Си. Атомарные операции.

Автор DI HALT
Опубликовано 20 Дек 2009 
Рубрики: AVR. Учебный курс
Метки: , , ,

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

Сейчас я одним маленьким примерчиком это утверждение зарою в землю, а сверху накрою могильной плитой.

Итак, есть у нас такой код (не ищите в нем практического смысла, я его просто как пример работы с разными операндами написал):

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
volatile char flag_byte; 	
/*Просто флаговая переменная, на разные случаи жизни. Разные события там 
выставляют флажки, опираясь на которые потом работает логика программы. 
Один из способов организации псевдомногозадачности. Когда у нас главный цикл 
анализирует флажки и делает переходы на подпрограммы, а вызов подпрограмм 
осуществляется не напрямую, а установкой соответствющих флажков. Своего 
рода диспетчер переходов. О такой архитектуре я скоро расскажу)*/
 
ISR (USART_RXC_vect)	// Обработчик прерывания, самый обычный.
{
flag_byte|=1<<rcv_buff;
...
...
}
 
int main (void)		// Главная программа
{
INIT_ALL();
SEI();
...
...
...
TCCR0A  	|=1<<WGM01;
...
flag_byte 	|=1<<options;
...
PORTB 	&=~(2<<1);
...
}

Читать полностью

Комментариев (70)

Отладочная плата PinBoard v1.0

Автор DI HALT
Опубликовано 03 Сен 2009 
Рубрики: Готовые устройства
Метки: , , ,

На данный момент данная версия 1.0 снята с производства. Перейти к статьие о версиии 1.1

Комментариев (256)

Внутрисхемная отладка AVR через JTAG ICE

Автор DI HALT
Опубликовано 28 июля 2009 
Рубрики: AVR. Учебный курс, Готовые устройства
Метки: , , ,

Одним из самых мощных отладочных инструментов в микроконтроллерной среде является JTAG - внутрисхемный отладчик.

Суть тут в чем — через JTAG адаптер микроконтроллер подключается напрямую к среде программирвания и отладки, например к AVR Studio. После чего микроконтроллер полностью подчиняется студии и дальше шагу не может ступить без ее разрешения. Доступна становится пошаговое выполнение кода, просмотр/изменение всех регистров, работа со всей периферией и все это в реальном микроконтроллере, а не в программной эмуляции. Можно ставить точки останова (breakpoints) на разные события — для ICE1 три штуки. В общем, сказка, а не инструмент.

К сожалению в AVR микроконтроллерах JTAG доступен далеко не везде, как правило контроллеры с числом ног меньше 40 и обьемом памяти меньше 16КБ такого удовольствия лишены (там, правда, часто бывает debugWire, но на коленке сделать его адаптер еще никому не удалось, а фирменный JTAG ICEII или AVRDragon стоят довольно больших денег). А поскольку у меня в ходу в основном Tiny2313, Mega8, Mega8535 и прочая мелочевка, то мне JTAG что собаке пятая нога — не поддерживается он в этих МК.

Тем не менее, поддашвись многочисленным просьбам, я сварганил этот агрегат и сейчас покажу вам как им пользоваться. Читать полностью

Комментариев (279)

Универсальная отладочная плата PinBoard v1.0

Автор DI HALT
Опубликовано 03 июля 2009 
Рубрики: Радиолюбительские Технологии
Метки: , ,

Задумал я тут одну универсальную отладочную платку на которой мне бы удобно было разные учебные примеры показывать. Чтобы все сразу было под рукой для экспериментов. Вот посидел вечером, получилось примерно следующее

Читать полностью

Комментариев (50)

AVR. Учебный Курс. Оценка загрузки контроллера.

Автор DI HALT
Опубликовано 18 июня 2009 
Рубрики: AVR. Учебный курс
Метки: , , , ,

Как оценить загруженность микроконтроллера? С памятью все понятно — размеры занимаемого кода и оперативной памяти показывает компилятор, а что делать с процессорным временем? Конечно, в линейной программе можно взять и посчитать время выполнения каждой процедуры и станет ясно успеет микроконтроллер выполнить все на него повешанное или слажает в каком-нибудь критичном месте.
Куда сложней оценивать время в кооперативной операционной системе реального времени. Тут задачка получается нетривиальной — у нас куча процессов скачут через диспетчер. В ходе программирования задачи навешиваешь одну за другой, как бусинки на нить — каждый процесс обработки чего либо составляет подобную цепочку, а всего их может быть просто тьма. Ядро же у контроллера всего одно, а значит выполнять можно всего одну задачу за раз и если у нас в диспетчере скопится много критичных ко времени процессов (вообще их лучше развешивать на прерывания, но бывает и прерываний на всех не напасешься), то возможно либо переполнение очереди диспетчера, либо превышение времени ожидания, что тоже не праздник.
Самое западло в том, что умозрительно отлаживать такие вещи довольно сложно. Единственный вариант — рисовать временные диаграммы запуска каждой задачи и смотреть где у нас узкие места. Еще можно попробовать в AVR Studio поставить Break Point на переполнение диспетчера, но студия не сэмулирует всю ту прорву периферии, а в пошаговой отладке этого не увидеть — да и момент надо подобрать так, чтобы все навалилось.

В один момент мне пришла в голову одна идея — а почему бы не заставить рисовать временные диаграммы работы задач сам контроллер? Это же просто! Берем и в диспетчере, перед вызовом задачи выставляем бит порта в 1. А когда диспетчер задач опустошается полностью, то есть выполняется переход на Idle — сбрасываем бит в 0. В результате, у нас на выходе будет подобие ШИМ. Если постоянно крутится Idle — будут нули перманентно. Если же проц в поте лица гонит через себя непрерывно код, то будут высокий уровнь сплошняком. А если все прерывисто — что то ШИМообразное. Причем чем больше загрузка процессора тем выше заполнение. Можно поставить интегрирующую RC цепочку и получим аналоговый сигнал. Хоть на стрелочный индикатор заводи :). Сказано — сделано.
Читать полностью

Комментариев (10)

Радиомодули HopeRF HM-R433 и HM-T433. Проблемы и решения

Автор DI HALT
Опубликовано 04 Ноя 2008 
Рубрики: Начинающим
Метки: , , , , ,

При первоначальных испытаниях сея железка показала себя с лучшей стороны, но вот на практике вылезли не просто баги, а прям гигантские тараканы убийцы. Казалось бы, чему там работать не так? А, как оказалось, есть чему. Точнее это не баги, а особенности, о которых производитель самым подлым образом умолчал в даташитах. Знай я о них я бы еще подумал стоит ли их покупать. Итак:

Несущая
Приемник ловит изменение несущей, которую генерирует передатчик. А если не будет передатчика, что будет ловить приемник? По идее не должен ловить ничего, а что на практике? А на практике дикий срач!!! Натурально белый шум по всему диапазону от 0 до 255. Фигасе бага, да? Но ладно, хрен с этим белым шумом, его, в конце концов, можно фильтровать, отслеживать в нем наличие чего либо разумного и лишь после начинать прием.

Ждущий режим
У передатчика, к моему, а также ряда внимательных читателей, удивлению нет входа Enable. У приемника то есть. Редкостный бред, особенно ввиду того, что спустя 70mS простоя на линии DATA передатчик впадает в спячку и… правильно, отрубает несущую - на выходе приемника начинается в этот момент жуткий срач. Так что либо шли данные непрерывным потоком, либо перед каждой посылкой шли идентификационный пакет. А еще не забыв предупредить приемник о том, что передача закончена и дальше ловить нечего.

Совместная работа
Тут все просто, два передатчика одновременно работать не могут. От слова совсем. Либо по отдельности, либо никак. Это было ожидаемо и это надо учитывать.

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

Читать полностью

Комментариев (28)

Отладочный пульт

Автор DI HALT
Опубликовано 12 Сен 2008 
Рубрики: Новости
Метки: , , , , , , ,

Печатная плата
Печатная плата
Возникла у меня необходимость забабахать себе девайсину, чтобы можно было с его помощью раздавать байты по i2c и UART, а также принимать байты по этим же протоколам и выдавать на экранчик. Как по одному, так и пачками. Этакий дебаггер.

Ну а чо, сказано сделано. Воткнул ATMega8535 — первая которая под руку подвернулась из многоногих. Вывел все что только можно наружу, присобачил небольшую клавиатурную матрицу 4х4 и LCD экранчик. Экранчик мелкий WH0802A 8х2 символа, но уж какой был. Других у нас в продаже не встречал, а под заказ везти лень. Да и, думаю, там и не надо больше.

А раз уж пошла такая пьянка, то до кучи вывел наружу пару каналов ШИМ, да пару входов АЦП. Ну и SPI заодно — гулять так гулять. Там же можно и Dallas 1-wire проткол организовать, приделать частотомер, индикатор сигнала, вольтмер и вообще можно много чего наворотить, было бы желание. Опять же, линий на вход/выход получается дофига, так что из нее можно сделать головной блок умного дома или контроллер чего нибудь.

Корпус взял халявный, PAC-TEC‘овский который намутил года два назад. Вот и пригодится коробочка :) Надо сказать, PAC-TEC делает просто изумительные коробки. Не чета тому говну, что продается в наших радиомагазинах. Не скрипят, не люфтят, крепко сбиты, ладно скроены и выглядят круто. Где бы их еще продавали у нас.

Пока только плату развел, еще некоторых деталей не хватает. На днях вытравлю плату, соберу и буду программировать. Вот тогда будет вам и примеры живого кода и подробное описание SPI, i2c, UART, клавиатура и LCD . Кстати, обратите внимание как легко матрицировать обычные тактовые кнопки. А все благодаря тому, что у них четыре попарно соединенных вывода.

Пока же, раз все еще в виде чертежа, набрасывайте в комменты свои идеи по поводу фич будущего девайса.

Комментариев (30)

Система моделирования ISIS Proteus. Быстрый старт.

Автор DI HALT
Опубликовано 07 Сен 2008 
Рубрики: Начинающим
Метки: , , , ,

Собранная виртуальная схема
Собранная виртуальная схема

Вообще существует масса систем моделирования электронных схем. Из всех, что я видел мне наиболее понравились Multisim и ISIS Proteus. Multisim обладает очень удобным интерфейсом, и в нем удобно отлаживать аналоговые девайсы, т.к. он позволяет использовать виртуальные (т.е. параметры ты указываешь сам) транзисторы и усилители, но совершенно не поддерживает сложные системы, вроде микроконтроллеров или разного рода драйверов. Точнее поддерживает, но крайне вяло. Только недавно в нем появилась поддержка древних АТ89C2051 и нескольких PIC‘ов

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

Читать полностью

Комментариев (93)

AVR Studio и HAPSim

Автор DI HALT
Опубликовано 19 июля 2008 
Рубрики: AVR. Учебный курс
Метки: , ,

Раз уж пошел разговор об отладке AVR Studio, то стоит упомянуть про ряд примочек для нее. Одной из самых интересных примочек является небольшая программка - HAPSim. Программка почти не известна, по крайней мере я лишь пару раз слышал упоминание о ней на форуме. Прога не слишком стабильна, иногда работает не так как надо, а еще ей не хватает многих эргономических моментов, но, надеюсь, в следующий версиях это будет исправлено.

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

Не богато, но вполне хватает для простенькой отладки. Особо радует терминал :) Можно по быстрому отлаживать без заливки прошивки в МК. Читать полностью

Комментариев (42)

Отладочная плата PinBoard v1.1

Автор DI HALT
Опубликовано 16 июля 2008 
Рубрики: AVR. Учебный курс, Готовые устройства
Метки: , ,

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

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

Что такое демоплата? Демоплата — это универсальный полигон для экспериментов. Идеальное средство для быстрого старта. На ней смонтирован микроконтроллер, а также вся необходимая обвязка для его работа. Плюс разные полуфабрикаты, позволяющие облегчить эксперименты.

Готовое устройство, где все уже подключено, разведено как надо. Купил - включил - работай. Риск что-либо сжечь в ходе экспериментов снижен максимально. Где нет нужды парить мозг проблемой “чем прошить”, “как запустить”, “Как правильно все подключить”. Первые шаги делаются быстро и легко.
А потом, когда ты уже освоишься с контроллером, то запросто можно посмотреть как сделано на демоплате и перенести это решение в свое устройство.

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

Плюс ко всему, в исходном варианте EasyAVR5 идет голой, только плата с простейшей периферией вроде светодиодов и кнопочек, а LCD дисплеи модули расширения надо покупать отдельно и стоят они тоже негуманно. Основную же стоимость добавляет многослойная плата с кучей джамперов и переключателей, позволяющая витиевато все это коммутировать.

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

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

Вот фичи которые мне удалось реализовать: Читать полностью

Комментариев (171)


Материалы сайта являются авторскими. Копирование и публикация материалов без активной ссылки на первоисточник запрещено.

Реклама: