Циклический таймер на pic12f629 своими руками
продаётся раскрученный сайт недорого обращаться в личку
- вы не знаете, с чего начать
- у вас нет паяльника, программатора, коробки с радиодеталями и умения все это совместить
- вам лень отрываться от кресла и компьютера
Ни для кого не секрет, что современное программное обеспечение очень облегчило нелегкую жизнь инженера. Имеются тысячи программ для автоматизированного проектирования электронных схем, для моделирования их работы, в том числе и для микроконтроллерных систем. Одна из таких САПР — Proteus VSM, разработнанная компанией Labcenter Electronics(требуйте бесплатную ознакомительную версию).
- желание
- компьютер с установленным Proteus
- свободное время
- раздельные память программ (14 бит) и память данных (8 бит)
- всего 35 инструкций
- большинство инструкций (кроме инструкций перехода и проверки условий) выполняется за 1 машинный цикл (4 такта тактового генератора)
- один явно выраженный регистр общего назначения – аккумулятор
- обращение к любой ячейке оперативной памяти как к регистру (так называемые регистровые файлы)
- порты ввода-вывода
- наличие прерываний
- аппаратные таймеры
Далее создадим файл с исходным кодом и откроем его во встроенном редакторе.
Теперь приступим к написанию программы. Воспользуемся простым встроенным редактором, хотя для удобства можно использовать и блокнот, и свободно распространяемый MPLAB IDE, имеющий, кроме всего прочего, подсветку синтаксиса.
LIST p=16F84a
include "P16F84A.INC"
;---------------------------------
CBLOCK 0x0C
W_TEMP ;0x0C
STATUS_TEMP ;0x0D
FLAGS ;0x0E
COUNTER ;0x0F
ENDC
;---------------------------------
TF EQU 0x00 ;Task flag
ORG 0x00
goto START
ORG 0x04
;---------------------------------
INT movwf W_TEMP ;save W
swapf STATUS, W
movwf STATUS_TEMP ;save STATUS
btfss INTCON, T0IF
goto ENDISR
bcf INTCON, T0IF ;clear flag
bsf FLAGS, TF
ENDISR swapf STATUS_TEMP, W
movwf STATUS ;recover STATUS
swapf W_TEMP, F
swapf W_TEMP, W ;recover W
retfie
;---------------------------------
START clrf PORTA
clrf PORTB
bsf STATUS, RP0 ;Bank1
clrf TRISB ;PortB Output
movlw b'11010111'
movwf OPTION_REG ;Set Option_REG
bcf STATUS, RP0 ;Bank0
clrf TMR0
bsf INTCON, T0IE ;Enable Timer0 interrupt
bsf INTCON, GIE ;Enable interrupts
movlw 0x3D
movwf COUNTER
;---------------------------------
MAIN btfss FLAGS, TF
goto MAIN ;If TF = 0
call OUTPUT
bcf FLAGS, TF ;Clear TF
goto MAIN
;---------------------------------
OUTPUT decfsz COUNTER, F
goto NOT0
movlw 0x3C
movwf COUNTER
NOT0 movf COUNTER, W
call TAB
movwf PORTB
return
;---------------------------------
TAB addwf PCL, F
nop
retlw b'00100001' ;1
retlw b'00000001' ;2
retlw b'00100001' ;3
retlw b'00000001' ;4
retlw b'00100001' ;5
retlw b'00000001' ;6
retlw b'00100001' ;7
retlw b'00000001' ;8
retlw b'00100001' ;9
retlw b'00000001' ;10
retlw b'00100001' ;11
retlw b'00100001' ;12
retlw b'00100001' ;13
retlw b'00100001' ;14
retlw b'00100001' ;15
retlw b'00100001' ;16
retlw b'00100001' ;17
retlw b'00100001' ;18
retlw b'00100001' ;19
retlw b'00100001' ;20
retlw b'00010010' ;21
retlw b'00010010' ;22
retlw b'00010010' ;23
retlw b'00010010' ;24
retlw b'00010010' ;25
retlw b'00010010' ;26
retlw b'00010010' ;27
retlw b'00010010' ;28
retlw b'00010010' ;29
retlw b'00010010' ;30
retlw b'00010010' ;31
retlw b'00010010' ;32
retlw b'00010010' ;33
retlw b'00010010' ;34
retlw b'00010010' ;35
retlw b'00010010' ;36
retlw b'00010010' ;37
retlw b'00010010' ;38
retlw b'00010010' ;39
retlw b'00010010' ;40
retlw b'00001100' ;41
retlw b'00001000' ;42
retlw b'00001100' ;43
retlw b'00001000' ;44
retlw b'00001100' ;45
retlw b'00001000' ;46
retlw b'00001100' ;47
retlw b'00001000' ;48
retlw b'00001100' ;49
retlw b'00001000' ;50
retlw b'00001100' ;51
retlw b'00001100' ;52
retlw b'00001100' ;53
retlw b'00001100' ;54
retlw b'00001100' ;55
retlw b'00001100' ;56
retlw b'00001100' ;57
retlw b'00001100' ;58
retlw b'00001100' ;59
retlw b'00001100' ;60
;---------------------------------
END
Данная программа при всей своей простоте содержит почти все элементы, присущие и более сложным программам.
Рассмотрим структуру подробнее.
С помощью директивы:
CBLOCK 0x0C
W_TEMP
STATUS_TEMP
FLAGS
COUNTER
ENDC
мы размещаем в памяти данных несколько констант, начиная с адреса 0x0С, так что обратившись, например, к FLAGS, мы получим доступ к ячейке оперативной памяти с адресом 0x0E. Эти константы понадобятся нам в дальнейшем.
Директива ORG предназначена для размещения программы по определенным адресам в памяти данных.
Инициализация
clrf PORTA
clrf PORTB
в регистре STATUS бит RP0 примет значение 1. Регистр STATUS кроме того, что содержит флаги результатов арифметических операций (ноль, возникновение переноса), также отвечает за выбор банка памяти при прямой адресации. Микроконтроллер PIC16F84A содержит 2 банка памяти (начинающихся с адресов 0x00 и 0x80), специальные регистры расположены как в первом, так и во втором банке. Установив бит RP0, мы сможем обращаться ко второму банку памяти.
мы опять можем обращаться к банку первому банку памяти.
- OPTION_REG, с помощью которого можно сконфигурировать таймер Timer0
- INTCON, определяющий, какие прерывания разрешены в системе.
Для разрешения прерывания от таймера в специальном регистре INTCON необходимо установить бит T0IE, а для глобального разрешения прерываний, необходимо установить бит GIE, что и делают команды:
bsf INTCON, T0IE
bsf INTCON, GIE
Также на этапе инициализации устанавливается счетчик циклов для основной программы:
movlw 0x3D
movwf COUNTER
В результате выполнения этих двух инструкций в ячейку памяти, обозначенную как регистр COUNTER (адрес 0x0F) будет помещено число 0x3D.
На этом инициализация заканчивается и начинается основной цикл программы.
Основной цикл
В основном цикле проверяется состояние флага задания TF (бит 0x00) в регистре FLAGS (по адресу 0x0E). Если флаг установлен (значение 1) выполняется подпрограмма OUTPUT. после выполнения подпрограммы флаг задания сбрасывается (значение 0).
Подпрограмма обработки прерываний
При переполнении регистра таймера происходит переход на вектор прерывания по адресу 0x0004 и запрещаются все прерывания (автоматически сбрасывается бит GIE в регистре INTCON). Подпрограмма обработки прерывания прежде всего должна обеспечивать сохранение содержимого аккумулятора W и регистра STATUS при перед началом обработки прерывания, и восстанавливать значения W и STATUS по окончании обработки. Это необходимо для предотвращения их случайной модификации в подпрограмме обработки прерывания.
swapf W_TEMP, F
swapf W_TEMP, W
Сам обработчик прерывания проверяет что вызвало прерывание (т.к. возможны несколько источников прерывания, если они будут разрешены) путем проверки соответствующих битов регистра INTCON. Поскольку у нас разрешено только одно прерывание, можно было бы не делать такой проверки, но тем не менее проверим бит T0IF (устанавливается при возникновении прерывания от таймера):
btfss INTCON, T0IF
goto ENDISR
bcf INTCON, T0IF
bsf FLAGS, TF
Подпрограмма OUTPUT
Состояния выходов в дискретные моменты времени, определяемые установкой флага задания TF, получим табличным методом, для этого в память программ поместим таблицу соответствующих значений. Табличная реализация различных вычислений в микроконтроллере характеризуется максимальным быстродействием, но при этом требует много места в памяти программ. Например, в нашем случае надо задать 60 значений, что требует 60 ячеек памяти.
Подпрограмма содержит инструкции:
OUTPUT decfsz COUNTER, F
goto NOT0
movlw 0x3C
movwf COUNTER
NOT0 movf COUNTER, W
call TAB
movwf PORTB
return
Таблица значений
Таблица содержит несколько сервисных инструкций и, собственно, сами 60 требующихся нам значений:
TAB addwf PCL, F
nop
retlw b'00100001' ;1
retlw b'00000001' ;2
………
retlw b'00001100' ;60
Таким образом, в результате возврата из таблицы, мы имеем в W требуемое значение.
В итоге, проект готов, а ассемблер оказался не таким уж и страшным языком. Теперь можно запускать программу на исполнение и отлавливать ошибки, если они были допущены. Но об этом в следующей статье
Радиолюбители, электроника - ПАЯЛЬНИК запись закреплена
Пятиступенчатый таймер на PIC12F629
В последние годы при изготовлении печатных плат радиолюбители особое предпочтение отдают фоторезистивной технологии. Суть её заключается в том, что засвечивать светочувствительную плёнку ультрафиолетовой лампой через шаблон необходимо за определённый промежуток времени. Прокараулил, прозевал и шаблон пошёл на смарку! После того, как несколько раз столкнулся с данной проблемой, пришла в голову мысль - изготовить таймер. Для данной технологии совсем не обязательно многофункциональное устройство с широким и плавным диапазоном выдержек времени. Предлагаемый таймер имеет пять фиксированных выдержек времени, светодиодную индикацию и звуковое оповещение в конце сеанса. В принципе, для данной цели такого таймера вполне достаточно.
Технические характеристики: питание - 220в, мощность подключаемой нагрузки зависит от используемого симистора (ток нагрузки составляет 16А), пять выдержек времени - 5 мин; 10 мин; 15 мин; 20 мин; 25 мин. По желанию, выдержки можно изменить - увеличить, либо уменьшить время и интервал с помощью коррекции прошивки. Таймер управляется одной кнопкой, с помощью которой выбирается нужная выдержка времени и производится СТАРТ.
Говорят, что ремонт — это стихийное бедствие. На него вечно не хватает ни денег, ни времени. Почти каждый, кто начинает ремонт, думает, как и на чем можно сэкономить. Поэтому ремонт в своей квартире автор решил начать самостоятельно с переделки проводки, а для этого надо было разобраться в трассировке старой внутренней проводки. Потому и был изготовлен прибор, описание которого приведено в этой статье.
Вначале были найдены в радиолюбительской прессе и Интернете различные конструкции приборов для поиска скрытой проводки. Выбор пал на прибор, собранный на микроконтроллере компании Мicrochip PIC12F629, из статьи [1]. Подкупили характеристики и возможности прибора, простота схемы, доступность и невысокая цена комплектующих деталей.
В статье [1] приведена схема, чертеж печатной платы, а также дана ссылка для скачивания исходного текста программы для МК, написанная на языке высокого уровня Си и файла прошивки.
Взяв за основу саму идею, автор написал программу на ассемблере и сделал так, чтобы прибор реагировал только на электромагнитное поле частотой 50 Гц, и добавил индикацию подсоединения элементов питания в виде 3-х звуковых и световых сигналов, после чего МК уходит в режим сна.
Применение в исходной схеме прибора [1] составного транзистора из двух КТ3102 и резистора нагрузки не оправдано, так как вполне достаточно одного транзистора, а в качестве нагрузки этого транзистора можно использовать подтягивающий резистор входа GP2, подключенный к выводу 5 внутри МК. В результате окончательный вариант схемы, по которой и был собран прибор для поиска скрытой проводки, показан на рис.1.
В моем варианте искателя проводки используется напряжение питания до 3 В, так как имевшийся в наличии корпус не позволял установить в прибор
более двух гальванических элементов типоразмера ААА, но практика показала, что он вполне надежно работает и от двух таких элементов.
Основой прибора является МК типа PIC12F629 производства компании Microchip, назначение выводов которого, с учетом введенной в него программы, приведено в таблице.
Работа схемы
Включение прибора и выключение его (перевод в режим SLEEP) осуществляется кнопкой SB1. Рабочий режим индицируется свечением светодиода HL1. Микроконтроллер DD1 PIC12F629 тактируется импульсами 4 МГц от внутреннего тактового генератора этого МК.
Частота звукового сигнала подобрана экспериментально. Она приблизительно равна частоте собственного резонанса пьезоэлектрического капсюля HA1 и лежит вблизи 1,5 кГц.
Особенности программы для МК
Как было отмечено выше, программа написана на языке ассемблера в среде программирования MPLAB IDE (см. листинг).
- оптимальную конфигурацию МК DD1;
- при подключении источника питания к прибору-искателю скрытой проводки начальную инициализацию МК и генерацию трех звуковых и световых сигналов, подтверждающих готовность прибора к использованию и последующее переключение прибора в энергосберегающий режим SLEEP (выключенное состояние с микропотреблением);
- переход МК в рабочий режим при первом нажатии кнопки включения/выключения прибора SB1;
- подсчет количества периодов входного сигнала, полученных за время равное 0,1 с;
- формирование микроконтроллером сигналов звуковой и световой сигнализации наличия электромагнитного излучения с частотой 50 Гц, если количество подсчитанных периодов входного сигнала за 0,1 с равно 5;
- переход МК в энергосберегающий режим SLEEP при повторном нажатии кнопки SB1 до следующего нажатия этой кнопки.
Конфигурация МК задана в программе следующими мнемоническими кодами:
- _CPD_OFF — защита EEPROM памяти МК выключена;
- _CP_OFF — защита памяти программ МК выключена;
- _BODEN_OFF — сброс по снижению напряжения питания запрещен;
- _MCLRE_OFF — сброс MCLRE недоступен;
- _PWRTE_ON — таймер задержки включения напряжения питания PWRT включен;
- _WDT_OFF — сторожевой таймер выключен;
- _INTRC_OSC_NOCLKOUT — включен внутренний тактовый генератор 4 МГц, причем тактовый сигнал не выводится из МК.
Пункты 4 и 7 позволяют использовать шесть из восьми выводов МК DD1 как линии порта ввода/вывода.
В листинге программы можно выделить несколько модулей:
Замечу, что подпрограмм (ПП) задержек две: DELAY (300 мс) и DELAY_2 (744 мкс). DELAY используется для формирования интервалов времени световой и звуковой сигнализации при подключении батарей, а DELAY_2 используется при формировании сигнала звука. DELAY_1 и DELAY_3 — это вспомогательные метки в подпрограммах задержки.
Программа, представленная в данной статье, не идеальна и может быть легко переработана читателями под собственные требования.
Конструкция и детали
Корпус для прибора с батарейным отсеком на два элемента типоразмера ААА был найден случайно. Печатная плата разрабатывалась в программе Sprint-Layout 5.0 под свободное место в этом корпусе. Она изготовлена из одностороннего фольгированного стеклотекстолита толщиной 1,5 мм и размерами 26×19,5 мм. Чертеж печатной платы показан на рис.2.
В качестве антенны используется отрезок многожильного монтажного провода длиной 100.200 мм, изогнутый по периметру корпуса прибора. Изменяя длину антенны, можно регулировать чувствительность прибора.
Кнопка SB1, так называемая, тактовая типа B3W-1100, B3W-4000 или им подобная. Эти кнопки встречаются на платах старых зарубежных телевизоров и другой аппаратуры. В качестве звукоизлучателя НА1 был использован пьезоэлектрический капсюль от детской музыкальной игрушки китайского производства.
Светодиод HL1 может быть любой маломощный диаметром 3 или 5 мм, хотя плата разрабатывалась под 3-миллиметровый диод.
В заключение замечу, что прибор полезен также электрикам, профессионально занимающимся поиском обрывов в скрытой проводке.
Архив к проекту (Чертеж печатной платы в формате программе Sprint—Layout, файл исходного текста программы на ассемблере и файл прошивки):
Ссылки
- Потапчук М. Микроконтроллерный искатель проводки // Радио. — 2006. — №2. — С.44, 45.
Автор: Иван Шевченко (RW1ZK), г. Заозерск, Мурманской обл.
Схема содержит минимум компонентов и при исправных деталях обеспечивает высокую точность хода системных часов контроллера.
Необходимое время включения и выключения обеих каналов таймера задается в области энергонезависимой памяти микроконтроллера. При отключении питающего напряжения схема продолжает питаться от батареек, потребляя ток всего несколько микроампер.
В качестве микроконтроллера в схеме можно применить PIC12F629 или PIC12F675
В архиве содержатся инструкция, схема и прошивка для микроконтроллера.
10 thoughts on “ Двухканальный суточный таймер ”
Добрый день. Как всегда просто и функционально.
Насколько реально добавить в прошивку еще несколько включений таймера по расписанию?
Всё можно сделать. Но не всегда это следует делать. Тогда простое перестанет быть простым 🙂
За много лет ковыряний, ни разу не видел батарею с контроллером зарядки.
С платой защиты да, но она заряд не обеспечивает.
Она лишь отсоединяет батарею от внешних клемм при разряде до 2,5в или заряде выше 4,3в. И после этого батареи как бы нет.
P/S. Под контролером зарядки литиевой АКБ я подразумевал контроллер полного заряда и разряда ниже допустимого, что имеется в любой АКБ мобильника. Для ограничения тока заряда я упомянул о балластном резисторе, который предотвратит сверхнормативны ток заряда и практически не будет влиять на напряжение питания схемы при отсутствии штатного питания из-за весьма низкого значения потребляемого тока и низкого сопротивления самого балластного резистора.
Читайте также: