Site Loader

Простой таймер на PIC16F628A. Схема и описание

Это схема простого таймера построенного на микроконтроллере PIC16F628A и индикаторе LCD 1602. Идея таймера позаимствована с одного португальского сайта по радиоэлектронике.

Микроконтроллер PIC16F628A в данной схеме тактируется от внутреннего генератора , который является достаточно точным для данного случая, но поскольку выводы 15 и 16 остаются незанятыми, то можно было бы использовать внешний кварцевый резонатор для большей точности.

Таймер на PIC16F628A. Описание работы

Как уже было сказано ранее, этот проект создан на основе уже существующего проекта, но на самом деле обе схемы отличаются друг от друга, и поэтому код был практически полностью переписан. В таймере для управления есть три кнопки: «START/STOP», «MIN» и «SEC»

  1. «START/STOP» — для запуска и приостановки таймера.
  2. «MIN» — для установки минут. Количество минут устанавливаются от 0 до 99, а затем все начинается снова с 0.
  3. «SEC» — для установки секунд. Секунду также устанавливаются от 0 до 59 и потом снова с 0.

Одновременное нажатие на «MIN» и «SEC» приводит к сбросу таймера во время работы.

Когда время на таймере достигает 00:00, раздается звуковой сигнал (3 коротких и 1 длинный звуковой сигнал) и светодиод HL1 загорается. В качестве звукоизлучателя применен зуммер электромагнитного типа. После этого, при нажатии одной из кнопок, происходит сброс таймера и выключение светодиода HL1.

Когда таймер производит обратный отсчет на выводе 13 (RB7) находится высокий уровень, а при остановке таймера появляется низкий логический уровень. Данный вывод можно использовать для управления внешними исполнительными устройствами. питание таймера осуществляется от cстабилизированного источника на 78L05.

Перемычка J1 предназначена для калибровки таймера. При ее замыкании таймер входит в режим настройки. С помощью кнопок «MIN» и «SEC» можно увеличить/уменьшить значение внутреннего параметра, который позволяет замедлять или ускорять работу таймера. Это значение сохраняется в EEPROM. Если находясь в этом режиме нажать кнопку «START/STOP», то этот параметр будет сброшен до значения по умолчанию.

Код написан и скомпилирован с mikroC PRO для PIC.

Параметры проекта:

  • Генератор: INTOSC
  • Частота генератора: 4 МГц
  • Сторожевой Таймер: отключен
  • Power-up таймер: включен
  • RA5/MCLR/VPP : отключен
  • Brown-out: включен

Фото готового таймера:

Скачать прошивку и рисунок печатной платы (unknown, скачано: 3 209)

Таймер на PIC16F628A | Все своими руками

Опубликовал admin | Дата 14 декабря, 2014

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


Для упрощения программы было принято решение изменить схему подключения светодиода, индицирующего начало работы таймера. Выход на светодиод был перемещен с вывода 13 DD1, это седьмой разряд порта В, на пятнадцатый вывод – шестой разряд порта А. В остальном схема осталась такой же. Кстати, использовать составной трехамперный транзистор КТ973А в данной конструкции я думаю не целесообразно, да и не всегда он оказывается под рукой в нужный момент. Для усилителя импульсов звуковой частоты может подойти и маломощный транзистор КТ361Г.


     Его мощность коллектора составляет 150 милливатт. Смотрим таблицу. Но ее можно значительно увеличить, если дополнить транзистор теплоотводом, который можно изготовить из медной полоски. Ширина полоски равна ширине корпуса транзистора, длина произвольная. Изгибается полоска в соответствии с фото.


     Из более тонкой полоски делается зажим, но можно сделать его и из такой же полоски, что и сам теплоотвод. Теплоотвод одевается на корпус транзистора через теплопроводную пасту. Качественно сделанный теплоотвод «сидит» на корпусе транзистора довольно прочно и мощность коллектора транзистора при этом может достигать 500… 700 милливатт.


А громкости звука при такой мощности транзистора вполне достаточно даже для больших помещений. Тем более что транзистор в данной схеме, работает в импульсном режиме, и коэффициент полезного действия при этом очень большой. Если в одной из отогнутых сторон полоски сделать отверстие, то такой теплоотвод можно крепить к плате с помощью винтика, диаметром 2… 3 мм. На все про все у меня уходит пять минут. Рисунок печатной платы можно скачать из прошлой статьи «Таймер для кухни», внеся соответствующие небольшие изменения в топологию проводников в соответствии с этой схемой или конечно нарисовать самим.

Скачать “Таймер на PIC16F628A” Timer_628_OA.rar – Загружено 960 раз – 40 KB

Обсудить эту статью на — форуме «Радиоэлектроника, вопросы и ответы».

Просмотров:7 623


Простой электронный таймер на PIC16F628A. Схема

Этот простой таймер на PIC16F628A можно использовать на кухни, да и не только на кухне, а везде где необходимо отсчитать промежуток времени от 1 до 99 минут. Основой таймера является микроконтроллер PIC16F628A – достаточно популярный и не дорогой. В предыдущих статьях были рассмотрены различные конструкции на данном микроконтроллере, к примеру, тахометр на микроконтроллере.

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

Описание работы простого таймера на PIC16F628A

После подачи питания на схему таймера на светодиодных индикаторах высвечивается установленное время, светодиод не светится. Путем вращения ручки валкодера возможно поменять установку времени от 1 до 99 минут.

Схема таймера — индикаторы с общим катодом

Схема таймера — индикаторы с общим анодом

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

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

Вторая версия функционирует так же, как и первая, однако снабжена небольшими дополнениями. В состоянии выбора времени, если   валкодер не крутить 2-3 секунды, на индикаторе появится анимационная заставка. Вращение валкодера или нажатие кнопки отключает заставку и снова активизируется режим выбора времени.

В момент отсчета времени, если до конца осталась 1-а минута, на индикаторе отобразятся секунды от 60 до 00. По завершению отсчета, сигнал будет звучать около 20 секунд и на табло появится уже другая заставка. Пока не будет нажата кнопка, таймер будет каждую минуту подавать короткий сигнал.

Скачать прошивку (31,7 KiB, скачано: 787)

Источник

Программируемый цифровой таймер на PIC16F628a до 100 часов

Схема цифрового таймера на PIC16F628a, приведенная в данной статье, позволяет включать и выключать по расписанию нагрузку (бытовые приборы и электронные устройства). Нагрузка управляется посредством электромагнитного реле.

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

