Контроль 15-ти контактов одним входом pic-микроконтроллера

Управление электроприводом на микроконтроллере

Источник: http://homelab.at.ua/publ/ehlektroonika/upravlenie_ehlektroprivodom_na_mikrokontrollere/4-1-0-16

PIC программатор микроконтроллеров фирмы MicroChip

В настоящее время появилось много принципиальных схем с использованием различных микроконтроллеров, в том числе и микроконтроллеров PIC  фирмы MicroChip. Это позволило получить достаточно функциональные  устройства, несмотря на их простоту.

Но работа микроконтроллера невозможна без программы управления, которую необходимо записать. В данной статье мы рассмотрим универсальный программатор PIC – EXTRA-PIC позволяющий программировать PIC контроллеры и память EEPROM I2C через COM порт либо через переходник COM-USB.

Список поддерживаемых микросхем, при использовании с программой IC-PROG v1.05D:

PIC-контроллеры фирмы Microchip: PIC12C508, PIC12C508A, PIC12C509, PIC12C509A, PIC12CE518, PIC12CE519, PIC12C671, PIC12C672, PIC12CE673, PIC12CE674, PIC12F629, PIC12F675, PIC16C433, PIC16C61, PIC16C62A, PIC16C62B, PIC16C63, PIC16C63A, PIC16C64A, PIC16C65A, PIC16C65B, PIC16C66, PIC16C67, PIC16C71, PIC16C72, PIC16C72A, PIC16C73A, PIC16C73B, PIC16C74A, PIC16C74B, PIC16C76, PIC16C77, PIC16F72, PIC16F73, PIC16F74, PIC16F76, PIC16F77, PIC16C84, PIC16F83, PIC16F84, PIC16F84A, PIC16F88, PIC16C505*, PIC16C620, PIC16C620A, PIC16C621, PIC16C621A, PIC16C622, PIC16C622A, PIC16CE623, PIC16CE624, PIC16CE625, PIC16F627, PIC16F628, PIC16F628A, PIC16F630*, PIC16F648A, PIC16F676*, PIC16C710, PIC16C711, PIC16C712, PIC16C715, PIC16C716, PIC16C717, PIC16C745, PIC16C765, PIC16C770*, PIC16C771*, PIC16C773, PIC16C774, PIC16C781*, PIC16C782*, PIC16F818, PIC16F819, PIC16F870, PIC16F871, PIC16F872, PIC16F873, PIC16F873A, PIC16F874, PIC16F874A, PIC16F876, PIC16F876A, PIC16F877, PIC16F877A, PIC16C923*, PIC16C924*, PIC18F242, PIC18F248, PIC18F252, PIC18F258, PIC18F442, PIC18F448, PIC18F452, PIC18F458, PIC18F1220, PIC18F1320, PIC18F2320, PIC18F4320, PIC18F4539, PIC18F6620*, PIC18F6720*, PIC18F8620*, PIC18F8720*

Примечание: микроконтроллеры, которые отмечены  звездочкой (*) необходимо подключить к программатору   через ICSP разъем.

Последовательная память EEPROM I2C (IIC): X24C01, 24C01A, 24C02, 24C04, 24C08, 24C16, 24C32, 24C64, AT24C128, M24C128, AT24C256, M24C256, AT24C512.

Читайте также:  Карманный кардиограф на sd-карте

Непосредственно сама схема программатора EXTRA-PIC:

Программатор (1,5 Mb, скачано: 10 277)

Программируемый контроллер подключается через разъем X3. Ниже приведена распиновка выводов программирования под разные контроллеры:

А теперь инструкция как запрограммировать микроконтроллер.

В виде примера возьмем микроконтроллер PIC16F876A.

Соберите программатор   и подготовьте блок питания с напряжением на выходе  не менее 15В

Программа icpr105d (1,6 Mb, скачано: 8 117)

Распакуйте программу в отдельный каталог. В созданном каталоге должны находиться три файла:

icprog.exe – файл оболочки программатора;

icprog.sys – драйвер, необходимый для работы под Windows NT, 2000, XP. Этот файл всегда должен находиться в каталоге программы;

icprog.chm – файл помощи (Help file).

Настройка программы IC-PROG v1.05D.

Обухов Д.Э., Стенин С.Л., Струнин Д.В.

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

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

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

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

Рис .1. Схема управления асинхронным двигателем.

Привлекательная во всех отношениях микросхема IR2131 (или IR2130) фирмы INTERNATIONAL RECTIFIER редко встречается в отечественных разработках.

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

Микросхема IR2131 представляет собой драйвер 6-ти ключей (IGBT или MOSFET), имеющий три выхода для управления нижними ключами моста и три выхода для ключей с плавающим потенциалом управления. В ней предусмотрена защита по току, которая выключает все ключи и выдает сигнал ошибки FAULT, когда сигнал на  выводе ITRIP превышает 0,5В.

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

Кроме этого у IR2131 есть отдельный вход выключения всех ключей и вход сброса сигнала ошибки, а у IR2130 вместо них имеется встроенный усилитель тока нагрузки и сброс триггера ошибки осуществляется при подаче на все входы управления неактивного уровня. Допустимое напряжение на инверторе, с которым работает микросхема, составляет 600В.

В настоящее время фирмой INTERNATIONAL RECTIFIER производятся аналогичные драйверы с рабочим напряжением 1200В.

На рис.1. изображена простейшая схема трехфазного моста на транзисторах IRF740, которые управляются от IR2131.

Для генерации сигналов управления мостом можно использовать недорогой микроконтроллер фирмы Microchip PIC16C62 (если необходимо дополнительно обрабатывать аналоговый сигнал, то рекомендуется PIC16C73).

При небольшой номинальной мощности электропривод запитывается от сети переменного тока 220В через разъем XI, при этом рекомендуется использовать в трехфазном мосте транзисторы IRF740 (VT2-VT7). Через эти транзисторы можно пропустить мощность до 5КВт.

При больших мощностях надо переходить на питание от трехфазной сети 380В, и использовать IGBT транзисторы. Наш опыт работы показал целесообразность шунтирования затворных резисторов R13-R18 обратными диодами VD7-VD12. Это позволяет значительно снизить динамические потери на выключении.

Сформированное напряжение подается на двигатель через разъем Х2.

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

При работе от однофазной сети 220В может возникнуть необходимость введения модуля коррекции потребляемого тока (это особенно актуально при больших мощностях привода).

Для некоторых разработок, где 100Гц пульсации момента на валу двигателя не приводят к нежелательным последствиям, можно вообще отказаться от использования конденсатора С12.

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

Питание на драйвер DD2 подается от стабилитрона VD2 через гасящий резистор R12. При небольших частотах инвертора (до ЗкГц) достаточно 40кОм для нормального питания системы управления. Для увеличения КПД системы можно применить стандартный импульсный понижающий регулятор, используя в качестве ШИМ-контроллера ресурсы PIC16C73.

Бутстреповые емкости С7-С9 заряжаются через диоды VD4-VD6 при включении соответствующего нижнего ключа. Напряжение питания IR2131 выбирается в зависимости от желаемой степени насыщения силового транзистора. Рекомендуемая величина 15-20В.

Уменьшение питающего напряжения какого-нибудь из каналов ниже 8В вызывает немедленное запирание ключа.

Величина резистивнохю датчика тока R10 выбирается в зависимости от номинальной мощности электропривода и допустимой перегрузки по току (R10 = 0,5В / 1доп.).

Интегрирующее звено R11-C10 предотвращает ложное срабатывание токовой защиты в моменты коммутаций, достаточная величина постоянной времени 0,5мкс.

При превышении сигналом на входе ITRIP уровня 0,5В все ключи запираются и выдается сигнал ошибки FAULT (выход с открытым коллектором).

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

Диапазон рабочих напряжений питания PIC процессоров 4-6В, максимальный потребляемый ток при тактировании от RC генератора 5мА, ток в режиме пониженного энергопотребления 20мкА.

