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

Visits: 853


  Эта часть будет посвящена созданию практического проекта управления освещение.

Тех задание:

  1. Два выхода управления ШИМ – светодиодным освещением.
  2. Две кнопки управления, каждая кнопка управляет, своим каналом, логика самая простая, нажимаем и удерживаем кнопку включается режим (в зависимости от предыдущего состояния) нарастания яркости или уменьшения, если канал отключен он включается на предыдущей установленной яркости. При повторном нажатии режим изменяется на противоположный. Кратковременной нажатие выключает – включает канал на заданной яркости. Двойное нажатие включает таймер авто отключения (задержка 30 секунд).


  Когда поставлено ТЗ с заказчиком всегда надо подписать документ (это обязательное условие для разработчика), кроме ТЗ надо досконально описать, как вы и при каких условиях будет сдавать готовый “продукт”, в полоть, до того, “вы смотрите, я нажимаю кнопочку, происходить, то-то и так.” Это даст вам возможность при окончании проекта, сдать его и за одно полечить заказчика, если он думал, что-то другое и отнесся к вам не серьезно. Дополнительная оплата ваших услуг любых хамов ставит на место. И только тогда можно начинать разработку. Повторяю подписать ТЗ.


  С чего начнем, первое создадим функцию которая позволит отслеживать нажатия кнопки и определять типа нажатия. Нам нужен флаг который будет определять, что произошло прерывание, по нажатию. Как это делается. Событие происходит в (назовем так) библиотеке обслуживание выводов pin_manager. В ней мы должны описать булеву переменную её можно описать классически bool или XC8 допускает тип bit.

  Для этого в файле pin_manager.c вставим в начале строки (если использовать будем описание bool ), сначала библиотека

#include <stdbool.h>                // описание булевых величин

Затем описание флагов:

bool led1_pressure,led2_pressure;   // флаги нажатия кнопок

  Но этого будет маловато, нам необходимо будет использовать эти флаги не только в файле pin_manager.c, а и в основной программе mail.c. Для этого нам необходимо в заголовочном файле pin_manager.h, описать эти флаги как внешние:

extern bool led1_pressure,led2_pressure;   // флаги нажатия кнопок

Также в этот заголовочный файл добавим описание наших кнопок назовем их BOT1 и BOT2:

// входы кнопок управления
#define BOT1 RB6    // кнопка 1 управления каналом 1
#define BOT2 RB7    // кнопка 2 управления каналом 2

Вот теперь мы можем эти флагами манипулировать и в файле pin_manager.c и в файле mail.c.

Изменим функцию обработки прерываний по изменению нажатия на кнопки, для кнопки установленной на выходе RB6

/**
   IOCBF6 Interrupt Service Routine
*/
void IOCBF6_ISR(void) {

    // Add custom IOCBF6 code
    __delay_ms(10);         // устранение дребезга механического контакта (ждем пока дребезг закончиться)
    if(!BOT1)               // проверим клавиша нажата
    {
        bot1_pressure=1;    //установить флаг нажатие клавиши
    }
    
    // Call the interrupt handler for the callback registered at runtime
    if(IOCBF6_InterruptHandler)
    {
        IOCBF6_InterruptHandler();
    }
    IOCBFbits.IOCBF6 = 0;
}

Аналогично изменим функцию обработки кнопки подключенной ко входу RB7

/**
   IOCBF7 Interrupt Service Routine
*/
void IOCBF7_ISR(void) {

    // Add custom IOCBF7 code
    __delay_ms(10);         // устранение дребезга механического контакта (ждем пока дребезг закончиться)
    if(!BOT2)               // проверим клавиша нажата
    {
        bot2_pressure=1;    //установить флаг нажатие клавиши
    }
    // Call the interrupt handler for the callback registered at runtime
    if(IOCBF7_InterruptHandler)
    {
        IOCBF7_InterruptHandler();
    }
    IOCBFbits.IOCBF7 = 0;
}

Что эти функции будут выполнять? При нажатии кнопки будет устанавливаться флаги bot1_pressure и bot2_pressure. Что с этими флагами будем делать?

А это мы будет обрабатывать в основном цикле программы.

  1. Обработаем флаг нажатия кнопки:
    • нам необходимо, чтобы обработка нажатия была выполнена однократно, для этого сделаем функцию if, с условием если флаг установлено, войти в функцию, сбросить флаг.
    • Установить флаг удержание клавиши bot1_retention.
    • Обработка функции изменения направления яркости (увеличение/уменьшение).
    • Увеличение переменной режима – чтобы понять сколько раз нажата кнопка и какую функцию выполнить.
    • Инициализация таймера задержки – что бы разобраться это удержание кнопки или кратковременное нажатие.

