AFON // радиотехник affonya@mail.ru
← Микроконтроллеры и ПЛИС

Микроконтроллеры PIC

Справочник по контроллерам Microchip: архитектура и семейства, память, тактирование, периферия, конфигурационные биты и программирование — от первого включения до рабочего проекта.

Что такое PIC

PIC (Peripheral Interface Controller) — семейство 8-, 16- и 32-разрядных микроконтроллеров компании Microchip Technology. Первые PIC появились ещё в конце 1970-х и за десятилетия стали одними из самых массовых МК в любительской и промышленной электронике благодаря низкой цене, широкой номенклатуре, простой обвязке и огромному сообществу.

В основе PIC — гарвардская архитектура (раздельные шины и память программ и данных) и RISC-набор команд: у младших ядер всего 33–35 инструкций, у PIC18 — около 75. Память программ — энергонезависимая Flash (в старых сериях — OTP или УФ-стираемая), что позволяет перепрошивать контроллер многократно прямо в плате.

Семейства PIC

Линейка охватывает всё — от 6-выводных «малышей» до 32-битных чипов с Ethernet и USB. Разрядность в таблице — это ширина команды; данные у 8-битных ядер всегда байтовые.

СемействоЯдроКомандаКратко
PIC10 / PIC12baseline12 битМини-корпуса 6–8 выводов, простейшие задачи
PIC12 / PIC16mid-range14 битСамое массовое, богатая периферия, ADC, USART
PIC18enhanced16 бит8-битные данные, оптимизирован под язык C, USB, CAN
PIC24 / dsPIC16-бит24 бит16-битные МК и цифровые сигнальные контроллеры (DSP)
PIC32MIPS3232 битПроизводительные 32-битные чипы, графика, связь

Для радиолюбителя «золотая середина» — mid-range PIC16: достаточно ресурсов, много готовых примеров, простая прошивка. PIC18 берут, когда нужен комфортный C и периферия вроде USB.

Архитектура и регистры

Вычислительное ядро строится вокруг рабочего регистра W (аккумулятор): почти все операции идут через него. Оперативная память организована как регистровый файл и делится на регистры специального назначения (SFR — управляют периферией) и регистры общего назначения (GPR — переменные пользователя).

У mid-range память данных разбита на банки; переключение выполняется битами RP0/RP1 в регистре STATUS. Аппаратный стек (8 уровней у mid-range) хранит только адреса возврата и недоступен напрямую. Конвейер «выборка/исполнение» даёт выполнение большинства команд за один машинный цикл (4 такта кварца).

Память

В PIC три вида памяти, и это важно не путать:

  • Flash (память программ) — хранит прошивку; измеряется в «словах» (14-битных у mid-range), а не в байтах.
  • RAM (память данных) — SFR + GPR, обнуляется при выключении.
  • EEPROM (данные) — небольшая энергонезависимая область для настроек, калибровок, счётчиков; переживает выключение питания.

Тактирование

Источник тактовой частоты выбирается конфигурационными битами при прошивке. Основные режимы генератора:

РежимНазначение
LPНизкочастотный кварц (часовой 32.768 кГц)
XTКварц среднего диапазона (до ~4 МГц)
HSВысокочастотный кварц (4–20 МГц)
RC / EXTRCВнешняя RC-цепочка (дёшево, неточно)
INTOSCВстроенный генератор — экономит выводы под кварц

Один машинный цикл = 4 периода тактовой частоты. При кварце 4 МГц команда выполняется за 1 мкс — удобно для прикидок задержек.

Периферия

Даже недорогие PIC16 несут внушительный набор встроенных модулей:

  • Порты ввода-вывода (PORTA/B/C…), направление задаётся регистрами TRISx.
  • Таймеры TMR0/1/2 — счёт, задержки, генерация меток времени.
  • CCP — захват/сравнение/ШИМ (PWM) для управления двигателями, светодиодами.
  • АЦП (ADC) 8/10/12 бит — измерение аналоговых сигналов.
  • USART/EUSART — асинхронный последовательный порт (UART) для связи с ПК и модулями.
  • MSSP — аппаратные SPI и I²C.
  • Компараторы, опорное напряжение, сторожевой таймер WDT, детектор просадки питания BOR.

