Брелок-нетеряйка на pic-контроллере

PIC Урок 12. Модуль CCP. Режим захвата. ИК-пульт. Часть 1

Следующая периферия микроконтроллера PIC, которую мы начнём сегодня изучать – это модуль CCP, чья аббревиатура расшифровывается как CAPTURE/COMPARE/PWM (Захват / сравнение / ШИМ). Таких модулей в нашем контроллере два и у каждого модуля разное назначение.

Compare (сравнение) не следует путать с аналоговым компаратором, для этого есть отдельный модуль.

Каждый модуль CCP содержит 16-разрядный регистр CCPx, который может использоваться для захвата, сравнения, а также для ШИМ, только для ШИМ он будет делиться на два восьмиразрядных.

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

Захват TIMER1
Сравнение TIMER1
ШИМ TIMER2

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

Условия совместного использования

У каждого из модулей CCP есть регистр управления CCPxCON (CCP1CON и CCP2CON).

Рассмотрим назначение его битов

7-6: не используются.

5-4: CCPxX:CCPxY (PWM Least Significant bits): Младшие биты длительности импульса ШИМ. В режимах захвата и сравнения не используются. В режиме ШИМ здесь находятся 2 младших бита длительности импульса. Остальные 8 старших бит (так как ШИМ 10-разрядный) находятся в регистре CCPRxL.

3-0: CCPxM3:CCPxM0 (CCPx Mode Select bits): Режим работы модуля CCP. Возможны следующие комбинации данных битов:

0000: модуль выключен (сброс модуля CCPx);

0100: Захват по каждому заднему фронту;

0101: Захват по каждому переднему фронту;

0110: Захват по каждому 4-му переднему фронту;

0111: Захват по каждому 16-му переднему фронту;

1000: Сравнение. Устанавливается выходной сигнал (устанавливается флаг CCPxIF);

1001: Сравнение. Выходной сигнал сбрасывается (устанавливается флаг CCPxIF);

1010: Сравнение. На выходной сигнал влияния не происходит (устанавливается флаг CCPxIF);

1011: Сравнение. Триггер специальных функций (устанавливается флаг CCPxIF);

11xx: Режим ШИМ.

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

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

Захват может происходить по четырём видам событий, которые мы уже увидели в настройках битов 3-0 регистра CCPxCON.

После того, как произойдёт захват, флаг CCPxIF будет установлен и должен быть сброшен программно.

Также при возникновении события захвата регистр TMR1 не сбрасывается, поэтому таймер 1 может быть использован ещё и для других целей.

Ещё при возникновении события захвата значения регистра TMR1 переписывается в регистровую пару CCPRx.

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

Посмотрим структурную схему модуля CCP в режиме захвата

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

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

Также мы можем воспользоваться предделителем, встроенным в модуль CCP. Воспользоваться мы им можем, выбрав определённую комбинацию битов CCPxM3:CCPxM0.регистра CCPxCON. Его целесообразно использовать, когда частота входных импульсов постоянна.

В принципе, знакомство с модулем CCP и его режимом захвата мы вроде бы завершили.

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

Передача данных способом инфракрасного излучения, а также управление устройствами с помощью такой передачи данных, используются повсеместно. Именно такой способ передачи данных для дистанционного управления различными устройствами был выбран по причине того, что ИК-излучатели (ИК-светодиоды) экономичны, безынерционны и недороги. Также приёмники ИК-сигналов имеют те же самые характеристики. Есть ещё очень немало плюсов такой передачи – низкое влияние на здоровье людей, также невозможность проходить сквозь стены позволяет не оказывать помехи на другие устройства, а ещё ИК-лучи невидимы и не отвлекают нас от других забот. Вот сколько плюсов.

Сигналы по ИК-интерфейсу передаются как правило на частоте 30-50 кГц. Это несущая частота. В неё уже модулирован цифровой последовательный сигнал. Задача приёмника – извлечь его из несущей частоты. Затем мы уже цифровой сигнал, усиленный до определённой величины, подаём от приёмника какой-нибудь ножке порта и начинаем исследовать данный сигнал. Это делается либо программным путём либо так, как мы будем делать на данном занятии – путём использования ножки захвата таймера.

Цифровой последовательный сигнал, передаваемый от ИК-пульта бывает нескольких типов, поэтому также существует несколько протоколов. Данных протоколов очень много, но больше всего используются протоколы RC-5 и NEC, причём последний гораздо чаще. Поэтому мы пока и остановимся на данных протоколах, а в проекте будем использовать только последний, так как он больше всего используется и гораздо проще в распознавании с помощью захвата таймера, который может работать только по одному типу изменения сигнала (фронту или спаду).

Тем не менее мы всё же познакомимся и с протоколом RC-5, и с него мы и начнём.

В протоколе RC-5 каждая посылка включает в себя 14 информационных бит.

