Views: 1451
Изменим схему следующим образом
добавим две тактовые кнопки BT1 и BT2.
Теперь переключимся на конфигурацию выводов, для этого сделаем двойной клик в окне Ресурсы проекта на Pin Module.
В окне Pin Module настроим RB6 и RB7
Настроим на вход убрав птички в колонке выход, подключим к этим входам подтягивающие резисторы, теперь на входе будет высокий уровень, при замыкании кнопки, уровень будет становиться низким. Обрабатывать прерывания мы будем через прерывания, чтобы не загружать процессор контролем состояния на этих входах.
В итоге у нас должен быть такой вид
Тискаем кнопочку сгенрировать
А теперь посмотрим как изменилась конфигурация входов:
void PIN_MANAGER_Initialize(void)
{
/**
LATx registers
*/
LATA = 0x00;
LATB = 0x00;
LATC = 0x00;
/**
TRISx registers
*/
TRISA = 0x08;
TRISB = 0xC0;
TRISC = 0x00;
/**
ANSELx registers
*/
ANSELC = 0x00;
ANSELB = 0x00;
ANSELA = 0x00;
/**
WPUx registers
*/
WPUB = 0xC0;
WPUA = 0x08;
OPTION_REGbits.nWPUEN = 0;
/**
APFCONx registers
*/
APFCON = 0x00;
/**
IOCx registers
*/
// interrupt on change for group IOCBF - flag
IOCBFbits.IOCBF6 = 0;
IOCBFbits.IOCBF7 = 0;
// interrupt on change for group IOCBN - negative
IOCBNbits.IOCBN6 = 1;
IOCBNbits.IOCBN7 = 1;
// interrupt on change for group IOCBP - positive
IOCBPbits.IOCBP6 = 0;
IOCBPbits.IOCBP7 = 0;
// register default IOC callback functions at runtime; use these methods to register a custom function
IOCBF6_SetInterruptHandler(IOCBF6_DefaultInterruptHandler);
IOCBF7_SetInterruptHandler(IOCBF7_DefaultInterruptHandler);
// Enable IOCI interrupt
INTCONbits.IOCIE = 1;
}
Что изменилось?
Два вывода настроены на вход
TRISx registers
*/
TRISA = 0x08;
TRISB = 0xC0;
TRISC = 0x00;
Подключили к этим входах подтягивающие резисторы
WPUx registers
*/
WPUB = 0xC0;
WPUA = 0x08;
OPTION_REGbits.nWPUEN = 0;
Выполнена настройка полярности формирования прерываний
// interrupt on change for group IOCBF - flag
IOCBFbits.IOCBF6 = 0;
IOCBFbits.IOCBF7 = 0;
// interrupt on change for group IOCBN - negative
IOCBNbits.IOCBN6 = 1;
IOCBNbits.IOCBN7 = 1;
// interrupt on change for group IOCBP - positive
IOCBPbits.IOCBP6 = 0;
IOCBPbits.IOCBP7 = 0;
Регистрация функций прерываний и разрешение прерываний от портов по изменению состояния
// register default IOC callback functions at runtime; use these methods to register a custom function
IOCBF6_SetInterruptHandler(IOCBF6_DefaultInterruptHandler);
IOCBF7_SetInterruptHandler(IOCBF7_DefaultInterruptHandler);
// Enable IOCI interrupt
INTCONbits.IOCIE = 1;
Изменилась также функция менеджера прерываний
void interrupt INTERRUPT_InterruptManager (void)
{
// interrupt handler
if(INTCONbits.TMR0IE == 1 && INTCONbits.TMR0IF == 1)
{
TMR0_ISR();
}
else if(INTCONbits.IOCIE == 1 && INTCONbits.IOCIF == 1)
{
PIN_MANAGER_IOC();
}
else
{
//Unhandled Interrupt
}
}
В ней появилось секция обработки прерываний от изменения состояний на входах
else if(INTCONbits.IOCIE == 1 && INTCONbits.IOCIF == 1)
{
PIN_MANAGER_IOC();
}
else
Для индикации работы прерываний по входам будем использовать те же светодиоды, для этого закомментируем их функцию в прерываниях от таймера
void TMR0_CallBack(void)
{
// Add your custom callback code here
// LD1=!LD1;
// LD2=!LD2;
if(TMR0_InterruptHandler)
{
TMR0_InterruptHandler();
}
}
и добавим их в функции IOCBF6_ISR и IOCBF7_ISR
/**
IOCBF6 Interrupt Service Routine
*/
void IOCBF6_ISR(void) {
// Add custom IOCBF6 code
LD1=!LD1;
// Call the interrupt handler for the callback registered at runtime
if(IOCBF6_InterruptHandler)
{
IOCBF6_InterruptHandler();
}
IOCBFbits.IOCBF6 = 0;
}
/**
IOCBF7 Interrupt Service Routine
*/
void IOCBF7_ISR(void) {
// Add custom IOCBF7 code
LD2=!LD2;
// Call the interrupt handler for the callback registered at runtime
if(IOCBF7_InterruptHandler)
{
IOCBF7_InterruptHandler();
}
IOCBFbits.IOCBF7 = 0;
}
Теперь прошьем ПИК.
УПС!!! получили ошибки как видно эта версия МСС еще не совсем корректно работает, но это не проблема, просто МСС “забыл добавить новые функции в описание, в шапку. Это нас не должно останавливать, поэтому сделаем это за него. Добавим строки в файл pin_manager.h.
void IOCBF6_SetInterruptHandler(void* InterruptHandler); void IOCBF7_SetInterruptHandler(void* InterruptHandler); void IOCBF6_ISR(void); void IOCBF7_ISR(void); void IOCBF6_DefaultInterruptHandler(void); void IOCBF7_DefaultInterruptHandler(void);
Теперь все завелось!!! И работает! Но как? Мы настроили, что при нажатию на кнопку состояние светодиода должно быть изменено на противоположное, все так и работает, но иногда почему-то происходит сбой.
Светодиод сразу выключается или помаргивает и все. это связано с нашим банальным дребезгом механических контактов.
Любой механический контакт, как бы он не был совершенен, в процессе замыкании, создает в своем начале дребезг, тоже самое происходит и при размыкании, это дребезг даже нашим “тихоходным контроллером” может быть обработан многократно, что при определенной ситуации даст нам нежелательный результат.
Как с этим дребезгом бороться, известно давно, что в тактовых кнопках длительность дребезга не более 10 мс. Локи проста при появлении прерывания, надо подождать 10 мс проверить уровень на входе и если он низкий выполнить функцию, если нет, то это будем расценивать как помеху. И все.
Как это будет выглядеть на практике изменим рабочий код прерывания для входа RB7
void IOCBF7_ISR(void) {
// Add custom IOCBF7 code
__delay_ms(10);
if(!RB7)LD2=!LD2;
// Call the interrupt handler for the callback registered at runtime
if(IOCBF7_InterruptHandler)
{
IOCBF7_InterruptHandler();
}
IOCBFbits.IOCBF7 = 0;
}
Что сделали? Добавили задержку а потом проверку реально низкого уровня на входе. Но надо не забыть добавить в заголовочный файл pin_manager.h вставку #include “mcc.h” в файле mcc.h описывается тактовая рабочая частота которая необходима для функции задержки.
Часть текста файла pin_manager.h с изменениями
CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF
SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
*/
#ifndef PIN_MANAGER_H
#define PIN_MANAGER_H
#include "mcc.h"
#define INPUT 1
#define OUTPUT 0
#define HIGH 1
#define LOW 0
#define ANALOG 1
#define DIGITAL 0
Теперь проверим как будет работать кнопки на “модернизированном” входе и без. Кнопка подключенная ко входу RB7 работает четко переключая светодиод, а кнопка подключенная к входу RB6 со сбоями. Это типа ощутите разницу!
Теперь выполним модернизацию и входа RB6
/**
IOCBF6 Interrupt Service Routine
*/
void IOCBF6_ISR(void) {
// Add custom IOCBF6 code
__delay_ms(10);
if(!RB6)LD1=!LD1;
// Call the interrupt handler for the callback registered at runtime
if(IOCBF6_InterruptHandler)
{
IOCBF6_InterruptHandler();
}
IOCBFbits.IOCBF6 = 0;
}
Перепрошьем ПИК и о чудо, можно сказать жизнь удалась!!! Все работает без единого сбоя.
Очень важно получить от механических устройств правильно сформированный импульс, все стародавние варианты, с подключением конденсаторов для микроконтроллеров не катят, все должно обрабатываться программно. И актуально когда нужно получить счетный вход!
Проект по теме
Проект с использованием MCC часть 06 261.19 KB 102 downloads
Изменим схему следующим образом добавим две...Теперь мы можем управлять светодиодами, а можем ли мы управлять их яркостью? Это рассмотрим в следующей главе…
Это может быть интересно
CCP модуль для декодирования ИК-кодов пультов ДУViews: 1142 Множество изготовителей для своих пультов дистанционного управления на ИК лучах используют принцип широтно-импульсной модуляции. В таких кодах бит единицы представляется импульсом большой длительности, а ноль импульсом короткой длительности. …
LATINO – открытый проект ch-светомузыкиViews: 1721 Проект построенный на некоторых принципах ch-светомузыка. Проект ознакомительный предназначен, для самостоятельного построения простого и эффективного светосинтезатора. Вывод осуществляется на ВОУ собранной на драйверах HL1606. Для этого была …
WiFi ESP8266 ESP-202 (ESP-12F)Views: 7908 Первое знакомство, сначала надо его купить… http://voron.ua/catalog/024404 Схема для подключения и тестирования По схеме ставим две кнопки, сброс и кнопку BT2, для перевода в режим обновления прошивки. Если надо сделать …
TDA7294 part 1Views: 464 TDA7294 має унікальні дані для створення підсилювачів звукової частоти HI-FI класу. Варіант застосування є конфігурація BRIDGE (мостова схема включення), де використовуються два TDA7294, як показано на схематичній діаграмі …
Проект с использованием MCC часть 05Views: 2183 Эту часть назовем так как избавься от delay, там где а это реально не надо. Для это нам потребуется научиться использовать прерывания и работать с таймерами. Что такое …
Стабилизатор тока на SN3350, часть 2Views: 1291 Если вам необходимо разработать устройство с применением мощных светодиодов, то никак не обойтись без применения стабилизатора тока. На настоящий момент стабилизаторы тока являются самым эффективным механизмом, для питания светодиода в течение всего …
Проект с использованием MCC часть 12-2Views: 1180 Настало время для изучения шины I2C. Изучать будем на примере работы с индикатором RET012864E. Что изменили со старой схемы: В прошлой теме я затупил и не добавил подтягивающие резисторы …
ESP8266 применение в проектахViews: 3757 (Актуально только для версий прошивки 1.хх) ESP8266 показала себя как надежное и безотказное устройство для обмена данными с применением WIFI. Я использую ESP8266 исключительно через UART, с применением AT …
MPLAB® Harmony – или как это просто! Часть 4.Views: 2371 Часть четвертая – это может показаться немного сложно. Структура проекта. Для облегчения конфигурирования проекты MPLAB Harmony обычно структурированы таким образом, чтобы изолировать код, необходимый для настройки «системы», от …
WiFi ESP8266 – AT команды связанные с функцией TCP/IP (v.1.6.1)Views: 5326 AT команды связанные с функцией TCP/IP В этом разделе описаны команды которые позволяют устанавливать соединения между серверами и клиентами в сети. Приведено описание команд и примеры их выполнения. …