Как это будет выглядеть:

        if(bot1_pressure)//было нажатие клавиши
        {
            bot1_pressure=0;    // сбросить флаг нажатия

            bot1_retention=1;   // событие нажатия произошло
            if(PWM1EN) // если модуль включен (свет горит)
            {
               NAP1=!NAP1;  // изменить направление
            }        
            regim1++;           // выбор режима
            timer_delay1=400;   // время задержки нажатия первого нажатия 
        }

Эта конструкция гарантирует, что все, что в фигурных скобках будет выполнен всего один раз на нажатие кнопки

        if(bot1_pressure)//было нажатие клавиши
        {
            bot1_pressure=0;    // сбросить флаг нажатия

Флаг удержания кнопки

bot1_retention=1;   // событие нажатия произошло

Нам необходимо чтобы выполнялась логика работы нажатия кнопки, нажали – удерживаем яркость увеличивается, следующее нажатие и удержание яркость уменьшается (далее логика повторяется)

            if(PWM1EN) // если модуль включен (свет горит)
            {
               NAP1=!NAP1;  // изменить направление
            }

И самое главное это должно выполняться когда “свет горит” модуль ШИМ включен. Модуль включается битом PWM1EN, по этому по состоянию этого бита можем контролировать и разрежать управления флагом направления изменения яркости NAP1.

Следующая строка выполняет формирование команды, которая будет выполнена при кратковременном нажатии кнопки. Однократное включение выключение канала (света), двойное нажатие запуска таймера автовыключения.

Для понимания кратковременное нажатие или удержание нужна переменная таймера по которой мы будем определять тип нажатия. Это переменная

timer_delay1=400;   // время задержки нажатия первого нажатия

Функции timer_delay1 работаем следующим образом её необходимо встроить в таймер и выполнять уменьшения на единицу пока её значение больше нуля. По достижения значения нуля, декрементация переменной останавливается. Это может выполнено следующим образом:

//------------------------------------------------------------------------------
    if(timer_delay1>0)timer_delay1--;   // обработка таймера
//------------------------------------------------------------------------------

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

Выберем таймер 0

выполним настройку таймера, изменим значение предделителя

далее, установим период таймера 1 миллисекунду

 

А период работы функции Callback function Rate сделаем пол секунды (таймер работает 1 мс) впишем 500,

конфигуратор дает реальное значение 496 мс, подправим:

получаем 499,968, это максимально близко к 0,5 секунды. Для чего это сделано, это сделано для будущего когда мы будем настраивать функцию автоотключения, когда нам необходимо будет выполнять команду автоматического отключения освещения, вот тут нам понадобиться отсчет времени. Почему в пол секунды, это просто – это минимальная погрешность которая будет возникать. Как это понять. Таймер постоянно работает и формирует пол секундные нажатия, а нажатия кнопок у нас асинхронные мы можем при нажатии попасть точно в момент прерывания и тогда период будет 30 сек., а можем позже, запоздать и выполнить перед прерыванием, тогда период будет 29,5 сек. Для того чтобы сделать это супер точно надо или полностью синхронизировать таймер в момент прерывания или задать более частые прерывания, что только увеличат объем программы и нагрузку на процессор, что для нашего приложения, совершенно не важно. Если вы уходите и запускаете таймер на отключение света, выключиться он через 29,5 сек или 30 сек надеюсь совсем не важно ;).

С генерируем код на основе наших изменений

Для нас конфигуратор откроет окно Merge[MCC], еще раз опишем, что это такое в левой части, то, что подготовил MCC, в правой части, то что есть сейчас

Тут показаны какие файлы затронули изменения, а также какой в данный момент файл выбран для изменений

Тут сколько всего осталось внести изменений и на каком изменении установлен курсор (1/8 – изменений)

Если нажать на символ => то будут автоматически учтены все изменения, но это делать не стоит, так как мы уже внесли “свои” добавления в файл tmr0.c и они при этом будут потеряны, а это нам не нужно. Что нам делать? Перемещаем мышку на правую половину окна Merge[MCC] и прокручиваем колесико мышки на первое изменение

Это нами добавленное описание переменной таймера, мы его пропускаем крутим дальше

тут три изменения, чем они связаны? Они связаны с изменением параметров таймера мы эти изменения должны внести, для этого последовательно кликаем на стрелочку => внутри каждого изменения.

