Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Микроконтроллеры PIC фирмы Microchip для начинающих выпуск №9


РАССЫЛКА Микроконтроллеры PIC фирмы Microchip для начинающих
Ведущий: Алексей (pont_a@mail.ru)


Доброго времени суток, дамы и господа!!

Сегодня в выпуске я расскажу о некоторых, простейших способах отладки программы в Mplab. Узнаем, как посмотреть дизассемблерный код, и зачем он нужен.  Научимся смотреть дампы (значения ячеек) памяти. Узнаем, что такое файл листинга, и зачем он нужен.  Научимся с помощью симулятора MPLAB SIM тестировать небольшие программы.

В прошлом выпуске мы научились создавать проект в среде разработки Mplab и компилировать его.  
Открываем наш проект и в основной цикл добавляем код, который я Вам давал при рассмотрении примера работы с косвенной адресацией. В итоге, у нас получится следующая программа:
;---------------------------------------------------------------------------------------------------------------
; Подключаем стандартный заголовочный файл
#include<P18F452.INC>   
; объявляем переменные и константы
ab        equ      0
bb        equ      1
rw        equ      0
rf         equ      1
bit0      equ      0
temp    equ      0x00
count   equ      0x01
; код программы
            org 0x0000  ; как я писал, эта директива располагает весь код после заданного адреса
Main:            
            ; основной цикл микроконтроллера
            LFSR  0, 0x200         ; в FSR0 заносим адрес первой ячейки памяти данных банка 2           
            LFSR  1, 0x3FF        ; в FSR1 заносим адрес последней ячейки памяти данных банка 3     
            SETF  count, ab        ; count=255
Loop_met:                                         ; метка (адрес) перехода. 
            MOVFF  count, INDF0 ; значение count заносится в ячейку по адресу, записанному в FSR0
            MOVFF  POSTINC0, POSTDEC1 ;ячейка [FSR1] = ячейка [FSR0]; FSR1-1; FSR0+1
            DECFSZ count, rf, ab           ; если count=0, то пропускаем следующую команду 
            BRA   Loop_met                   ;  если count не 0, то переходим на метку
            BTG   temp, bit0, ab             ; инвертирование нулевого бита переменной temp
            BRA   Main
            end      ; этой директивой заканчивается программа
;--------------------------------------------------------------------------------------------------------------
Сохраняем новую программу. Затем, компилируем проект. Проект должен скомпилироваться без ошибок.
Теперь посмотрим полученный дизассемблерный код. Что это такое? Скажем грубо, это код программы на  ассемблере, полученный из загрузочного (машинного) кода микроконтроллера.  Данный код позволяет контролировать компилятор. В этом коде можно найти соответствие каждой строчки нашей программы командам ассемблера. Для программы, написанной на языке ассемблера, возможно, этот код и не так важен, но для программы на языках более высокого уровня, например Си, контролировать компилятор, иногда, просто необходимо. Посмотреть дизассемблерный код в Mplab можно в пункте меню: View > Disassembly Listing.
После компиляции в папке, где лежит проект, появится, помимо файла main.hex, еще один файл main.lst. Это файл листинга. В этом файле можно, также, найти соответствие строк программы  командам ассемблера (дизассемблерный код). Полное распределение памяти данных. А также, расчет свободной и занятой памяти данных и программ. Плюс, в этом файле приводится полная статистика последней компиляции программы: сколько было ошибок, предупреждений, сообщений и т.п. Данный файл необходим для контроля и отладки программы, особенно, если нет возможности производить отладку с помощью  Mplab.     
Теперь посмотрим дамп памяти данных. Что такое дамп памяти? Это список всех значений ячеек памяти. Mplab позволяет посмотреть, как всю память, так и выборочные переменные.  Чтобы посмотреть всю память данных, нам необходимо перейти по пункту меню: View > File Registers. Перед нами откроется окно, в котором отображается вся память данных микроконтроллера, включая и специальные регистры. Чтобы отображались ячейки памяти данных более наглядно, необходимо, чтобы был включен режим Symbolic (вкладка внизу окна). В этом окне мы можем посмотреть значение любого регистра и ячейки памяти. Если нам необходимо контролировать при отладке только несколько переменных и специальных регистров, то, достаточно будет воспользоваться Watch – окнами.   

Открыть эти окна можно через пункт меню: View > Watch. Нам откроется окно, в котором будет 4 вкладки. В эти вкладки и будем добавлять переменные и регистры, которые нам необходимо проконтролировать. Включаем любую вкладку, из выпадающего, отсортированного по алфавиту списка выбираем специальный регистр для просмотра и нажимаем кнопку «Add SFR»  или из второго списка выбираем переменную для просмотра и нажимаем кнопку «Add Symbol».  Так, по очереди, добавляем все регистры и переменные, которые мы будем контролировать. Например, в нашей программе добавим все переменные.  Тогда, окно будет выглядеть следующим образом:

Окно Watch с переменными

Теперь конкретно остановимся на отладке.  Запускаем встроенный в Mplab  симулятор MPLAB SIM. Чем симулятор отличается от отладчика? Тем, что отладчик позволяет производить тестирование напрямую на микроконтроллере. Например, самый известный внутрисхемный отладчик – Mplab ICD2 (шайба, на сленге программистов микроконтроллеров PIC). А симулятор – это программа, эмулирующая работу микроконтроллера. Наиболее известная программа – Proteus (кто серьезно хочет заниматься разработкой электронных устройств, но нет возможности приобрести отладчик Mplab ICD2 или нет возможности паять макет, то эта программа Вам очень пригодится). Но пока, мы можем обойтись и без нее. Достаточно встроенного симулятора Mplab SIM.  

Переходим по пункту меню: Debugger > Select Tool > MPLAB SIM.  У нас появится вот такая панель:

Панель симулятора MPLAB SIM

С помощью этой панели и окон дампа памяти и Watch будем отлаживать нашу программу.  Кнопка «запуск программы» позволяет запустить исполнение программы в автоматическом режиме. Посмотреть значения регистров и переменных в этом режиме исполнения можно будет только, когда программа остановлена, например, командой «останов программы» или, автоматически, точкой останова. Кнопка «анимация счетчика команд» позволяет наблюдать за выполнением алгоритма программы. Счетчик программ будет представлять собой зеленый указатель, который будет показывать, какая команда в данный момент времени исполняется.  Кнопки «выполнить одну команду» позволяют отлаживать программу пошагово. Т.е. выполнять программу по одной команде. Кнопка «эмуляция сброса» сбрасывает программу в начальное состояние, в которое микроконтроллер попадает после любого сброса. Все эти кнопки дублируются в пункте меню  Debugger.
Внимание: после эмуляции сброса микроконтроллера память данных не очищается автоматически! В ней может быть все что угодно записано.

Помимо просмотра переменных и регистров нам понадобятся точки останова. Точка останова – это адрес программной памяти, а точнее, команда ассемблера, записанная по этому адресу, на которой выполнение программы приостанавливается. Но значения всех регистров и переменных в этой точке программы сохраняются, и их можно посмотреть или изменить. Устанавливаются точки останова просто – двойной клик левой кнопкой мышки на строке программы.  Если точка останова установилась правильно, то напротив этой команды будет сплошной красный круг с буквой B (Breakpoint). Если точка останова не может быть установлена, то она будет отображаться, как красный круг, только он будет несплошным. Убрать точку останова можно, также, двойным кликом левой кнопки мышки на строке программы, где эта точка выставлена. Обычно, при отладке, точки останова используют, чтобы посмотреть значения переменных на критичных участках кода программы. Выставляем точки останова следующим образом:

Точки останова в разрабатываемой программе

Теперь нажимаем кнопку «запуск программы». Мы увидим, что начался исполняться код, и указатель счетчика команд (зеленая стрелка) указывает на нашу первую точку останова. Смотрим в окне Watch на значение переменной count. Мы увидим, что оно стало 0xFF, т.е. выполнилась команда SETF. Красным цветом  значение переменной выделяется в том случае, если оно изменилось после предыдущего останова программы. Если не отображается окно Watch,  то его можно активировать в пункте меню: Window > Watch. Если там нет пункта Watch, то значит окно закрыто. Открываем его снова через меню: View > Watch. Все заданные ранее переменные в нем останутся.  Нажимаем снова кнопку  «запуск программы» мы опять попадем на первую точку останова, т.к. у нас выполняется цикл. В окне Watch мы увидим, что переменная count стала на единицу меньше и равна 0xFE. Теперь убираем первую точку останова и, опять, нажимаем кнопку «запуск программы». Программа остановится на второй точке останова. В окне Watch мы увидим, что переменная count  стала равна нулю, т.е. мы вышли из цикла – наш вложенный цикл  выполнился 255 раз. А в переменной temp проинвертировался нулевой бит, и значение переменной стало равно единице.  Теперь открываем дамп памяти и видим, что по адресу 0x000 записана 1 – переменная temp, по адресу 0x001 записан 0 – переменная count. В банке 2 памяти данных (адреса: 0x200 – 0x2FF) значения расположены по убыванию, а в банке 3 (адреса: 0x300 – 0x3FF)  - по возрастанию. Т.е. можно сделать вывод, что наша программа работает так, как надо. Поэкспериментируйте дальше с точками останова. Запустите симулятор в режиме анимации. Можете изменять и код. Только после изменения программы не забывайте ее заново компилировать. Если Вы проверили программу, то выйти из режима симулятора можно через пункт меню:  Debugger > Select Tool > None.

Правда, есть в этой программе ошибка в алгоритме – очень хитрая. Чтобы направить Вас на правильный путь, скажу, что она связана с записью значений в банки памяти. Это будет Вам домашнее задание – определить: « Где же я ошибся?». Ответы и, если сможете, правильный вариант кода присылайте на мой почтовый ящик!

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

Полный архив рассылки Вы можете прочитать на нашем сайте!
При любом опубликовании текстов данной рассылки ссылка на сайт http://www.2aplusa.ru обязательна!

Желаю Вам удачи! До скорой встречи!


С уважением, Алексей pont_a@mail.ru
Cайт разработчиков 2AplusA http://2aplusa.ru


В избранное