Проект с использованием MCC часть 06

Views: 1245


Изменим схему следующим образом

добавим две тактовые кнопки 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 91 downloads

Изменим схему следующим образом добавим две...


Теперь мы можем управлять светодиодами, а можем ли мы управлять их яркостью? Это рассмотрим в следующей главе…


Это может быть интересно


  • Altium Designer – подготовка документации для производства и сборки печатных платAltium Designer – подготовка документации для производства и сборки печатных плат
    Views: 3623 В процессе освоения Altium Designer много возникает вопросов по подготовке документации для производства плат, а также для её сборки. Altium Designer позволяет сделать все требуемые документы, хотя скажем …
  • USB K-L-line адаптерUSB K-L-line адаптер
    Views: 5955 USB K-L-line адаптер предназначен для связи персонального компьютера с диагностической шиной автомобиля – интерфейс ISO-9141. Этот проект предназначен для сборки недорого устройства с использованием специально для этой цели …
  • Бегущие огни на WS2812BБегущие огни на WS2812B
    Views: 4825 В настоящее время большой популярностью стали пользоваться светодиоды со встроенным драйвером WS2812B. Текущий проект предназначен показать возможность использования и управления этими светодиодами. Это и проект и исследование по …
  • Система отопления на солнечных коллекторах от Дмитрия (rv3dpi)Система отопления на солнечных коллекторах от Дмитрия (rv3dpi)
    Views: 3179 Солнечные коллекторы для отопления в Европе используют в более 50% от общего количества установленных гелиосистем. Однако следует понимать, что гелиосистемы предназначены лишь для поддержки отопления и экономии затрат на основную …
  • I2C MODULE – PIC18F25K42 Device ID Revision = A001I2C MODULE – PIC18F25K42 Device ID Revision = A001
    Views: 1061 I2C MODULE Обход ошибок в версии I2C MODULE – PIC18F25K42 Device ID Revision = A001 В Серии K42 применен совершенно новый модуль шины I2C, который позволяет поддерживать все …
  • Защита датчиков температуры DS18B20 от статического электричестваЗащита датчиков температуры DS18B20 от статического электричества
    Views: 1812 Статья перепечатана с сайта http://svetomuzyka.narod.ru При удалении датчика на большие расстояния возникает опасность наведения импульсов высокого напряжения на кабель, который соединяет датчик с контролером. Если не принимать меры защиты, …
  • Самый простой диммер для светодиодного освещенияСамый простой диммер для светодиодного освещения
    Views: 2976 Светодиоды все больше входят в нашу жизнь как источники освещения и как само собой разумеющееся, это вопрос регулировки яркости. Существует множество схемных решений, но в нашем варианте мы …
  • Development board based on MCU PIC18F47Q84Development board based on MCU PIC18F47Q84
    Views: 799 PIC18F47Q84 Microcontroller Family with CAN Flexible Data Status: In Production.
  • Real-time music visualization technologyReal-time music visualization technology
    Views: 94 Music visualization technology in real time (RTMV-technology). Я не музикант і я не маю спеціальної музичної освіти, я інженер розробник вбудованих систем. Але моє хобі розроблення технології візуалізації …
  • Ссылки на интересные источникиСсылки на интересные источники
    Views: 818 Сбор 3D моделей от André L’Hérault конденсаторы, резисторы, индуктивности dropbox IPC-SM-782 Surface Mount Design and Land Pattern Standard Видео уроки по Altium designer Alexey Sabunin https://www.youtube.com/channel/UCG7N5CqXpyK8nQjr1EmMgng Сергей Булавинов https://www.youtube.com/channel/UCISAMXRnN_Qw9UTjUwZI1Jw Robert Feranec https://www.youtube.com/user/matarofe …



 

Поделись этим!

Catcatcat

catcatcat

Development of embedded systems based on Microchip microcontrollers.

Продолжайте читать

НазадДалее