Руководство по программированию pic

Время на прочтение
15 мин

Количество просмотров 130K

Введение

PIC-контроллеры остаются популярными в тех случаях, когда требуется создать недорогую компактную систему с низким энергопотреблением, не предъявляющую высоких требований по ее управлению. Эти контроллеры позволяют заменить аппаратную логику гибкими программными средствами, которые взаимодействуют с внешними устройствами через хорошие порты.

Миниатюрные PIC контроллеры хороши для построения преобразователей интерфейсов последовательной передачи данных, для реализации функций «прием – обработка – передача данных» и несложных регуляторов систем автоматического управления.

Компания Microchip распространяет MPLAB — бесплатную интегрированную среду редактирования и отладки программ, которая записывает бинарные файлы в микроконтроллеры PIC через программаторы.

Взаимодействие MPLAB и Matlab/Simulink позволяет разрабатывать программы для PIC-контроллеров в среде Simulink — графического моделирования и анализа динамических систем. В этой работе рассматриваются средства программирования PIC контроллеров: MPLAB, Matlab/Simulink и программатор PIC-KIT3 в следующих разделах.

• Характеристики миниатюрного PIC контроллера PIC12F629
• Интегрированная среда разработки MPLAB IDE
• Подключение Matlab/Simulink к MPLAB
• Подключение программатора PIC-KIT3

Характеристики миниатюрного PIC-контроллера

Семейство РIС12ххх содержит контроллеры в миниатюрном 8–выводном корпусе со встроенным тактовым генератором. Контроллеры имеют RISC–архитектуру и обеспечивают выполнение большинства команд процессора за один машинный цикл.

Для примера, ниже даны характеристики недорогого компактного 8-разрядного контроллера PIC12F629 с многофункциональными портами, малым потреблением и широким диапазоном питания [1].

• Архитектура: RISC
• Напряжение питания VDD: от 2,0В до 5,5В (< 6,5В)
• Потребление:
— <1,0 мА @ 5,5В, 4МГц
— 20 мкА (тип) @ 32 кГц, 2,0В
— <1,0 мкА (тип) в режиме SLEEP@2,0В
• Рассеиваемая мощность: 0,8Вт
• Многофункциональные каналы ввода/вывода: 6/5
• Максимальный выходной ток портов GPIO: 125мА
• Ток через программируемые внутренние подтягивающие резисторы портов: ≥50 (250) ≤400 мкА @ 5,0В
• Разрядность контроллера: 8
• Тактовая частота от внешнего генератора: 20 МГц
Длительность машинного цикла: 200 нс
• Тактовая частота от внутреннего RC генератора: 4 МГц ±1%
Длительность машинного цикла: 1мкс
• FLASH память программ: 1К
Число циклов стирание/запись: ≥1000
• ОЗУ память данных: 64
• EEPROM память данных: 128
Число циклов стирание/запись: ≥10K (-40оС ≤TA≤ +125 оС)
• Аппаратные регистры специального назначения: 16
• Список команд: 35 инструкций, все команды выполняются за один машинный цикл,
кроме команд перехода, выполняемых за 2 цикла
• Аппаратный стек: 8 уровней
• Таймер/счетчик ТМR0: 8-разрядный с предделителем
• Таймер/счетчик ТМR1: 16-разрядный с предделителем

Дополнительные особенности:

• Сброс по включению питания (POR)
• Таймер сброса (PWRTтаймер ожидания запуска генератора (OST
• Сброс по снижению напряжения питания (BOD)
• Сторожевой таймер WDT
• Мультиплексируемый вывод -MCLR
• Система прерываний по изменению уровня сигнала на входах
• Индивидуально программируемые для каждого входа подтягивающие резисторы
• Программируемая защита входа
• Режим пониженного энергопотребления SLEEP
• Выбор режима работы тактового генератора
• Внутрисхемное программирование ICSP с использованием двух выводов
• Четыре пользовательские ID ячейки

Предельная рабочая температура для Е исполнения (расширенный диапазон) от -40оС до +125 оС;
Температура хранения от -65оС до +150 оС.

КМОП технология контроллера обеспечивает полностью статический режим работы, при котором остановка тактового генератора не приводит к потере логических состояний внутренних узлов.
Микроконтроллер PIC12F629 имеет 6-разрядный порт ввода/вывода GPIO. Один вывод GP3 порта GPIO работает только на вход, остальные выводы можно сконфигурировать для работы как на вход так и на выход. Каждый вывод GPIO имеет индивидуальный бит разрешения прерываний по изменению уровня сигнала на входах и бит включения внутреннего подтягивающего резистора.

Интегрированная среда разработки MPLAB IDE

MPLAB IDE — бесплатная интегрированная среда разработки ПО для микроконтроллеров PIC включает средства для создания, редактирования, отладки, трансляции и компоновки программ, записи машинного кода в микроконтроллеры через программаторы.

Загрузка MPLAB IDE

Бесплатные версии MPLAB (включая MPLAB 8.92) хранятся на сайте компании Microchip в разделе «DOWNLOAD ARCHIVE».

Создание проекта

Пример создания проекта программ PIC контроллера в среде MPLAB включает следующие шаги [2].

1. Вызов менеджера проекта.

2. Выбор типа PIC микроконтроллера.

3. Выбор компилятора, например, Microchip MPASM для ассемблера.

4. Выбор пути к каталогу проекта (клавиша Browse…) и ввод имени проекта.

5. Подключение файлов к проекту в окне Project Wizard → Step Four можно не выполнять. Это можно сделать позднее, внутри активного проекта. Клавиша Next открывает следующее окно.

6. Завершение создания проекта (клавиша Finish).

В результате создания проекта FirstPrMPLAB интерфейс MPLAB принимает вид, показанный на Рис. 1.


Рис. 1. Интерфейс среды MPLAB v8.92 и шаблон проекта.

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

Создание программы в MPLAB можно выполнить в следующей последовательности.

1. Открыть редактор программ: меню → File → New. Изначально программе присвоено имя Untitled.

2. Набрать или скопировать программу, например, на ассемблере.

3. Сохранить программу под другим именем (меню → File → Save As), например, FirstPrMPLAB.asm.


Рис. 2. Пример простейшей программы (на ассемблере) вывода сигналов через порты контроллера GP0, GP1, GP2, GP4, GP5 на максимальной частоте.

Запись ‘1’ в разряде регистра TRISIO переводит соответствующий выходной буфер в 3-е состояние, в этом случае порт GP может работать только на вход. Установка нуля в TRISIO настраивает работу порта GP на выход.

Примечание. По спецификации PIC12F629 порт GP3 микроконтроллера работает только на вход (соответствующий бит регистра TRISIO не сбрасывается – всегда находится в ‘1’).

Регистры TRISIO и GPIO находятся в разных банках области памяти. Переключение банков выполняется 5-м битом регистра STATUS.

Любая программа на ассемблере начинается директивой org и заканчивается директивой end. Переход goto Metka обеспечивает циклическое выполнение программы.

В программе (Рис. 2) используются следующие обозначения.

Директива LIST — назначение типа контроллера
Директива __CONFIG — установка значений битов конфигурации контроллера
Директива equ — присвоение числового значения
Директива org 0 — начало выполнения программы с адреса 0
Команда bsf — устанавливает бит указанного регистра в 1
Команда bсf — сбрасывает бит указанного регистра в 0
Команда movlw — записывает константу в регистр W
Команда movwf — копирует содержимое регистра W в указанный регистр
Команда goto — обеспечивает переход без условия на строку с меткой
Директива end — конец программы

Установка требуемой конфигурации микроконтроллера
Конфигурация микроконтроллера PIC12F629 зависит от настроек слова конфигурации (2007h), которые можно задать в программе через директиву __CONFIG.

Непосредственно или через окно MPLAB: меню → Configure → Configuration Bits:

Где:

Бит 2-0 — FOSC2:FOSC0. Выбор тактового генератора
111 — Внешний RC генератор. Подключается к выводу GP5. GP4 работает как CLKOUT
110 — Внешний RC генератор. Подключается к выводу GP5. GP4 работает как ввод/вывод
101 — Внутренний RC генератор 4МГц. GP5 работает как ввод/вывод. GP4 — как CLKOUT
100 — Внутренний RC генератор 4МГц. GP5 и GP4 работают как ввод/вывод
011 — EC генератор. GP4 работает как ввод/вывод. GP5 — как CLKIN
010 — HC генератор. Резонатор подключается к GP4 и GP5
001 — XT генератор. Резонатор подключается к GP4 и GP5
000 — LP генератор. Резонатор подключается к GP4 и GP5

Бит 3 — WDTE: настройка сторожевого таймера (Watchdog Timer)
1 — WDTE включен
0 — WDTE выключен

Сторожевой таймер предохраняет микроконтроллер от зависания – перезапускает программу через определенный интервал времени если таймер не был сброшен. Период таймера устанавливается в регистре OPTION_REG. Обнуление сторожевого таймера вызывается командой CLRWDT.

Бит 4 — PWRTE: Разрешение работы таймера включения питания:
1 — PWRT выключен
0 — PWRT включен

Таймер задерживает микроконтроллер в состоянии сброса при подаче питания VDD.

Бит 5 — MCLR: Выбор режима работы вывода GP3/-MCLR
1 — работает как -MCLR
0 — работает как порт ввода-вывода GP3

Бит 6 — BODEN: Разрешение сброса по снижению напряжения питания (как правило < 2.0В)
1 — разрешен сброс BOR
0 — запрещен сброс BOR автоматически включается таймер

При разрешении сброса BOR автоматически включается таймер PWRT

Бит 7 — .CP: Бит защиты памяти программ от чтения программатором
1 Защита выключена
0 Защита включена

При выключения защиты вся память программ стирается

Бит 8 — .CPD: Бит защиты EPROM памяти данных
1 Защита выключена
0 Защита включена

После выключения защиты вся информация будет стерта

Бит 11-9 — Не используются: Читается как ‘1’.

Бит 13-12 — BG1:BG0. Биты калибровки сброса по снижению питания
00 — нижний предел калибровки
11 — верхний предел калибровки

Добавление программы к проекту

Пример добавления программы к проекту показан на (Рис. 3).

Рис. 3. Добавление программы FirstPrMPLAB.asm к проекту FirstPrMPLAB.mcp

Сохранить материалы проекта можно командой: меню → File → Save Workspace.

Компиляция

Чтобы создать бинарный файл с расширением hex для прошивки микроконтроллера необходимо откомпилировать проект. Запуск компиляции выполняется командой меню → Project → Build All. Результаты компиляции можно увидеть в окне Output (Рис. 1). Если в программе нет ошибок, то компилятор выдаёт сообщение об успешной компиляции: BUILD SUCCEEDED, загрузочный HEX файл можно найти в рабочем каталоге:

Отладка программы

Отладку программы в среде MPLAB IDE можно выполнить при помощи аппаратного эмулятора MPLAB REAL ICE или программного симулятора MPLAB SIM. Запуск последнего выполняется как показано на Рис. 4.

Рис. 4. Подключение к симулятору MPLAB SIM для отладки программы.

После запуска отладчика в окне Output (Рис. 1) появляется закладка MPLAB SIM, куда MPLAB выводит текущую информацию отладчика. Команды отладчика (Рис. 5) после запуска становятся активными.

Рис. 5. Команды отладчика.

Команды отладчика:

• Run — Непрерывное выполнение программы до точки останова (Breakpoint) если таковая установлена.
• Halt — Остановка программы на текущем шаге выполнения.
• Animate — Анимация непрерывного выполнения программы.
• Step Into — Выполнение по шагам (вызовы Call выполняются за один шаг).
• Step Over — Выполнение по шагам включая команды вызовов Call.
• Reset — Начальная установка программы. Переход указателя на первую команду.
• Breakpoints — Отображение списка точек останова. Обработка списка.

При выполнении программы по шагам текущий шаг выделяется стрелкой (Рис. 6). Непрерывное выполнение программы останавливается командой Halt или достижением программой точки останова. Точка останова устанавливается/снимается в строке программы двойным щелчком.
Пример программы на ассемблере, которая с максимальной скоростью меняет состояние портов контроллера показан на Рис. 6 (справа). Программа передаёт в регистр портов GPIO данные b’10101010’ и b’01010101’. Поскольку в регистре GPIO передачу данных в порты контроллера выполняют не все разряды, а только 0,1,2,4 и 5, то состояние регистра GPIO (Рис. 6, слева) отличается значениями: b’00100010’ и b’00010101’.


Рис. 6. Состояние регистров специального назначения контроллера на момент выполнения программы (слева) и выполняемая по шагам программа (справа).

В процессе отладки можно наблюдать за состоянием регистров, переменных, памяти в соответствующих окнах, открываемых в разделе View основного меню. В процессе отладки можно вносить изменения в код программы, содержимое регистров, памяти, изменять значения переменных. После изменения кода необходимо перекомпилировать программу. Изменение содержимого регистров, памяти и значения переменных (окна раздела View: Special Function Register, File Register, EEPROM, Watch) не требует перекомпиляции.

Входные сигналы портов модели микроконтоллера можно задать в разделе Debugger → Stimulus. Устанавливаемые состояния сигналов портов привязываются к времени (тактам) отладки.

Иногда результаты выполнения программы в режиме отладки не соответствуют выполнению этой же программы в реальном контроллере, так, например, отладчик программы (Рис. 6) без инструкций movlw 0x07 и movwf cmcon показывает, что выходы GP0 и GP1 регистра GPIO не изменяются — находятся в нулевом состоянии, содержимое регистра GPIO попеременно равно 0x14 и 0х20. Однако, контроллер, выполняющий программу без указанных инструкций, показывает на осциллографе циклическую работу всех пяти выходов: 0x15 и 0х22, включая GP0 и GP1 (см. Рис. 7).

Осциллограммы контроллера, выполняющего циклы программы Рис. 6 (Metka… goto Metka) показаны на Рис. 7.


Рис. 7. Осциллограммы выхода GP0 (слева) и GP1 (справа) микроконтроллера PIC12F629, работающего от внутреннего 4МГц RC генератора. Программа (Рис. 6) формирует сигналы максимальной частоты на всех выходах контроллера. За период сигналов 5.3 мкс выполняется 5 команд (6 машинных циклов), амплитуда GP0 сигнала на осциллограмме равна 4.6В, измеренное программатором питание контроллера 4.75В.

Прошивка микроконтроллера

Для записи программы в микроконтроллер (прошивки контроллера) необходимо микроконтроллер подключить к интегрированной среде MPLAB IDE через программатор. Организация подключения показана ниже в разделе «Подключение программатора PIC-KIT3».

Примечание. В контроллер PIC12F629 записана заводская калибровочная константа настройки частоты внутреннего тактового генератора. При необходимости её можно прочитать и восстановить средствами MPLAB с использованием программатора.

Команды для работы с программатором и изменения его настроек находятся в меню MPLAB Programmer. Тип программатора в MPLAB выбирается в разделе: меню → Programmer → Select Programmer.

Рис. 8. Выбор программатора для подключения к среде MPLAB.

Прошивка микроконтроллера через программатор запускается командой: меню → Programmer → Program. Сообщение об успешной прошивке показано на Рис. 9.

Рис. 9. Запуск прошивки микроконтроллера и вид сообщения об успешной прошивке.

Примечание: Во время прошивки микроконтроллера у программатора PIC-KIT3 мигает желтый светодиод.

Подключение MATLAB/SIMULINK к MPLAB

В системе моделирования динамических систем Simulink (приложение к Matlab) на языке графического программирования [7] можно разрабатывать программы для семейства PIC контроллеров имеющих АЦП/ЦАП, счетчики, таймеры, ШИМ, DMA, интерфейсы UART, SPI, CAN, I2C и др.

Пример Simulink программы PIC контроллера показан на Рис. 10.

Рис. 10. Пример программы на языке графического программирования для PIC контроллера выполненной в среде моделирования динамических систем Simulink.

Взаимодействие средств разработки и компиляции программ для PIC контроллеров в Simulink показано на Рис. 11 [6].

Рис. 11. Структура средств построения адекватной модели PIC контроллера на языке графического программирования.

Для построения среды разработки необходимы следующие компоненты Matlab:

• Simulink
• Real-Time Workshop Embedded Coder
• Real-Time Workshop

И Cи компилятор компании Microchip:

• C30 для контроллеров PIC24, dsPIC30 и PIC33
• или C32 для контроллеров серии PIC32

Установка компонентов Matlab

На сайте имеются Simulink библиотеки (dsPIC Toolbox) для PIC контроллеров и версий Matlab c R2006a по R2012a:

Для скачивания библиотеки необходимо зарегистрироваться. Программы поддерживают работу 100 микроконтроллеров из серий PIC 16MC, 24F, 30F, 32MC, 33F, 56GP, 64MC, 128MC, 128GP.
Бесплатные версии работают с Simulink моделями PIC контроллеров имеющих до 7 портов ввода-вывода.

Для установки dsPIC Toolbox — библиотеки блоков PIC контроллеров для Matlab/Simulink необходимо [4]:

• Скачать dsPIC Toolbox для требуемой версии Matlab.
• Распаковать zip файл в папке, в которой будут установлены Simulink блоки.
• Запустить Matlab.
• Настроить текущий каталог Matlab на папку с распакованным файлом.
• Открыть и запустить файл install_dsPIC_R2012a.m, например, кнопкой меню или клавишей клавиатуры.

Библиотеки dsPIC и примеры Simulink моделей устанавливаются в текущую папку Matlab (Рис. 12). Установленные блоки для моделирования PIC контроллеров доступны в разделе Embedded Target for Microchip dsPIC библиотеки Simulink (Рис. 13).

Рис. 12. Содержимое текущего каталога после выполнения install_dsPIC_R2012a.m.

Рис. 13. Блоки, установленной библиотеки «Embedded Target for Microchip dsPIC».

Для совместной компиляции Simulink модели средствами Matlab и MPLAB необходимо прописать в переменной окружения path Matlab с высшим приоритетом путь к каталогу MPLAB с файлами MplabOpenModel.m, MplabGetBuildinfo.m и getHardwareConfigs.m:

>> path('c:Program Files (x86)MicrochipMPLAB IDEToolsMATLAB',path) 

Установка Си компилятора MPLAB

Компиляторы MPLAB находятся на сайте Microchip (Download Archive → MPLAB C Compiler for PIC24 and dsPIC DSCs). Для установки демонстрационной версии компилятора С30 необходимо его скачать по ссылке PIC24/dsPIC v3.25 (Рис. 14) и запустить принятый файл mplabc30-v3.25-comboUpgrade.exe.

Рис. 14. Версии Си компилятора (слева) и режимы его установки (справа).

Примечание. Работа выполнена с версией v3.25 компилятора С30 для PIC24/dsPIC. Проверка показала, что следующая версия v3.30 не поддерживает совместную компиляцию моделей Matlab R2012a (dsPIC Toolbox) без ошибок.

Установочный exe файл создаёт в разделе c:Program Files (x86)Microchip новый каталог mplabc30 с файлами:

Рис. 15. Каталоги компилятора C30 MPLAB.

Последовательность Simulink программирования для PIC контроллеров

1. Создайте рабочий каталог и скопируйте в него *.mdl примеры из раздела example (см. Рис. 12).
2. Загрузите Matlab. Настройте его на рабочий каталог.
3. Включите в переменную окружения path Matlab с высшим приоритетом путь к MPLAB — каталогу c:Program Files (x86)MicrochipMPLAB IDEToolsMATLAB:

>> path('c:Program Files (x86)MicrochipMPLAB IDEToolsMATLAB',path) 

Примечание: Использование команды >>path без аргументов приводит к отображению списка путей переменной path в окне команд (Command Window). Удалить путь из переменной path можно командой rmpath, например:

>>rmpath(' c:Program FilesMicrochipMPLAB IDEToolsMATLAB')

4. Создайте Simulink модель для PIC контроллера, используя блоки библиотеки «Embedded Target for Microchip dsPIC» (Рис. 13), или загрузите готовую модель, например, Servo_ADC.mdl.

Тип контроллера, для которого разрабатывается Simulink модель, выбирается из списка в блоке Master > PIC (Рис. 16, Рис. 10), который должен быть включен в состав модели.

Рис. 16. Выбор типа контроллера в блоке Master модели.

5. Проверьте настройки конфигурации модели: Меню → Simulation → Configuration Parameters <Ctrl+E>. В строке ввода System target file раздела Code Generation должен быть указан компилятор S-функций dspic.tlc (Рис. 17). Выбор dspic.tlc настраивает все остальные параметры конфигурации модели, включая шаг и метод интегрирования.

Рис. 17. Выбор компилятора S-функций dspic.tlc для моделей PIC-контроллеров в разделе «основное меню → Simulation → Configuration Parameters → Code Generation».

6. Откомпилируйте модель tmp_Servo_ADC.mdl. Запуск компилятора показан на Рис. 18.

Рис. 18. Запуск компилятора Simulink модели.

В результате успешной компиляции (сообщение: ### Successful completion of build procedure for model: Servo_ADC) в текущем каталоге создаются HEX файл для прошивки PIC контроллера и MCP проект среды MPLAB (Рис. 19).

Рис. 19. Результаты компиляции модели.

Запуск модели в Matlab/Simulink выполняется в окне модели кнопкой, условное время моделирования устанавливается в строке:

Управление компиляцией Simulink моделей из среды MPLAB

Управление компиляцией Simulink модели можно выполнять командами раздела Matlab/Simulink среды MPLAB, например, в следующем порядке.

1. Разработайте модель PIC контроллера в Matlab/Simulink. Сохраните модель.
2. Запустите MPLAB.
3. Выберите MPLAB меню → Tools → Matlab/Simulink и новый раздел появится в составе меню.

4. В разделе Matlab/Simulink откройте Simulink модель, например, Servo_ADC, командой «Matlab/Simulink → Specify Simulink Model Name → Open → File name → Servo_ADC.mdl → Open». Команда Open запускает Matlab и открывает модель.

5. Откомпилируйте модель и создайте MCP проект командами Generate Codes или Generate Codes and Import Files. Перевод MDL модели в MCP проект выполняется TLC компилятором Matlab.
В результате создаётся проект MPLAB:

со скриптами модели на языке Си.

6. Откройте проект: меню → Project → Open → Servo_ADC.mcp (Рис. 20).

Рис. 20. Структура MCP проекта Simulink модели Servo_ADC.mdl в среде MPLAB.
Проект Simulink модели готов для редактирования, отладки и компиляции в машинные коды контроллера средствами MPLAB.

Подключение программатора PIC-KIT3

Узнать какие программаторы записывают бинарный код в конкретный микроконтроллер можно в разделе меню → Configure → Select Device среды MPLAB 8.92. Например, программатор PIC-KIT3 не поддерживает контроллер PIC12C508A (Рис. 21, левый рисунок), но работает с контроллером PIC12F629 (Рис. 21, правый рисунок).

Рис. 21. Перечень программаторов для прошивки микроконтроллера.

Информацию об установленном драйвере программатора PIC-KIT3 можно запросить у менеджера устройств ОС Windows (Рис. 22).

Рис. 22. Информация об установленном драйвере программатора PIC-KIT3.

Схема подключения микроконтроллера PIC12F629 к программатору PIC-KIT3 показана на Рис. 23.

Рис. 23. Схема подключения микроконтроллера PIC12F629 к программатору PIC-KIT3.

Вывод PGM программатора для прошивки контроллеров PIC12F629 не используется. Наличие вывода PGM для разных типов PIC контроллеров показано на Рис. 24. Вывод PGM рекомендуется «притягивать» к общему проводу (GND), через резистор, номиналом 1К [3].

Рис. 24. Выводы PGM PIC контроллеров.

Индикация светодиодов программатора Olimex PIC-KIT3 показана в ниже:

Желтый — Красный — Состояние программатора
Вкл — Выкл — Подключен к USB линии
Вкл — Вкл — Взаимодействие с MPLAB
Мигает — Включен постоянно — Прошивка микроконтроллера

Не следует подключать питание микроконтроллера VDD (Рис. 23) к программатору, если контроллер запитывается от своего источника питания.

При питании микроконтроллера от программатора на линии VDD необходимо установить рабочее напряжение, например, 5В программой MPLAB (Menu → Programmer → Settings → Power), как показано на Рис. 25.

Примечание. При отсутствии напряжения на линии VDD MPLAB IDE выдает сообщение об ошибке: PK3Err0045: You must connect to a target device to use

Рис. 25. Установка напряжения VDD на программаторе PIC-KIT3 программой MPLAB IDE v8.92.

Если программатор не может установить требуемое напряжение, например, 5В при его питании от USB, в которой напряжение меньше 5В, MPLAB IDE выдает сообщение об ошибке: PK3Err0035: Failed to get Device ID. В этом случае, сначала необходимо измерить напряжение программатора — считать его в закладке меню → Programmer → Settings → Status, а затем установить напряжение (не больше измеренного) в закладке меню → Programmer → Settings → Power.

Рис. 26. Измерение (слева) и установка (справа) VDD напряжения программатора PIC-KIT3 программой MPLAB IDE v8.92.

Пример MPLAB сообщения успешного подключения микроконтроллера к программатору по команде меню → Programmer → Reconnect показан на Рис. 27.

Рис. 27. Сообщение MPLAB об успешном подключении микроконтроллера к программатору.

Можно программировать не только отдельный PIC контроллер, но и контроллер, находящийся в составе рабочего устройства. Для программирования PIC контроллера в составе устройства необходимо предусмотреть установку перемычек и токоограничивающих резисторов как показано на Рис. 28 [3].

Рис. 28. Подключение микроконтроллера в составе электронного устройства к программатору.

Заключение

Малоразрядные PIC-контроллеры имеют широкий диапазон питания, низкое потребление и малые габариты. Они программируются на языках низкого уровня. Разработка программ на языке графического программирования Simulink с использованием многочисленных библиотек значительно сокращает время разработки и отладки в сравнении с программированием на уровне ассемблера. Разработанные для PIC-контроллеров Simulink структуры можно использовать и для компьютерного моделирования динамических систем с участием контроллеров. Однако, из-за избыточности кода такой подход применим только для семейств PIC контроллеров с достаточными ресурсами.

1

Часть 1 Оглавление

Введение

3

1. Готовим инструменты

5

2. Что такое микроконтроллер и как он работает

10

3. Система команд PIC16F84A

26

4. Что такое программа и правила ее составления. Пример создания

программы автоколебательного мультивибратора. Директивы.

36

5. Интегрированная среда проектирования MPLAB IDE и работа в ней

45

6. Что дальше?

70

7. Пример создания программы (начало)

72

8. Пример создания программы (продолжение)

96

9. Работа в симуляторе. Отладка программы

107

10. Как отследить выполнение программы

121

11. Прерывания. Стек. Пример разработки программы с уходом в прерывания

134

12. Организация вычисляемого перехода. Работа с EEPROM памятью данных

160

13. Флаги. Работа с флагами. Как работает цифровой компаратор. Перенос и заем

182

14. Пример задействования флага С в трехбайтном суммирующем устройстве.

Циклический сдвиг. Операция умножения

200

15. Введение в принцип построения подпрограммы динамической индикации.

Косвенная адресация

222

16. Преобразование двоичных чисел в двоично-десятичные. Окончательное

формирование текста подпрограммы динамической индикации

243

17. Принцип счета. Работа с таймером TMR0.

Принцип установки групп команд счета в текст программы

262

…………………………………………………………………

…………………………………………………………………

Заключение

277

Дополнительная информация

279

Количество страниц:

287.

2

Введение

Эпиграф: программист, работающий в ассемблере, должен быть «властелином колец«. И еще: банальность это уставшая истина.

(поймете позднее)

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

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

Нужно было выбрать: либо «сложить лапки» и перейти в категорию постепенно «вымирающих» (дисквалифицирующихся),

либо заняться этими «страшными и ужасными» микроконтроллерами, которые все более напоминали «в каждой бочке затычку».

«Вымирать» совсем не хотелось, так что выбор был однозначным. И тут началось нечто, что напоминало «передвижение по джунглям».

Информационный «бардак» в этом «секторе» оказался настолько впечатляющим, что «волосы встали дыбом».

А куда деваться? «Отступать-то некуда, позади Москва».

Кстати, точно в таком же положении находятся сейчас многие люди (знаю по письмам), для которых «въезд» в микропроцессорную технику стал не то что какой-то «блажью», а самой натуральной жизненной необходимостью, что вполне понятно, ведь м/контроллеры входят в состав практически любой более или менее современной, малогабаритной (и не только) аппаратуры (а «чем дальше в лес, тем больше дров»…).

Чего я натерпелся, знает только один Господь Бог: помощи никакой и пришлось рассчитывать только на свои силы.

После всех этих «мытарств», возник закономерный вопрос: «Это что же такое получается? Неужели каждый, кто вознамерится «посягнуть» на эти «железяки», должен обязательно «разбивать свой нос в кровь», водя им по «батарее»?

Неужели нельзя без этого обойтись или, по крайней мере, сделать этот процесс не столь болезненным?

Прикинул…

А ведь, ей Богу, можно!

Правда, придется «вспахать поле не паханное», но по совокупности причин, смысл в этом есть.

То, что Вы прочитаете в «Самоучителе…», есть итог указанного выше болезненного процесса, преподнесенный «на блюдечке с голубой каемочкой».

Принцип преподнесения информации — максимальная степень «разжеванности», так как «Самоучитель…» предназначен именно для начинающих.

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

Такого рода желание, конечно же, похвально, но при отсутствии плановости, четко выраженных приоритетов и способности, на первых порах, сознательно ограничивать объем воспринимаемой информации только самой действительно необходимой, оно играет с человеком злую шутку.

В результате — «бардак» в голове, дезориентация в потоках информации и в худшем случае, сожаление о потраченном времени, хотя, по большому счету, все не так уж и суперсложно, как может показаться на первый взгляд.

Я вовсе не говорю, что это просто. Поработать придется, но и пугаться совсем не стоит, так

3

как «не так страшен черт, как его малюют».

Еще одна беда — недооценка огромного значения знания и умения применения на практике стратегии и тактики «мозгового штурма».

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

Мозги есть у всех, а вот со стратегией и тактикой этого «штурма» имеются большущие проблемы. Можно ведь, с дуру, и «пулю схлопотать» (по сценарию типа «геройская смерть программиста»).

Всвоей работе я исхожу из того, что мозги являются не только логической «машиной», но и «вместилищем личности».

Последнее либо явно недооценивается, либо вообще не берется в рассчет авторами подобных моему «творений», что есть огромнейший их просчет, сводящий на нет большую часть усилий.

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

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

Для того чтобы понять огромный вред такого подхода к обучению, вспомните про Афганистан или Чечню и про участь тех необстрелянных и психологически неподготовленных ребят, которых «бросили в эту мясорубку».

Я не желаю Вам такой участи, и по этой причине, в «Самоучителе…», предпринята своеобразная попытка постепенного «встраивания» нулей и единиц в личность (их «одухотворения») и формирования некой «идеологии офицера программных воск» («боевого духа», «стержня»), без которой любая «война» (программирование есть чисто мужское и «хулиганское» занятие с названием «война со своей бестолковостью») проигрывается даже не начавшись и которая является главной основой любой эффективной «школы» обучения. Сравнить мне не с чем, и поэтому я работаю на свой страх и риск.

Не судите меня строго, так как я работаю «с нуля» и «психологическим спецом» не являюсь. Надеюсь на то, что другие авторы продолжат эту исключительно важную и «преступно» игнорируемую «психологическую тему». Хочется верить, что при чтении «Самоучителя…», Вы почувствуете, что такое доброжелательное и уважительное отношение к Вашему совсем не легкому труду (по себе знаю), а Ваше подсознание не будет выдавать сигналов SOS об «изуверском изнасиловании мозгов».

Отдельно обращаюсь к «хулиганам», «драчунам» и «задирам» (в обывательском понимании этих слов), «мозговая деятельность» которых явно выражена.

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

Впрограммировании, агрессивность есть достоинство, а не недостаток.

Здесь можно, от души, интеллектуально «помахать кулаками» (ограничений нет), плюс, «посворачивать шеи» многим достойным уважения «врагам» (ограничений нет), от чего, кстати, Вы однозначно получите большое удовольствие.

Итак, информация будет предоставляться в определенной последовательности и по принципу «от простого к сложному».

Прошу придерживаться этой последовательности и не переходить к следующим разделам без уяснения предыдущих. Дело это неторопливое и не требующее суеты.

Все «валить в кучу» не буду, «перенапряг» также постараюсь не создавать. «Самоучитель…» расcчитан на начинающих, но при этом предполагается, что они, как минимум, знают основы цифровой техники.

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

4

1. Готовим инструменты

Микроконтроллеры (и вообще все процессоры) изначально понимают только машинные коды, то есть некую совокупность нулей и единиц.

Те, кто представляет себе работу счетчиков, регистров, триггеров и т.д., сразу же поймет природу машинного кода.

Так как, среди электронщиков, таких людей большинство, то на мой взгляд, все они согласятся с такой аксиомой: машинные коды полезны в «малых дозах».

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

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

И в самом деле, сил и средств вкладывается «море», а получается нечто не очень надежное, габаритное, сложное в изготовлении, энергоемкое и дорогое.

Чтобы «одним махом прихлопнуть» все эти проблемы, «яйцеголовые» и придумали сначала «большие» процессоры (то, что применяется в компьютерах), а затем и «маленькие», назвав их микроконтроллерами.

Внутри м/контроллера находится «набор» модулей, каждый из которых многофункционален. Манипулируя весьма не слабыми возможностями этого «набора», можно реализовать миллионы разновидностей устройств.

Естественно, всем этим «хозяйством» нужно как-то «рулить». Эта «рулежка» и есть то, что называется программированием.

Если речь идет о больших «массивах» машинных кодов, то программирования напрямую (в машинных кодах) и врагу не пожелаешь: удовольствия никакого, да, чего доброго, и в «психушку» попасть можно (есть исключения — люди с выдающимися способностями и гении). Для того, чтобы обычные люди могли, без особого «напряга», заниматься составлением программ, придуманы различные языки программирования.

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

Все эти «удобоваримые приятности», по окончании составления текста программы, переводятся в машинные коды одним «легким движением руки» (мозги программиста не задействуются).

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

Это есть набор программ, в котором программист работает с максимальной степенью комфорта, причем, по всему «массиву» решаемых им задач (включая и составление текста программы, и т.д. и т.п.).

Что, первым делом, нужно сделать, например, русскому, который попал в Англию и собирается там жить?

Выучить английский язык.

При «въезде» в программирование, нужно сделать то же самое (задача даже существенно проще).

«Проматерь» всех языков программирования — ассемблер.

Хотя он и считается самым простым, но слово «простой» относится прежде всего к набору его команд: количество их — минимально необходимое, и тем не менее, вполне достаточное для решения самых сложных задач, но не к комфортному восприятию их человеком.

Команды ассемблера являются либо сокращениями английских слов, либо набором первых букв английских словосочетаний, либо и тем, и другим.

Минимальный «джентльменский» набор ассемблера для ПИКов составляет 35 команд. Реально же, наиболее часто, используются от 10 до 20 команд.

В дальнейшем, настройте себя просто на тупое заучивание (на первых порах) всей этой английской «абракадабры», типа зубрежки (я вообще не имею никакой склонности к иностранным языкам, но ничего, освоил), не такая уж это и сложная задача, заверяю Вас. В дальнейшем, Ваше образное мышление и зрительная память Вам помогут.

Авыучить ассемблер очень даже стоит по причине того, что он, может быть, и не очень

«удобоварим», но именно на этом языке пишутся самые компактные по объему, быстрые и надежные программы, и по этой причине, серьезные программисты, работают

5

преимущественно в ассемблере.

Предупреждение: на этом этапе в ассемблер не лезть! Всему свое время. Пока достаточно общего представления (пусть «в мозгах уляжется»).

Программы для ПИКов составляются преимущественно в ассемблере.

Даже если программа для них и составлена на языке более высокого уровня, то в конечном итоге, интегрированная среда разработки переведёт все в ассемблер.

Об интегрированной среде разработки (проектирования): Она выполняет целый комплекс задач.

В ее специализированном текстовом редакторе, составляется текст программы.

Текст программы нельзя записывать в ПИК, так как он «понимает» только машинные коды. Следовательно, нужно преобразовать текст программы, с языка ассемблер, в машинные коды.

То есть, необходимо так называемое ассемблирование (компилирование) исходного текста программы, которое производится все в той же интегрированной среде разработки.

Вот здесь-то начинающие обычно и путаются: словосочетание «ассемблирование исходного текста программы» означает не перевод исходного текста программы на язык ассемблер (текст программы уже написан на языке ассемблер), а наоборот, преобразование текста программы, написанной на языке ассемблер, в машинные коды, которые сначала соответствующим образом архивируются и помещаются внутрь специального файла с расширением (форматом) .HEX (для удобства хранения и транспортировки машинных кодов), а затем разархивируются из HEX-файла и принимают свой исходный вид в программе, обслуживающей программатор.

С помощью этой программы, машинные коды программы записываются в ПИК. Приведенное выше словосочетание, используемое сплошь и рядом, безусловно, не является удачным.

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

Ее возможности ими далеко не исчерпываются.

Интегрированная среда разработки для ПИКов называется MPLAB.

Эта программа (вернее набор программ) создана производителем ПИКов, то есть фирмой

Microchip Technology Inc.

В России, представителем этой фирмы является ООО «Микро-Чип», которое имеет в Интернете свой сайт технической поддержки на русском языке http://www.microchip.ru (кстати, на этом сайте, в разделе «Начинающим», есть ссылка на мой сайт).

6

Лично я пользуюсь версией MPLAB 5.70.40, что и Вам советую.

Это «старый, добрый конь, который борозды не испортит» и возможностей у него «выше крыши».

Главный недостаток этой версии — медленно работает (считает), но для начинающих, «реактивной» скорости и не нужно.

Главное ее преимущество — надежность работы.

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

Вдальнейшем, я буду ориентироваться на версию 5.70.40.

Примечание: дистрибутив MPLAB версии 5.70.40 (и еще 2 версии) имеется на компактдиске. Закачивать дистрибутив MPLAB нужно в папку с английским названием (папка мои документы или рабочий стол не подойдут), иначе будете иметь проблемы.

Лучше всего организовать ее в папке Program Files диска С.

Программа MPLAB является интегрированной средой разработки для ПИКов и содержит все необходимое как для написания и редактирования программы, так и для создания HEX-файлов, а также и для отладки программы.

Таким образом, необходимость в наличии отдельного текстового редактора для написания программы, отдельной программы — ассемблера для создания HEX-файла и отдельного отладчика программы (симулятора) отпадает, так как в MPLAB все это есть (и даже более того).

Установите MPLAB на свой компьютер, убедитесь, что она встала не «криво» и на время про нее забудьте, так как для того чтобы с ней работать, необходимо основательно подготовиться, чем в дальнейшем мы и будем заниматься.

Следующий шаг — сборка программатора, так как HEX-файл программы, созданный в MPLAB, необходимо «превратить» в машинные коды, которые и будут записываться в ПИК (так называемая «прошивка»).

Ничего проще и надежнее чем программатор PonyProg, я, на первом этапе, предложить не могу, хотя, безусловно, имеются и другие «достойные» программаторы.

Информацию по сборке программатора PonyProg Вы найдете в «Приложении №1″.

Следует учесть, что программатор PonyProg лучше всего работает на относительно «медленных» компьютерах старых выпусков, так как, в свое время, программа PonyProg создавалась под них.

При подключении программатора к современным быстродействующим компьютерам с «навороченными» операционными системами, могут возникнуть конфликты типа «нестыковки» программы PonyProg с операционной системой или превышения предельно допустимой скорости обмена данными между компьютером и программируемым ПИКом, то есть программатор может просто не заработать.

7

Это вовсе не есть факт, но такое может быть.

Самое лучшее решение — применение для этих целей компьютера с тактовой частотой до 500мГц и операционной системы Windows95/98.

Лично я сделал так: купил практически «за так» «древнюю старушку», обманул BIOS, пристегнув к родному винчестеру, «помощником», дополнительный винчестер на 8Гб, поставил Windows98 и включил «форсаж».

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

В моей «старушке» стоит почти на 2Гб подобного рода программ, в том числе и довольно-таки «навороченных», и ничего, прекрасно работает.

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

HEX — калькулятор: файл CALC32.rar прилагается (папка «Программы«). Конвертер систем исчисления: файл BCONV32 прилагается (папка «Программы«).

Они настолько просты, что Вы без труда разберетесь, зачем они нужны. Чаще всего требуется конвертер систем исчисления.

08.07.07.

Один из активных участников работы, Петр Высочанский, разработал программу конвертера систем исчисления, которая наиболее адаптирована к практическим нуждам:

Конвертер систем исчисления Петра Высочанского: файл Hex-Dec_Bin.exe прилагается

(папка «Программы«)

8

При открытии, программа конвертера устанавливает английскую раскладку клавиатуры (то, что нужно).

Итак, все что необходимо для занятия программированием PIC контроллеров имеется. Пока, это не более чем красивые и интригующие «штучки» не вполне понятного предназначения.

Можно их на досуге рассмотреть, на что-нибудь понажимать, только, во избежание дальнейших недоразумений, не трогайте настроек по умолчанию.

Переходите к следующему разделу.

«Самоучитель по программированию PIC контроллеров для начинающих» http://ikarab.narod.ru E-mail: karabea@lipetsk.ru

9

2. Что такое микроконтроллер, и как он работает

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

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

Иногда даже диву даешься: эта маленькая «штучка» заменяет целую «груду старого железа» (К555 и т.д.).

Любой микроконтроллер, по своим возможностям, конечно же, уступает процессору компьютера, но тем не менее, существует весьма обширный класс устройств, которые преимущественно реализуются именно на микроконтроллерах.

Ив самом деле, компьютер в карман не положишь и от батареек его не запитаешь. Поэтому, во многих случаях, микроконтроллерам просто нет альтернативы. «Сердцем» микроконтроллера является арифметико — логическое устройство (АЛУ).

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

Если вдуматься, то ничего особо сложного, в механизме управления такого рода калькулятором, нет.

Ив самом деле, если нужно, например, сложить числа А и В, то в тексте программы сначала задаются константы А и В, а затем дается команда «сложить».

Программисту вовсе не обязательно знать, что происходит с нулями и единицами (разве только только для общего развития), ведь калькулятор он на то и калькулятор, чтобы избавить пользователя от «возни» с машинными кодами и прочими «неудобоваримостями». Когда Вы работаете с компьютером, Вам и не нужно детально знать, что происходит в дебрях операционной системы.

Если Вы туда «полезете», то «с ума сойдете», а микроконтроллер, по своей сути, есть тот же самый компьютер, но только простой.

Программисту только нужно детально знать, каким именно образом «приказать железяке» сделать то, что необходимо для достижения задуманного.

Микроконтроллер можно представить себе как некий универсальный «набор» многофункциональных модулей (блоков), «рычаги управления» которыми находятся в руках программиста.

Этих «рычагов» достаточно большое количество, и естественно, их нужно освоить и точно знать, что именно произойдет, если «дернуть» (дать команду на языке ассемблер) за тот или иной «рычаг».

Вот здесь-то уже нужно знать, как «отче наше», каждую деталь и не жалеть на это «узнавание» времени.

Только таким образом пустую «болванку» (незапрограммированый ПИК) можно «заставить» выполнять какие-то «осмысленные» действия, результат большей части которых можно проверить в симуляторе MPLAB (об этом — позднее), даже не записывая программу в ПИК. Итак, необходим переход к «модульному» мышлению.

Любой микроконтроллер можно уподобить детскому конструктору, в состав которого входит множество всяких предметов, манипулируя с которыми, можно получить тот или иной конечный «продукт».

Давайте с ними разберемся и «разложим все по полочкам».

В качестве примера я буду использовать один из самых распространенных PIC контроллеров

PIC16F84A.

Он является как бы «проматерью» более сложных ПИКов, содержит минимальный «набор» модулей и как нельзя лучше подходит для первичного «въезда в м/контроллеры».

Энергонезависимая память.

Начнем с энергонезависимой памяти (память программ и память данных). Информация, заложенная в энергонезависимую память, сохраняется при выключении питания, и поэтому именно в нее записывается программа.

То «место» энергонезависимой памяти, куда записывается программа, называется памятью программ.

Объем памяти программ может быть различен. Для PIC16F84A, он составляет 1024 слова. Это означает, что он предназначен для работы с программами, объем которых не превышает

10

Соседние файлы в предмете Микроконтроллеры ЭВМ

  • #

    12.08.201312.96 Mб47Основы языка VHDL (П.Н. Бибило, 2-е изд., 2002).djvu

  • #

    12.08.20135.44 Mб86Основы языка VHDL (П.Н. Бибило, 3-е изд, 2007).djvu

  • #
  • #

    12.08.20138.03 Mб180Программируемые контроллеры. Стандартные языки и приемы прикладного проектирования (И.В. Петров, 2004).pdf

  • #
  • #
  • #

    12.08.201313.8 Mб81САПР Altera — MAX+PLUS II и Quartus II (Д.А. Комолов, 2002).djvu

  • #
  • #
  • #
  • #

Introduction: Programming PIC Microcontrollers

PIC microcontrollers are a very useful and versatile tool for use in many electronic projects. They are very inexpensive and easy to find. They are also very powerful and many are capable of speeds up to 64 MIPS using the internal oscillator block, about 16 times faster than most comparable AVR microcontrollers. PICs are also easy to program, however getting the project set up can some times be tricky. These instructions will walk through the process of setting up the software, creating a new project, and programming some very simple functions to test the configuration and ensure everything is working. They are designed to be very open ended; after the project is created and the basics are finished the reader is encouraged to explore all the features and extras not covered in these instructions. Also you will find that these instructions will start out walking through step by step, but as the instructions near the end the reader is encouraged to explore other ways of accomplishing the tasks and make the project their own.
What you will need To build a project with a PIC microcontroller only requires a few items.

  • PIC microcontroller
    • These instructions are for programming a PIC18F series MCU, although others are similar.
    • Obtained from Microchips website.
    • Microchip allows students with valid .edu email addresses sample PIC’s for free!
    • The PIC I am using to create these instructions is a PIC18F22K80
  • PICkit 3 In-Circuit Debugger
    • Available from Microchip.
    • Costs $45 for general public, and #34 with student discount if you have an .edu email address.
    • There are also other programmers which will work just as well; however, this is the best one for starting out.
  • Breadboard and breadboard wires
  • LEDs, buttons, potentiometers, or anything else you would like to connect to the PIC

Step 1: Build Hardware

Before doing any programming the first step is to build the hardware. Although the PIC18F portfolio is very large, many of the chips have several commonalities. For more detailed information see the «Guidelines for Getting Started with PIC18Fxxxx Microcontrollers» section in your devices datasheet. For detailed pin-outs of the PIC microcontroller see the «Pin Diagram» section in your devices datasheet.

Note: VDD = Positive Voltage and VSS = Ground.

  1. Connect the MCLR pin through a 1kΩ resistor to VDD.
  2. Connect a 0.1μF capacitor between every pair of adjoining VDD-VSS pairs or AVDD-AVSS pairs.
  3. Connect a 10μF capacitor between VCAP and Vss.
  4. Connect MCLR pin to pin 1 of the PICkit 3.
  5. Connect VDD to pin 2 of the PICkit 3.
  6. Connect VSS to pin 3 of the PICkit 3.
  7. Connect PGD pin to pin 4 of the PICkit 3.
  8. Connect PGC pin to pin 5 of the PICkit 3.
  9. Leave pin 6 of the PICkit 3 unconnected.
  10. Connect any analog inputs to pins with ANx functionality where x is a number.
  11. Connect any digital inputs or outputs to pins with Rxy functionality where x is a letter identifying the port, and y is a number identifying the bit.

For my example I have an LED connected between RA0 and ground, the wiper of a potentiometer connected to AN1, and a DPST switch connected to RA2. You may find it easier to program the PIC if you have sketched down a schematic of your circuit.

Step 2: Get Software

These instructions will use XC8 compiler and MPLAB X IDE by Microchip. This step will explain how to get these tools and ensure they have been installed correctly.

  1. To get the latest version of the software visit Microchips website at http://www.microchip.com/pagehandler/en-us/family/mplabx/
  2. Select the software for your OS and follow the standard installation instructions.

Note: If you are using Windows 8 you may need to run the installers in compatibility mode for Windows 7.

  1. Once the software is installed, start MPLAB X
  2. In the menu bar select Tools->Options
  3. In the Options dialog select the Embedded tab and ensure XC8 is listed in the Toolchain list.
  4. If it is listed select OK and move on the next step.
  5. If it is not listed ensure that instillation has completed, and click Scan for Build Tools button.
  6. If still not listed, look on Microchips forum for help with your specific problem.

Step 3: Create New Project

In this step we will create a new project based on a template from Microchip.

  1. On the menu bar select File->New Project…
  2. In the new file dialog box expand Samples and select Microchip Embedded
  3. In the project box select PIC18 C Template
  4. Select Next
  5. Give the project any name you like
  6. Choose a location to save the project to in the Project Location box
  7. Leave the Project Folder as default options
  8. Check «Set as Main Project» box
  9. Select Finish

The project will now show up in Project Explore on the left hand side of the screen.

Step 4: Build Parameters

Before we can get started programming we need to set the build parameters.
Create Configuration

  1. Right click on the project name in the projects tool bar.
  2. In the Project Properties dialog select Manage Configurations…
  3. In the Configurations dialog select New
  4. In the New Configuration Name dialog enter Default and click OK
  5. In the Configurations dialog make sure Default is selected and click Set Active
  6. Click OK in the Configurations dialog

Set Configuration Properties

  1. In the Project Properties dialog select «Conf: [Default]» in the Categories list
    1. In the Device box type the name of the device you are using. In my case PIC18F26K80
    2. In the Hardware Tools list select PICkit3
    3. In the Compiler Toolchain select XC8 (v…) Where … is the version you have installed.
    4. Select Apply
  2. Under Conf: [Default] select PICkit 3
    1. For Option categories select Power
    2. Check «Power target circuit from PICkit3
    3. Select Apply.
  3. Under Conf: [Default] select XC8 compiler
    1. For Option categories select Optimizations
    2. Set «Optimization Set» to «none»
    3. Select Apply
  4. Click OK to close the dialog box

Test the Configuration To test the configuration click the clean and build button (the one with the hammer and broom). Text will start scrolling in the output window at the bottom of the page. If everything is successful the this text will say BUILD SUCCESSFUL (total time: …). If you get an error, go back through this step making sure that you did not miss anything, and that everything was applied.

Step 5: Set Configuration Bits

The next step is setting the configuration bits. The configuration bits tell the MCU its initial conditions for when it turns on. They are used to set the clock source and speed, watchdog time configuration, and other similar features. Configuration bits are device dependent, so check the data sheet for the chip you are using for more information.

  1. In the project explorer expand Source Files and open configuration_bits.c
  2. Remove all the text below the #endif line
  3. Notice a new tab has opened at the bottom of the screen
  4. Set the bits as needed for your project. Since these are chip dependent, check the data sheet for more information about what each does. Some common settings follow:
    1. Extended Instruction Set — Should be set to OFF when using template
    2. Oscillator — Used to select the processor. Unless you are using an external crystal, leave set as Internal RC oscillator. See data sheet for other oscillator configurations. Note: CLKOUT will allow for easier debugging, and should be turned on if available.
    3. PLL Enable — Will allow for future use of the PLL. Note: this will not turn on the PLL, it will only enable it. It is recommended to enable it.
    4. Watchdog Timer — The watch dog timer is used to ensure the processor will not lock up. It however makes it much harder to debug. It is recommended to disable it while initially programming, and only enable it after the project is nearly done.
    5. Code/Table Write/Read protects — Used to disable writing or reading to certain ranges of memory. Leave all of these disabled.
    6. If unsure about a setting, it is usually safe to leave it default.
  5. After all configuration bits have been set, click the «Generate Source Code to Output» button at the bottom of the panel.
  6. The panel will now switch to the Output tab. Select all the text in this tab and copy it to the clip board
  7. Paste it at the bottom of the configuration_bits.c file and pres save.
  8. Clean and build the project again by clicking the broom and hammer icon.
  9. Ensure the build was successful. Also check to make sure there was no errors in the output

If everything has worked move on to the next step. If there are errors or warnings fix them before moving on.

Step 6: Configure Oscillator

The next step is to start programming; however, before we get to the application code we must program the system code. The system code are the low level functions such as configuring the oscillator and basic delay functions.

Determining Settings

Before we can program the settings, we must choose what speed we would like to run at. For this example I will use 16MHz as most PIC’s can run at this speed. For my configuration I will use the 4MHz postscaller from the HF-INTOSC, and the 4x PLL giving an output frequency of 4MHz*4x=16MHz

  1. In the datasheet find the section labeled Oscillator Configurations
  2. The first thing listed in this section is Oscillator Types. If you are using the internal oscillator then use the settings relating to INTIO1
  3. On the next page or two you will find a schematic drawing of the oscillator similar to the one shown. It is helpful to trace the signal on this drawing to ensure the correct speed is being selected.
  4. The next step is to program these settings to the MCU. This is done by setting registers. The first register to set is OSCCON.

    1. IDLEN — used to control the action of the sleep command. Can be left as default.
    2. IRCF — Oscillator selection. Since I am using HF-INTOSC/4 (4MHz) I will need to set this to a binary value of 101
    3. OSTS — Read only bit
    4. HFIOFS — Read only bit
    5. SCS — clock select bits. Since I am using the internal oscillator, I will set to 1x where x can be 0 or 1
  5. The next register is OSCCON2; however, this register is mostly read only and not important at this point
  6. The last oscillator configuration register is OSCTUNE. We will not tune the frequency for this project, however we must use this register to turn on the PLL using the PLLEN bit.

Applying Settings

  1. Return to MPLAB
  2. In the project explorer under Source Files open system.c
  3. At the bottom of this file is the function ConfigureOscillator. Remove the comments in that function.
  4. To set the bits of a register type in all caps the register name, followed by the lowercase word bits and then a period and the bit name.
  5. To set the bits follow that with an equal sign. To use binary type 0bXXXX where XXXX is the binary number. Lastly end the line with a semi-colon.
  6. Set all the bits as determined above for the OSCCON register. Example: OSCCONbits.IRCF = 0b101;
  7. Do the same for all other needed oscillator registers. See below for an example of a finished ConfigureOscillator function.
  8. When finished build and check for warnings/errors
/** * Configure the clock source and speed */void ConfigureOscillator(void){
    OSCCONbits.IRCF     =0b101;
    OSCCONbits.SCS      =0b00;
    OSCTUNEbits.PLLEN   =0b1;}

Step 7: Wait Milli-Second Function

One of the most useful functions is wait_ms. This however is not a function in the standard library, and will need to be programmed by you. For this implementation there will be a loop which will hold the processor until the given time has passed.

PIC18F microcontrollers need 4 clock cycles to execute one line of assembly code. Therefore with a clock of 16MHz, lines will be executed at 4 million lines per second = 4000 lines per milli-second. Since a for loop will take one instruction each time for the comparison, and two for the operation one for the body of the loop, it will work perfectly. We just need the for loop to loop 1000 time per milli-second.

  1. In system.c create a new function at the bottom of the file of type void wait_ms(uint16_t time)
  2. Below is the completed function
/**
 * Wait for a given number of milli-seconds using busy waiting scheme.
 * @param time - time in ms to wait.
 */
void wait_ms(uint16_t time)
{
    static long timel = 0;
    timel = time * 1000l;
    for( ; timel; timel--);// no initial condition, while time is >0, decrement time each loop
}
  1. Open system.h in the Header Files folder in the project browser
  2. At the end add the line void wait_ms(uint16_t); to prototype the function.
  3. Change line 8 from 8000000L to 16000000L
  4. Build and check for errors/warnings

Step 8: Blink an LED

The best way to test that everything is set up correctly is to blink an LED light. If the light blinks at the expected rate then everything has been configured correctly. In this example the LED is connected to PORT A, Pin 0 (RA0 on the datasheet). If you have your LED connected to a different pin, use the appropriate registers and bits.

  1. Open main.c in the project viewer under source files.

The function void main(void) is the main entry point of the program. When the MCU first powers on it will enter into this function. The first line calls the ConfigureOscillator function you filled in to set the clock source and speed. The next line calls InitApp, a function that we will fill in shortly, and finally it enters an infinite loop. Since there is no operating system for the function to return to, there is no return call at the end.
The finished function should look like this:

  1. Immediately above the while loop add the following code.
    1. Set the LED pin as output — TRISAbits.TRISA0 = 0; // setting a TRIS bit to 0 sets as output, setting to 1 sets as input
  2. Inside the while loop add the following code
    1. Set the LED to OFF — LATAbits.LATA0 = 0; // the LAT bits control the output of a pin. 0 = LOW, 1 = HIGH
    2. Wait for 1/2 second — wait_ms(500);
    3. Set the LED to ON — LATAbits.LATA0 = 1;
    4. Wait for 1/2 second — wait_ms(500);
void main(void)
{
    /* Configure the oscillator for the device */
    ConfigureOscillator();

    /* Initialize I/O and Peripherals for application */
    InitApp();
   
    TRISAbits.TRISA0 = 0; // set pin as output
    while(1)
    {
        LATAbits.LATA0 = 0; // set pin LOW
        wait_ms(500);       // wait 0.5 seconds
        LATAbits.LATA0 = 1; // set pin HIGH
        wait_ms(500);       // wait 0.5 seconds
    }
}
  1. Build the program and check for errors or warnings
  2. Ensure the PICkit is connected correctly to the PIC and the computer
  3. Click the make and program device button (the button to the right of the clean and build button)
  4. If prompted select PICkit 3 and click OK
  5. When the warning shows double check you have the correct PIC in the circuit and click OK
  6. If a warning shows about Target Device ID click OK to ignore it

Step 9: Reading an Analog Value

So far the program can blink an LED. Next lets give it some user input. We will use a potentiometer to create an analog signal which will change the speed of the LED. The ADC takes an analog voltage, and outputs a digital value.

  1. In the project browser open user.c under Source Files
  2. Above the InitApp function create a new function void init_adc(void)
  3. Enter the following code to initialize the ADC module
/** * Initialize the Analog to Digital Converter. */void init_adc(void){
    TRISAbits.TRISA1    =0b1;// set pin as input
    ANCON0bits.ANSEL1   =0b1;// set pin as analog
    ADCON1bits.VCFG     =0b00;// set v+ reference to Vdd
    ADCON1bits.VNCFG    =0b0;// set v- reference to GND
    ADCON1bits.CHSN     =0b000;// set negative input to GND
    ADCON2bits.ADFM     =0b1;// right justify the output
    ADCON2bits.ACQT     =0b110;// 16 TAD
    ADCON2bits.ADCS     =0b101;// use Fosc/16 for clock source
    ADCON0bits.ADON     =0b1;// turn on the ADC}
  1. Next create another function immediately after called uint16_t adc_convert(uint8_t channel)
/** * Preform an analog to digital conversion. * @param channel The ADC input channel to use. * @return The value of the conversion. */
uint16_t adc_convert(uint8_t channel){
    ADCON0bits.CHS      = channel;// select the given channel
    ADCON0bits.GO       =0b1;// start the conversionwhile(ADCON0bits.DONE);// wait for the conversion to finishreturn(ADRESH<<8)|ADRESL;// return the result}
  1. In the InitApp function add the line init_adc()
  2. In the file user.h add the prototype uint16_t adc_convert(uint8_t);
  3. Change main to match the following:
voidmain(void){
    uint16_t adc_value;// variable to hold ADC conversion result in/* Configure the oscillator for the device */
    ConfigureOscillator();/* Initialize I/O and Peripherals for application */
    InitApp();

    TRISAbits.TRISA0 =0;// set pin as outputwhile(1){
        LATAbits.LATA0 =0;// set pin LOW
        adc_value = adc_convert(1);// preform A/D conversion on channel 1
        wait_ms(adc_value>>2);// wait 0.5 seconds
        LATAbits.LATA0 =1;// set pin HIGH
        adc_value = adc_convert(1);// preform A/D conversion on channel 1
        wait_ms(adc_value>>2);// wait 0.5 seconds}}
  1. Build and download the code. As you turn the POT the speed the LED blinks should change

Step 10: Read a Digital Value

Next lets get digital input from the switch. When the switch is off we will have the program do what it has been doing all along, and when the switch is on the program will light up the LED solid until the switch is turned off again.

  1. To set a pin as an input, write a 1 to that pins TRIS register bit — TRISAbits.TRISA2 = 1;
  2. If a pin share analog features, it may be necessary to set it to digital by clearing the appropriate bit in ANCONx register
  3. When writing a value to a pin use the LAT register; however, when reading a value from a pin use the PORT register — value = PORTAbits.RA2;
  4. Change main to the following:
voidmain(void){
    uint16_t adc_value;// variable to hold ADC conversion result in/* Configure the oscillator for the device */
    ConfigureOscillator();/* Initialize I/O and Peripherals for application */
    InitApp();

    TRISAbits.TRISA0 =0;// set pin as output
    TRISAbits.TRISA2 =1;// set pin as input
    ANCON0bits.ANSEL2=0;// set pin as digitalwhile(1){if(PORTAbits.RA2)// if the pin is high{
            LATAbits.LATA0 =1;// set the pin as high}else// if the pin is low{// blink the LED
            LATAbits.LATA0 =0;// set pin LOW
            adc_value = adc_convert(1);// preform A/D conversion on channel 1
            wait_ms(adc_value>>2);// wait some time
            LATAbits.LATA0 =1;// set pin HIGH
            adc_value = adc_convert(1);// preform A/D conversion on channel 1
            wait_ms(adc_value>>2);// wait some time}}}

That is it! You now have the basic knowledge of how to set up a new project, read and write to digital pins, and how to read from analog pins. These three features will allow you to do 90% of the projects using PICs on the Internet. Also, as you continue your exploration into PIC microcontrollers you will find that most other features require very similar steps to configure peripherals, and read and right to registers.

Урок 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


Post Views:
3 913

В 1980 году компания Intel разработала первый микроконтроллер (8051) с гарвардской архитектурой 8051, и с тех пор микроконтроллеры произвели настоящую революцию в электронике. И в настоящее время мы располагаем целым набором эффективных и сравнительно дешевых микроконтроллеров: AVR, PIC, ARM и др. Данные микроконтроллеры просты в освоении и поддерживают широкий набор современных интерфейсов связи: USB, I2C, SPI, CAN и т.д. Отдельную микро революцию в этой сфере произвели такие платы как Arduino и Raspberry Pi, при этом Raspberry Pi представляет собой не просто микроконтроллер, а целый компьютер внутри.

Данным материалом мы начнем на нашем сайте цикл обучающих статей по микроконтроллерам PIC, которые являются отличным выбором для начинающих освоение микроконтроллерной техники.

Внешний вид компонентов, необходимых для начала работы с микроконтроллерами PIC

В этой статье мы рассмотрим общее устройство микроконтроллеров PIC и программное обеспечение, с помощью которого можно работать с данными микроконтроллерами. Видео в конце данной статьи расскажет вам об установке и настройке таких программ как MPLABX, XC8, Proteus. Также будет рассмотрена быстрая распаковка программатора PICkit 3.

Микроконтроллер PIC впервые был представлен компанией Microchip Technologies в 1993 году. Первоначально эти микроконтроллеры были разработаны как часть компьютеров PDP (Programmed Data Processor), и все периферийные устройства подключались к данному компьютеру с использованием данного микроконтроллера PIC. Отсюда микроконтроллеры PIC и получили свое название – Peripheral Interface Controller (контроллер периферийного интерфейса). Позже компания Microchip разработала множество микросхем серии PIC, которые могут быть использованы для практически любых небольших приложений, таких, к примеру, как освещение, и вплоть до достаточно «продвинутых» устройств.

Каждый микроконтроллер в современном мире построен на основе определенной архитектуры, самый известный сейчас тип архитектуры для микроконтроллеров – это гарвардская архитектура. И микроконтроллеры PIC основаны именно на этой архитектуре, поскольку они принадлежат к классическому семейству 8051. Поэтому давайте рассмотрим основы данной архитектуры.

Микроконтроллер PIC16F877A состоит из встроенного процессора, портов ввода-вывода, нескольких типов памяти, аналого-цифрового преобразователя (АЦП), таймеров/счетчиков, системы прерываний, портов последовательной связи, генератора и модуля CCP, что делает его удобным для применения в большинстве проектов встраиваемой электроники. Структурная схема архитектуры микроконтроллера PIC приведена на следующем рисунке.

Архитектура микроконтроллеров PIC

Центральный процессор (Central Processing Unit, CPU)

Центральный процессор в микроконтроллерах PIC предназначен для выполнения арифметических и логических операций и операций чтения/записи в память. Также он выполняет функции координатора между оперативной памятью (RAM) и другими периферийными устройствами микроконтроллера.

Центральный процессор состоит из следующих основных компонентов:

  • арифметико-логическое устройство (АЛУ), выполняющее арифметические и логические операции;
  • блок памяти (Memory unit, MU), хранит инструкции (команды) после их выполнения;
  • блок управления, выполняет роль коммуникационной шины между центральным процессором и другими периферийными устройствами микроконтроллера.

Оперативное запоминающее устройство (Random Access Memory, RAM)

Оперативное запоминающее устройство (ОЗУ) – это один из компонентов, который оказывает существенное влияние на скорость работы микроконтроллера. Оно состоит из набора регистров, каждый из которых выполняет свои определенные функции. Данные регистры могут быть классифицированы по двум основным признакам:

  • регистры общего назначения (General Purpose Register, GPR);
  • специальные регистры (Special Function Register, SFR).

Как следует из их названия, регистры общего назначения (РОН) выполняют такие основные функции как сложение, вычитание и т.д. В микроконтроллерах PIC эти операции ограничены размером 8 бит. Регистры общего назначения доступны как для записи, так и для чтения, и не могут выполнять каких либо специальных функций если это не предусмотрено в программе.

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

Виды памяти в микроконтроллерах PIC

Постоянное запоминающее устройство (Read Only Memory, ROM)

Постоянное запоминающее устройство (ПЗУ) – это место, в котором хранится наша программа. Оно определяет максимальный размер нашей программы, по этой причине его также называют памятью программ (program memory). Для записи ПЗУ доступно только во время программирования микроконтроллера PIC, во время выполнения программы оно представляет собой память, доступную только для чтения (read only memory).

Электрически стираемое программируемое постоянное запоминающее устройство (ЭСППЗУ, EEPROM)

ЭСППЗУ – это еще один вид памяти, который часто присутствует в современных микроконтроллерах. В этой памяти данные хранятся во время исполнения программы. Стереть эти данные можно только электрическим способом, что означает сохранность данных даже в то время, когда микроконтроллер будет выключен.

Флэш память (Flash Memory)

Флэш память представляет собой еще один вид программируемой памяти, доступной только для чтения (Programmable Read Only Memory, PROM), в которую мы можем записывать, считывать и стирать программу тысячу раз.

Порты ввода/вывода

В микроконтроллере PIC16F877A есть пять портов: Port A, Port B, Port C, Port D и Port E. Из этих пяти портов только Port A является 16-битным, а PORT E – 3-битным. Остальные 3 порта являются 8-битными.

Контакты данных портов могут использоваться для ввода и вывода данных, в зависимости от конфигурации регистра TRIS. Кроме функций ввода/вывода контакты портов могут выполнять специальные функции: формирование ШИМ сигнала, обработка прерываний, связь по интерфейсу SPI и др.

Шина

Термин «шина» означает совокупность проводов, которые соединяют входные и выходные устройства с центральным процессором и оперативной памятью. Шина данных используется для передачи или приема данных.

Адресная шина используется для передачи адреса памяти от периферийных устройств к центральному процессору. Контакты ввода/вывода (I/O pins) используются для подключения внешних периферийных устройств. Протоколы последовательной связи UART и USART используются для подключения таких устройств как модули GSM, GPS, Bluetooth, инфракрасной связи и др.

Различие в функциях адресной шины и шины данных

Выбор микроконтроллера PIC для наших проектов

Микроконтроллеры PIC от компании Microchip подразделяются на 4 больших семейства. Каждое семейство отличается своим набором компонентов и характеристик.

  1. Первое семейство, PIC10 (10FXXX) – называется Low End.
  2. Второе семейство, PIC12 (PIC12FXXX) – называется Mid-Range.
  3. Третье семейство – это PIC16 (16FXXX).
  4. Четвертое семейство – это PIC 17/18(18FXXX).

Поскольку в дальнейшем мы на нашем сайте будем рассматривать достаточно много проектов на основе микроконтроллеров PIC, то для этих проектов мы решили выбрать достаточно универсальный микроконтроллер, относящийся к семейству 16F – это микроконтроллер PIC16F877A. Он способен работать с такими популярными сейчас интерфейсами как SPI, I2C и UART.

После того как вы выбрали микроконтроллер, первым делом необходимо изучить даташит на него. Из данного даташита можно узнать что микроконтроллер PIC16F877A содержит 3 таймера, два из которых являются 8-битными, а третий – с 16-битным предделителем. Данные таймеры также могут использоваться в качестве счетчиков. Также из даташита можно узнать, что микроконтроллер поддерживает CCP опции (Capture Compare и PWM), которые позволяют ему формировать сигналы ШИМ (широтно-импульсной модуляции) и считывать частоту входных сигналов. Для связи с внешними устройствами он обладает интерфейсами SPI, I2C, PSP и USART.

Микроконтроллер PIC16F877A содержит 8-канальный 10-битный АЦП (аналого-цифровой преобразователь), который позволяет производить преобразование аналоговых значений в цифровые с разрешением 10 бит. Это преобразование можно осуществлять на 8 контактах микроконтроллера. Также в составе микроконтроллера есть два встроенных компаратора, которые позволяют непосредственным образом сравнивать значения поступающих напряжений, без считывания их программным способом.

Память программ микроконтроллера поддерживает до 100 тысяч циклов перезаписи, что позволяет его перепрограммировать 100 тысяч раз. Разъем ICSP™ (In-Circuit Serial Programming™) позволяет нам программировать микроконтроллер с помощью PICKIT3. Отладку работы программы можно производить через разъем ICD (In-Circuit Debug). Также в составе микроконтроллера есть и сторожевой таймер (Watchdog Timer, WDT), который позволяет, при необходимости, производить сброс работы программы.

На следующем рисунке представлена распиновка микроконтроллера PIC16F877A, на которой вы можете увидеть все специальные функции, которые могут выполнять определенные контакты микроконтроллера.

Распиновка микроконтроллера PIC16F877A

Выбор программного обеспечения для наших проектов

Микроконтроллеры PIC могут программироваться с помощью различного программного обеспечения, присутствующего сейчас на рынке. Некоторые энтузиасты до сих пор используют для их программирования язык ассемблера, но мы в нашей серии обучающих статей по микроконтроллерам PIC будем использовать инструменты, разработанные компанией Microchip.

Для программирования микроконтроллеров PIC нам понадобится интегрированная среда разработки (Integrated Development Environment, IDE), в которой мы непосредственно будем писать программы. Также нам будет необходим компилятор, который преобразовывать нашу программу в HEX файл – формат, который понимает наш микроконтроллер. И, наконец, нам понадобится интегрированная среда программирования (Integrated Programming Environment, IPE), которая будет записывать наш HEX файл в микроконтроллер. В качестве всех этих инструментов мы выберем следующие:

  • IDE: MPLABX v3.35;
  • IPE: MPLAB IPE v3.35;
  • Compiler: XC8.

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

Для моделирования работы схем мы будем использовать программное обеспечение PROTEUS 8 от компании Labcenter, которое можно скачать по следующей ссылке.

Подготовка аппаратного обеспечения

Для загрузки кода программы в микроконтроллер PIC мы будем использовать программатор PICkit 3, купить который на Aliexpress можно по следующей ссылке. Данный программатор прост в освоении, относительно дешево стоит и управляется с помощью программы MPLAB IDE (версии v8.20 или выше), установленный на компьютер с Windows. Кроме данного программатора нам также понадобится перфорированная или макетная плата, паяльная станция, непосредственно сам микроконтроллер, кварцевые генераторы, конденсаторы и т.д.

Внешний вид программатора PICkit 3

Видео

Загрузка…

1 977 просмотров

Понравилась статья? Поделить с друзьями:
  • Руководство департамента региональной безопасности нижегородской области
  • Зодак способ применения взрослым таблетки инструкция
  • Руководство по платежам
  • Пошаговая инструкция регистрация в плей маркете
  • Периндоприл инструкция по применению цена 2мг