Осваиваем простейший микроконтроллер PIC. Часть 1 / Habr
Выбор микроконтроллера обычно осуществляется под необходимые задачи. Для изучения хорошо подойдет популярный МК с минимальным набором периферии: PIC16F628A.Первым делом необходимо скачать документацию по выбранному микроконтроллеру. Достаточно зайти на сайт производителя и скачать Datasheet.
На первых страницах перечислены основные характеристики МК (русское описание).
Основные моменты, которые нам понадобятся:
- микроконтроллер содержит внутренний генератор на 4 MHz, так же можно подключить внешний кварц частотой до 20 MHz
- 16 ног микроконтроллера можно использовать как цифровые входы\выходы
- есть 2 аналоговых компаратора
- 3 таймера
- CCP модуль
- USART модуль
- 128 байт энергонезависимой памяти EEPROM
Схема расположения выводов:
Vdd — питание.
Vss — земля.
Это минимум, необходимый для работы МК.
Остаются доступными 16 ног МК. Не сложно посчитать, что использование каждой ноги каким-либо модулем уменьшает максимальное число используемых цифровых портов.
Компилятор
Как я уже писал в предыдущих статьях, самым простым и легким я посчитал компилятор JAL с IDE JALEdit.
Качаем JALPack, устанавливаем.
В этом паке содержаться все необходимые библиотеки, а так же примеры их использования.
Запускаем JALEdit. Открываем пример програмы для нашего микроконтроллера: 16f628a_blink.jal, дабы не портить исходник, сразу сохраняем ее в новый файл, к примеру, 16f628a_test.jal.
Весь код можно разделить на 4 блока:
- выбор МК и его конфигурация
include 16f628a -- подключение библиотеки нашего МК
--
-- This program assumes a 20 MHz resonator or crystal
-- is connected to pins OSC1 and OSC2.
pragma target clock 20_000_000 -- oscillator frequency
-- configuration memory settings (fuses)
pragma target OSC HS -- HS crystal or resonator
pragma target WDT disabled -- no watchdog
pragma target LVP disabled -- no Low Voltage Programming
pragma target MCLR external -- reset externally
-- - объявление переменных, процедур, функций
alias led is pin_A0
pin_A0_direction = output - выполнение настроек и расчетов до основного цикла
enable_digital_io() -- переключение всех входов\выходов на цифровой режим
- бесконечный цикл основных действий МК
forever loop
led = on
_usec_delay(250000)
led = off
_usec_delay(250000)
end loop
Нажав F9 (или соответсвующую кнопку) программа скомпилируется в готовую прошивку, при этом будет видно сколько ресурсов МК будет задействовано:
Code :58/2048 Data:4/208 Hardware Stack: 0/8 Software Stack :80
Если прочитать комментарии, то станет ясно, что данная программа рассчитана на использование внешнего кварца 20MHz.
Так как у нас его пока нет, разберемся с конфигурацией и перепишем программу на использование внутреннего генератора.
Конфигурация
В разных микрокотнролерах существуют различные наборы конфигурационных битов. Узнать о назначении каждого бита можно в даташите (стр. 97).
В подключенной библиотеке каждому биту и каждому его значению присвоена читабельная переменная, остается только выбрать необходимые нам параметры.
-- Symbolic Fuse definitions
-- -------------------------
--
-- addr 0x2007
--
pragma fuse_def OSC 0x13 { -- oscillator
RC_CLKOUT = 0x13 -- rc: clkout on ra6/osc2/clkout, rc on ra7/osc1/clkin
RC_NOCLKOUT = 0x12 -- rc: i/o on ra6/osc2/clkout, rc on ra7/osc1/clkin
INTOSC_CLKOUT = 0x11 -- intosc: clkout on ra6/osc2/clkout, i/o on ra7/osc1/clkin
INTOSC_NOCLKOUT = 0x10 -- intosc: i/o on ra6/osc2/clkout, i/o on ra7/osc1/clkin
EC_NOCLKOUT = 0x3 -- ec
HS = 0x2 -- hs
XT = 0x1 -- xt
LP = 0x0 -- lp
}
pragma fuse_def WDT 0x4 { -- watchdog timer
ENABLED = 0x4 -- on
DISABLED = 0x0 -- off
}
pragma fuse_def PWRTE 0x8 { -- power up timer
DISABLED = 0x8 -- disabled
ENABLED = 0x0 -- enabled
}
pragma fuse_def MCLR 0x20 { -- master clear enable
EXTERNAL = 0x20 -- enabled
INTERNAL = 0x0 -- disabled
}
pragma fuse_def BROWNOUT 0x40 { -- brown out detect
ENABLED = 0x40 -- enabled
DISABLED = 0x0 -- disabled
}
pragma fuse_def LVP 0x80 { -- low voltage program
ENABLED = 0x80 -- enabled
DISABLED = 0x0 -- disabled
}
pragma fuse_def CPD 0x100 { -- data ee read protect
DISABLED = 0x100 -- disabled
ENABLED = 0x0 -- enabled
}
pragma fuse_def CP 0x2000 { -- code protect
DISABLED = 0x2000 -- off
ENABLED = 0x0 -- on
}
- OSC — конфигурация источника тактирования
может принимать 8 различных значений, 4 из которых нам могут понадобиться- INTOSC_NOCLKOUT — внутренний генератор (4M Hz)
- HS — внешний высокочастотный кварц (8-20 MHz)
- XT = внешний кварц (200 kHz — 4 MHz)
- LP — внешний низкочастотный кварц (до 200 kHz)
- WDT — сторожевой таймер.
Основная работа этого таймера в том, что бы перезагрузить микроконтроллер когда он дотикает до конца.
Что бы перезагрузки не происходило, его нужно своевременно обнулять.
Таким образом при сбое счетчик таймера перестанет обнуляться, что приведет к сбросу МК. Иногда бывает удобно, но в данный момент нам это не потребуется. - PWRTE — очередной таймер.
При активации он будет сбрасывать МК до тех пор, пока питание не поднимется до нужного уровня. - BROWNOUT — сброс МК при падении питания ниже нормы.
- MCLR — активация возможности внешнего сброса МК.
При включении функции МК будет в постоянном резете до тех пор, пока на ноге MCLR (pin 4) не будет положительного напряжения.
Для сброса МК достаточно установить кнопку, замыкающую pin 4 на землю. - LVP — активация возможности программирования при низком напряжении.
При активации один цифровой вход переключится в режим LVP (pin 10). Если подать 5В на эту ногу, то МК перейдет в режим программирования. Для нормальной работы МК требуется держать на этой ноге 0В (подсоединить к земле).
Мы будем использовать программатор, использующий повышенное напряжение, потому LVP активировать не требуется. - CPD — защита EEPROM от считывания программатором.
- CP — защита FLASH (прошивки) от считывания программатором.
Изменим конфигурацию под себя:
pragma target clock 4_000_000 -- указываем рабочую частоту, необходимо для некоторых функций расчета времени
-- конфигурация микроконтроллера
pragma target OSC INTOSC_NOCLKOUT -- используем внутренний генератор
pragma target WDT disabled -- сторожевой таймер отключен
pragma target PWRTE disabled -- таймер питания отключен
pragma target MCLR external -- внешний сброс активен
pragma target BROWNOUT disabled -- сбос при падении питания отключен
pragma target LVP disabled -- программирование низким напряжением отключено
pragma target CPD disabled -- защита EEPROM отключена
pragma target CP disabled -- защита кода отключена
Моргаем светодиодом по нажатию кнопки
Модифицируем программу так, что бы светодиод моргал только тогда, когда зажата кнопка.
Решив данную задачу мы научимся работать с цифровыми портами как в режиме входа, так и в режиме выхода.
Цифровой выход
Выберем еще неиспользуемую ногу МК. Возьмем, к примеру, RB5(pin 11). Данная нога не имеет дополнительных функций, потому она нам более нигде не понадобится.
В режиме цифрового выхода МК может притягивать к ноге либо питание, либо землю.
Подключать нагрузку можно как к плюсу, так и к минусу. Разница будет лишь в том, когда и в какую сторону потечет ток.
В первом случае ток потечет от МК при установке единицы, а во втором — к МК при установке нуля.
Дабы светодиод зажигался от логической единицы, остановимся на первом варианте.
Для ограничения тока через ногу (максимально допустимо 25 мА на цифровой вход или 200 мА на все порты) установлен токоограничительный резистор. По простейшей формуле высчитываем минимальное значение в 125 Ом. Но так как предел нам не нужен, возьмем резистор в 500 Ом (а точнее ближайший подходящий).
Для подключения более мощной нагрузки можно использовать транзисторы в различных вариантах.
Цифровой вход
Возьмем вторую неиспользуемую нигде ногу — RB4 (pin 10, указанная в распиновке функция PGM отностися к LVP, который мы отключили).
В режиме цифрового входа микроконтроллер может считывать два состояния: наличие или отсутствие напряжения. Значит нам необходимо подключить кнопку так, что бы в одном состоянии на ногу шел плюс, а во втором состоянии — к ноге подключалась земля.
В данном варианте резистор используется в качестве подтяжки (Pull-up). Обычно для подтяжки применяют резистор номиналом 10 кОм.
Впрочем, подтягивающий резистор не всегда необходим. Все ноги PORTB (RB0-RB7) имеют внутреннюю подтяжку, подключаемую программно. Но использование внешней подтяжки куда надежнее.
Можно подключать не только кнопку, главное помнить о ограничении тока через МК.
Кнопка сброса
Пока не забыли, что мы активировали внешний сброс, добавим аналогичную кнопку на ногу MCLR (pin 4).
После нажатия такой кнопки МК начнет выполнение программы с нуля.
Прошивка
Присваиваем нашему светодиоду и кнопке переменные:
enable_digital_io() -- переключение всех входов\выходов на цифровой режим
--
alias led is pin_B5 -- светодиод подключен к RB5
pin_B5_direction = output -- настраиваем RB5 как цифровой выход
--
alias button is pin_B4 -- кнопка подключена к RB4
pin_B4_direction = input -- настраиваем RB4 как вход
led = off -- выключаем светодиод
Теперь присваивая переменной led значения 1 или 0 (on или off, true или false, другие алиасы..) мы будем подтягивать к нужной ноге МК или плюс, или минус, тем самым зажигая и гася светодиод, а при чтении переменной button мы будем получать 1 если кнопка не нажата и 0 если кнопка нажата.
Теперь напишем необходимые нам действия в бесконечном цикле (эти действия будут выполняться постоянно. При отсутствии бесконечного цикла МК зависнет):
forever loop
led = off -- выключаем светодиод
_usec_delay(500000) -- ждем 0,5 сек
if Button == 0 then -- если кнопка нажата, выполняем действия
led = on -- зажигаем светодиод
_usec_delay(500000) -- ждем 0,5 сек
end if
end loop
Задержка считается просто:
частота генератора у нас 4MHz. Рабочая частота в 4 раза меньше: 1 MHz. Или 1 такт = 1 мкс. 500.000 мкс = 0,5 с.
Компилируем прошивку:
Errors :0 Warnings :0
Code :60/2048 Data:4/208 Hardware Stack: 0/8 Software Stack :80
Теперь нам необходимо записать эту прошивку в МК, собрать устройство согласно схеме и проверить, что у нас все получилось как надо.
Программатор
Все таже схема:
Смотрим на распиновку:
- PGD — pin 13
- PGC — pin 12
- MCLR(Vpp) — pin 4
- Vdd — pin 14
- Vss — pin 5
Паяем…
Некачественная пайка — одна из основных проблем неработоспособности устройства.
Не повторяйте мои плохие привычки: не используйте навесной монтаж.
В качестве питания 5В в данном случае использовался хвост от старой PS/2 мыши, вставленный в разъем для мыши.
Подключаем к компьютеру.
Качаем и запускаем WinPic800.
Идем в Settings->Hardware, выбираем JDM и номер порта, на котором висит программатор
Нажимаем Hardware Test, затем Detect Device
Открываем нашу прошивку pic628a_test.hex
На вкладке Setting можно проверить, что конфигурационные биты выставлены верно, при желании тут же их можно изменить
Program All, затем Verify All
Если ошибок не возникло, продолжаем паять.
Результат
Финальная схема:
От программатора нам мешает только высокое напряжение (12в) на MCLR. Дабы не отпаивать весь программатор, можно отпаять только один провод… Или просто не подключать программатор к COM порту. Остальные провода нам мешать не будут (а подключенные питание и земля только упростят пайку).
Кнопку на MCLR паять можно по желанию, но подтяжка обязательна.
При повторном подключении программатора резистор необходимо будет убрать, иначе он подтянет 12в к питанию.
Результат работы можно увидеть на видео.
Итак, у нас получилось самое простое устройство на микроконтроллере: мигалка светодиодом.
Теперь нам необходимо научиться пользоваться всей оставшейся периферией, но об этом в следущей статье.
habr.com
Средства программирования PIC-контроллеров / Habr
Введение
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)\Microchip\MPLAB IDE\Tools\MATLAB\',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)\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.
Подключение программатора 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 контроллеров с достаточными ресурсами.
habr.com
Осваиваем простейший микроконтроллер PIC. Часть 2 / Habr
В первой части мы разобрали как можно прошить выбранный МК, как его правильно сконфигурировать, а так же научились работать с цифровыми портами.Теперь пришло время рассмотреть остальную периферию микроконтроллера.
Все параметры работы МК задаются через установку определенных значений в регистрах специального назначения (SFR).
Как и конфигурационные биты, все существующие в выбранном МК регистры доступны нам в виде переменных благодаря подключенной библиотеке.
Что бы узнать, какие биты в каких регистрах нам потребуются для конкретного модуля — придется снова заглянуть в документацию.
Для примера, взглянем на таблицу регистров, имеющих отношение к цифровым входам\выходам порта B:
Считав значения регистра PORTB мы получим текущий логический уровень на каждой ножке порта.
Запись в регистр устанавливает указанный уровень на соответсующих ножках порта.
Каждый бит регистра нам доступен в виде отдельной переменной, именно через них мы управляли светодиодом и считывали состояние кнопки.
Регистр TRISB отвечает за направление данных через порт. Каждый из 8 битов регистра привязан к соответсвующей ножке МК.
Присвоив нужному биту единицу — мы сделаем из него вход, а присвоив ноль — выход.
Именно в этом регистре мы меняли биты через переменные pin_Bx_direction.
В регистре OPTION_REG к порту относится только старший бит:
RBPU: PORTB Pull-up Enable bit
1 = PORTB pull-ups are disabled
0 = PORTB pull-ups are enabled by individual port latch values
Этот бит отвечает за подключение внутренней подтяжки, о которой было упоминание в первой части.
По таблице видно, что изначально подтяжка выключена, а значит при отсутствии внешней подтяжки необходимо включить внутреннюю самостоятельно:
OPTION_REG_NRBPU = 0
При желании узнать принцип работы конкретного модуля поближе всегда можно найти в документации принципиальную схему.
Прерывания
Так как микроконтроллеры не поддерживают многозадачность, возникает ряд проблем по совмещению нескольких процессов.
Допустим, нужно нам мигать одним светодиодом постоянно с большим периодом, а второй переключать по нажатию кнопки.
Какой бы порядок действий мы не выбрали, как надо у нас ничего не заработает: ведь пока микроконтролер отсчитывает время до переключения первого светодиода он может пропустить факт нажатия кнопки.
Тут нам и придут на помощь прерывания.
При определенных условиях микроконтроллер может прервать выполнение бесконечного цикла и выполнить небольшую подпрограмму, после чего вернуться к выполнению основной задачи.
В выбранном нами МК 16f628a имеется 10 возможных источников прерываний:
- внешний источник прерываний INT
- изменение уровня сигнала на цифровых входах RB4:7
- переполнение таймера TMR0
- переполнение таймера TMR1
- совпадение TMR2 и PR2
- завершение записи в EEPROM
- изменение выходного уровня компаратора
- получение\завершение отправки данных через USART
- прерывания от модуля CCP
Прерывание по каждому источнику можно как разрешить, так и запретить индивидуально изменяя соответствуюющие биты в регистрах INTCON и PIE1.
Для разрешения прерываний, управляемых регистром PIE1 необоходимо разрешить прерывания от перифирии битом PEIE в регистре INTCON.
После выбора необходимых источников прерываний необходимо глобально разрешить прерывания битом GIE в регистре INTCON.
Для каждого прерывания имеется еще один бит в регистре INTCON или PIR1 — флаг прерывания.
При срабатывании прерывания соответсвующему флагу присваивается значение 1, по которому можно легко определить какое из прерываний сработало.
Сбрасывать флаги прерываний необходимо вручную после входа в обработчик прерываний, иначе при нескольких источниках разобрать кто конкретно его вызвал будет невозможно.
В качестве примера использования прерываний перепишем нашу программу по миганию светодиодом.
Воспользуемся источником прерываний INT. В зависимости от состояния бита INTEDG в регистре OPTION прерывание будет генерироваться либо по переднему фронту сигнала (переход с низкого уровня к высокому), либо по заднему.
Для изменения уровня сигнала на INT неободимо перенести кнопку на соответсвующую ногу (pin 6).
include 16f628a -- target PICmicro
--
pragma target clock 4_000_000 -- указываем рабочую частоту, необходимо для некоторых функций расчета времени
-- конфигурация микроконтролера
pragma target OSC INTOSC_NOCLKOUT -- используем внутренний кварц
pragma target WDT disabled -- сторожевой таймер отключен
pragma target PWRTE disabled -- таймер питания отключен
pragma target MCLR external -- внешний сброс активен
pragma target BROWNOUT disabled -- сбос при падении питания отключен
pragma target LVP disabled -- программирование низким напряжением отключено
pragma target CPD disabled -- защита EEPROM отключена
pragma target CP disabled -- защита кода отключена
--
enable_digital_io() -- переключение всех входов\выходов на цифровой режим
--
alias led is pin_B5 -- светодиод подключен к RB5
pin_B5_direction = output -- настраиваем RB5 как цифровой выход
--
alias button is pin_B0 -- кнопка подключена к RB0
pin_B0_direction = input -- настраиваем RB0 как вход
var volatile bit led_blink = false -- объявляем переменную
-- настраиваем прерывание
INTCON_INTE = on -- разрешаем прерывание по изменению сигнала на INT
INTCON_INTF = off -- сбрасываем флаг прерывания по INT
OPTION_REG_INTEDG = 0 -- генерировать прерывания при переходе 1->0
INTCON_GIE = on -- включаем обработку прерываний
-- обработчик прерывания INT
procedure INT_ISR is
pragma interrupt
if INTCON_INTF then -- проверяем флаг нужного нам прерывания
INTCON_INTF = off -- сбрасываем флаг прерывания
led_blink = !led_blink -- перключаем флаг светодиода
end if
end procedure
led = off -- выключаем светодиод
forever loop
led = off -- выключаем светодиод
_usec_delay(100000) -- ждем 0,1 сек
if led_blink then -- моргаем только при активном флаге
led = on -- ждем 0,1 сек
_usec_delay(100000) -- ждем 0,1 сек
end if
end loop
Увы, это не самый оптимальный вариант по двум причинам:
- из-за дребезга контактов кнопки прерывание может сработать несколько раз подряд, дребезг желательно подавлять программно
- в основном цикле программы у нас остались паузы, во время которых микроконтролер ничего не делает, кроме как ждет.
Таймеры
Основная работа таймеров — считать. По завершению счета они могут генерировать прерывание. А так как счет идет аппаратно, не забивая процессорное время ожиданием, таймеры удачно подходят на замену нашим паузам.
Каждый из трех таймеров имеет свои особенности, потому для выполнение определенных задач нужно уметь выбрать более подходящий.
TMR0
- 8-битный таймер (считает от 0 до 255)
- тактируется либо от системной частоты, либо от внешнего источника
- может считать как передние, так и задние фронты тактируемого сигнала
- 8-битный предделитель (может считать каждый второй, каждый 4… каждый 256 сигнал)
- прерывание генирируется при переполнении (при переходе от 255 к 0)
- таймер работает постоянно
Что нам это дает?
При тактировании от системной частоты (в нашем случае — 4 MHz/4 = 1 Mhz) таймер будет генерировать прерывания с постоянной частотой.
Не сложно посчитать, что без предделителя прерывания будут иметь частоту 3906,25 Гц. Для светодиода — многовато.
Предделитель может на порядок (двойчный, т.е. в 2 раза) уменьшить частоту восемь раз.
При предделителе 1:256 мы получим частоту в 15.3 Гц. Мигание светодиодом с такой частотой вполне различимо человеческим глазом.
При тактировании МК от внешнего кварца можно добиться другого диапазона частот.
При тактировании таймера от внешнего источника таймер превращается в счетчик внешних импульсов. В принципе счета ничего не меняется, просто в зависимости от источника может не получиться постоянная частота прерываний. Счетчиком можно считать количество нажатий кнопки, оборотов колеса и пр. При этом никто не обязывает считать от нуля до прерывания: текущее значение счетчика всегда доступно как для чтения, так и для записи.
При желании в режиме таймера можно увеличить частоту прерываний изменяя стартовое значение счетчика при каждом прерывании, но так как за время перехода на процедуру обработки уйдет неизвестное время, точно расчитать частоту не удастся.
TMR1
Основные отличия таймера от TMR0:
- данный таймер 16-битный
- таймер может тактироваться не только от внешнего источника, но и от дополнительного часового кварца
- максимально доступный предделитель — 1:8
- таймер может считать только передние фронты сигнала
- таймер может использоваться модулем CCP
- таймер можно отключать
Использовать TMR1 можно так же, как и TMR0: или для генерирования определенной частоты, или для подсчета импульсов.
TMR2
Данный 8-битный таймер имеет несколько иной принцип работы.
Тактироваться он может только от системной частоты. Предделитель может быть выставлен только на значения 1:1, 1:4 или 1:16.
Полученные импульсы таймер считает от нуля и до предварительно заданного значения PR2.
После совпадения TMR2 и PR2 подается сигнал на 4-битный постделитель, и только после переполнения постделителя генерируется прерывание.
Благодаря такой схеме можно корректировать конечную частоту прерываний с минимальным шагом.
Помимо постделителя, сигнал при совпадении PR2 может идти на модуль CCP в качестве базы тайминга ШИМ.
Как и TMR1, данный таймер можно отключить.
Пример использования
В качестве примера зададим частоту мигания светодиода таймером TMR1.
Список всех необходимых переменных можно узнать из таблицы:
Описание каждого бита можно найти в документации на микроконтроллер.
include 16f628a -- target PICmicro
--
pragma target clock 4_000_000 -- указываем рабочую частоту, необходимо для некоторых функций расчета времени
-- конфигурация микроконтролера
pragma target OSC INTOSC_NOCLKOUT -- используем внутренний кварц
pragma target WDT disabled -- сторожевой таймер отключен
pragma target PWRTE disabled -- таймер питания отключен
pragma target MCLR external -- внешний сброс активен
pragma target BROWNOUT disabled -- сбос при падении питания отключен
pragma target LVP disabled -- программирование низким напряжением отключено
pragma target CPD disabled -- защита EEPROM отключена
pragma target CP disabled -- защита кода отключена
--
enable_digital_io() -- переключение всех входов\выходов на цифровой режим
--
alias led is pin_B5 -- светодиод подключен к RB5
pin_B5_direction = output -- настраиваем RB5 как цифровой выход
--
-- настраиваем таймер
T1CON_T1CKPS = 0b_11 -- предделитель, 2 бита
T1CON_TMR1CS = 0 -- тактирование от системной частоты
PIE1_TMR1IE = on -- разрешаем прерывание от TMR1
PIR1_TMR1IF = off -- сбрасываем флаг прерывания от TMR1
INTCON_PEIE = on -- разрешаем прерывания от периферии
T1CON_TMR1ON = on -- включаем таймер
INTCON_GIE = on -- включаем обработку прерываний--
;таймер тактируется от Fosc/4 : 4MHz/4 = 1 Mhz
;предделитель установлен на 1:8 : 1Mhz/8 = 125 kHz
;таймер - 16 бит : 125 kHz/65536 = 1.9 Hz
;светодиод включится и выключится за 2 прерывания : итоговая частота моргания 0,95 Hz
---- обработчик прерывания TMR1
procedure TMR1_ISR is
pragma interrupt
if PIR1_TMR1IF then -- проверяем флаг нужного нам прерывания
PIR1_TMR1IF = off -- сбрасываем флаг прерывания
led = !led -- переключаем состояние светодиода
end if
end procedureforever loop
-- полностью свободный основной цикл
end loop
CCP
Модуль CCP (Capture/Compare/PWM) предназначен для измерения и формирования импульсных сигналов.
Capture
В режиме захвата модуль использует TMR1 в качестве измерителя времени. Как только на ножке CCP1 (pin 9) возникнет отслеживаемое событие, модуль сохранит текущее 16-битное значение TMR1 в регистры CCPR1H:CCPR1L.
Такими событиями могут быть:
- каждый задний фронт сигнала
- каждый передний фронт сигнала
- каждый четвертый передний фронт
- каждый 16 передний фронт
Комбинируя события и высчитывая разность между полученными значениями таймера можно получить такие данные сигнала, как период, длительность импульсов или скважность. Например, некторые акселерометры передают информацию о полученном ускорении изменением скважности сигнала.
Compare
В режиме сравнения модуль рабоает в обратном направлении: как только значение в регистрах CCPR1H:CCPR1L совпадет с текущим значением TMR1, модуль может выставить 1 или 0 на ножке CCP1 (pin 9) или просто сгенерировать прерывание. Так же при совпадении модуль может обнулить TMR1.
Замеряя необходимые промежутки времени можно формировать импульсы определенной формы. Например, для управления положением сервомашинки требуется подавать на сигнальную линию импульсы высокого уровня длиной 700-2200 мкс с частотой 50 Hz. В зависимости от длины импульса серво установит свое положение либо в одно крайнее положение (700 мкс), либо в другое (2200 мкс), либо приблизительно по центру (1500 мкс).
PWM
В режиме ШИМ модуль самостоятельно формирует сигнал с частотой, генерируемой таймером TMR2, и заданной 10-битной скважностью.
Что такое ШИМ-сигнал?
Микроконтроллер может выдавать только цифровой сигнал — логические 1 и 0.
В ШИМ сигнале с постоянной частотой первую часть периода на выход подается 1, а вторую часть — 0. Меняя соотношение длительности обоих частей меняется скважность сигнала. Скважность ШИМ — это соотношение продолжительности импульса логической единицы и периода ШИМ. 10-битный ШИМ может обеспечить точность изменения скважности в 1/1024 длительности периода.
Как этим можно пользоваться?
Так как частота сигнала достаточно велика, то низкоскоростным нагрузкам будет казаться, что они получают напряжение, равное проценту скважности от максимума. Таким образом из ШИМ у нас выйдет обычный аналоговый выход с диапазоном напряжения от 0 до Vdd (в нашем случае — 5В).
Для высокоскоростных нагрузок (к примеру, для светодиодов) ШИМ сигнал будет регулировать процент времени работы. Для человеческого глаза мигание светодиода с большой частотой и переменной скважностью будет казаться постоянным горением с переменной яркостью.
Для работы с ШИМ имеется библиотека, потому нам не потребуется особых усилий по расчетам и настройке регистров.
Пример использования библиотеки:
-- настраиваем ШИМ
pin_CCP1_direction = output -- настраиваем pin 9 как выход
include pwm_hardware -- подключаем библиотеку, упрощающую работу с ШИМ
pwm_max_resolution(4) -- устанавливаем значение предделителя TMR2 для выбора нужной частоты (976 Hz)
pwm1_on() -- включаем ШИМvar bit fade_type = 1 -- переменная для направления изменения яркости
var byte i = 0 -- переменная для текущего уровня яркости
forever loop
-- меняем текущее значение
if fade_type then
i = i + 1
if i == 100 then
fade_type = 0
end if
else
i = i - 1
if i == 0 then
fade_type = 1
end if
end if
pwm1_set_percent_dutycycle(i) -- применяем новое значение яркости
_usec_delay(20000) -- делаем паузу, иначе процесс изменения яркости будет очень быстрым
end loop
Компараторы
Вся работа компаратора заключается в том, что бы сравнить два напряжения и сказать какое из них больше. Сравнение происходит постоянно (при включенном модуле), при изменении результата сравнения может генерироваться прерывание.
В зависимости от настроек, компараторы могут работать в восьми режимах:
По схемам хорошо видно какие напряжения сравниваются в каждом режиме, стоит только пояснить что такое опорное напряжение Vref.
Источник опорного напряжения
Это еще один небольшой модуль, обычно требуется только для работы компараторов.
Единственная задача модуля — разделить напряжение питания до нужного значения.
Модуль представляет из себя простой делитель на 16 резисторах. Все, что он умеет — выделить пониженное до нужного значения напряжение из питания.
При питании 5В модуль может выдать напряжение от 0 до 3.6В.
EEPROM
В микроконтроллере 16f628a нам доступно 128 байт энергонезависимой памяти.
При использовании ассемблера нам пришлось бы много прочитать про порядок записи и чтения в память, нам же понадобится лишь подключить одну бибилотеку для работы с eeprom.
Для подключения библиотеки достаточно написать
include pic_data_eeprom
после чего нам становится доступным ряд процедур и функций:
data_eeprom_read([offset],[byte]) -- процедура читает байт с номером [offset] и -- заносит результат в переменную [byte] data_eeprom_write([offset],[byte]) -- процедура записвает полученный байт [byte] на место [offset] data_eeprom_read_word([offset],[word]) -- процедура считывает 2 байта: [offset] и [offset]+1 data_eeprom_write_word([ofset],[word]) -- процедура записывает 2 байта подряд data_eeprom_read_dword([offset],[dword]) -- процедура считывает 4 байта подряд data_eeprom_write_dword([offset],[dword]) -- процедура записывает 4 байта подряд [byte] = data_eeprom([offset]) -- чтение байта через функцию [word] = data_eeprom_word([offset]) -- чтение двух байт через функцию [dword] = data_eeprom_dword([offset]) -- чтение 4 байт через функцию
Единственное, о чем нужно помнить — о размере памяти. Записать dword по смещению 128 в данном случае не удастся.
USART
USART — последовательный порт ввода-вывода. Данный модуль предназначен для связи микроконтроллера с другими устройствами.
Для организации канала связи достаточно лишь соединить Rx каждого устройства с Tx другого.
При желании настроить режим работы модуля самостоятельно можно подробно изучить документацию на микроконтроллер, но нам снова понадобится лишь одна библиотека.
Единственное, что нам требуется указать — скорость передачи данных. Максимальная скорость зависит от тактового сигнала МК. При 4 MHz рекомендуемая скорость — 2400.
const serial_hw_baudrate = 2400 -- задаем скорость
include serial_hardware -- подключаем библиотеку
serial_hw_init() -- производим настройку модуля
После настройки можно начинать принимать и передавать байты.
serial_hw_write([byte]) -- процедура отправки байта [byte] serial_hw_data = [byte] -- отправка байта через псевдопеременную serial_hw_read([byte]):[boolean] -- при наличии присланного байта заносит значение в -- переменную [byte] и возвращает true -- при отсуствии присланных данных возвращает false serial_hw_data_available -- при наличии принятых байт данная переменная возвращает true, иначе - false [byte] = serial_hw_data -- чтение байта через псевдопеременную, при отсутствии -- принятых байт микроконтролер будет ожидать их прихода -- при использовании такого способа чтения необходимо проверять -- факт прихода данных
Для организации связи с компьютером можно использовать UART-COM и UART-USB адаптеры. Впрочем, никто не мешает собрать их самостоятельно по схемам:
Внешний кварц
Как было видно, внешний кварц необходим не всегда. Но бывают и такие случаи, когда требуется использовать внешний тактовый сигнал.
Подключать внешний кварц нужно к ногам OSC1 и OSC2 (pin16 и pin 15):
Для распространенных кварцев резистор не нужен, ёмкость конденсаторов выбирается в зависимости от частоты кварца. Так же в зависимости от частоты выбирается режим, выставляемый в конфигурационном бите OSC:
Вместо кварца можно так же использовать керамический резонатор, он уже содержит в себе конденсаторы — для подключения резонатора достаточно подсоединить третий контакт к земле.
Итоги
Вот мы и расмотрели основные возможности каждого модуля в микроконтроллере 16f628a. Конечно, в такой короткой статье невозможно описать все тонкости при работе с каждым модулем, при необходимости подробная информация о каждом модуле доступна в документации на каждый микроконтроллер.
С текущим набором перифирии можно выполнить довольно много разнообразных устройств, но иногда бывает проще перейти на более укомплектованный микроконтроллер. Благодаря универсальным библиотекам, начать работать с любым другим поддерживаемым МК не составит особого труда.
habr.com
PIC-микроконтроллеры. Практика применения (2010) | Тавернье К.
Желание написать книгу, посвященную применению целого класса микроконтроллеров, может показаться высокомерным. Действительно, поскольку эти компоненты программируемы, они способны выполнять «все пожелания» пользователя, благодаря чему широко применяются в самых разных сферах. Какой бы объемной ни была книга, в ней невозможно рассказать обо всех реализуемых приложениях с такими микроконтроллерами.
Поэтому было решено написать не сборник готовых приложений, которые, как показывает опыт, редко отвечают потребностям большинства пользователей, а пособие, помогающее читателю самостоятельно разрабатывать собственные проекты.
Для того чтобы знакомство с предлагаемой информацией было наиболее эффективным, книга структурирована следующим образом:
– в главе 1 коротко рассказано об архитектуре Р1С-микроконтроллеров фирмы Microchip. Даны сравнительные характеристики микроконтроллеров семейства, приводятся схемные решения, касающиеся подключения питания, тактирования работы микроконтроллера внешними и внутренними генераторами, а также различных способов сброса;
– в главе 2 говорится о системах разработки приложений, о том, какой вариант выбрать в зависимости от имеющихся средств. Приводится описание ассемблера PIC-контроллеров, который необходимо знать, чтобы разобраться в текстах программ, представленных в последующих главах;
– в главе 3 на многочисленных примерах показано, как обеспечить взаимодействие микроконтроллеров с периферией (причем даны не только описания схем, но и тексты программ). Конечно, предлагаемые решения охватывают лишь малую часть возможных областей применения PIC-микроконтроллеров, однако знакомство с ними позволит вам быстро реализовать собственные приложения;
– в главе 4 представлена библиотека стандартных программ. Приведенные арифметические алгоритмы широко используются во многих приложениях. Их реализация, особенно на ассемблере, по плечу только опытным пользователям микроконтроллеров;
– в главе 5 описаны три актуальных приложения. Используемые в них решения не рассматривались в предыдущих главах;
– наконец, в главе 6 рассказывается об оригинальном продукте Stamp фирмы Parallax – программируемом Р1С-микроконтрол-лере 16С56, интерпретирующем язык Basic, и дано несколько примеров его применения. Эта глава будет особенно интересна тем, кто предпочитает не пользоваться машинным языком.
Книга адресована студентам, специалистам и любителям электроники, занимающимся разработкой микроконтроллерных устройств.
Содержание:
Глава 1.
PIC-микроконтроллеры 16CХХ
Микроконтроллеры подсемейства PIC 16CXX
Общие характеристики
Питание PIC-микроконтроллеров
Тактирование PIC-микроконтроллеров
Схемы сброса
Порты ввода/вывода
Базовые схемы
Глава 2.
Разработка приложений
Выбор микроконтроллера
Ассемблер или языки высокого уровня
Система разработки
Ассемблер и компилятор языка высокого уровня
Эмулятор и симулятор
Разработка программного обеспечения для промышленного применения
Средства разработки фирмы Microchip
Системы Picstart-16b и Plcstart-16c
Программное обеспечение разработки
Синтаксис ассемблера MPALC
Ассемблер PASM
Средства разработки фирмы Parallax
Псевдоэмулятор Reflectlon-5X
Эмуляторы GearView 5X’и ClearView XX
Глава 3.
Схемные решения интерфейсов микроконтроллеров
Параллельные выходы
Управление светодиодами и оптронами
Управление реле
Прямое управление нагрузкой, питающейся от источника постоянного напряжения
Управление светодиодным цифровым индикатором
Управление индикаторами на жидких кристаллах
Параллельные входы
Кнопки и переключатели
Гальваническая развязка входов
Клавиатуры
Вывод из sleep-режима с помощью клавиатуры
Комбинированное использование портов
Внешняя периферия
Стандартная периферия
Взаимодействие с периферией по последовательному интерфейсу
Энергонезависимая память с последовательным интерфейсом
Управление аналого-цифровым преобразователем
Заключение
Глава 4.
Библиотека программ
Арифметические подпрограммы
Беззнаковое умножение 8-разрядных чисел
Знаковое и беззнаковое умножение 16-разрядных чисел
Деление 16-разрядных чисел
Сложение и вычитание 16-разрядных чисел
Операции с плавающей запятой
Преобразование двоично-десятичных кодов в двоичные
Преобразование двоичных кодов в двоично-десятичные
Сложение и вычитание чисел в двоично-десятичных кодах
Программная реализация прерываний микроконтроллеров 16С5Х
Принцип многозадачности
Расширение стековой памяти микроконтроллеров 16С5Х
Передача асинхронной последовательности при отсутствии последовательного порта
Глава 5.
Готовые решения
Часы с будильником
Реализация шины 12C
Общие положения
Принцип обмена данными
Форматы передачи
Схема реализации интерфейса PC
Четырехканальный вольтметр со светодиодной индикацией
Микрокомпьютер, программируемый на Basic
Глава 6.
Микроконтроллер Stamp
Общие положения
Система разработки
Схема платы Stamp
Программная среда разработки
язык программирования PBasic
Операторы управления портами ввода/вывода
Операторы для управления последовательным вводом/выводом
Управление аналоговыми величинами
Прочие операторы
Примеры применений
Аналого-цифровое преобразование
Управление шаговыми двигателями
Интерфейс клавиатуры и индикатора на жидких кристаллах
Приложение
Файл идентификаторов
Автор: Тавернье К.
Страниц: 272
Формат: PDF
Размер: 17.4 Мб
Язык: Русский
Год издания: 2010
Скачать PIC-микроконтроллеры. Практика применения (2010) Тавернье К.
PIC-микроконтроллеры
radiohata.ru
Прошивка PIC микроконтроллеров с “нуля”. / Микроконтроллеры / Блоги по электронике
Итак, пришло время изучать микроконтроллеры, а потом и их программировать, а так же хотелось собирать устройства на них, схем которых сейчас в интернете ну просто море. Ну нашли схему, купили контроллер, скачали прошивку….а прошивать то чем??? И тут перед радиолюбителем, начинающим осваивать микроконтроллеры, встает вопрос – выбор программатора! Хотелось бы найти оптимальный вариант, по показателю универсальность — простота схемы — надёжность. «Фирменные» программаторы и их аналоги были сразу исключены в связи с довольно сложной схемой, включающей в себя те же микроконтроллеры, которые необходимо программировать. То есть получается «замкнутый круг»: что бы изготовить программатор, необходим программатор. Вот и начались поиски и эксперименты! В начале выбор пал на PIC JDM. Работает данный программатор от com порта и питается от туда же. Был опробован данный вариант, уверенно запрограммировал 4 из 10 контроллеров, при питании отдельном ситуация улучшилась, но не на много, на некоторых компьютерах он вообще отказался что либо делать да и защиты от «дурака» в нем не предусмотрено. Далее был изучен программатор Pony-Prog. В принципе, почти тоже самое что и JDM.Программатор «Pony-prog», представляет очень простую схему, с питанием от ком-порта компьютера, в связи с чем, на форумах, в Интернете, очень часто появляются вопросы по сбоям при программировании того, или иного микроконтроллера. В результате, выбор был остановлен на модели «Extra-PIC». Посмотрел схему – очень просто, грамотно! На входе стоит MAX 232 преобразующая сигналы последовательного порта RS-232 в сигналы, пригодные для использования в цифровых схемах с уровнями ТТЛ или КМОП, не перегружает по току COM-порт компьютера, так как использует стандарт эксплуатации RS232, не представляет опасности для COM-порта.Вот первый плюс!Работоспособен с любыми COM-портами, как стандартными (±12v; ±10v) так и с нестандартными COM-портами некоторых моделей современных ноутбуков, имеющих пониженные напряжения сигнальных линий, вплоть до ±5v – еще плюс! Поддерживается распространёнными программами IC-PROG, PonyProg, WinPic 800 (WinPic800) и другими – третий плюс!
И питается это все от своего собственного источника питания!
Было решено – надо собирать! Так в журнале Радио 2007 №8 был найден доработанный вариант этого программатора. Он позволял программировать микроконтроллеры в двух режимах.
Известны два способа перевода микроконтроллеров PICmicro в режим программирования:
1.При включённом напряжении питания Vcc поднять напряжение Vpp (на выводе -MCLR) от нуля до 12В
2.При выключенном напряжении Vcc поднять напряжение Vpp от нуля до 12В, затем включить напряжение Vcc
Первый режим — в основном для приборов ранних разработок, он накладывает ограничения на конфигурацию вывода -MCLR, который в этом случае может служить только входом сигнала начальной установки, а во многих микроконтроллерах предусмотрена возможность превратить этот вывод в обычную линию одного из портов. Это еще один плюс данного программатора. Схема его приведена ниже:
Крупнее
Все было собрано на макетке и опробовано. Все прекрасно и устойчиво работает, глюков замечено небыло!
Была отрисована печатка для этого программатора.
depositfiles.com/files/mk49uejin
все было собрано в открытый корпус, фото которого ниже.
Соединительный кабель был изготовлен самостоятельно из отрезка восьмижильного кабеля и стандартных комовских разьемах, никакие нуль модемные тут не прокатят, предупреждаю сразу! К сборке кабеля следует отнестись внимательно, сразу избавитесь от головной боли в дальнейшем. Длина кабеля должна быть не более полутора метров.
Фото кабеля
Итак, программатор собран, кабель тоже, наступил черед проверки всего этого хозяйства на предмет работоспособности, поиск глюков и ошибок.
Сперва наперво устанавливаем программу IC-prog, которую можно скачать на сайте разработчика www.ic-prog.com, Распакуйте программу в отдельный каталог. В образовавшемся каталое должны находиться три файла:
icprog.exe — файл оболочки программатора.
icprog.sys — драйвер, необходимый для работы под Windows NT, 2000, XP. Этот файл всегда должен находиться в каталоге программы.
icprog.chm — файл помощи (Help file).
Установили, теперь надо бы ее настроить.
Для этого:
1.(Только для Windows XP): Правой кнопкой щёлкните на файле icprog.exe. «Свойства» >> вкладка «Совместимость» >> Установите «галочку» на «Запустить программу в режиме совместимости с:» >>выберите «Windows 2000».
2.Запустите файл icprog.exe. Выберите «Settings» >> «Options» >> вкладку «Language» >> установите язык «Russian» и нажмите «Ok».
Согласитесь с утверждением «You need to restart IC-Prog now» (нажмите «Ok»). Оболочка программатора перезапустится.
Настройки” >> «Программатор
1.Проверьте установки, выберите используемый вами COM-порт, нажмите „Ok“.
2.Далее, „Настройки“ >> „Опции“ >> выберите вкладку „Общие“ >> установите „галочку“ на пункте „Вкл. NT/2000/XP драйвер“ >> Нажмите „Ok“ >> если драйвер до этого не был устновлен на вашей системе, в появившемся окне „Confirm“ нажмите „Ok“. Драйвер установится, и оболочка программатора перезапустится.
Примечание:
Для очень „быстрых“ компьютеров возможно потребуется увеличить параметр „Задержка Ввода/Вывода“. Увеличение этого параметра увеличивает надёжность программирования, однако, увеличивается и время, затрачиваемое на программирование микросхемы.
3.»Настройки” >> «Опции» >> выберите вкладку «I2C» >> установите «галочки» на пунктах: «Включить MCLR как VCC» и «Включить запись блоками». Нажмите «Ok».
4.«Настройки» >> «Опции» >> выберите вкладку «Программирование» >> снимите «галочку» с пункта: «Проверка после программирования» и установите «галочку» на пункте «Проверка при программировании». Нажмите «Ok».
Вот и настроили!
Теперь бы нам протестировать программатор в месте с IC-prog. И тут все просто:
Далее, в программе IC-PROG, в меню, запустите: Настройки >> Тест Программатора
Перед выполнением каждого пункта методики тестирвания, не забывайте устанавливать все «поля» в исходное положение (все «галочки» сняты), как показано на рисунке выше.
1.Установите «галочку» в поле «Вкл. Выход Данных», при этом, в поле «Вход Данных» должна появляться «галочка», а на контакте (DATA) разъёма X2, должен установиться уровень лог. «1» (не менее +3,0 вольт). Теперь, замкните между собой контакт (DATA) и контакт (GND) разъёма X2, при этом, отметка в поле «Вход Данных» должна пропадать, пока контакты замкнуты.
2.При установке «галочки» в поле «Вкл. Тактирования», на контакте (CLOCK) разъёма X2, должен устанавливаться уровень лог. «1». (не менее +3,0 вольт).
3.При установке «галочки» в поле «Вкл. Сброс (MCLR)», на контакте (VPP) разъёма X3, должен устанавливаться уровень +13,0… +14,0 вольт, и светиться светодиод D4 (обычно красного цвета).Если переключатель режимов поставить в положение 1 то будет светится светодиод HL3
Если при тестировании, какой-либо сигнал не проходит, следует тщательно проверить весь путь прохождения этого сигнала, включая кабель соединения с COM-портом компьютера.
Тестирование канала данных программатора EXTRAPIC:
1. 13 вывод микросхемы DA1: напряжение от -5 до -12 вольт. При установке «галочки»: от +5 до +12 вольт.
2. 12 вывод микросхемы Da1: напряжение +5 вольт. При установке «галочки»: 0 вольт.
3. 6 вывод микросхемы DD1: напряжение 0 вольт. При установке «галочки»: +5 вольт.
3. 1 и 2 вывод микросхемы DD1: напряжение 0 вольт. При установке «галочки»: +5 вольт.
4. 3 вывод микросхемы DD1: напряжение +5 вольт. При установке «галочки»: 0 вольт.
5. 14 вывод микросхемы DA1: напряжение от -5 до -12 вольт. При установке «галочки»: от +5 до +12 вольт.
Если все тестирование прошло успешно, то программатор готов к эксплуатации.
Для подключения микроконтроллера к программатору можно использовать подходящие панельки или же сделать адаптер на основе ZIF панельки (с нулевым усилием прижатия), например как здесь radiokot.ru/circuit/digital/pcmod/18/.
Теперь несколько слов про ICSP — Внутрисхемное программирование
PIC-контроллеров.
При использовании ICSP на плате устройства следует предусмотреть возможность подключения программатора. При программировании с использованием ICSP к программатору должны быть подключены 5 сигнальных линий:
1. GND (VSS) — общий провод.
2. VDD (VCC) — плюс напряжение питания
3. MCLR’ (VPP)- вход сброса микроконтроллера / вход напряжения программирования
4. RB7 (DATA) — двунаправленная шина данных в режиме программирования
5. RB6 (CLOCK) Вход синхронизации в режиме программирования
Остальные выводы микроконтроллера не используются в режиме внутрисхемного программирования.
Вариант подключения ICSP к микроконтроллеру PIC16F84 в корпусе DIP18:
1.Линия MCLR’ развязывается от схемы устройства перемычкой J2, которая в режиме внутрисхемного программирования (ICSP) размыкается, передавая вывод MCLR в монопольное управление программатору.
2.Линия VDD в режиме программирования ICSP отключается от схемы устройства перемычкой J1. Это необходимо для исключения потребления тока от линии VDD схемой устройства.
3.Линия RB7 (двунаправленная шина данных в режиме программирования) изолируется по току от схемы устройства резистором R1 номиналом не менее 1 кОм. В связи с этим максимальный втекающий/стекающий ток, обеспечиваемый этой линией будет ограничен резистором R1. При необходимости обеспечить максимальный ток, резистор R1 необходимо заменить (как в случае c VDD) перемычкой.
4.Линия RB6 (Вход синхронизации PIC в режиме программирования) так же как и RB7 изолируется по току от схемы устройства резистором R2, номиналом не менее 1 кОм. В связи с этим максимальный втекающий/стекающий ток, обеспечиваемый этой линией будет ограничен резистором R2. При необходимости обеспечить максимальный ток, резистор R2 необходимо заменить (как в случае с VDD) перемычкой.
Расположение выводов ICSP у PIC-контроллеров:
Эта схема только для справки, выводы программирования лучше уточнить из даташита на микроконтроллер.
Теперь рассмотрим прошивку микроконтроллера в программе IC-prog. Будем рассматривать на примере конструкции вот от сюда rgb73.mylivepage.ru/wiki/1952/579
Вот схема устройства
вот прошивка
Прошиваем контроллер PIC12F629. Данный микроконтроллер для своей работы использует константу osccal — представляет собой 16-ти ричное значение калибровки внутреннего генератора МК, с помощью которого МК отчитывает время при выполнении своих программ, которая записана в последней ячейке данных пика. Подключаем данный микроконтроллер к программатору.
Ниже на сриншоте красными цифрами показана последовательность действий в программе IC-prog.
1. Выбрать тип микроконтроллера
2. Нажать кнопку «Читать микросхему»
В окне «Программный код» в самой последней ячейке будет наша константа для данного контроллера. Для каждого контроллера константа своя!Не сотрите ее, запишите на бумажку и наклейте ее на микросхему!
Идем далее
3. Нажимаем кнопку «Открыть файл…», выбираем нашу прошивку. В окне программного кода появится код прошивки.
4. Спускаемся к концу кода, на последней ячейке жмем правой клавишей мыши и выбираем в меню «править область», в поле «Шестнадцатеричные» вводим значение константы, которую записали, нажимаем «ОК».
5. Нажимаем «программировать микросхему».
Пойдет процесс программирования, если все прошло успешно, то программа выведет соответствующее уведомление.
Вытаскиваем микросхему из программатора и вставляем в собранный макет. Включаем питание. Нажимаем кнопку пуск.Ура работает! Вот видео работы мигалки
video.mail.ru/mail/vanek_rabota/_myvideo/1.html
С этим разобрались. А вот что делать если у нас есть файл исходного кода на ассемблере asm, а нам нужен файл прошивки hex? Тут необходим компилятор. и он есть — это Mplab, в этой программе можно как писать прошивки так и компилировать. Вот окно компилятора
Устанавливаем Mplab
Находим в установленной Mplab программу MPASMWIN.exe, обычно находится в папке — Microchip — MPASM Suite — MPASMWIN.exe
Запускаем ее. В окне (4) Browse находим наш исходник (1) .asm, в окне (5) Processor выбираем наш микроконтроллер, нажимаем Assemble и в той же папке где вы указали исходник появится ваша прошивка .HEX Вот и все готово!
Надеюсь эта статья поможет начинающим в освоении PIC контроллеров! Удачи!
electronics-lab.ru
Справочник по среднему семейству микроконтроллеров PICmicro на русском языке | ||
(248 Kb) – 1. Общие сведения | ||
(386 Kb) – 2. Тактовый генератор | ||
(353 Kb) – 3. Сброс | ||
(299 Kb) – 4. Архитектура | ||
(200 Kb) – 5. ЦПУ и АЛУ | ||
(332 Kb) – 6. Организация памяти | ||
(154 Kb) – 7. EEPROM память данных | ||
(265 Kb) – 8. Прерывания | ||
(460 Kb) – 9. Порты ввода/вывода | ||
(183 Kb) – 10. Ведомый парал. порт | ||
(303 Kb) – 11. Таймер TMR0 | ||
(233 Kb) – 12. Таймер TMR1 | ||
(147 Kb) – 13. Таймер TMR2 | ||
(297 Kb) – 14. Модуль CCP | ||
(622 Kb) – 15. Модуль SSP | ||
(437 Kb) – 16. Основной модуль SSP (BSSP) | ||
(1,456 Kb)- 17. Модуль MSSP | ||
(536 Kb) – 18. Модуль USART | ||
(185 Kb) – 19. Источник опорного напряжения | ||
(300 Kb) – 20. Модуль компараторов | ||
(350 Kb) – 21. Модуль 8-разрядного АЦП | ||
(351 Kb) – 22. Основной модуль 8-разрядного АЦП | ||
(379 Kb) – 23. Модуль 10-разрядного АЦП | ||
(301 Kb) – 24. Модуль интегрирующего АЦП | ||
(593 Kb) – 25. Модуль LCD | ||
(228 Kb) – 26. Сторожевой таймер WDT и SLEEP | ||
(169 Kb) – 27. Биты конфигурации | ||
(258 Kb) – 28. Интерфейс программирования ICSP | ||
(318 Kb) – 29. Система команд | ||
(604 Kb) – 30. Электрические характеристики | ||
(849 Kb) – 31. Характеристики микроконтроллеров | ||
(241 Kb) – 32. Поддержка разработчиков | ||
(384 Kb) – 33. Приложения | ||
(179 Kb) – 34. Глоссарий | ||
PIC17/PIC18 – Описание некоторых периферийных модулей на русском языке | ||
(271 Kb) – | Модуль 10-разрядного АЦП в PIC17C7XX | |
(246 Kb) – | Модуль 10-разрядного АЦП в PIC18C7XX2 | |
(283 Kb) – | USART в PIC17C4X | |
(334 Kb) – | TMR0 – TMR3, ШИМы и регистры звхвата в PIC17C4X | |
(477 Kb) – | PIC18Fxx2 – первые три главы DS39564A | |
(337 Kb) – | PIC18Fxx2 – Организация памяти | |
(309 Kb) – | PIC18Fxx2 – FLASH память программ и данных | |
(273 Kb) – | PIC18Fxx2 – Аппаратный умножитель, прерывания | |
(338 Kb) – | PIC18Fxx2 – Порты ввода/вывода | |
(383 Kb) – | PIC18Fxx2 – Таймеры и CCP модули | |
(662 Kb) – | PIC18Fxx2 – Модуль MSSP | |
(327 Kb) – | PIC18Fxx2 – Модуль USART | |
(352 Kb) – | Расширенный модуль ECCP (Захват/Сравнение/ШИМ) в PIC18FXX8 | |
(287 Kb) – | PIC18Fxx2 – Модуль АЦП, модуль LVD | |
(279 Kb) – | PIC18Fxx2 – Особенности микроконтроллеров PIC18Fxx2 | |
(390 Kb) – | PIC18Fxx2 – Описание системы команд | |
(717 Kb) – | PIC18Fxx2 – Электрические характеристики | |
Разное… (русификация) | ||
(206 Kb) – | Универсальная последовательная шина USB в PIC16C745/765 | |
(162 Kb) – | Программное обеспечение для работы с шиной USB в микроконтроллерах PIC16C745/765 | |
(161 Kb) – | Рекомендации по работе с АЦП в микроконтроллерах PIC16C7X | |
(291 Kb) – | Использование 8–разрядного АЦП в микроконтроллерах PIC16C7X | |
(192 Kb) – | Программная реализация I2C интерфейса (режим ведущего) | |
(283 Kb) – | Краткий обзор интерфейса I2C | |
(741 Kb) – | Модуль CAN в микроконтроллерах PIC18CXX8 | |
(258 Kb) – | Введение в CAN 2.0B интерфейс | |
(126 Kb) – | Переход с микроконтроллеров PIC16F62X на PIC16F627A/ PIC16F628A/ PIC16F648A | |
(348 Kb) – | Применение микроконтроллеров PICmicro для подключения к Интернет по протоколу PPP |
www.eham.ru
Микроконтроллеры PIC16, общие сведения, организация памяти | RadioLaba.ru
Здесь и в следующих статьях я расскажу про семейство микроконтроллеров PIC16, а также примеры программирования на языке ассемблер. Про элементарные понятия писать не буду, так как ориентируюсь на читателя, предварительно ознакомленного с минимумом информации по микроконтроллерам.
В общем, микроконтроллер представляет собой небольшой универсальный процессор, с помощью которого можно реализовать решение обширного круга задач, необходимо лишь написать программу под требуемые условия задачи.
Для написания программ на ассемблере в микроконтроллерах PIC16 используется 35 простых команд (инструкций), так что выучить и разобраться в них совсем не сложно. К статье прикрепил pdf файл с командами, для желающих изучить команды.
Большинство команд выполняются за один машинный цикл, но есть команды, для которых требуется два машинных цикла. Длительность машинного цикла равна 4 периодам тактового генератора. Например, если у нас стоит кварц на 4 МГц, то длительность машинного цикла равна 1 мкс, при частоте кварца в 20 МГц (что является максимумом для этих микроконтроллеров), машинный цикл равен 200 нс или 0,2 мкс.
В микроконтроллерах семейства PIC16 имеется 3 вида памяти: память программ, память данных и энергонезависимая память EEPROM.
Память данных состоит из регистров общего назначения (GPR) и регистров специального назначения (SFR). Все эти регистры однобайтные, и являются элементами оперативной памяти микроконтроллера, то есть хранят информацию только при наличии питания, операции с обоими типами регистров выполняется одними и теми же командами.
Регистры специального назначения предназначены для управления функциями ядра и периферийными модулями микроконтроллера, названия регистров одинаковы для всех типов микроконтроллеров семейства PIC16, что очень удобно при переходе с одного микроконтроллера на другой.
Регистры общего назначения используется как временная память при выполнении различных логических и вычислительных операций, проще говоря, это ОЗУ.
Память данных подразделяется на банки, два или четыре, в зависимости от типа микроконтроллера. Если рассматривать отдельный банк по адресам, то сначала идут регистры специального назначения, затем регистры общего назначения. На картинке ниже можно увидеть карту памяти данных распространенного микроконтроллера PIC16F628A.
Чтобы обратиться к какому либо регистру (выполнить операцию над ним), необходимо сначала указать банк, в котором расположен этот регистр. Банк выбирается с помощью битов RP1, RP0 регистра STATUS, который определен во всех банках, то есть к регистру STATUS можно обращаться независимо от того какой банк выбран, что является очевидным, иначе мы не смогли бы переключать банки. Некоторые важные регистры специального назначения также определены сразу в нескольких банках. Регистры ОЗУ также могут быть определены в нескольких банках, на карте памяти данных при этом пишется “accesses 70h-7Fh” (Доступ к 70h-7Fh). В случае микроконтроллера PIC16F628A, к 16-ти регистрам, расположенным по адресам 70h-7Fh, можно обращаться независимо от выбранного банка. Все это относится к непосредственной адресации, кроме которой существует еще косвенная адресация. Вообще не стоит сильно пугаться этих банков, когда используется небольшое количество регистров ОЗУ, все операции в основном выполняются в одном банке (Банк 0), переключаться приходиться лишь при обращении к некоторым регистрам специального назначения.
Для реализации косвенной адресации используется регистр специального назначения FSR, а также физически не реализованный регистр INDF. Чтобы обратиться к какому-либо регистру (например PORTB), необходимо записать его адрес в регистр FSR, после чего содержимое регистра PORTB условно окажется в регистре INDF. Условно потому что обращение к регистру INDF на самом деле вызовет действие с регистром PORTB. Косвенную адресацию удобно применять при обращении к большому количеству регистров расположенных последовательно в памяти данных. Выполняя однотипную операцию с регистром INDF, с последующим инкрементом регистра FSR, можно прооперировать большое количество регистров. При использовании косвенной адресации также следует указать банк местонахождения регистра, адрес которого записывают в FSR. При данной адресации банк указывается одним битом IRP регистра STATUS, так как адресация работает в пределах 2-х банков. Если бит IRP сброшен (значение равно 0), можно обращаться к регистрам 0-го и 1-го банка, при установленном бите (значение равно 1), обращение идет к регистрам 2-го и 3-го банка.
В памяти программ располагается сам код программы в виде последовательности команд. Команды 14-ти разрядные, ячейку памяти программ еще называют словом. Например, у PIC16F628A объем памяти равен 2K x 14 слов (2048 х 14), то есть в памяти программ можно разместить 2048 команд. В счетчике команд PC находится адрес выполняемой команды, регистр счетчика 13-ти разрядный и разделен на два регистра: старший байт PCH и младший PCL, регистр PCL доступен для записи и чтения, он относится к регистрам специального назначения. Регистр PCH недоступен, все операции с ним выполняются через дополнительный регистр специального назначения PCLATH. Так как счетчик 13-ти разрядный, то в регистрах PCH и PCLATH используются только 5 бит. Всего с помощью 13-ти разрядов можно адресовать 8192 слова, поэтому это максимальный объем памяти программ для микроконтроллеров PIC16.
В ходе последовательного выполнения команд содержимое регистра PCL (адрес команды) автоматически инкрементируется, при переполнении происходит инкремент содержимого PCH. Если изменить содержимое регистра PCL, путем записи нового значения или выполнения арифметических операций, можно перескочить на другой участок кода программы, таким образом осуществляется вычисляемый переход. При использовании команд изменяющих значение регистра PCL, содержимое регистра PCLATH передается регистру PCH, то же самое происходит при выполнении команд GOTO и CALL.
Следует знать, что в случае вычисляемого перехода при переполнении регистра PCL (например, в результате операции сложения), регистр PCH не инкрементируется. Например, на момент сложения (прибавляем число 9) значение регистра PCL равнялось 250, а значение PCLATH равно 0, после выполнения команды в PCL будет лежать число 4, но инкремента PCH не произойдет, в PCH запишется число 0 из регистра PCLATH. Тем самым мы попадем на команду с адресом 4 (0004h) (PCH=xxx00000, PCL=00000100), вместо того чтобы попасть на команду с адресом 260 (0104h) (PCH=xxx00001, PCL=00000100). При использовании вычисляемого перехода необходимо предварительно записать значение в регистр PCLATH, после чего изменять значение PCL, или же просто не допускать переполнения PCL. Вычисляемый переход в основном используется для табличного чтения данных, описанного в статье таблица данных.
А теперь расскажу о страницах памяти, команды CALL и GOTO имеют 11-ти разрядное поле для указания адреса, поэтому можно спокойно применять эти команды в пределах 2048 слов (это размер одной страницы) памяти программ, не задумываясь о регистрах PCH и PCLATH. У микроконтроллера PIC16F628A объем памяти равен одной странице, поэтому там все просто. В микроконтроллерах с большей памятью при переходах с помощью команд CALL и GOTO необходимо заранее запрограммировать 3-й и 4-й бит в регистре PCLATH, чтобы попасть на нужный участок кода памяти программ.
Например, нам нужно попасть на метку PROG расположенную по адресу 3500 (0DACh) (PCH=xxx01101, PCL=10101100), этот адрес находится уже на первой странице памяти, до нее шла нулевая страница. Перед вызовом команды CALL PROG, 3-й и 4-й бит регистра PCLATH сброшены, после выполнения команды в регистре PCL будет лежать число 172 (PCL=10101100), так как поле задания адреса 11-ти разрядное, в регистр PCH запишется число 5, а в 3-й и 4-й бит запишутся нули из регистра PCLATH, тем самым мы попадем на команду с адресом 1452 (05ACh) (PCH=xxx000101, PCL=10101100). Чтобы правильно попасть на метку PROG, перед вызовом команды CALL PROG, необходимо установить 3-й бит регистра PCLATH в 1. Таким образом, 3-им и 4-ым битом мы выбираем одну из 4-х страниц памяти программ, в пределах страницы манипуляций с этими битами производить не надо.
При возврате из одной страницы в другую с помощью команд RETURN, RETLW изменять значение битов не требуется, так как стек 13-ти разрядный. Но надо учесть, что после выполнения этих инструкций, значение регистра PCLATH не изменяется (оно вообще никогда не изменяется само по себе), это справедливо и для инструкции возврата из подпрограммы обработки прерывания RETFIE, и если мы снова воспользуемся командами перехода, мы можем попасть не на тот участок кода. Поэтому перед выполнением команд перехода после инструкций возврата, необходимо правильно запрограммировать биты регистра PCLATH, или изменить их значение перед выполнением команды возврата.
Чтобы лучше разобраться с вычисляемым переходом и страницами памяти программ, можно поэкспериментировать в отладчике MPLAB.
С EEPROM памятью, думаю все ясно, это энергонезависимая память, которая не теряется при выключении питания, ячейки EEPROM однобайтные, работать с этой памятью несложно, все необходимое описано в технической документации.
Таблица команд ассемблера для микроконтроллеров PIC12,16
Последние записи:
radiolaba.ru