Знакомство с семейством PIC
Наконец-то сегодня нашлось время познакомить вас с ещё одним семейством микроконтроллеров — это микроконтроллеры PIC.
Данные микроконтроллеры также являются очень известными, устанавливаются во многие устройства и давно уже снискали у радиолюбителей очень сильный интерес.
Разработчиком данного семейства является компания Microchip, которая также ялвяется очень известной и её продукция востребована по всему миру.
Изучение данной серии контроллеров является очень нелёгким вопросом, я этим заниматься начал уже давно, но нормально разобрался с линейкой только сейчас. Последнее время я немного ускорил процесс изучения микроконтроллеров PIC благодаря вашим просьбам в группах и чатах, на которые я не мог не откликнуться.
Также к тому, чтобы поделиться своими знаниями в области программирования данной линейки, меня подтолкнуло то, что я видел много блогов, уроков (в том числе и видео) очень хорошего качества по контроллерам PIC именно с использованием языка ассемблер. А вот на языке C уроков очень мало, что подчёркивает их востребованность.
Поэтому замечу, что программировать МК PIC мы будем именно на языке C. Какую мы выберем среду программирования и компилятор, мы решим чуть позже, а пока же в данном уроке нас ждёт краткое знакомство с самими контроллерами, с их архитектурой и их разновидностями.
Разновидностями контроллеров мы будем считать их деление по архитектуре. Примем за основу разрядность их ядра.
Например, те контроллеры AVR, с которыми мы до сих пор работаем, являются 8-битными, а контроллеры STM, которые мы изучаем — 32-битными.
Вот и контроллеры PIC также делятся по битности.
Первая линейка — это 8-битные контроллеры PIC. Наименование их моделей начинается с префикса PIC10/PIC12/PIC16.
Данная линейка также делится на 3 семейства.
1. BASELINE — данная архитектура присутствует у контроллеров PIC10. От более мощной серии она отличается количеством выводов (от 6 до 28), дешевизной.
2. MID-RANGE — данную архитектуру имеют ядра микроконтроллеров PIC12/PIC16. Количество выводов в данной серии увеличено (от 6 до 64), стоят они несколько дороже, зато имеют помимо 35 машинных инструкций, поддерживаемых серией BASELINE, ещё 14 дополнительных инструкций (оптимизированных под компилятор языка C). Также у данной серии производительность увеличена на 50%, они имеют более глубокий и улучшенный аппаратный стек, увеличенный объём памяти и некоторые прочие прелести, с которыми мы познакомимся в дальнейшем, так как, скорее всего, мы с данной серии и начнём процесс изучения программирования микроконтроллеров PIC.
3. 8-битовые микроконтроллеры PIC18 — это улучшенная серия контроллеров, здесь на борту много другой периферии, количество выводов от 18 до 100, производительность 16 MIPS, поддержка технологии NanoWatt, наличие программироуемого генератора.
Вторая линейка — это 16-битные контроллеры PIC. Они имеют префикс PIC24F и PIC24H. Это уже более мощные контроллеры. В отличие от первой линейки, машинная команда выполняется уже не за 4 такта генератора, а за 2. Также периферия еще более расширена по разновидностям шин, прямой доступ к памяти DMA (у PIC24H), расширенный набор инструкций. Также есть очень много других особенностей.
Третья линейка — это 32-битные контроллеры. Префикс у них уже PIC32. Частота тактирования таких контроллеров до 120 МГц, а у новой серии MZ — до 200 и даже выше. У меня, например, есть отладочная плата, на которой устрановлен контроллер PIC32MZ2048EFH064, у которого тактовая частота составляет 252 мегагерца. Также здесь ещё более увеличена производительность ядра. Данное семейство построено на ядре MIPS32®, которое также кроме высокой производительности отличается ещё и низким потреблением энергии.
Вообщем, вот такие вот краткие характеристики существующих на данный момент контроллеров PIC. Если брать по наименованиям, то наименований очень много, на любой, как говорится, вкус.
Также, как и рассмотренные, а также рассматриваемые нами контроллеры AVR и STM32, контроллеры PIC работают приблизительно по той же схеме. Сочиняется программа, собирается в машинный код, понятный арифметическо-логическому устройству контроллера, загружается (прошивается или заливается) в контроллер и затем обеспечивает работу по определённому алгоритму. Основной интерфейс, используемый для прошивки данных контроллеров — это ICSP, предназначенный для внутрисхемного программирования. Подробнее с ним мы познакомимся, когда будем прошивать данные контроллеры.
Давайте немного разберёмся с организацией памяти в контроллерах PIC. Так как мы начнём изучение семейства PIC с более простых 8-битных (принцип от простого — к сложному ведь не отменял никто), то и организацию памяти мы посмотрим у данной серии.
Сначала посомтрим блок-схему контроллера на примере МК PIC16F84A (нажмите на картинку для увеличения изображения)
В левом верхнем углу сразу бросается в глаза модуль памяти FLASH, в которой обычно хранится программа контроллера (прошивка). А в правом верхнем углу мы видим память EEPROM, которая уже исользуется для хранения данных. Эти два вида памяти являются энергонезависимыми и после отклчения и сброса контроллера не стираются. Но данная память не является быстрой, поэтому код при старте программы распределяется уже в память RAM (ОЗУ), которая уже является быстродействующей и предназначена для функционирования контроллера при работе. Поэтому данную память мы уже рассмотрим несколько поподробнее.
Оперативная память контроллера PIC делится на память программ и память данных.
Вот так организована память программ у контроллера PIC16F84A
Микроконтроллеры данной серии имеют счётчик команд, способный адресовать 8К x 14 слов памяти программ и 14-разрядную шину данных памяти программ. Вся память программ разделена на 4 страницы по 2 килослов каждая (0000h-07FFh, 0800h-0FFFh, 1000h-17FFh, 1800h-1FFFh). Ну это общая информация, поэтому у тех контроллеров, у которых память небольшая перемещение между данными страницами приведёт к циклической адресации. Поэтому размер памяти того контроллера, который мы хотим программировать, мы обязаны знать твёрдо. В общем случае память программ состоит из счётчика команд, стека нескольких уровней, память для хранения векторов прерываний, а также внутренней памяти программ.
Также немного познакомимся с организации оперативной памяти, отведённой под хранение данных.
Память данных разделяется на регистры общего назначения и регистры специального назначения. Посмотрим, как организована память данных контроллера PIC16F84A
Регистры специального назначения (SFR) — это регистры, которые предназначены для хранения строго отведённых величин и имеют определённые имена. С ними мы будем знакомиться постепенно, когда будем писать какой-то исходный код, который будет широко их использовать.
Регистры общего назначения (GPR) — это ячейки памяти, которые имеют только адреса и предназначены они для хранения любых данных.
Также из приведённого выше рисунка мы видим, что у нашего контроллера память данных разделена на 2 страницы (или банка) переход между которыми осуществляется посредством установки определённых битов в регистре STATUS. Поэтому данный регистр присутствует в обеих банках и обратиться к нему мы можем в любой момент, чтобы сменить текущую страницу памяти.
Адресация может быть как прямая, так и косвенная или относительная, когда адрес отсчитывается относительно текущего адреса. С этим мы возможно не будем знакомиться, так как такая задача возникает у программистов, которые пишут программы на ассемблере.
Соответственно, у каждого контроллера кроме памяти существует много чего ещё интересного, в том числе порты ввода-вывода. Наши контроллеры PIC — также не исключение. Посмотрим назначение ножек контроллера PIC16F84A
У данного контроллера два порта — порт A и порт B. Из порта A наружу выведены 5 ножек — RA0-RA4, а из порта B — все 8 ножек RB0-RB7.
Также ножки портов могут иметь и другое назначение в зависимости от того, как мы их сконфигурируем. Наример ножка 6 или RB0 может в любой момент превратиться в ножку для захвата внешних прерываний, а ножка 3 или RA4 — стать ножкой для тактирования таймера от внешнего генератора.
Тактирование МК PIC также может осуществляться как от внешнего генератора, так и от кварцевого резонатора, от внутреннего резистора, а также существует ещё несколько вариантов, которые поддерживают не все контроллеры данного семейства. На практике как правило используется тактирование от кварцевого резонатора. Скорее всего, мы также последуем данной традиции в наших дальнейших занятиях.
Думаю, на этом мы закончим знакомство с контроллерами PIC. Знакомство получилось кратким, но на первое время нам и этого хватит за глаза. С более расшифрованной информацией мы столкнёмся, когда будем сочинять наши программы. Так что ждите следующих занятий, которые обещают быть очень интересными. Мы познакомимся сначала с установкой среды и компилятора, изучим, как с ними работать, какие тонкости программирования присутствуют в настройках различной периферии, а также в работе с ней.
Написание первой программы для микроконтроллера PIC с помощью MPLABX
В нашей предыдущей статье про микроконтроллеры PIC мы рассмотрели архитектуру микроконтроллеров PIC, установили необходимое для работы с ними программное обеспечение и купили программатор PicKit 3. В данной же статье мы напишем нашу первую программу мигания светодиодом для микроконтроллера PIC16F877A и рассмотрим установку в нем битов конфигурации (фьюзов).
Поскольку мы используем микроконтроллер PIC16F877A вместе с компилятором XC8, то первым делом желательно изучить даташиты на них. Всегда, когда вы начинаете знакомство с новым микроконтроллером, желательно полностью прочитать даташит на него.
Программу для нашего микроконтроллера PIC16F877A мы будем писать в среде MPLAB-X
Создание нового проекта в MPLAB-X
Шаг 1. Запустите IDE MPLAB-X, в результате чего вы на экране должны увидеть следующее окно.
Шаг 2. Откройте пункт меню Files -> New Project (для этой цели можно также использовать комбинацию клавиш Ctrl+Shift+N). После этого вы на экране увидите следующее всплывающее окно, в котором вам необходимо выбрать Standalone Project и нажать Next.
Шаг 3. Теперь необходимо выбрать устройство для нашего проекта – выберем из выпадающего списка PIC16F877A. После этого нажмем на Next.
Шаг 4. На следующей странице нам необходимо выбрать инструменты (программатор) для нашего проекта. Выберем PicKit 3 и нажмем на Next.
Шаг 5. Затем необходимо выбрать компилятор – выберем XC8 и нажмем на Next.
Шаг 6. На следующей странице необходимо задать имя нашего проекта и местоположение куда он будет сохраняться. Мы назвали проект Blink. Файл проекта будет сохраняться с расширением .X, что позволяет запускать его непосредственным образом из MAPLB-X. После этого нажмем на Finish.
Шаг 7. Поздравляем. Теперь наш проект успешно создан. Слева в окне мы увидим имя нашего проекта (у нас оно Blink), нажмите на него чтобы посмотреть все файлы, которые входят в проект.
Чтобы начать написание программы в наш проект необходимо добавить основной файл (C Main file) в каталог с нашим проектом. Для этого сделайте правый клик мыши на source file и в открывшемся меню выберете New -> C Main File как показано на следующем рисунке.
Шаг 8. Откроется диалоговое окно с именем нашего C-файла. Мы назвали его снова Blink, но вы можете выбрать для него любое другое имя по своему усмотрению. После ввода имени файла нажмите на finish.
Шаг 9. После того как файл C будет создан, откроется IDE с некоторым кодом в ней по умолчанию, как показано на следующем рисунке.
Шаг 10. После этого можно начать написание программы в основном C файле (C-main File). Код по умолчанию, формируемый IDE, не будет нами использоваться в этом проекте, поэтому удалим его полностью.
Общие сведения о регистрах конфигурации в микроконтроллерах PIC
Микроконтроллеры PIC имеют несколько мест, в которых расположены биты конфигурации, которые также называют фьюзами (fuses). Эти биты определяют глобальную логику функционирования устройства (в нашем случае микроконтроллера). С их помощью задается режим работы генератора тактовой частоты, сторожевого таймера (watchdog timer), режима программирования и защиты кода. Очень важно установить эти биты правильно иначе наш микроконтроллер не сможет нормально функционировать.
Узнать об имеющихся регистрах конфигурации можно из даташита на микроконтроллер. Важно понять, какие типы битов конфигурации присутствуют в рассматриваемом микроконтроллере и каковы их функции. Эти биты можно установить или сбросить использую инструкцию pragma .
Данная инструкция имеет следующую форму:
где setting – описание настройки (установки), например, WDT, а state – текстовое описание необходимого состояния, например, OFF. Можно привести следующие примеры установки конфигурационных битов:
Для начинающих правильная установка битов конфигурации с помощью данных инструкций может представлять собой достаточно сложную задачу, которую можно значительно упростить в нашей среде разработки MPLAB-X.
Установка битов конфигурации (фьюзов) в MPLAB-X
Компания Microchip значительно упростила процесс установки битов конфигурации (фьюзов) в микроконтроллерах PIC, разработав для этого специальные графические инструменты. Для того, чтобы установить биты конфигурации (фьюзы) в микроконтроллерах PIC с помощью программы MPLAB-X, выполните следующую последовательность шагов.
Шаг 1. В программе MPLAB-X выберите пункт меню Window -> PIC Memory View -> Configuration Bits как показано на следующем рисунке.
Шаг 2. После этого внизу программы MPLAB-X откроется окно настройки битов конфигурации (Configuration Bits window) как показано на рисунке ниже. В нем вы можете установить значение каждого бита конфигурации по своему желанию. Далее мы рассмотрим установку некоторых из этих бит.
Шаг 3. Первыми битами конфигурации являются биты выбора генератора . Микроконтроллер PIC16F87XA может работать в одном из 4-х режимов генератора, которые можно установить с помощью битов FOSC1 и FOSC0:
- LP Low-Power Crystal (маломощный генератор);
- XT Crystal/Resonator (внешний кварцевый резонатор);
- HS High-Speed Crystal/Resonator (высокоскоростной кварцевый резонатор);
- RC Resistor/Capacitor (RC генератор).
Возможные частоты работы микроконтроллера в зависимости от выбранного типа генератора приведены в следующей таблице.
Для нашего проекта мы будем использовать внешний кварцевый генератор на 20Mhz, поэтому нам необходимо выбрать HS из выпадающего меню.
Шаг 4. Следующим битом конфигурации является бит включения/выключения сторожевого таймера .
Сторожевой таймер (Watchdog Timer, WDT) представляет собой непрерывно работающий встроенный RC генератор, для работы которого не требуется никаких внешних компонентов. Данный RC генератор отделен от RC генератора на контакте OSC1/CLKI. Это означает что сторожевой таймер будет продолжать работать даже если на контакты OSC1/CLKI и OSC2/CLKO не подается никакой тактовой частоты. В режиме нормального функционирования сторожевой таймер формирует сигнал аппаратного сброса (Watchdog Timer Reset) при своем переполнении. И если таймер не отключен в нашей программе, то микроконтроллер будет сбрасываться каждый раз при переполнении таймера. Сторожевой таймер можно отключить при помощи очистки его бита конфигурации.
В нашей программе мы не будем использовать сторожевой таймер, поэтому в выпадающем списке напротив его бита конфигурации выберем OFF.
Шаг 5. Следующим битом является таймер по питанию (Power-up timer Bit, PWRT) , который обеспечивает фиксированную задержку в 72 мс в работе микроконтроллера при подаче на него питания, что позволяет напряжению питания за это время подняться до приемлемого уровня. Когда данный бит активирован, таймер по питанию будет сбрасывать микроконтроллер до тех пор, пока питание не поднимется до необходимого уровня.
В нашей программе мы не будем использовать данную задержку, поэтому данный бит конфигурации мы также отключим (OFF).
Шаг 6. Следующим битом конфигурации является бит программирования при низком напряжении (Low-Voltage Programming, LVP) . Бит LVP позволяет производить программирование микроконтроллера пониженным напряжением через разъем ICSP. Мы не будем в нашем проекте использовать данный вид программирования, поэтому отключим данный бит (OFF).
Шаг 7. Следующими битами конфигурации у нас является бит EEPROM и биты защиты программы . Если бит EEPROM включен, то после программирования микроконтроллера никто не сможет перезаписать в нем программу. В нашем случае мы оставим все эти три бита в выключенном состоянии.
После того как все необходимые настройки битов конфигурации сделаны наше диалоговое окно должно выглядеть следующим образом.
Шаг 8. После этого выберите пункт меню Generate Source Code to Output – в результате этого код нашей программы будет сгенерирован, нам необходимо всего лишь скопировать его вместе с заголовочным файлом и вставить его в файл Blink.c как показано на следующем рисунке.
На этом настройка битов конфигурации (фьюзов) для нашего проекта будет закончена. Мы будем использовать подобную настройку битов конфигурации для всех проектов на основе микроконтроллеров PIC, которые мы далее рассмотрим на нашем сайте.
Написание программы мигания светодиодом для микроконтроллера PIC
В нашем проекте мы будем подключать светодиод к одному из контактов ввода/вывода микроконтроллера PIC16F877A, с помощью которого мы будем управлять миганием светодиода. Распиновка микроконтроллера PIC16F877A представлена на следующем рисунке.
Как видно из представленного рисунка, микроконтроллер PIC16F877 имеет 5 основных портов ввода/вывода. Обычно они обозначаются как PORT A (RA), PORT B (RB), PORT C (RC), PORT D (RD) и PORT E (RE). В данном случае PORT A содержит 6 контактов (с RA-0 по RA-5), ”PORT B” , “PORT C” и ”PORT D” содержат по 8 контактов (с RB-0 по RB-7, с RC-0 по RC-7, с RD-0 по RD-7), ”PORT E” содержит всего 3 контакта (с RE-0 по RE-2).
Все эти порты являются двунаправленными. Направление работы порта управляется с помощью регистров TRIS(X) (TRIS A используется для установки направления работы PORT-A, TRIS B используется для установки направления работы PORT-B и т.д.). Установка бита регистра TRIS(X) в ‘1’ будет означать, что соответствующий ему контакт порта PORT(X) сконфигурирован для работы на ввод данных (input). Установка бита регистра TRIS(X) в ‘0’ будет означать, что соответствующий ему контакт порта PORT(X) сконфигурирован для работы на вывод данных (output).
В нашем проекте мы установим контакт RB3 порта PORT B для работы на вывод данных – к нему подключен светодиод. Код программы для микроконтроллера PIC для мигания светодиодом будет выглядеть следующим образом:
Программирование микроконтроллеров PIC. Часть 1. Необходимые инструменты и программы. Основы MPLAB
Итак, вы решили научиться программировать pic-контроллеры. Для начала поговорим о том, что вам для работы с этими контроллерами понадобится.
Контроллер работает по определённой программе, которая должна как-то в него попасть. Обычно программу в машинных кодах, готовую для записи в контроллер, называют прошивкой. Следовательно нужно какое-то устройство, которое будет записывать (на сленге обычно говорят заливать или прошивать) программу в контроллер. Такое устройство называется программатор. Подробнее о программаторах и заливке программы мы поговорим позднее, в последней части нашей эпопеи (когда уже будет что заливать), а пока давайте по-порядку — как нам эту программу написать.
Программа для контроллера — это, как я уже сказал, набор машинных кодов, записанный в файле с расширением «hex» (здесь можно почитать про формат *.hex), который и нужно заливать в контроллер с помощью программатора. Никакого другого языка контроллер не понимает. Следовательно, нужна специальная программа, которая будет переводить текст программы, написанный на каком-либо языке программирования, в машинные коды. Наиболее удобными в этом плане являются интегрированные среды разработки (IDE — integrated development environment), поскольку они могут не только осуществлять перевод текста программы в машинный код, но и производить симуляцию её работы. Причём симуляцию можно проводить пошагово, при этом можно наблюдать состояние регистров или даже менять их состояние по своему желанию. Короче, интегрированные среды помимо, собственно, компиляции (перевода в машинные коды) предоставляют отличные возможности для отладки программы.
IDE, как и программаторов, существует много. Лично я пользуюсь MPLAB и вам рекомендую, по той простой причине, что MPLAB — это IDE от самого производителя PIC-контроллеров — фирмы Microchip, поэтому имеет отличную поддержку (в том числе на русском языке, что особенно приятно). С официального сайта Microchip можно скачать и сам этот пакет, и подробное описание по работе с ним. Если не нашли или ломает искать — ссылки для скачивания здесь, правда это уже не самая свежая версия.
В описании на русском языке про всё рассказано: от установки и настройки до удаления. В большинстве случаев вся установка заключается в том, чтобы запустить setup и ответить на пару вопросов, типа куда ставить драйверы и тому подобное, от себя лишь добавлю, что во избежание глюков ставить пакет надо в такую папку, чтобы в пути были только английские буквы (а не в какую-нибудь, типа C:\Программы\PIC\MPLAB). Вообще, кириллицу в путях к файлам или в названиях файлов лучше не использовать, иначе возможны глюки.
MPLAB позволяет писать программы на двух языках: СИ и Ассемблер. Интернет просто ломится от разборок СИ-шников и ассемблерщиков, которые с пеной у рта доказывают друг другу, какой язык лучше. Я отношу себя к ассемблерщикам, поэтому, естественно, расскажу почему лучше именно Ассемблер.
Ассемблер представляет собой набор элементарных команд, выполняемых контроллером. Каждая команда трактуется в машинный код совершенно однозначно, а результат её выполнения и время выполнения всегда одинаковы. То есть, если вы имеете листинг на ассемблере, то вы можете совершенно точно сказать, что делает контроллер в каждый момент времени и каким именно образом достигается нужный результат.
Программа на языке СИ (да и вообще на любом языке высокого уровня) — это уже набор команд не контроллера, а соответствующего языка. При компиляции каждая такая команда заменяется набором команд для контроллера, но каким именно набором команд она заменяется, — этого вы уже не знаете, это знает только разработчик языка программирования. Соответственно, невозможно понять, каким именно образом контроллер выполняет желаемое действие.
Короче говоря, в случае с языком высокого уровня вы изучаете как какой-то дядя обозвал свои способы реализации необходимых вам функций и по каким правилам их надо записывать. В данном случае можно провести следующую аналогию: вы хотите поговорить с китайцем, но вам говорят: "Китайский слишком сложный язык, но есть один дядя в Болгарии, который 20 лет жил в Китае и отлично его выучил. А болгарский язык с русским очень похожи и русскому человеку он интуитивно понятен, так что выучите болгарский, а уж дядя переведёт."
В случае с ассемблером, вы изучаете сам контроллер и правила, по которым надо разговаривать с контроллером. При этом контроллер имеет всего-то несколько десятков команд, которые умещаются на одном листке и их легко можно окинуть одним взглядом.
Надеюсь, к этому моменту вы уже сделали выбор языка программирования, так что пойдём дальше.
Что нужно сделать в MPLAB, чтобы получить желанную прошивку? Как я уже сказал — подробности читайте в руководстве к IDE MPLAB, оно на русском и там всё понятно (если не понятно — идём на форум), я же только кратко перечислю самое основное и дам некоторые рекомендации.
Итак, мы установили MPLAB, хотим написать в нём программу для контроллера и получить готовую прошивку.
Сначала нужно создать проект. Для каждого проекта рекомендую заводить отдельную папку, потому что, во-первых, в проект может входить несколько файлов, а, во-вторых, сам MPLAB создаст ещё несколько вспомогательных файлов (*.lst, *.err, *.cod, *.bkx). Если несколько проектов будут в одной папке, то легко можно запутаться какие файлы к какому проекту относятся. Короче, создаём для проекта новую папку, потом запускаем MPLAB и выбираем меню Project -> New Project…
В появившемся окошке, в проводнике справа, выбираем нашу папку, в левой части (в поле под надписью File Name) пишем название будущего проекта, например my1.pjt (не забываем указать расширение), и жмём ОК.
Появляется окно с названием Edit Project. Это менеджер проекта, в котором указываются параметры проекта (какие файлы и библиотеки нужно подключить к проекту, какой будет использоваться камень, будет ли использоваться симуляция и многое другое). Находим поле ввода с названием Development Mode. Справа от этого поля есть кнопочка Change… Нажимаем.
Открывается окошко с названием Development Mode, в котором мы видим кучу вкладок. На вкладке Tools ставим галочку рядом с MPLAB SIM Simulator (грех для отладки симулятором не пользоваться), в поле ввода Processor выбираем контроллер, с которым мы будем работать. На вкладке Clock указываем какая у нас будет частота генератора. Жмём ОК. На ошибку и предупреждение не обращаем внимания, это просто нам говорят, что пока не могут создать .hex (ну правильно, у нас пока и программы нет) и что при изменении настроек надо заново перекомпилировать проект (так мы ещё вообще ни разу не компилировали).
В поле ввода Language Tool Suite выбираем Microchip.
Нажимаем кнопку с названием Add Node… В появившемся окне, в проводнике справа выбираем папку проекта, в поле ввода слева пишем как будет называться файл с текстом программы на ассемблере, например my1.asm (не забываем указывать расширение), и жмём ОК. Всё, теперь мы подключили к проекту файл my1.asm (указали, что текст программы будет в этом файле).
На этом с Edit project заканчиваем, — нажимаем ОК.
Теперь нужно, собственно, создать файл с текстом программы (в менеджере проекта мы просто указали, что текст будет в таком-то файле, но фактически этот файл ещё не создан). Для этого идём в меню File и выбираем пункт New. Откроется окошко редактора с названием Untitled1. Выбираем меню File -> Save As…, в проводнике справа указываем папку проекта, в поле ввода File Name пишем название файла, которое мы указали в менеджере проекта, то есть в нашем примере это будет my1.asm. Если всё сделано правильно, то название окошка редактора поменяется с Untitled1 на \путь\my1.asm.
Вот и всё! Теперь осталось только набрать в окошке редактора текст программы, скомпилировать проект (меню Project->Build All) и, если в программе нет ошибок (что с первого раза бывает очень редко), то в папке проекта появится готовая прошивка (файл с расширением hex), которую можно заливать в контроллер.
Программирование микроконтроллеров семейства PIC
Первые микроконтроллеры появились в 60-х годах. Автоматизированные системы до этого времени обычно строились на основе реле. Теперь программируемые логические контроллеры распространены повсеместно. Однако программирование микроконтроллеров — процесс нередко сложно воспринимаемый. Поэтому рассмотрим, как программировать контроллер на примере широко известной серии ПЛК (PLC — Peripheral Interface Controller) — продукта компании Microchip Technology Inc.
Общий взгляд на устройства ПЛК
Системы на базе микропроцессора (микроконтроллеры) выступают в качестве программируемых электронных устройств, для которых специально разработаны языки программирования.
Благодаря таким языкам программирования, существенно облегчается процесс программирования контроллеров. Язык высокого уровня, созданный для ПЛК, обеспечивает простоту, эффективность и дружелюбную среду для пользователя.
Микропроцессор фактически можно рассматривать электронной схемой, поддерживающей обработку команд, хранящихся в системной памяти. Эта же схема работает с инструкциями — арифметическими и логическими, использует внешние устройства:
- память,
- входные порты,
- выходные порты.
В свою очередь, микроконтроллер представляет собой интегральную схему, в составе которой присутствуют:
- микропроцессор,
- память программ и данных,
- генератор тактовых импульсов,
- интерфейсы ввода и вывода,
- таймеры,
- аналого-цифровые преобразователи,
- внешние коммуникационные порты и другие схемы.
Макрос языка высокого уровня — это инструкция, которая является сокращённой строкой, содержащей несколько инструкций. Запись программы с повторяющимися действиями (схожестью инструкций) при использовании макросов значительно сокращается.
Микроконтроллеры используются в составе современной электроники повсеместно. Умение выполнять программирование микроконтроллеров открывает широкие горизонты
Эффективность программы на основе макросов столь же эффективна, как и запись программы на языке «C». Компилятор отвечает за создание соответствующих подстановок для генерации кода, который передаётся в память программы микропроцессора или микроконтроллера.
Программирование микроконтроллеров PIC 12 / PIC 16
Программирование микроконтроллеров PIC выполняется с использованием проприетарного последовательного протокола. Поэтому конечному пользователю недостаточно просто взять и подключить микросхему контроллера PIC напрямую к любому «стандартному» интерфейсу.
Однако технические требования относительно программирования по времени достаточно слабы. Этот фактор даёт возможность использовать некоторые выводы параллельного или последовательного порта компьютера для генерации программной последовательности с помощью программного обеспечения.
Помимо рабочего напряжения, микроконтроллерам требуется ещё три сигнала:
- Программируемое напряжение (около 13В).
- Таймер программирования (ICSPCLK).
- Данные (ICSPDAT).
Поскольку большинство выпускаемых экземпляров PIC допускают программируемое напряжение несколько ниже значения, указанного спецификацией, открывается возможность использования уровней сигналов ± 12В, присутствующих на интерфейсе последовательного порта настольного ПК.
Таким образом, «записать» PIC вполне допустимо без необходимости подключения дополнительного источника питания. Преобразование уровней допускается выполнять при помощи нескольких компонентов. Однако представленная ниже упрощённая схема, обладает некоторыми ограничениями.
В частности, позволяет считывать и программировать непосредственно PIC устройства. Нет никакой гарантии, что эта схема способна обеспечить программирование всех контроллеров, поскольку не соответствует полной спецификации программирования.
Схема принципиальная упрощённого программатора микроконтроллеров серии PIC и обозначенные линии подключения интерфейсов RS232 / ISSP
Внутрисхемное программирование микроконтроллеров PIC
Разъём внутрисхемного программирования (ICSP) предоставляет возможность запрограммировать микроконтроллер непосредственно в рамках прикладной схемы.
Этот вариант видится особенно полезным в домашних условиях или в другой не специальной среде. Например там, где по каким-либо причинам требуется повторное изменение — программирование микроконтроллеров PIC и тестирование схемы.
Применение разъёма ICSP позволяет избежать рисков при перемещении микроконтроллера PIC между различными гнездами (например, в случае изгиба контактов или воздействия на микроконтроллер электростатических разрядов). Также работа с разъёмом ICSP обеспечивает экономию времени.
Вот такой вариант ICSP соединителя вполне подойдёт для подключения линий связи на случай выполнения программирования микроконтроллера серии PIC12/PIC16
Следует внимательно использовать интерфейс и кабель ICSP, принимая во внимание, что схема не должна нарушать ход сигналов программирования. Другими словами – точное соответствие месту назначения сигналов необходимо выполнять безукоризненно.
Основные условия программирования:
- время переключения напряжения программирования «0 – 13В» составляет несколько микросекунд;
- полный размах напряжения сигналов таймера и данных достигается в течение одной микросекунды;
- вывод сигнала PGM остаётся низким всё время программирования.
Некоторые микроконтроллеры PIC требуют применения напряжения программирования до подачи рабочего напряжения. В этом случае напряжением программирования управляют через модуль программатора. Самый простой способ выполнить первые два условия — не использовать корреспондирующие выводы в цепях схемы. Если необходимо, следует использовать отладчик.
Рекомендации относительно процедуры программирования
Не рекомендуется подключать активные цепи к линии внешнего (основного) сброса (MCLR – Microcontroller Line Reset). Если сигнал MCLR используется для сброса PIC, следует устанавливать резистор номинальным сопротивлением более 56 кОм между выводами MCLR и подачи напряжения питания.
Рекомендуется в цепь резистора включать конденсатор небольшой ёмкости — менее 100 пФ со смещением на землю (вывод GND).
Сигнальные выводы программирования должны исключать наличие индуктивной или ёмкостной нагрузки. Когда рабочее напряжение питания берётся от модуля программатора, требуется изолировать вывод питания PIC от остальной части прикладной схемы в процессе программирования.
Схемные доработки программатора микроконтроллера, рекомендуемые с целью обеспечения более качественного процесса программирования устройства
Этот вариант может иметь место, если схема содержит собственный стабилизатор напряжения питания и оснащается развязывающим конденсатором большой ёмкости. Модуль программатора, предназначенный под напряжение питания 3,3В, не в состоянии заряжать конденсатор достаточно быстро, а для программирования PIC требуется не менее 4,5В.
Между тем вариант изолирования можно исключить, если в схеме используется диод Шоттки. Чтобы удерживать вывод перевода микроконтроллера в режим программирования (PGM) на низком уровне, рекомендуется подключать этот вывод к земле через резистор номиналом от 2,2 кОм до 10 кОм.
Всегда рекомендуется таймер включения питания вносить в «слово» конфигурации. Задержка таймера более 40 мс даёт достаточно времени для стабилизации напряжения питания перед началом любой операции. Такой шаг позволяет избежать непреднамеренного выполнения программы до входа в режим программирования.
Во время программирования остальные контакты порта остаются в режиме ввода — имеют высокий импеданс. Используемой схемой необходимо обрабатывать такое состояние по возможности неактивным способом. Чтобы избежать нежелательных «побочных эффектов», следует рассмотреть возможность дополнения подтягивающими резисторами.
Для обеспечения повторного программирования микроконтроллера PIC в условиях напряжения питания ниже 4,5В, область памяти необходимо отключить от защиты. Это обусловлено применением «Chip Erase», единственного способа удаления кода или защиты данных, которого требуют практически все микроконтроллеры PIC с напряжением питания выше 4,5В.
Сигналы ICSP соответствующие контактам PIC 12Fxxx / 16Fxxx
Число ниже аббревиатуры сигнала соответствует выходу разъема ICSP модуля программатора. Для использования модуля с тестовыми платами сторонних производителей требуется адаптер.
Следует обратить внимание: разъём ICSP этого модуля программатора имеет различный порядок сигналов по сравнению с другими программаторами микроконтроллеров PIC
Следующие схемы показывают, как подключать сигналы программирования к микроконтроллерам PIC 12Fxxx / 16Fxxx:
Схемы, определяющие порядок подключения сигнальных проводников, участвующих в процедуре чтения/записи данных микроконтроллеров разной конфигурации
Программирование микроконтроллеров + фирменные средства
Существует солидная группа фирменных программаторов для микроконтроллеров семейства PIC. Наиболее известные аппаратные средства:
- REAL ICE
Характерные отличия отмеченных программаторов – устройства обладают не просто классическими функциями чтения/записи. Фирменным программаторам присущ целый ряд расширенных функций, включая полный контроль содержимого памяти и стёка.
На основе информации: Uolsinectis
КРАТКИЙ БРИФИНГ
Z-Сила — публикации материалов интересных полезных для социума. Новости технологий, исследований, экспериментов мирового масштаба. Социальная мульти-тематическая информация — СМИ .