Предельный интервал времени, который вы можете установить для включения и выключения нагрузки — 99 часов и 59 минут. Для удобства работы таймер снабжен ЖК-дисплем 16×2 и 4-мя кнопками. Принципиальная схема данного цифрового таймера показана на рисунке ниже.

Реле с рабочим напряжением 5В коммутируется с помощью NPN транзистора BC337, управление самим же транзистором происходит сигналом с вывода 9 (RB3) микроконтроллера PIC16F628A.

Цифровые сигналы от 4-х кнопок считываются через входы 1, 2, 3 и 6. Стандартный LCD индикатор 16×2 работает в 4-битном режиме, поэтому задействованы только 6 контактов ввода/вывода микроконтроллера. Зуммер обеспечивает звуковой сигнал в момент, когда таймер запускается и останавливается. Он также издает звуковой сигнал, когда нагрузка включена или выключена.

Работа таймера просимулирована в Proteus:

Работа таймера

Все управление таймером осуществляется четырьмя кнопками:

  • Кнопка SA1 (on/off) — позволяет устанавливать как время включения, так и время выключения таймера. При подаче питания на таймер, нагрузка находится в выключенном состоянии, и оба времени (включения и выключения) равны 0. При нажатии на кнопку SA1, вы можете переключаться между режимами включения и выключения.
  • Кнопка SA2 (select) — позволяет выбирать во время установки цифры часов и минут включения и выключения таймера. Выбранная цифра увеличивается на единицу при нажатии SA1.
  • Кнопка SA3 (enter) — позволяет выйти из режима установки таймера.
  • Кнопка SA4 (start/stop) — запускает и останавливает работу таймера.

Теперь давайте посмотрим, как это работает. Предположим, что мы хотим включить нагрузку через 2 минуты и отключить ее после 20 минут работы. В этом случае время выключения (ON) будет 00:02, а время выключения (OFF) 00:20, в формате чч: мм. После нажатия на кнопку SA4 запуститься таймер, и нагрузка включится через 2 минуты, и отключиться через 20 минут.

Скачать прошивку + proteus (20,7 KiB, скачано: 1 251)

Источник

Программируемый таймер для управления внешними устройствами на PIC16F628A
Таймерами называют довольно широкий диапазон различных технических устройств а также внутренних узлов микроконтроллеров. В данном случае таймер — это цифровое устройство, предназначенное для включения и отключения внешнего устройства по заданной программе. Это может быть, например, устройство автоматического полива растений или устройство автоматического кормления аквариумных рыбок.. Все зависит от вашей фантазии. К примеру, я когда-то долгое время использовал подобное устройство для периодического включения / выключения холодильника, у которого сломалось механическое термореле.

Таймер собран на очень распространенном и дешевом микроконтроллере от

Microchip, 8-разрядный PIC16F628A. Пользователь может запрограммировать интервал между включениями внешнего устройства и продолжительность его работы. максимальное время паузы и включения составляет 99 часов 59 минут, то есть, фактически 100 часов.

Для управления таймером используются четыре кнопки, а для отображения информации применен стандартный ЖК индикатор на 2 строки из 16 символов, работающий на основе контроллера HD44780U от фирмы

Hitachi.
  
      
Для управления внешним устройством использовано электромагнитное реле. Обмотка реле должна быть рассчитана на напрядение 5V. Микроконтроллер управляет реле через ключ на транзисторе PN2222. Контакты реле должны быть рассчитаны на ток, потребляемый управляемым устройством. Кнопки управления подключены к портам микроконтроллера RB0, RA2, RA3 и RA4.

Дисплей работает в четырехбитном режиме и для его управления требуется 6 портов микроконтроллера. Для звуковой сигнализации включения и отключения нагрузки использован пьезокерамический звонок. Звуковой сигнал также подается и при включении питания таймера.

Блок питания таймера содержит стабилизатор напряжения +5V на микросхеме —  регуляторе LM7805. Для питания таймера от сети 220 вольт можно использовать любой нестабилизированный сетевой адаптер, купленный на китайском рынке. Выходное напряжение адаптера может быть в переделах 9 — 14 вольт.
  

   
Если мы внимательно посмотрим на схему устройства, то заметим, что выводы индикатора с номерами 15 и 16 не используются. они подключаются только в индикаторах с фоновой подсветкой. если вы хотите использовать индикатор с подсветкой, то подключите ее к +5B через резистор сопротивлением 39 Ом.
   

Кнопка Start/Stop. При нажатии на эту кнопку таймер запускается или останавливается.  При первом нажатии начинается отсчет времени выключенного состояния. Потом таймер включает внешнее устройство и начинает отсчет времени во включенном состоянии.

Кнопка On/Off Timeпозволяет запрограммировать таймер, установив время выключенного и включенного состояний внешнего устройства.

Кнопка Select дает  возможность переключаться между устанавливаемым параметром — часы — минуты — время включенного состояния — время выключенного состояния.

Кнопка Enter служит для подтверждения установленного значения.
  

Основные компоненты для сборки таймера можно недорого купить в Китае по следующим ссылкам:
   

Таймер на PIC16F628A — Устройства на микроконтроллерах — Схемы устройств на микроконтроллерах

Это очередная поделка из хлама — таймер для кухни, хотя и не обязательно для кухни. В ход пошли детали которые валялись без дела, в частности старые индикаторы АЛСки, резисторы выпаянные из старых плат и т.д. Основа устройства микроконтроллер PIC16F628A, один из самых распространенных и дешевых. Управление таймером осуществляется с помощью валкодера и одной кнопки. Диапазон выдержки времени от 1 до 99 минут. По окончанию цикла отсчета времени подается прерывистый звуковой сигнал. А архиве лежит две прошивки, первая просто таймер, а вторая с некоторыми наворотами, об этом ниже.

После включения питания на индикаторах высвечивается заданное время, светодиод не горит. Вращая валкодер можно изменить установку времени от 1 до 99 минут. Когда время установлено, нажимаем кнопку — раздается короткий звуковой сигнал и таймер начинает отсчет времени, светодиод мигает, а время на индикаторе уменьшается каждую минуту. Когда время дошло до нуля, таймер издает прерывистые звуковые сигналы, светодиод светиться постоянно. Теперь нажатием кнопки снимается звуковой сигнал и девайс возвращается в исходное состояние — режим установки времени. Так работает первая версия прошивки.

