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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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 преобразилась следующим образом:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

Icon

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

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


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



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


  • ESP8266 применение в проектахESP8266 применение в проектах
    ESP8266 показала себя как надежное и безотказное устройство для обмена данными с применением WIFI. Я использую ESP8266 исключительно через UART, с применением AT команд. Все требования по обмену данными, между устройствами, …
  • Проект с использованием MCC часть 10Проект с использованием MCC часть 10
    Алгоритм управления освещением от нажатия кнопки. Обработка удержания кнопки: Мы должны проверить кнопка в настоящий момент нажата и флаг удержания установлен, если да Проверить таймер удержания “отработал” – это значит, …
  • ch-светомузыка и AK4113ch-светомузыка и AK4113
    Пришло время вернуться к светомузыке. На сегодня использование аналогового входа стало непрактичным, на сегодня необходимо использовать S/PDIF и Toslink. С этим надо было как то разобрать, что это такое, так …
  • ESP8266  процедура получение данных даты и времени от серверов точного времени.ESP8266 процедура получение данных даты и времени от серверов точного времени.
    Эта функция доступна уже в версии 1.6.1. Для многих приложений, необходимо часы реального времени,  если в вашем проекте есть модуль WiFI ESP8266, то легко можно сделать следующим образом. Процедура описывает …
  • WiFi ESP8266 – AT команды связанные с функцией TCP/IP (v.1.6.1)WiFi ESP8266 – AT команды связанные с функцией TCP/IP (v.1.6.1)
    AT команды связанные с функцией TCP/IP В этом разделе описаны команды которые позволяют устанавливать соединения между серверами и клиентами в сети. Приведено описание команд и примеры их выполнения. Функции TCP/IP …
  • PIC18 – System ArbitrationPIC18 – System Arbitration
    Системный арбитр. Разрешает доступ к памяти между выборами уровнями системы (т.е. Main, Interrupt Service Routine) и выбором периферийных устройств (т.е. DMA и Scanner) на основе назначенных пользователем приоритетов. Каждый из уровней …
  • Проект с использованием MCC часть 11Проект с использованием MCC часть 11
    Можно несколько облагородить программу вынести наши процедуры обработки нажатия кнопок в отдельные функции. Но вы должны понимать, что это хоть и не значительно, но будет тормозить общую скорость работы проекта, …
  • PIC18F25K42 – v. A001 – выявленные баги.PIC18F25K42 – v. A001 – выявленные баги.
    Модуль I2C Не работает при использовании в стандартной конфигурации MCC. Требует особой нестандартной конфигурации и управления для нормальной работы. Обойти Обход проблемы возможен библиотека см статью. Модуль ADC2 На выводе RA0, …
  • Просто о структурах и объединениях в СиПросто о структурах и объединениях в Си
    Какие задачи нам позволяют решать структуры и объединения? Для разработчика встроенных систем эффективность и компактность кода всегда на первом месте. Если программировании на Ассемблере ты сам определяешь как и где …
  • Проект с использованием MCC часть 02Проект с использованием MCC часть 02
    Когда мы запустили конфигуратор, самое главное понять, что с этим делать и как проверить, то что мы делаем работает или нет. Для начала настроим регистры конфигурации микроконтроллера и настроем тактовый генератор. …



Tagged with →  
Share →

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

  1. :

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

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

  2. а когда продолжение остальных частей? и кстати вопрос такой. вот есть радиомодуль RFM95 (868MHz) под него можешь либу накидать?

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

    • НА http://www.hoperf.com/rf_transceiver/lora/RFM95W.html есть полностью готовый проект на PIC16. Думаю запустить его не составить трудности при наличии радиомодулей.

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

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

Translate »

Copyright © Catcatcat electronics 2013-2019. Все права защищены.
Копирование разрешается только с указанием активной ссылки на правообладателя.

e-mail: catcatcat.electronics@gmail.com