Что такое внутрисхемное программирование PIC микроконтроллеров. Какие существуют методы внутрисхемного программирования. Как правильно реализовать ICSP в своих устройствах. Какие рекомендации дает Microchip по внутрисхемному программированию.
Что такое внутрисхемное программирование PIC микроконтроллеров
Внутрисхемное последовательное программирование (ICSP — In-Circuit Serial Programming) — это метод программирования микроконтроллеров PIC непосредственно в составе готового устройства, без необходимости извлечения микросхемы. Данный метод имеет ряд преимуществ:
- Позволяет обновлять программное обеспечение устройства после его сборки
- Упрощает процесс разработки и отладки устройств на базе PIC
- Сокращает время программирования при массовом производстве
- Снижает риск повреждения микроконтроллера при многократном извлечении
Для реализации ICSP используется последовательный интерфейс, состоящий обычно из 2-4 линий связи с программатором.

Основные методы внутрисхемного программирования PIC
Существует два основных метода внутрисхемного программирования микроконтроллеров PIC:
1. Высоковольтное программирование (HVP — High Voltage Programming)
При этом методе для перевода микроконтроллера в режим программирования на специальный вывод подается повышенное напряжение Vpp (обычно 12-13В). Различают два варианта HVP:
- «Vpp first» — сначала подается Vpp, затем питание Vdd
- «Vdd first» — сначала подается питание Vdd, затем Vpp
2. Низковольтное программирование (LVP — Low Voltage Programming)
В этом случае для перевода микроконтроллера в режим программирования используются только стандартные уровни напряжения питания. Существует два основных варианта LVP:
- «Special Sequence» — подается специальная последовательность сигналов
- «Special Pin» — используется отдельный вывод PGM для активации режима программирования
Рекомендуемая схема подключения для внутрисхемного программирования
Для корректной работы ICSP рекомендуется использовать следующую схему подключения программатора к микроконтроллеру:

- Линия MCLR/Vpp через резистор 10 кОм к Vdd
- Линии PGC и PGD напрямую к соответствующим выводам микроконтроллера
- При необходимости, развязывающий конденсатор 100 нФ между MCLR и GND
- Защитный диод на линии Vdd, если напряжение питания микроконтроллера ниже, чем у программатора
Такая схема обеспечивает надежное программирование и минимизирует вероятность сбоев.
Основные рекомендации Microchip по реализации ICSP
Компания Microchip, производитель микроконтроллеров PIC, дает следующие рекомендации по реализации внутрисхемного программирования:
- Линии PGC и PGD должны быть свободны от дополнительных пассивных или активных компонентов в схеме устройства
- Следует избегать больших емкостей на линии MCLR/Vpp
- Напряжение питания от программатора должно соответствовать рабочему напряжению микроконтроллера
- При использовании выводов PGC/PGD в схеме устройства рекомендуется резистивная развязка
- Длина проводников должна быть минимальной для снижения емкостной нагрузки
Соблюдение этих рекомендаций позволит обеспечить стабильное и быстрое программирование микроконтроллера.

Особенности внутрисхемного программирования различных серий PIC
Разные серии микроконтроллеров PIC имеют свои особенности реализации ICSP:
- PIC10/12/16 — обычно поддерживают как HVP, так и LVP
- PIC18 — в основном используют LVP, но некоторые модели поддерживают и HVP
- PIC24 и dsPIC — используют только LVP
- PIC32 — имеют специальный интерфейс ICSP с 2-проводной шиной
При разработке устройства важно учитывать особенности конкретной модели микроконтроллера.
Программаторы для внутрисхемного программирования PIC
Для внутрисхемного программирования микроконтроллеров PIC можно использовать различные программаторы:
- Фирменные программаторы Microchip — PICkit, ICD, REAL ICE
- Универсальные программаторы сторонних производителей
- Самодельные программаторы на базе Arduino или других микроконтроллеров
Выбор программатора зависит от конкретных задач и бюджета. Для начинающих разработчиков оптимальным вариантом будет недорогой PICkit.
Внутрисхемная отладка микроконтроллеров PIC
Многие современные микроконтроллеры PIC поддерживают не только внутрисхемное программирование, но и внутрисхемную отладку. Это позволяет:

- Устанавливать точки останова в программе
- Выполнять программу пошагово
- Просматривать и изменять содержимое регистров и памяти
- Отслеживать значения переменных в реальном времени
Для внутрисхемной отладки обычно используются те же линии связи, что и для программирования. Это упрощает разработку устройств, позволяя отлаживать их непосредственно в составе готового изделия.
Программирование микроконтроллеров PIC. Часть 6. Как перевести контроллер в режим программирования и залить в него прошивку — radiohlam.ru
В предыдущих частях мы разобрались что представляет из себя контроллер, как он работает и как написать для него программу. Следующее, что нам нужно сделать — это залить полученную программу в память контроллера (или ещё говорят «прошить контроллер»). Для этого существуют специальные инструменты — программаторы.
Программатор состоит из аппаратной части (обычно в быту именно эту аппаратную часть и называют программатором, поэтому мы тоже в дальнейшем сузим термин «программатор» только до его аппаратной части) и программной части. Аппаратная часть предназначена для физической организации необходимых для программирования сигналов (с правильными уровнями и фронтами). Программная часть предназначена для управления аппаратной частью, она реализует правильные алгоритмы (последовательности и задержки включения и выключения различных сигналов аппаратной части), необходимые для записи программы в память контроллера.
Различные схемы и программы для программирования контроллеров можно легко найти в сети интернет или даже придумать самому. Некоторые из таких схем и программ выложены у нас на сайте, их можно найти вот по этим ссылкам: схемы различных программаторов, программы для прошивки контроллеров.
Как вообще происходит прошивка всяких разных контроллеров? Сначала контроллер специальным образом переводится в режим программирования (то есть контроллеру сообщают, что его собираются программировать). Способы перевода есть различные: специальная последовательность сигналов на определённых ногах, специальные уровни напряжения (например, подача напряжения 12В на определённую ногу, вместо обычных 5 вольт) или и то и другое вместе. Обычно после перехода в режим программирования все неиспользуемые в процессе программирования ноги автоматически переводятся контроллером в высокоомное состояние.
Итак, в микроконтроллерах PIC, фирмы Microchip, обычно реализовано программирование по последовательному интерфейсу. При этом две ноги контроллера используются для организации самого интерфейса (сигналы clock — тактирование и data — данные) и ещё одна или несколько ног используются для перевода контроллера в режим программирования и удержания его в этом режиме (Vpp, PGM…).
Различают два основных метода программирования: высоковольтное (HVP — high voltage programming) и низковольтное (LVP — low voltage programming). В первом методе для перевода контроллера в режим программирования дополнительно используется более высокое напряжение (Vpp — напряжение программирования) по сравнению с рабочим (Vdd). Во втором методе никаких дополнительных напряжений использовать не нужно. В контроллерах, в зависимости от модели, могут быть реализованы оба метода сразу, а может быть реализован только какой-то один из методов.
В обоих методах существуют различные алгоритмы перевода контроллера в режим программирования (опять же, в зависимости от конкретной модели). Более того, в контроллере может быть заложено сразу несколько таких алгоритмов.
Далее я попробую описать наиболее распространённые алгоритмы перевода контроллеров PIC в режим программирования из обоих методов.
1. High Voltage Programming, «Vpp-first». Суть метода: сначала на специальную ногу подаётся напряжение программирования (Vpp), потом, не раньше, чем через определённый промежуток времени (T1), подаётся питание (Vdd). Через определённый промежуток после этого (T 2) контроллер перейдёт в режим программирования и можно будет начинать обмен данными (используя линии clock и data). На начальном этапе, всё то время, пока контроллер переводится в режим программирования, на интерфейсных ногах должен быть нулевой уровень. Ниже представлена диаграмма сигналов, соответствующая этому алгоритму:
2. High Voltage Programming, «Vdd-first». Суть метода: сначала подаётся рабочее напряжение (Vdd), потом, не раньше, чем через определённый промежуток времени (T1), на специальную ногу подаётся напряжение программирования (Vpp). Через определённый промежуток после этого (T2) контроллер перейдёт в режим программирования и можно будет начинать обмен данными (используя линии clock и data). Так же, как и в предыдущем алгоритме, на начальном этапе (всё то время, пока контроллер переводится в режим программирования) на интерфейсных ногах должен быть нулевой уровень. Ниже представлена соответствующая диаграмма сигналов:
3. Low Voltage Programming, «Special Sequence». Суть метода: через определённый промежуток времени (T1) после подачи рабочего напряжения (Vdd), контроллеру посылается специальный 32-х битный ключ, после чего контроллер переходит в режим программирования. При этом нога MCLR/Vpp должна быть притянута к общему проводу. Второй вариант этого же алгоритма (если рабочее напряжение уже приложено к контроллеру) заключается в следующем: нога MCLR/Vpp притягивается к общему проводу, через определённое время (T2) после этого контроллеру посылается специальный 32-х битный ключ, после чего контроллер переходит в режим программирования. Ниже представлены соответствующие диаграммы сигналов:
4. Low Voltage Programming, «Special Pin». Суть метода: при установке в слове конфигурации специального бита (LVP) один из выводов (PGM) контроллера начинает использоваться для перевода контроллера в режим программирования (соответственно, использовать этот пин в качестве цифрового входа/выхода уже нельзя). Так вот, в этом случае перевод контроллера в режим программирования осуществляется подачей высокого уровня (Vdd) на ногу PGM и через некоторое время после (T1) этого подачей высокого уровня (Vdd) на ногу (MCLR/Vpp). Ниже представлены соответствующие диаграммы сигналов:
При внимательном рассмотрении видно, что некоторые алгоритмы (2,3,4) позволяют перейти в режим программирования не снимая с контроллера рабочее напряжение питания. При специальной разводке платы эти алгоритмы позволяют программировать контроллер, что называется, «на лету». Способ, при котором контроллер программируется прямо в готовом изделии называется ICSP — in circuit serial programming (по-русски обычно говорят просто — внутрисхемное программирование).
На этом, пожалуй, и всё. Вот здесь можно найти таблицу контроллеров PIC фирмы Microchip, в которой указано, какие алгоритмы перевода в режим программирования поддерживают конкретные модели контроллеров, а также допустимые диапазоны значений Vpp (для контроллеров, поддерживающих HVP).
- Часть 1. Необходимые инструменты и программы. Основы MPLAB
- Часть 2. Что такое микроконтроллер и как с ним работать
- Часть 3. Структура программы на ассемблере
- Часть 4. Разработка рабочей части программы. Алгоритмы
- Часть 5. Ассемблер. Организация циклов и ветвлений
- Часть 6. Как перевести контроллер в режим программирования и залить в него прошивку
Внутрисхемное программирование и отладка микроконтроллеров Microchip
Для демонстрации внутрисхемного программирования и отладки микроконтроллера соберём простую схему. Задача данного прибора будет сводится к миганию светодиода.
Данный прибор может быть собран на демонстрационной (отладочной) плате фирмы Microchip PICDEM 2 PLUS. Схему демонстрационной платы PICDEM 2 PLUS и техническую спецификацию программируемого микроконтроллера можно найти на сайте http://www.microchip.com/.Источник питания схемы должен давать напряжение 9-15В и ток не менее 0,5А. Стоит отметить, что конденсаторами C1 и C2 можно пренебречь, они обеспечивают стабильность работы кварцевого резонатора ZQ1.
Показана рабочая область MPLAB IDE v8.15.
В меню выбираем Configure -> Select Device…
Выбрав программируемый микроконтроллер PIC16F873A, нажимаем «OK».
В меню выбираем Project -> Project Wizard…
Нажимаем «Далее».
Подтверждаем выбранный микроконтроллер нажатием «Далее».
Выбрав компилятор, нажимаем «Далее».
Нажав «Browse…» выбираем папку и имя фала.
Указываем имя файла «LED» в папке«LED» и нажимаем «Сохранить».
Нажимаем «Далее».
Выбираем путь к файлу, где будет написан код программы (листинг)
C:\Program Files\Microchip\MPASM Suite\Template\Code\16F873ATEMP.ASM
Нажимаем «Add>>», затем выбираем «С».
Нажимаем «Далее».
Появилась заключающие окно, нажимаем «Готово».
Файлы в созданном проекте «LED» указаны в окне (сверху справа)LED.mcw
Нажимаем на надпись «16F873ATEMP.ASM».
Открылся файл 16F873ATEMP.ASM, где будет написан код программы на ассемблере.
Изображен алгоритм. Время паузы должно быть достаточным для человека способного различить мигание светодиода.
;********************************************************************** ; This file is a basic code template for assembly code generation * ; on the PIC16F873A. This file contains the basic code * ; building blocks to build upon. * ; * ; Refer to the MPASM User's Guide for additional information on * ; features of the assembler (Document DS33014).* ; * ; Refer to the respective PIC data sheet for additional * ; information on the instruction set. * ; * ;********************************************************************** ; * ; Filename: xxx.asm * ; Date: * ; File Version: * ; * ; Author: * ; Company: * ; * ;********************************************************************** ; * ; Files Required: P16F873A.
INC * ; * ;********************************************************************** ; * ; Notes: * ; * ;********************************************************************** list p=16f873A ; list directive to define processor #include ; processor specific variable definitions __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_ON & _CPD_OFF ; '__CONFIG' directive is used to embed configuration data within .asm file. ; The lables following the directive are located in the respective .inc file. ; See respective data sheet for additional information on configuration word. ;***** VARIABLE DEFINITIONS w_temp EQU 0x20 ; variable used for context saving w_temp1 EQU 0xA0 ; reserve bank1 equivalent of w_temp status_temp EQU 0x21 ; variable used for context saving pclath_temp EQU 0x22 ; variable used for context saving PAUSE1 equ 0x23 PAUSE2 equ 0x24 PAUSE3 equ 0x25 ;********************************************************************** ORG 0x000 ; processor reset vector nop ; nop required for icd goto main ; go to beginning of program ORG 0x004 ; interrupt vector location movwf w_temp ; save off current W register contents movf STATUS,w ; move status register into W register bcf STATUS,RP0 ; ensure file register bank set to 0 movwf status_temp ; save off contents of STATUS register movf PCLATH,w ; move pclath register into w register movwf pclath_temp ; save off contents of PCLATH register ; isr code can go here or be located as a call subroutine elsewhere bcf STATUS,RP0 ; ensure file register bank set to 0 movf pclath_temp,w ; retrieve copy of PCLATH register movwf PCLATH ; restore pre-isr PCLATH register contents movf status_temp,w ; retrieve copy of STATUS register movwf STATUS ; restore pre-isr STATUS register contents swapf w_temp,f swapf w_temp,w ; restore pre-isr W register contents retfie ; return from interrupt ;********************************************************************** main call Ports_Initialization Cycle bsf PORTB,0 call Pause bcf PORTB,0 call Pause goto Cycle ;********************************************************************** ;************************ Ports Initialization ************************ ;********************************************************************** Ports_Initialization clrf PORTA clrf PORTB clrf PORTC clrf CCP1CON bsf STATUS,RP0 bcf STATUS,RP1 movlw 0x06 movwf ADCON1 movlw 0x00 movwf TRISA movlw 0x00 movwf TRISB movlw 0x00 movwf TRISC bcf STATUS,RP0 return ;********************************************************************** ;******************************* Pause ******************************** ;********************************************************************** Pause clrf PAUSE1 clrf PAUSE2 movlw 0x04 movwf PAUSE3 Pause_1 decfsz PAUSE1,f goto Pause_1 decfsz PAUSE2,f goto Pause_1 decfsz PAUSE3,f goto Pause_1 return ;********************************************************************** END ; directive 'end of program'
Вот листинг, который должен быть в файле 16F873ATEMP. ASM.
В конфигурации микроконтроллера указываем _HS_OSC, так как внешний кварцевый резонатор будет с рабочей частотой 20 МГц. Присваиваем статической ОЗУ (SRAM) новые регистры PAUSE1 – PAUSE3.
В меню выбираем View-> File Registers, где отображается вся статическая ОЗУ (SRAM) микроконтроллера.
Для внутрисхемной отладки в меню нужно выбрать Debugger -> Select Tool -> 1 MPLAB ICD 2.
Собрав схему на демонстрационной плате и подключив к ней питание и внутрисхемный отладчик, нажмём «Reset and Connect to ICD», если устройство готово к работе нажимаем «Program target device» и запускаем отладку нажав «Run».
Структурная связь всех используемых компонентов для внутрисхемной отладки и программирования.
Показано подключение отладочной платы PICDEM 2 PLUS с микроконтроллером PIC16F873A к источнику питания и внутрисхемному отладчику MPLAB ICD 2. Во время отладки мигает светодиод, подключенный к выводу микроконтроллера RB0.
Для самостоятельной работы, микроконтроллер нужно запрограммировать. Для этого выбираем в меню Programmer -> Select Programmer -> MPLAB ICD 2. Затем «Reset and Connect to ICD», если устройство готово к работе нажимаем «Program target device», проверяем нажатием «Verify target device memory».
Теперь микроконтроллер самостоятельно выполняет запрограммированные в него инструкции. Внутрисхемный отладчик MPLAB ICD 2 отключен.
Теги:
- Микроконтроллер
- PIC
- MPLAB
Microchip PIC Programmer ICSP Схема
Microchip не рекомендует какую-либо конкретную схему для программирования ICSP . Есть схемы для разных
инструменты, такие как Pro Mate и PICKit2 с аналогичной схемой, но с небольшими отличиями. В некоторых схемах их предложили
номиналы резисторов, на наш взгляд, слишком малы и могут вызвать проблемы у программистов, даже у Microchip.
Популярные продукты
Портативный программатор PIC
Простой в установке и использовании автономный портативный программатор PIC с батарейным питанием
Недорогой комплект PIC
Лучшая на рынке плата PIC с отладчиком и программатором PICKit3
Microchip PIC Programmer ICSP Circuit
Компания Kanda разработала рекомендуемую схему системного программирования, которая будет эффективно работать с нашим программирующим устройством PIC серии ,
и другие программисты PIC. Эта схема показана
на диаграмме ниже. Пожалуйста, прочитайте примечания, которые описывают схему и объясняют влияние дополнительных компонентов. например конденсаторы.
Примечания к схеме PIC ICSP
- Программаторы Kanda предназначены для подачи 3,3 В или 5 В на целевую схему, но некоторые другие программы ICSP всегда подают 5 В.
Если ваша схема работает при более низком напряжении, чем программатор, то для защиты остальных следует установить диод, показанный на VDD.
цепи. В некоторых случаях вместо диода можно использовать последовательный резистор.
Максимальный ток, который может подать программатор, часто ограничен, поэтому следует установить диод на VDD, если срабатывает цепь перегрузки по току программатора. Для контакта - MCLR/VPP требуется резистор для VDD. Минимум 1K должен работать, но 10K лучше. PIC16F
устройства только с первой записью VDD ICSP (PIC16F8x/87x/7x/7×7) должны быть оснащены резистором 4K7 в качестве
минимум, чтобы уменьшить вероятность запуска кода до повышения VPP.
Цепи контроля или кнопки на MCLR следует изолировать от напряжения ВПП, разместив их
на стороне VDD резистора или установив на эту линию диод Шоттки согласно примечанию 1.
- Конденсатор емкостью 100 нФ, показанный на выводе MCLR/VPP, является необязательным для HVP, но мы рекомендуем, чтобы конденсатор устанавливается, чтобы избежать сбоев на MCLR. 100 нФ — максимальное значение, и мы рекомендуем что-то меньше. Конденсаторы большего размера могут препятствовать переходу PIC в режим HVP. Не подходит для режима LVP.
- Если возможно, линии Clock и Data должны быть выделены для ICSP, но там, где это невозможно,
цепь приложения должна быть изолирована от линий данных и тактовых импульсов последовательными резисторами выше 10 кОм.
Это особенно важно, если любая из этих линий использует контакт как вход или выход. В исключительных
В некоторых случаях последовательных резисторов может оказаться недостаточно, и следует использовать мультиплексор 4053 или аналогичную схему.
Конденсаторов в этих строках программирования следует избегать, если это вообще возможно. Если они нужны, для помехоустойчивости например, тогда максимальная емкость, с которой могут справиться все программисты, составляет 1 нФ, хотя некоторые лучше. - Если используется режим LVP, этот резистор должен быть установлен.
- Линия PGM необходима только для программирования низкого напряжения — режим LVP. Детали
- PIC18F J нуждаются в развязывающем конденсаторе между выводом VccCore и землей, обычно 100 нФ.
Программисты Kanda ICSP PIC
Kanda Handheld PIC Programmer обеспечит 3,3 В или 5 В VDD для целевых схем микроконтроллера PIC. Цель цепь может быть запитана или обесточена. Это может быть выбрано пользователем для большинства микроконтроллеров PIC, но это исправлено на 3,3 В для микроконтроллеров PIC типа J и компонентов LF, которые могут быть повреждены 5 В. Напряжение программирования высокого напряжения (VPP) установлено на 12 В для большинства устройств PIC, но автоматически устанавливается на 9 В.V для Тип PIC18F K и новейшие PIC-микроконтроллеры PIC16F.
Популярные продукты PIC
Портативный программатор PIC
8-позиционный ручной программатор PIC
USB-программатор PIC
Портативный программатор PIC
Рекомендации по внутрисхемному последовательному программированию™ (ICSP™)
Рекомендации по внутрисхемному последовательному программированию™ (ICSP™)
Отладчик, эмулятор и программатор используют схему последовательной передачи сигналов для программирования целевого устройства в цепи. Отладчик и эмулятор используют одну и ту же схему для отладки внутрисхемного целевого устройства. Используемые сигналы — это сигналы часов и данных, определенные в некоторых спецификациях как PGC и PGD или ICSPCLK и ICSPDAT. Кроме того, MCLR/Vpp используется либо как сигнал программирования высокого напряжения, либо как индикатор внимания к устройству.
Эти сигналы предназначены не только для программирования и отладки, но используются совместно с выводом порта или другим периферийным устройством. Как правило, большинство устройств используют порты RB6 и RB7 в качестве основных портов по умолчанию.
Для беспроблемного внутрисхемного программирования и отладки вы должны тщательно планировать, чтобы избежать каких-либо проблем на этапе разработки приложения или производства продукта. Предлагаемые реализации обсуждаются в следующих разделах.
Рекомендуемая конфигурация реализации ICSP
Сигналы PGC и PGD являются активными двунаправленными сигналами, управляемыми инструментом и целевым устройством во время типичного сеанса программирования или отладки. Эти сигналы соответствуют спецификации программирования и алгоритму устройства. Чтобы свести к минимуму время программирования, сигналы синхронизируются с высокой скоростью. Любые дополнительные препятствия или нагрузки могут исказить сигналы в достаточной степени, чтобы вызвать периодические или серьезные сбои и предотвратить программирование.
Эти сигналы должны быть свободны от каких-либо других пассивных цепей или активной логики в приложении. Это обеспечит бесперебойную отладку и сеансы программирования.
Еще одним преимуществом этой конфигурации является то, что длина и/или тип кабеля могут быть незначительными, так как будет меньше отражений от несоответствия кабелей.
Кроме того, сигнал MCLR/Vpp используется средством разработки для подачи напряжения, используемого для программирования некоторых устройств или для привлечения внимания. В случаях, когда приложение имеет большой конденсатор, это приведет к ухудшению времени нарастания и спада сигнала. Это будет препятствовать способности инструмента и устройства эффективно взаимодействовать.
Рекомендуется поддерживать сигнал, подтянутый к VDD с помощью резистора 10K, и использовать функции таймера включения устройства, чтобы обеспечить правильную последовательность включения питания.
Для подключения питания ICSP от инструмента к узлу целевого устройства должно использоваться рабочее напряжение Vdd устройства, а не системы. Например, если напряжение системы составляет 5 В, а напряжение устройства составляет 3,3 В, то подключение питания ICSP должно быть 3,3 В.
Требуется соответствующее рабочее напряжение, чтобы логические уровни оставались совместимыми между средством разработки и целевым устройством.
Альтернативная конфигурация реализации ICSP
В некоторых случаях, особенно в случае устройств с малым числом контактов, контакты должны использоваться приложением.
В этом случае требуется как минимум резистивная изоляция между устройством и активным узлом приложения. Это гарантирует, что и прикладная схема, и инструмент разработки смогут подключить выводы программирования (PGC и PGD) к земле и к соответствующим уровням VDD.