Вторая версия прошивки работает также как и первая, но имеет несколько дополнений. В режиме установки времени, если к валкодеру не прикасаться несколько секунд, на дисплее начинает бегать анимационная заставка. нажатие кнопки или вращение валкодера отключит анимацию и вновь отобразит режим установки времени. Во время отсчета времени, если осталась одна минута, на дисплее индицируются секунды от 60 до 00. Когда сработал звуковой сигнал, звучать он будет не бесконечно, а около 20 секунд. Далее дисплей начинает индицировать анимационную заставку (отличную от той, которая в режиме установки). А также, через каждую минуту будет напоминать коротким звуковым сигналом. Нажатием кнопки также, как и в первой прошивке таймер сбрасуется в режим установки времени. Когда до срабатывания таймера остается 3 секунды, таймер издает на каждую секунду короткий звуковой сигнал, т.е. 3…2…1 и далее срабатывает как обычно. Обе прошивки доступны и лежат в архиве вместе с рисунком печатной платы.

Звуковой сигнал реализован с помощью аппартаного ШИМ встроенного в микроконтроллер. Динамическая головка должна иметь сопротивление порядка 50 ом. Можно применить и низкоомные динамические головки (4 или 8 ом), но в данном случае лучше установить малогабаритный выходной трансформатор, т.к. через 4 омную головку будет протекать большой ток, который может вызвать перегрузку блока питания и спровоцировать сброс микроконтроллера.




Скачать — рисунки печатных плат и прошивки микроконтроллера 

PIC Урок 5. Таймеры |

&nbsp

&nbsp

&nbsp

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

Начнём мы с самого простого таймера. Да и по другому мы пока и не сможем, так как у контроллера PIC16F64A он единственный – это таймер 0.

Таймер 0 или TMR0, как он обозначен в технической документации, – это 8-разрядный таймер/счётчик, который умеет считать только от 0 до 255, и как только достигает данной величины, происходит прерывание, если оно конечно задействовано. Правда мы можем, конечно, в ходе программы в любой момент узнать значение счётчика, но, правда, не знаю, нужно ли нам это. Также мы можем устанавливать скорость счёта посредством использования предделителя, можем выбирать внутренний или внешний источник тактирования таймера, и ещё можем выбрать активный фронт – инкрементирование значения счётчика по положительному или по отрицательному фронту (спаду), но только при условии, что источник тактового сигнала внешний. Вот такие вот мы возможности имеем с данным таймером. Не густо, но и тем не менее пользу от этого таймера мы извлечём. И не только ту пользу, что мы ознакомимся с данным таймером и это нам поможет проще затем понимать структуру и работу более сложных таймеров у других контроллеров PIC, но и также по окончанию занятия мы наглядно увидим, что использование данного таймера, например для бегущих огней вместо бесконечного цикла никак не влияет на ход основной программы.

Вот блок-схема данного таймера

 

 

В данной схеме показаны все блоки нашего таймера, а также указаны биты, которые управляют данными блоками. Биты T0CS, T0SE, PSA, PS2:PS0 расположены в регистре OPTION_REG

 

 

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

TOCS (TMR0 Clock Source Select) – выбор сингала для таймера: 0 – внутренний тактовый сигнал, 1 – внешний.

T0SE (TMR0 Source Edge Select) – выбор фронта приращения при внешнем тактовом сигнале: 0 – по переднему фронту, 1 – по заднему.

PSA (Prescaler Assignment) – выбор способа включения предделителя: 0 – предделитель включен через TMR0, 1 – через WDT.

PS2:PS0 (Prescaler Rate Select) – коэффициент деления предделителя

Как именно работает таймер, мы подробно не будем здесь обсуждать, так как это всё подробно расписано в технической документации. Лишь подчеркну интересную особенность – это то, что мы можем также свободно изменять значение счёта в регистре, но любое изменение в нём вызовет запрещение наращивания счёта в течение двух машинных циклов. То есть если мы решим программно менять данное значение, то эту особенность мы обязаны учитывать.

Также давайте посмотрим другие регистры, которые задействуются нашим таймером.

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

 

 

В данном регистре нам потребуются сегодня только три бита:

GIE (Global Interrupt Enable) – разрешение глобальных прерываний: 0 – все прерывания запрещены, 1 – все немаскированные прерывания разрешены.

T0IE (TMR0 Overflow Interrupt Enable) – разрешение прерывания по переполнению таймера 0: 0 – прерывание запрещено, 1 – прерывание разрешено.

T0IF (TMR0 Overflow Interrupt Flag) – флаг прерывания по переполнению таймера 0: 0 – внешнего прерывания нет, 1 – произошло переполнение счётчика таймера 0 (сбрасывается программно).

Ну и соответственно регистр значения счёта нашего таймера

 

 

Теперь давайте потихоньку переходить к коду.

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

Откроем наш проект в MPLAB X и попробуем его собрать. Если всё нормально, то откроем ещё проект для претеуса и выберем файл прошивки, которая у нас только что сгенерировалась при сборке проекта в среде программирования.

В файле main.c (а другого-то у нас пока и нет) в функции main сначала включим нужные нам биты в регистре OPTION_REG

 

TRISA |= 0x04;

OPTION_REG=0x07;

 

Мы включили биты 0,1 и  2 – это биты предделителя, то есть мы используем деление частоты максимальное – на 256. То есть частота приращения счёта будет 1000000/256 или приблизительно 3,9 кГц. Но так как таймер будет считать от 0 до 255, то мы ещё раз делим на 256 и получаем приблизительно 15,3 Гц. Это потому, что прерывание происходит именно по окончанию счёта ну или по переполнению счётчика и получается, что обработка прерывания будет вызываться именно с такой частотой. То есть светодиоды будут у нас бежать с периодом около 65 милисекунд. Нормально.

Далее включим глобальные прерывания и прерывания от таймера, установив в 1 биты 7 и 5 регистра INTCON

 

OPTION_REG=0x07;

INTCON=0xA0;

 

И затем занесём 0 в регистр счёта таймера, тем самым запустим таймер

 

INTCON=0xA0;

TMR0=0;

 

Добавим глобальную переменную для счёта вхождений в обработчик прерывания

 

#pragma config CP = OFF // Code Protection bit (Code protection disabled)

//--------------------------------------------

unsigned int TIM0_count=0;

//--------------------------------------------

 

Добавим специальную функцию-обработчик прерывания от таймера 0 выше функции main()

 

