Программатор-отладчик PicMon » Программирование устройств на PIC микроконтроллерах


Логин:
Пароль:
О сайте:

Pic.Rkniga.ru - Сайт как для начинающих, так и для опытных радиолюбителей, разрабатывающих свои устройства на популярных PIC микроконтроллерах.
Здесь можно обмениваться сообщениями на форуме, а также добавлять на сайт статьи и схемы своих устройств.

Меню сайта
Главная Форум по PIC микроконтроллерам Форум Статьи по PIC микроконтроллерам Статьи Справочная информаци по PIC микроконтроллерам Справочник Литература по PIC микроконтроллерам Литература Схемотехника Схемотехника устройств на PIC микроконтроллерах Микроконтроллеры Программаторы Все по программированию PIC микроконтроллеров Программы, Софт Программы Ссылки
Опрос

Какой средой программирования вы пользуетесь?


MPLab/MPLabX
MicroC
MicroBasic
MicroPascal
Другой


Последние материалы
  • Тестовая плата для отладки программ на микроконтроллере PIC18F4550
  • Кнопка On/OFF на PIC12F629.
  • Часы с синхронизацией от китайского будильника
  • ШИМ регулятор на PIC16F628A.
  • Счетчики прямого и обратного счета на PIC16F628A.
  • Таймер отключения питания для мультиметра и не только.
  • Измеритель напряжения и тока
  • Маршрутный компьютер для электровелосипеда
  • Простой двухканальный термометр на PIC16F690 и датчиках DS18B20
  • Электронная "Незабудка" для забывчивых
  • Популярные материалы
    Случайная книга
    Программатор-отладчик PicMon
    Автор публикации: alex Просмотров: 5205 Добавлен: 30-07-2014, 08:20 Комментарии: 0

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


         На первом этапе отладки микроконт-роллерных программ обычно пользуются программными эмуляторами их работы. Но положенные в их основу математические модели реальных микроконтроллеров всегда имеют те или иные ограничения. Таким эмулятором непросто проверить правильность взаимодействия микроконтроллера с подключёнными к нему внешними устройствами. Предоставляющие больше возможностей аппаратные эмуляторы слишком дороги, и далеко не каждая фирма, а тем более начинающий разработчик могут позволить себе его приобрести.
         Существуют и специальные версии микроконтроллеров со встроенными средствами внешнего доступа к их внутренним регистрам и другим ресурсам (функцией внутрисхемной отладки ICD). К ним относится, например, отладочный адаптер АС162052 — микроконтроллер PIC16F676 с ICD. Но он тоже стоит недёшево.
         Предлагаемый простой программатор-отладчик PicMon соединяет микроконтроллер, программу которого предстоит отладить, с COM-портом компьютера и позволяет:
    — загрузить программу в память микроконтроллера;
    — проследить ход её исполнения;
    — наблюдать за содержимым регистров микроконтроллера как специальных, так и общего назначения;
    — изменять их содержимое.
         Схема программатора-отладчика показана на рис. 1. Её прототипом послужила известная схема программатора LUDIPIPO <http://narod.kmv. ru/workshop/ludipipo.tml>. Чтобы использовать интерфейсные линии TXD и RXD COM-порта компьютера для отладчика, изменено подключение цепей программирования к этому порту (разъёму XS1 типа DB-9F).
         Разъём XS2 — панель микроконтроллера. Указанные на схеме номера её гнёзд без скобок относятся к микроконтроллеру PIC12F675 (предполагается, что панель восьмигнёздная), а в скобках — к микроконтроллеру PIC16F628 в 18-гнёздной панели. Для микроконтроллеров других типов число гнёзд в панели и номера её контактов могут быть иными, их нужно смотреть в документации на эти микроконтроллеры и в инструкциях по программированию.
         Если загружать программы в микроконтроллер с помощью этого устройства не предполагается, его можно значительно упростить. Для работы в качестве отладчика достаточно соединить цепи RXD и SG разъёма XS1 соответственно с гнёздами CLK и VSS панели XS2 и установить резистор R1. Конденсатор С2 не обязателен, но в одном из экземпляров отладчика он потребовался.
         Питать микроконтроллер при отладке записанной в нём программы можно от внешнего источника либо от СОМ-порта, как при программировании. В этом случае резистор R3, конденсатор С1 и стабилитрон VD1 следует сохранить. Но нагрузочная способность линий COM-порта невелика, и это даёт возможность питать лишь микроконтроллер и один светодиод. Устанавливать резистор R3 сопротивлением менее 2 кОм не рекомендуется. Может потребоваться увеличить ёмкость конденсатора С1 до 2...10 мкФ, причём он должен быть керамическим.


         Перемычку S1 на время отладки снимают. Её устанавливают лишь в режиме программирования. Соединение цепи DSR разъёма XS1 с гнездом DAT панели XS2 и резисторы R2, R4 необходимы только для программирования.
         Для перевода микроконтроллера в режим программирования требуется, чтобы высокий логический уровень на линии RTS COM-порта был не ниже +10 В. На моём компьютере он равен +11 В (COM-порт физически находится на материнской плате).
         Вид собранного на макетной плате программатора-отладчика показан на рис. 2. Резисторы R1 и R2 смонтированы непосредственно на выводах гнёзд разъёма.
         Принцип работы отладчика схож с тем, что используется в MPLAB-ICD. В программную память микроконтроллера заносят не только отлаживаемую программу, но и небольшую программу-монитор, в процессе отладки обменивающуюся информацией с компьютером. Для этого обмена должна быть выделена одна из линий ввода—вывода микроконтроллера. В данном случае — GP1 микроконтроллера PIC12F675 или РВ6 микроконтроллера PIC16F628. Но при необходимости и при условии внесения соответствующего изменения в схему отладчика это может быть вывод любого порта ввода— вывода общего назначения. Разряду регистра порта, связанному с выбранным для обмена информацией с компьютером выводом, в отлаживаемой программе необходимо присвоить имя pRs, например, так
    #DEFINE pRS GPIO,1
    или так
    #DEFINE pRS PORTB,6
    и не использовать этот вывод в других целях.
         Задавая конфигурацию микроконтроллера, рекомендуется запретить работу встроенного детектора понижения напряжения питания (не программировать разряд BOD). Это связано с тем, что напряжение, если оно берётся от COM-порта, нередко опускается ниже порога срабатывания детектора, что вызывает нежелательные перезапуски программы.
         В начало отлаживаемой программы должны быть добавлены раздел описания переменных отладочного монитора (для микроконтроллеров PIC2F675 и ему подобных по организации ОЗУ — табл. 1, для микроконтроллеров PIC16F628 и подобных — табл. 2) и процедура инициализации монитора (табл. 3 для всех микроконтроллеров).


         Содержимое занятых переменными монитора регистров отлаживаемая программа изменять не должна. Процедуру инициализации следует исполнить один раз при старте отлаживаемой программы. В предложенном варианте она задаст работу монитора в описанном ниже режиме Halt с просмотром содержимого лишь одного регистра ОЗУ по адресу 20Н, но при необходимости в ней могут быть заданы и иные режимы.
         Файл с исполняемым исходным текстом монитора добавляют в конец исходного текста отлаживаемой программы строкой
    #include Monit01.asm
         Этот файл (Monit01.asm) должен находиться в одной папке с исходным текстом программы.
         В отличие от MPLAB-ICD, где допустимое число контрольных точек— одна или три, число вызовов монитора из отлаживаемой программы ограничено лишь доступным объёмом программной памяти. В её контрольные точки вставляют вызовы подпрограммы Monit, в простейшем случае вот такие:
    movlw 1 ;номер контр. точки
    call Monit ;вызов монитора
         Номер должен быть своим для каждой контрольной точки. В момент вызова монитор автоматически сохраняет содержимое регистра W в своей переменной WrgA. Чтобы следить, по каким контрольным точкам идёт исполнение отлаживаемой программы, достаточно настроить компьютерную программу на просмотр значений этой переменной.
         Но одновременно следить за состоянием нескольких разбросанных по памяти микроконтроллера регистров значительно удобнее, если перед вызовом монитора создавать их копии, сосредоточенные в одной области ОЗУ по смежным адресам. Например, если нужно одновременно следить за состоянием регистра порта GPIO и номером контрольной точки, можно вставлять в программу такие фрагменты:
    movfw gpio
    movwf Sprt
    movlw 3
    movwf Nstp
    call Monit
         Здесь перед вызовом монитора в переменной Sprt сохраняется состояние порта GPIO, а в переменной Nstp — номер контрольной точки. Эти переменные располагают в памяти рядом и задают отладчику просмотр состояния включающей их группы регистров, которых может быть от одного до восьми.
         Когда в программе микроконтроллера по ходу исполнения вызывается монитор, он передаёт в компьютер содержимое группы регистров, начальный адрес и число которых задано заранее, и ждёт от компьютера команду. Если в течение определённого времени она не поступила, то в зависимости от установленного режима монитор либо возвращает управление отлаживаемой программе (режим Run), либо вновь передаёт содержимое регистров и продолжает ждать команду (режим Halt).
         Когда команда получена, то в зависимости от неё монитор выполняет следующие действия:
    Run — переходит в режим Run;
    Halt — переходит в режим Halt;
    Step — переходит в режим Halt и возвращает управление отлаживаемой программе. Многократно подавая эту команду, можно проследить, какие контрольные точки и в какой последовательности проходит отлаживаемая программа;
    RdRg — устанавливает начальный адрес и длину группы регистров, содержимое которых передаётся в компьютер при достижении контрольной точки;
    RdEe — устанавливает начальный адрес и длину группы ячеек EEPROM, содержимое которых передаётся в компьютер при достижении контрольной точки;
    WRg — записывает байт в регистр по адресу, указанному в команде;
    WEe — записывает байт в EEPROM по адресу, указанному в команде.
         Монитор занимает около 180 байт программной памяти, 10 регистров ОЗУ и использует три уровня стека. Один вывод микроконтроллера используется для обмена информацией с компьютером. Время исполнения подпрограммы Monit в режиме Run — 9... 16 мс. Из них 2...9 мс уходит на приём команды и передачу обратно содержимого от одного до восьми регистров. Ещё 7 мс отводится на ожидание команды от компьютера. От моего компьютера, работающего под управлением Windows ХР, команда приходит через 4,5 мс.
         Последовательный интерфейс для связи с компьютером в мониторе организован программно. Поэтому возможна отладка программ в микроконтроллерах без аппаратного USART. Кроме того, использование аппаратного USART потребовало бы усложнения аппаратной части отладчика, так как сигналы, которыми он обменивается с СОМ-портом компьютера, необходимо инвертировать. Для упрощения подпрограммы и ускорения обмена контроль безошибочности передаваемой и принимаемой информации не проводится. Скорость обмена выбрана равной 9600 Бод, передаются восемь информационных и один стоповый разряды без контроля чётности.
         Для работы в микроконтроллерах с аналогичной организацией памяти данных (PIC12F675, PIC16F628A и т. д.) доработки программы обмена не требуется. Но следует учесть, что в некоторых микроконтроллерах регистры, связанные с EEPROM, организованы иначе и расположены в других банках памяти.


         По завершении отладки программы из неё следует удалить или закомментировать все строки, введённые для обслуживания отладчика.
         Для работы в режиме отладки с рассматриваемым программатором-отладчиком предлагается компьютерная программа PicMonOI, окно которой изображено на рис. 3. Она создана с помощью среды разработки программ Delphi.
         Этой программой управляют, нажимая на следующие продублированные экранными кнопками функциональные клавиши:
    F2 — открывание и закрывание СОМ-порта, с которым соединён микроконтроллер с отлаживаемой программой (рядом с экранной кнопкой находится окно выбора этого порта);
    F3 — включение и выключение питания микроконтроллера;
    F4 — управление обменом информацией;
    F5 — передача монитору команды Halt;
    F8 — передача монитору команды Step;
    F9 — передача монитору команды Run.
         Имеются также экранные кнопки и окна для выбора и отображения содержимого двух групп регистров ОЗУ (Rg1 и Rg2), что позволяет одновременно просматривать непересекающиеся группы и группы ячеек EEPROM (Ее). Слева от каждого окна отображения содержимого группы находится окно установки её начального адреса, а справа — длины. Предусмотрены экранные кнопки и для записи байтов в ОЗУ (Wrg) и EEPROM (Wee). Значения и адреса этих байтов указывают в соответствующих окнах. При наведении курсора мыши на элементы окна на экран выводятся подсказки.
         Индикатор Rx показывает, что идёт приём информации от микроконтроллера. Она отображается в окне, соответствующем последней нажатой экранной кнопке Rg1, Rg2 или Ее. Непосредственно после запуска программы это окно находится в строке кнопки Rg1. Индикатор Тх включается, когда идёт передача информации в микроконтроллер, что происходит только при нажатиях на экранные кнопки Run, Halt, Step, Rg1, Rg2, Ее, Wrg, Wee.


         В режиме программирования микроконтроллера программатором-отладчиком управляет компьютерная программа PicPgm01, разработанная в среде Delphi. В отличие от программы PicMonOI, она работает только с физическими COM-портами компьютера, а с виртуальными, созданными с помощью переходника USB-COM, работать не может.
         Окно программатора изображено на рис. 4. Им управляют нажатиями на следующие продублированные экранными кнопками функциональные клавиши:
    F2 — запись в файл содержимого буфера программатора;
    F3 — чтение файла в буфер программатора:
    F4 — очистка буфера программатора;
    F5 — запись содержимого буфера программатора в память микроконтроллера;
    F6 — чтение содержимого памяти микроконтроллера в буфер программатора;
    F8 — очистка памяти микроконтроллера;
    F9 — чтение идентификатора микроконтроллера.
         При чтении файла содержимое буфера программатора изменяется только по адресам, описанным в этом файле. Это позволяет загрузить в буфер последовательно несколько файлов, а затем запрограммировать микроконтроллер.
         В окне программы PicPgmOl имеются окна, в которых можно задать максимальные адреса, до которых будет считываться в буфер содержимое FLASH-памяти и EEPROM микроконтроллера. Выбрать стираемые (F— FLASH, С — конфигурация, Е — EEPROM) и записываемые при программировании области памяти, а также хранящиеся в памяти некоторых микроконтроллеров калибровочные константы.
         На панели "Конфигурация" можно выбрать из выпадающего списка тип микроконтроллера и задать его конфигурацию. Для тех микроконтроллеров, в которых предусмотрен режим одновременного стирания старой и записи новой информации (PIC12F675 к ним не относится), активизируется находящаяся под панелью "Запись" экранная кнопка. Надпись на ней сменяется при каждом нажатии. Pgm означает, что установлен обычный режим программирования с обязательной предварительной очисткой памяти, a ErsPgm — режим одновременной очистки памяти и записи. Процедура программирования в установленном режиме начинается только после нажатия на клавишу F5.
         В нижней части главного окна программы под окном с именем загруженного НЕХ-файла и идентификатором программы расположены закладки, на которые выведено содержимое буфера программатора, отображающее загруженные из файла или прочитанные из микроконтроллера образы различных областей его памяти. Этот образ при необходимости можно отредактировать вручную, после чего записать его в память микроконтроллера или сохранить в НЕХ-файле.
         Перед стиранием памяти микроконтроллеров PIC12F629, PIC12F675, PIC16F630 и PIC16F676 обычно рекомендуют выполнить чтение её содержимого и запомнить (записать) калибровочные константы OscCal и BG для их восстановления в дальнейшем. Программа PicPgmOl устроена так, что при выборе этих микроконтроллеров и нажатии на клавишу F8 (очистка памяти) программатор сначала автоматически читает их из памяти и запоминает константы, лишь затем память полностью очищается, после чего константы автоматически записываются обратно.
         Если константы сохранять не требуется, то перед тем, как нажать на клавишу F8, следует установить тип микроконтроллера PIC16F628A, в памяти которого хранение калибровочных констант не предусмотрено. Выполнив очистку памяти, восстанавливают правильный тип микроконтроллера.


         Случайно или преднамеренно уничтоженные константы можно восстановить, отредактировав вручную содержимое соответствующих ячеек буфера программатора и лишь после этого выполнив программирование.
         Работу с отладчиком рассмотрим на примере программы LedPM, приложенной к статье в двух вариантах: для микроконтроллера PIC12F675 (LedPM675.asm, LedPM675.hex) и для микроконтроллера PIC16F628 (LedPM628.asm, LedPM628.hex). Все необходимые дополнения для работы отладчика в эти программы уже внесены. К микроконтроллеру по схеме, изображённой на рис. 5, кроме программатора-отладчика нужно подключить светодиод HL1 и кнопку SB1, которую можно заменить съёмной перемычкой.
         При отпущенной кнопке светодиод должен мигать с периодом 400 мс, а при нажатой — вдвое больше. Если за время удержания кнопки нажатой произошло более восьми миганий, светодиод должен продолжить светить уже непрерывно. Но в программе преднамеренно допущена ошибка. Переключения на непрерывное свечение не происходит. Эту ошибку предстоит найти с помощью отладчика.
         Дальнейшее описание предполагает, что используется микроконтроллер PIC12F675. Прежде всего, его следует запрограммировать — записать коды из файла LEDPM675.hex в память. Это можно сделать с помощью описываемого программатора-отладчика с установленной перемычкой S1 и программы PicPgm01. Но если режим программирования в изготовленном приборе аппаратно не поддерживается, может быть применён и любой другой программатор.
         Затем снимают перемычку S1 и запускают программу PicMon01. В ней необходимо открыть COM-порт, к разъёму которого подключён разъём XS1 отладчика. Сделав это, нажатием на клавишу F3 включают питание микроконтроллера. Это необходимо даже в том случае, если микроконтроллер питается от внешнего источника. Такова особенность программы PicMon01. После этого нажатием на клавишу F4 запускают обмен информацией между микроконтроллером и компьютером.
         Монитор микроконтроллера начнёт работать в режиме Halt и станет передавать содержимое регистра ОЗУ с адресом 20Н. В окне содержимого регистров группы Rg1 должно появиться "00-------". Светодиод HL1 (рис. 5) включён. Индикатор "Rx” в окне программы — зелёный.


         Установите число регистров в группе Rg1 равным пяти и нажмите на экранную кнопку Rg1. Вспыхнет индикатор Тх. Монитор начнёт передавать содержимое регистров с адресами 20Н—24Н (переменные DelO, Del1, CntB, Nstp, Sprt). В соответствующем окне должно появиться "00 00 00 01 30 ---
         Число 01 на четвёртом месте, отведённом переменной Nstp, означает, что программа остановлена в контрольной точке № 1.
         Если нажать на клавишу F8 (команда Step), то информация в окне сменится на ”00 00 00 03 10---". Программа дошла до контрольной точки N° 3.
         После нажатия на клавишу F9 (Run) в окне каждые 200 мс станут сменяться номера контрольных точек (01 и 03) и значения байта состояния порта GPIO микроконтроллера (30 и 10). Индикатор Rx мигает с тем же периодом, и каждый раз сменяется противоположным состояние светодиода HL1.
         Если нажать на кнопку SB1, в окне станут чередоваться номера контрольных точек 01 и 02 и состояния портов 20 и 00. Период миганий светодиода удвоится, но содержимое счётчика миганий (значение переменной CntB) останется нулевым, и светодиод продолжит мигать после любого числа вспышек.
         Проанализируем эту ситуацию. Вторая задержка на 200 мс выполняется. Контрольную точку № 2 программа проходит. Не выполняется команда incf CntB. Возможно, из-за предыдущей команды btfsc CntB,4. Заменяем её на btfss CntB,4. Транслируем откорректированную программу, загружаем её в микроконтроллер и запускаем. Всё работает, как задумано!
         Осталось удалить из программы все строки, внесённые в неё для отладки (в данном случае они помечены буквами М в комментариях), ещё раз оттранслировать программу, загрузить её в микроконтроллер и окончательно проверить в работе.

    Автор: А. Григорьев, г. Москва
    Материал взят из: Журнал Радио 2013 №11

    В архиве: Программа PicMon, исходныйкод программы и прошивка микроконтроллера

    progrotlpicmon.rar [406,19 Kb] (cкачиваний: 341)

    Комментарии