Расчёт делителя UART под кварц удобно сделать в калькуляторе UART, а собрать значение управляющего регистра по битам — в конструкторе регистра.

Конфигурационные биты

Перед работой в прошивку зашиваются биты конфигурации (__CONFIG в ассемблере или #pragma config в XC8). Они задают режим генератора, включают/выключают сторожевой таймер, защиту кода, таймер запуска питания (PWRT) и сброс по просадке (BOR). Неверный FOSC — самая частая причина «мёртвого» контроллера: кварц стоит, а чип молчит.

// PIC16F877A, XC8 — пример конфигурации
#pragma config FOSC = HS      // кварц 4-20 МГц
#pragma config WDTE = OFF     // сторожевой таймер выключен
#pragma config PWRTE = ON     // таймер включения питания
#pragma config BOREN = ON     // сброс по просадке питания
#pragma config LVP = OFF      // низковольтное программирование выкл.
#pragma config CP = OFF       // защита кода выкл.

Популярные контроллеры

МодельВыв.FlashRAMEEPROMОсобенности
PIC12F67581K64 Б128 БADC, компаратор — «малыш» для мелких задач
PIC16F84A181K×1468 Б64 БЛегендарный учебный МК
PIC16F628A182K224 Б128 БUSART, компараторы, внутр. генератор
PIC16F877A408K368 Б256 БADC 10 бит, USART, MSSP, CCP — «рабочая лошадка»
PIC16F887408K368 Б256 БnanoWatt, расширенная периферия
PIC18F45504032K2K256 БUSB 2.0, под язык C

Цоколёвку PIC16F84A и других ходовых корпусов смотри в справочнике цоколёвок.

Программирование

Прошивка (ICSP)

PIC прошиваются внутрисхемно — ICSP (In-Circuit Serial Programming) — по пяти линиям: MCLR/VPP (напряжение программирования), PGD (данные, обычно RB7), PGC (такт, RB6), а также VDD и VSS. Программатор — PICkit (3/4) или ICD; клоны PICkit2 до сих пор популярны у любителей.

Среда и компиляторы

Официальная среда — MPLAB X IDE (бесплатно, Windows/Linux/macOS). Компиляторы Microchip: XC8 (8-битные PIC), XC16 (PIC24/dsPIC), XC32 (PIC32). Исторически применялись HI-TECH C, CCS C, mikroC и ассемблер MPASM.

// «Мигалка» светодиодом на RB0, XC8
#include <xc.h>
#define _XTAL_FREQ 4000000    // кварц 4 МГц для __delay_ms

void main(void) {
    TRISB0 = 0;               // RB0 — выход
    while (1) {
        RB0 = 1; __delay_ms(500);
        RB0 = 0; __delay_ms(500);
    }
}

Готовый HEX-файл прошивки удобно проверить в разборе Intel HEX (контрольные суммы, адреса, точка входа), а данные протоколов посчитать в CRC и конвертере систем счисления.

С чего начать

  1. Возьми PIC16F628A или PIC16F877A — много примеров и недорого.
  2. Поставь MPLAB X + XC8 и программатор PICkit.
  3. Собери «мигалку», убедись, что верно выбран FOSC и подтянут MCLR.
  4. Дальше — UART для связи с ПК, ADC для датчиков, ШИМ для нагрузки.

PIC и AVR решают схожие задачи; если интересно сравнение — загляни в раздел AVR контроллеры.

Смотрите также: AVR контроллеры · ПЛИС · I²C.

PRJ//

Проекты на PIC (ассемблер)

50

Пятьдесят практических устройств с полным исходным кодом на ассемблере MPASM: задача, детали, схема подключения, алгоритм и проверенный листинг с комментариями. К каждому проекту — готовый HEX-файл прошивки. Каталог проектов →

PRJ.01
Мигающий светодиод

Первый проект: порт на выход и программная задержка

PRJ.02
Бегущие огни

Сдвиг единицы по восьми светодиодам через регистр сдвига

PRJ.03
Кнопка и антидребезг

Опрос кнопки с программным подавлением дребезга контактов

PRJ.04
Кнопка-триггер

Нажал — включил, нажал ещё раз — выключил

PRJ.05
Бегущий огонь «туда-обратно»

Огонёк доходит до края и возвращается назад

PRJ.06
Двоичный счётчик

Порт B показывает двоичный код от 0 до 255

PRJ.07
Управление реле

Кнопка включает и выключает реле через транзисторный ключ

PRJ.08
Генератор меандра 1 кГц

Точный расчёт задержки в машинных циклах

PRJ.09
Переключение режимов кнопкой

Три светодиодных эффекта, кнопка выбирает режим

PRJ.10
Светофор

Полный цикл светофора с мигающим зелёным

PRJ.11
7-сегментный индикатор

Таблица сегментов и вывод цифр 0…9

PRJ.12
Динамическая индикация

Два разряда на общих сегментах

PRJ.13
Счётчик 0…99

Двухразрядный счёт с переносом десятков

PRJ.14
LCD HD44780

Инициализация дисплея в 4-битном режиме

PRJ.15
Вывод текста на LCD

Строки из таблицы и адресация двух строк

PRJ.16
Светодиодная матрица 8×8

Развёртка по столбцам и вывод символа

PRJ.17
Индикатор уровня

Линейка светодиодов и две кнопки регулировки

PRJ.18
Бегущая строка

Сдвиг изображения по кольцевому буферу

PRJ.19
Точная задержка на TMR0

Аппаратный таймер вместо пустых циклов

PRJ.20
Прерывание по TMR0

Фоновая задача и обработчик прерывания

PRJ.21
Программный ШИМ

Плавное разгорание и затухание светодиода

PRJ.22
Аппаратный ШИМ на CCP

Модуль CCP1 генерирует ШИМ без участия ядра

PRJ.23
Счётчик импульсов

TMR0 как счётчик внешних событий

PRJ.24
Секундомер с кнопкой

Пуск и стоп одной кнопкой, счёт 00…99

PRJ.25
Часы на прерывании

Минуты и секунды считает таймер в фоне

PRJ.26
Таймер обратного отсчёта

Отсчёт до нуля и отключение реле

PRJ.27
АЦП: чтение потенциометра

Первое аналоговое измерение на PIC16F877A

PRJ.28
Цифровой вольтметр

Перевод кода АЦП в вольты и десятые

PRJ.29
Термометр на LM35

10 мВ на градус и опорное 2,56 В

PRJ.30
Датчик освещённости

Пороговое включение света с гистерезисом

PRJ.31
Термометр DS18B20 (1-Wire)

Протокол однопроводной шины вручную

PRJ.32
Измеритель длительности импульса

Захват фронтов модулем CCP

PRJ.33
Пороговое реле на компараторе

Встроенный компаратор и опорное напряжение

PRJ.34
Логгер в EEPROM

Запись измерений в энергонезависимую память

PRJ.35
Передача по UART

Аппаратный USART и вывод строки в терминал

PRJ.36
Приём по UART с эхо

Приём байта, индикация и ответ обратно

PRJ.37
Управление с ПК по UART

Текстовые команды включают и выключают нагрузку

PRJ.38
I²C: память 24C02

Программная шина I²C и внешняя EEPROM

PRJ.39
SPI и регистр 74HC595

Три вывода вместо восьми линий

PRJ.40
Приём ИК-пульта (RC5)

Декодирование посылки телевизионного пульта

PRJ.41
Обмен между двумя PIC

Ведущий и ведомый в одной прошивке

PRJ.42
Передача по радиоканалу 433 МГц

Преамбула, синхробайт и контрольная сумма

PRJ.43
Сервопривод SG90

Угол задаётся длительностью импульса

PRJ.44
Шаговый двигатель

Последовательность фаз через ULN2003

PRJ.45
Двигатель: ШИМ и реверс

Регулировка скорости и смена направления

PRJ.46
Матричная клавиатура 4×4

Сканирование шестнадцати клавиш по восьми выводам

PRJ.47
Кодовый замок

Четырёхзначный код в EEPROM и блокировка при ошибках

PRJ.48
Сигнализация с датчиком движения

Задержки на вход и выход, сирена

PRJ.49
Термостат

Поддержание температуры с гистерезисом и защитой

PRJ.50
Электронный метроном

Щелчки с регулируемым темпом и вспышкой