Большое удобство создает повышенная нагрузочная способность портов – 25мА, что позволяет напрямую управлять светодиодами (включая светодиоды оптронов). Наличие разнообразной периферии (АЦП, компараторы, последовательные порты, таймеры, модуль ШИМ и пр.

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

Microchip свободно распространяет ассемблер MPASM, симулятор MPSIM, интегрированную систему отладки для Windows MPLAB. Имеющиеся для этих контроллеров Си-компиляторы (например, компилятор фирмы HI-TECH) ускоряют процесс написания и отладки программ.

В нашей схеме процессор PIC16C62 питается от стабилитрона VD3. При несложных задачах управления электроприводом можно тактировать микроконтроллер от RC генератора (R6-C1). Максимально допустимая частота при этом 4МГц. 

Поскольку почти все команды выполняются этим процессором за один такт (в данном случае за 1 мкс), то этого оказывается достаточным даже для выдачи на двигатель синусоидально-центрированной ШИМ с частотой несущей ЗкГц.

Наиболее просто организуется управление со 1800 (или 1200) коммутацией. 

Использование ресурсов микроконтроллера для этой задачи приводится в табл.1. Осциллограммы тока и напряжения в этом режиме показаны на рис.2.

Таблица 1.

Рис.2. Осциллограммы тока и напряжения при 180° коммутации. Фазный ток (слева) и линейное напряжение (справа).

С помощью переключателей J1-J4 осуществляются следующие функции управления:

  • Пуск-остановка двигателя (можно дистанционно через оптрон VT1);
  • Выбор скорости вращения двигателя;
  • Изменение направления вращения двигателя;

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

Для демонстрации возможностей системы покажем реализацию широтно-импульсной модуляции базовых векторов. Основываясь на базовых векторах 180о коммутации (см. рис.3), формируется синусоидально-центрированная ШИМ.

Некоторые алгоритмы формирования синусоидального напряжения были показаны в [1], в данном случае длительность каждого вектора вычисляется из условия равенства площади генерируемого напряжения и площади синусоиды на периоде ШИМ.

Рис.3. Базовые вектора 6-тактной коммутации.

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

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

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

Для случая, когда на двигателе формируется синусоидальное напряжение 100 Гц с частотой ШИМа ЗкГц, осциллограммы имеют вид, как показано на рис.4.

Рис.4. Осциллограммы тока и напряжения при синусоидальной ШИМ. Фазный ток (слева) и линейное напряжение (справа).

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

В таблице 1 приведены данные по использованию некоторых ресурсов микроконтроллера PIC16C62 для случая выдачи синусоидально-центрированной ШИМ с модуляцией базовых векторов.

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

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

Определением угла положения ротора занимается процессор PIC16C73. В бездатчиковой схеме с тактированием PIC16C73 от RC генератора можно управлять вентильным двигателем с частотой вращения до 100Гц. Для выхода на большие скорости вращения нужно увеличивать частоту тактирования процессора.

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

В [6] предлагался вариант бездатчикового привода для бесколлекторного двигателя постоянного тока на базе MC68HC908MR24.

В качестве недостатков предложенного механизма определения угла положения ротора следует отнести невозможность работы схемы с высокоиндуктивными двигателями (длительный коммутационный интервал не отфильтруется и компараторы «поймают» ложный переход противо- ЭДС через ноль), второй существенный недостаток – это проблема пуска двигателя. В предложенной схеме потребуются значительные вычислительные ресурсы для определения первоначального положения ротора. Кроме этого, нужно учесть, что нормальный пуск двигателя происходит на низкой частоте при выполнении определенного соотношения U/f. Для сравнения, в табл.1 приводятся данные по использованию ресурсов PIC16C73 в бездатчиковой схеме управления вентильным двигателем с постоянными магнитами, когда коммутационные интервалы незначительны.

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

Габаритные размеры 135x80x33 мм.

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

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

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

Печатную плату, программу и прошивку можно скачать здесь:

ftp://homelab.homelinuxserver.org/pub/arhiv/2014-06-al.zip

Литература:

1. В. Козаченко. Основные тенденции развития встроенных систем управления двигателями и требования к контроллерам. // CHIIP NEWS. 1999. №1.-С.2-9.

2. Control Integrated Circuit Designers4 Manual. International Rectifier, 1996.

3. Power Semiconductors. Product Digest 47th Edition, 1995.

4. PIC16/17 MICROCONTROLLER DATA BOOK, 1997.

5. Однокристальные микроконтроллеры Microchip: PIC16C8X. Пер. с англ. Под ред. Владимирова А.Н. -Рига.: 0RMIX, 1996. – 120 с.

6. Radim Visinka, Leos Chalupa, Ivan Skalka. Системы управления электродвигателями на микроконтроллерах фирмы MOTOROLA. // CHIIP NEWS. 1999. №1.- С.14-16.

Для Windows95, 98, ME Для Windows NT, 2000, XP
(Только для Windows XP ): Правой кнопкой щёлкните на файле icprog.exe.”Свойства ” >> вкладка “Совместимость ” >>Установите “галочку” на “Запустить программу в режиме совместимости с: ” >> выберите “Windows 2000 “.
  1. Запустите файл icprog.exe .
  2. Выберите “Settings ” >> “Options ” >> вкладку “Language ” >> установите язык “Russian ” и нажмите “Ok “.
  3. Согласитесь с утверждением “You need to restart IC-Prog now ” (нажмите “Ok “).
  4. Оболочка программатора перезапустится.
Настройки ” >> “Программатор “.Проверьте установки, выберите используемый вами COM-порт, нажмите “Ok “.
Далее, “Настройки ” >> “Опции ” >> выберите вкладку “Общие ” >> установите “галочку” на пункте “Вкл. NT/2000/XP драйвер ” >> Нажмите “Ok ” >>если драйвер до этого не был установлен в системе, в появившемся окне “Confirm ” нажмите “Ok “. Драйвер установится, и оболочка программатора перезапустится.
Примечание: Для очень “быстрых” компьютеров возможно потребуется увеличить параметр “Задержка Ввода/Вывода “. Увеличение этого параметра увеличивает надёжность программирования, однако, увеличивается и время, затрачиваемое на программирование микросхемы.
Настройки ” >> “Опции ” >> выберите вкладку “I2C ” >> установите “галочки” на пунктах:”Включить MCLR как VCC ” и “Включить запись блоками “. Нажмите “Ok “.
Программа готова к работе.

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

Подключите шнур удлинителя, включите питание.

Запустите программу IC-PROG.

В выпадающем списке выберите контроллер PIC16F876A.

Если у вас нет файла с прошивкой – подготовьте его:

откройте стандартную программу “Блокнот”;

вставьте в документ текст прошивки;

сохраните под любым именем, например, prohivka.txt (расширение *.txt или *.hex).

Далее в IC-PROG Файл >> Открыть файл (! не путать с Открыть файл данных ) >> найти наш файл с прошивкой (если у нас файл с расширением *.txt , то в типе файлов выберите Any File *.* ). Окошко “Программного кода” должно заполнится информацией.

Нажимаем кнопку “Программировать микросхему”   (загорается красный светодиод).

Ожидаем завершения программирования (около 30 сек.).

Для контроля нажимаем “Сравнить микросхему с буфером”.

Источник: http://www.joyta.ru/379-programmator-mikrokontrollerov-pic-firmy-microchip/

Обход встроенной защиты PIC-микроконтроллеров

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

Взлом МК PIC18F1320

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

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

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

Ну, сами понимаете, есть еще некоторые ситуации, когда такие навыки могут пригодиться

Я купил четыре PIC18F1320 и начал их мучать. Вот так выглядит PIC18F1320 в первозданном, не раскуроченном виде:

Первое, что предстоит сделать, это внять верхнюю часть корпуса, чтобы стали доступны кремниевые внутренности микроконтроллера. Хотя существует достаточно много любительских способов сделать это, но обычно они основаны на применении азотной или серной кислоты. Во-первых, это, скорее всего, не те вещи, которые вы очень хотите видеть рядом с собой. Во-вторых, их непросто достать, поскольку, например, азотная кислота является одним из компонентов для изготовления взрывчатых веществ. Я решил, что самый простой и надежный способ — отправить микроконтроллеры в лабораторию анализа отказов, такую как MEFAS, и за $50 и 2 дня получить на руки уже «обезглавленные» компоненты. Для этого проекта я удалил компаунд с трех микроконтроллеров. Два из них остались полностью рабочими, а один лишился корпуса полностью, т.е. остался только сам чип. Это было продиктовано конструктивными особенностями моего микроскопа при больших увеличениях.
Недолгое обследование поверхности чипов позволило выявить некоторые характерные участки микроконтроллера, показанные ниже:
Видны (по часовой стрелке): 8 KB flash-памяти, источник опорного напряжения, зарядовый насос для программирования flash/EEPROM памяти, 256 байт EEPROM памяти, втроенные таймеры и цепи тактирования, вычислительное ядро, ПЗУ с микрокодом, массив с fuse-битами, 256 байт ОЗУ, АЦП. (

было бы очень интересно узнать, как он все это определил по внешнему виду

) Одна структура сразу привлекла мое внимание: ряд металлических экранов над транзисторами, которые располагались в правильном порядке, и количество которых совпадало с количеством fuse-бит.

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

Для чего они нужны? Во-первых, вспомним некоторые интересные факты о технологии flash (этот тип памяти применяется в том числе и в PIC-микроконтроллерах для хранения fuse-бит).

Flash-технология подразумевает использование транзисторов с плавающим затвором, очень похожие на те, что применялись в старых микросхемах ПЗУ с ИФ-стиранием (вы же помните 2616-е в керамическом корпусе и с кварцевым стеклом?).

И во flash, и в УФ-ППЗУ данные сохраняются путем инжектирования электронов на плавающий затвор при помощи тоннельного эффекта, где эти электроны могут находиться десятилетиями. Дополнительные электроны в плавающем затворе создают заметные изменения в характеристиках транзистора.

Разница заключается в том, что во flash-памяти для стирания информации достаточно электрических импульсов, в то время как в УФ-ППЗУ для того чтобы «выгнать» электроны с плавающего затвора необходимы фотоны с высокой энергией. Для этого необходим ультрафиолет с длинной волны примерно 250 нм.

Для того, чтобы УФ-излучение не слишком сильно ослабевало, применяются кварцевые стекла (те самые окошечки на старых микросхемах ПЗУ).

Важный вывод, который можно сделать из вышеуказанных фактов: flash память тоже может быть стерта при помощи УФ-излучения, т.к. она имеет практически ту же транзисторную структуру, что и УФ-ППЗУ устройства. Корпус устройств с flash-памятью обычно мешает попаданию ультрафиолета на поверхность кристалла, но так как наш PIC микроконтроллер теперь лишен пластиковой верхушки корпуса, то мы может применить УФ-излучение и посмотреть, что из этого выйдет.

Я провел эксперимент, в котором запрограммировал PIC-контроллер последовательными значениями от 0x00 до 0xFF, и затем проэкспонировал его в моем УФ-ППЗУ стирателе, пока принимал душ и проверял почту.

Когда я извлек контроллер из стирателя, то обнаружил, что flash-память действительно была очищена и вернулась в изначальное состояние (все значения 0xFF), и что защитные fuse-биты так же были деактивированы. Так же следует учитывать, что УФ-излучение действует и на EEPROM-память.

Ясно, что металлические пластины над защитными fuse-битами как раз служат защитой от того, чтобы сбросить их отдельно от flash-памяти программ.Картинка иллюстрирует проблему (и ее решение), с которой я столкнулся. Для того чтобы стереть информацию на транзисторе flash-памяти, сильное УФ-излучение должно достигать его плавающего затвора.

А металлические экраны препятствуют этому, эффективно отражая УФ-лучи. Однако, благодаря разности между коэффициентами преломления света для оксида и кремния, свет, падая под некоторым углом, будет отражаться от его поверхности. Чтобы получше понять этот эффект можете прыгнуть в бассейн и посмотреть на воду почти на уровне глаз.

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

Итак, поворачивая PIC-микроконтроллер внутри ПЗУ-стирателя, я могу направить достаточно света для того чтобы он, отразившись в области транзистора flash-памяти, вызвал его стирание. После нескольких попыток я разработал технологию, которая кажется работает вполне неплохо.Это фото микроконтроллера внутри ПЗУ-стирателя (синее свечение вокруг контроллера обусловлено работой УФ-лампы).

Микроконтроллер закреплен под углом в антистатическом материале. Но все это не может защитить от стирания нужных данных в той части flash-памяти, где хранится программа микроконтроллера.

Для того чтобы предотвратить стирание этих данных используется сплошная маска, которая была очень аккуратно вырезана из изоленты и прикреплена к кристаллу с помощью двух пинцетов, микроскопа и недрогнувшей руки ) Изолента эффективно блокирует прохождение ультрафиолета, тем самым защищая закрытую область памяти от стирания, а так же поглощает отраженный от кремниевой подложки ультрафиолет.Это фото кристалла с прикрепленной маской над областью flash-памяти. Используя эту технику я наконец смог сбросить защитные fuse-биты без стирания основной программы микроконтроллера. Этим же способом можно стирать только некоторую часть flash-памяти. Ура!