//--------------------------------------------

void interrupt timer0()

{

}

//--------------------------------------------

 

В данную функцию мы попадаем, когда происходит переполнение счёта, то есть когда счёт таймера достигнет числа 255.

Мы будем нашу глобальную переменную инкрементировать каждый раз, когда будем попадать в данную функцию.

Так как у нас 10 светодиодов, то мы их будем по очереди зажигать, а предыдущий тушить, также каждое вхождение. Чтобы это проще реализовать, то мы поделим значение нашей глобальной переменной на 10 по модулю и будем последовательно получать значение от 0 до 9 каждое вхождение в функцию. И в зависимости от цифры будем зажигать соответствующий светодиод. Для этого, я думаю, лучше воспользоваться оператором switch

 

void interrupt timer0()

{

  switch(TIM0_count%10)

  {

  case 0:

  PORTAbits.RA1 = 0;

  PORTBbits.RB0 = 1;

  break;

  case 1:

    PORTBbits.RB0 = 0;

    PORTBbits.RB1 = 1;

    break;

  case 2:

    PORTBbits.RB1 = 0;

    PORTBbits.RB2 = 1;

    break;

  case 3:

    PORTBbits.RB2 = 0;

    PORTBbits.RB3 = 1;

    break;

  case 4:

    PORTBbits.RB3 = 0;

    PORTBbits.RB4 = 1;

    break;

  case 5:

    PORTBbits.RB4 = 0;

    PORTBbits.RB5 = 1;

    break;

  case 6:

    PORTBbits.RB5 = 0;

    PORTBbits.RB6 = 1;

    break;

  case 7:

    PORTBbits.RB6 = 0;

    PORTBbits.RB7 = 1;

    break;

  case 8:

    PORTBbits.RB7 = 0;

    PORTAbits.RA0 = 1;

    break;

  case 9:

    PORTAbits.RA0 = 0;

    PORTAbits.RA1 = 1;

    break;

  }

}

 

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

Далее мы инкрементируем переменную счёта

 

    break;

  }

  TIM0_count++;

}

 

Так как у нас переменная для счёта 16-битная беззнаковая, то она будет считать до 65535 и получится что в самом конце она досчитает только до 5 в состоянии разделённом по модулю на 10. Поэтому мы обнулим её раньше, чтобы все циклы у нас доходили до 9 при разделении на 10 по модулю

 

TIM0_count++;

if(TIM0_count>3999)

{

  TIM0_count=0;

}

 

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

 

    TIM0_count=0;

  }

  T0IF=0;

}

 

Вот в принципе и весь код. Соберём его и посмотрим результат сначала в протеусе

 

 

Всё отлично работает.

Прошьём теперь настоящий контроллер и посмотрим всё, как говорится, наяву

 

 

Мы видим, что всё работает, а задвоение происходит, что период горения светодиода скорее всего меньше чем выдержка камеры и поэтому попадает в кадр ещё один светящийся диод.

А теперь самое интересное. Мы же не трогали код, который запускает бегущие огни по нажатию кнопки. Нажмём на кнопку и увидим вот такую картину

 

 

За бегущими огнями, работающими по прерыванию таймерами устремится ещё один бегущий огонь, запущенный по кнопке. Правда он его не догонит, так как задержка у нас 100 милисекунд, что больше чем период между прерываниями. Но если мы наоборот нажмём кнопку раньше, чем запустится очередной цикл от таймера, то таймерный цикл уже возможно кнопочный догонит.

Но всё дело не в этом, а в том, что мы на практике увидели, что какие-то периодические действия, запущенные от таймера не влияют на ход основной программы. А это великое дело!

Всем спасибо за внимание!

Ждите следующих интересных уроков.

 

 

Предыдущий урок Программирование МК PIC Следующий урок

 

Исходный код

 

 

Купить программатор (неоригинальный) можно здесь: PICKit3

Купить программатор (оригинальный) можно здесь: PICKit3 original

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

PIC Таймеры

Post Views: 14 624

таймер 0 и PIC16F628A

Джон Уайлдер

Таймер, установленный на микросхеме на некоторых PIC, сбивает с толку некоторых. Но, не волнуйтесь… это, вероятно, одна из самых простых встроенных периферийных устройств для использования на PIC. В этой статье мы будем использовать PIC16F628A как пример того, почему это так.

Таймер

(TMR0) — это один из трех доступных на 16F628A таймеров, которые постоянно работают — отключить его невозможно. Это в основном 8-битный регистр в SFR, и источник синхронизации контролирует его значение.Источником синхронизации для TMR0 может быть либо внешний строб-сигнал, подаваемый на вывод RA4 / T0CKI (T0CKI = таймер 0, вход тактового сигнала), либо это может быть внутренний тактовый цикл команд. При работе с внешним стробоскопом это может быть счетчик, который «считает» импульсы строба внешнего источника строба. При работе с часами цикла инструкций он работает как таймер. По этой причине вы иногда будете слышать, как инженеры называют TMR0 «таймером / счетчиком».

Значение, находящееся в регистре TMR0, начинается с 0x00, а затем увеличивается с коэффициентом один при каждом переходе от низкого к высокому тактового источника.Вы также можете настроить его для увеличения при переходе от высокого к низкому или к низкому уровню с помощью внешнего источника синхронизации. По сути, это просто регистр, который считает импульсы от одного из двух возможных источников тактовых импульсов до 0xFF (десятичное 255). Для этого примера мы будем использовать часы команд, работающие как таймер.

Часы команд работают на 1/4 частоты Fosc. Это означает, что, если Fosc = 4 МГц, наши тактовые импульсы будут работать на частоте 1 МГц, или одна инструкция в микросекунду. В этом сценарии — при условии, что мы не назначаем прескалер TM — значение TMR0 увеличивается при каждом импульсе такта команды.При тактовой частоте команд 1 МГц это увеличивает значение в регистре TMR0 один раз в каждую микросекунду (1 / μ).

Поскольку регистр TMR0 имеет ширину всего 8 бит, максимальное значение, к которому TMR0 может быть увеличен, равно 0xFF или десятичному значению 255. В этот момент он возвращается к нулю при следующем тактовом импульсе. Как только происходит это опрокидывание, в регистре INTCON устанавливается флаг прерывания от Таймера 0 (T0IF). Этот флаг должен быть сброшен в программном обеспечении.

