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

Visits: 1864


Эту часть назовем так как избавься от delay, там где а это реально не надо.

Для это нам потребуется научиться использовать прерывания и работать с таймерами.

Что такое таймер?

Это аппаратное периферийное устройство которое может подсчитывать импульсы от системного генератора или от внешнего источника и формировать прерывания по достижению переполнению. Конфигурация таймер мы можем задавать разные промежутки времени его работы или использовать для формирования прерываний с определенным периодом.

Для начала как активировать работу таймера в МСС?

Откроем закладку Менеджер ресурсов и обратим внимание на ресурсы нашего ПИКа

обратим внимание на ресурсы устройства по таймерам

Мы имеем в наличии три таймера. По каждому таймеру будем изучать в отдельности, по мере необходимости, а сейчас таймер Т0 – это классический таймер микроконтроллеров ПИК, хотя в этой серии он немножко модернизирован и обладает расширенными параметрами, чем в ранних моделях:

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

При помощи бита TMR0CS можно переключаться между внутренним системным тактовым генератором Fosc/4 и внешним сигналом.

Мы можем подключить к таймеру предделитель для того, чтобы уменьшить входную частоту для получения более больших длительностей в формировании прерываний. Переключение модно выполнить битом PSA, а задать значение делителя битами PS<2:0>.

При работе с внешними сигналами надо понимать, что будут выполняться синхронизация таймера с тактовой частотой системного генератора FOSC/2, но при этом еще надо понимать, что выходная частота T0CKI после предделителя не должна превышать FOSC/8.

Что делать дальше?

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

 

Начнем его настраивать, что прикольные все в МСС, что сразу можно видеть, что будем иметь в результате:

  1. Первое мы подключим предделитель поставим галочку включить предделитель.
  2. Второе настроем его на тактирования от внутреннего генератора.
  3. Включить обработку прерываний от таймера.

При этом у нас должно получиться следующее

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

А теперь посмотрим, что мы натворили:

У нас появились новые файлы:

У нас изменилась функция  SYSTEM_Initialize

void SYSTEM_Initialize(void)
{

    PIN_MANAGER_Initialize();
    OSCILLATOR_Initialize();
    WDT_Initialize();
    TMR0_Initialize();
}

Это значит, что при запуске контроллера добавиться инициализация таймера Т0!

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

Что интересно будет описана функция менеджера прерываний см. файл interrupt_manager.c

void interrupt INTERRUPT_InterruptManager (void)
{
    // interrupt handler
    if(INTCONbits.TMR0IE == 1 && INTCONbits.TMR0IF == 1)
    {
        TMR0_ISR();
    }
    else
    {
        //Unhandled Interrupt
    }
}

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

В самой теле процедуры прерывания от таймера мы видим функцию TMR0_ISR(); что она делает мы модем посмотреть если нажмем и будем удерживать клавишу Ctrl и клацнем “мышкой” по смой функции, у нас перенесет на описание самой этой функции.

void TMR0_ISR(void)
{

    // Clear the TMR0 interrupt flag
    INTCONbits.TMR0IF = 0;

    TMR0 = timer0ReloadVal;

    if(TMR0_InterruptHandler)
    {
        TMR0_InterruptHandler();
    }

    // add your TMR0 interrupt custom code
}

Что она делает?

INTCONbits.TMR0IF = 0; – очистка флага прерывания

TMR0 = timer0ReloadVal; – можно инициализировать таймер предварительным значением, чтобы изменить его период

if(TMR0_InterruptHandler)
{
TMR0_InterruptHandler();
}

Эту тему с обработчиком прерываний я пока сам не понимаю, но оставим как есть, надеюсь поймем это со временем.

Теперь мы должны понимать, что согласно нашим настройка мы можем получить период прерываний равный 2,56 мс это вытекает из используемого предделителя и его настроек, обратим внимание на окно программные настройки.

Добавив коэффициент мы можем программно изменить период формируемый нашим таймером например равный 1 секунде. У нас период самого таймера 2,56 мс, а нужно 1 секунда, 1000 /2,56 =  получим 390.625, округленно 391.

Нажмет секретную кнопку

А теперь посмотрим что натворили типа номер 2, функция TMR0_ISR преобразилась следующим образом:

