Как настроить и использовать таймеры в PIC16F877A. Какие преимущества дает использование таймеров по сравнению с функциями задержки. Как программировать и конфигурировать Timer0 в PIC16F877A. Как реализовать последовательность мигания светодиодов с использованием таймера.
Введение в таймеры микроконтроллера PIC
Таймеры являются важным компонентом большинства встраиваемых систем. Они позволяют точно отмерять интервалы времени и выполнять действия по расписанию, не блокируя при этом работу основной программы. В этой статье мы рассмотрим использование таймеров в популярном микроконтроллере PIC16F877A на примере управления последовательностью мигания светодиодов.
Преимущества таймеров перед функциями задержки
Хотя функции задержки, такие как __delay_ms(), позволяют создавать временные интервалы, у них есть ряд недостатков по сравнению с аппаратными таймерами:
- Во время выполнения задержки микроконтроллер блокируется и не может выполнять другие задачи
- Значение задержки должно быть константой и не может изменяться во время выполнения программы
- Невозможно создать большие значения задержки (например, несколько часов)
- Точность отсчета времени ниже, чем у аппаратных таймеров
Таймеры лишены этих недостатков и позволяют более гибко и эффективно управлять временными интервалами.

Обзор таймеров в PIC16F877A
Микроконтроллер PIC16F877A имеет три модуля таймера:
- Timer0 — 8-битный таймер/счетчик
- Timer1 — 16-битный таймер
- Timer2 — 8-битный таймер
В этой статье мы сфокусируемся на использовании Timer0. Основные возможности Timer0 включают:
- 8-битный счетчик, доступный для чтения и записи
- Программируемый предделитель до 1:256
- Выбор источника тактирования (внутренний или внешний)
- Генерация прерывания при переполнении
Настройка Timer0 в PIC16F877A
Для настройки Timer0 необходимо выполнить следующие шаги:
- Настроить регистр OPTION_REG для выбора источника тактирования, предделителя и других параметров
- Загрузить начальное значение в регистр TMR0
- Включить прерывание таймера (TMR0IE)
- Разрешить глобальные и периферийные прерывания (GIE и PEIE)
Пример кода настройки Timer0:
OPTION_REG = 0b00000101; // Внутренний источник, предделитель 1:64
TMR0 = 100; // Начальное значение таймера
TMR0IE = 1; // Разрешить прерывание таймера
GIE = 1; // Разрешить глобальные прерывания
PEIE = 1; // Разрешить периферийные прерывания
Расчет временных интервалов для Timer0
Время переполнения Timer0 можно рассчитать по формуле:

Delay = ((256 - TMR0) * Prescaler * 4) / Fosc
Где:
- TMR0 — начальное значение таймера
- Prescaler — коэффициент предделителя
- Fosc — частота тактирования микроконтроллера
Например, при TMR0 = 100, предделителе 1:64 и Fosc = 20 МГц получим интервал около 1.99 мс.
Реализация последовательности мигания светодиодов на Timer0
Рассмотрим пример реализации последовательности мигания 8 светодиодов с использованием Timer0. Программа позволяет задавать интервал мигания кнопкой и запускать/останавливать последовательность.
Основная логика работы:
- При нажатии первой кнопки увеличиваем значение задержки на 500 мс
- При нажатии второй кнопки запускаем последовательность мигания
- В прерывании таймера отсчитываем заданный интервал
- По истечении интервала переключаем следующий светодиод
Фрагмент кода обработчика прерывания таймера:
void interrupt timer_isr()
{
if(TMR0IF == 1)
{
TMR0 = 100; // Перезагрузка таймера
TMR0IF = 0; // Сброс флага прерывания
count++;
if (count == 250) // 0.5 секунды
{
hscnd++;
count = 0;
}
}
}
Преимущества использования таймера для управления светодиодами
Использование Timer0 для управления последовательностью светодиодов дает ряд преимуществ по сравнению с циклами задержки:

- Возможность изменять интервал мигания «на лету»
- Микроконтроллер не блокируется во время отсчета интервалов
- Более точное соблюдение заданных интервалов
- Возможность легко добавить другие задачи, выполняемые параллельно
Схема подключения и демонстрация работы
Для демонстрации работы программы потребуется следующее оборудование:
- Микроконтроллер PIC16F877A
- 8 светодиодов с токоограничивающими резисторами
- 2 тактовые кнопки
- Макетная плата и соединительные провода
Схема подключения компонентов:
- Светодиоды подключаются к выводам PORTD
- Кнопки подключаются к выводам RB0 и RB1
Видео демонстрации работы устройства можно посмотреть по ссылке в конце статьи.
Заключение и дальнейшие шаги
В этой статье мы рассмотрели основы использования таймеров в микроконтроллере PIC16F877A на примере управления последовательностью светодиодов. Использование таймеров позволяет создавать более гибкие и эффективные программы по сравнению с простыми циклами задержки.
Для дальнейшего изучения темы рекомендуется:

- Ознакомиться с возможностями Timer1 и Timer2
- Изучить другие режимы работы таймеров (захват, сравнение, ШИМ)
- Рассмотреть примеры использования таймеров в реальных проектах
Освоение таймеров значительно расширит ваши возможности при разработке встраиваемых систем на микроконтроллерах PIC.
таймер на PIC16F628A — MBS Electronics
Таймерами называют довольно широкий диапазон различных технических устройств а также внутренних узлов микроконтроллеров. В данном случае таймер — это цифровое устройство, предназначенное для включения и отключения внешнего устройства по заданной программе. Это может быть, например, устройство автоматического полива растений или устройство автоматического кормления аквариумных рыбок.. Все зависит от вашей фантазии. К примеру, я когда-то долгое время использовал подобное устройство для периодического включения / выключения холодильника, у которого сломалось механическое термореле.
Таймер собран на очень распространенном и дешевом микроконтроллере от Microchip, 8-разрядный PIC16F628A. Пользователь может запрограммировать интервал между включениями внешнего устройства и продолжительность его работы. максимальное время паузы и включения составляет 99 часов 59 минут, то есть, фактически 100 часов.
Для управления таймером используются четыре кнопки, а для отображения информации применен стандартный ЖК индикатор на 2 строки из 16 символов, работающий на основе контроллера HD44780U от фирмы Hitachi.
Для управления внешним устройством использовано электромагнитное реле. Обмотка реле должна быть рассчитана на напрядение 5V. Микроконтроллер управляет реле через ключ на транзисторе PN2222. Контакты реле должны быть рассчитаны на ток, потребляемый управляемым устройством. Кнопки управления подключены к портам микроконтроллера RB0, RA2, RA3 и RA4.
Дисплей работает в четырехбитном режиме и для его управления требуется 6 портов микроконтроллера. Для звуковой сигнализации включения и отключения нагрузки использован пьезокерамический звонок. Звуковой сигнал также подается и при включении питания таймера.
Блок питания таймера содержит стабилизатор напряжения +5V на микросхеме — регуляторе LM7805. Для питания таймера от сети 220 вольт можно использовать любой нестабилизированный сетевой адаптер, купленный на китайском рынке.
Если мы внимательно посмотрим на схему устройства, то заметим, что выводы индикатора с номерами 15 и 16 не используются. они подключаются только в индикаторах с фоновой подсветкой. если вы хотите использовать индикатор с подсветкой, то подключите ее к +5B через резистор сопротивлением 39 Ом.
Кнопка Start/Stop. При нажатии на эту кнопку таймер запускается или останавливается. При первом нажатии начинается отсчет времени выключенного состояния. Потом таймер включает внешнее устройство и начинает отсчет времени во включенном состоянии.
Кнопка On/Off Time позволяет запрограммировать таймер, установив время выключенного и включенного состояний внешнего устройства.
Кнопка Select дает возможность переключаться между устанавливаемым параметром — часы — минуты — время включенного состояния — время выключенного состояния.
Кнопка Enter служит для подтверждения установленного значения.
Основные компоненты для сборки таймера можно недорого купить в Китае по следующим ссылкам:
Реле 5 В
Транзистор PN2222
Стабилизатор 7805
Lcd дисплей 16X2
Контроллер PIC16F628A
Прошивка для микроконтроллера написана в комприляторе MicroC Pro for PIC компании MikroElektronika.
Скачать архив с файлами прошивки
Источник: www.embedded-lab.com
Digital programmable Timer Switch
23 декабря 2010 г.
1602 Displaydigital circuitsMCUMicrochip PICmicrocontrollertimerцифровые схемы
Микроконтроллеры и Технологии — Универсальный таймер на микроконтроллере STM8
- Главная|
- Устройства|
- STM|
- Универсальный таймер на микроконтроллере STM8
- Просмотров: 5404
Таймер Семисегментный индикатор STM8S103 W1209
Таймер разработан для использования совместно с УФ лампой. Прошивка может быть загружена в микроконтроллер, установленный на оригинальной плате или в микроконтроллер платы термостата W1209 доступном на Aliexpress и Ebay. Тип используемой платы задаётся в файле uv_timer.h см. строки 6-8.
Перечень элементов и gerber-файлы печатной платы находятся в каталоге /pcb. Для заказа печатной платы используйте файл UVTimer_V1.02.zip
Характеристики:
Напряжение питания: 7-30V;
Максимальны ток нагрузки: 1A;
Выдержка: 0.1c-90мин
Управление
Управление таймером производится при помощи энкодера. Вращением ручки энкодера осуществляется выбор интервала времени, короткое нажатие — запуск/пауза, длинное нажатие — остановка/сброс на начальное значение.
Схема устройства
Элементы С1, С2, ZQ1 могут не устанавливаться при соответствущих изменениях в функции CLK_Config() в файле main.c. В качестве DD1 допустимо использовать STM8S003F3xx либо STM8S103F3xx. Перемычка J1 предназначена для отладки и должна быть замкнута. Самовосстанавливающийся предохранитель R3 предназначен для защиты выходого транзистора от перегрузки и короткого замыкания, для увеличения нагрузочной способности может быть удален.
Фото готового устройства
W1209
На рынке присутствуют термостаты на основе различных микрокотроллеров под одним названием W1209, прошивку можно использовать только с термостатом на основе STM8, вот его схема:
Видео работы устройства
Файлы к статье «Универсальный таймер на микроконтроллере STM8» | |
Описание:
Исходный код (Си), файлы прошивок для микроконтроллера, файлы макета печатной платы, схемы. |
|
Размер файла: 1.33 MB Количество загрузок: 412 | Скачать |
Понравилась статья? Поделиться с друзьями:
- Автор: Vadzim Yatskevich
- Назад
- Вперед
— Как найти каналы таймера для этой платы UC?
\$\начало группы\$
Я пытаюсь визуализировать и указать на диаграмме, где расположены каналы таймера в этой таблице.
STM32 использует термин каналы. Я предполагаю, что под таймерными каналами подразумеваются выходы таймера. Что понимается под каналом?
Может ли кто-нибудь показать пример для этой платы для ChannelX TimerX в руководстве или таблице данных?
- микроконтроллер
- таймер
\$\конечная группа\$
10
\$\начало группы\$
Счетчик таймера отсчитывается от часов (которые могут сначала пройти предварительный делитель).
Канал для этого таймера сосредоточен вокруг регистра, содержащего выходное значение сравнения или входное значение захвата для использования с этим счетчиком. Для таймера/счетчика может быть более одного канала.
Входной контакт для ввода захвата или выходной контакт для вывода сравнения (в зависимости от того, в каком режиме вы работаете) можно подключить к ряду предопределенных контактов с помощью регистров конфигурации ввода-вывода для установки альтернативных функций.
Справочное руководство пользователя STM32 содержит гораздо больше информации, чем техническое описание. Это то, что говорит вам, как на самом деле использовать устройства в семействе продуктов. В нем рассказывается, как работают периферийные устройства и какие регистры необходимо настроить. Таблицы данных STM32, по большей части, полезны только для информации, которая не является общей для семейства микроконтроллеров, такой как выводы для определенного пакета, в который входит микроконтроллер.
\$\конечная группа\$
\$\начало группы\$
Используйте инструмент куба MX для настройки таймеров, подключения их к GPIO и многого другого. Он сгенерирует код, который вы сможете использовать в своем проекте.
\$\конечная группа\$
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания, политикой конфиденциальности и политикой использования файлов cookie
Общие сведения о таймерах в PIC16F877A PIC-микроконтроллере с последовательностью мигания светодиодов
Это будет пятое руководство в нашей серии PIC Tutorial Series , которая поможет вам изучить и использовать таймеры в PIC16F877A . В наших предыдущих руководствах мы начали с введения в PIC и MPLABX IDE, затем мы написали нашу первую программу PIC для мигания светодиода с помощью PIC, а затем создали последовательность мигания светодиода, используя функцию задержки в микроконтроллере PIC. Теперь давайте воспользуемся той же последовательностью мигания светодиодов, которую мы использовали в предыдущем учебном пособии.0065 Узнайте, как использовать таймеры в нашем микроконтроллере PIC . Мы только что добавили еще одну кнопку на светодиодную панель для этого урока. Пройдите учебник, чтобы узнать больше.
Таймеры — одна из важных рабочих лошадок встроенного программатора. Каждое приложение, которое мы разрабатываем, так или иначе включает в себя приложение синхронизации, например, включение или выключение чего-либо через определенный интервал времени. Хорошо, но зачем нам таймеры, когда у нас уже есть макросы задержки (__delay_ms()), делающие то же самое!!
Зачем нужен таймер, если у нас есть Delay() ?
Макрос задержки называется задержкой «дампа». Поскольку во время выполнения функции задержки, MCU создает дамп, просто создавая задержку . Во время этого процесса MCU не может прослушивать значения своего АЦП или читать что-либо из своих регистров. Следовательно, не рекомендуется использовать функции задержки, за исключением таких приложений, как мигание светодиодов, где временная задержка не обязательно должна быть точной или длительной.
Макрос задержки также имеет после недостатков ,
- Значение задержки должно быть константой для макросов задержки; его нельзя изменить во время выполнения программы. Следовательно, он остается определенным программистом.
- Задержка не будет точной по сравнению с использованием таймеров.
- Большие значения задержек не могут быть созданы с помощью макросов, например, задержка в полчаса не может быть создана с помощью макросов задержки. Максимальная задержка, которую можно использовать, зависит от используемого кварцевого генератора.
Микроконтроллер PIC Таймеры:
Физически таймер представляет собой регистр, значение которого постоянно увеличивается до 255, а затем начинается сначала: 0, 1, 2, 3, 4…255….0, 1 , 2, 3 …… и т.д.
Микроконтроллер PIC PIC16F877A имеет три модуля таймера . Они называются Timer0, Timer1 и Timer2. Таймер 0 и Таймер 2 являются 8-битными Таймерами, а Таймер 1 является 16-битным Таймером. В этом уроке мы будем использовать Таймер 0 для нашего приложения. Как только мы поймем Таймер 0, будет легко работать с Таймером 1 и Таймером 2.
Таймер/счетчик модуля Timer0 имеет следующие функции:
- 8-битный таймер/счетчик
- Доступен для чтения и записи
- 8-битный программируемый прескалер
- Выбор внутренних или внешних часов
- Прерывание при переполнении с FFh на 00h
- Выбор фронта для внешних часов
Чтобы начать использовать таймер, мы должны понимать некоторые причудливые термины, такие как 8-битный/16-битный таймер , предварительный делитель, прерывания таймера и фокусы. Теперь давайте посмотрим, что на самом деле означает каждый из них. Как было сказано ранее, в нашем микроконтроллере PIC есть как 8-битные, так и 16-битные таймеры, основное различие между ними заключается в том, что 16-битный таймер имеет гораздо лучшее разрешение, чем 8-битный таймер.
Предварительный делитель — это название части микроконтроллера, которая делит тактовую частоту генератора до того, как она достигнет логики, увеличивающей состояние таймера. Диапазон идентификатора предварительного делителя составляет от 1 до 256, а значение предварительного делителя можно установить с помощью регистра OPTION (того же, который мы использовали для подтягивающих резисторов). Например, если значение предделителя равно 64, то для каждых 64 й импульс Таймер будет увеличиваться на 1.
По мере того, как таймер увеличивается и достигает своего максимального значения 255, он запускает прерывание и снова инициализируется до 0. Это прерывание называется прерыванием по таймеру. Это прерывание информирует MCU о том, что это конкретное время истекло.
Fosc означает частоту генератора , это частота используемого кристалла. Время, необходимое для регистра Timer, зависит от значения Prescaler и значения Fosc.
Программирование и работа Объяснение:
В этом уроке мы настроим две кнопки как два входа и 8 светодиодов как 8 выходов. Первая кнопка будет использоваться для установки временной задержки (500 мс на каждое нажатие), а вторая кнопка будет использоваться для запуска мигания последовательности таймера. Например, если первая кнопка нажата три раза (500*3 = 1500 мс), задержка будет установлена на 1,5 секунды, а при нажатии второй кнопки каждый светодиод будет включаться и выключаться с заданной временной задержкой. Проверьте Демонстрационное видео в конце этого урока.
Теперь, помня об этих основах, давайте посмотрим на нашу программу, приведенную в конце раздела кода .
Ничего страшного, если вы не получили программу, но если вы ее получили!! Дайте себе куки и дамп программы, чтобы насладиться результатом. Для других я разобью программу на значимые части и объясню, что происходит в каждом блоке.
Как всегда, первые несколько строк кода — это настройки конфигурации и файлы заголовков, я не буду объяснять это, так как я уже делал это в своих предыдущих уроках.
Далее, давайте пропустим все строки и сразу перейдем к основной функции void, внутри которой у нас есть конфигурация PORT для Timer0.
пустая функция() { /*****Конфигурация порта для таймера ******/ OPTION_REG = 0b00000101; // Timer0 с внешней частотой и 64 в качестве предскаляра // Также включает PULL UP ТМР0=100; // Загрузить значение времени для 0,0019968 с; delayValue может быть только между 0-256 ТМР0ИЕ=1; //Включить бит прерывания таймера в регистре PIE1 ЭДД=1; //Включить глобальное прерывание ПЭИЭ=1; //Включить периферийное прерывание /************______************/
Чтобы понять это, мы должны посмотреть на регистр OPTION в нашей таблице данных PIC.
Как обсуждалось в предыдущем уроке, бит 7 используется для включения слабого подтягивающего резистора для PORTB. Посмотрите на приведенный выше рисунок, бит 3 сделан равным 0, чтобы указать MCU, что следующий установленный прескалер должен использоваться для таймера, а не для WatchDogTimer (WDT). Режим таймера выбирается очисткой бита 5 T0CS
(OPTION_REG<5>)
Теперь битов 2-0 используются для установки значения прескалера для таймера. Как показано в таблице выше, чтобы установить значение предварительного делителя 64, биты должны быть установлены как 101.
Далее, давайте посмотрим на регистры, связанные с Timer0
Таймер начнет увеличиваться после установки и переполнения. после достижения значения 256, чтобы включить прерывание таймера в этот момент, регистр TMR0IE должен быть установлен на высокий уровень. Поскольку Таймер 0 сам по себе является периферийным устройством, мы должны включить периферийное прерывание, сделав PEIE=1 . Наконец, мы должны включить глобальное прерывание, чтобы MCU был уведомлен о прерывании во время любой операции, это делается путем установки GIE = 1.
Задержка = ((256-REG_val)*(Prescal*4))/Fosc
Приведенная выше формула используется для расчета значения задержки.
Где
REG_val = 100;
Prescal = 64
Fosc = 20000000
Это при расчете дает
Задержка = 0,0019968s
Следующий набор строк предназначен для установки портов ввода-вывода.
/*****Конфигурация порта для ввода/вывода ******/ ТРИСБ0=1; // Сообщаем MCU, что контакт 0 PORTB используется в качестве входа для кнопки 1. ТРИСБ1=1; // Сообщаем MCU, что контакт 1 PORTB используется в качестве входа для кнопки 1. ТРИСД = 0x00; // Сообщаем MCU, что все выводы на PORT D являются выходными ПОРТ=0x00; //Инициализируем все выводы в 0 /************______************/
Это то же самое, что и в нашем предыдущем руководстве, поскольку мы используем то же оборудование. За исключением того, что мы добавили еще одну кнопку для ввода. Это делается строкой ТРИСБ1=1.
Далее, внутри бесконечного цикла while у нас есть два блока кода. Один используется для получения ввода таймера от пользователя, а другой для выполнения последовательности задержки светодиодов. Я объяснил их, используя комментарии к каждой строке.
пока(1) { количество = 0; // Не запускать таймер в основном цикле //*******Получить номер задержки от пользователя****////// if (RB0==0 && flag==0) //При заданном вводе { get_scnds+=1; //get_scnds=get_scnds+1//Увеличить переменную флаг=1; } if (RB0==1) //Для предотвращения непрерывного увеличения флаг=0; /************______************/
Переменная с именем get_scnds увеличивается каждый раз, когда пользователь нажимает кнопку 1. Переменная флага (программно определяемая) используется для удержания процесса увеличения до тех пор, пока пользователь не уберет палец с кнопки.
//*******Выполнить последовательность с задержкой****////// пока (RB1==0) { ПОРТД = 0b00000001<
Следующий блок срабатывает при нажатии второй кнопки. Так как пользователь уже определил требуемое время задержки с помощью первой кнопки и оно было сохранено в переменной get_scnds. Мы используем переменную с именем hscnd , эта переменная управляется ISR (процедурой обслуживания прерываний).
Процедура обслуживания прерывания — это прерывание, которое будет вызываться каждый раз, когда таймер 0 переполняется. Давайте посмотрим, как он контролируется ISR в следующем блоке, например, мы хотим увеличить задержку на полсекунды (0,5 с) при каждом нажатии кнопки, тогда нам нужно увеличить переменную 9.0231 hscnd каждые полсекунды. Поскольку мы запрограммировали наш таймер на переполнение каждые 0,0019968 с (~ 2 мс), поэтому для подсчета полсекунды переменная count должна быть равна 250, потому что 250 * 2 мс = 0,5 секунды. Таким образом, когда счетчик достигает 250 (250 * 2 мс = 0,5 секунды), это означает, что прошло полсекунды, поэтому мы увеличиваем hscnd на 1 и инициализируем счетчик нулем.
недействительное прерывание timer_isr() { if(TMR0IF==1) // Флаг таймера сработал из-за переполнения таймера { ТМР0 = 100; //Загружаем значение таймера TMR0IF=0; // Очистить флаг прерывания таймера количество++; } если (количество == 250) { hscnd+=1; // hscnd будет увеличиваться каждые полсекунды количество=0; } }Итак, мы используем это значение и сравниваем его с нашим hscnd и сдвигаем наш светодиод в зависимости от времени, заданного пользователем.
Он также очень похож на предыдущий урок.
Вот и все, наша программа понятна и работает.
Принципиальная схема и моделирование Proteus:
Как обычно, сначала проверим вывод с помощью Proteus , здесь я разместил файлы схем Proteus.
Добавьте кнопку на нашу предыдущую светодиодную плату, и наше оборудование готово к работе. Это должно выглядеть примерно так:
После установления соединения загрузите код и проверьте вывод. Если у вас есть какие-либо проблемы, пожалуйста, используйте раздел комментариев. Также посмотрите видео ниже, чтобы понять весь процесс.
Код
// CONFIG
#pragma config FOSC = HS // Биты выбора генератора (HS-генератор)
#pragma config WDTE = OFF // Бит включения сторожевого таймера (WDT отключен)
#pragma config PWRTE = ON Бит включения таймера включения (PWRT включен)
#pragma config BOREN = ON // Бит разрешения сброса при пониженном напряжении (BOR включен) , HV на MCLR должен использоваться для программирования)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection Code (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (защита от записи выкл; вся программная память может быть записана системой управления EECON)
#pragma config CP = OFF // Бит защиты кода флэш-памяти программ (защита кода выключена)// Операторы конфигурации #pragma должны предшествовать включению файла проекта.
![]()
// Используйте перечисления проекта вместо #define для ON и OFF.#include
#define _XTAL_FREQ 20000000//TIMER0 8-bit $$RegValue = 256-((Delay * Fosc)/(Prescalar*4)) delay in sec and Fosc в Hz
/ /ФОРМУЛА для расчета задержки
//Задержка = ((256-REG_val)*(Prescal*4))/Foscсимвол hscnd = 0;
число целых чисел = 0;
символ get_scnds = 0;
символьный флаг =0;
символа i=0;void interrupt timer_isr()
{
if(TMR0IF==1) // Флаг таймера сработал из-за переполнения таймера
{
TMR0 = 100; //Загружаем значение таймера
TMR0IF=0; // Очистить флаг прерывания таймера
count++;
}
if (count == 250)
{
hscnd+=1; // hscnd будет увеличиваться каждые полсекунды
count=0;
}
}void main()
{
/***** Конфигурация порта для таймера ******/
OPTION_REG = 0b00000101; // Timer0 с внешней частотой и 64 в качестве предскаляра // Также включает PULL UP
TMR0=100; // Загрузить значение времени для 0,0019968 с; delayValue может принимать значения только от 0 до 256
TMR0IE=1; // Включить бит прерывания таймера в регистре PIE1
GIE=1; //Включить глобальное прерывание
PEIE=1; //Включить периферийное прерывание
/***********______***********/
/***** Конфигурация порта для ввода-вывода ******/
TRISB0= 1; // Сообщаем MCU, что контакт 0 PORTB используется в качестве входа для кнопки 1.