Это 2 стартовых бита (или 1 для протокола RC-5X). Данные биты всегда равны 1. Затем идёт 1 управляющий бит. Его значение меняется при каждой посылке, чтобы распознать чётность, так как посылок может быть несколько, если мы будем удерживать кнопку. Этот бит придуман для того, чтобы определить, что это идёт код от той же кнопки. Затем идут 5 бит адреса устройства. А по окончанию следуют 6 бит кода команды (или 7 для протокола RC-5X).

Каким же образом отличаются биты друг от друга (0 от 1)?

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

Давайте посмотрим сначала отдельно, как передаётся бит 0

А вот так передаётся бит 1

То есть если после 1 будет передаваться опять 1, то в начале периода передачи 2-го бита установится сигнал в 1. А если после 1 будет передаваться 0, то уровень сигнала в начале периода передачи 2-го бита не изменится.

Хотя мы сегодня будем писать проект под протокол NEC, мы всё равно посмотрим, как именно работает и протокол RC-5.

Для того, чтобы визуально оценить поступление сигналов от ИК-пульта, мы подключим логический анализатор.

Следует отметить также немаловажное преимущество отладочной платы, которую мы используем – это наличие в ней ИК-приёмника

Цифровой выход с данного приёмника подключается к ножке RC2 через перемычку

Вот эта перемычка на плате

Также, как мы все знаем, одним из условий того, чтобы поработать с передачей информации по ИК-интерфейсу, является наличие ИК-пульта дистанционного управления. Обычно в подобных уроках я всегда наблюдаю работу с пультами, которые присутствуют в стандартных наборах Arduino и прочих наборах. Я решил сломать эти стереотипы и не стал покупать такой пульт, а воспользовался готовыми, то есть теми, которые у меня есть в наличии. Нашлось таких целых 7 пультов при условии, что это ещё не все мои пульты. Причём оказалось так, что они все передают с помощью протокола NEC.

Но как же нам тогда поиграть с протоколом RC-5?

Однажды, путешествуя по одному из известных гипермаркетов в нашем областном центре, я набрёл на один дистанционный пульт, который стоил почти 500 рублей, но в тот момент была скидка и он стоил 100 рублей. Грех было его не приобрести. Также меня подкупила надпись, что он может управлять одновременно 12-ю устройствами. С ним также было руководство по эксплуатации, в котором всё подробно описывать, как менять коды устройств. Правда, ни к одному из существующих бытовых и прочих устройств, находящихся у меня в наличии, данный пульт я так и не приспособил, цена вопроса себя окупила с лихвой. Изменяя различные коды устройств, можно было поработать с разными протоколами, что меня даже больше заинтересовало, чем использование пульта по его прямому назначению.

Выглядит данный пульт следующим образом

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

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

Также подключим к логическому анализатору общий провод

Теперь мы можем, вообще не используя контроллер посмотреть изменение сигнала на цифровом выходе ИК-приёмника.

Переведём наш пульт на код 102 и нажмём, например, на кнопку POWER, направив пульт на приёмник, запустив перед этим программу логического анализа, в результате чего получим следующий график

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

Теперь, я думаю, всё прояснилось.

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

В следующей части урока мы изучим протокол передачи данных NEC, напишем проект для распознавания адреса и команды посылки от ИК-пульта, а также проверим наш код на практике, используя несколько ИК-пультов дистанционного управления.

Читайте также  Как правильно провести проводку в гараже?

Купить программатор (неоригинальный) можно здесь: PICKit3

Купить программатор (оригинальный) можно здесь: PICKit3 original

Отладочную плату PIC Open18F4520-16F877A можно приобрести здесь: PIC Open18F4520-16F877A

Дисплей LCD 20×4 можно приобрести тут: Дисплей LCD 20×4

Смотреть ВИДЕОУРОК (нажмите на картинку)

Брелок-нетеряйка на PIC-контроллере

Брелок-нетеряйка весьма удобная вещь. Стоит только громко свиснуть или хлопнуть в ладоши и потерянная связка с ключами «отзовется». Однажды мне попалась на глаза схема подобного устройства, собранного на транзисторах и дискретной логике. Аналоговая часть состояла из НЧ усилителя, собранного на 2х супер-бэта транзисторах раной структуры – КТ3102 и КТ3107, цифровая – из микросхем инверторов и логики «и-не» серии К564.

Я решил переделать данное устройство с целью уменьшения его габаритов, а так же облегчения его наладки. Аналоговую часть я оставил как есть без изменений, а в качестве цифровой – применил микроконтроллер младшего семейства линейки Microchip — PIC12F629.

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

Запустил звуковой редактор «Cool edit» в двух окнах. В первом окне я программно сгенерировал несколько частот от 1000 Гц до 10000 Гц, во втором окне настроил запись с микрофонного входа. Включив запись и одновременно запустив во втором окне тестовые частоты на проигрывание через динамики компьютера, я наблюдал отклик пьезоэлемента. И вот, что я получил в итоге:

