Простой таймер на PIC16F84A
Довольно часто в хозяйстве и не только (например при травлении платы хлорным железом, кислотой или других аналогичных действиях ),засечь время, что бы вовремя выключить газ(вытащить плату из раствора, и т.п.). Для таких целей и разработан этот таймер. В отличие от устройств с аналогичным назначением, но собранных на операционных усилителях или компараторах, этот таймер более точен и меньше потребляет энергии, так как собран на микроконтроллере.
Схема таймера довольно простая:
Таймер рассчитан на пять вариантов отсчета времени(5, 10, 15, 20 и 30 минут). Интервал задается путем нажатия на кнопку, соответствующую выбранному значению. Так для 5-ти минут это будет кнопка SB1, для 20-ти естественно SB4.Так же при нажатии на кнопку устройство подает звуковой сигнал (подтверждение нажатия), такой же звуковой сигнал будет дан по окончании отсчета времени. Так же во время отсчета будет светиться светодиод D1.
Работа с устройством сводиться к минимуму – нужно лишь нажать кнопку и все. Но у этого таймера есть небольшой недостаток – если кнопка была нажата и идет отсчет времени, то выбрать другой интервал отсчета невозможно. Этот недостаток можно обойти, если включить еще одну кнопку в схему. Пускай она называется SB6. Итак, эту кнопку нужно подключить одним контактом к общему проводу, а вторым к участку цепи R1 – 4-й вывод микроконтроллера U1. Нажатие на эту кнопку перезапустит программу, которая находится в микроконтроллере, независимо от того, выполняет он ее или нет.
Печатная плата таймера тоже в пределах «средней» сложности. Так как поместить на небольшом участке платы столько компонентов и обойтись печатными проводниками лишь с одной стороны платы почти нереально, а если и реально, то неоправданно сложно. Поэтому я использовал печатную плату из двухстороннего фольгированного материала (стеклотекстолита, гетинакса).
Топология печатной платы в программе ARES (входит в PROTEUS) выглядит так:
Красные дорожки – это дорожки со стороны деталей, синие – со стороны компонентов.
В реальном варианте выглядит примерно так (если использовали вы мою разводку печатной платы):
Микроконтроллер работает по такому алгоритму:
Как видите программа не сложная. Пока ни одна кнопка не нажата, ничего не предпринимается, но если какая-то из кнопок будет нажата (например, SB1) то программа сначала сгенерирует тональный сигнал на выводе 10 микроконтроллера (порт A бит 1). Далее подаст уровень логической единицы на вывод 18 (порт А бит 4). После этих действий программа отсчитывает 5-ть минут, опять генерирует тоновый сигнал на десятом выводе и посылает уровень логического нуля на четвертый бит порта А микроконтроллера. Аналогичные действия программа выполняет и при нажатии остальных кнопок, лишь время задержки отличается. Для заливки прошивки в микроконтроллер можно использовать программу PonyProg2000. Вот вариант выставления конфигурационных битов микроконтроллера:
Это означает, что бит защиты выключен, таймер по включению питания выключен, сторожевой таймер выключен, выбран режим XT тактового генератора. В программе IC-Prog это выглядит так:
Детали и их замены:
В этом устройстве я не использовал дефицитных деталей, но все же микроконтроллер PIC16F84A может вызвать удивление среди опытных радиолюбителей, так как уже устарел. Вместо него можно использовать практически аналогичный PIC16F628A (хоть их архитектура и очень схожа, в архиве для него есть отдельный программный файл). Резисторы можно использовать с сопротивлением 2-5,6 k. Конденсаторы для задающего генератора – керамические дисковые (можно найти в любом китайском радиоприемнике), номиналом в 22-68 pf. Кварцевый резонатор нужно взять на частоту 4.000 MHz. Кнопки можно взять любые, так как они все равно устанавливаются за пределами платы, поэтому все зависит от того, в каком корпусе вы планируете собирать устройство.
Конструкция:
Вот возможный вариант расположения платы и деталей в корпусе:
Скачать исходники, прошивку, проект в Proteus и Flowcode вы можете ниже
Список радиоэлементов
Обозначение | Тип | Номинал | Количество | Примечание | Магазин | Мой блокнот |
---|---|---|---|---|---|---|
U1 | МК PIC 8-бит | PIC16F84A | 1 | Поиск в магазине Отрон | В блокнот | |
Q1 | Транзистор | 2N3417 | 1 | Поиск в магазине Отрон | В блокнот | |
С1, С2 | Конденсатор | 27 пФ | 2 | Поиск в магазине Отрон | В блокнот | |
R1-R6 | Резистор | 4. 3 кОм | 6 | Поиск в магазине Отрон | ||
R7 | Резистор | 1.5 кОм | 1 | Поиск в магазине Отрон | В блокнот | |
Х1 | Кварцевый резонатор | 1 | Поиск в магазине Отрон | В блокнот | ||
D1 | Светодиод | Красный | 1 | Поиск в магазине Отрон | В блокнот | |
Тактовая кнопка | 5 | Поиск в магазине Отрон | В блокнот | |||
LS1 | Динамик | 1 | Поиск в магазине Отрон | В блокнот | ||
Добавить все |
Скачать список элементов (PDF)
Теги:
- Таймер
- Микроконтроллер
- PIC
- Proteus
- Flowcode
Микроконтроллерный таймер на PIC16F84A — Микроконтроллеры и Технологии
- Главная|
- Устройства|
- Microchip
- Просмотров: 47201
Таймер Семисегментный индикатор PIC16F84
Среди множества автоматических устройств, вошедших в наш быт, важное место занимают таймеры — приборы, подающие звуковой или световой сигнал либо включающие (выключающие) какой-либо электрический аппарат через заданный промежуток времени.
Предлагаемое устройство позволяет отсчитывать выдержку времени от 1 с до 99 ч 59 мин 59 с. Его основа популярный среди радиолюбителей микроконтроллер PIC16F84A (DD1). Кроме него, таймер содержит микросхему К176ИД2 (DD2) — преобразователь двоичного кода в семиэлементный, четырехразрядный светодиодный цифровой индикатор HG1 и стабилизатор напряжения питания DA1.
После включения питания микроконтроллер считывает из своей энергонезависимой памяти (EEPROM) информацию об установках времени (о том, как ее записать в EEPROM, будет сказано ниже) и начинает отсчет. При первом включении устройства автоматически устанавливается выдержка времени, равная 2 мин 59 с (на экране индикатора HG1 — цифры 2. 59; незначащие нули в старших разрядах не высвечиваются). Требуемую выдержку вводят с помощью кнопок SB1 и SB2. При этом если она больше 1 ч, на экране индикатора отображаются часы и минуты, а если меньше, — минуты и секунды. Элемент Н второго разряда индикатора мигает с частотой 1 Гц, наподобие разделительного двоеточия на обычных электронных часах (он перестает мигать на последней минуте выдержки). С момента начала отсчета на выходе таймера (линия порта RA2 микроконтроллера DD1) устанавливается низкий логический уровень и подключенное к нему исполнительное устройство на транзисторе VT1 и электромагнитном реле К1 находится в режиме ожидания. По окончании заданного промежутка времени низкий логический уровень на выходе таймера сменяется высоким, транзистор VT1 открывается и реле К1 своими контактами (на схеме не показаны) включает или выключает управляемый аппарат (генератор сигнала звуковой частоты, электроприбор, телевизор и т. д.). Этот уровень напряжения на выходе сохраняется до тех пор, пока не будет отключено питание таймера или нажата кнопка SB2 (она в данном случае играет роль кнопки сброса).
Чтобы изменить выдержку, во время счета нажимают на кнопку SB2. При этом начинают мигать разряды часов. Установив с помощью кнопки SB1 необходимое время (от 00 до 99 ч), вновь нажимают на кнопку SB2, фиксируя этим число часов и переводя таймер в режим установки минут. Необходимое значение вводят той же кнопкой SB1, а затем, еще раз нажав на кнопку SB2, переходят к установке секунд. В этом режиме начинает мигать элемент Н второго разряда индикатора HG1 (при установке чисел часов и минут он не светился). Следующее нажатие на кнопку SB2 вызывает запись всех установок в EEPROM и перезагрузку микроконтроллера. В результате на экране индикатора появляются значения часов, минут и секунд, по истечении которых таймер сработает.
Кроме указанного на схеме микроконтроллера PIC16F84A, в устройстве без какой-либо доработки программы можно использовать PIC16F84. Допустима замена индикатора СА56-12GWA другим светодиодным индикатором динамического типа с общим анодом и числом разрядов не менее четырех (у него может быть иное назначение выводов, что следует учесть при монтаже).
Программа, по которой работает микроконтроллер, реагирует на состояние контактов кнопки SB2 в момент их размыкания, т. е. после ее отпускания. Такая логика сохраняется во всех режимах работы. Изменение же состояния контактов кнопки SB1 программа обнаруживает в момент их замыкания. В режиме установки времени однократное нажатие этой кнопки увеличивает значение текущего разряда на единицу, а удержание ее в нажатом положении более 1 с заставляет программу перейти в режим автоматического увеличения значения разряда два раза в секунду. Нажатие на эту кнопку в режиме счета и удерживание ее в течение 1 с. приводит к тому, что независимо от значения времени в разрядах часов на экране индикатора отображаются минуты и секунды.
Следует учесть, что таймер «спешит» примерно на 1 с. в час, поэтому если необходима повышенная точность «хода», то при вводе длительности выдержки требуемое значение времени необходимо увеличить на число секунд, равное числу часов
Автор: Высочанский П.
Архив для статьи «Микроконтроллерный таймер» | |
Описание: | |
Размер файла: 3.85 KB Количество загрузок: 2 343 | Скачать |
Понравилась статья? Поделиться с друзьями:
- Назад
- Вперед
Использование таймера PIC с PIC16F84A
Роланд Пелайо Учебное пособие по ПОС Комментарии отключены на использование таймера PIC с PIC16F84A 11 797 просмотров
В этом руководстве я расскажу, как использовать модуль таймера микроконтроллера PIC16F84A для различных приложений, включая включение и выключение светодиода без использования программной подпрограммы задержки.
Contents
- 1 Introduction
- 2 Configuring the PIC Timer
- 4 Setting up the PIC Timer via ASM
- 5 Turning a LED On/Off using PIC Timer
- 6 A One Second Delay
PIC16F84A имеет один 8-битный таймер с автономным запуском, названный TMR0 . Термин «свободный запуск» означает, что он постоянно работает в фоновом режиме и не имеет управления запуском или остановкой. Вы можете читать или записывать значения из/в этот таймер. Так как это 8-битный таймер, TMR0 может считать от 0 до 255 (2 8 = 256).
[объявление]
Другие микроконтроллеры имеют несколько таймеров с более высокими битовыми номерами: PIC16F877A имеет два 8-битных и один 16-битный таймер, а PIC18F4550 имеет три 16-битных и один 8-битный таймеры. Каждый счетчик по умолчанию истекает после двух командных циклов. Напомним, что скорость командного цикла рассчитывается (для генератора с частотой 4 МГц) с использованием
. Вы можете увеличить время, необходимое для каждого счета, используя прескалера . Когда таймер достигает 255, таймер переполняется и возвращается к 0. Прерывание связано с переполнением таймера.
Настройка таймера PICВсе настройки TMR0 настраиваются с помощью регистра OPTION. В техническом описании PIC16F84A этот регистр описан следующим образом:
Регистр OPTION доступен для чтения и записи и содержит различные управляющие биты для настройки предварительного делителя TMR0/WDT, внешнего прерывания INT, TMR0 и слабых подтягиваний на PORTB.
Вот биты для этого регистра:
[объявление]
Посмотрите на бит 5 регистра OPTION с именем TOCS (выбор источника тактового сигнала TMR0). Чтобы использовать таймер, этот бит должен быть очищен. Если это установлено, модуль TMR0 используется для подсчета (обсуждается в отдельном руководстве).
Предварительный делительПредварительный делитель определяет, сколько ребер источника будет увеличивать значение регистра TMR0 на 1. Короче говоря, предварительный делитель позволяет нам увеличить время до переполнения таймера. Имеется восемь предварительных настроек, которые выбираются с помощью битов PS <2:0> регистра OPTION:
Бит 3 — это бит назначения предварительного масштаба. Если его сбросить, предварительная шкала будет назначена TMR0. Его установка назначит предварительную шкалу сторожевому таймеру (это еще один таймер с другим назначением). Обратите внимание, что любые инструкции по записи в TMR0 ( clrf, bsf, movwf и т. д.) очистят значение предварительной шкалы .
Пример: если предварительный делитель установлен на TMR0, а PS <3:0> равен двоичному значению 2 (010 2 ), то потребуется 8 отсчетов, прежде чем таймер увеличится на единицу, и, таким образом, произойдет переполнение через 2,04 миллисекунды (при условии, что используется кварц 4 МГц), потому что
Настройка таймера PIC с помощью ASMВот фрагмент кода, который настраивает таймер с использованием максимального предварительного масштаба.
bsf STATUS, RP0 ;переключиться на Банк 1; Регистр OPTION находится в банке 1 movlw 27h ;binary 00100111 - максимальная предварительная шкала, присвоенная TMR0 movwf OPTION_REG ; это имя регистра в .INC P16F84A bcf STATUS, RP0 ;переключиться на банк 0Включение/выключение светодиода с помощью таймера PIC
список р = 16f84a включитьорганизация 0x00 перейти к началу start bsf STATUS, RP0 ;переключиться на Банк 1 bsf STATUS, RP0 ;переключиться на Банк 1; Регистр OPTION находится в банке 1 мовлв 0x00 movwf TRISB ;PORTB весь вывод movlw 27h ;binary 00100111 - максимальная предварительная шкала, присвоенная TMR0 movwf OPTION_REG ; это имя регистра в .INC P16F84A bcf STATUS, RP0 ;переключиться на банк 0 clrf TMR0 ;обнулить таймер ;--------------- основная программа основной movf TMR0,0 ;переместить содержимое TMR0 в W andlw 0x01 ;маскировать так, чтобы перемещался только бит 0 слова W movwf PORTB ;к PORTB перейти на главную конец
Этот код просто переключает состояние PORTB. 0 синхронно с битом 0 регистра TMR0. Переключение происходит немного быстрее, поскольку наименее значащие изменения битов соответствуют самым быстрым (около 254 микросекунд для кристалла 4 МГц) для каждого счета.
[объявление] Чтобы сделать это медленнее, вы можете использовать следующий бит (бит 1), изменив
andlw 0x01
до
andlw 0x02
Конечно, PORTB.1 теперь будет мигать вместо PORTB.0. Самое медленное мигание может быть достигнуто, если и lw 0x80 (маскировка старшего бита).
A Задержка в одну секундуТак как же добиться задержки в одну секунду? Если вы посчитаете, таймер переполнится (максимальная предварительная шкала, кристалл 4 МГц) через 65,536 миллисекунд. Это примерно 1/15 полной секунды. Зная это, мы можем подождать, пока таймер не переполнится 15 раз, прежде чем переключать состояние вывода. Это достигается кодом ниже:
list p=16f84a включитьINC> блок 0x0c СЧИТАТЬ конец организация 0x00 перейти к началу start bsf STATUS, RP0 ;переключиться на Банк 1 мовлв 0x10 movwf TRISA ;PORTA весь вывод мовлв 0x00 movwf TRISB ;PORTB весь вывод мовлв 07ч ;00000111 movwf OPTION_REG ;Режим счетчика, задний фронт, предварительный делитель установлен на максимум bcf STATUS, RP0 ;переключиться на банк 0 мовлв 0x0F COUNT ;--------------- основная программа основной БКФ PORTB,0 мовф ТМР0,0 ниже .255 СТАТУС btfss, Z перейти на главную; продолжайте цикл, пока таймер не достигнет 255 decfsz COUNT,1 ;если установлено, уменьшить COUNT goto main ;если count еще не равен нулю, повторить цикл main2 bsf PORTB,0 ;если счетчик достигает нуля, установить PORTB.0 movf TMR0,0 ;повторите процесс, чтобы отложить выключение ниже .255 СТАТУС btfss, Z перейти на главную2 COUNT,1 перейти на главную2 перейти на главную конец
Здесь я постоянно вычитал 255 из TMR0. Если TMR0 достигает 255, результат инструкции sublw . 255 будет равен нулю, устанавливая бит Z регистра STATUS. Когда это произойдет, переменная COUNT, которая инициализирована до 15, будет уменьшена на 1. PORTB.0 будет установлен, когда переменная COUNT достигнет нуля. Затем процесс повторяется, чтобы отложить очистку PORTB.0.
[объявление]
Хотя приведенный выше код работает, я все же предлагаю вам использовать прерывание по переполнению таймера, чтобы отложить выполнение задач, занимающих меньше места в программе.
Next>> Асинхронный последовательный (USART) обмен данными с PIC16F877A
Назад Программирование STM32F1 Discovery
Далее Beaglebone Black Blink LED с использованием C++
Проверьте также
В прошлый раз я показал, как начать работу с платой Microchip Curiosity HPC. Я буду …
Таймеры и прерывания (PIC16F84A)
Таймер — это простой модуль, входящий в состав практически большинства микроконтроллеров. Таймер можно использовать как таймер/счетчик. Размер таймера варьируется от контроллера к контроллеру. PIC16F84A имеет один 8-битный модуль таймера. Самая основная операция таймера — считать и ничего больше! В режиме таймера модуль будет увеличиваться автоматически для каждого командного цикла (командный цикл не совпадает с тактовым циклом), а в режиме счетчика он увеличивается на каждом нарастающем/спадающем фронте импульса, подаваемого на контакт RA4 (3-й контакт). . Поскольку это 8-битный таймер, он может считать от 00h до FFh (от 00000000 до 11111111). После FFh сообщает контроллеру, что произошло переполнение (вызывает прерывание), а затем откатывается к 00h и снова продолжается.
Предскаляр:
Предскаляр также является 8-битным счетчиком. Он не доступен ни для чтения, ни для записи, но настраивается конфигурационными битами регистра OPTION_REG. Проще говоря, его можно использовать для масштабирования модуля таймера, как мы масштабируем наши графические листы. Например, таймер увеличивается для каждого цикла команд, и мы знаем, что микроконтроллер способен выполнять несколько миллионов инструкций в секунду. Поскольку таймер представляет собой 8-битный счетчик, он переполняется раньше, чем мы думаем! для этой цели используется перскаляр, для предскаляра 1:8 таймер увеличивается на каждые 8 командных циклов. Таким образом, таймер будет переполняться медленнее, чем в предыдущем сценарии.
Прерывание таймера:
Теперь очевидно, что таймер вызывает прерывание, когда счетчик переходит от FFh к 00h. Чтобы показать, что произошло переполнение, таймер устанавливает второй бит регистра INTCON. Но этот бит должен быть очищен в предстоящем ISR (процедура обслуживания прерывания), прежде чем прерывание может быть снова разрешено.
Обычно прерывание можно рассматривать как высокоприоритетную работу микроконтроллера. Если микроконтроллер выполняет программу и возникает прерывание, то он обработает прерывание и продолжит выполнение программы. (Похоже на то, когда вы смотрите фильм на своем компьютере, и вам звонит почтальон — что вы делаете? Пауза просмотрите фильм, идите, получите почту, вернитесь и возобновите просмотр фильма. Таким образом, вы можете получить много прерываний.) Например, предположим, что ваш микроконтроллер выполняет длинную программу. Но периферийному устройству, подключенному к контроллеру, срочно нужен результат какой-нибудь забавной математики, теперь периферийное устройство вызовет прерывание, сообщив начальный адрес памяти, где находится его проблема. Затем контроллер выполнит эту вычислительную работу для периферийного устройства (это называется ISR — подпрограмма обслуживания прерываний), а затем продолжит выполнение своей программы с того места, где он остановился. Как же контроллер узнает, где он оставил программу? Вот, ваш микроконтроллер умный! Он сохраняет содержимое своего счетчика программ (адрес памяти следующей выполняемой инструкции) в стек, и когда он завершает процедуру обслуживания прерывания, которая всегда завершается с помощью RETURN, контроллер извлекает адрес памяти следующей инструкции и продолжает выполнение. программы.
16F84A имеет четыре источника прерываний.
- Внешнее прерывание через контакт RB0
- Прерывание по переполнению таймера
- Прерывание изменения порта B (контакты с RB4 по RB7)
- Прерывание завершения записи EEPROM данных.
Существует регистр INTCON для управления (включение/выключение) и записи этих прерываний.
Прерывание RB0 можно разрешить/запретить, установив/очистив четвертый бит регистра INTCON. Когда на RB0 есть действительное прерывание, вызванное фронтом, тогда будет установлен первый бит регистра INTCON (это должно быть очищено в ISR, прежде чем снова разрешить это прерывание).
Как было сказано ранее, переполнение таймера установит второй бит регистра INTCON. Это прерывание можно разрешить/запретить, установив/очистив пятый бит регистра INTCON.
Изменение входа на контактах PortB с 7 по 4 установит нулевой бит регистра INTCON, и это прерывание может управляться третьим битом регистра INTCON.
После завершения цикла записи данных в EEPROM устанавливается флаг прерывания.