Поскольку TMR0 в настоящее время выполняется с одним приращением на µ, это означает, что происходит опрокидывание, и флаг T0IF устанавливается один раз каждые 256μ (0x00 — 0xFF или 0-255 для 256 приращений).Если мы хотим узнать, когда прошел период 256 мкм, мы можем очистить TMR0, очистить флаг T0IF, затем опрашивать флаг прерывания T0IF, пока T0IF не достигнет высокого уровня (произошло опрокидывание), и продолжить нашу программу.

Конечно, таймер был бы бесполезен без какого-либо способа замедлить его до разных скоростей приращения. Это работа «прескалера». Прескалер позволяет нам предварительно масштабировать таймер так, чтобы вместо увеличения его на каждый тактовый импульс мы могли увеличивать его каждые два тактовых импульса, каждые четыре, каждые восемь и т. Д. Вплоть до каждых 256 тактовых импульсов.Если бы мы установили прескалер на 1: 256 с тактовой частотой 1 МГц, таймер будет увеличиваться один раз каждые 256 мкм. Поскольку наш регистр TMR0 может считать до 256, он будет подсчитывать, сколько раз период 256μ проходит до 256 раз. Это означает, что T0IF будет устанавливаться каждые 65,5 мсек (миллисекунды … 256 мкс х 256 = 65,5 мсек).

Четыре регистра TMR0
С TMR0 связаны четыре регистра: TMR0, OPTION_REG, INTCON и TRISA. Давайте посмотрим на это подробно.

TMRo
Регистр TMR0 содержит значение, которое увеличивается источником тактовых импульсов.Любые записи в этот регистр (то есть, clrf TMR0, movwf TMR0, bsf TMR0, X) также очищают прескалер обратно до 1: 2. Это означает, что вам придется сбрасывать прескалер обратно туда, где он был у вас каждый раз, когда вы пишете для регистрации TMR0, если он был установлен где-то, кроме 1: 2.

OPTION_REG
____
| РБПУ | INTEDG | T0CS | T0SE | PSA | PS2 | PS1 | PS0 |

Регистр OPTION содержит контрольные биты для следующего:

  • Таймер 0 Источник синхронизации (T0CS)
  • Бит выбора края таймера 0 (TOSE)
  • Преднаборный бит назначения (PSA)
  • Биты выбора скорости предскалера (PS2-PS0)

T0CS — выбирает источник синхронизации для TMR0.По умолчанию 1 / T0CKI. Очистка этого бита выберет тактовую команду в качестве источника тактовой частоты TMR0.

T0SE — определяет, будет ли TMR0 увеличиваться по нарастающему или падающему фронту T0CKI. По умолчанию 1 / Приращение по падающему фронту. Применяется только тогда, когда T0CKI является источником синхронизации.

PSA — устанавливает, назначен ли прескалер TMR0 или сторожевому таймеру. По умолчанию 1 / Prescaler назначен на WDT. При назначении на WDT TMR0 работает в масштабе 1: 1 (увеличивается с каждым импульсом тактового источника).

PS2-PS0 — устанавливает скорость предварительного масштабирования в диапазоне от 1: 2 до 1: 256 в значениях, кратных битам. По умолчанию 111/1: 256 (1: 128, если назначен WDT).

Code text pix 1
Настройка TMR0 с тактовыми часами команд в качестве источника тактовых импульсов и прескалером 1: 4

INTCON
Регистр управления прерываниями INTCON содержит как бит управления прерываниями TMR0 (T0IE), так и бит флага прерывания TMR0 (T0IF). Если прерывание TMR0 разрешено (по умолчанию T0IE = 1… отключено), счетчик программы перейдет к коду обработчика прерывания при переполнении TMR0, когда будет установлено значение T0IF (T0IF необходимо очистить в программном обеспечении до выхода из прерывания).Однако, поскольку T0IF продолжает нормально работать независимо от того, включено или отключено прерывание TMR0, оно всегда доступно для опроса, если вы не хотите, чтобы TMR0 инициировал прерывание.

code text 2
Настройка прерывания TMR0

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

TRISA
Регистр TRISA содержит бит направления порта для RA4 / T0CKI.Чтобы сконфигурировать RA4 в качестве входа источника синхронизации TMR0, бит TRISA 4 должен быть установлен для настройки его в качестве входа.

code text 3
Полная настройка TMR0 с прерыванием, тактовым сигналом в качестве источника тактового сигнала и прескалером 1: 4

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

code text 4

Использование TMR0 в качестве счетчика
Вы также можете настроить TMR0 в качестве счетчика импульсов.Для этого вы настраиваете T0CKI как источник синхронизации, устанавливая бит T0CS в OPTION_REG. Бит T0SE в OPTION_REG будет определять, увеличивается ли регистр TMR0 по заднему фронту источника импульсов (1) или по переднему фронту источника импульсов (0).

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

И это все, что нужно знать о TMR0. Просто верно?


jon wilder avatar smallest
Об авторе
Джон Уайлдер является независимым инженером-электронщиком и энтузиастом электроники более 20 лет. Он провел четыре года в ВМС США в качестве специалиста по авиационной электронике. Джон также играет на гитаре с 13 лет и начал интегрировать электронику и музыку с 15 лет. Джон создал свой первый ламповый усилитель в 17 лет. «Музыкальная электроника», говорит Джон, это его любовь и страсть.

Джон также является частым участником и страстным членом Electro-Tech-Online, сообщества членов электротехники. На сайте Electro-Tech-Online вы можете задавать вопросы и получать ответы от коллег-инженеров по всем вопросам — от микроконтроллеров, возобновляемых источников энергии и автомобильной электроники до моделирования и проектирования схем. Кроме того, существуют специализированные форумы MCU для 8051/8951, AVR, ARM, Arduino, Oshonsoft Project, а также хранилище кода, где участники делятся фрагментами кода.

Следуйте за Джоном в Твиттере на @PICmcuguy.

,Таймер от
до 99 минут с использованием микроконтроллера PIC16F628A

На прошлой неделе я просматривал свой старый резервный жесткий диск и нашел исходный код для очень простого цифрового таймера на основе PIC, который я сделал пару лет назад. Фактическое оборудование проекта больше не со мной. Я мог потерять его, когда переехал из своей старой квартиры в свой новый дом. Тем не менее, я подумал, что это может быть хорошим проектом для начинающих, и поэтому я делюсь им здесь. Я не собираюсь строить его с нуля снова; Я скорее продемонстрирую это, используя мой макетный модуль PIC16F628A DIY и плату ввода / вывода.Полная принципиальная схема вместе с микропрограммой, разработанной с использованием mikroC Pro для PIC-компилятора, представлена ​​в статье.