Как видно из скриншотов: максимум отклика достигается на частоте близкой к 5000 Гц.

Т.е. эта частота является резонансной частотой для данного пъезоизлучателя. Можно предположить, что максимум излучения звуковой частоты этим излучателем будет так же лежать в диапазоне 5000 Гц.

Модифицированная схема брелка-нетеряйки выглядит следующим образом:

Устройство работает так: в режиме ожидания на порту GP0 микроконтроллера присутствует лог. «1», а на порту GP2 – лог. «0». Таким образом аналоговая часть работает в режиме усилителя звуковой частоты. Сигнал от пьезоэлемента подается на базу первого транзистора КТ3102 Б. Смещение на базу подается через резистор 3,3 М. С коллекторной нагрузки первого транзистора сигнал через развязывающую емкость подается на базу второго транзистора обратной структуры. Его база приоткрыта резистором 2 М. С коллекторной нагрузки второго транзистора усиленный сигнал подается через емкость 510 пФ на порт GP1 контроллера. Резистор 20 К совместно с емкостью выполняет роль дифференцирующей цепочки, что снижает реакцию усилителя на посторонние шумы.

При поступлении громкого сигнала свиста либо хлопка в ладоши на выходе усилителя появляется напряжение, которое поступает на порт GP1 контроллера. Контроллер «просыпается», изменяет напряжения на порту GP0 на противоположные, а через порт GP2 начинает генерировать напряжение звуковой частоты – пакеты длительностью 200 mS, заполненные частотой 5000 Гц, с интервалами в 100 mS. Всего 10 пакетов общей длительностью около 3 S. Наличие диода в базовоколлекторном переходе первого транзистора позволяет сигналу проходить через пьезоизлучатель. Диод необходимо подобрать по наименьшему сопротивлению в прямом состоянии, в этом случае сигнал будет звучать громче.

Устройство питается от двух таблеточных батареек общим напряжением 3 В.

О программе: в контроллере задействован внутренний тактовый генератор на 4 МГц. В режиме ожидания контроллер находится в спящем состоянии и потребляет ток примерно 4 мкА, не считая потребления от портов питания усилителя. В общем, суммарный ток потребления в режиме ожидания не превышает 100 мкА. В программе реализовано прерывание по изменению состояния порта GP1. Сразу после пробуждения и сброса флага прерывания от порта, запрещаются дальнейшие прерывания от порта, изменяется уровень логики на GP0 и начинается генерация частотнозаполненных пакетов. Пакеты формируется посредством простых циклов. После окончания формирования звуковых пакетов контроллер устанавливает первоначальное состояние на портах питания усилителя, разрешает прерывания от GP1 и уходит в сон…

Основные моменты программы

Для разрешения прерываний от периферии необходимо настроить регистр INTCON.

Это можно сделать сразу в подпрограмме инициализации:

Здесь установлен быт разрешения глобальных прерываний и прерываний от портов

Непосредственно разрешить прерывания от конкретного порта можно в регистре IOCB.

Нужно, при этом, помнить что IOCB находится в первом банке памяти!

Программа устанавливает GP0 в «1», GP2 в «0», т.е. включает аналоговую часть устройства в режим микрофона, разрешает прерывания от порта GP1 и уходит в сон.

При пробуждении от прерывания программа запрещает прерывание от GP1 и устанавливает на GP0 «0», т.е. отключает питание усилителя.

Вход в прерывание:

Необходимо выполнить чтение порта, чтобы исключить несоответствие и сбросить флаг прерывания.

Генерирование сигнала (отклик брелка):

Происходит чисто программно, без использования прерываний. Задержки формируются посредством вложенных циклов. Цикл реализованный на переменной «TEMP» формирует задержку, равную половине периода частоты 500 Гц (т.е. 1 миллисекунда). После выполнения задержки порт GP2 изменяет свое состояние на противоположное и т.д…

Цикл реализованный на переменных «TEMP1» и «TEMP2» формирует повторение внутреннего цикла на «TEMP» в течении 200 миллисекунд.

Пауза формируется все теми же вложенными циклами:

Объединив оба блока (звук + пауза) в один и задав количество повторений через переменную «TEMP3» равную 10 получаем:

Таким образом будет сформирован прерывистый звуковой сигнал частотой 500 Гц, длительностью 200 миллисекунд с интервалом следования 100 миллисекунд. Всего 10 пакетов. Общей длительностью: (0,2+0,1)х10 = 3 секунды

При повторении устройства крайне важно подобрать транзисторы по наибольшему коэффициенту усиления: КТ3102 – не менее 500, КТ3107 – не менее 1000. Допускается использовать любые другие маломощные низкочастотные транзисторы с подобными коэффициентами усиления. Наладка устройства сводится к подбору резисторов смещения на базы усилительных каскадов по наибольшему усилению сигнала.

Текст программы в MPLAB и прошивка в HEX файле

Брелок-нетеряйка на pic-контроллере

Микроконтроллерный тестер UTP в спичечном коробке.

