Работа с микроконтроллерами AVR в программной среде Proteus 8.1.
Часть 2

№ 12’2015
PDF версия
В Proteus можно разрабатывать как простейшие аналоговые устройства, так и сложные системы на микроконтроллерах. В статье рассматривается моделирование схем микроэлектронных устройств на базе однокристальных микроконтроллеров AVR семейства Mega. В частности, передача данных через последовательный интерфейс SPI между устройствами, которые сконфигурированы как Master и Slave, а также инструменты отладки программы инициализации микроконтроллера AVR в Proteus 8.1. Статья может быть интересна как профессиональным разработчикам, так и молодым специалистам.

Введение

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

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

Создание электронного устройства в Proteus происходит в несколько этапов:

  • разработка схемы электрической принципиальной в графическом редакторе;
  • моделирование схемы с использованием виртуальных приборов;
  • разработка печатной платы, включая 3D-визуализацию.

К преимуществам программы можно отнести:

  • выполнение всех этапов разработки электронного устройства на основе микроконтроллера в единой среде;
  • возможность написания, отладки и тестирования микропрограммного обеспечения еще до физического изготовления опытного образца системы;
  • широкие отладочные возможности, в том числе доступ к содержимому регистров и памяти, задание точек останова программы и ее пошаговое выполнение;
  • совместное моделирование работы микроконтроллера, исполняющего заданную программу, и окружающих его аналоговой и цифровой схем;
  • генерируемые диагностические сообщения (например, при выполнении непредусмотренной инструкции) как со стороны центрального процессорного устройства, так и со стороны моделей устройств ввода/вывода позволяют обнаружить сложные в поиске ошибки программирования;
  • поддержка нескольких семейств микроконтроллеров от разных производителей, в том числе и микроконтроллеров AVR.

Несмотря на то, что микроконтроллеры AVR появились на рынке около 20 лет назад, сегодня их популярность очень высока и с каждым годом они занимают все новые ниши на рынке [5]. Не последнюю роль в этом играет соотношение показателей цена/быстродействие/энергопотребление, до сих пор являющееся едва ли не лучшим на рынке 8‑битных микроконтроллеров. Кроме того, постоянно растет число выпускаемых сторонними производителями разнообразных программных и аппаратных средств поддержки разработок устройств на их основе. В программной среде Proteus предусмотрена симуляция электронных устройств на базе следующих микроконтроллеров AVR: AT90USB1286, AT90USB646, ATmega128/1280/1281/1284P, ATmega16/162/164P/165. В рассматриваемых в статье примерах используются микроконтроллеры AVR семейства Mega. Микроконтроллеры этого семейства по сравнению с семейством Tiny имеют наиболее развитую периферию и наибольшие объемы памяти программ и данных. Они предназначены для мобильных телефонов, контроллеров различного периферийного оборудования (принтеры, сканеры, современные дисковые накопители, приводы CD-ROM/DVD-ROM), сложной офисной техники.

 

Общие аспекты разработки электрических схем с использованием микроконтроллеров в программной среде Proteus

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

После создания пустого листа схемы его следует заполнить символами необходимых компонентов из библиотеки. Создать новый проект схемы в Proteus можно при помощи команды File/New Project. Надо отметить, что по умолчанию при создании нового проекта запускается мастер New Project Wizard. Более подробно работа с мастером была рассмотрена в [2, 3].

Проект схемы электрической принципиальной, в котором присутствует микроконтроллер, можно создать и без использования мастера — при помощи кнопки ISIS верхней панели инструментов Proteus (рис. 1). В результате откроется новая вкладка Schematic Capture (рис. 2), в рабочем поле которой и будет выполняться разработка схемы.

Стартовая страница программы Proteus

Рис. 1. Стартовая страница программы Proteus

Вкладка Schematic Capture

Рис. 2. Вкладка Schematic Capture

Выбор компонентов из базы данных для последующего их размещения в рабочей области программы производится в окне Pick Devices (рис. 3). Данное окно можно открыть командой контекстного меню Place/Component/From Libraries или посредством нажатия на кнопку P на панели DEVICES (по умолчанию данная панель расположена в левой части программы и содержит список имеющихся в проекте компонентов). Открыть панель DEVICES можно нажатием кнопки Component Mode на левой панели инструментов редактора ISIS.

Библиотека микроконтроллеров семейства AVR программы Proteus

Рис. 3. Библиотека микроконтроллеров семейства AVR программы Proteus