Замечания

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

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

Так же хочется заметить, что во всенародно любимых микроконтроллерах AVR fuse-биты имеют похожую структуру (точно так же перепрограммируются), что позволяет надеяться, что описанная методика пригодна и для них!

UPD: исправил по возможности огрехи перевода (про ширину запрещенной зоны, магнитную ленту и способ заполнения памяти контроллера).

UPD 2: эта же тема, но для микроконтроллеров AVR, затрагивается здесь и здесь. Вот тут можно заказать чтение прошивки и даже купить спец. приборы.

Оригинал статьи тут.

Источник: https://habr.com/post/127281/

Использование модулей АЦП и ШИМ в микроконтроллерах PIC16

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

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

На рисунке ниже представлена структурная схема аналогового входа АЦП:

Здесь Rs – это внутреннее сопротивление источника напряжения, ANx – линия порта микроконтроллера, обладающая емкостью Cpin и током утечки Iu. Внутренние соединения микроконтроллера имеют сопротивление Ric.

Переключатель SS имеющий сопротивление Rss, подключает линию порта ANx к конденсатору Chold модуля АЦП. Коммутация переключателя SS производится при выборе аналогового канала, каждому каналу соответствует свой переключатель.

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

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

После выбора аналогового канала битами CHS(2:0) регистра ADCON0, необходимо организовать определенную паузу (Tacq) перед началом преобразования, для того чтобы конденсатор Chold успел зарядиться.

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

В основном на время заряда влияет внутреннее сопротивление источника напряжения Rs, которое не должно превышать 10 кОм, для компенсации внутреннего тока утечки Iu, кроме этого влияние оказывает сопротивление переключателя защелки Rss и емкость самого конденсатора Chold, которая может различаться у различных моделей микроконтроллеров.

Время преобразования составляет 12Tad, где Tad это время получения одного бита, для корректного результата Tad не должно быть меньше 1,6 мкс. Время Tad в зависимости от частоты тактового генератора подбирается настройкой битов ADCS(2:0), в даташите на микроконтроллер для этого приводится таблица, где можно подобрать правильное значение.

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

В принципе, если аналоговый канал не меняется и частота преобразований небольшая (время между преобразованиями больше чем Tacq+2Tad), можно и не рассчитывать временные задержки Tacq, 2Tad, и забыть о них.

Чтобы использовать линии порта микроконтроллера для АЦП, необходимо их настроить как аналоговые входы битами ANS(7:0) регистра ANSEL, при этом линия порта должна быть настроена на вход битами регистра TRIS. После этого выбирается требуемый аналоговый канал.

Результат преобразования (10 бит) сохраняется в регистрах ADRESH и ADRESL. Эти регистры представляют собой спаренный 16-ти разрядный регистр, запись результата может выполняться с правым или левым выравниваем, как показано на картинке ниже.

Настройка выравнивания осуществляется с помощью бита ADFM регистра ADCON0.

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

Для увеличения точности результата опорное напряжение должно быть стабилизированным с минимальным уровнем пульсаций. При опорном напряжении Vref =5 В, получим дискретность 5В/1024=0,0049 В=4,9 мВ для 10-ти битного результата.

Для получения 8-ми битного результата необходимо применить левое выравнивание и считывать только регистр ADRESH, в этом случае для Vref =5 В дискретность составит 5В/256=0,0195 В=9,5 мВ.

Включение модуля АЦП производится битом ADON регистра ADCON0, запуск преобразования осуществляется установкой бита GO/-DONE регистра ADCON0, который аппаратно сбрасывается после окончания преобразования, то есть проверкой этого бита можно определить конец преобразования.

Перейдем к рассмотрению 10-ти разрядного ШИМ (широтно-импульсная модуляция) в микроконтроллерах PIC16. ШИМ осуществляется посредством модуля CCP, который настраивается в регистре CCP1CON, и содержит 16-ти разрядный регистр CCPR1, состоящий из двух регистров CCPR1H и CCPR1L.

Сигнал от модуля в режиме ШИМ передается на вывод CCP1 микроконтроллера, который должен быть настроен на выход. Для реализации ШИМ используется таймер TMR2, период ШИМ задается в регистре PR2, старшие 8 бит длительности импульса задаются в регистре CCPR1L , младшие 2 бита в регистре CCP1CON(5:4).

Ниже представлена структурная схема модуля ШИМ:

Когда значение таймера TMR2 в процессе инкремента сравнивается с числом в регистре PR2, происходит обнуление TMR2, одновременно с этим устанавливается высокий логический уровень на выводе CCP1 (если длительность импульса в регистрах CCPR1L и CCP1CON равна нулю, высокий логический уровень не устанавливается).

Также в этот момент происходит загрузка значения длительности импульса из регистров CCPR1L, CCP1CON в регистр CCPR1H и внутреннюю двухразрядную защелку, которые образуют буфер ШИМ.

Буферизация необходима для возможности записи нового значения длительности импульса в регистры CCPR1L, CCP1CON, без искажения предыдущего значения. Биты в регистре CCPR1L и CCP1CON(5:4) могут быть изменены в любое время, но значение в регистре CCPR1H не изменяется, пока не произойдет совпадение значений TMR2 и PR2. В ШИМ режиме регистр CCPR1H доступен только для чтения.

Таймер TMR2 и внутренний двухразрядный счетчик образуют условный 10-ти разрядный счетчик, при этом если TMR2 инкрементируется в каждом машинном цикле с частотой Fosc/4 (при коэффициенте предделителя 1:1), то внутренний двухразрядный счетчик тактируется за каждый период тактового генератора с частотой Fosc, тем самым получается условный 10-ти разрядный счетчик. Когда значение CCPR1H и внутренней двухразрядной защелки сравнивается со значением TMR2 и внутреннего двухразрядного счетчика, на выводе CCP1 устанавливается низкий логический уровень. Ниже можно увидеть временную диаграмму одного периода ШИМ:

Период ШИМ можно рассчитать по следующей формуле из даташита:

Tшим=(PR2+1) ×4×Tosc×(коэффициент предделителя TMR2)

По мне лучше переписать данное уравнение в более удобную форму:

Fшим=Fosc/(4×(PR2+1)×(коэффициент предделителя TMR2))

Подставляя частоту тактового генератора, например, в килогерцах, получим результирующую частоту ШИМ в тех же единицах, так как остальные параметры безразмерные.

В даташите также приведена таблица с рассчитанными значениями частоты и разрешения ШИМ для частоты тактового генератора в 20 МГц:

Удобнее всего начинать расчет параметров ШИМ, выбрав требуемое разрешение, исходя из которого, можно рассчитать три возможных комбинации значения частоты ШИМ и выбрать наиболее подходящее.

Выполним несколько расчетов для частоты тактового генератора в 4 МГц. Значение разрешения ШИМ примем равным 8 бит, для получения наибольших частот ШИМ для заданной частоты тактового генератора, значение длительности импульса необходимо загружать в регистры CCPR1L и CCP1CON с “правым выравниванием”.

То есть старшие 6 бит длительности импульса загружаем в биты (5:0) регистра CCPR1L (в 6-й и 7-й бит CCPR1L записываем нули), а младшие 2 бита длительности импульса в регистр CCP1CON(5:4) как показано на рисунке ниже:

При этом числовое значение для регистра PR2, определяющее период ШИМ, составит 0x3F=63.

Посчитаем частоту ШИМ при коэффициенте предделителя TMR2 равного (1:1):

Fшим=4000 кГц/(4×(63+1)×1)=15,625 кГц

Для коэффициента предделителя TMR2 (1:4):

Fшим=4000 кГц/(4×(63+1)×4)=3,9 кГц

При коэффициенте (1:16) получим: Fшим=976 Гц.

Используя “левое выравнивание” можно получить наименьшие значения частот ШИМ для заданной частоты тактового генератора, при этом значение длительности импульса загружается только в регистр CCPR1L (в 5-й и 4-й бит CCP1CON записываем нули), как показано на рисунке ниже:

Числовое значение для регистра PR2 составит 0xFF=255, для коэффициентов предделителя TMR2 (1:1; 1:4; 1:16) получим частоты ШИМ 3,9 кГц; 976 Гц; 244 Гц. Подбор частоты путем различного “выравнивания” возможен, если только разрешение ШИМ меньше 10 бит. Таким образом, выбрав требуемое разрешение и варьируя частотой тактового генератора, коэффициентом предделителя TMR2, применяя различное “выравнивание”, можно подбирать различные частоты для ШИМ.

Теперь рассмотрим практическое применение модулей АЦП и ШИМ на основе 8-ми выводного микроконтроллера PIC12F683.

Будем регулировать яркость светодиода мощностью в один ватт при помощи переменного резистора, схема представлена ниже:

Как видно из схемы, измерение напряжения производится на среднем выводе переменного резистора, линия микроконтроллера GP0/AN0 используется в качестве аналогового входа модуля АЦП. Напряжение на среднем выводе переменного резистора варьируется от 0 до 5В, для АЦП используется внутреннее опорное напряжение от источника питания Vdd, то есть 5В. Разрешение АЦП и ШИМ я настроил на 8 бит, это значение очень часто применяется в конструкциях. Полученный после преобразования байт передается в модуль ШИМ, сигнал от которого с вывода GP2/CCP1 передается на затвор полевого транзистора, который коммутирует светодиод.