Автор: Настя
Опубликовано 01.01.1970

Дорогой РадиоКот, поздравляю тебя с 3-х летием.
Желаю тебе процветания, здоровья и долгих лет жизни.
Считается, что самые ценные подарки в маленьких коробочках.
И я тебе дарю маленькую коробочку, но не простую, а с сюрпризом.

Для нас не будет открытием, что каждый посетитель сайта «РадиоКот» имеет компьютер и выход в интернет. Большая часть компьютеров подключена к интернету через интерфейс типа Ethernet. А кто не имеет выхода в интернет, так или иначе может быть включён в локальные сети через интерфейс Ethernet. И количество таких соединений с каждым днём растет.
Соединение через Ethernet предполагает электрическое соединение через кабель UTP, который иначе называют витой парой (четыре свитых пары проводников). Кабель заделывается в типовую розетку или оконцовывается вилкой типа RJ-45. Существуют определенные стандарты нумерации проводников по цветам в разъеме. Это связано электрическими и физическими характеристиками UTP-кабеля (например, количество свивок на метр в каждой паре различен). Эти «сложности» я не буду здесь рассматривать. На рисунке приведена раскладка по цветам.

Существует две разновидности заделки кабеля:

568В – компьютер-концентратор (прямой кабель) и
568А – компьютер-компьютер (перекрестный кабель).

Для тестирования таких соединений существует большое множество устройств разного функционального наполнения и разного ценового диапазона. Профессиональные тестеры позволяют измерить длину кабеля, затухание сигнала в нём и т.п. Но как показывает практика, дешевле собрать собственное устройство, которого по сути достаточно для тестирования небольших сетей.
В Интернете много схем тестеров UTP. Как правило, они представляют связку генератора и двоично-десятичного счетчика (жёсткая логика). Я пыталась сделать нечто подобное, но остановилась на этапе разводки печатной платы. Ни один из моих вариантов рисунка платы мне не нравился. Да и конструкция не выглядела убедительной и удобной. В итоге я приняла решение сделать тестер на микроконтроллере, т.к. это будет наиболее оптимальная конструкция с точки зрения схемотехники. И этим тестером я и мои друзья пользуются почти год.

Данный тестер позволяет проверять правильность последовательности заделки проводников, обрыв проводников, короткие замыкания. Это минимальный и достаточный набор функций, который позволит наверняка сделать вывод об исправности сетевого соединения.
Итак, это два бескорпусных устройства. Собственно сам тестер и «заглушка». Заглушка используется для тестирования кабеля, если концы кабеля, например, в разных комнатах. Микроконтроллер PIC16F84A запитывается напрямую через нормально разомкнутую тактовую кнопку. Использована дешевая алкалиновая батарейка типа «Космос» напряжением 12В. Такие батарейки используются в брелках автомобильных сигнализаций. У Вас, как и у меня в свое время, возникли сомнения по поводу правильности питания. Я согласна с этим, но никаких критических ситуаций за все время эксплуатации не возникало. Работает по принципу – батарейку впаяла и забыла. Можно использовать более современные и более дешевые контроллеры с внутренним тактированием, но этот контроллер мне было жалко выкидывать, т.к. в нём я «убила» все линии порта А во время других разработок. Это питание работает и с другими микроконтроллерами. Розеточные разъемы типовые, демонтированные из Б/У розеток.

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

Микроконтроллеры PIC для начинающих

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

Что такое PIC

PIC – это название серии микроконтроллеров, которые производятся компанией Microchip Technology Inc (США). Название PIC происходит от Peripheral Interface Controller.

Микроконтроллеры PIC имеют RISC-архитектуру. RISC – сокращённый набор команд, используется также в процессорах для мобильных устройств. Есть целый ряд примеров её использования: ARM, Atmel AVR и другие.

Компания Microchip в 2016 году купила Atmel – производителя контроллеров AVR. Поэтому на официальном сайте представлены микроконтроллеры семейства и PIC и AVR.

Семейства

Среди 8-битных микроконтроллеров PIC она состоит из 3-х семейств, которые отличаются архитектурой (разрядностью и набором команд).

Читайте также  Как спрятать проводку на стене?

Baseline (PIC10F2xx, PIC12F5xx, PIC16F5x, PIC16F5xx) ;

Mid-range (PIC10F3xx, PIC12F6xx, PIC12F7xx, PIC16F6xx, PIC16F7xx, PIC16F8xx, PIC16F9xx) ;

Enhanced Mid-range (PIC12F1xxx, PIC16F1xxx) ;

High-end или PIC18 (18Fxxxx, 18FxxJxx and 18FxxKxx).

Характеристики, которых приведены в таблице ниже.

Кроме 8 битных микроконтроллеров компания Microchip производит 16-битные:

DsPIC30/33F для обработки сигналов.

Представители 16-битного семейства работают со скоростью от 16 до 100 MIPS (выполнено миллионов инструкций в секунду). Стоит отметить и особенности:

