В связи с нововведениями на сайте, решил наконец-то вылезти из подполья и написать что-нибудь полезное. Ну а поскольку я программирую разные микроконтроллеры (МК) и являюсь фанатом Eclipse, то решил про это и написать. Начну со своей истории знакомства с программированием PIC, а закончу советами тем, кто по долгу службы или в силу увлечения программирует на МК семейства PIC, хотя, впрочем, эти же советы сгодятся и для других архитектур МК.
В среду железячников я попал в 2006 году на 4-м курсе учёбы в университете, когда пошёл на производственную практику в научно-технический центр, где, собственно, и работаю по сей день. В то время в нашей компании мейнстримом было использование Keil uVision2 для МК на базе C51 и ARM. Однако мне подсовывали простые задачи под PIC, вроде контроля и управления одним сигналом (кнопка вкл-выкл), и моей первой средой разработки были блокноты — бумажный и компьютерный, плюс книжки бумажные по PIC. Выглядела моя среда разработки примерно так:
Для компиляции файлов мне выдали экзешник компилятора и bat-файл, который использовался мной совершенно бездумно — даже не знаю, что за компилятор там был. В общем, суровые были времена…
Ах, если бы мне кто-то тогда подсказал, что есть такое чудо, как notepad++!
Потом был MPASM, но он убогий и мне про него почти нечего вспоминать. По-моему, под него я также писал в блокноте программки.
MPLAB IDEПо мере совершенствования своих навыков я узнал, что вместо блокнота можно использовать наикрутейшую, как мне тогда казалось, MPLAB IDE:
В её состав входят:
Хотя, если присмотреться к этой среде разработки, её убогость и отсталость могут отпугнуть любого мало-мальски привыкшего к хорошим условиям программиста, но я тогда об этом не знал. Справку по встроенным библиотечным функциям надо открывать отдельно и искать, что, где и как называется. Для новичков — непосильная задача. Тем не менее, на тематических форумах люди до сих пор спрашивают, какой компилятор лучше использовать; кто-то так и продолжает использовать MPLAB IDE.
Задачи для PIC мне подкидывали всё реже и реже, начали набирать обороты разработки с МК серии C51, ARM7 (не путать с ARMv7!), Cortex-M. Но иногда ко мне снова обращались за помощью в написании программ под PIC, а я в силу любопытства пробовал новые средства разработки.
К тому времени уже давно и активно программировал в Keil uVision3 — возвращаться к допотопному MBLAB IDE совершенно не хотелось. Так я познакомился с MikroC, который поставляется вместе с программаторами PICKit:
Набор плюшек почти такой же как в MBLAB IDE, но всё же побогаче:
Честно, для маленьких простых проектов, которые и составляют основную нишу программ под PIC, этого вполне достаточно. Даже новички нормально разбираются с помощью справки и быстро делают рабочий код. Большинство наших разработчиков, имеющих дело с PIC, используют эту среду при разработке.
Так или иначе, сделав очередной проект в MikroC, я благополучно забыл про PIC’и и думал, что уже никогда к ним не вернусь.
Однако история любит повторяться!Через 3 года, в 2013 году, появилась задача разработать ПО по готовой КД, в которой был заложен PIC18F4680. Честно, я даже не знал, что среди PIC’ов бывают такие монстры, всегда имел дело только с мелочью!
Задачи были нетривиальные — реализация загрузчика для внутрисхемного обновления ПО, работа в режиме жёсткого реального времени, работа с АЦП, внешними ЦАП, линиями управления, несколькими таймерами-компараторами.
Кстати, немного отвлекаясь от темы: только на этом проекте я в полной мере понял, что такое банки памяти в PIC, как они работают и какие ограничения накладывают на разработку ПО. К примеру, все банки у МК по 256 байт. И хоть убейся, но для PIC нельзя создать структуру, превыщающую по объёму эти 256 байт — ограничение всплыло наружу при реализации протокола обмена, ну да ладно, проехали…
К этому времени Keil uVision3 мне уже изрядно поднадоел, поскольку сложность проектов росла и мне не хватало имевшегося в Keil функционала. Где-то с 2011 года я освоил Eclipse, GCC, синтаксис makefile — и все свои проекты начал вести с использованием этих инструментов. К тому же, у меня уже был опыт применения связки Eclipse + SDCC для реализации проекта под C51 МК. После появления Keil uVision4 я его установил, протестировал пол-часика и снёс, ибо по удобству программирования он всё равно сильно отстаёт от Eclipse.
Eclipse + SDCCВ настоящее время Eclipse де-факто является стандартом в области разработки ПО для встраиваемых систем. Вот список IDE, основанных на Eclipse, от популярных брендов:
Автоподстановка, всплывающие подсказки по автодополнению, макросы, затемнение неактивных участков кода, удобная навигация по коду и многое-многое другое, — я не буду всё перечислять, — многие разработчики встраиваемых систем совершенно не привыкли и не знают всех этих плюшек, значительно облегчающих жизнь:
Главной проблемой чистого Eclipse для разработки на C/C++ под МК является сложность вхождения в него железячных программистов, замена привычных инструментов, работающих после установки в 1-2 клика, на какие-то плагины, требующие настройки, или, что ещё хуже, на вручную написанные makefile — всё это требует значительных первоначальных усилий по чтению и изучению документации, поиску помощи и пособий для начинающих в интернете. Говорю как человек, имеющий опыт по переводу команды программистов-железячников на Eclipse.
Только для моей команды разработчиков
Коли прочитали эту статью — дайте знать, я хоть узнаю, как у нас читают профильные хабы на Хабрахабре
Однако, за месяц полностью освоив синтаксис и один раз написав качественный makefile, все остальные проекты создаются по накатанному шаблону и требуют лишь минимальной индивидуальной настройки.
Также пришлось сделать ряд дополнительных телодвижений по настройке проектов под PIC — по умолчанию Eclipse понимает синтаксис GCC. Различные макросы и директивы, встроенные в другие компиляторы (будь то СС18 или SDCC), приходится разделять на этапе компиляции и на этапе индексации проекта. Чтобы при навигации в коде редактор не выдавал ложных ошибок на неизвестные директивы, к исходникам проекта подключается файл eclipse-syntax.h:
eclipse-syntax. h
#ifndef ECLIPSE_SYNTAX_H_ #define ECLIPSE_SYNTAX_H_ // keyword SDCC defined when compiling with SDCC compiler #ifndef SDCC #ifdef __SDCC_PIC18F4680 #error "SDCC not found, project compile will be with errors!" #endif // file not parsed through makefile - just for proper eclipse syntax #ifndef __CC18__ #error "__CC18__ not found, use `-D__CC18__` in makefile for proper CC18 compilation!" #define near #define far #define rom #define ram #define _asm #define _endasm #define Nop() #define ClrWdt() #define Sleep() #define Reset() #define clrwdt #define nop #define __code #define __data #define __xdata #define __sfr #define __sbit #define __naked #define __wparam #define __bit char #define __at(num) #else // __CC18__ defined - compile stage! #endif // __CC18__ #define __inline #define __asm #define __endasm #define __interrupt(x) #define INTERRUPT(x) #define USING(x) #define CRITICAL #define CRITICAL_START #define CRITICAL_END #define _REENTRANT #else // if SDCC defined #define INTERRUPT(x) __shadowregs __interrupt (x) //#define USING(x) __using (x) #define USING(x) #define CRITICAL __critical #define CRITICAL_START __critical { #define CRITICAL_END } #endif // SDCC defined #endif /* ECLIPSE_SYNTAX_H_ */
Кроме того, в SDCC у меня не получилось слинковать большой проект в готовый бинарник — потребовалось также настроить GPUtils, в состав которого входят gpasm, gpdasm, gplink и скрипты . lkr карт памяти МК PIC. Правда, из-за одного найденного мной бага в SDCC на этапе отладки кода я в итоге вернулся на CC18 компилятор и линковщик. Тем не менее, SDCC и GPUtils были полностью настроены — для страждущих привожу часть makefile, касающуюся опций запускаемых компиляторов и линковщиков CC18, SDCC, GPUtils:
Кусочки makefile
########################################################### # project-specific compile options ########################################################### # Project definitions CHIP = 18F4680 DEFINES := -DPIC$(CHIP) #DEFINES += -D__SDCC_PIC$(CHIP) # use SDCC compiler DEFINES += -D__CC18__ # use MPLAB CC18 compiler #DEFINES += -DOPTIMIZE_BITFIELD_POINTER_GET # SDCC memory optimize for bitfield structures ########################################################### # common part for all sdcc-based projects ########################################################### SDCC_BASE = c:/DevTools/SDCC CC = "$(SDCC_BASE)/bin/sdcc. exe" LD = "$(SDCC_BASE)/bin/sdcc.exe" ELF2HEX = "$(SDCC_BASE)/bin/packihx.exe" HEX2BIN = "$(SDCC_BASE)/bin/makebin.exe" ########################################################### # common part for all MPLAB MCC18-based projects ########################################################### MPLAB_BASE = c:/DevTools/CC18 CC_MPLAB = "$(MPLAB_BASE)/bin/mcc18.exe" AS_MPLAB = $(MPLAB_BASE)/mpasm/mpasmwin.exe LD_MPLAB = $(MPLAB_BASE)/bin/mplink.exe ########################################################### # GPUtils used with SDCC for linking project ########################################################### GPUTILS_BASE = c:/DevTools/GNUPICutils GPASM = "$(GPUTILS_BASE)/bin/gpasm.exe" GPDASM = "$(GPUTILS_BASE)/bin/gpdasm.exe" GPLINK = "$(GPUTILS_BASE)/bin/gplink.exe" ########################################################### # C preprocessor flags for MPLAB MCC18 compiler ########################################################### #optimization parameters (default = full optimization) OPT_ENABLE_ALL := -O+ # Enable all optimizations (default) OPT_DEBUG :=-Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa- OPT :=$(OPT_ENABLE_ALL) #OPT :=$(OPT_DEBUG) CFLAGS_MPLAB := -p $(CHIP) CFLAGS_MPLAB += -I $(MPLAB_INC_DIR) CFLAGS_MPLAB += -nw=2066 # suppress Warning [2066] type qualifier mismatch in assignment CFLAGS_MPLAB += -ml # Large memory model CFLAGS_MPLAB += -ls # large stack (can span multiple banks) #CFLAGS_MPLAB += -scs # Enable default static locals #CFLAGS_MPLAB += -sco # Enable default overlay locals (statically allocate activation records).Ignored if set --extended CFLAGS_MPLAB += --extended # generate extended mode code COMPILE_MPLAB_STRING=$(CC_MPLAB) $(CFLAGS_MPLAB) $< -fo=$@ $(DEFINES) $(OPT) AFLAGS_MPLAB := /y AFLAGS_MPLAB += /rDEC # set default radix HEX/DEC/OCT AFLAGS_MPLAB += /l- # disable listing file #AFLAGS_MPLAB += /l$(OBJDIR_MPLAB) # enable listing file AFLAGS_MPLAB += /o # specify path for object files #AFLAGS_MPLAB += /o$(OBJDIR_MPLAB) # specify path for object files #AFLAGS_MPLAB += /q # enable quiet mode AFLAGS_MPLAB += /d__LARGE__ # define symbol AFLAGS_MPLAB += /p$(CHIP) # set processor type #ASSEMBLE_MPLAB_STRING=$(AS_MPLAB) $(AFLAGS_MPLAB) %< # used linker script LDFLAGS_MPLAB := $(CHIP)_g.lkr # objects to compile LDFLAGS_MPLAB += $(OBJS_MPLAB) LDFLAGS_MPLAB += $(MPLAB_LIBS) # specify chip for proper linking LDFLAGS_MPLAB += /p$(CHIP) # verbose mode operation #LDFLAGS_MPLAB += /v # generate report file for stack analysis LDFLAGS_MPLAB += /g # generate .LST file and no .COD file LDFLAGS_MPLAB += /i # do not invoke MP2COD (no . COD or .LST file) LDFLAGS_MPLAB += /w # link MPLAB libs LDFLAGS_MPLAB += /l $(MPLAB_LIB_DIR) # generate MAP file LDFLAGS_MPLAB += /m $(EXEDIR)/$(PROJECT_NAME)_mplab.map # set output file LDFLAGS_MPLAB += /o $(EXEDIR)/$(PROJECT_NAME)_mplab.hex ########################################################### # C preprocessor flags for SDCC v.3.3.0 compiler ########################################################### # ----- processor selection ----- CFLAGS := -m$(ARCH) CFLAGS += -p$(CHIP) # ----- preprocessor options ----- CFLAGS += $(INCS) CFLAGS += $(DEFINES) # ----- verbose & dependancy generate ----- # CFLAGS += -M # generate dependencies # CFLAGS += -E # # CFLAGS += -C # dont discard comments CFLAGS += -c # dont link file (i.e. have multiple source files) CFLAGS += $(DEBUG) # ----- common settings ----- #CFLAGS += --nostdinc # This will prevent the compiler from passing on the # default include path to the preprocessor. #CFLAGS += --nostdlib # This will prevent the compiler from passing on the # default library path to the linker. #CFLAGS += --less-pedantic # Disable some of the more pedantic warnings. CFLAGS += --stack-auto # All functions in the source file will be compiled as reentrant. # It automatically implies --int-long-reent and --float-reent. CFLAGS += --int-long-reent # Integer (16 bit) and long (32 bit) libraries have been compiled as reentrant. CFLAGS += --float-reent # Floating point library is compiled as reentrant. #CFLAGS += --no-peep #CFLAGS += --funsigned-char # The default signedness for every type will be unsigned. #CFLAGS += --cyclomatic # This option will cause the compiler to generate an information # message for each function in the source file. The message contains # the number of edges and nodes the compiler detected in the # control flow graph of the function, and most importantly # the cyclomatic complexity. # ----- optimization options ----- #CFLAGS += --nogcse # Will not do global subexpression elimination, this option may be used # when the compiler creates undesirably large stack/data spaces to store # compiler temporaries. #CFLAGS += --noinvariant # Will not do loop invariant optimizations. #CFLAGS += --noinduction # Will not do loop induction optimizations. #CFLAGS += --nojtbound # Will not generate boundary condition check when switch statements # are implemented using jumptables. #CFLAGS += --noloopreverse # Will not do loop reversal optimization. #CFLAGS += --nolabelopt # Will not optimize labels (makes the dumpfiles more readable). CFLAGS += --nooverlay # The compiler will not overlay parameters and local variables of any function. CFLAGS += --peep-asm # Pass the inline assembler code through the peep hole optimizer. #CFLAGS += --opt-code-speed # Optimize for code speed rather than size #CFLAGS += --opt-code-size # Optimize for code size rather than speed CFLAGS += --fomit-frame-pointer # Frame pointer will be omitted when the function uses # no local variables. CFLAGS += --use-non-free # Search / include non-free licensed libraries and header files # ----- special options for pic16 port of SDCC ----- CFLAGS += --pstack-model=large # use stack model 'small' (default) or 'large' # don't use extended instruction set - SDCCman, $4. 6.20.1 Known Bugs #CFLAGS += -y --extended # enable Extended Instruction Set/Literal Offset Addressing mode #CFLAGS += --pno-banksel # do not generate BANKSEL assembler directives CFLAGS += --obanksel=2 # set banksel optimization level (default=0 no) CFLAGS += --denable-peeps # explicit enable of peepholes CFLAGS += --no-optimize-goto # do NOT use (conditional) BRA instead of GOTO CFLAGS += --optimize-cmp # try to optimize some compares CFLAGS += --optimize-df # thoroughly analyze data flow (memory and time intensive!) #CFLAGS += --preplace-udata-with=udata_shr # Place udata variables at another section: udata_acs, udata_ovr, udata_shr #CFLAGS += --ivt-loc= # Set address of interrupt vector table. #CFLAGS += --nodefaultlibs # do not link default libraries when linking #CFLAGS += --use-crt= # use <crt-o> run-time initialization module #CFLAGS += --no-crt # do not link any default run-time initialization module #CFLAGS += --mplab-comp # enable compatibility mode for MPLAB utilities (MPASM/MPLINK) #CFLAGS += --asm= # Use alternative assembler #CFLAGS += --link= # Use alternative linker CFLAGS += --debug-xtra # show more debug info in assembly output CFLAGS += --debug-ralloc # dump register allocator debug file *. d CFLAGS += --pcode-verbose # dump pcode related info CFLAGS += --calltree # dump call tree in .calltree file #CFLAGS += --gstack # trace stack pointer push/pop to overflow ########################################################### # linker flags ########################################################### #gputils (GNU PIC Utils) used to link objects and libs. GPLINK_FLAGS = -c -m -w -r -I $(LIBDIR) -s $(GPUTILS_BASE)/lkr/$(CHIP)_g.lkr #SDCC linker not used #LDFLAGS := -m$(ARCH) #LDFLAGS += $(DEBUG) #LDFLAGS += --profile #LDFLAGS += --code-size $(FLASH_SIZE) # Code Segment size #LDFLAGS += --code-loc $(FLASH_LOC) # The start location of the code location, default value is 0 #LDFLAGS += --iram-size $(IRAM_SIZE) # Internal Ram size #LDFLAGS += --xram-loc $(XRAM_LOC) # The start location of the external ram, default value is 0 #LDFLAGS += --xram-size $(XRAM_SIZE) # External Ram size #LDFLAGS += --stack-loc $(STACK_LOC) # By default the stack is placed after the data segment. # Using this option the stack can be placed anywhere in the # internal memory space of the 8051. ############################################################################## # MPLAB CC18 compiler - linker $(HEX_MPLAB): $(OBJS_MPLAB) Makefile @echo "--- CC18 Linking objects to $(HEX_MPLAB) ..." @$(LD_MPLAB) $(LDFLAGS_MPLAB) ############################################################################## # SDCC compiler - linker $(HEX): $(OBJS) Makefile @echo "--- SDCC Linking objects to $(HEX) ..." $(GPLINK) $(GPLINK_FLAGS) -o $(HEX) $(OBJS) $(LIBS) $(GPDASM) -p$(CHIP) $(HEX) > $(DASM)
Как видно, в итоге я пришёл к использованию связки Eclipse с внешними компиляторами. Изучение опций компиляции — дело нужное и не столь сложное, чтобы просто так от него отказываться — любой программист сможет их изучить и применить при необходимости. Думаю, в итоге у меня получилась идеальная связка, доступная на сегодняшний день для создания проектов под PIC.
Собирая воедино все средства разработки, вот список компиляторов, которыми я пользуюсь в связке с Eclipse и получаю от этого истинное удовольствие при программировании:
Очевидно, при необходимости список может легко дополняться.
Надеюсь, прочитав мою историю, кто-то решится наконец для себя сойти со старых IDE и освоить новые.
Дерзайте!
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
Семейство Р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 — бесплатная интегрированная среда разработки ПО для микроконтроллеров 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 мигает желтый светодиод.
В системе моделирования динамических систем 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
На сайте имеются 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)\Microchip\MPLAB IDE\Tools\MATLAB\',path)
Компиляторы 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)\Microchip\MPLAB IDE\Tools\MATLAB\:
>> path('c:\Program Files (x86)\Microchip\MPLAB IDE\Tools\MATLAB\',path)
Примечание: Использование команды >>path без аргументов приводит к отображению списка путей переменной path в окне команд (Command Window). Удалить путь из переменной path можно командой rmpath, например:
>>rmpath(' c:\Program Files\Microchip\MPLAB IDE\Tools\MATLAB\')
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.
Узнать какие программаторы записывают бинарный код в конкретный микроконтроллер можно в разделе меню → 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.