При выполнении операции значения из правого окна будут внесены в левое в наш рабочий файл.

Крутим далее колесико находим следующие изменения, тут необходимо, только изменить комментарий

При этом остаются 4 непринципиальные изменения, в основном комментарии и одно описание нашей переменной. Работа с этим файлом выполнена.

Переходим ко второму файлу tmr0.h. (двойной клик на строчке)

В этом Файле предлагается 3 изменения просмотрим их

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

На всплывающее окно ответим утвердительно

Изменения настройки MCC вступили в силу.


Итак что мы сделали?

  1. мы добавили переменные для формирования длительностей, которые нам будут необходимы для управления изменения яркости и обработки времени нажатия кнопки.
  2. Мы описали функцию нажатия кнопки при выполнении её нажатия (в прерываниях)
  3. Мы в основном цикле описали обработку флага нажатия кнопки.

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


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


  • LCD драйвер – UC1601sLCD драйвер – UC1601s
    Visits: 1529 http://svetomuzyka.narod.ru/project/UC1601s.html Читайте обновление на http://catcatcat.d-lan.dp.ua/?page_id=178 В данный момент можно приобрести в ООО “Гамма” несколько типов индикаторов на драйвере UC1601s. RDX0048-GC, RDX0077-GS, RDX0154-GC и RDX0120-GC выполнены по технологии COG. Метки: …
  • TM1650 драйвер LED семисегментного индикатораTM1650 драйвер LED семисегментного индикатора
    Visits: 17673 Китайский производитель Shenzhen Titan Micro Electronics Co., Ltd.  Выпускает широкую линейку драйверов управления светодиодными дисплеями, которые позволяют разгрузить микроконтроллер для основной работы, главная особенность этих драйверов не только …
  • Обновление ESP8266 c ESPFlashDownloadTool_v3.6.3Обновление ESP8266 c ESPFlashDownloadTool_v3.6.3
    Visits: 3428 Технология обновления следующая: Загружаем программу со страницы espressif.com. Разархивируем. Где находятся файлы, для прошивки? Заходим в каталоги Подключаем по схеме в статье WiFi ESP8266 (замыкаем BT2, перемычка). Запускаем программу, …
  • Altium Designer first projectAltium Designer first project
    Visits: 212 Эта статья подразумевает, что у вас установлен и настроен Altium Designer как описано в статье  Altium Designer my setup system and project structure.  Обратите внимание! Библиотека постоянно обновляется, …
  • Униполярный шаговый двигатель – часть 2Униполярный шаговый двигатель – часть 2
    Visits: 762 В этой части только итог и версия 2.0 универсальной, которая позволяет управлять шаговым двигателем во всех трех режимах и 3.0 специальной библиотеки только для одного полушагового режима. В …
  • LED модуль P10C4V12LED модуль P10C4V12
    Visits: 3058 LED панели на обычных регистрах типа 74HC595. Они выпускаются как монохромные так двух и полно цветные, особенность, что они предназначены для текстовой информации и имеют один уровень яркости. Общую яркость …
  • Регулятор влажностиРегулятор влажности
    Visits: 1351 Регулятор ILLISSI-CH-1000 предназначен для контроля и регулировки относительной влажности в диапазоне от 0 до 100%. Регулятор позволяет работать как в режиме осушения, так и увлажнения. Для измерения возможно …
  • I2C MODULE – PIC18F25K42 Device ID Revision = A001I2C MODULE – PIC18F25K42 Device ID Revision = A001
    Visits: 1045 I2C MODULE Обход ошибок в версии I2C MODULE – PIC18F25K42 Device ID Revision = A001 В Серии K42 применен совершенно новый модуль шины I2C, который позволяет поддерживать все …
  • CLUBBEST-50-LightCLUBBEST-50-Light
    Visits: 213 CLUBBEST-50-LIGHT   Зміст Короткий опис проекту. 1 Опис схемотехніки візуалізатора музики. 2 Аудіо вхід. 3 MCU. 4 Цифровий вихід. 5 Схема живлення MCU. 6 Складання пристрою. 7 Список …
  • Arduino LCD + STONE STVI056WT-01 + Strain gaugeArduino LCD + STONE STVI056WT-01 + Strain gauge
    Visits: 419 Author li grey email: greyli1987@outlook.com The strain assessment instrument is used to assess the degree of corresponding muscle strain by obtaining the muscle surface action potential through silver …



 

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

Catcatcat

catcatcat

Development of embedded systems based on Microchip microcontrollers.

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

НазадДалее

Комментарии

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.