Таймер 0-99 минут

Принципиальная схема

Как я упоминал ранее, микроконтроллер, используемый в этом проекте, представляет собой PIC16F628A, работающий на тактовой частоте 4,0 МГц с использованием внешнего кристалла. 16х2-символьный ЖК-дисплей на основе HD44780 является основным блоком дисплея проекта, где вы можете наблюдать и устанавливать длительность таймера с помощью входов тактового переключателя. К контактам RB0 (пуск / стоп), RB1 (юнит) и RB2 (десять) подключены три тактовых переключателя.Вы можете выбрать интервал таймера от 0 до 99 минут с помощью переключателей Unit и Ten минут. Переключатель Старт / Стоп предназначен для включения и выключения таймера. Когда таймер включается, на выводе RA3 появляется сигнал высокого логического уровня, который можно использовать для включения реле. Принципиальная схема этого проекта описана ниже.

0-99 минутная схема таймера

Я использую свой самодельный макет для PIC16F628A и плату ввода / вывода экспериментатора здесь, чтобы продемонстрировать этот проект. Поскольку на плате ввода / вывода нет реле, я подключаю выход таймера (вывод RA3) к светодиоду.Когда таймер запускается, светодиод включается. По истечении времени таймера светодиод выключается.

Настройка схемы

Работа таймера

Когда устройство включено, микроконтроллер инициализирует ЖК-дисплей и показывает следующее сообщение. Таймер изначально выключен, как и светодиод или реле, в зависимости от того, какой из них подключен к контакту RA3.

Сообщение отображается при включении питания

Вы можете установить продолжительность от 00 до 99 минут (с шагом 1 минута), используя тактовый переключатель Unit и Ten.Каждое нажатие переключателя будет увеличивать соответствующую цифру времени.

Установка таймера минута

Когда желаемое время установлено, нажмите переключатель Старт / Стоп, чтобы включить таймер. Вывод RA3 становится высоким (светодиод светится), и начинается обратный отсчет. Когда таймер включен, оставшееся время также отображается на экране ЖКД. По истечении времени таймер останавливается и светодиод гаснет. Вы можете прервать и остановить таймер в любое время, еще раз нажав переключатель Старт / Стоп.

Отображение оставшегося времени на ЖК-дисплее

Программное обеспечение

Прошивка для PIC разработана с использованием mikroC Pro для PIC-компилятора.Использование таймеров исключено для простоты. Временные задержки создаются с помощью функции Delay_ms () mikroC, которая, по-видимому, дает достаточно точные временные задержки.

Скачать исходный код mikroC и HEX-файл

Для более продвинутого цифрового таймера, прочитайте мой другой проект: Программируемый цифровой таймер.

Похожие сообщения

,
Программируемый цифровой таймер с использованием микроконтроллера PIC

Цифровые таймеры используются для управления работой электрических устройств на основе запрограммированного расписания. В этом проекте описан программируемый цифровой таймер на основе микроконтроллера PIC16F628A, который может быть запрограммирован для планирования включения и выключения электроприборов. Прибор управляется через релейный переключатель. Этот таймер позволяет установить время включения и выключения. Это означает, что вы можете программировать, когда вы хотите включить устройство и как долго вы хотите, чтобы оно оставалось включенным.Максимальный интервал времени, который вы можете установить для включения и выключения, составляет 99 часов 59 минут. В проекте предусмотрен интерактивный пользовательский интерфейс с использованием 16-символьного ЖК-дисплея и четырех кнопок.

Программируемый цифровой таймер

Примечание: (30 июня 2016 г.) Пересмотренная версия этого проекта с добавленными новыми функциями размещена здесь .

Схемотехника

Принципиальная схема этого проекта показана ниже.Реле 5 В управляется транзистором PN2222, который управляется контактом RB3 PIC16F628A. Цифровые входы от 4 кнопок считываются через выводы портов RA2, RA3, RA4 и RB0. Функции этих кнопок обсуждаются в разделе операций ниже. Стандартный 16 × 2-символьный ЖК-дисплей используется в проекте для отображения состояния устройства, меню программы и времени. ЖК-дисплей работает в 4-битном режиме, поэтому для его управления требуется всего 6 выводов ввода / вывода PIC16F628A. Пьезоэлектрический зуммер подает звуковой сигнал при запуске и остановке таймера.Он также издает звуковые сигналы, когда устройство включено или выключено. Источник питания + 5 В для схемы получен от ИС регулятора LM7805. Вход в регулятор подается от настенного адаптера постоянного тока 9 В.

На принципиальной схеме контакты 15 и 16 ЖК-дисплея показаны открытыми. Эти контакты доступны только в тех ЖК-дисплеях, которые имеют подсветку подсветки. Контакты 15 и 16 являются анодом и катодом светодиода. Если ваш ЖК-дисплей оснащен светодиодом задней подсветки, вы можете подключить эти контакты к клеммам источника питания с помощью резистора 39 Ом последовательно.Светодиод подсветки улучшает читаемость ЖК-дисплея в условиях низкой освещенности.

Полная схема, припаянная на печатной плате общего назначения, показана ниже.

Работа таймера

Таймер получает данные от 4 кнопок. Их функции описаны следующим образом:

  • ВРЕМЯ ВКЛ / ВЫКЛ: Это устройство таймера позволяет вам устанавливать время включения и выключения. Когда таймер изначально включен, устройство находится в выключенном состоянии, и время включения и выключения равно 0.Нажав эту кнопку, вы можете переключаться между временем включения и выключения на дисплее.
  • ВЫБОР: Позволяет выбирать между настройками времени включения и выключения, а также часами и минутами. Выбранная цифра увеличивается нажатием кнопки ВРЕМЯ ВКЛ / ВЫКЛ.
  • ENTER: Когда выбраны подходящий час и минуты, нажмите ENTER, чтобы завершить соответствующее время включения или выключения.
  • START / STOP — запуск или остановка таймера. Если таймер уже включен, вы можете остановить его в любой момент во время его работы, нажав эту кнопку.

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

Программное обеспечение

Прошивка разработана с использованием MikroC Pro для PIC-компилятора.
Скачать исходный код

Скачать HEX файл

Цифровой таймер