машинный цикл – 2 такта;

разрядность АЦП – 16 бит;

поддерживают ряд протоколов связи (UART, IrDA, SPI, I2S™, I2C, USB, CAN, LIN and SENT), ШИМ и прочее.

Также есть семейство 32 битных микроконтроллеров – PIC32MX, основные особенности:

работают на частоте до 120 мГц;

выполняют до 150 MIPS;

АЦП: 10-бит, 1 Msps (скорость квантования), до 48 каналов.

С какого PIC начать?

Новичкам стоит начать осваивать микроконтроллеры PIC с 8-битной линейки. Вообще, производитель заявляет о том, что особенностью всего семейства является лёгкая переносимость программ с одного семейства на другое и совпадения цоколевки ряда моделей.

Одним из популярнейших в среде радиолюбителей микроконтроллеров является PIC16f628A. Его технические характеристики такие:

Есть встроенный тактовый генератор. Вы можете настроить для работы с частотой 4 или 8 МГц;

18 пинов, из них 16 – ввод/вывод, а 2 – питание;

Для работы на частотах до 20 МГц можно подключить кварцевый резонатор, но в этом случае на ввод/вывод останется не 16, а 14 ног;

В маркировке есть буква F, это значит, что используется FLASH-память, объёмом в 2048 слов;

14-битные инструкции, 35 штук;

4 аналоговых входа;

На входах PORTB есть подтягивающие резисторы;

Два 8-битных таймера и один 16-битный;

Машинный цикл – 4 такта кварцевого резонатора или внутреннего генератора);

128 байт EEPROM;

USART – последовательный порт;

внутренний источник опорного напряжения;

питается от 3.3 до 5 В.

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

Какая цоколевка у 16f628 изображено ниже:

Блочная внутренняя схема этого микроконтроллера изображена ниже.

На что следует обратить внимание на схеме в первую очередь?

У этого микроконтроллера есть два порта PORTA и PORTB. Каждый пин, каждого из них может использоваться как вход и выход, а также для подключения периферии или задействования других модулей микроконтроллера.

Рассмотрим эту часть схемы крупно.

Например, порты RB0-RB3 – могут выступать в роли аналоговых. К RA6, RA7 в случае необходимости подключается источник тактирования (кварцевый резонатор). Сами же выводы микроконтроллера настраиваются в режим входа/выхода с помощью регистра TRIS.

Для этого есть команды типа:

TRISA = 0; // Все выводы порта А устанавливаются как выходы
TRISB = 0xff; // Все выводы порта B назначаются как входы
TRISA0 = 1; // Так назначается отдельный пин как вход (1) или выход (0)
TRISA5 = 1 ; // здесь 5 вывод порта А – назначен входом

Вообще режимы работы, включение WDT (сторожевого таймера) выбор источника тактирования микроконтроллера и прочее настраивается с помощью регистров специального назначения — SFR, а память и данные хранятся в GFR – простыми словами это статическое ОЗУ.

В официальном Datasheet, на страницах 18-21 вы найдете 4 банка памяти регистров специального назначения SFR и регистров общего назначения GFR. Знание регистров важно, поэтому распечатайте и выучите указанные страницы из Datasheet .

Для удобства ниже приведены эти таблицы в виде картинок (нумерация регистров, как и всё в цифровой электронике начинается с 0, поэтому номер четвертого – 3).

Как подключить и на каком языке программировать?

Чтобы запустить этот микроконтроллер достаточно подать плюс на Vdd и минус на Vss. Если нужен кварцевый резонатор, то он подключается к выводам 16 и 15 (OSC1 и OSC2) микроконтроллера PIC16f628, для других контроллеров с большим или меньшим числом выводов – смотрите в datasheet. Но этот момент нужно указывать при программировании и прошивке.

Кстати о переносимости и совпадении цоколевки – на 16f84A – она аналогична, и на многих других.

Фрагмент схемы с подключенным к pic16f628a внешним резонатором:

Есть два основных языка для программирования микроконтроллеров PIC – это assembler и C, есть и другие, например PICBasic и т.д. Еще можно выделить упрощенный язык программирования JAL (just another language).

Для примера ниже приведена программа для «мигания светодиодом» — своего рода «Hello World» для микроконтроллера PIC на языке C.

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

В функции main(void) в начале устанавливаются начальные параметры, подобно тому как мы это делали в функции Void setup () – в статьях об ардуино. Далее в строках 11-16 объявляется бесконечный цикл while(1), в ходе которого и выполняется программа «мигания светодиодом».

В примере состояние порта постоянно инвертируется, т.е. если он был в «0», то перейдет в «1» и наоборот. На C для PIC есть следующие команды управления команды:

PORTA = 0; // переводит все пины порта А в низкий уровень (лог. 0)
PORTB = 0xff; // переводит все пины порта B в высокий уровень (лог. 1)
RB5 = 1; // На пятом выводе порта B высокий уровень