Код программы представлен ниже, в принципе необходимо только настроить АЦП и ШИМ, а дальше все просто:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;              movlw       b'01100001'     ;установка тактовой частоты микроконтроллера              movwf       OSCCON          ;в 4 МГц, внутренний тактовый генератор              movlw       b'00000000'     ;запись нулей в выходные защелки              movlw       0x07            ;выключение компараторов              movlw       b'11111011'     ;настройка линии GP2 на выход для модуля ШИМ,                movwf       TRISIO          ;остальные линии на вход;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;              bsf         STATUS,RP0      ;установка времени преобразования для АЦП              movlw       b'01010001'     ;Tad = 4мкс (Fosc/16), настройка линии              movwf       ANSEL           ;GP0(AN0) как аналоговый вход для АЦП, остальные              bcf         STATUS,RP0      ;линии цифровые входы              movlw       b'00000000'     ;Установка левого выравнивания результата АЦП,                movwf       ADCON0          ;внутренний источник опорного напряжения от Vdd,                                          ;выбор аналогового канала AN0, преобразование                                          ;не запущено, модуль АЦП выключен;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;              movlw       .255            ;запись числа 255 в регистр периода ШИМ              movlw       .0              ;запись нулей в регистры длительности импульса              movwf       CCPR1L          ;ШИМ, CCPR1L и CCP1CON(5:4)              movlw       b'00000110'     ;установка предделителя TMR2 (1:16)              movwf       T2CON           ;включение таймера TMR2              movlw       b'00001100'     ;включение CCP1 модуля в режим ШИМ                movwf       CCP1CON         ;при этом ранее сброшенные младшие биты (5:4)                                          ;длительности импульса ШИМ не меняем;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;              bsf         ADCON0,ADON     ;включение модуля АЦПbegin         bsf         ADCON0,GO_DONE  ;установка бита GO_DONE регистра ADCON0 для                                          ;запуска преобразования АЦПprov          btfsc       ADCON0,GO_DONE  ;опрос бита GO_DONE              goto        prov            ;бит GO_DONE не равен 0, преобразование не                                          ;закончено, переход на метку prov              movf        ADRESH,W        ;бит GO_DONE равен 0, преобразование закончено,              movwf       CCPR1L          ;копирование значения регистра ADRESH в регистр                                          ;CCPR1L, то есть результат преобразования                                          ;загружаем в регистр длительности импульса ШИМ              call        pause           ;вызов подпрограммы паузы              goto        begin           ;переход на метку begin, для повторного;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;pause         movlw       .130            ;подпрограмма паузы 100 мс              return                      ;выход из подпрограммы

Вначале идет настройка внутреннего тактового генератора микроконтроллера на 4 МГц, запись нулей в выходные защелки, отключение компараторов. Далее настраиваем линию GP2/CCP1 на выход, чтобы использовать ее для ШИМ, остальные линии на вход, в том числе и GP0/AN0 для АЦП, эти настройки производятся в регистре TRISIO, который расположен в 1-ом банке.

Следующим шагом будет настройка модуля АЦП.

В регистре ANSEL (находится в 1-ом банке) устанавливаем время преобразования одного бита Tad равное 4 мкс (Fosc/16), для частоты тактового генератора в 4 МГц из таблицы в даташите микроконтроллера доступно два значения: 2 мкс (Fosc/8) и 4 мкс (Fosc/16).

В этом же регистре настраиваем линию GP0/AN0 как аналоговый вход для правильного функционирования АЦП, остальные линии как цифровые входы. Затем следует настройка регистра ADCON0, где устанавливаем левое выравнивание результата преобразования для регистров ADRESH, ADRESL.

Для 8-ми битного результата считывать будем только регистр ADRESH. Здесь же выбираем внутренний источник опорного напряжения Vdd, при этом модуль АЦП не включаем, и преобразование не запускаем. На этом настройку модуля можно считать завершенной.

Далее настраиваем ШИМ, первым делом устанавливаем период в регистре PR2 (находится в 1-ом банке). Будем использовать 8-ми битный ШИМ с загрузкой длительности импульса с “левым выравниванием”, то есть только в регистр CCPR1L, соответственно в PR2 записываем 0xFF=255.

После этого устанавливаем длительность импульса равной нулю, чтобы после запуска ШИМ вывод GP2/CCP1 оставался в низком логическом уровне, в принципе этого можно и не делать.

Неиспользуемые в данном случае младшие биты (5:4) длительности импульса в регистре CCP1CON должны быть сброшены, иначе получим некорректный результат. В регистре T2CON устанавливаем коэффициент предделителя TMR2 равным (1:16), и запускаем таймер.

Частота ШИМ составит 244 Гц, чего вполне достаточно, для исключения мерцания светодиода. В регистре CCP1CON включаем режим ШИМ, при этом следим чтобы биты (5:4) были сброшены, как было сказано выше. Вот и все, ШИМ настроен и запущен.

Далее идет рабочая программа: включаем модуль АЦП, затем запускаем преобразование установкой бита GO/-DONE, кстати, включение модуля и запуск преобразования должны выполняться разными командами, о чем говориться в даташите.

Путем цикличной проверки бита GO/-DONE, определяем конец преобразования. Копируем результат преобразования из регистра ADRESH в регистр длительности импульса CCPR1L.

Уходим на паузу в 100 мс, после чего переходим на метку begin, для выполнения нового цикла, в принципе все просто.

Ниже представлен видеоролик демонстрирующий работу модулей АЦП и ШИМ. Здесь в вышеприведенную схему я дополнительно добавил цифровое табло на драйвере MC14489AP, для отображения результата измерения модуля АЦП.

Прошивка МК и исходник+модель Proteus 7.7

Последние записи:

Источник: http://radiolaba.ru/microcotrollers/ispolzovanie-moduley-atsp-i-shim-v-mikrokontrollerah-pic16.html

Осваиваем PIC микроконтроллер

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

Для этого сначала необходимо обладать некоторыми знаниями о структуре и функционировании PIC микроконтроллера.

Рассмотрим микроконтроллер PIC16C84 или PIC16F84 фирмы Microchip – миниатюрный, но мощный микроконтроллер.

Наличие FLASH-памяти программ, позволяющей перепрограммировать его буквально за секунды. Типовое количество циклов перезаписи – около 1000. Из его 18-ти выводов 13 могут использоваться как разряды ввода/вывода общего назначения.

Когда они программируются на вывод, то допускают ток “1” до 20мА и ток “0” до 25мА (более чем достаточный для подключения, например, светодиодов).

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

Цоколевка выводов микроконтроллера PIC:

Выводы RA* и RB* – это контакты ввода/вывода, связанные с регистрами микроконтроллера PORTA и PORTB соответственно (RA4 также может быть использоваться как вход внутреннего таймера, а RB0 может быть использован как источник прерываний). VDD и VSS – выводы питания (+Uпит и GND соответственно).

Серия 16×84 работает в широком диапазоне питающих напряжений, но обычно VSS подключен к 0В, а VDD подключен +5В.

Вывод основного сброса /MCLR обычно подключен к VDD (напрямую или через резистор), потому что микроконтроллер содержит надежную схему сброса при включении питания – все, что вам надо, микроконтроллер выполнит сам.

Выводы OSC1 и OSC2 подключаются к генератору тактовой частоты и могут быть сконфигурированы для различных его типов, включая режимы кварца и RC-генератора. Простая схема, которая используется как база для проекта с использованием PIC16C84 представлена на рисунке:

Более наглядная схема:

Схема содержит RC-генератор и один вывод (RB4) подключен к индикатору. Это – все, что необходимо для работы микроконтроллера. Charles Manning (Electronics Australia, April 1996) написал изумительно короткую (6 слов) программу для мигания индикатора, которую вы можете использовать с этой схемой:

LIST    P=16C84
;
MOVLW   0
TRIS    6
OPTION
LOOP    SLEEP
INCF    6, F
GOTO    LOOP
END

Эта программа написана для MPASM. Для использования программы вы должны извлечь ее из этого файла любым редактором, сохранить в другой файл (например LIGHTS.ASM), затем проассемблировать с помощью MPASM (используйте команду “MPASM LIGHTS.ASM”) для получения HEX файла LIGHTS.

HEX, который может быть загружен в микроконтроллер с помощью программатора. Не обращайте внимания на замечания MPASM о том, что использование регистров TRIS и OPTION “не рекомендуется”. Убедитесь в том, что сторожевой таймер “watchdog” включен и выбран RC-генератор.

Если у вас еще нет MPASM, то здесь представлен HEX-вариант приведенной выше программы:

:0C0000000030660062006300860A0328DE
:00000001FF

Программа использует таймаут “watchdog” таймера как как источник синхронизации для определения моментов включения и выключения светодиода; в результате вы можете заставить светодиод вспыхивать с различной частотой, подключая его к различным разрядам порта PORTB (RB0-RB7, выводы 6-13). Это необычное использование “watchdog” таймера.

Обычно “watchdog” таймер используется, чтобы удостовериться, что PIC ведет себя в соответствии с заданной программой, и, если ваша программа специально не сконфигурирована для использования “watchdog” таймера, активизировать его было бы большой ошибкой. Простая программа LIGHTS использует его для выхода из режима “SLEEP” (т.е.

режима “засыпания”); при выходе из этого режима PIC увеличивает содержимое регистра PORTB, что изменяет состояние RB0-RB7 и опять переходит в режим “засыпания” до следующего таймаута “watchdog” таймера.

“Watchdog” таймер синхронизирован внутренним RC генератором, который имеет одинаковый период на всех PIC микроконтроллерах, следовательно, использование “watchdog” таймера для операций со временем гарантирует, что временные задержки будут измеряться стабильно независимо от конфигурации задающего генератора микроконтроллера или используемой частоты (желательно, чтобы частота составляла хотя бы несколько кГц). Это свойство делает программу LIGHTS очень удобной для начального тестирования большинства макетных плат для PIC. Схема может быть изменена для получения значительно большего количества эффектов путем добавления сведодиодов. Подключите первый из них к выводу RB0 (контакт 6), второй – к RB1 (контакт 7), третий – к RB2 (контакт 8) и т.д. Наилучшим вариантом является использование как минимум четырех светодиодов с увеличением до восьми (последний подключить к RB7, т.е. контакт 13). Каждый сведодиод подключается через резистор 470 Ом между ножкой микроконтроллера и “землей”. Следующая программа реализует эффект “бегущего огня”:

; WALKLEDS.ASM LIST P=16C84
; PORTB   EQU     6 TRISB   EQU     86H
OPTREG  EQU     81H
STATUS  EQU     3
CARRY   EQU     0
RP0     EQU     5
MSB     EQU     3               ;номер бита для крайнего слева светодиода
; CLRF    PORTB           ;погасить все светодиды BSF     STATUS,RP0      ;выбрать регистровый банк 1 CLRF    TRISB^80H       ;установить все разряды PORTB на вывод информации MOVLW   0AH MOVWF   OPTREG^80H      ;настроить предварительный делитель в WDT на (1:4) BCF     STATUS,RP0      ;выбрать регистровый банк 0 INCF    PORTB,F         ;включить крайний справа светодиод BCF     STATUS,CARRY    ;очистить флаг CARRY
LEFT    SLEEP                   ;подождать таймаута WDT (“watchdog” таймера) RLF     PORTB,F         ;сдвинуть содержимое индикатора влево BTFSS   PORTB,MSB       ;достигли крайней левой позиции? GOTO    LEFT            ;если нет – цикл
RIGHT   SLEEP                   ;подождать таймаута WDT RRF     PORTB,F         ;сдвинуть содержимое индикатора вправо BTFSS   PORTB,0         ;достигли крайней левой позиции? GOTO    RIGHT           ;если нет – цикл GOTO    LEFT            ;начать новый цикл END

Проассемблируйте эту программу с помощью MPASM для получения ее HEX представления:

:100000008601831686010A3081008312860A031056
:100010006300860D861D08286300860C061C0C28CC
:020020000828AE
:00000001FF

Программа “бегущий огонь” предназначена для использования четырех светодиодов, но вы можете изменять значение MSB для использования большего количества светодиодов: для количества светодиодов 5, 6, 7 и 8 значения MSB должны быть 4, 5, 6 и 7 соответственно.

В программе не используются команды TRIS и OPTIONS, не рекомендованные к применению фирмой MicroChip, т.к. они могут не поддерживаться в будущих микроконтроллерах.

Таким образом, в отличие от предыдущей программы, во время ассемблирования не будут генерироваться предупреждения Для предотвращения генерации MPASM'мом сообщений о корректном использовании регистровых банков необходимо инвертировать старший значащий бит в любом адресе, приходящемся на банк 1 (например, использовать TRISB^80H вместо обычного TRISB, где оператор “^” означает битовое “исключающее ИЛИ”). Это – одна из уловок, которые используются для подавления вывода предупреждающих сообщений MPASM.

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

Она всего лишь предназначена для демонстрации нескольких ключевых идиом и технологий PIC микропроцессоров. Кроме прочего, она содержит обработчик прерываний, процедуры записи и чтения данных встроенного FLASH EEPROM и демонстрирует, как в PIC реализован принцип табличного поиска.

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

По крайней мере, по стилю она больше напоминает “настоящую” программу для микроконтроллера.

; PATTERN.ASM ; Программа разработана для демонстрации процедур чтения/записи данных EEPROM и обработки
; прерываний таймера. Таблица значений записана в EEPROM процессор выполняет “холостой” ; цикл. Когда таймер переполняется, происходит прерывание работы процессора и следующее ; значение таблицы считывается из EEPROM и записывается в порт B, т.е. отображается на ; светодиодах. С помощью изменений в таблице может быть изображен любой образец длиной до
; 64 значений.
; ; Copyright (C) 1997 David Tait (david.taitman.ac.uk) PROCESSOR 16C84 __CONFIG  03FF3                 ; RC генератор PCL     equ     2
STATUS  equ     3                       ; адреса стандартных регистров
PORTB   equ     6
EEDATA  equ     8
EEADR   equ     9
INTCON  equ     0BH
OPTREG  equ     081H
TRISB   equ     086H
EECON1  equ     088H
EECON2  equ     089H RP0     equ     5
Z       equ     2
GIE     equ     7
T0IE    equ     5
T0IF    equ     2
WREN    equ     2
WR      equ     1
RD      equ     0 #define bank0   bcf STATUS,RP0          ;выбрать Bank 0
#define bank1   bsf STATUS,RP0          ;выбрать bank 1 magic   macro                           ;”магическая” последовательность записи в EEPROM movlw   55H            movwf   EECON2^80H movlw   0AAH movwf   EECON2^80H endm cblock  0CH                     ;блок переменных n_vals n_tmp endc ;**********************************; ; Основная точка входа в программу ; ;**********************************; org     0 goto    start ;**************************; ; Точка входа в прерывание ; ;**************************; org     4 ; Обычно содержимое необходимо сохранять перед процедурой обработки прерывания и ; восстанавливать после нее, но в данной программе в этом нет необходимости, т.к.
; процессор ничего не делает между прерываниями. Смотрите PIC datasheet для ; рекомендуемой процедуры. movf    EEADR,w xorwf   n_vals,w btfsc   STATUS,Z                ;EEADR == n_vals?            clrf    EEADR                   ;если да, то начать с нуля call    ee_rd                   movf    EEDATA,w                ;читать EEPROM movwf   PORTB                   ;отобразить байт incf    EEADR,f                 ;новый адрес bcf     INTCON,T0IF             ;очистить флаг прерывания retfie start   clrf    PORTB bank1 clrf    TRISB^80H               ;все разряды порта B на вывод movlw   B'00000111' movwf   OPTREG^80H              ;таймер 0 предварительный делитель 256:1 bsf     EECON1^80,WREN          ;разрешить запись в EEPROM bank0 call    ee_init                 ;пересылка таблицы в EEPROM bank1 bcf     EECON1^80H,WREN         ;запретить запись в EEPROM bank0 bsf     INTCON,T0IE             ;разрешить прерывания от таймера bsf     INTCON,GIE              ;разрешить все прерывания loop    goto    loop                    ;”холостой” цикл ; ee_init
;
; инициализация EEPROM из таблицы ee_init clrw call    lut                     ;получить кол-во элементов в таблице movwf   n_vals                  ;и сохранить movwf   n_tmp                   ;сохранить еще раз clrf    EEADR decf    EEADR,f                 ;EEADR = -1
ee_in1  incf    EEADR,f                 ;следующий адрес movf    EEADR,w addlw   1 call    lut                     ;получить соответствующее значение таблицы movwf   EEDATA call    ee_wr                   ;запись в EEPROM decfsz  n_tmp,f                 ;есть еще? goto    ee_in1                  ;да clrf    EEADR                   ;нет, завершить return ; lut
;
; просмотр таблицы lut     addwf   PCL,f                   ;добавить W к PCL для получ. адреса эл-та таблицы retlw   D'12'                   ;число элементов в таблице retlw   B'1000'                 ;первый элемент retlw   B'1000' retlw   B'0100' retlw   B'0100' retlw   B'0010' retlw   B'0010' retlw   B'0001' retlw   B'0001' retlw   B'0010' retlw   B'0010' retlw   B'0100' retlw   B'0100'                 ;последний элемент ; ee_wr
;
; Записать байт из EEDATA в EEPROM по адресу в EEADR. Прерывания
; должны быть запрещены перед вызовом ee_wr. ee_wr   bank1 magic                ;вызов “волшебной” последовательности bsf     EECON1^80H,WR           ;начать запись
ee_wr1  btfsc   EECON1^80H,WR           ;запись завершена? goto    ee_wr1                  ;нет bank0 return ; ee_rd ; ; Прочитать байт EEPROM из EEPROM по адресу EEADR в EEDATA ee_rd   bank1 bsf     EECON1^80H,RD           ;начать запись bank0 return                          ;при возвращении чтение должно быть завершено end

Это HEX файл, сформированный MPASM (запишите его как PATTERN.HEX):

:020000000E28C8
:0800080009080C060319890127
:10001000442008088600890A0B110900860183160E
:10002000860107308100081583121C2083160811F1
:1000300083128B168B171B2800012C208C008D003F
:1000400089018903890A0908013E2C2088003A2089
:100050008D0B22288901080082070C3408340834EB
:1000600004340434023402340134013402340234DE
:1000700004340434831655308900AA30890088146A
:100080008818402883120800831608148312080079
:02400E00F33F7E
:00000001FF

При использовании моего программатора это может быть выполнено с помощью следующей команды:

PP PATTERN.HEX                               (PP V-0.4)
TOPIC -G PATTERN.HEX                         (TOPIC V-0.2)

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

Источник: http://radioded.ru/skhema-na-mikrokontrollere/osvaivaem-pic-mikrokontroller

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}