PIC Урок 1. Знакомство с семейством PIC

 

 

 

 

Урок 1

 

Знакомство с семейством 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 (нажмите на картинку для увеличения изображения)

 

Image00_0500

 

В левом верхнем углу сразу бросается в глаза модуль памяти FLASH, в которой обычно хранится программа контроллера (прошивка). А в правом верхнем углу мы видим память EEPROM, которая уже исользуется для хранения данных. Эти два вида памяти являются энергонезависимыми и после отклчения и сброса контроллера не стираются. Но данная память не является быстрой, поэтому код при старте программы распределяется уже в память RAM (ОЗУ), которая уже является быстродействующей и предназначена для функционирования контроллера при работе. Поэтому данную память мы уже рассмотрим несколько поподробнее.

Оперативная память контроллера PIC делится на память программ и память данных.

Вот так организована память программ у контроллера PIC16F84A

 

Image01

 

Микроконтроллеры данной серии имеют счётчик команд, способный адресовать 8К x 14 слов памяти программ и 14-разрядную шину данных памяти программ. Вся память программ разделена на 4 страницы по 2 килослов каждая (0000h-07FFh, 0800h-0FFFh, 1000h-17FFh, 1800h-1FFFh). Ну это общая информация, поэтому у тех контроллеров, у которых память небольшая перемещение между данными страницами приведёт к циклической адресации. Поэтому размер памяти того контроллера, который мы хотим программировать, мы обязаны знать твёрдо. В общем случае память программ состоит из счётчика команд, стека нескольких уровней, память для хранения векторов прерываний, а также внутренней памяти программ.

 

 

Также немного познакомимся с организации оперативной памяти, отведённой под хранение данных.

Память данных разделяется на регистры общего назначения и регистры специального назначения. Посмотрим, как организована память данных контроллера PIC16F84A

 

Image02

 

Регистры специального назначения (SFR) — это регистры, которые предназначены для хранения строго отведённых величин и имеют определённые имена. С ними мы будем знакомиться постепенно, когда будем писать какой-то исходный код, который будет широко их использовать.

Регистры общего назначения (GPR) — это ячейки памяти, которые имеют только адреса и предназначены они для хранения любых данных.

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

Адресация может быть как прямая, так и косвенная или относительная, когда адрес отсчитывается относительно текущего адреса. С этим мы возможно не будем знакомиться, так как такая задача возникает у программистов, которые пишут программы на ассемблере.

Соответственно, у каждого контроллера кроме памяти существует много чего ещё интересного, в том числе порты ввода-вывода. Наши контроллеры PIC — также не исключение. Посмотрим назначение ножек контроллера PIC16F84A

 

Image03

 

У данного контроллера два порта — порт A и порт B. Из порта A наружу выведены 5 ножек — RA0-RA4, а из порта B — все 8 ножек RB0-RB7.

Также ножки портов могут иметь и другое назначение в зависимости от того, как мы их сконфигурируем. Наример ножка 6 или RB0 может в любой момент превратиться в ножку для захвата внешних прерываний, а ножка 3 или RA4 — стать ножкой для тактирования таймера от внешнего генератора.

Тактирование МК PIC также может осуществляться как от внешнего генератора, так и от кварцевого резонатора, от внутреннего резистора, а также существует ещё несколько вариантов, которые поддерживают не все контроллеры данного семейства. На практике как правило используется тактирование от кварцевого резонатора. Скорее всего, мы также последуем данной традиции в наших дальнейших занятиях.

Думаю, на этом мы закончим знакомство с контроллерами PIC. Знакомство получилось кратким, но на первое время нам и этого хватит за глаза. С более расшифрованной информацией мы столкнёмся, когда будем сочинять наши программы. Так что ждите следующих занятий, которые обещают быть очень интересными. Мы познакомимся сначала с установкой среды и компилятора, изучим, как с ними работать, какие тонкости программирования присутствуют в настройках различной периферии, а также в работе с ней.

 

Программирование МК PIC Следующий урок

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

PIC Знакомство с семейством PIC

Один комментарий на “PIC Урок 1. Знакомство с семейством PIC
  1. Игорь:

    Небольшая ошибочка — прошивка всегда находится во флэш, и ни в какую ОЗУ при работе МК она не переписывается. Впрочем это совершенно очевидно и из приведенной выше блок-схемы микроконтроллера.

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

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

*