Site Loader

Простой таймер на 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Транзистор2N34171Поиск в магазине ОтронВ блокнот
С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 — Микроконтроллеры и Технологии

  1. Главная|
  2. Устройства|
  3. 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 другим светодиодным индикатором динамического типа с общим анодом и числом разрядов не менее четырех (у него может быть иное назначение выводов, что следует учесть при монтаже).

Транзистор КТ815А заменим любым кремниевым структуры n-р-n с предельным значением тока коллектора не менее рабочего тока реле. Вместо реле РЭН34 можно применить любое другое, надежно срабатывающее при напряжении 8… 10 В, с контактами, рассчитанными на коммутацию переменного напряжения 220 В притоке, потребляемом нагрузкой.

Программа, по которой работает микроконтроллер, реагирует на состояние контактов кнопки 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
  • 3 Prescaler
  • 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 устанавливается флаг прерывания.

alexxlab

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

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