Для того чтобы добавить микросхему микроконтроллера в рабочее поле проекта, необходимо в левой верхней части окна Pick Devices в поле Category выбрать из списка библиотеку Microprocessor ICs. Пакет Microprocessor ICs позволяет включать в эмуляцию смешанной схемы определенные микроконтроллеры с возможностью написания и отладки программного кода. Выбор библиотеки из списка производится посредством щелчка левой кнопки мыши по строке с ее названием. Ниже поля Category находится поле Sub-category, в котором таким же способом задается семейство микроконтроллеров выбранной библиотеки. В поле Results отображаются все компоненты выбранного семейства. Выбор компонента производится выделением левой кнопкой мыши строки с его названием в поле Results. В поле Manufacturer можно выбрать производителя микроконтроллера. Если производитель не имеет значения — укажите значение All Manufacturers в этом поле. Для ускорения поиска компонентов можно воспользоваться строкой фильтра Keywords, расположенной в верхнем левом углу окна Pick Devices. После того как выбор микроконтроллера сделан, его условное графическое обозначение отобразится в поле предварительного просмотра Preview. Посадочное место компонента будет показано в поле PCB Preview. Если для выбранного микроконтроллера предусмотрено несколько посадочных мест, то все возможные варианты будут доступны для выбора из выпадающего меню, которое расположено под полем PCB Preview. Для того чтобы разместить выбранный микроконтроллер на схеме, необходимо в окне Pick Devices нажать кнопку ОК. После чего данное окно будет закрыто, а символ компонента будет прикреплен к курсору мыши, при помощи которого необходимо поместить символ в соответствующее место на схеме (щелкнуть в нужном месте схемы левой кнопкой мыши).

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

При необходимости параметры размещенного на схеме микроконтроллера можно редактировать в окне Edit Component (рис. 4). Данное окно открывается двойным щелчком левой кнопки мыши по уже размещенному в рабочем поле программы символу компонента.

Окно настройки параметров микроконтроллера

Рис. 4. Окно настройки параметров микроконтроллера

Открыть вкладку, на которой в процессе проектирования будет вноситься код программы инициализации микроконтроллера, можно следующим образом. Выделите левой кнопкой мыши символ микроконтроллера в рабочем поле проекта, а правой кнопкой вызовите контекстное меню и выберите в нем пункт Edit Source Code. В результате в проект будет добавлена вкладка Source Code (рис. 5) и открыто окно выбора микроконтроллера New Firmware Project (рис. 6), в котором можно задать семейство и модель микроконтроллера, выбрать компилятор, определить необходимость создания заготовки программного кода для микроконтроллера.

Вкладка Source Code

Рис. 5. Вкладка Source Code

Окно выбора микроконтроллера

Рис. 6. Окно выбора микроконтроллера

В проект можно также добавить и уже подготовленный ранее .asm— или .c‑файл. Для этого на вкладке Source Code на панели дерева проектов Projects выберите левой кнопкой мыши проект, к которому необходимо добавить .asm— или .c‑файл, а правой — вызовите контекстное меню и выберите в нем пункт Add Files. В результате откроется окно проводника Windows, в котором необходимо выбрать на диске компьютера нужный файл и нажать кнопку «Открыть».

После того как в рабочей области проекта собрана схема, а на вкладке Source Code введен код программы, можно запускать моделирование. Если компилятор в листинге программы не обнаружит ошибок, на диске вашего компьютера в рабочей папке проекта будут созданы *.elf— и *.hex-файлы при компиляции программы инициализации микроконтроллера, написанной на языке С с помощью компилятора WinAVR, и *.obj— и *.asm-файлы при компиляции ассемблерного кода с помощью компилятора AVRASM.

Для прошивки микроконтроллера можно использовать файл, скомпилированный при помощи стороннего компилятора. Для этого в рабочем поле проекта щелкните два раза левой кнопкой мыши по символу микроконтроллера на схеме и в открывшемся окне Edit Component в поле Program File нажмите на кнопку Open. В результате откроется окно проводника Windows, в котором необходимо выбрать на диске компьютера файл машинного кода, подготовленного для загрузки в память программ, и нажать кнопку «Открыть». После выполненных действий в поле Program File окна Edit Component будет прописан путь к этому файлу.

 

Передача данных через последовательный интерфейс SPI в микроконтроллерах AVR в Proteus

Общие сведения об интерфейсе SPI

Интерфейс SPI (Serial Peripheral Interface) является высокоскоростным синхронным последовательным интерфейсом и реализован во всех микроконтроллерах AVR семейства Mega. Он обеспечивает обмен данными между микроконтроллером и различными периферийными устройствами, такими как АЦП, ЦАП, цифровые потенциометры, FLASH-ПЗУ, другие микросхемы и микроконтроллеры.

При обмене данными по интерфейсу SPI микроконтроллер AVR может работать как ведущий (режим Master) либо как ведомый (режим Slave). Ведущий микроконтроллер можно связать с одним или несколькими ведомыми устройствами. Схема подключения устройств по интерфейсу SPI показана на рис. 7. Связь между устройствами осуществляется с помощью следующих линий портов ввода/вывода общего назначения микроконтроллера:

  • MOSI — выход данных для ведущего или вход данных для ведомого устройства;
  • MISO — вход данных для ведущего или выход данных для ведомого устройства;
  • SCK — сигнал общей синхронизации интерфейса;
  • S—S — выбор ведомого устройства.
Схема подключения устройств по интерфейсу SPI

Рис. 7. Схема подключения устройств по интерфейсу SPI

Ведущее устройство формирует один или несколько сигналов SS (slave select) для выбора ведомых устройств. При этом количество формируемых сигналов соответствует количеству ведомых устройств. Ведомое устройство получит данные только в том случае, если оно было выбрано ведущим, то есть если на его выводе S—S присутствует низкий уровень.

Передача данных осуществляется посредством линий MOSI и MISO. Процессом передачи данных управляет ведущее устройство (Master), формируя тактовые импульсы через линию SCK. Вывод SCK ведущего микроконтроллера является выходом тактового сигнала, а ведомого микроконтроллера — входом. Одновременно с передачей данных от ведущего к ведомому устройству происходит прием данных ведущим устройством от ведомого по кольцу. Таким образом, за один полный цикл сдвига всех разрядов регистра выполняется обмен данными между двумя устройствами. Ведомые устройства не могут обмениваться данными между собой.

В модуле SPI имеется три регистра ввода/вывода:

  • SPDR — регистр данных, содержит посылаемый или принятый байт данных;
  • SPCR — регистр управления, определяет функционирование модуля SPI;
  • SPSR — регистр состояния, отображает состояние модуля SPI.

Включение/выключение SPI выполняется установкой шестого бита (SPE) регистра SPCR, пятый бит (DORD) задает порядок передачи данных, а четвертый бит (MSTR) этого регистра задает выбор режима работы интерфейса.

Передача данных через интерфейс SPI между двумя микроконтроллерами AVR

Рассмотрим процесс передачи данных между двумя микроконтроллерами AVR на примере микросхемы ATmega16, для чего создадим новый проект ISIS и добавим в рабочее поле на вкладке Schematic Capture две микросхемы ATmega16, два светодиода, два резистора (100 Ом), два символа «земли» и соединим компоненты, как показано на рис. 8. На языке программирования С напишем программный код управления передачей данных. Необходимо отметить, что программа инициализации пишется как для ведущего, так и для ведомого микроконтроллера. Определим микроконтроллер DD1 как ведущий, а микроконтроллер DD2 как ведомый. При этом задача мастера — послать управляющий сигнал (кодовую комбинацию), задача ведомого устройства — принять его и последовательно включить и выключить оба светодиода. Для удобства соединения можно отразить в рабочей области микросхему DD1. Для этого выделим ее при помощи левой кнопки мыши, а правой кнопкой вызовем контекстное меню и выберем в нем пункт X-Mirror. В результате микросхема будет отражена по горизонтали в рабочем поле проекта. В таком положении выводы PB4/ S—S, PB5/MOSI, PB6/MISO, PB7/SCK обеих микросхем соединить намного проще, при этом соединительные линии на схеме будут короче.

Демонстрационная схема с использованием двух микроконтроллеров ATmega16 и светодиодов

Рис. 8. Демонстрационная схема с использованием двух микроконтроллеров ATmega16 и светодиодов

В окне настроек Edit Component для каждого микроконтроллера установим следующие параметры (рис. 9):

  • поле CKOPT (Oscillator Options) — (1) Unprogrammed;
  • поле BOOTRST (Select Reset Vector) — (1) Unprogrammed;
  • поле CKSEL Fuses — (0010) Int.RC 2 МГц;
  • поле Boot Loader Size — (00) 1024 words. Starts at 0x1C00;
  • поле SUT Fuses — (01);
  • поле Advanced Properties — Clock Frequency (Default).
Настройки параметров микроконтроллера ATmega16 при передаче данных между двумя устройствами через интерфейс SPI

Рис. 9. Настройки параметров микроконтроллера ATmega16 при передаче данных между двумя устройствами через интерфейс SPI

Окно настроек можно открыть двойным щелчком левой кнопкой мыши по выбранному на схеме микроконтроллеру.

Перед выполнением передачи данных необходимо прежде всего разрешить работу модуля SPI. Для этого следует установить в единицу шестой бит регистра SPCR. Режим работы определяется состоянием четвертого бита этого регистра: если бит установлен в 1, микроконтроллер работает в режиме Master, если сброшен в 0 — в режиме Slave. Программно (на языке программирования С) эти действия можно реализовать так:

SPCR=0b01010000; // установка битов регистра SPCR ведущего микроконтроллера
SPCR=0b01000000; // установка битов регистра SPCR ведомого микроконтроллера

Передача данных осуществляется следующим образом. При записи в регистр данных SPI ведущего микроконтроллера запускается генератор тактового сигнала модуля SPI. Данные начинают побитно выдаваться на вывод MOSI устройства Master и соответственно поступать на вывод MOSI устройства Slave. Порядок передачи битов данных определяется состоянием пятого бита регистра SPCR. Если бит установлен в 1, первым передается младший бит байта, если же сброшен в 0 — старший бит.

Частота тактового сигнала SCK и, соответственно, скорость передачи данных по интерфейсу определяется состоянием первого и нулевого битов (SPR1: SPR0) регистра SPCR и нулевого бита (SPI2X) регистра SPSR ведущего микроконтроллера (таблица), так как именно он является источником тактового сигнала. Для ведомого микроконтроллера состояние этих битов не имеет значения.

Таблица. Задание частоты тактового сигнала SCK

SPI2X

SPR1

SPR0

Частота сигнала SCK

0

0

0

fCLK/4

0

0

1

fCLK/16

0

1

0

fCLK/64

0

1

1

fCLK/128

1

0

0

fCLK/2

1

0

1

fCLK/8

1

1

0

fCLK/32

1

1

1

fCLK/64

Примечание. fCLK — это тактовая частота микроконтроллера.

Напишем на языке программирования С следующий код программы инициализации для ведущего микроконтроллера:

#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <util/delay.h>
int main()
{
PORTB=0b00000000; // инициализация порта PB микросхемы DD1
DDRB=0b10110000; // указываем направление передачи информации по линиям порта
// линии SS, MOSI, SCK установлены как выходы
SPCR=0b01010011; // инициализация SPI
SPSR=0b00000000;
SPDR=0b11111110; // отсылаем кодовую комбинацию для ведомого микроконтроллера
return 0;
}

Для ведомого микроконтроллера был написан следующий код программы инициализации:

#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <util/delay.h>
int main()
{
PORTB=0b00000000; // инициализация порта PB микросхемы DD2
DDRB=0b00000000; // линии порта PB работают как входы
PORTD=0b00000000; // инициализация порта PD
DDRD=0b11111111; // линии порта PD работают как выходы
SPCR=0b01000011; // инициализация SPI
while (1) // бесконечный цикл
{
if (SPDR!=0b11111110) // если кодовая комбинация не получена
PORTD=0b00000000; // посылаем на все линии порта PD - 0
else if (SPDR==0b11111110) // если кодовая комбинация получена
{PORTD=0b00000001; // включить светодиод D1
_delay_ms(1000); // задержка в 1 секунду
PORTD=0b10000000; // погасить светодиод D1 и включить светодиод D2
_delay_ms(1000); } // задержка в 1 секунду
}}

В Proteus программа инициализации микроконтроллера вводится на вкладке Source Code. Открыть эту вкладку можно следующим образом. Выделите левой кнопкой мыши символ ведущего микроконтроллера в рабочем поле проекта, а правой — вызовите контекстное меню и выберите в нем пункт Edit Source Code. В результате будет открыто окно New Firmware Project (рис. 10), в котором устанавливаются следующие параметры:

  • Family — семейство микроконтроллера (в нашем случае AVR);
  • Controller — модель микроконтроллера (в нашем случае ATmega16);
  • Compiler — компилятор (в нашем случае WinAVR);
  • Create Quick Start Files — автоматическое создание заготовки программного кода для микроконтроллера (установим флажок в поле).
Окно New Firmware Project

Рис. 10. Окно New Firmware Project

После того как все значения назначены, нажмем на кнопку ОК, в результате в проект будет добавлена вкладка Source Code (рис. 11а), на которой и необходимо ввести код программы (рис. 11б).

Передача данных между двумя устройствами ATmega16 через интерфейс SPI. Вкладка Source Code

Рис. 11. Передача данных между двумя устройствами ATmega16 через интерфейс SPI. Вкладка Source Code:
а) заготовка программного кода для микроконтроллера;
б) код программы инициализации ведущего микроконтроллера;
в) код программы инициализации ведомого микроконтроллера

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

После того как в рабочей области проекта собрана схема, а на вкладке Source Code введен код программы, можно начинать моделирование (рис. 12).

Процесс моделирования проекта передачи данных между двумя микроконтроллерами ATmega16 через интерфейс SPI в программной среде Proteus

Рис. 12. Процесс моделирования проекта передачи данных между двумя микроконтроллерами ATmega16 через интерфейс SPI в программной среде Proteus

Процесс моделирования запускается при помощи кнопки Run the simulation, которая находится в левом нижнем углу окна программы. Для того чтобы временно приостановить процесс симуляции, используйте кнопку Pause the simulation, or start up at time 0 if stopped (кнопка находится в левом нижнем углу окна программы). Остановить моделирование можно кнопкой Stop the simulation.

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

Для компиляции кода программы, написанного на языке программирования С, в Proteus применяется компилятор WinAVR. Необходимо отметить, что по умолчанию в Proteus этот компилятор не установлен. Для запуска инсталляции WinAVR нужно в окне Compilers в строке WinAVR нажать кнопку Download и дождаться окончания загрузки (рис. 13а). После чего будет запущена программа установки, в процессе которой в диалоговом режиме пользователю будет предложено задать настройки устанавливаемого компилятора.

Окно Compilers, компилятор WinAVR

Рис. 13. Окно Compilers, компилятор WinAVR:
а) не установлен;
б) установлен

Открыть окно Compilers, в котором отображается список установленных в системе компиляторов, можно командой System/Compilers Configuration основного меню редактора ISIS (при этом необходимо находиться на вкладке Source Code). Компилятор установлен, если в поле Installed в строке с его названием указано значение Yes, иначе в этом поле находится кнопка Download, при помощи которой и выполняется инсталляция. Как видно на рис. 13б, в нашем случае компилятор WinAVR уже установлен. Подробно процесс инсталляции компилятора WinAVR был рассмотрен в [3].

В том случае, если программный код для микроконтроллера AVR был написан на языке программирования ассемблер, для его компиляции в Proteus необходимо использовать компилятор AVRASM, установленный в системе по умолчанию.

Отчет об ошибках, полученных в результате компиляции программного кода, отображается в нижней части вкладки Source Code на панели VSM Studio Output.

Если компиляция прошла успешно, а файлы *.elf и *.hex не были созданы в рабочей папке проекта, то их расположение можно определить следующим образом. Перейдите на вкладку Simulation Errors (рис. 14), которая будет добавлена в проект после окончания моделирования, и найдите на ней строку [ELF] Loading AVR ELF file. В данной строке и будет указан путь к директории размещения созданных файлов. В нашем случае будет две такие строки, поскольку в проекте используются два микроконтроллера, для каждого из них после удачной компиляции программного кода будут созданы в отдельной директории *.elf— и *.hex-файлы (рис. 15).

Вкладка Simulation Errors

Рис. 14. Вкладка Simulation Errors

Hex-файл машинного кода для микроконтроллера DD1, полученный в результате моделирования проекта передачи данных между двумя устройствами ATmega16 через интерфейс SPI

Рис. 15. Hex-файл машинного кода для микроконтроллера DD1, полученный в результате моделирования проекта передачи данных между двумя устройствами ATmega16 через интерфейс SPI

Проанализируем работу демонстрационной схемы, представленной на рис. 8. На вкладке Source Code программным путем были даны указания ведущему микроконтроллеру через интерфейс SPI отправить ведомому микроконтроллеру кодовую комбинацию. Программа ведомого микроконтроллера выводит на линии порта PD все нули, в результате чего два подключенных к порту светодиода будут погашены. Как только по интерфейсу SPI получена кодовая комбинация от ведущего микроконтроллера, запускается подпрограмма, дающая указания ведомому микроконтроллеру вывести на линии порта PD0 и PD7 значения логической 1 и 0 соответственно, которые удерживаются на этих линиях при помощи команды задержки. Затем на линии порта PD0 и PD7 выводятся значения логического 0 и 1 соответственно, затем, после задержки, выполнение этого фрагмента программы повторяется. После запуска моделирования при помощи двух светодиодов, подключенных к линиям порта PD0 и PD7, мы можем проверить правильность работы программы — светодиоды подсвечиваются и гаснут поочередно (рис. 12).

Передача данных через интерфейс SPI между тремя микроконтроллерами AVR

Рассмотрим процесс передачи данных через интерфейс SPI между несколькими микроконтроллерами AVR на примере микросхем ATmega16, для чего создадим новый проект ISIS и добавим в рабочее поле проекта три такие микросхемы, два светодиода, два резистора (100 Ом), два символа «земли». При этом микросхема DD1 будет выполнять роль ведущего микроконтроллера, а микросхемы DD2 и DD3 — ведомых. Соединим компоненты, как показано на рис. 16, и напишем на языке программирования С программный код управления передачей данных. Необходимо отметить, что программа инициализации пишется как для ведущего, так и для обоих ведомых микроконтроллеров.

Процесс моделирования проекта передачи данных между тремя микроконтроллерами ATmega16 через интерфейс SPI в программной среде Proteus

Рис. 16. Процесс моделирования проекта передачи данных между тремя микроконтроллерами ATmega16 через интерфейс SPI в программной среде Proteus

При этом задача мастера — послать управляющий сигнал (кодовую комбинацию) сначала первому ведомому устройству, а затем второму. Переключение между ведомыми устройствами выполняется путем установки ведущим микроконтроллером логического нуля на линии S—S ведомых микроконтроллеров. При этом при передаче данных по интерфейсу SPI между тремя микроконтроллерами в нашем примере данный сигнал выдается на линии PB0, PB1 порта PB ведущего микроконтроллера. Задача каждого ведомого устройства — принять кодовую комбинацию, после чего запустить цикл, в котором выполняется последовательное включение и выключение светодиода.