Обновление (04/12/2013)
Марк Вейр из Австралии прислал нам свой пересмотренный вариант нашего программируемого цифрового таймера . Он изменил исходный код, который был написан для PIC16F628A, чтобы включить его в микроконтроллер PIC18F4620, в то время как аппаратные и общие функциональные возможности остались прежними.

Цифровой таймер с использованием PIC18F4620

Вот ссылка на скачивание его модифицированной версии прошивки, написанной в компиляторе MikroC.

Загрузить прошивку

Похожие сообщения

,
Понимание таймеров в микроконтроллере PIC со светодиодной последовательностью мигания

Это будет пятый урок из нашей серии PIC Tutorial , который поможет вам изучить и использовать таймеры в PIC16F877A . В наших предыдущих уроках мы начали с введения в PIC и MPLABX IDE, затем мы написали нашу первую программу PIC, чтобы мигать светодиод с помощью PIC, а затем создали последовательность мигания светодиода с помощью функции задержки в микроконтроллере PIC. Теперь давайте используем ту же последовательность мигания светодиодов, которую мы использовали в предыдущем учебном оборудовании, и вместе с этим мы узнаем, как использовать таймеры в нашей PIC MCU .Мы только что добавили еще одну кнопку в светодиодную панель для этого урока. Пройдите учебник, чтобы узнать больше.

Таймеры являются одной из важных рабочих лошадок для встроенного программиста. Каждое приложение, которое мы проектируем, будет каким-то образом включать приложение синхронизации, например, включать или выключать что-либо после определенного интервала времени. Хорошо, но зачем нам таймеры, когда у нас уже есть макросы задержки (__delay_ms ()), которые делают то же самое !!

Почему таймер, когда у нас есть задержка ()?

Макрос задержки называется задержкой «сброса».Поскольку во время выполнения функции задержки MCU выполняет дамп, просто создав задержку . Во время этого процесса MCU не может прослушивать свои значения АЦП или читать что-либо из своих регистров. Следовательно, не рекомендуется использовать функции задержки, за исключением приложений, таких как мигание светодиода, где задержка не должна быть точной или длительной.

Макросы задержки также имеют после коротких поступлений ,

  1. Значение задержки должно быть постоянным для макроса задержки; его нельзя изменить во время выполнения программы.Следовательно это остается определенным программистом.
  2. Задержка не будет точной по сравнению с использованием таймеров.
  3. Большие значения задержек не могут быть созданы с помощью макросов, например, задержка на полчаса не может быть создана с помощью макросов задержки. Максимальная задержка, которую можно использовать, основана на использовании кварцевого генератора.

PIC микроконтроллер Таймеры:

Физически, таймер — это регистр, значение которого постоянно увеличивается до 255, а затем он начинается заново: 0, 1, 2, 3, 4…255 …. 0, 1, 2, 3 …… и т. Д.

PIC MCU PIC16F877A имеет три модуля таймера . Они называются Timer0, Timer1 и Timer2. Таймер 0 и Таймер 2 — это 8-битные таймеры, а Таймер 1 — это 16-битный таймер. В этом уроке мы будем использовать таймер 0 для нашего приложения. Как только мы поймем Таймер 0, будет легко работать с Таймером 1 и Таймером 2.

Таймер / счетчик модуля Timer0 имеет следующие особенности:

  • 8-битный таймер / счетчик
  • для чтения и записи
  • 8-битный программируемый прескалер
  • Выбор внутренних или внешних часов
  • Прерывание при переполнении с FFh на 00h
  • Edge select для внешних часов

Чтобы начать использовать таймер, мы должны понимать некоторые из таких причудливых терминов, как 8-битный / 16-битный таймер, прескалер, прерывания от таймера и фокусы. Теперь давайте посмотрим, что на самом деле означает каждый из них. Как было сказано ранее, в нашем микроконтроллере PIC имеются как 8-битные, так и 16-битные таймеры, основное отличие между ними заключается в том, что 16-битный таймер имеет гораздо лучшее разрешение, чем 8-битный таймер.

Prescaler — это название части микроконтроллера, который делит тактовые импульсы генератора, прежде чем он достигнет логики, которая увеличивает состояние таймера. Диапазон ID прескалера составляет от 1 до 256, и значение Prescaler можно установить с помощью регистра OPTION (того же, который мы использовали для подтягивающих резисторов).Например, если значение prescaler равно 64, то для каждого 64 -го импульса таймер будет увеличиваться на 1.

Когда таймер увеличивается и достигает максимального значения 255, он запускает прерывание и снова инициализируется 0. Это прерывание называется прерыванием по таймеру. Это прерывание информирует MCU о том, что это конкретное время истекло.

Fosc означает Частота Генератора , это частота используемого Кристалла.Время, необходимое для регистра таймера, зависит от значения Prescaler и значения Fosc.

Программирование и рабочее объяснение:

В этом уроке мы установим две кнопки как два входа и 8 светодиодов как 8 выходов. Первая кнопка будет использоваться для установки временной задержки (500 мс для каждого нажатия), а вторая кнопка будет использоваться для начала мигания последовательности таймера. Например, если первая кнопка нажата трижды (500 * 3 = 1500 мс), задержка будет установлена ​​на 1.5 секунд и при нажатии кнопки два каждый светодиод включается и выключается с заданной выдержкой времени. Посмотрите демонстрационное видео в конце этого урока.

Timers-in-PIC-microcontroller-with-LED-blinking-sequence-1

Теперь, с учетом этих основ, давайте посмотрим на нашу программу, приведенную в конце раздела Код .

Это нормально, если вы не получили программу, но если вы получили !! Дайте себе cookie и сбросьте программу, чтобы насладиться результатами. Для других я разбью программу на значимые части и объясню вам, что происходит в каждом блоке.

Как всегда, первые несколько строк кода — это настройки конфигурации и файлы заголовков, я не буду объяснять это, поскольку я уже делал это в моих предыдущих уроках.

Далее, давайте пропустим все строки и сразу перейдем к основной функции void, внутри которой у нас есть конфигурация PORT для Timer0.

пустая функция()
{
/ ***** Конфигурация порта для таймера ****** /
    OPTION_REG = 0b00000101; // Timer0 с внешним freq и 64 в качестве прескалярного // также включает подтягивания
    TMR0 = 100; // Загрузить значение времени для 0.0019968s; delayValue может быть только между 0-256
    TMR0IE = 1; // Включить бит прерывания таймера в регистре PIE1
    ЭДД = 1; // Включить глобальное прерывание
    PEIE = 1; // Включаем периферийное прерывание
    / *********** ______ *********** / 

Чтобы понять это, мы должны взглянуть на OPTION Register в нашей таблице данных PIC.

option_reg_register_in_PIC_microcontroller

Как обсуждалось в предыдущем руководстве, бит 7 используется для включения резистора со слабым подтягиванием для PORTB.Посмотрите на рисунок выше, бит 3 установлен в 0 для указания MCU, что следующий прескалер, который устанавливается, должен использоваться для таймера, а не для WatchDogTimer (WDT). Режим таймера выбирается сбросом бита 5 T0CS

(OPTION_REG <5>)

Теперь, битов 2-0 используется для установки значения предварительного масштабирования для таймера. Как показано в таблице выше, чтобы установить значение предварительного масштабирования 64, биты должны быть установлены как 101.

Далее, давайте посмотрим на регистры, связанные с Timer0

Timer0_in_PIC_microcontroller

Таймер начнет увеличиваться после установки и переполнится после достижения значения 256, чтобы разрешить прерывание таймера во время этой точки, регистр TMR0IE должен быть установлен на высокий уровень.Поскольку сам Таймер 0 является периферийным устройством, мы должны разрешить Периферийное Прерывание, сделав PEIE = 1 . Наконец, мы должны включить глобальное прерывание, чтобы MCU получал уведомление о прерывании во время любой операции, для этого нужно сделать GIE = ​​1.

Задержка = ((256-REG_val) * (Prescal * 4)) / Fosc

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

Где

REG_val = 100;

Prescal = 64

Fosc = 20000000

это по расчету дает,

Задержка = 0.0019968s

Следующий набор строк должен установить порты ввода / вывода.

        / ***** Конфигурация порта для ввода / вывода ****** /
    TRISB0 = 1; // Сообщаем MCU, что вывод 0 PORTB используется как вход для кнопки 1.
    TRISB1 = 1; // Проинструктируем MCU, что вывод 1 PORTB используется в качестве входа для кнопки 1.
    TRISD = 0x00; // Сообщаем MCU, что все выводы на порте D выводятся
    PORTD = 0x00; // Инициализируем все контакты на 0
    / *********** ______ *********** / 

Это то же самое, что и в нашем предыдущем руководстве, так как мы используем то же оборудование.За исключением того, что мы добавили еще одну кнопку в качестве ввода. Это делается по линии TRISB1 = 1.

Далее, внутри бесконечного цикла и цикла у нас есть два блока кода. Один используется для получения ввода таймера от пользователя, а другой — для выполнения последовательности задержки на светодиодах. Я объяснил их, используя комментарии к каждой строке.

        в то время как (1)
        {
        count = 0; // Не запускаем таймер в основном цикле
        // ******* Получить номер задержки от пользователя **** //////
        if (RB0 == 0 && flag == 0) // Когда задан ввод
        {
            get_scnds + = 1; // get_scnds = get_scnds + 1 // Инкрементная переменная
            флаг = 1;
        }
        if (RB0 == 1) // Для предотвращения непрерывного увеличения
            флаг = 0;
        / *********** ______ *********** / 

Переменная с именем get_scnds увеличивается каждый раз, когда пользователь нажимает кнопку 1.Переменная флаг (определяется программным обеспечением) используется для удержания процесса приращения, пока пользователь не уберет палец с кнопки.

                // ******* Выполнить последовательность с задержкой **** //////
        while (RB1 == 0)
        {
                PORTD = 0b00000001 << i; // Левый дерьмовый светодиод
                if (hscnd == get_scnds) // Если достигнуто требуемое время
                {
                    I + = 1; // Перейти к следующему индикатору после определенной задержки
                    hscnd = 0;
                }
                флаг = 2;
        }
        if (flag == 2 && RB1 == 1) // Сброс таймера, если кнопка снова находится в высоком положении
        {
            get_scnds = 0; hscnd = 0; = 0;
            PORTD = 0; // выключаем все светодиоды
        }
        / *********** ______ *********** / 

Следующий блок вступает в действие, если нажата кнопка 2.Поскольку пользователь уже определил требуемую задержку с помощью кнопки 1, она была сохранена в переменной get_scnds. Мы используем переменную с именем hscnd , эта переменная контролируется ISR (подпрограммой обработки прерываний).

Процедура обслуживания прерывания - это прерывание, которое будет вызываться каждый раз, когда Timer0 переполняется. Давайте посмотрим, как он контролируется ISR в следующем блоке, как мы хотим увеличить задержку на полсекунды (0.5s) при каждом нажатии кнопки нам нужно увеличивать переменную hscnd на каждые полсекунды. Так как мы запрограммировали наш таймер на переполнение для каждых 0,0019968 с (~ 2 мс), то для подсчета полсекунды переменная отсчета должна быть 250, потому что 250 * 2 мс = 0,5 секунды. Таким образом, когда значение count равно 250 (250 * 2 мс = 0,5 секунды), это означает, что прошло полсекунды, поэтому мы увеличиваем hscnd на 1 и инициализируем счет в ноль.

void interrupt timer_isr ()
{
    if (TMR0IF == 1) // Флаг таймера сработал из-за переполнения таймера
    {
        TMR0 = 100; // Загрузить значение таймера
        TMR0IF = 0; // Очистить флаг прерывания по таймеру
        подсчитывать ++;
    }
    
    если (считать == 250)
    {
        hscnd + = 1; // hscnd будет увеличиваться на каждые полсекунды
        кол = 0;
    }
} 

Итак, мы используем это значение и сравниваем его с нашим hscnd и смещаем наш светодиод в зависимости от времени, определенного пользователем.Это также очень похоже на последний урок.

Вот так мы и поняли нашу программу.

Схема и симуляция протея:

Timers-in-PIC-microcontroller-with-LED-blinking-sequence-Circuit

Как обычно, позволяет сначала проверить вывод с помощью Proteus , я привел здесь файлы схемы Proteus.

Добавьте кнопку на нашу предыдущую светодиодную плату, и наше оборудование готово к работе. Это должно выглядеть примерно так:

PIC-perf-board-for-LED-blinking-squence-with-timers LED-perf-board-for-understanding-timers-in-PIC-microcontroller

Timers-in-PIC-microcontroller-with-LED-blinking-sequence-2

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

,

alexxlab

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *