Свежие обсуждения
Микроконтроллеры

Разработка таймера на основе PIC16F628(A) с программой на языке С

1 21

Эта ветка - "филиал" Ликбеза по С для микроконтроллеров PIC.
Здесь мы сообща рассмотрим во всех деталях с подробностями создание "с нуля" несложного микроконтроллерного устройства. В данном случае это устройство - простой бытовой таймер. Программу для PIC микроконтроллера будем писать на языке С, используя компилятор CCS-PICC.

Поскольку я избран координатором проекта - для начала изложу некоторые общие правила.
1. Здесь речь будет идти только о микроконтроллерах PIC. Для желающих поработать с другими МК есть достаточно много соответствующих веток.
2. При написании и отладке программы рекомендуется использовать связку CCS PICC + MPLAB + PROTEUS. Далее для краткости я буду называть эту связку "паровоз" (как придумал Splav56). Другие варианты не отвергаются, но и не приветствуются.
3. Рекомендованная последовательность действий: техзадание - его обсуждение, корректировка при необходимости, и затем утверждение - схема электрическая принципиальная - составление графа конечного автомата - анализ и обсуждение графа - создание проекта в "паровозе" - написание кода на С - отладка, в том числе проверка на модели в Протеусе в реальном времени - получение готовой прошивки - ответы на вопросы.
Это рекомендованная последовательность, но она отнюдь не навязывается никому. Кто хочет сразу писать код (без графа) - дело хозяйское, только не сбивайте с толку всех остальных участников. Пишите сами, потом похвастаетесь
4. Желательно описывать все действия максимально подробно, с конкретными деталями. Это касается и корифеев с их рекомендациями и советами, и новичков с их вопросами.
5. Упоминание avr123, а также ссылки на него - будут расцениваться как личное оскорбление координатора. Т.к. уже задолбало.

 

Техзадание на разработку простого бытового таймера. Составил picmaniac 25.01.2007.

Разработать бытовой таймер, предназначенный для неподготовленных пользователей, совершенно ничего не понимающих в электронике - например, детей или домохозяек. Максимальная выдержка времени 99 минут, минимальная выдержка времени 1 минута, дискретность установки 1 минута. Точность отсчёта не хуже 0,1%.

Таймер должен представлять собой устройство на основе микроконтроллера PIC16F628(A), с автономным питанием (от батареек, номинальное напряжение 4,5 В, допустимо снижение до 3,3 В). Индикатор применить светодиодный, семисегментный, двухразрядный (88). Использование сегмента "точка" не требуется. Для подачи звуковых сигналов в процессе работы и по окончании выдержки применить пьезоизлучатель, или любой другой звукоизлучатель сопротивлением не менее 270 Ом. Для управления устройством служат три однополюсные кнопки без фиксации, расположенные на корпусе устройства горизонтально в ряд. Условные обозначения кнопок (слева направо) - "Кнопка десятков минут" (КД), "Кнопка единиц минут" (КЕ), "Кнопка старт-стоп" (КС). исправленному верить.
Предусмотреть один выход с открытым коллектором (стоком) для возможности управления внешними устройствами, с нагрузочной способностью не менее 5 мА в состоянии лог.0.

Обеспечить функционирование устройства следующим образом. После подачи напряжения питания устройство переходит в режим "сон" с минимальным энергопотреблением. В этом режиме индикатор погашен, выход должен находиться в Z-состоянии (высокоимпедансном). При нажатии на любую из кнопок длительностью не менее 100 мс устройство переходит в режим установки выдержки времени. Переход сопровождается коротким звуковым сигналом (бип!). Выход при этом остаётся в Z-состоянии. Индикаторы зажигаются и отображают 00. Установка выдержки выполняется пользователем при помощи кнопок КД и КЕ. Причём в каждый момент времени может быть нажата лишь одна кнопка. Нажатие двух или трёх кнопок одновременно считается ошибочным, и должно игнорироваться устройством.
В случае, если в этом режиме в течение 10 секунд ни одна кнопка не была нажата - устройство должно вернуться в режим "сон" без запоминания той выдержки, которая была набрана на тот момент. Замечание: отсчёт 10-секундного интервала должен начинаться с момента последнего нажатия на одну из кнопок.
Перебор цифр десятков и единиц минут (при нажатиях на КД и КЕ соответственно) идёт по кольцу: 0-1-2...8-9-0-1... При удерживании кнопки нажатой перебор цифр должен происходить с частотой 2 Гц (эта цифра не задаётся техзаданием строго и будет подбираться при отладке по удобству работы). Текущая выдержка времени отображается на индикаторе, при этом он должен светиться непрерывно, без видимых пауз.
Нажатие пользователя на КС при нулевом значении выдержки расценивается устройством как ошибочное, и должно сопровождаться коротким звуковым сигналом. При этом допускается кратковременное погасание индикатора.

Нажатие пользователя на КС длительностью не менее 100 мс при ненулевом значении выдержки является командой "Старт". Устройство переходит в режим отсчёта времени. Переход сопровождается коротким звуковым сигналом. В этом режиме индикаторы мигают с частотой 1 Гц и скважностью 4, отображая оставшееся до окончания выдержки время в минутах. Выход остаётся в Z-состоянии.
Пользователь может в любой момент в процессе отсчёта выполнить сброс - прервать отсчёт и перевести устройство в режим "сон" без выдачи звукового сигнала и сигнала на выход. Для этого следует нажать КС и удерживать не менее 1000 мс. После сброса пользователем текущее значение выдержки не сохраняется.
По окончании выдержки (00 минут 00 секунд) устройство должно перевести выход в состояние лог.0 и выдать на звукоизлучатель мелодичный (приятный для слуха) звуковой сигнал длительностью 30 секунд. По прошествии 30 секунд выход снова переводится в Z-состояние и устройство переходит в режим "сон". Пользователь может выполнить "съём сигнала". Нажатие любой кнопки и удерживание в течение 500 мс приводит к досрочному прекращению выдачи сигнала, переводу выхода в Z-состояние, и переходу устройства в режим "сон". исправленному верить.

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

 

Предлагаю:
- поменять местами кнопки десятков и единиц; (или исправить в ТЗ "справа налево" на "слева направо")
- отбой после срабатывания сигнализации - по любой кнопке 100 мс (раз уж нажали, значит услышали)

 

Принято. Техзадание исправлено. Первое замечание - это я просто досадную очепатку допустил. Расположение кнопок соответствует расположению цифр на индикаторе. Со вторым согласен, но считаю, что 100 мс мало. Пусть лучше 500 мс.

Вот и набросок возможного варианта внешнего вида.

 

Надо бы изучить существующие в продаже таймеры чтоб делать не хуже.

 

Один нюанс. На работу девайса никак не повлияет, но все же...Думаю лучше будет, если максимальная выдержка времени будет 90 минут. Полтора часа как-никак. А полтора часа и 9 минут - как-то не так.

 

Был у меня когда-то простой механический таймер. Как раз в кухонный шкаф он и был вмонтирован. Одна ручка-крунтик и шкала со стрелкой. Ручку крутанул, стрелка вместе с ней повернулась - выдержку указала. Заодно и пружину завёл. Ручку отпустил - время пошло. Не нужно стало - можно ручку принудительно на ноль вернуть. Но там недостаток был - уж если завёл, то обязательно прозвенит! а иногда это не нужно. Вот на замену тому девайсу я и хочу посовременнее сделать.

Maksim_86: лучше будет ... 90 минут. Вообще-то, конечно, мы сможем задавать максимальную выдержку константой в программе. Только как в этом случае с набором цифр выдержки быть? И если пользователь хочет 99 минут поставить, ну вот хочет и всё, а оно не ставится! Зачем искусственные ограничения вводить и "заказчика" злить?

 

Думаю что в тему...

http://www.ccsinfo.com/forum/viewtopic.php?t=26177

 

Ну и основы "таймеровединия" для CCS и PIC.
http://www.ccsinfo.com/forum/viewtopic.php?t=22467

 

У меня ещё мысль. 1.5 часа x 2 семисегментника - на сколько таких запусков хватит батареек?
Отсюда 2 вопроса:
- какие будут батарейки?
- не предусмотреть ли замер напряжения батареек и индикацию их разряда?

Насчёт 90 минут - зачем отнимать у потребителя 9 минут? Влезает 99 - пусть будет 99!