Для удобства соединения в рабочей области проекта отразим по горизонтали микросхему DD1. В окне настроек Edit Component для каждого микроконтроллера установим следующие параметры (рис. 17):

  • поле CKOPT (Oscillator Options) — (1) Unprogrammed;
  • поле BOOTRST (Select Reset Vector) — (1) Unprogrammed;
  • поле CKSEL Fuses — (0001) Int.RC 1 МГц;
  • поле Boot Loader Size — (00) 1024 words. Starts at 0x1C00;
  • поле SUT Fuses — (00);
  • поле Advanced Properties — Clock Frequency (Default).
Настройки параметров микроконтроллера ATmega16 при передаче данных между тремя устройствами через интерфейс SPI

Рис. 17. Настройки параметров микроконтроллера ATmega16 при передаче данных между тремя устройствами через интерфейс SPI

Окно настроек можно открыть при помощи двойного щелчка левой кнопкой мыши по выбранному на схеме микроконтроллеру.

Напишем на языке программирования С следующий код программы инициализации для ведущего микроконтроллера:

#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <util/delay.h>
int main()
{
PORTB=0b00000000; // инициализация порта PB микросхемы DD1
DDRB=0b10100011; // указываем направление передачи информации по линиям порта
// линии MOSI, SCK, PB0, PB1 установлены как выходы
SPCR=0b01010011; // инициализация SPI
SPSR=0b00000000;
PORTB=0b00000010; // выбираем для передачи данных по SPI первый ведомый МК
SPDR=0b11111110; // отсылаем кодовую комбинацию для первого ведомого МК
_delay_ms(1000); // задержка
PORTB=0b00000001; // выбираем для передачи данных по SPI второй ведомый МК
SPDR=0b11111110; // отсылаем кодовую комбинацию для второго ведомого МК
_delay_ms(1000);
return 0;
}

Для ведомого микроконтроллера DD2 был написан следующий код программы инициализации:

#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <util/delay.h>
int main()
{
PORTB=0b00000000; // инициализация порта PB микросхемы DD2
DDRB=0b00000000; // линии порта PB работают как входы
PORTD=0b00000000; // инициализация порта PD микросхемы DD2
DDRD=0b11111111; // линии порта PD работают как выходы
SPCR=0b01000011; // инициализация SPI
while (1) // бесконечный цикл
{
if (SPDR!=0b11111110) // если кодовая комбинация не получена
PORTD=0b00000000; // посылаем на все линии порта PD - 0
else if (SPDR==0b11111110) // если кодовая комбинация получена
{PORTD=0b00000001; // включить светодиод D1
_delay_ms(1000); // задержка
PORTD=0b10000000; // погасить светодиод D1
_delay_ms(1000); } // задержка
}}
Код программы инициализации для ведомого микроконтроллера DD3:
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <util/delay.h>
int main()
{
PORTB=0b00000000; // инициализация порта PB микросхемы DD3
DDRB=0b00000000; // линии порта PB работают как входы
PORTD=0b00000000; // инициализация порта PD микросхемы DD3
DDRD=0b11111111; // линии порта PD работают как выходы
SPCR=0b01000011; // инициализация SPI
while (1) // бесконечный цикл
{
if (SPDR!=0b11111110) // если кодовая комбинация не получена
PORTD=0b00000000; // посылаем на все линии порта PD - 0
else if (SPDR==0b11111110) // если кодовая комбинация получена
{PORTD=0b00000001; // включить светодиод D2
_delay_ms(1000); // задержка
PORTD=0b10000000; // погасить светодиод D2
_delay_ms(1000); } // задержка
}}

Код программы инициализации вводится на вкладке Source Code редактора ISIS на отдельной закладке для каждого микроконтроллера (рис. 18). После того как в рабочей области проекта собрана схема, а на вкладке Source Code введен код программы, можно запускать моделирование.

Передача данных между тремя устройствами ATmega16 через интерфейс SPI, вкладка Source Code

Рис. 18. Передача данных между тремя устройствами ATmega16 через интерфейс SPI, вкладка Source Code:
а) код программы инициализации ведущего микроконтроллера;
б) код программы инициализации первого ведомого микроконтроллера;
в) код программы инициализации второго ведомого микроконтроллера

В результате, если компилятор в листинге программы не обнаружит ошибок, на диске компьютера в рабочей папке проекта будут созданы для каждого микроконтроллера *.elf— и *.hex-файлы (рис. 19).

Hex-файлы машинного кода для микроконтроллеров

Рис. 19. Hex-файлы машинного кода для микроконтроллеров:
а) DD1;
б) DD2;
в) DD3, полученные в результате моделирования проекта передачи данных между тремя устройствами ATmega16 через интерфейс SPI