void TMR0_ISR(void)
{
    static volatile uint16_t CountCallBack = 0;

    // Clear the TMR0 interrupt flag
    INTCONbits.TMR0IF = 0;

    TMR0 = timer0ReloadVal;

    // callback function - called every 391th pass
    if (++CountCallBack >= TMR0_INTERRUPT_TICKER_FACTOR)
    {
        // ticker function call
        TMR0_CallBack();

        // reset ticker counter
        CountCallBack = 0;
    }

    // add your TMR0 interrupt custom code
}

В неё встроено условие отчета переменной CountCallBack до значения 391 (круто вообще ничего писать не надо, только умные мысли и тыканья в нужные окошки!)

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

    // Enable the Global Interrupts
    INTERRUPT_GlobalInterruptEnable();

Для удобства использования описаний светодиодов перенесем их из файла main.c в файл шапку описания функций выводов pin_manager.h

Часть файла с изменениями

#define PULL_UP_ENABLED      1
#define PULL_UP_DISABLED     0

// описание подключения светодиодов
#define LD1 LATC3   //
#define LD2 LATC6   //

// get/set IO_RA0 aliases
#define IO_RA0_TRIS               TRISAbits.TRISA0

и добавим описание выводов в файл заголовка таймера

#include <stdint.h>
#include <stdbool.h>
#include "pin_manager.h"

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

Закомментируем в основном цикле  управление светодиодами

    LD1=0;  // погасить
    LD2=1;  // 0-погасить/1-засветить
    
    while (1)
    {
        CLRWDT();   //сброс сторожевого таймера +++++++++++++++++++++-    
        // Add your application code
//        __delay_ms (500);
//        LD2=!LD2;  
//        LD1=!LD1;
    }

а в функцию обработки прерываний добавим управление светодиодами

void TMR0_CallBack(void)
{
    // Add your custom callback code here
    
    LD1=!LD1;
    LD2=!LD2;
    
    if(TMR0_InterruptHandler)
    {
        TMR0_InterruptHandler();
    }
}

В основной программе мы имеем, можно сказать ничего, а светодиоды мигают!!!

void main(void)
{
    
    // initialize the device
    SYSTEM_Initialize();
    
    CLRWDT();   //сброс сторожевого таймера +++++++++++++++++++++- 

    // When using interrupts, you need to set the Global and Peripheral Interrupt Enable bits
    // Use the following macros to:

    // Enable the Global Interrupts
    INTERRUPT_GlobalInterruptEnable();

    // Enable the Peripheral Interrupts
    //INTERRUPT_PeripheralInterruptEnable();

    // Disable the Global Interrupts
    //INTERRUPT_GlobalInterruptDisable();

    // Disable the Peripheral Interrupts
    //INTERRUPT_PeripheralInterruptDisable();

    LD1=0;  // погасить
    LD2=1;  // 0-погасить/1-засветить
    
    while (1)
    {
        CLRWDT();   //сброс сторожевого таймера +++++++++++++++++++++-    
        // Add your application code
//        __delay_ms (500);
//        LD2=!LD2;  
//        LD1=!LD1;
    }
}

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

Переключимся на вкладку MCC изменим параметр Callback Function Rate на 195

Нажмем кнопку

MCC с генерирует код и откроет окно Merge [MMC], нам необходимо, проанализировать какие изменения нужно в нести в наши файлы а какие нет.

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

После чего, чего окно Merge [MMC] можно закрыть, появиться всплывающее окно, согласитесь

Перейдем на закладку main.c и нажмем кнопку F6 (запустим компиляцию проекта и пере прошьём микроконтроллер). Мигание светодиодов увеличилось, теперь из переключение равно 0,5 секунды, а период 1 секунда.


Проект для этой статьи 

Значок

Проект с использованием MCC часть 05 248.00 KB 102 downloads

Эту часть назовем так как избавься от delay, там...


Ввод данных в микроконтроллер, кнопочки …. в следующей части 6…



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


  • ESP32-первое знакомствоESP32-первое знакомство
    Visits: 6338 Музыкальная тема к статье, слушаем: Настало время познакомиться c ESP32 и для меня, для этого я приобрел в ГАММЕ отладочную плату с модулем ESP-WROOM-32 (ESP32-DevKitC). Первая задача, как …
  • Altium Designer my setup system and project structureAltium Designer my setup system and project structure
    Visits: 620 Используйте только последнее обновление!!! Updates https://catcatcat.d-lan.dp.ua/altium-designer-my-libraries-project-templates-system-settings-by-catcatcat-v23-09/        Тут хочу поделиться как я настраиваю Altium Designer и как я использую файлы DXPPreferences.DXPPrf для быстрой конфигурации и получения …
  • APA102 – светодиоды со встроенным драйвером и SPI интерфейсомAPA102 – светодиоды со встроенным драйвером и SPI интерфейсом
    Visits: 3253 APA102 В 2014 году фирма Shenzhen Led Color Optoelectronic Co., Ltd http://www.szledcolor.com/ начала производство светодиодов на драйвере APA102. Это серия так называемых светодиодов со встроенным драйвером. Основной особенностью этих …
  • Стробоскоп для автомобиляСтробоскоп для автомобиля
    Visits: 2148 Одним из популярных решений светового тюнинга автомобиля, мотоцикла или скутера стал эффект –  “полицейский стробоскоп“. На база платы ch-c0050 реализовано несколько проектов. В этой статье приводятся две версии …
  • Audio-bluetooth modules F-6188 (BK8000L)Audio-bluetooth modules F-6188 (BK8000L)
    Visits: 2266Следующий модуль на чипе BK8000L. Заводское обозначение F-6188 также основным производителем не выпускается и отдан на тиражирование. с нижней стороны имеет маркировку В этом варианте мне попалась вроде полноценная …
  • Ссылки на интересные источникиСсылки на интересные источники
    Visits: 816 Сбор 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 …
  • VU Meter Tower ART – part 2VU Meter Tower ART – part 2
    Visits: 961 Проект – VU Meter Tower ART получил продолжение в своем развитии. Теперь можно заказать набор деталей из акрила для самостоятельной сборки. В проект корпуса внесено целый ряд доработок, …
  • Самый простой диммер для светодиодного освещенияСамый простой диммер для светодиодного освещения
    Visits: 2973 Светодиоды все больше входят в нашу жизнь как источники освещения и как само собой разумеющееся, это вопрос регулировки яркости. Существует множество схемных решений, но в нашем варианте мы …
  • Самый простой индикатор уровня звукового сигналаСамый простой индикатор уровня звукового сигнала
    Visits: 6212 Демонстрационный проект создания индикаторов уровня с использованием WS2812B. Изучив этот проект вы сможете  самостоятельно изготавливать и конструировать свои индикаторы уровня звукового сигнала. Дополнительно читайте статью Бегущие огни на …
  • Универсальный терморегулятор ch-c3000Универсальный терморегулятор ch-c3000
    Visits: 2960 Терморегулятор ch-c3000 предназначен для управления системами регулирования температуры в пределах от – (минус) 55 до + 125 С. Регулятор может использоваться как в системах отопления, так и в …



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

Catcatcat

catcatcat

Development of embedded systems based on Microchip microcontrollers.

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

НазадДалее

5 комментариев для “Проект с использованием MCC часть 05

  1. В принципе до этого места всё было ясно. Но:
    1
    2
    // Enable the Global Interrupts
    INTERRUPT_GlobalInterruptEnable();
    в какой файл и в какое место в файле это нужно вписывать?
    Большая просьба показывать файл целиком после изменения, как это было в начале обучения.

    1. В PIC16 есть бит(флаг управления) глобальными прерываниями, это типа включить прерывания все или все отключить. Эта функция выполняет именно опцию включить. Она вписывается MCC автоматически в главный файл программы.
      Для того, чтобы посмотреть, это это такое нажимаем и удерживаем клавишу Ctrl и наводим на неё мышкой появиться “ссылка”, клацаем и MPLABX покажет, откуда ноги растут:
      #define INTERRUPT_GlobalInterruptEnable() (INTCONbits.GIE = 1).
      Запускаются прерывания (в классике) когда все для этого подготовлено в настройке модуля.

    1. Добрый вечер, продолжение будет по мере свободного времени.
      По радиомодулю RFM95, можно попробовать, что то сделать, когда дойду до SPI, но во первых, надо поставить конкретную задач как его использовать, я так гляну, что он LoRaWAN поддерживает и если его оживить в таком режим, это было бы реально круто. Но сразу скажу, с эти модулем я дело не имел. И для начала надо хотя бы шт 3 приобрести, если на нем сеть подымать.

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

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