AVR. Учебный Курс. Отладка программ. Часть 3
Автор DI HALT
Опубликовано 30 мая 2010
Рубрики: AVR. Учебный курс
Метки: Assembler, 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 |
Маркеры
Всегда полезно знать где наша программа шляется в данный момент. Конечно, можно зажигать светодиодики, как в прошлом методе. Но когда точек много, то выводов не напасешься на эту затею. Или затрахаешься перекомпилировать. Проще всего натыкать в код маркеров, наступая на которые наш МК будет отрыгивать в терминал свое местоположение. Терминальный клиент будет писать лог и ничего не проморгаешь.
Читать полностью
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 |
Можно просто наставить таких кнопочных чекпоинтов. И пускать программу по ним своей могучей волевой рукой. А пока программа тупит на задержках или ожиданиях кнопок, можно спокойно замерить напряжения/пощупать лог уровни, состояние других выводов, да просто подумать.
Разумеется, если в схеме уже присутствуют светодиоды и кнопки, то и пробник тут не нужен - обойдемся имеющимися средствами — переназначив их на время отладки конкретного участка.
Правда в случаях отладки асинхронных устройств, работающих на четких временных выдержках данная затея может не прокатить, но для них есть другие варианты, о них позже.
AVR. Учебный Курс. Отладка программ. Часть 1
Автор DI HALT
Опубликовано 13 Апр 2010
Рубрики: AVR. Учебный курс
Метки: AVR, Отладка, Трюки
У каждого случалась такая ситуация — программа вроде бы написана, даже компилится, но не работает. Почему не работает? Дак все же просто — в ней есть лажа!
Процесс избавления программ от лажи называется, соответственно, отлаживанием. И часто этот процесс длится куда дольше разработки, особенно в хитрых случаях, с привлечением внешней периферии.
В очередном цикле статей я постараюсь описать как можно более подробно методы, применяемые при отладке.
Метод 0. Тупление в код (Аналитический)
К моему великому удивлению, данный метод является наиболее популярным в народе и, а у начинающих порой единственным.
Видимо сказывается засилье всяких высокоуровневых языков вроде ПОХАПЭ или Си, где такое вполне может и проканать. Там да, можно пофтыкать несколько минут в исходник, глядишь да найдешь где накосячил.
И по наивности, не иначе, новички пытаются этот метод применить к своим ассемблерным программам.
И вот тут мозг срывает напрочь. С непривычки голова пухнет от попытки удержать в памяти состояние регистров, флагов, попыток просчитать куда пойдет ядро на следующем шаге.
Из этого же лезет народ убежденность в том, что ассемблерные программы сложны в написании и отладке.
Хотя я, в свое время, изучал ассемблер вообще без компа — не было его у меня. Тетрадка в клеточку, команды i8008 в столбик. А потом и Z80 с его божественным ассемблером. И опять без отладчиков, аналитически. Ляпота! Но вот когда я сел за ассемблер 80С51, в первую же очередь я нашел нормальную IDE с эмуляцией — Keil uVision. А эра х86 прошла под знаменем Borland Turbo Debugger и TASM. Когда моя первая 128 байтная интруха полыхнула по экрану пиксельным пламенем клеточного автомата… да ощущения были еще те. Где то ее сорцы валяются, надо поискать.
В написании может быть, но вот в отладке нифига подобного. Так как нечего тут думать. Ассемблер это как лопата — берешь и копаешь, а не думаешь как там поршни и трансмиссия в экскаваторе крутится.
А вот когда уже есть некоторый опыт ковыряния с ассемблером, когда всякие ветвления-переходы-адресации разруливаешь в уме, вот тогда аналитическим тупняком можно сходу искать баги. Но это для мастеров низкоуровневого кунг-фу. Поначалу, быстрей и проще пройтись трейсером по коду.
Под каждый стиль написания кода свои инструменты отладки. Поэтому переходим к другому методу. Читать полностью
Логический анализатор LOGIC-U PLUS
Автор vvzvlad
Опубликовано 15 марта 2010
Рубрики: Инструмент
Метки: Отладка, Прибор
Логический анализатор это прибор позволяющий считывать и расшифровывать цифровые данные. Вроде осциллографа, но работает только с логическими уровнями (есть уровень, нет уровня) и умеет обрабатывать множество каналов сразу (обычно от 8ми). Хороший анализатор умеет считывать поток данных и обрабатывать его, расписывая по пакетам передачи, выделять стартовые, стоповые, адресные байты. В общем, он представляет инфу летящую по разным шина в удобном для восприятия виде. Очень полезный инструмент при отладке цифровых устройств.
![]() |
Привезли мне это чудо, доставили прям до двери, в простом бумажном пакете с марками украины. Коробочка маленькая, размером с две ладони. Читать полностью
AVR. Учебный Курс. Программирование на Си. Атомарные операции.
Автор DI HALT
Опубликовано 20 Дек 2009
Рубрики: AVR. Учебный курс
Метки: AVR, C, Отладка, Язык Си
Не раз и не два сталкивался с утверждением, что изучать ассемблер микроконтроллера это всего лишь пустая трата времени, дескать все можно сделать на Си, а если сильно надо то комманды можно и в даташите поглядеть.
Сейчас я одним маленьким примерчиком это утверждение зарою в землю, а сверху накрою могильной плитой.
Итак, есть у нас такой код (не ищите в нем практического смысла, я его просто как пример работы с разными операндами написал):
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); ... } |
Отладочная плата PinBoard v1.0
Автор DI HALT
Опубликовано 03 Сен 2009
Рубрики: Готовые устройства
Метки: AVR, PinBoard, Коммерческая разработка, Отладка
На данный момент данная версия 1.0 снята с производства. Перейти к статьие о версиии 1.1
Внутрисхемная отладка AVR через JTAG ICE
Автор DI HALT
Опубликовано 28 июля 2009
Рубрики: AVR. Учебный курс, Готовые устройства
Метки: AVR, JTAG, Интерфейс, Отладка
Одним из самых мощных отладочных инструментов в микроконтроллерной среде является JTAG - внутрисхемный отладчик.
Суть тут в чем — через JTAG адаптер микроконтроллер подключается напрямую к среде программирвания и отладки, например к AVR Studio. После чего микроконтроллер полностью подчиняется студии и дальше шагу не может ступить без ее разрешения. Доступна становится пошаговое выполнение кода, просмотр/изменение всех регистров, работа со всей периферией и все это в реальном микроконтроллере, а не в программной эмуляции. Можно ставить точки останова (breakpoints) на разные события — для ICE1 три штуки. В общем, сказка, а не инструмент.
К сожалению в AVR микроконтроллерах JTAG доступен далеко не везде, как правило контроллеры с числом ног меньше 40 и обьемом памяти меньше 16КБ такого удовольствия лишены (там, правда, часто бывает debugWire, но на коленке сделать его адаптер еще никому не удалось, а фирменный JTAG ICEII или AVRDragon стоят довольно больших денег). А поскольку у меня в ходу в основном Tiny2313, Mega8, Mega8535 и прочая мелочевка, то мне JTAG что собаке пятая нога — не поддерживается он в этих МК.
Тем не менее, поддашвись многочисленным просьбам, я сварганил этот агрегат и сейчас покажу вам как им пользоваться. Читать полностью
Универсальная отладочная плата PinBoard v1.0
Автор DI HALT
Опубликовано 03 июля 2009
Рубрики: Радиолюбительские Технологии
Метки: AVR, Отладка, Печатная плата
Задумал я тут одну универсальную отладочную платку на которой мне бы удобно было разные учебные примеры показывать. Чтобы все сразу было под рукой для экспериментов. Вот посидел вечером, получилось примерно следующее
AVR. Учебный Курс. Оценка загрузки контроллера.
Автор DI HALT
Опубликовано 18 июня 2009
Рубрики: AVR. Учебный курс
Метки: AVR, RTOS, Отладка, Трюки, ЦАП
Как оценить загруженность микроконтроллера? С памятью все понятно — размеры занимаемого кода и оперативной памяти показывает компилятор, а что делать с процессорным временем? Конечно, в линейной программе можно взять и посчитать время выполнения каждой процедуры и станет ясно успеет микроконтроллер выполнить все на него повешанное или слажает в каком-нибудь критичном месте.
Куда сложней оценивать время в кооперативной операционной системе реального времени. Тут задачка получается нетривиальной — у нас куча процессов скачут через диспетчер. В ходе программирования задачи навешиваешь одну за другой, как бусинки на нить — каждый процесс обработки чего либо составляет подобную цепочку, а всего их может быть просто тьма. Ядро же у контроллера всего одно, а значит выполнять можно всего одну задачу за раз и если у нас в диспетчере скопится много критичных ко времени процессов (вообще их лучше развешивать на прерывания, но бывает и прерываний на всех не напасешься), то возможно либо переполнение очереди диспетчера, либо превышение времени ожидания, что тоже не праздник.
Самое западло в том, что умозрительно отлаживать такие вещи довольно сложно. Единственный вариант — рисовать временные диаграммы запуска каждой задачи и смотреть где у нас узкие места. Еще можно попробовать в AVR Studio поставить Break Point на переполнение диспетчера, но студия не сэмулирует всю ту прорву периферии, а в пошаговой отладке этого не увидеть — да и момент надо подобрать так, чтобы все навалилось.
В один момент мне пришла в голову одна идея — а почему бы не заставить рисовать временные диаграммы работы задач сам контроллер? Это же просто! Берем и в диспетчере, перед вызовом задачи выставляем бит порта в 1. А когда диспетчер задач опустошается полностью, то есть выполняется переход на Idle — сбрасываем бит в 0. В результате, у нас на выходе будет подобие ШИМ. Если постоянно крутится Idle — будут нули перманентно. Если же проц в поте лица гонит через себя непрерывно код, то будут высокий уровнь сплошняком. А если все прерывисто — что то ШИМообразное. Причем чем больше загрузка процессора тем выше заполнение. Можно поставить интегрирующую RC цепочку и получим аналоговый сигнал. Хоть на стрелочный индикатор заводи :). Сказано — сделано.
Читать полностью
Радиомодули HopeRF HM-R433 и HM-T433. Проблемы и решения
Автор DI HALT
Опубликовано 04 Ноя 2008
Рубрики: Начинающим
Метки: RS232, UART, Интерфейс, Модуль, Отладка, Радиопередача
Несущая
Приемник ловит изменение несущей, которую генерирует передатчик. А если не будет передатчика, что будет ловить приемник? По идее не должен ловить ничего, а что на практике? А на практике дикий срач!!! Натурально белый шум по всему диапазону от 0 до 255. Фигасе бага, да? Но ладно, хрен с этим белым шумом, его, в конце концов, можно фильтровать, отслеживать в нем наличие чего либо разумного и лишь после начинать прием.
Ждущий режим
У передатчика, к моему, а также ряда внимательных читателей, удивлению нет входа Enable. У приемника то есть. Редкостный бред, особенно ввиду того, что спустя 70mS простоя на линии DATA передатчик впадает в спячку и… правильно, отрубает несущую - на выходе приемника начинается в этот момент жуткий срач. Так что либо шли данные непрерывным потоком, либо перед каждой посылкой шли идентификационный пакет. А еще не забыв предупредить приемник о том, что передача закончена и дальше ловить нечего.
Совместная работа
Тут все просто, два передатчика одновременно работать не могут. От слова совсем. Либо по отдельности, либо никак. Это было ожидаемо и это надо учитывать.
Баги при передаче
Но что меня больше всего добило, так это баги. Если с первые три пункта можно учитывать и обрабатывать программно без лишних заморочек, то со последним уже все гораздо веселей.
Отладочный пульт
Автор DI HALT
Опубликовано 12 Сен 2008
Рубрики: Новости
Метки: i2c, RS232, UART, Клавиатура, Микроконтроллер, Отладка, Печатная плата, Умный дом
|
| Печатная плата |
Ну а чо, сказано сделано. Воткнул ATMega8535 — первая которая под руку подвернулась из многоногих. Вывел все что только можно наружу, присобачил небольшую клавиатурную матрицу 4х4 и LCD экранчик. Экранчик мелкий WH0802A 8х2 символа, но уж какой был. Других у нас в продаже не встречал, а под заказ везти лень. Да и, думаю, там и не надо больше.
А раз уж пошла такая пьянка, то до кучи вывел наружу пару каналов ШИМ, да пару входов АЦП. Ну и SPI заодно — гулять так гулять. Там же можно и Dallas 1-wire проткол организовать, приделать частотомер, индикатор сигнала, вольтмер и вообще можно много чего наворотить, было бы желание. Опять же, линий на вход/выход получается дофига, так что из нее можно сделать головной блок умного дома или контроллер чего нибудь.
Корпус взял халявный, PAC-TEC‘овский который намутил года два назад. Вот и пригодится коробочка :) Надо сказать, PAC-TEC делает просто изумительные коробки. Не чета тому говну, что продается в наших радиомагазинах. Не скрипят, не люфтят, крепко сбиты, ладно скроены и выглядят круто. Где бы их еще продавали у нас.
Пока только плату развел, еще некоторых деталей не хватает. На днях вытравлю плату, соберу и буду программировать. Вот тогда будет вам и примеры живого кода и подробное описание SPI, i2c, UART, клавиатура и LCD . Кстати, обратите внимание как легко матрицировать обычные тактовые кнопки. А все благодаря тому, что у них четыре попарно соединенных вывода.
Пока же, раз все еще в виде чертежа, набрасывайте в комменты свои идеи по поводу фич будущего девайса.
Система моделирования ISIS Proteus. Быстрый старт.
Автор DI HALT
Опубликовано 07 Сен 2008
Рубрики: Начинающим
Метки: Assembler, ISIS Proteus, MSC-51, Отладка, Софт
|
| Собранная виртуальная схема |
Вообще существует масса систем моделирования электронных схем. Из всех, что я видел мне наиболее понравились Multisim и ISIS Proteus. Multisim обладает очень удобным интерфейсом, и в нем удобно отлаживать аналоговые девайсы, т.к. он позволяет использовать виртуальные (т.е. параметры ты указываешь сам) транзисторы и усилители, но совершенно не поддерживает сложные системы, вроде микроконтроллеров или разного рода драйверов. Точнее поддерживает, но крайне вяло. Только недавно в нем появилась поддержка древних АТ89C2051 и нескольких PIC‘ов
Напротив, Proteus умеет замечательно работать с контроллерами, но ограничен своей библиотекой реальных элементов, поэтому без знания какая тебе именно деталь нужна ты там мало что сделаешь, а ещё обладает ну просто убожеским интерфейсом, однако это лучшая система моделирования, что я когда либо видел. А потому буду описывать именно её.
AVR Studio и HAPSim
Автор DI HALT
Опубликовано 19 июля 2008
Рубрики: AVR. Учебный курс
Метки: AVR Studio, Отладка, Софт
Раз уж пошел разговор об отладке AVR Studio, то стоит упомянуть про ряд примочек для нее. Одной из самых интересных примочек является небольшая программка - HAPSim. Программка почти не известна, по крайней мере я лишь пару раз слышал упоминание о ней на форуме. Прога не слишком стабильна, иногда работает не так как надо, а еще ей не хватает многих эргономических моментов, но, надеюсь, в следующий версиях это будет исправлено.
Итак, что делает Hapsim. Он всего лишь подцепляется к студии и в момент выполнения эмуляции программы может симулировать работу разных устройств, прицепленных на порты. Из доступных устройств есть:
- Кнопки. Как обычные, прижимающие к земле, так и трехвыводные, которые могут поставить как высокий, так и низкий уровень в зависимости от состояния
- LCD на базе HD44780
- Терминал (USART или I2C) с возможностью осуществить трансфер на комповый COM порт (сам не проверял, но заявлено в мануале)
- Клавиатурная матрица 4х4
- Блок светодиодов
Отладочная плата PinBoard v1.1
Автор DI HALT
Опубликовано 16 июля 2008
Рубрики: AVR. Учебный курс, Готовые устройства
Метки: AVR, PinBoard, Отладка
В один прекрасный момент я задумался — а какого черта я трачу столько времени на сооружении разного обвяза при отладке новых модулей и при подготовке экспериментов?
Ведь все можно сделать в единой отладочной плате, чтобы можно было просто соединить нужными перемычками блоки и получить сразу кусок решения. Нужна была демоплата.
Что такое демоплата? Демоплата — это универсальный полигон для экспериментов. Идеальное средство для быстрого старта. На ней смонтирован микроконтроллер, а также вся необходимая обвязка для его работа. Плюс разные полуфабрикаты, позволяющие облегчить эксперименты.
Готовое устройство, где все уже подключено, разведено как надо. Купил - включил - работай. Риск что-либо сжечь в ходе экспериментов снижен максимально. Где нет нужды парить мозг проблемой “чем прошить”, “как запустить”, “Как правильно все подключить”. Первые шаги делаются быстро и легко.
А потом, когда ты уже освоишься с контроллером, то запросто можно посмотреть как сделано на демоплате и перенести это решение в свое устройство.
В принципе, идея не нова — по такому пути идет компания Микроэлектроника с их демоплатой EasyAVR5 (от 7 до 9 тысяч рублей). Плата замечательная, но на мой взгляд дороговата и многие фичи там избыточные и одноразовые. В том смысле, что раз побаловался, изучил и больше они не интересны. А кое чего нет вообще, например возможности по быстрому сварганить аналоговую цепочку или фильтр.
Плюс ко всему, в исходном варианте EasyAVR5 идет голой, только плата с простейшей периферией вроде светодиодов и кнопочек, а LCD дисплеи модули расширения надо покупать отдельно и стоят они тоже негуманно. Основную же стоимость добавляет многослойная плата с кучей джамперов и переключателей, позволяющая витиевато все это коммутировать.
Такой расклад меня не устроил поэтому я посидел несколько дней, поворошил в памяти все основные грабли и неудобства которые мне приходилось часто решать, попытался продумать какие задачи мне еще предстоит расковырять и что для этого неплохо было бы подготовить и получилось вот что:
![]() |
Концепция была отличной от традиционных отладочных плат. Я не стремился до предела нафаршировать ее разной периферией, но постарался по максимуму облегчить и ускорить подключение к ней чего угодно.
Вот фичи которые мне удалось реализовать: Читать полностью