Проанализируем работу демонстрационной схемы, представленной на рис. 16. На вкладке Source Code программным путем были даны указания ведущему микроконтроллеру через интерфейс SPI отправить каждому ведомому микроконтроллеру кодовую комбинацию. Это действие выполняется последовательно. Сначала ведущий микроконтроллер через линию PB0 своего порта PB подает на линию S—S микросхемы DD2 логический ноль, а через линию PB1 на линию S—S микросхемы DD3 логическую единицу, что оповещает первое ведомое устройство о том, что именно оно выбрано для обмена данными с мастером по интерфейсу SPI, активизирует интерфейс SPI микросхемы DD2 и делает неактивным интерфейс SPI микросхемы DD3.

После задержки ведущий микроконтроллер через линию PB1 своего порта PB подает на линию S—S микросхемы DD3 логический ноль, а через линию PB0 на линию S—S микросхемы DD2 логическую единицу, что активизирует интерфейс SPI микросхемы DD3 и делает неактивным интерфейс SPI микросхемы DD2.

Если ведомое устройство выбрано ведущим, то программа ведомого микроконтроллера выводит на линии порта PD все нули, и в результате подключенный к порту светодиод будет погашен. Как только по интерфейсу SPI получена кодовая комбинация от ведущего микроконтроллера, запускается подпрограмма, дающая указания ведомому микроконтроллеру запустить цикл, в котором последовательно выводятся на линию порта PD0 значения логической 1 и 0. Эти значения удерживаются при помощи команды задержки.

После запуска моделирования при помощи двух светодиодов, подключенных к линиям PD0 порта PD ведомых микроконтроллеров DD2 и DD3, мы можем проверить правильность работы программы — светодиоды подсвечиваются и гаснут поочередно, что наглядно демонстрирует осциллограмма, представленная на рис. 20. В момент времени, когда на выводе PD0 микроконтроллера DD2 единица, на выводе PD0 микроконтроллера DD3 — ноль.

Осциллограмма работы светодиодов D1 и D2

Рис. 20. Осциллограмма работы светодиодов D1 и D2

 

Инструменты отладки

Отладка программы инициализации микроконтроллера AVR в Proteus выполняется на вкладке AVR Source Code, которую можно открыть при помощи команды основного меню редактора ISIS — Debug/Start VSM Debugging. При этом для каждого имеющегося в проекте микроконтроллера откроется своя вкладка. В проекте передачи данных через интерфейс SPI между тремя микроконтроллерами ATmega16 в процессе отладки будет открыто три такие вкладки: AVR Source Code DD1, AVR Source Code DD2, AVR Source Code DD3 (рис. 21). В верхней части каждой вкладки AVR Source Code расположено меню для выбора файла отладки, которое будет полезно при наличии в проекте двух или более файлов программного кода, и ряд кнопок:

  • Run Simulation— продолжить выполнение программы;
  • Step Over Source Line— шаг без входа в подпрограмму;
  • Step Into Source Line— шаг с входом в подпрограмму;
  • Step Out from Source Line— исполнять код до возврата из подпрограммы;
  • Run To Source Line— исполнять код, пока не будет достигнута выделенная строка;
  • Toggle Breakpoint— триггер точек остановки.
Окно отладки AVR Source Code DD2

Рис. 21. Окно отладки AVR Source Code DD2

Щелкнув правой кнопкой мыши в окне отладчика, можно настроить следующие его опции (рис. 22):

  • Dissassembly— дизассемблирование;
  • Goto Line— перейти на линию;
  • Goto Address— перейти на адрес;
  • Find— найти;
  • Toggle (Set/Clear) Breakpoint— установить/очистить точку остановки;
  • Enable All Breakpoints— разрешить все точки остановки;
  • Disable All Breakpoints— запретить все точки остановки;
  • Clear All Breakpoints— удалить все точки остановки;
  • Fix-up Breakpoints On Load— зафиксировать точки остановки при загрузке проекта;
  • Display Line Numbers— показывать номера линий;
  • Display Addresses— показывать адреса команд;
  • Display Opcodes— показывать машинный код команд;
  • Set Font— настройка шрифта;
  • Set Colours— настройка цветовой схемы.
Контекстное меню опций окна отладчика

Рис. 22. Контекстное меню опций окна отладчика

Точка остановки — это прерывание хода выполнения программы при отладке в месте ее установки. Причем выполнение программы останавливается, но не завершается. Теперь, к примеру, можно просмотреть значения переменных или продолжить выполнение программы пошагово. Для того чтобы установить точку остановки, необходимо левой кнопкой мыши выделить нужную строку программы и нажать кнопку Toggle Breakpoint в правом верхнем углу вкладки AVR Source Code, в результате в строке появится красная точка, символизирующая точку остановки.

При отладке программного кода можно наблюдать за содержимым регистров микроконтроллера и значениями переменных программы инициализации, для чего можно воспользоваться окнами Watch Window и AVR Variables (рис. 23). Открыть эти окна можно командами основного меню Debug/Watch Window и Debug/AVR/Variables соответственно.

