Следующая периферия микроконтроллера PIC, которую мы начнём сегодня изучать — это модуль CCP, чья аббревиатура расшифровывается как CAPTURE/COMPARE/PWM (Захват / сравнение / ШИМ). Таких модулей в нашем контроллере два и у каждого модуля разное назначение.
Compare (сравнение) не следует путать с аналоговым компаратором, для этого есть отдельный модуль.
Каждый модуль CCP содержит 16-разрядный регистр CCPx, который может использоваться для захвата, сравнения, а также для ШИМ, только для ШИМ он будет делиться на два восьмиразрядных.
Оба модуля CCP всегда работают в паре с определёнными таймерами, тем самым расширяя функционал последних. Причём каждый режим работы модуля CCP согласуется только с определённым таймером
Захват | TIMER1 |
Сравнение | TIMER1 |
ШИМ | TIMER2 |
Также мы можем использовать одновременно оба модуля. Вот комбинации использования модулей и также условия данного использования
Режим CCPx | Режим CCPy |
Условия совместного использования |
---|---|---|
Захват | Захват | TIMER1 |
Захват | Сравнение | У модуля CCP, работающего в режиме сравнения, должен быть настроен триггер специального события, который сбрасывает TIMER1 |
Сравнение | Сравнение | У модулей CCP должен быть настроен триггер специального события, который сбрасывает 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) в 0. После того, как мы изменим режим работы модуля 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, напишем проект для распознавания адреса и команды посылки от ИК-пульта, а также проверим наш код на практике, используя несколько ИК-пультов дистанционного управления.
Предыдущий урок Программирование МК PIC Следующая часть
Купить программатор (неоригинальный) можно здесь: PICKit3
Купить программатор (оригинальный) можно здесь: PICKit3 original
Отладочную плату PIC Open18F4520-16F877A можно приобрести здесь: PIC Open18F4520-16F877A
Дисплей LCD 20×4 можно приобрести тут: Дисплей LCD 20×4
Смотреть ВИДЕОУРОК (нажмите на картинку)
Добавить комментарий