А так выглядит та же программа, но уже на языке JAL, я перевел на русский язык комментарии от разработчиков встроенных примеров в JALedit (среда разработки).

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

В чем работать

Если сказать совсем обобщенно для работы с любыми микроконтроллерами нужно:

1. Текстовый редактор.

3. Программа для загрузки прошивки в микроконтроллер.

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

Например, в цикле статей об Arduino мы рассматривали среду Arduino IDE в ней же мы и код писали и с её помощью «заливали» прошивку в «камень». Для микроконтроллеров PIC есть такие программы, как:

MPASM — используется для разработки на языке Assembler от фирмы Microchip ;

MPLAB — также IDE от Microchip для PIC-контроллеров. Состоит из множества блоков для тестирования, проверки, работы с кодом и компиляции программ и загрузки в микроконтроллер. Также есть версия MPLAB X IDE – отличается большим функционалом и построена на базе платформы NetBeans ;

MikroC — универсальная среда (не только для ПИКов) для разработки. Как видно из названия «заточена» под программирование на C, а также есть такие программы как MikroBasic и MikroPascal, для соответствующих языков ;

JALedit — подходит для языка JAL, о котором мы упоминали выше ;

И ряд других менее известных.

Как прошивать микроконтроллер?

Для PIC-микронотроллеров есть ряд программаторов. Официальным считается PICkit. Их 4 версии. Но можно прошивать и универсальными, например, TL866 (он поддерживает почти всё, что может понадобится начинающему радиолюбителю, при этом очень дешевый).

Также в сети есть ряд различных схем программаторов для ПИКов, как для работы через COM-порт:

Так и через USB (на самом деле тоже com, только через преобразователь на ИМС MAX232).

Заключение

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

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

Катцен С. — PIC-микроконтроллеры. Все что вам необходимо знать;

Кёниг А. — Полное руководство по PIC микроконтроллерам;

Шпак Ю.А. — Программирование на языке С для AVR и PIC микроконтроллеров;

Магда Ю.С. — Микроконтроллеры PIC: архитектура и программирование;

Яценков В.С. — Микроконтроллеры Microchip. Практическое руководство.

Любите умные гаджеты и DIY? Станьте специалистом в сфере Internet of Things и создайте сеть умных гаджетов!

Записывайтесь в онлайн-университет от GeekBrains:

Изучить C, механизмы отладки и программирования микроконтроллеров;

Получить опыт работы с реальными проектами, в команде и самостоятельно;

Получить удостоверение и сертификат, подтверждающие полученные знания.

Starter box для первых экспериментов в подарок!

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

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

Программируемый таймер на PIC16F628A

Цифровой программируемый таймер – это устройство для управления включением/выключением внешних устройств по заданной программе.

Устройство собрано на 8-разрядном микроконтроллере Microchip PIC16F628A. Пользователь программирует устройство на включение и выключение нагрузки в определенное время. Другими словами, пользователь может указать время включения устройства и продолжительность его работы. Максимальный временной интервал для каждой операции (включение/выключение) составляет 99 часов 59 минут.

В устройстве для управления используется 4-х кнопочная клавиатура, для отображения текущих настроек и параметров установлен 2-строчный ЖК дисплей на базе контроллера HD44780.

Принципиальная схема устройства

Для управления нагрузкой в устройстве используется 5 В реле, управляемое транзистором PN2222. В свою очередь, транзистором управляет микроконтроллер по линии ввода/вывода RB3. Клавиатура подключена к выводам порта RA2, RA3, RA4 и RB0. Назначение кнопок мы рассмотрим ниже.

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

Читайте также  Фототир из лазерной указки

Установлен интегральный регулятор напряжения LM7805, для питания таймера используется внешний 9 В блок питания.

На схеме видно, что выводы 15 и 16 ЖК индикатора не подключены. Они используются в индикаторах с фоновой подсветкой. Если вы будете использовать индикатор с подсветкой, то вы можете подключить ее к источнику питания через гасящий резистор номиналом 39 Ом.

Внешний вид устройства собранного на макетной плате

Настройка и работа с устройством

Как уже было отмечено выше, все настойки таймера выполняются с клавиатуры.

  • кнопка «ON/OFF Time»
    Таймер позволяет устанавливать время включения и время выключения. При включении таймера проходит инициализация, и оба временных параметра (время включения и время выключения) имеют значение 0. Нажимая на данную кнопку, можно переключаться между этими параметрами;
  • кнопка «Select»
    С помощью данной кнопки пользователь может переключаться между значениями выбранного параметра (часы, минуты времени включения и выключения). Инкрементирование значения происходит по нажатию кнопки «ON/OFF Time»;
  • кнопка «Enter»
    Когда нужные значения параметров установлены, данной кнопкой пользователь подтверждает их сохранение;
  • кнопка «Start/Stop»
  • Кнопка предназначена для запуска/остановки таймера. Если таймер включен, то нажатием этой кнопки его можно остановить в любой момент времени.

Демонстрация работы таймера.

В этом ролике мы видим, что пользователь задает временной интервал выключенного состояния внешнего устройства — 2 минуты, а временной интервал включенного состояния – 20 минут. По нажатию копки «Start/Stop» таймер начинает отсчет времени выключенного состояния. По окончании этого интервала срабатывает реле и начинается отсчет времени включенного состояния.

Программное обеспечение для микроконтроллера разработано с применением компилятора MicroC Pro для PIC микроконтроллеров.

Загрузки

Исходный код – скачать
HEX файл для прошивки микроконтроллера – скачать

Перевод: Vadim по заказу РадиоЛоцман

Брелок-нетеряйка на pic-контроллере

Здесь резистор и конденсатор образуют RC-цепь. Постоянная времени такой цепи τ = R · C В качестве сенсора выступает любая проводящая пластинка, или полоска фольги — она также обладает некоторой, пусть и очень малой, емкостью, порядка нескольких пикофарад. Время τ, за которое такая пластинка зарядится, при резисторе в 1 МОм составляет примерно несколько микросекунд. Очень маленькая величина, однако, для микроконтроллера, работающего на частоте 10 МГц, успеет пройти десяток тактов. Теперь представим, что пластинки коснулся человек. Его емкость на пару порядков выше емкости пластинки и составляет несколько сотен пикофарад. Следовательно, время, за которое пластинка зарядится, существенно возрастет. Исходя из этого можно сделать вывод о прикосновении к сенсору. Алгоритм опроса сенсора следующий:

  1. Изначально на пин RB0 подан логический 0. Таким образом, ток течет от источника питания через мегаомный резистор в пин. Если сенсор был заряжен, то заряд с него также будет стекать в пин RB0.
  2. В момент опроса мы переключаем пин с выхода на вход (подтяжки отключены!). В этот момент пин переходит в высокоимпедансное состояние, с сопротивлением порядка нескольких десятков МОм. Ток в направлении пина практически прекращает течь, и начинает течь в сторону сенсора. Как только сенсор зарядится до напряжения уровня логической 1, данный вход микроконтроллера покажет единицу.
  3. Измерив время, которое прошло с момента перевода RB0 в высокоимпедансное состояние до появления на нем единицы, можно сделать вывод об изменении емкости сенсора.

Весь код умещается в две простейшие функции (в моём варианте использовался порт RB на МК PIC18F2580): // При использовании другого порта указывайте соответствующие TRIS и LAT
// Пример опроса: button = CallibrateButton(0, &button_open_time);
// Здесь button_open_time — глобальная переменная, адрес которой передаётся в функцию
// Обратите внимание! Здесь в функцию должен передаваться именно адрес переменной, а не её значение!

void CallibrateButton(unsigned char button_id, unsigned int open_button_time) < // Калибровка проводится для оценки времени заряда сенсора без прикосновения
// Так как в моём случае я использую порт B, нужно убедиться, что перед началом опроса он работает как Digital Out
// Состояние порта B в PIC18F2580 зависит в том числе и от регистра ADCON1
ADCON1 |= 0b00001000;
TRISB &=

(1 // Порт на выход
LATB &=

(1 // В порт ноль
__delay_us(200); // Ждём пока сенсор разрядится
TMR0H = 0; TMR0L = 0; GIE = 0; TMR0ON = 1;
// Обнуление таймера, запрет прерываний и запуск таймера
TRISB |= (1 // Переводим порт в высокоимпедансное состояние
while ( (PORTB&(1 // ждём пока порт не покжает единицу
TMR0ON = 0; GIE = 1; // Выключаем таймер и разрешаем прерывания
open_button_time = TMR0 + 5;
// Сохраняем значение таймера, с запасом для исключения ложных нажатий
// Вместо «5» тут можно использовать переменную и ею подстраивать чувствительность
// В моём случае я просто использовал 16-bit таймер и глобальную переменную типа int,
// Но вообще-то должно хватать и 8-bit таймера
TRISB &=

(1 // Порт на выход
LATB &=

(1 // В порт ноль
>
// Обратите внимание! Так как здесь и далее в функцию передаётся адрес переменной, а не её значение, сама функция никаких значений не возвращает!

// Пример вызова: button = CheckButton(0, &button_open_time);
// Здесь button_open_time — глобальная переменная, адрес которой передаётся в функцию

unsigned char CheckButton(unsigned char button_id, unsigned int open_button_time) <
// Собственно опрос кнопки. Функция возвращает состояние кнопки
unsigned int button_time = 0;
ADCON1 |= 0b00001000; TRISB &=

(1 // Порт на выход
LATB &=

(1 // В порт ноль
__delay_us(200); // Ждём пока сенсор разрядится
TMR0H = 0; TMR0L = 0; GIE = 0; TMR0ON = 1;
// Обнуление таймера, запрет прерываний и запуск таймера
TRISB |= (1 // Переводим порт в высокоимпедансное состояние
while ( (PORTB&(1 // ждём пока порт не покжает единицу
TMR0ON = 0; GIE = 1; // Выключаем таймер и разрешаем прерывания
button_time = TMR0; // Сохраняем значение таймера
TRISB &=

(1 // Порт на выход
LATB &=

(1 // В порт ноль
if ( button_time > open_button_time) < return 1; >else < return 0; >; >
// Если заряжался дольше открытого — значит есть касание

Данный пример призван показать принцип и не учитывает некоторых моментов. Например, в случае сильного загрязнения сенсора и возникновения паразитных утечек заряда на землю, он при калибровке может вообще не зарядится и МК зависнет в цикле. На этот случай можно сделать принудительный выход из цикла (например, по истечению какого-то времени) и индикацию неисправности сенсора. Сама пластинка может быть практически любой формы, кроме того сенсор можно накрыть тонким стеклом, однако тогда возможно придётся подбирать оптимальные значения времени зарядки сенсора и срабатывания. Также следует обратить внимание на различные «экранирующие» проводники рядом с сенсором — в общем случае на обратной стороне платы под сенсором желательно не делать земляных полигонов, также как и заземлённых проводников вокруг сенсора. Если требуется сделать несколько сенсоров, достаточно опросить их последовательно — займёт это не больше миллискунды, так что для пользователя будет выглядеть как «мультитач». На что следует обратить внимание:

  • Для приемлемой точности распознавания касания нужно чтобы таймер, по которому ведётся отсчёт, за расчётное время τ успевал сделать как минимум несколько приращений. У меня всё стабильно работало с кварцевым резонатором 10 МГц. Полагаю со встроенным генератором на 8 МГц тоже должно корректно работать.
  • Плату, на которой вы собираете устройство нужно тщательно отмывать от флюса, а также следить, чтобы провода, идущие от сенсора не имели никаких паразитных связей с землёй — даже небольшая проводимость на землю, не даваст зарядиться сенсору и микроконтроллер будет постоянно висеть в цикле while при опросе.
  • С порта, используемого для сенсорного ввода, надо убирать всё лишнее — например, если подключить сенсор ко входу с обратно включенным на землю защитным диодом, ток утечки через диод на землю тоже не даст зарядиться сенсору.
  • Если используется порт с внутренними подтягивающими резисторами, то в конфигурации порта их нужно отключить, иначе получите проблему с симптомами, которые уже описали. В частности, например, в моём случае при инициализации я установил бит RBPU = 1, согласно даташиту «All PORTB pull-ups are control by latch».
  • Сильно увеличивать номинал резистора к питанию на сенсоре не имеет особого смысла, так как при слишком большом сопротивлении заряд, через различные паразитные утечки, будет быстрее стекать на землю и сенсор тоже не зарядится. Оптимальное значение лежит в пределах 600кОм — 2 МОм.

Для удобства повторного использования весь код вынесен в отдельный файл sensor.c. Пример использования: // В данном случае файл sensor.c следует положить в корень папки с вашим проектом
// Включаем файл где-нибудь перед объявлением глобальных переменных
#include «sensor.c»

// Глобальные переменные, для хранения состояния кнопок
volatile unsigned char button_1 = 0, button_2 = 0, button_3 = 0;
// Переменные для хранения калиброванного времени зарядки сенсора без прикосновения
volatile unsigned int button_1_open_time = 0, button_2_open_time = 0, button_3_open_time = 0;

// Далее приведён пример для трёх кнопок
void CallibrateAllButtons(void) <
CallibrateButton(0, &button_1_open_time);
CallibrateButton(1, &button_2_open_time);
CallibrateButton(2, &button_3_open_time); >
// Калибруем все кнопки по очереди

void CheckAllButtons(void) <
button_1 = CheckButton(0, &button_1_open_time);
button_2 = CheckButton(1, &button_2_open_time);
button_3 = CheckButton(2, &button_3_open_time);
// Опрашиваем все кнопки по очереди

idle_millisec = 400; OSCCON = OSCCON_START_STATE; SLEEP(); >
// После опроса желательно сделать небольшую паузу чтобы пользователь успел убрать руку

Стоит отметить, что в Microchip разработали кучу библиотек для ускорения разработки сенсорных устройств, объединили всё это в одну технологию и назвали её mTouch. Способов реализации сенсора несколько, чаще всего используется т.н. «ёмкостной делитель», он позволяет использовать минимум внешней обвязки. Более того, новые контроллеры несут в себе модули «переферии независимой от ядра», которые позволяют собирать сенсоры вообще без внешних компонентов. Также есть модели МК, которые содержат специализированные Touch Controller’ы, что тоже позволяет обойтись без внешней обвязки при построении сенсора. С микрочиповскими гайдами по mTouch настоятельно рекомнедую ознакомиться — там много интересного как про разводку устройств с сенсорами, так и про способы реализации.