Окно AVR Variables — DD2

Рис. 23. Окно AVR Variables — DD2

В окне Watch Window (рис. 24) можно размещать регистры микроконтроллера и не только отслеживать их содержимое в ходе выполнения программы, но и задавать некоторые условия и действия при достижении этих условий (например, остановить симуляцию). Добавление регистра выполняется щелчком правой кнопки мыши в области окна Watch Window и выбором в открывшемся контекстном меню пункта Add Items (By Name) — добавить элементы по имени, в результате чего будет открыто окно Add Memory Item (рис. 25), содержащее список всех регистров микроконтроллера. Выбрать нужный элемент для добавления в этом окне можно двойным щелчком левой кнопки мыши в поле Watchable Items, после чего этот элемент будет добавлен в окно Watch Window. Если схема проекта содержит несколько микроконтроллеров, то в меню Memory из выпадающего списка необходимо выбрать позиционное обозначение микросхемы микроконтроллера, состояние регистров которого мы хотим отслеживать. По окончании добавления всех элементов нажмите кнопку Done в окне Add Memory Item.

Окно Watch Window

Рис. 24. Окно Watch Window

Окно Add Memory Item

Рис. 25. Окно Add Memory Item

Добавить элементы в окно Watch Window можно по адресу, для чего вызовите в окне контекстное меню и выберите в нем пункт Add Items (By Address).

Элементы в окне Watch Window располагаются в виде списка, который можно развернуть щелчком левой кнопки мыши по значку «+», при этом станут доступными для просмотра адрес и значения функционально связанных битов регистра.

При отладке программного кода можно задавать некоторые условия и действия при достижении этих условий. Для чего вызовите в окне Watch Window щелчком правой кнопки мыши контекстное меню и выберите в нем пункт Watchpoint Condition, в результате откроется одноименное окно (рис. 26). Рассмотрим данное окно более подробно, в его верхней части расположен ряд переключателей:

  • Turn off (disable) watch points — запретить остановку по условию;
  • Suspend the simulation if ANY expressions is true — остановить симуляцию, если выполнено любое условие;
  • Stop the simulation only when ALL expressions are true — остановить симуляцию, если все условия выполнены.
Окно Watchpoint Condition

Рис. 26. Окно Watchpoint Condition

В поле Item Break Expression можно выполнить:

  • выбор регистра, для которого будет применяться условие (меню Item);
  • выбор маски и значения маски (меню Mask);
  • выбор условия (меню Condition);
  • установку значения, с которым будет сравниваться содержимое регистра (поле Value).

К примеру, чтобы симулятор остановился, когда бит 0 порта PORTD микроконтроллера DD2 будет равен 1, необходимо в окне Watchpoint Condition задать следующие значения:

  • установить переключатель в поле Global Break Condition в позицию Suspend the simulation if ANY expressions is true;
  • в меню Item из выпадающего списка выбрать пункт PORTD0;
  • в поле Mask установить значение 0х01, а в меню из выпадающего списка выбрать значение AND;
  • в меню Condition из выпадающего списка выбрать значение Equals (равно);
  • в поле Value установить значение 0х01.

Состояние памяти и регистров процессора можно просмотреть при помощи следующих команд основного меню редактора ISIS:

  • Debug/AVR/CPU Registers (рис. 27а);
  • Debug/AVR/SRAM (рис. 27б);
  • Debug/AVR/Program Memory (рис. 27в).
Состояние

Рис. 27. Состояние:
а) регистров процессора;
б) памяти SRAM;
в) памяти программ микроконтроллера

При этом для каждого микроконтроллера проекта в меню Debug будет добавлена отдельная строка. Необходимо отметить, что данное меню доступно, когда процесс симуляции проекта временно приостановлен, то есть нажата кнопка Pause the simulation, or start up at time 0 if stopped (кнопка находится в левом нижнем углу окна редактора ISIS).

Литература
  1. ISIS Help. Labcenter Electronics, 2014.
  2. Филатов М. Проектирование схем электрических принципиальных с использованием микроконтроллеров в программной среде Proteus 8.1 // Компоненты и технологии. 2015. № 7.
  3. Филатов М. Работа с микроконтроллерами AVR в программной среде Proteus 8.1 // Компоненты и технологии. 2015. № 11.
  4. Мортон Д. Микроконтроллеры AVR. Вводный курс. М.: ИД «Додэка-XXI», 2006.
  5. Евстифеев А. В. Микроконтроллеры AVR семейства Mega. Руководство пользователя. М.: ИД «Додэка-XXI», 2007.
  6. 8‑bit AVR Microcontroller with 16K Bytes In-System Programmable Flash. ATmega16, ATmega16L. Atmel Corporation. 2010.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *